diff --git a/.gitignore b/.gitignore index 5de8e9c2..ec65de80 100644 --- a/.gitignore +++ b/.gitignore @@ -41,4 +41,4 @@ Thumbs.db .angular .env -.nx/cache \ No newline at end of file +.nx/cache diff --git a/.stylelintrc.json b/.stylelintrc.json new file mode 100644 index 00000000..1cfcda51 --- /dev/null +++ b/.stylelintrc.json @@ -0,0 +1,17 @@ +{ + "ignoreFiles": [ + "**/*" + ], + "overrides": [ + { + "files": [ + "**/*.scss" + ], + "extends": [ + "stylelint-config-standard-scss" + ], + "rules": {} + } + ], + "rules": {} +} diff --git a/docker-compose.yml b/docker-compose.yml index fb1ab7f3..69cef468 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -21,7 +21,7 @@ services: keycloak: image: quay.io/keycloak/keycloak:24.0.3 - command: [ 'start-dev', '--optimize' ] + command: [ 'start-dev' ] environment: KC_HOSTNAME: localhost KC_HTTP_RELATIVE_PATH: /auth @@ -29,6 +29,8 @@ services: KEYCLOAK_ADMIN_PASSWORD: root ports: - "8080:8080" + volumes: + - ./libs/keycloak:/opt/keycloak/themes/apollusia volumes: database: diff --git a/libs/keycloak/.gitignore b/libs/keycloak/.gitignore new file mode 100644 index 00000000..9a448a63 --- /dev/null +++ b/libs/keycloak/.gitignore @@ -0,0 +1,2 @@ +common/resources/css +common/resources/fonts diff --git a/libs/keycloak/.stylelintrc.json b/libs/keycloak/.stylelintrc.json new file mode 100644 index 00000000..63d4bb21 --- /dev/null +++ b/libs/keycloak/.stylelintrc.json @@ -0,0 +1,16 @@ +{ + "extends": [ + "../../.stylelintrc.json" + ], + "ignoreFiles": [ + "!**/*" + ], + "overrides": [ + { + "files": [ + "**/*.scss" + ], + "rules": {} + } + ] +} diff --git a/libs/keycloak/common/resources/img/favicon.ico b/libs/keycloak/common/resources/img/favicon.ico new file mode 100644 index 00000000..03b64c85 Binary files /dev/null and b/libs/keycloak/common/resources/img/favicon.ico differ diff --git a/libs/keycloak/login/theme.properties b/libs/keycloak/login/theme.properties new file mode 100644 index 00000000..c1fd450c --- /dev/null +++ b/libs/keycloak/login/theme.properties @@ -0,0 +1,4 @@ +parent=keycloak +import=common/apollusia +styles=css/styles.css +stylesCommon= diff --git a/libs/keycloak/project.json b/libs/keycloak/project.json new file mode 100644 index 00000000..369095e9 --- /dev/null +++ b/libs/keycloak/project.json @@ -0,0 +1,59 @@ +{ + "name": "keycloak", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "projectType": "library", + "sourceRoot": "libs/keycloak", + "targets": { + "build": { + "executor": "@gitopslovers/nx-sass:compiler", + "outputs": [ + "{options.outputPath}" + ], + "options": { + "outputPath": "libs/keycloak/common/resources/css/", + "main": "libs/keycloak/src/theme.scss", + "sourceMap": true, + "assets": [ + { + "glob": "**/*.{woff,woff2}", + "input": "../../node_modules/bootstrap-icons/font/fonts", + "output": "libs/keycloak/common/resources/css/fonts" + } + ] + }, + "configurations": { + "production": {}, + "development": {} + }, + "defaultConfiguration": "production" + }, + "serve": { + "executor": "@gitopslovers/nx-sass:compiler", + "options": { + "watch": true, + "outputPath": "libs/keycloak/common/resources/css/", + "main": "libs/keycloak/src/theme.scss", + "sourceMap": true, + "assets": [ + { + "glob": "**/*.{woff,woff2}", + "input": "../../node_modules/bootstrap-icons/font/fonts", + "output": "libs/keycloak/common/resources/css/fonts" + } + ] + } + }, + "lint": { + "executor": "nx-stylelint:lint", + "outputs": [ + "{options.outputFile}" + ], + "options": { + "lintFilePatterns": [ + "libs/keycloak/src/**/*.scss" + ], + "formatter": "compact" + } + } + } +} diff --git a/libs/keycloak/src/theme.scss b/libs/keycloak/src/theme.scss new file mode 100644 index 00000000..e5ff8445 --- /dev/null +++ b/libs/keycloak/src/theme.scss @@ -0,0 +1,146 @@ +/* Color palette */ +$french-violet: #7b2cbfff; +$amethyst: #9d4eddff; +$white: #ffffff; +$facebook: #1877f2; +$google: #ea4335; +$github: #333333; +$twitter: #1da1f2; + +/* overrides */ +$primary: $french-violet; + +@font-face { + font-family: 'bootstrap-icons'; + src: url('fonts/bootstrap-icons.woff') format('woff'), + url('fonts/bootstrap-icons.woff2') format('woff2'); + font-weight: normal; + font-style: normal; +} + +/* imports */ +@import "../../../node_modules/bootstrap/scss/bootstrap"; +@import "../../../node_modules/bootstrap-icons/font/bootstrap-icons"; + +html, body { + height: 100%; +} + +body { + display: flex; + background: url('../img/keycloak-bg.png') no-repeat center center fixed, rgba($amethyst, 0.5); + background-blend-mode: multiply; + background-size: cover; +} + +#kc-header-wrapper { + display: none; +} + +.login-pf-page-header { + @extend .text-center; + @extend .h1; + @extend .text-light; +} + +.login-pf-page { + @extend .container; + @extend .align-self-center; +} + +.card-pf { + @extend .card; + border: none; + width: 50%; + height: auto; + margin: auto; +} + +.login-pf-header { + @extend .card-header; + background-color: $primary; + color: $white; +} + +#kc-page-title { + @extend .card-title; + @extend .h3; +} + +#kc-content { + @extend .card-body; +} + +.pf-c-form-control { + @extend .form-control; +} + +.pf-c-button { + @extend .btn; +} + +.pf-c-button.pf-m-primary { + @extend .btn-primary; +} + +#kc-social-providers { + h2 { + @extend .h4; + } + + ul { + list-style-type: none; + padding: 0; + } +} + +.kc-social-item { + @extend .btn; + @extend .btn-primary; + @extend .mb-3; + @extend .w-100; + @extend .border-0; + display: flex; + justify-content: flex-start; + + .fa { + @extend .bi; + @extend .me-2; + } +} + +#social-facebook { + @extend .kc-social-item; + background-color: $facebook; + + .fa-facebook { + @extend .bi-facebook; + } +} + +#social-github { + @extend .kc-social-item; + background-color: $github; + + .fa-github { + @extend .bi-github; + } +} + +#social-google { + @extend .kc-social-item; + background-color: $google; + + .fa-google { + @extend .bi-google; + } +} + +#social-twitter { + @extend .kc-social-item; + background-color: $twitter; + + .fa-twitter { + @extend .bi-twitter; + } +} diff --git a/nx.json b/nx.json index 88ef8933..fbed6901 100644 --- a/nx.json +++ b/nx.json @@ -5,12 +5,20 @@ }, "targetDefaults": { "build": { - "dependsOn": ["^build"], - "inputs": ["production", "^production"], + "dependsOn": [ + "^build" + ], + "inputs": [ + "production", + "^production" + ], "cache": true }, "e2e": { - "inputs": ["default", "^production"], + "inputs": [ + "default", + "^production" + ], "cache": true }, "lint": { @@ -26,7 +34,11 @@ }, "@nx/jest:jest": { "cache": true, - "inputs": ["default", "^production", "{workspaceRoot}/jest.preset.js"], + "inputs": [ + "default", + "^production", + "{workspaceRoot}/jest.preset.js" + ], "options": { "passWithNoTests": true }, @@ -39,7 +51,10 @@ } }, "namedInputs": { - "default": ["{projectRoot}/**/*", "sharedGlobals"], + "default": [ + "{projectRoot}/**/*", + "sharedGlobals" + ], "production": [ "default", "!{projectRoot}/**/?(*.)+(spec|test).[jt]s?(x)?(.snap)", @@ -63,6 +78,7 @@ }, "@nx/angular:component": { "style": "scss" - } + }, + "@gitopslovers/nx-sass:library": {} } } diff --git a/package.json b/package.json index f8090e97..f6c21c77 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,8 @@ "test:frontend": "nx test frontend", "test:backend": "nx test backend", "lint:frontend": "nx lint frontend", - "lint:backend": "nx lint backend" + "lint:backend": "nx lint backend", + "build:keycloak": "nx build keycloak" }, "private": true, "packageManager": "pnpm@8.15.8", @@ -24,6 +25,7 @@ "@angular/cli": "~17.3.7", "@angular/compiler-cli": "~17.3.9", "@angular/language-service": "~17.3.9", + "@gitopslovers/nx-sass": "^1.5.1", "@nestjs/schematics": "10.1.1", "@nestjs/testing": "10.3.7", "@nx/angular": "19.0.4", @@ -59,7 +61,11 @@ "jest-preset-angular": "14.0.3", "mongodb-memory-server": "^9.2.0", "nx": "19.0.4", + "nx-stylelint": "17.1.4", "prettier": "^3.2.5", + "sass": "1.71.0", + "stylelint": "16.2.1", + "stylelint-config-standard-scss": "13.0.0", "ts-jest": "29.1.2", "ts-node": "10.9.2", "typescript": "5.4.3" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 48d77a49..c6d24f7d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -178,6 +178,9 @@ devDependencies: '@angular/language-service': specifier: ~17.3.9 version: 17.3.9 + '@gitopslovers/nx-sass': + specifier: ^1.5.1 + version: 1.5.1 '@nestjs/schematics': specifier: 10.1.1 version: 10.1.1(typescript@5.4.3) @@ -283,9 +286,21 @@ devDependencies: nx: specifier: 19.0.4 version: 19.0.4 + nx-stylelint: + specifier: 17.1.4 + version: 17.1.4(nx@19.0.4)(stylelint-config-standard-scss@13.0.0)(stylelint@16.2.1) prettier: specifier: ^3.2.5 version: 3.2.5 + sass: + specifier: 1.71.0 + version: 1.71.0 + stylelint: + specifier: 16.2.1 + version: 16.2.1(typescript@5.4.3) + stylelint-config-standard-scss: + specifier: 13.0.0 + version: 13.0.0(postcss@8.4.38)(stylelint@16.2.1) ts-jest: specifier: 29.1.2 version: 29.1.2(@babel/core@7.24.5)(esbuild@0.21.3)(jest@29.7.0)(typescript@5.4.3) @@ -423,7 +438,7 @@ packages: tslib: 2.6.2 typescript: 5.4.3 undici: 6.11.1 - vite: 5.1.7(@types/node@20.11.13)(less@4.1.3)(stylus@0.59.0) + vite: 5.1.7(@types/node@20.11.13)(less@4.1.3)(sass@1.71.0)(stylus@0.59.0) watchpack: 2.4.0 webpack: 5.90.3(esbuild@0.20.1) webpack-dev-middleware: 6.1.2(webpack@5.90.3) @@ -3299,6 +3314,40 @@ packages: '@css-inline/css-inline-win32-x64-msvc': 0.14.1 dev: false + /@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1): + resolution: {integrity: sha512-xI/tL2zxzEbESvnSxwFgwvy5HS00oCXxL4MLs6HUiDcYfwowsoQaABKxUElp1ARITrINzBnsECOc1q0eg2GOrA==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + '@csstools/css-tokenizer': ^2.3.1 + dependencies: + '@csstools/css-tokenizer': 2.3.1 + dev: true + + /@csstools/css-tokenizer@2.3.1: + resolution: {integrity: sha512-iMNHTyxLbBlWIfGtabT157LH9DUx9X8+Y3oymFEuMj8HNc+rpE3dPFGFgHjpKfjeFDjLjYIAIhXPGvS2lKxL9g==} + engines: {node: ^14 || ^16 || >=18} + dev: true + + /@csstools/media-query-list-parser@2.1.11(@csstools/css-parser-algorithms@2.6.3)(@csstools/css-tokenizer@2.3.1): + resolution: {integrity: sha512-uox5MVhvNHqitPP+SynrB1o8oPxPMt2JLgp5ghJOWf54WGQ5OKu47efne49r1SWqs3wRP8xSWjnO9MBKxhB1dA==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + '@csstools/css-parser-algorithms': ^2.6.3 + '@csstools/css-tokenizer': ^2.3.1 + dependencies: + '@csstools/css-parser-algorithms': 2.6.3(@csstools/css-tokenizer@2.3.1) + '@csstools/css-tokenizer': 2.3.1 + dev: true + + /@csstools/selector-specificity@3.1.1(postcss-selector-parser@6.0.16): + resolution: {integrity: sha512-a7cxGcJ2wIlMFLlh8z2ONm+715QkPHiyJcxwQlKOz/03GPw1COpfhcmC9wm4xlZfp//jWHNNMwzjtqHXVWU9KA==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss-selector-parser: ^6.0.13 + dependencies: + postcss-selector-parser: 6.0.16 + dev: true + /@cypress/request@3.0.1: resolution: {integrity: sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ==} engines: {node: '>= 6'} @@ -3995,6 +4044,10 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /@gitopslovers/nx-sass@1.5.1: + resolution: {integrity: sha512-LBIRrFdWZxS8Ft5RiEaSb4vLpW1jC3mBiWV5QG5q6fJRAeIqR/XqsW+AGIivQMXrbNugLJR4JT0tyf9sNOfx0A==} + dev: true + /@humanwhocodes/config-array@0.11.14: resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} @@ -4686,7 +4739,7 @@ packages: resolution: {integrity: sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - semver: 7.6.0 + semver: 7.6.2 /@npmcli/git@5.0.7: resolution: {integrity: sha512-WaOVvto604d5IpdCRV2KjQu8PzkfE96d50CQGKgywXh2GxXmDeUO5EWcBC4V57uFyrNqx83+MewuJh3WTR3xPA==} @@ -4725,7 +4778,7 @@ packages: json-parse-even-better-errors: 3.0.2 normalize-package-data: 6.0.1 proc-log: 4.2.0 - semver: 7.6.0 + semver: 7.6.2 transitivePeerDependencies: - bluebird @@ -4812,6 +4865,14 @@ packages: - verdaccio dev: true + /@nrwl/devkit@18.3.5(nx@19.0.4): + resolution: {integrity: sha512-DIvChKMe4q8CtIsbrumL/aYgf85H5vlT6eF3jnCCWORj6LTwoHtK8Q9ky1+uM82KIM0gaKd32NVDw+w64scHyg==} + dependencies: + '@nx/devkit': 18.3.5(nx@19.0.4) + transitivePeerDependencies: + - nx + dev: true + /@nrwl/devkit@19.0.4(nx@19.0.4): resolution: {integrity: sha512-wOb7qiluWjVgmfhIGxWXAgJ61ZoL7rDYfx0mibPhbBlqm+86NHJ9CbKTfbfamS20fkzCYdhYeE6xd7sdpcZIZA==} dependencies: @@ -5100,6 +5161,22 @@ packages: - verdaccio dev: true + /@nx/devkit@18.3.5(nx@19.0.4): + resolution: {integrity: sha512-9I0L17t0MN87fL4m4MjDiBxJIx7h5RQY/pTYtt5TBjye0ANb165JeE4oh3ibzfjMzXv42Aej2Gm+cOuSPwzT9g==} + peerDependencies: + nx: '>= 16 <= 19' + dependencies: + '@nrwl/devkit': 18.3.5(nx@19.0.4) + ejs: 3.1.10 + enquirer: 2.3.6 + ignore: 5.3.1 + nx: 19.0.4 + semver: 7.6.2 + tmp: 0.2.3 + tslib: 2.6.2 + yargs-parser: 21.1.1 + dev: true + /@nx/devkit@19.0.4(nx@19.0.4): resolution: {integrity: sha512-nsD0RaL61nZLHSJbog2XwxcI8bML5GlI69Z1k2rvd2zvylqdjNS4SXakMPl/Ar9xX2mAW3Qbup850V0jG87y/Q==} peerDependencies: @@ -5472,8 +5549,8 @@ packages: postcss-import: 14.1.0(postcss@8.4.38) postcss-loader: 6.2.1(postcss@8.4.38)(webpack@5.91.0) rxjs: 7.8.1 - sass: 1.77.2 - sass-loader: 12.6.0(sass@1.77.2)(webpack@5.91.0) + sass: 1.71.0 + sass-loader: 12.6.0(sass@1.71.0)(webpack@5.91.0) source-map-loader: 3.0.2(webpack@5.91.0) style-loader: 3.3.4(webpack@5.91.0) stylus: 0.59.0 @@ -6442,7 +6519,7 @@ packages: peerDependencies: vite: ^3.0.0 || ^4.0.0 || ^5.0.0 dependencies: - vite: 5.1.7(@types/node@20.11.13)(less@4.1.3)(stylus@0.59.0) + vite: 5.1.7(@types/node@20.11.13)(less@4.1.3)(sass@1.71.0)(stylus@0.59.0) dev: true /@webassemblyjs/ast@1.12.1: @@ -7300,6 +7377,10 @@ packages: /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + /balanced-match@2.0.0: + resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==} + dev: true + /bare-events@2.2.2: resolution: {integrity: sha512-h7z00dWdG0PYOQEvChhOSWvOfkIKsdZGkWr083FgN/HyoQuebSew/cgirYqh9SCuy/hRvxc5Vy6Fw8xAmYHLkQ==} requiresBuild: true @@ -8182,6 +8263,11 @@ packages: postcss: 8.4.38 dev: true + /css-functions-list@3.2.2: + resolution: {integrity: sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==} + engines: {node: '>=12 || >=16'} + dev: true + /css-loader@6.10.0(webpack@5.90.3): resolution: {integrity: sha512-LTSA/jWbwdMlk+rhmElbDR2vbtQoTBPr7fkJE+mxrHj+7ru0hUmHafDRzWIjIHTwpitWVaqY2/UWGRca3yUgRw==} engines: {node: '>= 12.13.0'} @@ -9656,6 +9742,11 @@ packages: /fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + /fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + dev: true + /fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} dependencies: @@ -9693,6 +9784,13 @@ packages: flat-cache: 3.2.0 dev: true + /file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + dependencies: + flat-cache: 4.0.1 + dev: true + /file-saver@2.0.5: resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==} dev: false @@ -9802,6 +9900,14 @@ packages: rimraf: 3.0.2 dev: true + /flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + dev: true + /flat@5.0.2: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true @@ -10111,6 +10217,22 @@ packages: ini: 2.0.0 dev: true + /global-modules@2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} + dependencies: + global-prefix: 3.0.0 + dev: true + + /global-prefix@3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} + dependencies: + ini: 1.3.8 + kind-of: 6.0.3 + which: 1.3.1 + dev: true + /globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} @@ -10165,6 +10287,10 @@ packages: slash: 4.0.0 dev: true + /globjoin@0.1.4: + resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==} + dev: true + /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: @@ -10290,6 +10416,11 @@ packages: dev: false optional: true + /html-tags@3.3.1: + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + engines: {node: '>=8'} + dev: true + /html-to-text@9.0.5: resolution: {integrity: sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==} engines: {node: '>=14'} @@ -10627,8 +10758,6 @@ packages: /ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} requiresBuild: true - dev: false - optional: true /ini@2.0.0: resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} @@ -10834,6 +10963,11 @@ packages: isobject: 3.0.1 dev: true + /is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + dev: true + /is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} dev: true @@ -11516,7 +11650,7 @@ packages: dependencies: config-chain: 1.1.13 editorconfig: 1.0.4 - glob: 10.3.12 + glob: 10.3.15 js-cookie: 3.0.5 nopt: 7.2.1 dev: false @@ -11770,6 +11904,14 @@ packages: engines: {node: '>= 8'} dev: true + /known-css-properties@0.29.0: + resolution: {integrity: sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==} + dev: true + + /known-css-properties@0.30.0: + resolution: {integrity: sha512-VSWXYUnsPu9+WYKkfmJyLKtIvaRJi1kXUqVmBACORXZQxT5oZDsoZ2vQP+bQFDnWtpI/4eq3MLoRMjI2fnLzTQ==} + dev: true + /launch-editor@2.6.1: resolution: {integrity: sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==} dependencies: @@ -12047,6 +12189,10 @@ packages: resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} dev: true + /lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + dev: true + /lodash.uniq@4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} dev: true @@ -12210,6 +12356,10 @@ packages: uc.micro: 2.1.0 dev: false + /mathml-tag-names@2.1.3: + resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==} + dev: true + /mdn-data@2.0.28: resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} dev: true @@ -12235,6 +12385,7 @@ packages: /memory-pager@1.5.0: resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} + requiresBuild: true /mensch@0.3.4: resolution: {integrity: sha512-IAeFvcOnV9V0Yk+bFhYR07O3yNina9ANIN5MoXBKYJ/RLYPurd2d0yw14MDhpr9/momp0WofT1bPUh3hkzdi/g==} @@ -12242,6 +12393,11 @@ packages: dev: false optional: true + /meow@13.2.0: + resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} + engines: {node: '>=18'} + dev: true + /merge-descriptors@1.0.1: resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} @@ -12477,7 +12633,7 @@ packages: dependencies: '@babel/runtime': 7.24.5 chokidar: 3.6.0 - glob: 10.3.12 + glob: 10.3.15 html-minifier: 4.0.0 js-beautify: 1.15.1 lodash: 4.17.21 @@ -13179,7 +13335,7 @@ packages: make-fetch-happen: 13.0.1 nopt: 7.2.1 proc-log: 3.0.0 - semver: 7.6.0 + semver: 7.6.2 tar: 6.2.1 which: 4.0.0 transitivePeerDependencies: @@ -13214,7 +13370,7 @@ packages: dependencies: hosted-git-info: 7.0.2 is-core-module: 2.13.1 - semver: 7.6.0 + semver: 7.6.2 validate-npm-package-license: 3.0.4 /normalize-path@3.0.0: @@ -13306,6 +13462,27 @@ packages: resolution: {integrity: sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==} dev: true + /nx-stylelint@17.1.4(nx@19.0.4)(stylelint-config-standard-scss@13.0.0)(stylelint@16.2.1): + resolution: {integrity: sha512-S6K4DqRxoz3op2TyFLcDm/46CbGPqrQyEhW8qtXUOfgM+33VITWGSsPEbrng0b9E1FPz4ba6Rh1eS5hIpCoi1g==} + engines: {node: ^18.13.0 || >=20.0.0} + peerDependencies: + stylelint: ^15.0.0 || ^16.0.0 + stylelint-config-standard: '>=30.0.0' + stylelint-config-standard-scss: '>=7.0.0' + peerDependenciesMeta: + stylelint-config-standard: + optional: true + stylelint-config-standard-scss: + optional: true + dependencies: + '@nx/devkit': 18.3.5(nx@19.0.4) + stylelint: 16.2.1(typescript@5.4.3) + stylelint-config-standard-scss: 13.0.0(postcss@8.4.38)(stylelint@16.2.1) + tslib: 2.6.2 + transitivePeerDependencies: + - nx + dev: true + /nx@19.0.4: resolution: {integrity: sha512-E+wkP3H+23Vu9jso6Xw7cbXPzy2PMyrPukrEUDWkQrr/eCqf0Npkj5zky1/lKFSBaLtNYgsFD21co+b4rwxtdw==} hasBin: true @@ -14266,6 +14443,28 @@ packages: postcss-value-parser: 4.2.0 dev: true + /postcss-resolve-nested-selector@0.1.1: + resolution: {integrity: sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==} + dev: true + + /postcss-safe-parser@7.0.0(postcss@8.4.38): + resolution: {integrity: sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg==} + engines: {node: '>=18.0'} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.38 + dev: true + + /postcss-scss@4.0.9(postcss@8.4.38): + resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.4.29 + dependencies: + postcss: 8.4.38 + dev: true + /postcss-selector-parser@6.0.16: resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} engines: {node: '>=4'} @@ -14940,7 +15139,7 @@ packages: /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - /sass-loader@12.6.0(sass@1.77.2)(webpack@5.91.0): + /sass-loader@12.6.0(sass@1.71.0)(webpack@5.91.0): resolution: {integrity: sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -14961,7 +15160,7 @@ packages: dependencies: klona: 2.0.6 neo-async: 2.6.2 - sass: 1.77.2 + sass: 1.71.0 webpack: 5.91.0 dev: true @@ -14991,8 +15190,8 @@ packages: webpack: 5.90.3(esbuild@0.20.1) dev: true - /sass@1.71.1: - resolution: {integrity: sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==} + /sass@1.71.0: + resolution: {integrity: sha512-HKKIKf49Vkxlrav3F/w6qRuPcmImGVbIXJ2I3Kg0VMA+3Bav+8yE9G5XmP5lMj6nl4OlqbPftGAscNaNu28b8w==} engines: {node: '>=14.0.0'} hasBin: true dependencies: @@ -15001,8 +15200,8 @@ packages: source-map-js: 1.2.0 dev: true - /sass@1.77.2: - resolution: {integrity: sha512-eb4GZt1C3avsX3heBNlrc7I09nyT00IUuo4eFhAbeXWU2fvA7oXI53SxODVAA+zgZCk9aunAZgO+losjR3fAwA==} + /sass@1.71.1: + resolution: {integrity: sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==} engines: {node: '>=14.0.0'} hasBin: true dependencies: @@ -15457,6 +15656,7 @@ packages: /sparse-bitfield@3.0.3: resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} + requiresBuild: true dependencies: memory-pager: 1.5.0 @@ -15713,6 +15913,120 @@ packages: postcss-selector-parser: 6.0.16 dev: true + /stylelint-config-recommended-scss@14.0.0(postcss@8.4.38)(stylelint@16.2.1): + resolution: {integrity: sha512-HDvpoOAQ1RpF+sPbDOT2Q2/YrBDEJDnUymmVmZ7mMCeNiFSdhRdyGEimBkz06wsN+HaFwUh249gDR+I9JR7Onw==} + engines: {node: '>=18.12.0'} + peerDependencies: + postcss: ^8.3.3 + stylelint: ^16.0.2 + peerDependenciesMeta: + postcss: + optional: true + dependencies: + postcss: 8.4.38 + postcss-scss: 4.0.9(postcss@8.4.38) + stylelint: 16.2.1(typescript@5.4.3) + stylelint-config-recommended: 14.0.0(stylelint@16.2.1) + stylelint-scss: 6.3.0(stylelint@16.2.1) + dev: true + + /stylelint-config-recommended@14.0.0(stylelint@16.2.1): + resolution: {integrity: sha512-jSkx290CglS8StmrLp2TxAppIajzIBZKYm3IxT89Kg6fGlxbPiTiyH9PS5YUuVAFwaJLl1ikiXX0QWjI0jmgZQ==} + engines: {node: '>=18.12.0'} + peerDependencies: + stylelint: ^16.0.0 + dependencies: + stylelint: 16.2.1(typescript@5.4.3) + dev: true + + /stylelint-config-standard-scss@13.0.0(postcss@8.4.38)(stylelint@16.2.1): + resolution: {integrity: sha512-WaLvkP689qSYUpJQPCo30TFJSSc3VzvvoWnrgp+7PpVby5o8fRUY1cZcP0sePZfjrFl9T8caGhcKg0GO34VDiQ==} + engines: {node: '>=18.12.0'} + peerDependencies: + postcss: ^8.3.3 + stylelint: ^16.1.0 + peerDependenciesMeta: + postcss: + optional: true + dependencies: + postcss: 8.4.38 + stylelint: 16.2.1(typescript@5.4.3) + stylelint-config-recommended-scss: 14.0.0(postcss@8.4.38)(stylelint@16.2.1) + stylelint-config-standard: 36.0.0(stylelint@16.2.1) + dev: true + + /stylelint-config-standard@36.0.0(stylelint@16.2.1): + resolution: {integrity: sha512-3Kjyq4d62bYFp/Aq8PMKDwlgUyPU4nacXsjDLWJdNPRUgpuxALu1KnlAHIj36cdtxViVhXexZij65yM0uNIHug==} + engines: {node: '>=18.12.0'} + peerDependencies: + stylelint: ^16.1.0 + dependencies: + stylelint: 16.2.1(typescript@5.4.3) + stylelint-config-recommended: 14.0.0(stylelint@16.2.1) + dev: true + + /stylelint-scss@6.3.0(stylelint@16.2.1): + resolution: {integrity: sha512-8OSpiuf1xC7f8kllJsBOFAOYp/mR/C1FXMVeOFjtJPw+AFvEmC93FaklHt7MlOqU4poxuQ1TkYMyfI0V+1SxjA==} + engines: {node: '>=18.12.0'} + peerDependencies: + stylelint: ^16.0.2 + dependencies: + known-css-properties: 0.30.0 + postcss-media-query-parser: 0.2.3 + postcss-resolve-nested-selector: 0.1.1 + postcss-selector-parser: 6.0.16 + postcss-value-parser: 4.2.0 + stylelint: 16.2.1(typescript@5.4.3) + dev: true + + /stylelint@16.2.1(typescript@5.4.3): + resolution: {integrity: sha512-SfIMGFK+4n7XVAyv50CpVfcGYWG4v41y6xG7PqOgQSY8M/PgdK0SQbjWFblxjJZlN9jNq879mB4BCZHJRIJ1hA==} + engines: {node: '>=18.12.0'} + hasBin: true + dependencies: + '@csstools/css-parser-algorithms': 2.6.3(@csstools/css-tokenizer@2.3.1) + '@csstools/css-tokenizer': 2.3.1 + '@csstools/media-query-list-parser': 2.1.11(@csstools/css-parser-algorithms@2.6.3)(@csstools/css-tokenizer@2.3.1) + '@csstools/selector-specificity': 3.1.1(postcss-selector-parser@6.0.16) + balanced-match: 2.0.0 + colord: 2.9.3 + cosmiconfig: 9.0.0(typescript@5.4.3) + css-functions-list: 3.2.2 + css-tree: 2.3.1 + debug: 4.3.4(supports-color@8.1.1) + fast-glob: 3.3.2 + fastest-levenshtein: 1.0.16 + file-entry-cache: 8.0.0 + global-modules: 2.0.0 + globby: 11.1.0 + globjoin: 0.1.4 + html-tags: 3.3.1 + ignore: 5.3.1 + imurmurhash: 0.1.4 + is-plain-object: 5.0.0 + known-css-properties: 0.29.0 + mathml-tag-names: 2.1.3 + meow: 13.2.0 + micromatch: 4.0.5 + normalize-path: 3.0.0 + picocolors: 1.0.1 + postcss: 8.4.38 + postcss-resolve-nested-selector: 0.1.1 + postcss-safe-parser: 7.0.0(postcss@8.4.38) + postcss-selector-parser: 6.0.16 + postcss-value-parser: 4.2.0 + resolve-from: 5.0.0 + string-width: 4.2.3 + strip-ansi: 7.1.0 + supports-hyperlinks: 3.0.0 + svg-tags: 1.0.0 + table: 6.8.2 + write-file-atomic: 5.0.1 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + /stylus-loader@7.1.3(stylus@0.59.0)(webpack@5.91.0): resolution: {integrity: sha512-TY0SKwiY7D2kMd3UxaWKSf3xHF0FFN/FAfsSqfrhxRT/koXTwffq2cgEWDkLQz7VojMu7qEEHt5TlMjkPx9UDw==} engines: {node: '>= 14.15.0'} @@ -15757,10 +16071,22 @@ packages: dependencies: has-flag: 4.0.0 + /supports-hyperlinks@3.0.0: + resolution: {integrity: sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==} + engines: {node: '>=14.18'} + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + dev: true + /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + /svg-tags@1.0.0: + resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} + dev: true + /svgo@3.3.2: resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==} engines: {node: '>=14.0.0'} @@ -15787,6 +16113,17 @@ packages: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} dev: true + /table@6.8.2: + resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==} + engines: {node: '>=10.0.0'} + dependencies: + ajv: 8.13.0 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + /tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} @@ -16453,7 +16790,7 @@ packages: extsprintf: 1.3.0 dev: true - /vite@5.1.7(@types/node@20.11.13)(less@4.1.3)(stylus@0.59.0): + /vite@5.1.7(@types/node@20.11.13)(less@4.1.3)(sass@1.71.0)(stylus@0.59.0): resolution: {integrity: sha512-sgnEEFTZYMui/sTlH1/XEnVNHMujOahPLGMxn1+5sIT45Xjng1Ec1K78jRP15dSmVgg5WBin9yO81j3o9OxofA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -16486,6 +16823,7 @@ packages: less: 4.1.3 postcss: 8.4.35 rollup: 4.17.2 + sass: 1.71.0 stylus: 0.59.0 optionalDependencies: fsevents: 2.3.3 @@ -16910,8 +17248,6 @@ packages: requiresBuild: true dependencies: isexe: 2.0.0 - dev: false - optional: true /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} @@ -16988,6 +17324,14 @@ packages: signal-exit: 3.0.7 dev: true + /write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.1.0 + dev: true + /ws@8.11.0: resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} engines: {node: '>=10.0.0'}