Full mobile responsive (320px) and tablet (768px) support across all templates

- All text-[20rem] background text → text-[8rem] md:text-[20rem]
- All text-8xl → text-5xl md:text-8xl
- All text-5xl emojis → text-3xl md:text-5xl
- edit_event: w-full md:w-[80%], poster column w-full lg:w-[350px]
- account/index: tab bar overflow-x-auto, events table overflow-x-auto
- admin/events: table overflow-x-auto
- register: tab buttons overflow-x-auto
- error 404/500: responsive padding p-6 md:p-12
- base footer: flex-col sm:flex-row for bottom bar
- Add PWA bundle (spomky-labs/pwa-bundle) with composer require files

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Serreau Jovann
2026-03-20 19:11:02 +01:00
parent e101541185
commit 6fab96ab44
24 changed files with 796 additions and 97 deletions

15
.gitignore vendored
View File

@@ -30,3 +30,18 @@ node_modules/
/.php-cs-fixer.php
/.php-cs-fixer.cache
###< friendsofphp/php-cs-fixer ###
###> symfony/asset-mapper ###
/public/assets/
/assets/vendor/
###< symfony/asset-mapper ###
###> spomky-labs/pwa-bundle ###
/public/idb
/public/pwa
/public/workbox
/public/favicon.ico
/public/site.webmanifest
/public/site.*.webmanifest
/public/sw.js
###< spomky-labs/pwa-bundle ###

3
assets/styles/app.css Normal file
View File

@@ -0,0 +1,3 @@
body {
background-color: skyblue;
}

View File

@@ -20,6 +20,7 @@
"nelmio/security-bundle": "^3.9",
"phpdocumentor/reflection-docblock": "^6.0",
"phpstan/phpdoc-parser": "^2.3",
"spomky-labs/pwa-bundle": "^1.5",
"stevenmaguire/oauth2-keycloak": "^6.1",
"stripe/stripe-php": "*",
"symfony/amazon-mailer": "8.0.*",
@@ -91,7 +92,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"

349
composer.lock generated
View File

@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "cb8493c3f2e7f5a5fd9625178d808e03",
"content-hash": "c0065b34464dda1ae6cf59c080b878e6",
"packages": [
{
"name": "async-aws/core",
@@ -266,6 +266,83 @@
],
"time": "2025-12-08T15:06:51+00:00"
},
{
"name": "composer/semver",
"version": "3.4.4",
"source": {
"type": "git",
"url": "https://github.com/composer/semver.git",
"reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95",
"reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95",
"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.4"
},
"funding": [
{
"url": "https://packagist.com",
"type": "custom"
},
{
"url": "https://github.com/composer",
"type": "github"
}
],
"time": "2025-08-20T19:15:30+00:00"
},
{
"name": "dasprid/enum",
"version": "1.0.7",
@@ -4249,6 +4326,118 @@
},
"time": "2026-03-03T17:31:43+00:00"
},
{
"name": "spomky-labs/pwa-bundle",
"version": "1.5.7",
"source": {
"type": "git",
"url": "https://github.com/Spomky-Labs/pwa-bundle.git",
"reference": "af032890aebac9311703edeebef4c3ddb4b36224"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Spomky-Labs/pwa-bundle/zipball/af032890aebac9311703edeebef4c3ddb4b36224",
"reference": "af032890aebac9311703edeebef4c3ddb4b36224",
"shasum": ""
},
"require": {
"php": ">=8.2",
"phpdocumentor/reflection-docblock": "^5.3|^6.0",
"psr/log": "^1.1|^2.0|^3.0",
"symfony/asset": "^6.4|^7.0|^8.0",
"symfony/asset-mapper": "^6.4|^7.0|^8.0",
"symfony/config": "^6.4|^7.0|^8.0",
"symfony/dependency-injection": "^6.4|^7.0|^8.0",
"symfony/deprecation-contracts": "^3.5",
"symfony/http-kernel": "^6.4|^7.0|^8.0",
"symfony/property-access": "^6.4|^7.0|^8.0",
"symfony/property-info": "^6.4|^7.0|^8.0",
"symfony/routing": "^6.4|^7.0|^8.0",
"symfony/serializer": "^6.4|^7.0|^8.0",
"symfony/service-contracts": "^3.0",
"symfony/web-link": "^6.4|^7.0|^8.0",
"twig/twig": "^3.8"
},
"require-dev": {
"dbrekelmans/bdi": "*",
"matthiasnoback/symfony-config-test": "^5.1|^6.0",
"monolog/monolog": "^3.0",
"nelmio/security-bundle": "^3.3",
"symfony/console": "^6.4|^7.0|^8.0",
"symfony/event-dispatcher": "^6.4|^7.0|^8.0",
"symfony/filesystem": "^6.4|^7.0|^8.0",
"symfony/finder": "^6.4|^7.0|^8.0",
"symfony/framework-bundle": "^7.0|^8.0",
"symfony/mime": "^6.4|^7.0|^8.0",
"symfony/monolog-bridge": "^6.4|^7.0|^8.0",
"symfony/monolog-bundle": "^3.10|^4.0",
"symfony/panther": "^2.3",
"symfony/translation": "^6.4|^7.0|^8.0",
"symfony/twig-bundle": "^7.0|^8.0",
"symfony/ux-icons": "^2.29",
"symfony/yaml": "^6.4|^7.0|^8.0"
},
"suggest": {
"ext-gd": "Required to generate icons (or Imagick).",
"ext-imagick": "Required to generate icons (or GD).",
"symfony/filesystem": "For generating and manipulating icons or screenshots",
"symfony/mime": "For generating and manipulating icons or screenshots",
"symfony/ux-icons": "For using SVG icons (e.g. for shortcuts)"
},
"type": "symfony-bundle",
"extra": {
"thanks": {
"url": "https://github.com/spomky-labs/pwa-bundle",
"name": "spomky-labs/pwa-bundle"
}
},
"autoload": {
"psr-4": {
"SpomkyLabs\\PwaBundle\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Florent Morselli",
"homepage": "https://github.com/Spomky"
},
{
"name": "All contributors",
"homepage": "https://github.com/spomky-labs/pwa-bundle/contributors"
}
],
"description": "Progressive Web App Manifest Generator Bundle for Symfony.",
"homepage": "https://github.com/spomky-labs",
"keywords": [
"bundle",
"pwa",
"symfony",
"symfony-ux"
],
"support": {
"issues": "https://github.com/Spomky-Labs/pwa-bundle/issues",
"source": "https://github.com/Spomky-Labs/pwa-bundle/tree/1.5.7"
},
"funding": [
{
"url": "https://www.buymeacoffee.com/FlorentMorselli",
"type": "custom"
},
{
"url": "https://github.com/Spomky",
"type": "github"
},
{
"url": "https://www.patreon.com/FlorentMorselli",
"type": "patreon"
}
],
"time": "2026-03-11T08:50:08+00:00"
},
{
"name": "stevenmaguire/oauth2-keycloak",
"version": "6.1.0",
@@ -4510,6 +4699,87 @@
],
"time": "2026-02-09T10:14:57+00:00"
},
{
"name": "symfony/asset-mapper",
"version": "v8.0.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/asset-mapper.git",
"reference": "80635c3722b9bb5481e0282497ae23796dcd3712"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/asset-mapper/zipball/80635c3722b9bb5481e0282497ae23796dcd3712",
"reference": "80635c3722b9bb5481e0282497ae23796dcd3712",
"shasum": ""
},
"require": {
"composer/semver": "^3.0",
"php": ">=8.4",
"symfony/filesystem": "^7.4|^8.0",
"symfony/http-client": "^7.4|^8.0"
},
"require-dev": {
"symfony/asset": "^7.4|^8.0",
"symfony/browser-kit": "^7.4|^8.0",
"symfony/console": "^7.4|^8.0",
"symfony/event-dispatcher-contracts": "^3.0",
"symfony/finder": "^7.4|^8.0",
"symfony/framework-bundle": "^7.4|^8.0",
"symfony/http-foundation": "^7.4|^8.0",
"symfony/http-kernel": "^7.4|^8.0",
"symfony/process": "^7.4|^8.0",
"symfony/runtime": "^7.4|^8.0",
"symfony/web-link": "^7.4|^8.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/v8.0.6"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://github.com/nicolas-grekas",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2026-02-17T13:07:04+00:00"
},
{
"name": "symfony/cache",
"version": "v8.0.6",
@@ -10634,83 +10904,6 @@
],
"time": "2024-11-12T16:29:46+00:00"
},
{
"name": "composer/semver",
"version": "3.4.4",
"source": {
"type": "git",
"url": "https://github.com/composer/semver.git",
"reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95",
"reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95",
"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.4"
},
"funding": [
{
"url": "https://packagist.com",
"type": "custom"
},
{
"url": "https://github.com/composer",
"type": "github"
}
],
"time": "2025-08-20T19:15:30+00:00"
},
{
"name": "composer/xdebug-handler",
"version": "3.0.5",

View File

@@ -18,4 +18,5 @@ return [
Nelmio\SecurityBundle\NelmioSecurityBundle::class => ['all' => true],
KnpU\OAuth2ClientBundle\KnpUOAuth2ClientBundle::class => ['all' => true],
Knp\Bundle\PaginatorBundle\KnpPaginatorBundle::class => ['all' => true],
SpomkyLabs\PwaBundle\SpomkyLabsPwaBundle::class => ['all' => true],
];

View File

@@ -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

View File

@@ -280,7 +280,7 @@ use Symfony\Component\Config\Loader\ParamConfigurator as Param;
* }>,
* },
* asset_mapper?: bool|array{ // Asset Mapper configuration
* enabled?: bool|Param, // Default: false
* enabled?: bool|Param, // Default: true
* paths?: array<string, scalar|Param|null>,
* excluded_patterns?: list<scalar|Param|null>,
* exclude_dotfiles?: bool|Param, // If true, any files starting with "." will be excluded from the asset mapper. // Default: true
@@ -1813,6 +1813,410 @@ use Symfony\Component\Config\Loader\ParamConfigurator as Param;
* convert_exception?: bool|Param, // Default: false
* remove_first_page_param?: bool|Param, // Default: false
* }
* @psalm-type PwaConfig = array{
* asset_compiler?: bool|Param, // When true, the assets will be compiled when the command "asset-map:compile" is run. // Default: true
* early_hints?: bool|array{ // Early Hints (HTTP 103) configuration. Requires a compatible server (FrankenPHP, Caddy).
* enabled?: bool|Param, // Default: false
* preload_manifest?: bool|Param, // Preload the PWA manifest file. // Default: true
* preload_serviceworker?: bool|Param, // Preload the service worker script. Disabled by default as SW registration is usually deferred. // Default: false
* preconnect_workbox_cdn?: bool|Param, // Preconnect to Workbox CDN when using CDN mode. // Default: true
* },
* favicons?: bool|array{
* enabled?: bool|Param, // Default: false
* default?: array{ // The favicon source and parameters. When used with "dark", this favicon will become the light version.
* src?: scalar|Param|null, // The path to the icon. Can be served by Asset Mapper, an absolute path or a Symfony UX Icon (if the bundle is installed).
* background_color?: scalar|Param|null, // The background color of the application. If this value is not defined and that of the Manifest section is, the value of the latter will be used. // Default: null
* border_radius?: int|Param, // The border radius of the icon. // Default: null
* image_scale?: int|Param, // The scale of the icon. // Default: null
* svg_attr?: array<string, mixed>,
* },
* dark?: array{ // The favicon source and parameters for the dark theme. Should only be used with "default".
* src?: scalar|Param|null, // The path to the icon. Can be served by Asset Mapper, an absolute path or a Symfony UX Icon (if the bundle is installed).
* background_color?: scalar|Param|null, // The background color of the application. If this value is not defined and that of the Manifest section is, the value of the latter will be used. // Default: null
* border_radius?: int|Param, // The border radius of the icon. // Default: null
* image_scale?: int|Param, // The scale of the icon. // Default: null
* svg_attr?: array<string, mixed>,
* },
* src?: scalar|Param|null, // Deprecated: The "src" configuration key is deprecated. Use the "default.src" configuration key instead. // The source of the favicon. Shall be a SVG or large PNG. // Default: null
* src_dark?: scalar|Param|null, // Deprecated: The "src_dark" configuration key is deprecated. Use the "dark.src" configuration key instead. // The source of the favicon in dark mode. Shall be a SVG or large PNG. // Default: null
* background_color?: scalar|Param|null, // Deprecated: The "background_color" configuration key is deprecated. Use the "default.background_color" configuration key instead. // The background color of the icon. // Default: null
* background_color_dark?: scalar|Param|null, // Deprecated: The "background_color_dark" configuration key is deprecated. Use the "dark.background_color" configuration key instead. // The background color of the icon in dark mode. // Default: null
* safari_pinned_tab_color?: scalar|Param|null, // The color of the Safari pinned tab. Requires "use_silhouette" to be set to "true". // Default: null
* tile_color?: scalar|Param|null, // The color of the tile for Windows 8+. // Default: null
* border_radius?: int|Param, // Deprecated: The "border_radius" configuration key is deprecated. Use the "default.border_radius" or "dark.border_radius" configuration key instead. // The border radius of the icon. // Default: null
* image_scale?: int|Param, // Deprecated: The "image_scale" configuration key is deprecated. Use the "default.image_scale" or "dark.image_scale" configuration key instead. // The scale of the icon. // Default: null
* low_resolution?: bool|Param, // Include low resolution icons. // Default: false
* use_silhouette?: bool|Param|null, // Use only the silhouette of the icon. Applicable for macOS Safari and Windows 8+. Requires potrace to be installed. // Default: null
* use_start_image?: bool|Param, // Use the icon as a start image for the iOS splash screen. // Default: true
* svg_color?: scalar|Param|null, // When the asset is a SVG file, replaces the currentColor attribute with this color. // Default: "#000"
* monochrome?: bool|Param, // Use a monochrome icon. // Default: false
* potrace?: scalar|Param|null, // The path to the potrace binary. // Default: "potrace"
* },
* image_processor?: scalar|Param|null, // The image processor to use to generate the icons of different sizes. // Default: null
* logger?: scalar|Param|null, // The logger service to use. If not set, the default logger will be used. // Default: null
* manifest?: bool|array{
* enabled?: bool|Param, // Default: false
* public_url?: scalar|Param|null, // The public URL of the manifest file. // Default: "/site.webmanifest"
* use_credentials?: bool|Param, // Indicates whether the manifest should be fetched with credentials. // Default: true
* background_color?: scalar|Param|null, // The background color of the application. It should match the background-color CSS property in the sites stylesheet for a smooth transition between launching the web application and loading the site's content.
* categories?: list<scalar|Param|null>,
* description?: scalar|Param|null, // The description of the application.
* display?: scalar|Param|null, // The display mode of the application.
* display_override?: list<scalar|Param|null>,
* id?: scalar|Param|null, // A string that represents the identity of the web application.
* orientation?: scalar|Param|null, // The orientation of the application.
* dir?: scalar|Param|null, // The direction of the application.
* lang?: scalar|Param|null, // The language of the application.
* name?: scalar|Param|null, // The name of the application.
* short_name?: scalar|Param|null, // The short name of the application.
* scope?: scalar|Param|null, // The scope of the application.
* start_url?: string|array{ // The start URL of the application.
* path?: scalar|Param|null, // The URL or route name.
* path_type_reference?: int|Param, // The path type reference to generate paths/URLs. See https://symfony.com/doc/current/routing.html#generating-urls-in-controllers for more information. // Default: 1
* params?: list<mixed>,
* },
* theme_color?: scalar|Param|null, // The theme color of the application. If a dark theme color is specified, the theme color will be used for the light theme.
* dark_theme_color?: scalar|Param|null, // The dark theme color of the application.
* edge_side_panel?: array{ // Specifies whether or not your app supports the side panel view in Microsoft Edge.
* preferred_width?: int|Param, // Specifies the preferred width of the side panel view in Microsoft Edge.
* },
* iarc_rating_id?: scalar|Param|null, // Specifies the International Age Rating Coalition (IARC) rating ID for the app. See https://www.globalratings.com/how-iarc-works.aspx for more information.
* scope_extensions?: list<array{ // Default: []
* type?: scalar|Param|null, // Specifies the type of scope extension. This is currently always origin (default), but future extensions may add other types. // Default: "origin"
* origin?: scalar|Param|null, // Specifies the origin pattern to associate with.
* }>,
* handle_links?: scalar|Param|null, // Specifies the default link handling for the web app.
* note_taking?: array{ // The note-taking capabilities of the application.
* note_taking_url?: string|array{ // The URL to the note-taking service.
* path?: scalar|Param|null, // The URL or route name.
* path_type_reference?: int|Param, // The path type reference to generate paths/URLs. See https://symfony.com/doc/current/routing.html#generating-urls-in-controllers for more information. // Default: 1
* params?: list<mixed>,
* },
* },
* icons?: list<string|array{ // Default: []
* src?: scalar|Param|null, // The path to the icon. Can be served by Asset Mapper, an absolute path or a Symfony UX Icon (if the bundle is installed).
* sizes?: list<int|Param>,
* background_color?: scalar|Param|null, // The background color of the application. If this value is not defined and that of the Manifest section is, the value of the latter will be used. // Default: null
* border_radius?: int|Param, // The border radius of the icon. // Default: null
* image_scale?: int|Param, // The scale of the icon. // Default: null
* type?: scalar|Param|null, // The icon mime type.
* format?: scalar|Param|null, // The icon format. When set, the "type" option is ignored and the image will be converted.
* purpose?: scalar|Param|null, // The purpose of the icon.
* svg_attr?: array<string, mixed>,
* }>,
* screenshots?: list<string|array{ // Default: []
* src?: scalar|Param|null, // The path to the screenshot. Can be served by Asset Mapper.
* height?: scalar|Param|null, // Default: null
* width?: scalar|Param|null, // Default: null
* form_factor?: scalar|Param|null, // The form factor of the screenshot. Will guess the form factor if not set.
* label?: scalar|Param|null, // The label of the screenshot.
* platform?: scalar|Param|null, // The platform of the screenshot.
* format?: scalar|Param|null, // The format of the screenshot. Will convert the file if set.
* reference?: scalar|Param|null, // The URL of the screenshot. Only for reference and not used by the bundle. // Default: null
* }>,
* file_handlers?: list<array{ // Default: []
* action?: string|array{ // The action to take.
* path?: scalar|Param|null, // The URL or route name.
* path_type_reference?: int|Param, // The path type reference to generate paths/URLs. See https://symfony.com/doc/current/routing.html#generating-urls-in-controllers for more information. // Default: 1
* params?: list<mixed>,
* },
* accept?: array<string, list<scalar|Param|null>>,
* }>,
* launch_handler?: array{ // The launch handler of the application.
* client_mode?: list<scalar|Param|null>,
* },
* protocol_handlers?: list<array{ // Default: []
* protocol?: scalar|Param|null, // The protocol of the handler.
* placeholder?: scalar|Param|null, // The placeholder of the handler. Will be replaced by "xxx=%s". // Default: null
* url?: string|array{ // The URL of the handler.
* path?: scalar|Param|null, // The URL or route name.
* path_type_reference?: int|Param, // The path type reference to generate paths/URLs. See https://symfony.com/doc/current/routing.html#generating-urls-in-controllers for more information. // Default: 1
* params?: list<mixed>,
* },
* }>,
* prefer_related_applications?: bool|Param, // prefer related native applications (instead of this application) // Default: false
* related_applications?: list<array{ // Default: []
* platform?: scalar|Param|null, // The platform of the application.
* url?: string|array{ // The URL of the application.
* path?: scalar|Param|null, // The URL or route name.
* path_type_reference?: int|Param, // The path type reference to generate paths/URLs. See https://symfony.com/doc/current/routing.html#generating-urls-in-controllers for more information. // Default: 1
* params?: list<mixed>,
* },
* id?: scalar|Param|null, // The ID of the application.
* }>,
* shortcuts?: list<array{ // Default: []
* name?: scalar|Param|null, // The name of the shortcut.
* short_name?: scalar|Param|null, // The short name of the shortcut.
* description?: scalar|Param|null, // The description of the shortcut.
* url?: string|array{ // The URL of the shortcut.
* path?: scalar|Param|null, // The URL or route name.
* path_type_reference?: int|Param, // The path type reference to generate paths/URLs. See https://symfony.com/doc/current/routing.html#generating-urls-in-controllers for more information. // Default: 1
* params?: list<mixed>,
* },
* icons?: list<string|array{ // Default: []
* src?: scalar|Param|null, // The path to the icon. Can be served by Asset Mapper, an absolute path or a Symfony UX Icon (if the bundle is installed).
* sizes?: list<int|Param>,
* background_color?: scalar|Param|null, // The background color of the application. If this value is not defined and that of the Manifest section is, the value of the latter will be used. // Default: null
* border_radius?: int|Param, // The border radius of the icon. // Default: null
* image_scale?: int|Param, // The scale of the icon. // Default: null
* type?: scalar|Param|null, // The icon mime type.
* format?: scalar|Param|null, // The icon format. When set, the "type" option is ignored and the image will be converted.
* purpose?: scalar|Param|null, // The purpose of the icon.
* svg_attr?: array<string, mixed>,
* }>,
* }>,
* share_target?: array{ // The share target of the application.
* action?: string|array{ // The action of the share target.
* path?: scalar|Param|null, // The URL or route name.
* path_type_reference?: int|Param, // The path type reference to generate paths/URLs. See https://symfony.com/doc/current/routing.html#generating-urls-in-controllers for more information. // Default: 1
* params?: list<mixed>,
* },
* method?: scalar|Param|null, // The method of the share target.
* enctype?: scalar|Param|null, // The enctype of the share target. Ignored if method is GET.
* params?: array{ // The parameters of the share target.
* title?: scalar|Param|null, // The title of the share target.
* text?: scalar|Param|null, // The text of the share target.
* url?: scalar|Param|null, // The URL of the share target.
* files?: list<array{ // Default: []
* name?: scalar|Param|null, // The name of the file parameter.
* accept?: list<scalar|Param|null>,
* }>,
* },
* },
* widgets?: list<array{ // Default: []
* name?: scalar|Param|null, // The title of the widget, presented to users.
* short_name?: scalar|Param|null, // An alternative short version of the name.
* description?: scalar|Param|null, // The description of the widget.
* icons?: list<string|array{ // Default: []
* src?: scalar|Param|null, // The path to the icon. Can be served by Asset Mapper, an absolute path or a Symfony UX Icon (if the bundle is installed).
* sizes?: list<int|Param>,
* background_color?: scalar|Param|null, // The background color of the application. If this value is not defined and that of the Manifest section is, the value of the latter will be used. // Default: null
* border_radius?: int|Param, // The border radius of the icon. // Default: null
* image_scale?: int|Param, // The scale of the icon. // Default: null
* type?: scalar|Param|null, // The icon mime type.
* format?: scalar|Param|null, // The icon format. When set, the "type" option is ignored and the image will be converted.
* purpose?: scalar|Param|null, // The purpose of the icon.
* svg_attr?: array<string, mixed>,
* }>,
* screenshots?: list<string|array{ // Default: []
* src?: scalar|Param|null, // The path to the screenshot. Can be served by Asset Mapper.
* height?: scalar|Param|null, // Default: null
* width?: scalar|Param|null, // Default: null
* form_factor?: scalar|Param|null, // The form factor of the screenshot. Will guess the form factor if not set.
* label?: scalar|Param|null, // The label of the screenshot.
* platform?: scalar|Param|null, // The platform of the screenshot.
* format?: scalar|Param|null, // The format of the screenshot. Will convert the file if set.
* reference?: scalar|Param|null, // The URL of the screenshot. Only for reference and not used by the bundle. // Default: null
* }>,
* tag?: scalar|Param|null, // A string used to reference the widget in the PWA service worker.
* template?: scalar|Param|null, // The template to use to display the widget in the operating system widgets dashboard. Note: this property is currently only informational and not used. See ms_ac_template below.
* ms_ac_template?: string|array{ // The URL of the custom Adaptive Cards template to use to display the widget in the operating system widgets dashboard.
* path?: scalar|Param|null, // The URL or route name.
* path_type_reference?: int|Param, // The path type reference to generate paths/URLs. See https://symfony.com/doc/current/routing.html#generating-urls-in-controllers for more information. // Default: 1
* params?: list<mixed>,
* },
* data?: string|array{ // The URL where the data to fill the template with can be found. If present, this URL is required to return valid JSON.
* path?: scalar|Param|null, // The URL or route name.
* path_type_reference?: int|Param, // The path type reference to generate paths/URLs. See https://symfony.com/doc/current/routing.html#generating-urls-in-controllers for more information. // Default: 1
* params?: list<mixed>,
* },
* type?: scalar|Param|null, // The MIME type for the widget data.
* auth?: bool|Param, // A boolean indicating if the widget requires authentication.
* update?: int|Param, // The frequency, in seconds, at which the widget will be updated. Code in your service worker must perform the updating; the widget is not updated automatically. See Access widget instances at runtime.
* multiple?: bool|Param, // A boolean indicating whether to allow multiple instances of the widget. Defaults to true. // Default: true
* }>,
* },
* path_type_reference?: int|Param, // Deprecated: The "path_type_reference" configuration key is deprecated. Use the "path_type_reference" of URL nodes instead. // The path type reference to generate paths/URLs. See https://symfony.com/doc/current/routing.html#generating-urls-in-controllers for more information. // Default: 1
* resource_hints?: bool|array{ // Resource Hints configuration for preconnect, dns-prefetch, and preload.
* enabled?: bool|Param, // Default: false
* auto_preconnect?: bool|Param, // Automatically add preconnect hints for detected external origins (Workbox CDN, Google Fonts). // Default: true
* preconnect?: list<scalar|Param|null>,
* dns_prefetch?: list<scalar|Param|null>,
* preload?: list<array{ // Default: []
* href?: scalar|Param|null, // The URL or path to preload.
* as?: "script"|"style"|"font"|"image"|"fetch"|"document"|"audio"|"video"|"track"|"worker"|Param, // The resource type.
* type?: scalar|Param|null, // The MIME type of the resource. // Default: null
* crossorigin?: "anonymous"|"use-credentials"|Param, // The crossorigin attribute value. Required for fonts. // Default: null
* fetchpriority?: "high"|"low"|"auto"|Param, // The fetch priority hint. // Default: null
* media?: scalar|Param|null, // Media query for responsive preloading. // Default: null
* }>,
* },
* serviceworker?: bool|string|array{
* enabled?: bool|Param, // Default: false
* src?: scalar|Param|null, // The path to the service worker source file. Can be served by Asset Mapper.
* dest?: scalar|Param|null, // The public URL to the service worker. // Default: "/sw.js"
* skip_waiting?: bool|Param, // Whether to skip waiting for the service worker to be activated. // Default: false
* scope?: scalar|Param|null, // The scope of the service worker. // Default: "/"
* use_cache?: bool|Param, // Whether the service worker should use the cache. // Default: true
* workbox?: bool|array{ // The configuration of the workbox.
* enabled?: bool|Param, // Default: true
* use_cdn?: bool|Param, // Deprecated: The "use_cdn" option is deprecated and will be removed in 2.0.0. use "config.use_cdn" instead. // Whether to use the local workbox or the CDN. // Default: false
* google_fonts?: bool|array{
* enabled?: bool|Param, // Default: true
* cache_prefix?: scalar|Param|null, // The cache prefix for the Google fonts. // Default: null
* max_age?: scalar|Param|null, // The maximum age of the Google fonts cache (in seconds). // Default: null
* max_entries?: int|Param, // The maximum number of entries in the Google fonts cache. // Default: null
* },
* cache_manifest?: bool|Param, // Whether to cache the manifest file. // Default: true
* version?: scalar|Param|null, // Deprecated: The "version" option is deprecated and will be removed in 2.0.0. use "config.version" instead. // The version of workbox. When using local files, the version shall be "7.0.0." // Default: "7.3.0"
* workbox_public_url?: scalar|Param|null, // Deprecated: The "workbox_public_url" option is deprecated and will be removed in 2.0.0. use "config.workbox_public_url" instead. // The public path to the local workbox. Only used if use_cdn is false. // Default: "/workbox"
* idb_public_url?: scalar|Param|null, // The public path to the local IndexDB. Only used if use_cdn is false. // Default: "/idb"
* workbox_import_placeholder?: scalar|Param|null, // Deprecated: The "workbox_import_placeholder" option is deprecated and will be removed in 2.0.0. No replacement. // The placeholder for the workbox import. Will be replaced by the workbox import. // Default: "//WORKBOX_IMPORT_PLACEHOLDER"
* standard_rules_placeholder?: scalar|Param|null, // Deprecated: The "standard_rules_placeholder" option is deprecated and will be removed in 2.0.0. No replacement. // The placeholder for the standard rules. Will be replaced by caching strategies. // Default: "//STANDARD_RULES_PLACEHOLDER"
* offline_fallback_placeholder?: scalar|Param|null, // Deprecated: The "offline_fallback_placeholder" option is deprecated and will be removed in 2.0.0. No replacement. // The placeholder for the offline fallback. Will be replaced by the URL. // Default: "//OFFLINE_FALLBACK_PLACEHOLDER"
* widgets_placeholder?: scalar|Param|null, // Deprecated: The "widgets_placeholder" option is deprecated and will be removed in 2.0.0. No replacement. // The placeholder for the widgets. Will be replaced by the widgets management events. // Default: "//WIDGETS_PLACEHOLDER"
* clear_cache?: bool|Param, // Whether to clear the cache during the service worker activation. // Default: true
* navigation_preload?: bool|Param, // Whether to enable navigation preload. This speeds up navigation requests by making the network request in parallel with service worker boot-up. Note: Do not enable if you are precaching HTML pages (e.g., with offline_fallback or warm_cache_urls), as it would be redundant. // Default: false
* config?: array{
* debug?: bool|Param, // Controls workbox debug logging. Set to false to disable debug mode and logging. // Default: true
* version?: scalar|Param|null, // The version of workbox. When using local files, the version shall be "7.0.0." // Default: "7.3.0"
* use_cdn?: bool|Param, // Whether to use the local workbox or the CDN. // Default: false
* workbox_public_url?: scalar|Param|null, // The public path to the local workbox. Only used if use_cdn is false. // Default: "/workbox"
* },
* offline_fallback?: array{
* cache_name?: scalar|Param|null, // The name of the offline cache. // Default: "offline"
* page?: string|array{ // The URL of the offline page fallback.
* path?: scalar|Param|null, // The URL or route name.
* path_type_reference?: int|Param, // The path type reference to generate paths/URLs. See https://symfony.com/doc/current/routing.html#generating-urls-in-controllers for more information. // Default: 1
* params?: list<mixed>,
* },
* image?: string|array{ // The URL of the offline image fallback.
* path?: scalar|Param|null, // The URL or route name.
* path_type_reference?: int|Param, // The path type reference to generate paths/URLs. See https://symfony.com/doc/current/routing.html#generating-urls-in-controllers for more information. // Default: 1
* params?: list<mixed>,
* },
* font?: string|array{ // The URL of the offline font fallback.
* path?: scalar|Param|null, // The URL or route name.
* path_type_reference?: int|Param, // The path type reference to generate paths/URLs. See https://symfony.com/doc/current/routing.html#generating-urls-in-controllers for more information. // Default: 1
* params?: list<mixed>,
* },
* },
* image_cache?: bool|array{
* enabled?: bool|Param, // Default: true
* cache_name?: scalar|Param|null, // The name of the image cache. // Default: "images"
* regex?: scalar|Param|null, // The regex to match the images. // Default: "/\\.(ico|png|jpe?g|gif|svg|webp|bmp)$/"
* max_entries?: int|Param, // The maximum number of entries in the image cache. // Default: 60
* max_age?: scalar|Param|null, // The maximum number of seconds before the image cache is invalidated. // Default: 31536000
* },
* asset_cache?: bool|array{
* enabled?: bool|Param, // Default: true
* cache_name?: scalar|Param|null, // The name of the asset cache. // Default: "assets"
* regex?: scalar|Param|null, // The regex to match the assets. // Default: "/\\.(css|js|json|xml|txt|map|ico|png|jpe?g|gif|svg|webp|bmp)$/"
* max_age?: scalar|Param|null, // The maximum number of seconds before the asset cache is invalidated. // Default: 31536000
* },
* font_cache?: bool|array{
* enabled?: bool|Param, // Default: true
* cache_name?: scalar|Param|null, // The name of the font cache. // Default: "fonts"
* regex?: scalar|Param|null, // The regex to match the fonts. // Default: "/\\.(ttf|eot|otf|woff2)$/"
* max_entries?: int|Param, // The maximum number of entries in the image cache. // Default: 60
* max_age?: int|Param, // The maximum number of seconds before the font cache is invalidated. // Default: 31536000
* },
* resource_caches?: list<array{ // Default: []
* match_callback?: scalar|Param|null, // The regex or callback function to match the URLs.
* cache_name?: scalar|Param|null, // The name of the page cache.
* network_timeout?: int|Param, // The network timeout in seconds before cache is called (for "NetworkFirst" and "NetworkOnly" strategies). // Default: 3
* strategy?: scalar|Param|null, // The caching strategy. Only "NetworkFirst", "CacheFirst" and "StaleWhileRevalidate" are supported. StaleWhileRevalidate provides instant page loads with background updates. // Default: "StaleWhileRevalidate"
* max_entries?: scalar|Param|null, // The maximum number of entries in the cache (for "CacheFirst" and "NetworkFirst" strategy only). // Default: null
* max_age?: scalar|Param|null, // The maximum number of seconds before the cache is invalidated (for "CacheFirst" and "NetWorkFirst" strategy only). // Default: null
* broadcast?: bool|Param, // Whether to broadcast the cache update events (for "StaleWhileRevalidate" strategy only). Enables client notification when content is updated. // Default: true
* range_requests?: bool|Param, // Whether to support range requests (for "CacheFirst" strategy only). // Default: false
* cacheable_response_headers?: list<scalar|Param|null>,
* cacheable_response_statuses?: list<int|Param>,
* broadcast_headers?: list<scalar|Param|null>,
* preload_urls?: list<string|array{ // Default: []
* path?: scalar|Param|null, // The URL of the shortcut.
* params?: list<mixed>,
* }>,
* }>,
* background_sync?: list<array{ // Default: []
* queue_name?: scalar|Param|null, // The name of the queue.
* match_callback?: scalar|Param|null, // The regex or callback function to match the URLs.
* error_on_4xx?: bool|Param, // Whether to retry the request on 4xx errors. // Default: true
* error_on_5xx?: bool|Param, // Whether to retry the request on 5xx errors. // Default: true
* expected_status_codes?: list<int|Param>,
* expect_redirect?: bool|Param, // Whether to expect a redirect (JS response type should be "opaqueredirect" or the "redirected" property is "true"). // Default: false
* method?: scalar|Param|null, // The HTTP method. // Default: "POST"
* broadcast_channel?: scalar|Param|null, // The broadcast channel. Set null to disable. // Default: null
* max_retention_time?: int|Param, // The maximum retention time in minutes. // Default: 1440
* force_sync_fallback?: bool|Param, // If `true`, instead of attempting to use background sync events, always attempt to replay queued request at service worker startup. Most folks will not need this, unless you explicitly target a runtime like Electron that exposes the interfaces for background sync, but does not have a working implementation. // Default: false
* }>,
* background_fetch?: bool|array{
* enabled?: bool|Param, // Default: false
* db_name?: scalar|Param|null, // The IndexDB name where downloads are stored // Default: "bgfetch-completed"
* progress_url?: string|array{ // The URL of the progress page.
* path?: scalar|Param|null, // The URL or route name.
* path_type_reference?: int|Param, // The path type reference to generate paths/URLs. See https://symfony.com/doc/current/routing.html#generating-urls-in-controllers for more information. // Default: 1
* params?: list<mixed>,
* },
* success_url?: string|array{ // The URL of the success page.
* path?: scalar|Param|null, // The URL or route name.
* path_type_reference?: int|Param, // The path type reference to generate paths/URLs. See https://symfony.com/doc/current/routing.html#generating-urls-in-controllers for more information. // Default: 1
* params?: list<mixed>,
* },
* success_message?: scalar|Param|null, // The message to display on success. This message is translated. // Default: null
* failure_message?: scalar|Param|null, // The message to display on success. This message is translated. // Default: null
* },
* image_cache_name?: scalar|Param|null, // Deprecated: The "image_cache_name" option is deprecated and will be removed in 2.0.0. Please use "pwa.serviceworker.workbox.image_cache.cache_name" instead. // The name of the image cache. // Default: "images"
* font_cache_name?: scalar|Param|null, // Deprecated: The "font_cache_name" option is deprecated and will be removed in 2.0.0. Please use "pwa.serviceworker.workbox.font_cache.cache_name" instead. // The name of the font cache. // Default: "fonts"
* page_cache_name?: scalar|Param|null, // Deprecated: The "page_cache_name" option is deprecated and will be removed in 2.0.0. Please use "pwa.serviceworker.workbox.resource_caches[].cache_name" instead. // The name of the page cache. // Default: "pages"
* asset_cache_name?: scalar|Param|null, // Deprecated: The "asset_cache_name" option is deprecated and will be removed in 2.0.0. Please use "pwa.serviceworker.workbox.asset_cache.cache_name" instead. // The name of the asset cache. // Default: "assets"
* page_fallback?: string|array{ // The URL of the offline page fallback.
* path?: scalar|Param|null, // The URL or route name.
* path_type_reference?: int|Param, // The path type reference to generate paths/URLs. See https://symfony.com/doc/current/routing.html#generating-urls-in-controllers for more information. // Default: 1
* params?: list<mixed>,
* },
* image_fallback?: string|array{ // The URL of the offline image fallback.
* path?: scalar|Param|null, // The URL or route name.
* path_type_reference?: int|Param, // The path type reference to generate paths/URLs. See https://symfony.com/doc/current/routing.html#generating-urls-in-controllers for more information. // Default: 1
* params?: list<mixed>,
* },
* font_fallback?: string|array{ // The URL of the offline font fallback.
* path?: scalar|Param|null, // The URL or route name.
* path_type_reference?: int|Param, // The path type reference to generate paths/URLs. See https://symfony.com/doc/current/routing.html#generating-urls-in-controllers for more information. // Default: 1
* params?: list<mixed>,
* },
* image_regex?: scalar|Param|null, // Deprecated: The "image_regex" option is deprecated and will be removed in 2.0.0. Please use "pwa.serviceworker.workbox.image_cache.regex" instead. // The regex to match the images. // Default: "/\\.(ico|png|jpe?g|gif|svg|webp|bmp)$/"
* static_regex?: scalar|Param|null, // Deprecated: The "static_regex" option is deprecated and will be removed in 2.0.0. Please use "pwa.serviceworker.workbox.asset_cache.regex" instead. // The regex to match the static files. // Default: "/\\.(css|js|json|xml|txt|map)$/"
* font_regex?: scalar|Param|null, // Deprecated: The "font_regex" option is deprecated and will be removed in 2.0.0. Please use "pwa.serviceworker.workbox.font_cache.regex" instead. // The regex to match the static files. // Default: "/\\.(ttf|eot|otf|woff2)$/"
* max_image_cache_entries?: int|Param, // Deprecated: The "max_image_cache_entries" option is deprecated and will be removed in 2.0.0. Please use "pwa.serviceworker.workbox.image_cache.max_entries" instead. // The maximum number of entries in the image cache. // Default: 60
* max_image_age?: int|Param, // Deprecated: The "max_image_age" option is deprecated and will be removed in 2.0.0. Please use "pwa.serviceworker.workbox.image_cache.max_age" instead. // The maximum number of seconds before the image cache is invalidated. // Default: 31536000
* max_font_cache_entries?: int|Param, // Deprecated: The "max_font_cache_entries" option is deprecated and will be removed in 2.0.0. Please use "pwa.serviceworker.workbox.font_cache.max_entries" instead. // The maximum number of entries in the font cache. // Default: 30
* max_font_age?: int|Param, // Deprecated: The "max_font_age" option is deprecated and will be removed in 2.0.0. Please use "pwa.serviceworker.workbox.font_cache.max_age" instead. // The maximum number of seconds before the font cache is invalidated. // Default: 31536000
* network_timeout_seconds?: int|Param, // Deprecated: The "network_timeout_seconds" option is deprecated and will be removed in 2.0.0. Please use "pwa.serviceworker.workbox.resource_caches[].network_timeout" instead. // The network timeout in seconds before cache is called (for warm cache URLs only). // Default: 3
* warm_cache_urls?: list<string|array{ // Default: []
* path?: scalar|Param|null, // The URL of the shortcut.
* params?: list<mixed>,
* }>,
* },
* },
* speculation_rules?: bool|array{ // Speculation Rules API configuration for prefetching and prerendering pages.
* enabled?: bool|Param, // Default: false
* prefetch?: list<array{ // Default: []
* source?: "list"|"document"|Param, // The source type: "list" for explicit URLs, "document" for link matching. // Default: "document"
* urls?: list<string|array{ // Default: []
* path?: scalar|Param|null, // The URL path or route name.
* params?: list<mixed>,
* }>,
* selector_matches?: scalar|Param|null, // For "document" source: CSS selector to match links. // Default: null
* href_matches?: scalar|Param|null, // For "document" source: URL pattern to match href attributes. // Default: null
* eagerness?: "immediate"|"eager"|"moderate"|"conservative"|Param, // Eagerness level: "immediate" (viewport), "eager" (hover 200ms), "moderate" (hover 100ms), "conservative" (mousedown/touchstart). // Default: "moderate"
* referrer_policy?: scalar|Param|null, // Referrer policy for the speculative request. // Default: null
* }>,
* prerender?: list<array{ // Default: []
* source?: "list"|"document"|Param, // The source type: "list" for explicit URLs, "document" for link matching. // Default: "document"
* urls?: list<string|array{ // Default: []
* path?: scalar|Param|null, // The URL path or route name.
* params?: list<mixed>,
* }>,
* selector_matches?: scalar|Param|null, // For "document" source: CSS selector to match links. // Default: null
* href_matches?: scalar|Param|null, // For "document" source: URL pattern to match href attributes. // Default: null
* eagerness?: "immediate"|"eager"|"moderate"|"conservative"|Param, // Eagerness level. For prerender, "conservative" is recommended. // Default: "conservative"
* referrer_policy?: scalar|Param|null, // Referrer policy for the speculative request. // Default: null
* }>,
* },
* web_client?: scalar|Param|null, // The Panther Client for generating screenshots. If not set, the default client will be used. // Default: null
* user_agent?: scalar|Param|null, // The user agent to use when generating screenshots. When this user agent is detected, the Symfony profiler and debug toolbar will be automatically disabled to ensure screenshots look like production. // Default: "PWAScreenshotBot"
* }
* @psalm-type ConfigType = array{
* imports?: ImportsConfig,
* parameters?: ParametersConfig,
@@ -1831,6 +2235,7 @@ use Symfony\Component\Config\Loader\ParamConfigurator as Param;
* nelmio_security?: NelmioSecurityConfig,
* knpu_oauth2_client?: KnpuOauth2ClientConfig,
* knp_paginator?: KnpPaginatorConfig,
* pwa?: PwaConfig,
* "when@dev"?: array{
* imports?: ImportsConfig,
* parameters?: ParametersConfig,
@@ -1852,6 +2257,7 @@ use Symfony\Component\Config\Loader\ParamConfigurator as Param;
* nelmio_security?: NelmioSecurityConfig,
* knpu_oauth2_client?: KnpuOauth2ClientConfig,
* knp_paginator?: KnpPaginatorConfig,
* pwa?: PwaConfig,
* },
* "when@prod"?: array{
* imports?: ImportsConfig,
@@ -1871,6 +2277,7 @@ use Symfony\Component\Config\Loader\ParamConfigurator as Param;
* nelmio_security?: NelmioSecurityConfig,
* knpu_oauth2_client?: KnpuOauth2ClientConfig,
* knp_paginator?: KnpPaginatorConfig,
* pwa?: PwaConfig,
* },
* "when@test"?: array{
* imports?: ImportsConfig,
@@ -1891,6 +2298,7 @@ use Symfony\Component\Config\Loader\ParamConfigurator as Param;
* nelmio_security?: NelmioSecurityConfig,
* knpu_oauth2_client?: KnpuOauth2ClientConfig,
* knp_paginator?: KnpPaginatorConfig,
* pwa?: PwaConfig,
* },
* ...<string, ExtensionType|array{ // extra keys must follow the when@%env% pattern or match an extension alias
* imports?: ImportsConfig,

31
importmap.php Normal file
View File

@@ -0,0 +1,31 @@
<?php
/**
* Returns the importmap for this application.
*
* - "path" is a path inside the asset mapper system. Use the
* "debug:asset-map" command to see the full list of paths.
*
* - "entrypoint" (JavaScript only) set to true for any module that will
* be used as an "entrypoint" (and passed to the importmap() Twig function).
*
* The "importmap:require" command can be used to add new entries to this file.
*/
return [
'app' => [
'path' => './assets/app.js',
'entrypoint' => true,
],
'@hotwired/stimulus' => [
'version' => '3.2.2',
],
'idb' => [
'version' => '8.0.3',
],
'idb-keyval' => [
'version' => '6.2.2',
],
'@spomky-labs/pwa/helpers' => [
'path' => './vendor/spomky-labs/pwa-bundle/assets/src/helpers.js',
],
];

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 864 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 MiB

After

Width:  |  Height:  |  Size: 164 KiB

View File

@@ -120,6 +120,18 @@
"bin/phpunit"
]
},
"spomky-labs/pwa-bundle": {
"version": "1.5",
"recipe": {
"repo": "github.com/symfony/recipes-contrib",
"branch": "main",
"version": "1.3",
"ref": "ac33d9498ab25856f16d1d7df9ad4b9b0cad066d"
},
"files": [
"config/packages/pwa.yaml"
]
},
"stripe/stripe-php": {
"version": "19.4",
"recipe": {
@@ -138,6 +150,21 @@
"ref": "9648db3ecae5c8a6b1a5f74715d3907124348815"
}
},
"symfony/asset-mapper": {
"version": "8.0",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "main",
"version": "6.4",
"ref": "5ad1308aa756d58f999ffbe1540d1189f5d7d14a"
},
"files": [
"assets/app.js",
"assets/styles/app.css",
"config/packages/asset_mapper.yaml",
"importmap.php"
]
},
"symfony/console": {
"version": "8.0",
"recipe": {

View File

@@ -3,7 +3,7 @@
{% block title %}Modifier un evenement - E-Ticket{% endblock %}
{% block body %}
<div class="w-[80%] mx-auto py-12 px-4">
<div class="w-full md:w-[80%] mx-auto py-12 px-4">
<a href="{{ path('app_account', {tab: 'events'}) }}" class="inline-flex items-center gap-2 text-sm font-black uppercase tracking-widest text-gray-500 hover:text-gray-900 transition-colors mb-8">
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="3" d="M15 19l-7-7 7-7"/></svg>
Retour aux evenements
@@ -132,7 +132,7 @@
</form>
</div>
<div class="lg:w-[350px] flex-shrink-0">
<div class="w-full lg:w-[350px] flex-shrink-0">
<div class="card-brutal overflow-hidden sticky top-24">
<div class="section-header">
<h2 class="text-[10px] font-black uppercase tracking-widest text-white">Affiche</h2>

View File

@@ -77,7 +77,7 @@
{% endif %}
{% endif %}
<div class="flex flex-wrap mb-8">
<div class="flex flex-wrap overflow-x-auto mb-8">
{% if isOrganizer %}
<a href="{{ path('app_account', {tab: 'events'}) }}" class="flex-1 min-w-[100px] text-center py-3 border-3 border-gray-900 border-r-0 {{ tab == 'events' ? 'bg-yellow-400' : 'bg-white' }} font-black uppercase text-xs tracking-widest transition-all">Evenements / Brocantes</a>
<a href="{{ path('app_account', {tab: 'subaccounts'}) }}" class="flex-1 min-w-[100px] text-center py-3 border-3 border-gray-900 border-r-0 {{ tab == 'subaccounts' ? 'bg-yellow-400' : 'bg-white' }} font-black uppercase text-xs tracking-widest transition-all">Sous-comptes</a>
@@ -142,6 +142,7 @@
<h2 class="text-[10px] font-black uppercase tracking-widest text-white">Mes evenements / Brocantes / Reservations</h2>
</div>
{% if events|length > 0 %}
<div class="overflow-x-auto">
<table class="w-full border-collapse">
<thead>
<tr class="bg-gray-50 border-b-2 border-gray-200">
@@ -185,6 +186,7 @@
{% endfor %}
</tbody>
</table>
</div>
{% else %}
<div class="p-12 text-center">
<p class="text-gray-400 font-bold text-sm">Aucun evenement pour le moment.</p>
@@ -240,6 +242,7 @@
<h2 class="text-[10px] font-black uppercase tracking-widest text-white">Sous-comptes</h2>
</div>
{% if subAccounts|length > 0 %}
<div class="overflow-x-auto">
<table class="detail-table">
<thead>
<tr class="border-b-2 border-gray-200">
@@ -277,6 +280,7 @@
{% endfor %}
</tbody>
</table>
</div>
{% else %}
<div class="p-12 text-center">
<p class="text-gray-400 font-bold text-sm">Aucun sous-compte pour le moment.</p>
@@ -295,6 +299,7 @@
</div>
{% endif %}
{% if payouts|length > 0 %}
<div class="overflow-x-auto">
<table class="detail-table">
<thead>
<tr class="border-b-2 border-gray-200">
@@ -333,6 +338,7 @@
{% endfor %}
</tbody>
</table>
</div>
{% else %}
<div class="p-12 text-center">
<p class="text-gray-400 font-bold text-sm">Aucun virement pour le moment.</p>

View File

@@ -22,6 +22,7 @@
<div class="admin-card overflow-hidden p-0">
{% if events|length > 0 %}
<div class="overflow-x-auto">
<table class="admin-table">
<thead>
<tr>
@@ -69,6 +70,7 @@
{% endfor %}
</tbody>
</table>
</div>
{% else %}
<div class="p-12 text-center">
<p class="text-gray-400 font-bold text-sm">

View File

@@ -160,7 +160,7 @@
</div>
</div>
<div class="flex flex-wrap justify-between items-center gap-6">
<div class="flex flex-col sm:flex-row flex-wrap justify-between items-start sm:items-center gap-6">
<div>
<p class="font-black uppercase text-sm">&copy; {{ "now"|date("Y") }} E-TICKET.</p>
<p class="text-[11px] font-bold opacity-80">Solution proposee par l'association <a href="https://www.e-cosplay.fr" class="underline hover:no-underline">e-cosplay.fr</a></p>

View File

@@ -6,12 +6,12 @@
<div class="bg-[#fbfbfb] overflow-x-hidden italic font-sans">
<section class="relative flex items-center justify-center px-4 pt-20 pb-16 min-h-[60vh]">
<div class="absolute inset-0 opacity-[0.03] pointer-events-none select-none overflow-hidden">
<span class="text-[20rem] font-black uppercase leading-none block -rotate-12 translate-y-10">404</span>
<span class="text-[8rem] md:text-[20rem] font-black uppercase leading-none block -rotate-12 translate-y-10">404</span>
</div>
<div class="max-w-2xl mx-auto relative z-10 text-center">
<div class="border-4 border-gray-900 bg-white shadow-[6px_6px_0px_rgba(0,0,0,1)] p-12">
<div class="text-8xl font-black uppercase tracking-tighter mb-4">404</div>
<div class="border-4 border-gray-900 bg-white shadow-[6px_6px_0px_rgba(0,0,0,1)] p-6 md:p-12">
<div class="text-5xl md:text-8xl font-black uppercase tracking-tighter mb-4">404</div>
<h1 class="text-3xl font-black uppercase tracking-tighter italic mb-4">Page introuvable</h1>
<p class="font-bold text-gray-500 italic mb-8">La page que vous cherchez n'existe pas ou a ete deplacee.</p>
<a href="/" class="btn-brutal font-black uppercase text-sm tracking-widest hover:bg-indigo-600 hover:text-white transition-all">

View File

@@ -6,12 +6,12 @@
<div class="bg-[#fbfbfb] overflow-x-hidden italic font-sans">
<section class="relative flex items-center justify-center px-4 pt-20 pb-16 min-h-[60vh]">
<div class="absolute inset-0 opacity-[0.03] pointer-events-none select-none overflow-hidden">
<span class="text-[20rem] font-black uppercase leading-none block -rotate-12 translate-y-10">500</span>
<span class="text-[8rem] md:text-[20rem] font-black uppercase leading-none block -rotate-12 translate-y-10">500</span>
</div>
<div class="max-w-2xl mx-auto relative z-10 text-center">
<div class="border-4 border-gray-900 bg-white shadow-[6px_6px_0px_rgba(0,0,0,1)] p-12">
<div class="text-8xl font-black uppercase tracking-tighter mb-4">{{ status_code }}</div>
<div class="border-4 border-gray-900 bg-white shadow-[6px_6px_0px_rgba(0,0,0,1)] p-6 md:p-12">
<div class="text-5xl md:text-8xl font-black uppercase tracking-tighter mb-4">{{ status_code }}</div>
<h1 class="text-3xl font-black uppercase tracking-tighter italic mb-4">Erreur serveur</h1>
<p class="font-bold text-gray-500 italic mb-4">Une erreur inattendue s'est produite. Nos equipes ont ete notifiees.</p>
{% if error_message is defined and error_message %}

View File

@@ -15,7 +15,7 @@
<section class="relative bg-white border-b-8 border-gray-900 px-4 pt-20 pb-16">
<div class="absolute inset-0 opacity-[0.03] pointer-events-none select-none overflow-hidden">
<span class="text-[20rem] font-black uppercase leading-none block -rotate-12 translate-y-10">EVENT</span>
<span class="text-[8rem] md:text-[20rem] font-black uppercase leading-none block -rotate-12 translate-y-10">EVENT</span>
</div>
<div class="max-w-4xl mx-auto relative z-10">

View File

@@ -8,7 +8,7 @@
<section class="relative flex items-center justify-center bg-white border-b-8 border-gray-900 px-4 pt-20 pb-16">
<div class="absolute inset-0 opacity-[0.03] pointer-events-none select-none overflow-hidden">
<span class="text-[20rem] font-black uppercase leading-none block -rotate-12 translate-y-10">EVENTS</span>
<span class="text-[8rem] md:text-[20rem] font-black uppercase leading-none block -rotate-12 translate-y-10">EVENTS</span>
</div>
<div class="max-w-7xl mx-auto relative z-10 text-center">

View File

@@ -15,7 +15,7 @@
<section class="relative bg-white border-b-8 border-gray-900 px-4 pt-20 pb-16">
<div class="absolute inset-0 opacity-[0.03] pointer-events-none select-none overflow-hidden">
<span class="text-[20rem] font-black uppercase leading-none block -rotate-12 translate-y-10">ORGA</span>
<span class="text-[8rem] md:text-[20rem] font-black uppercase leading-none block -rotate-12 translate-y-10">ORGA</span>
</div>
<div class="max-w-4xl mx-auto relative z-10">

View File

@@ -10,7 +10,7 @@
<section class="relative flex items-center justify-center bg-white border-b-8 border-gray-900 px-4 pt-20 pb-16">
<div class="absolute inset-0 opacity-[0.03] pointer-events-none select-none overflow-hidden">
<span class="text-[20rem] font-black uppercase leading-none block -rotate-12 translate-y-10">ORGA</span>
<span class="text-[8rem] md:text-[20rem] font-black uppercase leading-none block -rotate-12 translate-y-10">ORGA</span>
</div>
<div class="max-w-7xl mx-auto relative z-10 text-center">

View File

@@ -5,7 +5,7 @@
{% block body %}
<div class="page-container-sm text-center">
<div class="card-brutal-lg">
<div class="text-5xl mb-4">&#10003;</div>
<div class="text-3xl md:text-5xl mb-4">&#10003;</div>
<h1 class="text-2xl font-black uppercase tracking-tighter italic mb-4">Email verifie !</h1>
<div class="card-brutal-green mb-6">

View File

@@ -32,7 +32,7 @@
</div>
{% endfor %}
<div class="flex mb-8">
<div class="flex overflow-x-auto mb-8">
<button data-tab="tab-buyer" type="button"
class="flex-1 py-3 border-3 border-gray-900 border-r-0 cursor-pointer bg-gray-900 text-white font-black uppercase text-sm tracking-widest transition-all">
Acheteur

View File

@@ -5,7 +5,7 @@
{% block body %}
<div class="page-container-sm text-center">
<div class="card-brutal-lg">
<div class="text-5xl mb-4">&#10003;</div>
<div class="text-3xl md:text-5xl mb-4">&#10003;</div>
<h1 class="text-2xl font-black uppercase tracking-tighter italic mb-4">Compte cree avec succes !</h1>
<div class="card-brutal-green mb-6">