diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..03f961b --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,104 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +SSuite is an Angular workspace containing three libraries designed as a modular component system: + +- **shared-ui**: UI design system with comprehensive SCSS styling, design tokens, and reusable components +- **shared-utils**: Common utilities and shared services +- **ui-essentials**: Essential UI components and functionality + +## Development Commands + +### Building +```bash +# Build all libraries +ng build + +# Build specific library +ng build shared-ui +ng build shared-utils +ng build ui-essentials + +# Watch mode for development +ng build --watch --configuration development +``` + +### Testing +```bash +# Run all tests +ng test + +# Run tests for specific library +ng test shared-ui +ng test shared-utils +ng test ui-essentials +``` + +### Development Server +```bash +# Start development server (if main application exists) +ng serve +``` + +## Architecture + +### Library Structure +Each library follows Angular's standard structure: +- `src/lib/` - Library source code +- `src/public-api.ts` - Public exports +- `ng-package.json` - Library packaging configuration +- `package.json` - Library metadata + +### TypeScript Path Mapping +Libraries are mapped in `tsconfig.json` paths: +```json +"paths": { + "shared-ui": ["./dist/shared-ui"], + "shared-utils": ["./dist/shared-utils"], + "ui-essentials": ["./dist/ui-essentials"] +} +``` + +### Design System (shared-ui) +Contains a comprehensive SCSS architecture: +- **Base tokens**: Colors, typography, spacing, motion, shadows +- **Semantic tokens**: High-level design tokens built on base tokens +- **Components**: Base buttons, cards, forms, navigation +- **Layouts**: Grid systems, dashboard layouts, responsive templates +- **Utilities**: Display, layout, spacing utilities +- **Patterns**: Content, interaction, and layout patterns +- **Font faces**: Extensive collection of web fonts + +#### Style Import Options: +```scss +// Complete design system (includes semantic + base tokens + fonts) +@use 'shared-ui/src/styles' as ui; + +// Tokens only (semantic + base tokens) +@use 'shared-ui/src/styles/tokens' as tokens; + +// Semantic tokens only (includes base tokens) +@use 'shared-ui/src/styles/semantic' as semantic; + +// Base tokens only +@use 'shared-ui/src/styles/base' as base; + +// Components and utilities (import separately to avoid circular dependencies) +@use 'shared-ui/src/styles/commons' as commons; +``` + +Entry points: +- Main: `projects/shared-ui/src/styles/index.scss` +- Tokens: `projects/shared-ui/src/styles/tokens.scss` +- Semantic: `projects/shared-ui/src/styles/semantic/index.scss` + +## Development Notes + +- All libraries use Angular 19.2+ with strict TypeScript configuration +- Libraries must be built before being consumed by other projects +- Use `ng generate` commands within library contexts for scaffolding +- Libraries are publishable to npm after building to `dist/` directory +- Testing uses Karma with Jasmine framework \ No newline at end of file diff --git a/angular.json b/angular.json index 0763165..5bce349 100644 --- a/angular.json +++ b/angular.json @@ -3,5 +3,199 @@ "version": 1, "newProjectRoot": "projects", "projects": { + "shared-ui": { + "projectType": "library", + "root": "projects/shared-ui", + "sourceRoot": "projects/shared-ui/src", + "prefix": "lib", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:ng-packagr", + "options": { + "project": "projects/shared-ui/ng-package.json" + }, + "configurations": { + "production": { + "tsConfig": "projects/shared-ui/tsconfig.lib.prod.json" + }, + "development": { + "tsConfig": "projects/shared-ui/tsconfig.lib.json" + } + }, + "defaultConfiguration": "production" + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "tsConfig": "projects/shared-ui/tsconfig.spec.json", + "polyfills": [ + "zone.js", + "zone.js/testing" + ] + } + } + } + }, + "shared-utils": { + "projectType": "library", + "root": "projects/shared-utils", + "sourceRoot": "projects/shared-utils/src", + "prefix": "lib", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:ng-packagr", + "options": { + "project": "projects/shared-utils/ng-package.json" + }, + "configurations": { + "production": { + "tsConfig": "projects/shared-utils/tsconfig.lib.prod.json" + }, + "development": { + "tsConfig": "projects/shared-utils/tsconfig.lib.json" + } + }, + "defaultConfiguration": "production" + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "tsConfig": "projects/shared-utils/tsconfig.spec.json", + "polyfills": [ + "zone.js", + "zone.js/testing" + ] + } + } + } + }, + "ui-essentials": { + "projectType": "library", + "root": "projects/ui-essentials", + "sourceRoot": "projects/ui-essentials/src", + "prefix": "lib", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:ng-packagr", + "options": { + "project": "projects/ui-essentials/ng-package.json" + }, + "configurations": { + "production": { + "tsConfig": "projects/ui-essentials/tsconfig.lib.prod.json" + }, + "development": { + "tsConfig": "projects/ui-essentials/tsconfig.lib.json" + } + }, + "defaultConfiguration": "production" + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "tsConfig": "projects/ui-essentials/tsconfig.spec.json", + "polyfills": [ + "zone.js", + "zone.js/testing" + ] + } + } + } + }, + "demo-ui-essentials": { + "projectType": "application", + "schematics": { + "@schematics/angular:component": { + "style": "scss" + } + }, + "root": "projects/demo-ui-essentials", + "sourceRoot": "projects/demo-ui-essentials/src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:application", + "options": { + "outputPath": "dist/demo-ui-essentials", + "index": "projects/demo-ui-essentials/src/index.html", + "browser": "projects/demo-ui-essentials/src/main.ts", + "polyfills": [ + "zone.js" + ], + "tsConfig": "projects/demo-ui-essentials/tsconfig.app.json", + "inlineStyleLanguage": "scss", + "assets": [ + { + "glob": "**/*", + "input": "projects/demo-ui-essentials/public" + } + ], + "styles": [ + "projects/demo-ui-essentials/src/styles.scss" + ], + "scripts": [] + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "500kB", + "maximumError": "1MB" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "4kB", + "maximumError": "8kB" + } + ], + "outputHashing": "all" + }, + "development": { + "optimization": false, + "extractLicenses": false, + "sourceMap": true + } + }, + "defaultConfiguration": "production" + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "configurations": { + "production": { + "buildTarget": "demo-ui-essentials:build:production" + }, + "development": { + "buildTarget": "demo-ui-essentials:build:development" + } + }, + "defaultConfiguration": "development" + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n" + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "polyfills": [ + "zone.js", + "zone.js/testing" + ], + "tsConfig": "projects/demo-ui-essentials/tsconfig.spec.json", + "inlineStyleLanguage": "scss", + "assets": [ + { + "glob": "**/*", + "input": "projects/demo-ui-essentials/public" + } + ], + "styles": [ + "projects/demo-ui-essentials/src/styles.scss" + ], + "scripts": [] + } + } + } + } } } diff --git a/kill.sh b/kill.sh new file mode 100755 index 0000000..00d95fb --- /dev/null +++ b/kill.sh @@ -0,0 +1 @@ +lsof -t -i tcp:4200 | xargs kill -9 diff --git a/package-lock.json b/package-lock.json index e743548..1fffbd8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,11 +15,17 @@ "@angular/platform-browser": "^19.2.0", "@angular/platform-browser-dynamic": "^19.2.0", "@angular/router": "^19.2.0", + "@fortawesome/angular-fontawesome": "^1.0.0", + "@fortawesome/fontawesome-svg-core": "^7.0.0", + "@fortawesome/free-brands-svg-icons": "^7.0.0", + "@fortawesome/free-regular-svg-icons": "^7.0.0", + "@fortawesome/free-solid-svg-icons": "^7.0.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.15.0" }, "devDependencies": { + "@angular-devkit/build-angular": "^19.2.15", "@angular/cli": "^19.2.15", "@angular/compiler-cli": "^19.2.0", "@types/jasmine": "~5.1.0", @@ -29,6 +35,7 @@ "karma-coverage": "~2.2.0", "karma-jasmine": "~5.1.0", "karma-jasmine-html-reporter": "~2.1.0", + "ng-packagr": "^19.2.0", "typescript": "~5.7.2" } }, @@ -69,6 +76,245 @@ "tslib": "^2.1.0" } }, + "node_modules/@angular-devkit/build-angular": { + "version": "19.2.15", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-19.2.15.tgz", + "integrity": "sha512-mqudAcyrSp/E7ZQdQoHfys0/nvQuwyJDaAzj3qL3HUStuUzb5ULNOj2f6sFBo+xYo+/WT8IzmzDN9DCqDgvFaA==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.1902.15", + "@angular-devkit/build-webpack": "0.1902.15", + "@angular-devkit/core": "19.2.15", + "@angular/build": "19.2.15", + "@babel/core": "7.26.10", + "@babel/generator": "7.26.10", + "@babel/helper-annotate-as-pure": "7.25.9", + "@babel/helper-split-export-declaration": "7.24.7", + "@babel/plugin-transform-async-generator-functions": "7.26.8", + "@babel/plugin-transform-async-to-generator": "7.25.9", + "@babel/plugin-transform-runtime": "7.26.10", + "@babel/preset-env": "7.26.9", + "@babel/runtime": "7.26.10", + "@discoveryjs/json-ext": "0.6.3", + "@ngtools/webpack": "19.2.15", + "@vitejs/plugin-basic-ssl": "1.2.0", + "ansi-colors": "4.1.3", + "autoprefixer": "10.4.20", + "babel-loader": "9.2.1", + "browserslist": "^4.21.5", + "copy-webpack-plugin": "12.0.2", + "css-loader": "7.1.2", + "esbuild-wasm": "0.25.4", + "fast-glob": "3.3.3", + "http-proxy-middleware": "3.0.5", + "istanbul-lib-instrument": "6.0.3", + "jsonc-parser": "3.3.1", + "karma-source-map-support": "1.4.0", + "less": "4.2.2", + "less-loader": "12.2.0", + "license-webpack-plugin": "4.0.2", + "loader-utils": "3.3.1", + "mini-css-extract-plugin": "2.9.2", + "open": "10.1.0", + "ora": "5.4.1", + "picomatch": "4.0.2", + "piscina": "4.8.0", + "postcss": "8.5.2", + "postcss-loader": "8.1.1", + "resolve-url-loader": "5.0.0", + "rxjs": "7.8.1", + "sass": "1.85.0", + "sass-loader": "16.0.5", + "semver": "7.7.1", + "source-map-loader": "5.0.0", + "source-map-support": "0.5.21", + "terser": "5.39.0", + "tree-kill": "1.2.2", + "tslib": "2.8.1", + "webpack": "5.98.0", + "webpack-dev-middleware": "7.4.2", + "webpack-dev-server": "5.2.2", + "webpack-merge": "6.0.1", + "webpack-subresource-integrity": "5.1.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "esbuild": "0.25.4" + }, + "peerDependencies": { + "@angular/compiler-cli": "^19.0.0 || ^19.2.0-next.0", + "@angular/localize": "^19.0.0 || ^19.2.0-next.0", + "@angular/platform-server": "^19.0.0 || ^19.2.0-next.0", + "@angular/service-worker": "^19.0.0 || ^19.2.0-next.0", + "@angular/ssr": "^19.2.15", + "@web/test-runner": "^0.20.0", + "browser-sync": "^3.0.2", + "jest": "^29.5.0", + "jest-environment-jsdom": "^29.5.0", + "karma": "^6.3.0", + "ng-packagr": "^19.0.0 || ^19.2.0-next.0", + "protractor": "^7.0.0", + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "typescript": ">=5.5 <5.9" + }, + "peerDependenciesMeta": { + "@angular/localize": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "@angular/ssr": { + "optional": true + }, + "@web/test-runner": { + "optional": true + }, + "browser-sync": { + "optional": true + }, + "jest": { + "optional": true + }, + "jest-environment-jsdom": { + "optional": true + }, + "karma": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "protractor": { + "optional": true + }, + "tailwindcss": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@babel/core": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@babel/generator": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.10.tgz", + "integrity": "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.26.10", + "@babel/types": "^7.26.10", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/@angular-devkit/build-angular/node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@angular-devkit/build-webpack": { + "version": "0.1902.15", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1902.15.tgz", + "integrity": "sha512-pIfZeizWsViXx8bsMoBLZw7Tl7uFf7bM7hAfmNwk0bb0QGzx5k1BiW6IKWyaG+Dg6U4UCrlNpIiut2b78HwQZw==", + "dev": true, + "dependencies": { + "@angular-devkit/architect": "0.1902.15", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "webpack": "^5.30.0", + "webpack-dev-server": "^5.0.2" + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/@angular-devkit/core": { "version": "19.2.15", "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.15.tgz", @@ -132,6 +378,272 @@ "tslib": "^2.1.0" } }, + "node_modules/@angular/build": { + "version": "19.2.15", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.2.15.tgz", + "integrity": "sha512-iE4fp4d5ALu702uoL6/YkjM2JlGEXZ5G+RVzq3W2jg/Ft6ISAQnRKB6mymtetDD6oD7i87e8uSu9kFVNBauX2w==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.1902.15", + "@babel/core": "7.26.10", + "@babel/helper-annotate-as-pure": "7.25.9", + "@babel/helper-split-export-declaration": "7.24.7", + "@babel/plugin-syntax-import-attributes": "7.26.0", + "@inquirer/confirm": "5.1.6", + "@vitejs/plugin-basic-ssl": "1.2.0", + "beasties": "0.3.2", + "browserslist": "^4.23.0", + "esbuild": "0.25.4", + "fast-glob": "3.3.3", + "https-proxy-agent": "7.0.6", + "istanbul-lib-instrument": "6.0.3", + "listr2": "8.2.5", + "magic-string": "0.30.17", + "mrmime": "2.0.1", + "parse5-html-rewriting-stream": "7.0.0", + "picomatch": "4.0.2", + "piscina": "4.8.0", + "rollup": "4.34.8", + "sass": "1.85.0", + "semver": "7.7.1", + "source-map-support": "0.5.21", + "vite": "6.2.7", + "watchpack": "2.4.2" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "lmdb": "3.2.6" + }, + "peerDependencies": { + "@angular/compiler": "^19.0.0 || ^19.2.0-next.0", + "@angular/compiler-cli": "^19.0.0 || ^19.2.0-next.0", + "@angular/localize": "^19.0.0 || ^19.2.0-next.0", + "@angular/platform-server": "^19.0.0 || ^19.2.0-next.0", + "@angular/service-worker": "^19.0.0 || ^19.2.0-next.0", + "@angular/ssr": "^19.2.15", + "karma": "^6.4.0", + "less": "^4.2.0", + "ng-packagr": "^19.0.0 || ^19.2.0-next.0", + "postcss": "^8.4.0", + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "typescript": ">=5.5 <5.9" + }, + "peerDependenciesMeta": { + "@angular/localize": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "@angular/ssr": { + "optional": true + }, + "karma": { + "optional": true + }, + "less": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tailwindcss": { + "optional": true + } + } + }, + "node_modules/@angular/build/node_modules/@babel/core": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@angular/build/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@angular/build/node_modules/@inquirer/confirm": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.6.tgz", + "integrity": "sha512-6ZXYK3M1XmaVBZX6FCfChgtponnL0R6I7k8Nu+kaoNkT828FVZTcca1MqmWQipaW2oNREQl5AaPCUOOCVNdRMw==", + "dev": true, + "dependencies": { + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@angular/build/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/@angular/build/node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@angular/build/node_modules/vite": { + "version": "6.2.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.7.tgz", + "integrity": "sha512-qg3LkeuinTrZoJHHF94coSaTfIPyBYoywp+ys4qu20oSJFbKMYoIJo0FWJT9q6Vp49l6z9IsJRbHdcGtiKbGoQ==", + "dev": true, + "dependencies": { + "esbuild": "^0.25.0", + "postcss": "^8.5.3", + "rollup": "^4.30.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/@angular/build/node_modules/vite/node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, "node_modules/@angular/cli": { "version": "19.2.15", "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.2.15.tgz", @@ -390,6 +902,18 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-compilation-targets": { "version": "7.27.2", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", @@ -415,6 +939,102 @@ "semver": "bin/semver.js" } }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz", + "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", + "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "regexpu-core": "^6.2.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", + "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "debug": "^4.4.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.10" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/@babel/helper-globals": { "version": "7.28.0", "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", @@ -424,6 +1044,19 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-module-imports": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", @@ -454,6 +1087,98 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", @@ -481,6 +1206,20 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", + "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", + "dev": true, + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helpers": { "version": "7.28.3", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.3.tgz", @@ -509,6 +1248,1103 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", + "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz", + "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", + "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz", + "integrity": "sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.26.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.0.tgz", + "integrity": "sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", + "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", + "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.3", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.3.tgz", + "integrity": "sha512-DoEWC5SuxuARF2KdKmGUq3ghfPMO6ZzR12Dnp5gubwbeWJo4dbNWXJPVlwvh4Zlq6Z7YVvL8VFxeSOJgjsx4Sg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", + "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz", + "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", + "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", + "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", + "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", + "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", + "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", + "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", + "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.0.tgz", + "integrity": "sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", + "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", + "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", + "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", + "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.3.tgz", + "integrity": "sha512-K3/M/a4+ESb5LEldjQb+XSrpY0nF+ZBFlTCbSnKaYAMfD8v33O6PMs4uYnOk19HlcsI8WMu3McdFPTiQHF/1/A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", + "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.26.10.tgz", + "integrity": "sha512-NWaL2qG6HRpONTnj4JvDU6th4jYeZOJgu3QhmFTCihib0ermtOJqktA5BduGm3suhhVe9EMP9c9+mfJ/I9slqw==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.11.0", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", + "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", + "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", + "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.9.tgz", + "integrity": "sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.26.8", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.26.8", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.26.5", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.26.3", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.26.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.26.3", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.26.6", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.26.8", + "@babel/plugin-transform-typeof-symbol": "^7.26.7", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.11.0", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.40.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz", + "integrity": "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/template": { "version": "7.27.2", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", @@ -563,6 +2399,498 @@ "node": ">=0.1.90" } }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz", + "integrity": "sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==", + "dev": true, + "engines": { + "node": ">=14.17.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", + "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", + "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", + "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", + "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", + "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", + "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", + "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", + "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", + "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", + "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", + "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", + "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", + "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", + "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", + "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", + "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", + "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", + "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", + "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", + "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", + "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", + "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", + "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", + "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", + "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@fortawesome/angular-fontawesome": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@fortawesome/angular-fontawesome/-/angular-fontawesome-1.0.0.tgz", + "integrity": "sha512-EC2fYuXIuw2ld1kzJi+zysWus6OeGGfLQtbh0hW9zyyq5aBo8ZJkcJKBsVQ8E6Mg7nHyTWaXn+sdcXTPDWz+UQ==", + "dependencies": { + "@fortawesome/fontawesome-svg-core": "^6.7.1", + "tslib": "^2.8.1" + }, + "peerDependencies": { + "@angular/core": "^19.0.0" + } + }, + "node_modules/@fortawesome/angular-fontawesome/node_modules/@fortawesome/fontawesome-common-types": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.7.2.tgz", + "integrity": "sha512-Zs+YeHUC5fkt7Mg1l6XTniei3k4bwG/yo3iFUtZWd/pMx9g3fdvkSK9E0FOC+++phXOka78uJcYb8JaFkW52Xg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/angular-fontawesome/node_modules/@fortawesome/fontawesome-svg-core": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.7.2.tgz", + "integrity": "sha512-yxtOBWDrdi5DD5o1pmVdq3WMCvnobT0LU6R8RyyVXPvFRd2o79/0NCuQoCjNTeZz9EzA9xS3JxNWfv54RIHFEA==", + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.7.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/fontawesome-common-types": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-7.0.0.tgz", + "integrity": "sha512-PGMrIYXLGA5K8RWy8zwBkd4vFi4z7ubxtet6Yn13Plf6krRTwPbdlCwlcfmoX0R7B4Z643QvrtHmdQ5fNtfFCg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/fontawesome-svg-core": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-7.0.0.tgz", + "integrity": "sha512-obBEF+zd98r/KtKVW6A+8UGWeaOoyMpl6Q9P3FzHsOnsg742aXsl8v+H/zp09qSSu/a/Hxe9LNKzbBaQq1CEbA==", + "dependencies": { + "@fortawesome/fontawesome-common-types": "7.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-brands-svg-icons": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-7.0.0.tgz", + "integrity": "sha512-C8oY28gq/Qx/cHReJa2AunKJUHvUZDVoPlSTHtAvjriaNfi+5nugW4cx7yA/xN3f/nYkElw11gFBoJ2xUDDFgg==", + "dependencies": { + "@fortawesome/fontawesome-common-types": "7.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-regular-svg-icons": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-7.0.0.tgz", + "integrity": "sha512-qAh0mTaCY22sQzMK2lKBrtn/aR4keUu5XmtdYR7d702laMe0h+Ab4Kj2pExR9HZkKhjKoq8pbwt8Td+mjW/ipQ==", + "dependencies": { + "@fortawesome/fontawesome-common-types": "7.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-solid-svg-icons": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-7.0.0.tgz", + "integrity": "sha512-njSLAllkOddYDCXgTFboXn54Oe5FcvpkWq+FoetOHR64PbN0608kM02Lze0xtISGpXgP+i26VyXRQA0Irh3Obw==", + "dependencies": { + "@fortawesome/fontawesome-common-types": "7.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/@inquirer/checkbox": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.2.2.tgz", @@ -997,6 +3325,16 @@ "node": ">=6.0.0" } }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", @@ -1013,6 +3351,125 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "dev": true, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/buffers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.0.0.tgz", + "integrity": "sha512-NDigYR3PHqCnQLXYyoLbnEdzMMvzeiCWo1KOut7Q0CoIqg9tUAPKJ1iq/2nFhc5kZtexzutNY0LFjdwWL3Dw3Q==", + "dev": true, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/codegen": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", + "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", + "dev": true, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.11.0.tgz", + "integrity": "sha512-nLqSTAYwpk+5ZQIoVp7pfd/oSKNWlEdvTq2LzVA4r2wtWZg6v+5u0VgBOaDJuUfNOuw/4Ysq6glN5QKSrOCgrA==", + "dev": true, + "dependencies": { + "@jsonjoy.com/base64": "^1.1.2", + "@jsonjoy.com/buffers": "^1.0.0", + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/json-pointer": "^1.0.1", + "@jsonjoy.com/util": "^1.9.0", + "hyperdyperid": "^1.2.0", + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pointer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz", + "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==", + "dev": true, + "dependencies": { + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/util": "^1.9.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz", + "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==", + "dev": true, + "dependencies": { + "@jsonjoy.com/buffers": "^1.0.0", + "@jsonjoy.com/codegen": "^1.0.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "dev": true + }, "node_modules/@listr2/prompt-adapter-inquirer": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-2.0.18.tgz", @@ -1049,6 +3506,518 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/@lmdb/lmdb-darwin-arm64": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.2.6.tgz", + "integrity": "sha512-yF/ih9EJJZc72psFQbwnn8mExIWfTnzWJg+N02hnpXtDPETYLmQswIMBn7+V88lfCaFrMozJsUvcEQIkEPU0Gg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-darwin-x64": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.2.6.tgz", + "integrity": "sha512-5BbCumsFLbCi586Bb1lTWQFkekdQUw8/t8cy++Uq251cl3hbDIGEwD9HAwh8H6IS2F6QA9KdKmO136LmipRNkg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.2.6.tgz", + "integrity": "sha512-+6XgLpMb7HBoWxXj+bLbiiB4s0mRRcDPElnRS3LpWRzdYSe+gFk5MT/4RrVNqd2MESUDmb53NUXw1+BP69bjiQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm64": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.2.6.tgz", + "integrity": "sha512-l5VmJamJ3nyMmeD1ANBQCQqy7do1ESaJQfKPSm2IG9/ADZryptTyCj8N6QaYgIWewqNUrcbdMkJajRQAt5Qjfg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-x64": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.2.6.tgz", + "integrity": "sha512-nDYT8qN9si5+onHYYaI4DiauDMx24OAiuZAUsEqrDy+ja/3EbpXPX/VAkMV8AEaQhy3xc4dRC+KcYIvOFefJ4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-win32-x64": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.2.6.tgz", + "integrity": "sha512-XlqVtILonQnG+9fH2N3Aytria7P/1fwDgDhl29rde96uH2sLB8CHORIf2PfuLVzFQJ7Uqp8py9AYwr3ZUCFfWg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", + "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", + "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", + "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", + "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", + "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", + "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@napi-rs/nice": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.1.1.tgz", + "integrity": "sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw==", + "dev": true, + "optional": true, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "optionalDependencies": { + "@napi-rs/nice-android-arm-eabi": "1.1.1", + "@napi-rs/nice-android-arm64": "1.1.1", + "@napi-rs/nice-darwin-arm64": "1.1.1", + "@napi-rs/nice-darwin-x64": "1.1.1", + "@napi-rs/nice-freebsd-x64": "1.1.1", + "@napi-rs/nice-linux-arm-gnueabihf": "1.1.1", + "@napi-rs/nice-linux-arm64-gnu": "1.1.1", + "@napi-rs/nice-linux-arm64-musl": "1.1.1", + "@napi-rs/nice-linux-ppc64-gnu": "1.1.1", + "@napi-rs/nice-linux-riscv64-gnu": "1.1.1", + "@napi-rs/nice-linux-s390x-gnu": "1.1.1", + "@napi-rs/nice-linux-x64-gnu": "1.1.1", + "@napi-rs/nice-linux-x64-musl": "1.1.1", + "@napi-rs/nice-openharmony-arm64": "1.1.1", + "@napi-rs/nice-win32-arm64-msvc": "1.1.1", + "@napi-rs/nice-win32-ia32-msvc": "1.1.1", + "@napi-rs/nice-win32-x64-msvc": "1.1.1" + } + }, + "node_modules/@napi-rs/nice-android-arm-eabi": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.1.1.tgz", + "integrity": "sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-android-arm64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.1.1.tgz", + "integrity": "sha512-blG0i7dXgbInN5urONoUCNf+DUEAavRffrO7fZSeoRMJc5qD+BJeNcpr54msPF6qfDD6kzs9AQJogZvT2KD5nw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-darwin-arm64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.1.1.tgz", + "integrity": "sha512-s/E7w45NaLqTGuOjC2p96pct4jRfo61xb9bU1unM/MJ/RFkKlJyJDx7OJI/O0ll/hrfpqKopuAFDV8yo0hfT7A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-darwin-x64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.1.1.tgz", + "integrity": "sha512-dGoEBnVpsdcC+oHHmW1LRK5eiyzLwdgNQq3BmZIav+9/5WTZwBYX7r5ZkQC07Nxd3KHOCkgbHSh4wPkH1N1LiQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-freebsd-x64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.1.1.tgz", + "integrity": "sha512-kHv4kEHAylMYmlNwcQcDtXjklYp4FCf0b05E+0h6nDHsZ+F0bDe04U/tXNOqrx5CmIAth4vwfkjjUmp4c4JktQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm-gnueabihf": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.1.1.tgz", + "integrity": "sha512-E1t7K0efyKXZDoZg1LzCOLxgolxV58HCkaEkEvIYQx12ht2pa8hoBo+4OB3qh7e+QiBlp1SRf+voWUZFxyhyqg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm64-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.1.1.tgz", + "integrity": "sha512-CIKLA12DTIZlmTaaKhQP88R3Xao+gyJxNWEn04wZwC2wmRapNnxCUZkVwggInMJvtVElA+D4ZzOU5sX4jV+SmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm64-musl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.1.1.tgz", + "integrity": "sha512-+2Rzdb3nTIYZ0YJF43qf2twhqOCkiSrHx2Pg6DJaCPYhhaxbLcdlV8hCRMHghQ+EtZQWGNcS2xF4KxBhSGeutg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-ppc64-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.1.1.tgz", + "integrity": "sha512-4FS8oc0GeHpwvv4tKciKkw3Y4jKsL7FRhaOeiPei0X9T4Jd619wHNe4xCLmN2EMgZoeGg+Q7GY7BsvwKpL22Tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-riscv64-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.1.1.tgz", + "integrity": "sha512-HU0nw9uD4FO/oGCCk409tCi5IzIZpH2agE6nN4fqpwVlCn5BOq0MS1dXGjXaG17JaAvrlpV5ZeyZwSon10XOXw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-s390x-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.1.1.tgz", + "integrity": "sha512-2YqKJWWl24EwrX0DzCQgPLKQBxYDdBxOHot1KWEq7aY2uYeX+Uvtv4I8xFVVygJDgf6/92h9N3Y43WPx8+PAgQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-x64-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.1.1.tgz", + "integrity": "sha512-/gaNz3R92t+dcrfCw/96pDopcmec7oCcAQ3l/M+Zxr82KT4DljD37CpgrnXV+pJC263JkW572pdbP3hP+KjcIg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-x64-musl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.1.1.tgz", + "integrity": "sha512-xScCGnyj/oppsNPMnevsBe3pvNaoK7FGvMjT35riz9YdhB2WtTG47ZlbxtOLpjeO9SqqQ2J2igCmz6IJOD5JYw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-openharmony-arm64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-openharmony-arm64/-/nice-openharmony-arm64-1.1.1.tgz", + "integrity": "sha512-6uJPRVwVCLDeoOaNyeiW0gp2kFIM4r7PL2MczdZQHkFi9gVlgm+Vn+V6nTWRcu856mJ2WjYJiumEajfSm7arPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-arm64-msvc": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.1.1.tgz", + "integrity": "sha512-uoTb4eAvM5B2aj/z8j+Nv8OttPf2m+HVx3UjA5jcFxASvNhQriyCQF1OB1lHL43ZhW+VwZlgvjmP5qF3+59atA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-ia32-msvc": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.1.1.tgz", + "integrity": "sha512-CNQqlQT9MwuCsg1Vd/oKXiuH+TcsSPJmlAFc5frFyX/KkOh0UpBLEj7aoY656d5UKZQMQFP7vJNa1DNUNORvug==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-x64-msvc": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.1.1.tgz", + "integrity": "sha512-vB+4G/jBQCAh0jelMTY3+kgFy00Hlx2f2/1zjMoH821IbplbWZOkLiTYXQkygNTzQJTq5cvwBDgn2ppHD+bglQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@ngtools/webpack": { + "version": "19.2.15", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-19.2.15.tgz", + "integrity": "sha512-H37nop/wWMkSgoU2VvrMzanHePdLRRrX52nC5tT2ZhH3qP25+PrnMyw11PoLDLv3iWXC68uB1AiKNIT+jiQbuQ==", + "dev": true, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^19.0.0 || ^19.2.0-next.0", + "typescript": ">=5.5 <5.9", + "webpack": "^5.54.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/@npmcli/agent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz", @@ -1305,6 +4274,322 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher/node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/@parcel/watcher/node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "optional": true + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -1315,6 +4600,356 @@ "node": ">=14" } }, + "node_modules/@rollup/plugin-json": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz", + "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.1.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.2.0.tgz", + "integrity": "sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.8.tgz", + "integrity": "sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.8.tgz", + "integrity": "sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.8.tgz", + "integrity": "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.8.tgz", + "integrity": "sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.8.tgz", + "integrity": "sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.8.tgz", + "integrity": "sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.8.tgz", + "integrity": "sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.8.tgz", + "integrity": "sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.8.tgz", + "integrity": "sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.8.tgz", + "integrity": "sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.8.tgz", + "integrity": "sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.8.tgz", + "integrity": "sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.50.0.tgz", + "integrity": "sha512-I1gSMzkVe1KzAxKAroCJL30hA4DqSi+wGc5gviD0y3IL/VkvcnAqwBf4RHXHyvH66YVHxpKO8ojrgc4SrWAnLg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.8.tgz", + "integrity": "sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.50.0.tgz", + "integrity": "sha512-LSXSGumSURzEQLT2e4sFqFOv3LWZsEF8FK7AAv9zHZNDdMnUPYH3t8ZlaeYYZyTXnsob3htwTKeWtBIkPV27iQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.8.tgz", + "integrity": "sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.8.tgz", + "integrity": "sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.8.tgz", + "integrity": "sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.50.0.tgz", + "integrity": "sha512-PZkNLPfvXeIOgJWA804zjSFH7fARBBCpCXxgkGDRjjAhRLOR8o0IGS01ykh5GYfod4c2yiiREuDM8iZ+pVsT+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openharmony" + ], + "peer": true + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.8.tgz", + "integrity": "sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.8.tgz", + "integrity": "sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.8.tgz", + "integrity": "sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/wasm-node": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/wasm-node/-/wasm-node-4.50.0.tgz", + "integrity": "sha512-mCzoNeR8ynLTHJ5VQ9J/GzSKPJjEC4/nCmGw2y3NSCZoc4sbSVdNe5x4S7+bda6QIEUrk6lR1FE7FEDo+p/u1Q==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, "node_modules/@schematics/angular": { "version": "19.2.15", "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.2.15.tgz", @@ -1405,6 +5040,18 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@socket.io/component-emitter": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", @@ -1457,6 +5104,44 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, "node_modules/@types/cors": { "version": "2.8.19", "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", @@ -1466,12 +5151,89 @@ "@types/node": "*" } }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true + }, + "node_modules/@types/express": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz", + "integrity": "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true + }, + "node_modules/@types/http-proxy": { + "version": "1.17.16", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", + "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/jasmine": { "version": "5.1.9", "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.9.tgz", "integrity": "sha512-8t4HtkW4wxiPVedMpeZ63n3vlWxEIquo/zc1Tm8ElU+SqVV7+D3Na2PWaJUp179AzTragMWVwkMv7mvty0NfyQ==", "dev": true }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true + }, "node_modules/@types/node": { "version": "24.3.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz", @@ -1481,6 +5243,251 @@ "undici-types": "~7.10.0" } }, + "node_modules/@types/node-forge": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.14.tgz", + "integrity": "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true + }, + "node_modules/@types/retry": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.5", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", + "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.8", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz", + "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@vitejs/plugin-basic-ssl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.2.0.tgz", + "integrity": "sha512-mkQnxTkcldAzIsomk1UuLfAu9n+kpQ3JbHcpCp7d2Oo6ITtji8pHS3QToOWjhPFvNQSnhlkAjmGbhv2QvwO/7Q==", + "dev": true, + "engines": { + "node": ">=14.21.3" + }, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, "node_modules/@yarnpkg/lockfile": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", @@ -1518,6 +5525,45 @@ "node": ">= 0.6" } }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, "node_modules/agent-base": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", @@ -1560,6 +5606,27 @@ } } }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -1575,6 +5642,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, "node_modules/ansi-regex": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", @@ -1627,6 +5706,120 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "node_modules/autoprefixer": { + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/babel-loader": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", + "dev": true, + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", + "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.27.7", + "@babel/helper-define-polyfill-provider": "^0.6.5", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", + "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.3", + "core-js-compat": "^3.40.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", + "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -1662,6 +5855,40 @@ "node": "^4.5.0 || >= 5.9" } }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "node_modules/beasties": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.3.2.tgz", + "integrity": "sha512-p4AF8uYzm9Fwu8m/hSVTCPXrRBPmB34hQpHsec2KOaR9CZmgoU8IOv4Cvwq4hgz2p4hLMNbsdNl5XeA6XbAQwA==", + "dev": true, + "dependencies": { + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "htmlparser2": "^10.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.49", + "postcss-media-query-parser": "^0.2.3" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -1736,6 +5963,22 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/bonjour-service": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", + "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, "node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -1814,6 +6057,27 @@ "ieee754": "^1.1.13" } }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -1975,6 +6239,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001739", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001739.tgz", @@ -2041,6 +6314,15 @@ "node": ">=10" } }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, "node_modules/cli-cursor": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", @@ -2183,6 +6465,32 @@ "node": ">=0.8" } }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-deep/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -2207,6 +6515,81 @@ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, + "node_modules/commander": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "dev": true + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/compression/node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -2228,6 +6611,15 @@ "node": ">= 0.10.0" } }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, "node_modules/connect/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -2243,6 +6635,18 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/content-type": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", @@ -2267,6 +6671,79 @@ "node": ">= 0.6" } }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "node_modules/copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "dev": true, + "dependencies": { + "is-what": "^3.14.1" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz", + "integrity": "sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==", + "dev": true, + "dependencies": { + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.1", + "globby": "^14.0.0", + "normalize-path": "^3.0.0", + "schema-utils": "^4.2.0", + "serialize-javascript": "^6.0.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/core-js-compat": { + "version": "3.45.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.1.tgz", + "integrity": "sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==", + "dev": true, + "dependencies": { + "browserslist": "^4.25.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, "node_modules/cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", @@ -2280,6 +6757,32 @@ "node": ">= 0.10" } }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -2309,6 +6812,81 @@ "node": ">= 8" } }, + "node_modules/css-loader": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", + "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", + "dev": true, + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.27.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/custom-event": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", @@ -2341,6 +6919,34 @@ } } }, + "node_modules/default-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "dev": true, + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/defaults": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", @@ -2353,6 +6959,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -2362,6 +6980,15 @@ "node": ">= 0.8" } }, + "node_modules/dependency-graph": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz", + "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -2372,12 +6999,40 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, "node_modules/di": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", "dev": true }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "dev": true, + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/dom-serialize": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", @@ -2390,6 +7045,61 @@ "void-elements": "^2.0.0" } }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dev": true, + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -2428,6 +7138,15 @@ "integrity": "sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==", "dev": true }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -2493,6 +7212,19 @@ } } }, + "node_modules/enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/ent": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.2.tgz", @@ -2508,6 +7240,18 @@ "node": ">= 0.4" } }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/env-paths": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", @@ -2535,6 +7279,28 @@ "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", "dev": true }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -2553,6 +7319,12 @@ "node": ">= 0.4" } }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true + }, "node_modules/es-object-atoms": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", @@ -2565,6 +7337,58 @@ "node": ">= 0.4" } }, + "node_modules/esbuild": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", + "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.4", + "@esbuild/android-arm": "0.25.4", + "@esbuild/android-arm64": "0.25.4", + "@esbuild/android-x64": "0.25.4", + "@esbuild/darwin-arm64": "0.25.4", + "@esbuild/darwin-x64": "0.25.4", + "@esbuild/freebsd-arm64": "0.25.4", + "@esbuild/freebsd-x64": "0.25.4", + "@esbuild/linux-arm": "0.25.4", + "@esbuild/linux-arm64": "0.25.4", + "@esbuild/linux-ia32": "0.25.4", + "@esbuild/linux-loong64": "0.25.4", + "@esbuild/linux-mips64el": "0.25.4", + "@esbuild/linux-ppc64": "0.25.4", + "@esbuild/linux-riscv64": "0.25.4", + "@esbuild/linux-s390x": "0.25.4", + "@esbuild/linux-x64": "0.25.4", + "@esbuild/netbsd-arm64": "0.25.4", + "@esbuild/netbsd-x64": "0.25.4", + "@esbuild/openbsd-arm64": "0.25.4", + "@esbuild/openbsd-x64": "0.25.4", + "@esbuild/sunos-x64": "0.25.4", + "@esbuild/win32-arm64": "0.25.4", + "@esbuild/win32-ia32": "0.25.4", + "@esbuild/win32-x64": "0.25.4" + } + }, + "node_modules/esbuild-wasm": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.25.4.tgz", + "integrity": "sha512-2HlCS6rNvKWaSKhWaG/YIyRsTsL3gUrMP2ToZMBIjw9LM7vVcIs+rz8kE2vExvTJgvM8OKPqNpcHawY/BQc/qQ==", + "dev": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -2580,18 +7404,200 @@ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "dev": true }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "dev": true }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, "node_modules/exponential-backoff": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==", "dev": true }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/express/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -2604,6 +7610,22 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, "node_modules/fast-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", @@ -2620,6 +7642,27 @@ } ] }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -2694,6 +7737,47 @@ "node": ">= 0.8" } }, + "node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "dev": true, + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, "node_modules/flatted": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", @@ -2736,6 +7820,37 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -2891,6 +8006,48 @@ "node": ">= 6" } }, + "node_modules/glob-to-regex.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.0.1.tgz", + "integrity": "sha512-CG/iEvgQqfzoVsMUbxSJcwbG2JwyZ3naEqPkeltwl0BSS8Bp83k3xlGms+0QdWFUAwV+uvo80wNswKF6FWEkKg==", + "dev": true, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/globby": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", + "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", + "dev": true, + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.3", + "path-type": "^6.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -2909,6 +8066,12 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -2975,18 +8138,97 @@ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, + "node_modules/htmlparser2": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", + "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.1", + "entities": "^6.0.0" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/http-cache-semantics": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", "dev": true }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -3012,6 +8254,12 @@ "node": ">= 0.8" } }, + "node_modules/http-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "dev": true + }, "node_modules/http-proxy": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", @@ -3039,6 +8287,23 @@ "node": ">= 14" } }, + "node_modules/http-proxy-middleware": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-3.0.5.tgz", + "integrity": "sha512-GLZZm1X38BPY4lkXA01jhwxvDoOkkXqjgVyUzVxiEK4iuRu03PZoYHhHRwxnfhQMDuaxi3vVri0YgSro/1oWqg==", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.15", + "debug": "^4.3.6", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.3", + "is-plain-object": "^5.0.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/https-proxy-agent": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", @@ -3052,6 +8317,15 @@ "node": ">= 14" } }, + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "dev": true, + "engines": { + "node": ">=10.18" + } + }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -3064,6 +8338,18 @@ "node": ">=0.10.0" } }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -3084,6 +8370,15 @@ } ] }, + "node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/ignore-walk": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-7.0.0.tgz", @@ -3120,6 +8415,41 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true, + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immutable": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.3.tgz", + "integrity": "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -3155,6 +8485,15 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/injection-js": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/injection-js/-/injection-js-2.5.0.tgz", + "integrity": "sha512-UpY2ONt4xbht4GhSqQ2zMJ1rBIQq4uOY+DlR6aOeYyqK7xadXt7UQbJIyxmgk288bPMkIZKjViieHm0O0i72Jw==", + "dev": true, + "dependencies": { + "tslib": "^2.0.0" + } + }, "node_modules/ip-address": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", @@ -3164,6 +8503,21 @@ "node": ">= 12" } }, + "node_modules/ipaddr.js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -3191,6 +8545,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -3224,6 +8593,24 @@ "node": ">=0.10.0" } }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", @@ -3233,6 +8620,18 @@ "node": ">=8" } }, + "node_modules/is-network-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz", + "integrity": "sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -3242,6 +8641,27 @@ "node": ">=0.12.0" } }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", @@ -3272,6 +8692,33 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true + }, + "node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dev": true, + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, "node_modules/isbinaryfile": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", @@ -3290,6 +8737,15 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", @@ -3395,12 +8851,62 @@ "integrity": "sha512-niVlkeYVRwKFpmfWg6suo6H9CrNnydfBLEqefM5UjibYS+UoTjZdmvPJSiuyrRLGnFj1eYRhFd/ch+5hSlsFVA==", "dev": true }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", @@ -3560,6 +9066,15 @@ "integrity": "sha512-VYz/BjjmC3klLJlLwA4Kw8ytk0zDSmbbDLNs794VnWmkcCB7I9aAL/D48VNQtmITyPvea2C3jdUMfc3kAoy0PQ==", "dev": true }, + "node_modules/karma-source-map-support": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", + "dev": true, + "dependencies": { + "source-map-support": "^0.5.5" + } + }, "node_modules/karma/node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -3722,6 +9237,147 @@ "node": ">=10" } }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/launch-editor": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.11.1.tgz", + "integrity": "sha512-SEET7oNfgSaB6Ym0jufAdCeo3meJVeCaaDyzRygy0xsp2BFKCprcfHljTq4QkzTLUxEKkFK6OK4811YM2oSrRg==", + "dev": true, + "dependencies": { + "picocolors": "^1.1.1", + "shell-quote": "^1.8.3" + } + }, + "node_modules/less": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/less/-/less-4.2.2.tgz", + "integrity": "sha512-tkuLHQlvWUTeQ3doAqnHbNn8T6WX1KA8yvbKG9x4VtKtIjHsVKQZCH11zRgAfbDAXC2UNIg/K9BYAAcEzUIrNg==", + "dev": true, + "dependencies": { + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "source-map": "~0.6.0" + } + }, + "node_modules/less-loader": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-12.2.0.tgz", + "integrity": "sha512-MYUxjSQSBUQmowc0l5nPieOYwMzGPUaTzB6inNW/bdPEG9zOL3eAAD1Qw5ZxSPk7we5dMojHwNODYMV1hq4EVg==", + "dev": true, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "less": "^3.5.0 || ^4.0.0", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/less/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/less/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "optional": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/less/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/less/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/license-webpack-plugin": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", + "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", + "dev": true, + "dependencies": { + "webpack-sources": "^3.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-sources": { + "optional": true + } + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, "node_modules/listr2": { "version": "8.2.5", "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.5.tgz", @@ -3774,12 +9430,77 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/lmdb": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.2.6.tgz", + "integrity": "sha512-SuHqzPl7mYStna8WRotY8XX/EUZBjjv3QyKIByeCLFfC9uXT/OIHByEcA07PzbMfQAM0KYJtLgtpMRlIe5dErQ==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "dependencies": { + "msgpackr": "^1.11.2", + "node-addon-api": "^6.1.0", + "node-gyp-build-optional-packages": "5.2.2", + "ordered-binary": "^1.5.3", + "weak-lru-cache": "^1.2.2" + }, + "bin": { + "download-lmdb-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@lmdb/lmdb-darwin-arm64": "3.2.6", + "@lmdb/lmdb-darwin-x64": "3.2.6", + "@lmdb/lmdb-linux-arm": "3.2.6", + "@lmdb/lmdb-linux-arm64": "3.2.6", + "@lmdb/lmdb-linux-x64": "3.2.6", + "@lmdb/lmdb-win32-x64": "3.2.6" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", + "dev": true, + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -3979,6 +9700,85 @@ "node": ">= 0.6" } }, + "node_modules/memfs": { + "version": "4.38.2", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.38.2.tgz", + "integrity": "sha512-FpWsVHpAkoSh/LfY1BgAl72BVd374ooMRtDi2VqzBycX4XEfvC0XKACCe0C9VRZoYq5viuoyTv6lYXZ/Q7TrLQ==", + "dev": true, + "dependencies": { + "@jsonjoy.com/json-pack": "^1.11.0", + "@jsonjoy.com/util": "^1.9.0", + "glob-to-regex.js": "^1.0.1", + "thingies": "^2.5.0", + "tree-dump": "^1.0.3", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">= 4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/mime": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", @@ -4033,6 +9833,32 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/mini-css-extract-plugin": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", + "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==", + "dev": true, + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -4206,12 +10032,66 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, + "node_modules/msgpackr": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.5.tgz", + "integrity": "sha512-UjkUHN0yqp9RWKy0Lplhh+wlpdt9oQBYgULZOiFhV3VclSF1JnSQWZ5r9gORQlNYaUKQoR8itv7g7z1xDDuACA==", + "dev": true, + "optional": true, + "optionalDependencies": { + "msgpackr-extract": "^3.0.2" + } + }, + "node_modules/msgpackr-extract": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", + "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "dependencies": { + "node-gyp-build-optional-packages": "5.2.2" + }, + "bin": { + "download-msgpackr-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" + } + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, "node_modules/mute-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", @@ -4221,6 +10101,41 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/needle": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", + "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", + "dev": true, + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, "node_modules/negotiator": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", @@ -4230,6 +10145,196 @@ "node": ">= 0.6" } }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/ng-packagr": { + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-19.2.2.tgz", + "integrity": "sha512-dFuwFsDJMBSd1YtmLLcX5bNNUCQUlRqgf34aXA+79PmkOP+0eF8GP2949wq3+jMjmFTNm80Oo8IUYiSLwklKCQ==", + "dev": true, + "dependencies": { + "@rollup/plugin-json": "^6.1.0", + "@rollup/wasm-node": "^4.24.0", + "ajv": "^8.17.1", + "ansi-colors": "^4.1.3", + "browserslist": "^4.22.1", + "chokidar": "^4.0.1", + "commander": "^13.0.0", + "convert-source-map": "^2.0.0", + "dependency-graph": "^1.0.0", + "esbuild": "^0.25.0", + "fast-glob": "^3.3.2", + "find-cache-dir": "^3.3.2", + "injection-js": "^2.4.0", + "jsonc-parser": "^3.3.1", + "less": "^4.2.0", + "ora": "^5.1.0", + "piscina": "^4.7.0", + "postcss": "^8.4.47", + "rxjs": "^7.8.1", + "sass": "^1.81.0" + }, + "bin": { + "ng-packagr": "cli/main.js" + }, + "engines": { + "node": "^18.19.1 || >=20.11.1" + }, + "optionalDependencies": { + "rollup": "^4.24.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^19.0.0 || ^19.1.0-next.0 || ^19.2.0-next.0", + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "tslib": "^2.3.0", + "typescript": ">=5.5 <5.9" + }, + "peerDependenciesMeta": { + "tailwindcss": { + "optional": true + } + } + }, + "node_modules/ng-packagr/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/ng-packagr/node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/ng-packagr/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ng-packagr/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ng-packagr/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ng-packagr/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ng-packagr/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ng-packagr/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ng-packagr/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ng-packagr/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", + "dev": true, + "optional": true + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, "node_modules/node-gyp": { "version": "11.4.2", "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.4.2.tgz", @@ -4254,6 +10359,21 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/node-gyp-build-optional-packages": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", + "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", + "dev": true, + "optional": true, + "dependencies": { + "detect-libc": "^2.0.1" + }, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" + } + }, "node_modules/node-gyp/node_modules/chownr": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", @@ -4358,6 +10478,15 @@ "node": ">=0.10.0" } }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/npm-bundled": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-4.0.0.tgz", @@ -4452,6 +10581,18 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -4473,6 +10614,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -4485,6 +10632,15 @@ "node": ">= 0.8" } }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -4509,6 +10665,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/open": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", + "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", + "dev": true, + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ora": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", @@ -4599,6 +10773,43 @@ "node": ">=8" } }, + "node_modules/ordered-binary": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.6.0.tgz", + "integrity": "sha512-IQh2aMfMIDbPjI/8a3Edr+PiOpcsB7yo8NdW7aHWVaoR/pcDldunMvnnwbk/auPGqmKeAdxtZl7MHX/QmPwhvQ==", + "dev": true, + "optional": true + }, + "node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/p-map": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", @@ -4611,6 +10822,41 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-retry": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", + "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", + "dev": true, + "dependencies": { + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry/node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/package-json-from-dist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", @@ -4648,6 +10894,101 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-json/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dev": true, + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-html-rewriting-stream": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", + "integrity": "sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==", + "dev": true, + "dependencies": { + "entities": "^4.3.0", + "parse5": "^7.0.0", + "parse5-sax-parser": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-sax-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", + "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", + "dev": true, + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -4657,6 +10998,15 @@ "node": ">= 0.8" } }, + "node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -4703,6 +11053,24 @@ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "dev": true + }, + "node_modules/path-type": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", + "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -4721,6 +11089,183 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/piscina": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.8.0.tgz", + "integrity": "sha512-EZJb+ZxDrQf3dihsUL7p42pjNyrNIFJCrRHPMgxu/svsj+P3xS3fuEWp7k2+rfsavfl1N0G29b1HGs7J0m8rZA==", + "dev": true, + "optionalDependencies": { + "@napi-rs/nice": "^1.0.1" + } + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dev": true, + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/postcss": { + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz", + "integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-loader": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz", + "integrity": "sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==", + "dev": true, + "dependencies": { + "cosmiconfig": "^9.0.0", + "jiti": "^1.20.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", + "dev": true + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, "node_modules/proc-log": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", @@ -4730,6 +11275,12 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, "node_modules/promise-retry": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", @@ -4743,6 +11294,35 @@ "node": ">=10" } }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "optional": true + }, "node_modules/punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", @@ -4773,6 +11353,35 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -4842,6 +11451,83 @@ "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", "dev": true }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true + }, + "node_modules/regex-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.1.tgz", + "integrity": "sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ==", + "dev": true + }, + "node_modules/regexpu-core": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true + }, + "node_modules/regjsparser": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "dev": true, + "dependencies": { + "jsesc": "~3.0.2" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -4886,6 +11572,54 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-url-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", + "dev": true, + "dependencies": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.14", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/resolve-url-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/resolve-url-loader/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/restore-cursor": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", @@ -4911,6 +11645,16 @@ "node": ">= 4" } }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, "node_modules/rfdc": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", @@ -4933,6 +11677,85 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rollup": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.8.tgz", + "integrity": "sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.34.8", + "@rollup/rollup-android-arm64": "4.34.8", + "@rollup/rollup-darwin-arm64": "4.34.8", + "@rollup/rollup-darwin-x64": "4.34.8", + "@rollup/rollup-freebsd-arm64": "4.34.8", + "@rollup/rollup-freebsd-x64": "4.34.8", + "@rollup/rollup-linux-arm-gnueabihf": "4.34.8", + "@rollup/rollup-linux-arm-musleabihf": "4.34.8", + "@rollup/rollup-linux-arm64-gnu": "4.34.8", + "@rollup/rollup-linux-arm64-musl": "4.34.8", + "@rollup/rollup-linux-loongarch64-gnu": "4.34.8", + "@rollup/rollup-linux-powerpc64le-gnu": "4.34.8", + "@rollup/rollup-linux-riscv64-gnu": "4.34.8", + "@rollup/rollup-linux-s390x-gnu": "4.34.8", + "@rollup/rollup-linux-x64-gnu": "4.34.8", + "@rollup/rollup-linux-x64-musl": "4.34.8", + "@rollup/rollup-win32-arm64-msvc": "4.34.8", + "@rollup/rollup-win32-ia32-msvc": "4.34.8", + "@rollup/rollup-win32-x64-msvc": "4.34.8", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup/node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true + }, + "node_modules/run-applescript": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", + "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/rxjs": { "version": "7.8.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", @@ -4984,6 +11807,128 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "node_modules/sass": { + "version": "1.85.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.85.0.tgz", + "integrity": "sha512-3ToiC1xZ1Y8aU7+CkgCI/tqyuPXEmYGJXO7H4uqp0xkLXUqp88rQQ4j1HmP37xSJLbCJPaIiv+cT1y+grssrww==", + "dev": true, + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/sass-loader": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.5.tgz", + "integrity": "sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw==", + "dev": true, + "dependencies": { + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "dev": true, + "optional": true + }, + "node_modules/schema-utils": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dev": true, + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/semver": { "version": "7.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", @@ -4996,12 +11941,186 @@ "node": ">=10" } }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "dev": true, + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-static/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -5023,6 +12142,18 @@ "node": ">=8" } }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", @@ -5124,6 +12255,18 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/slice-ansi": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", @@ -5254,6 +12397,17 @@ } } }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, "node_modules/socks": { "version": "2.8.7", "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", @@ -5291,6 +12445,54 @@ "node": ">= 8" } }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-5.0.0.tgz", + "integrity": "sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA==", + "dev": true, + "dependencies": { + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.72.1" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", @@ -5323,6 +12525,36 @@ "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", "dev": true }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, "node_modules/ssri": { "version": "12.0.0", "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz", @@ -5505,6 +12737,19 @@ "node": ">=0.10" } }, + "node_modules/tapable": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.3.tgz", + "integrity": "sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/tar": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", @@ -5598,6 +12843,86 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, + "node_modules/terser": { + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", + "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/thingies": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.5.0.tgz", + "integrity": "sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==", + "dev": true, + "engines": { + "node": ">=10.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "^2" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, "node_modules/tinyglobby": { "version": "0.2.14", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", @@ -5644,6 +12969,31 @@ "node": ">=0.6" } }, + "node_modules/tree-dump": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.3.tgz", + "integrity": "sha512-il+Cv80yVHFBwokQSfd4bldvr1Md951DpgAGfmhydt04L+YzHgubm2tQ7zueWDcGENKHq0ZvGFR/hjvNXilHEg==", + "dev": true, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -5688,6 +13038,12 @@ "node": ">= 0.6" } }, + "node_modules/typed-assert": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", + "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", + "dev": true + }, "node_modules/typescript": { "version": "5.7.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", @@ -5733,6 +13089,58 @@ "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", "dev": true }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/unique-filename": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz", @@ -5820,6 +13228,15 @@ "node": ">= 0.4.0" } }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -5848,6 +13265,403 @@ "node": ">= 0.8" } }, + "node_modules/vite": { + "version": "6.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", + "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", + "dev": true, + "peer": true, + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.50.0.tgz", + "integrity": "sha512-lVgpeQyy4fWN5QYebtW4buT/4kn4p4IJ+kDNB4uYNT5b8c8DLJDg6titg20NIg7E8RWwdWZORW6vUFfrLyG3KQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "peer": true + }, + "node_modules/vite/node_modules/@rollup/rollup-android-arm64": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.50.0.tgz", + "integrity": "sha512-2O73dR4Dc9bp+wSYhviP6sDziurB5/HCym7xILKifWdE9UsOe2FtNcM+I4xZjKrfLJnq5UR8k9riB87gauiQtw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "peer": true + }, + "node_modules/vite/node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.50.0.tgz", + "integrity": "sha512-vwSXQN8T4sKf1RHr1F0s98Pf8UPz7pS6P3LG9NSmuw0TVh7EmaE+5Ny7hJOZ0M2yuTctEsHHRTMi2wuHkdS6Hg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true + }, + "node_modules/vite/node_modules/@rollup/rollup-darwin-x64": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.50.0.tgz", + "integrity": "sha512-cQp/WG8HE7BCGyFVuzUg0FNmupxC+EPZEwWu2FCGGw5WDT1o2/YlENbm5e9SMvfDFR6FRhVCBePLqj0o8MN7Vw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true + }, + "node_modules/vite/node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.50.0.tgz", + "integrity": "sha512-UR1uTJFU/p801DvvBbtDD7z9mQL8J80xB0bR7DqW7UGQHRm/OaKzp4is7sQSdbt2pjjSS72eAtRh43hNduTnnQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "peer": true + }, + "node_modules/vite/node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.50.0.tgz", + "integrity": "sha512-G/DKyS6PK0dD0+VEzH/6n/hWDNPDZSMBmqsElWnCRGrYOb2jC0VSupp7UAHHQ4+QILwkxSMaYIbQ72dktp8pKA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "peer": true + }, + "node_modules/vite/node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.50.0.tgz", + "integrity": "sha512-u72Mzc6jyJwKjJbZZcIYmd9bumJu7KNmHYdue43vT1rXPm2rITwmPWF0mmPzLm9/vJWxIRbao/jrQmxTO0Sm9w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/vite/node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.50.0.tgz", + "integrity": "sha512-S4UefYdV0tnynDJV1mdkNawp0E5Qm2MtSs330IyHgaccOFrwqsvgigUD29uT+B/70PDY1eQ3t40+xf6wIvXJyg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/vite/node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.50.0.tgz", + "integrity": "sha512-1EhkSvUQXJsIhk4msxP5nNAUWoB4MFDHhtc4gAYvnqoHlaL9V3F37pNHabndawsfy/Tp7BPiy/aSa6XBYbaD1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/vite/node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.50.0.tgz", + "integrity": "sha512-EtBDIZuDtVg75xIPIK1l5vCXNNCIRM0OBPUG+tbApDuJAy9mKago6QxX+tfMzbCI6tXEhMuZuN1+CU8iDW+0UQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/vite/node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.50.0.tgz", + "integrity": "sha512-BGYSwJdMP0hT5CCmljuSNx7+k+0upweM2M4YGfFBjnFSZMHOLYR0gEEj/dxyYJ6Zc6AiSeaBY8dWOa11GF/ppQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/vite/node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.50.0.tgz", + "integrity": "sha512-bSbWlY3jZo7molh4tc5dKfeSxkqnf48UsLqYbUhnkdnfgZjgufLS/NTA8PcP/dnvct5CCdNkABJ56CbclMRYCA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/vite/node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.50.0.tgz", + "integrity": "sha512-CxRKyakfDrsLXiCyucVfVWVoaPA4oFSpPpDwlMcDFQvrv3XY6KEzMtMZrA+e/goC8xxp2WSOxHQubP8fPmmjOQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/vite/node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.50.0.tgz", + "integrity": "sha512-8PrJJA7/VU8ToHVEPu14FzuSAqVKyo5gg/J8xUerMbyNkWkO9j2ExBho/68RnJsMGNJq4zH114iAttgm7BZVkA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/vite/node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.50.0.tgz", + "integrity": "sha512-SkE6YQp+CzpyOrbw7Oc4MgXFvTw2UIBElvAvLCo230pyxOLmYwRPwZ/L5lBe/VW/qT1ZgND9wJfOsdy0XptRvw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/vite/node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.50.0.tgz", + "integrity": "sha512-q7cIIdFvWQoaCbLDUyUc8YfR3Jh2xx3unO8Dn6/TTogKjfwrax9SyfmGGK6cQhKtjePI7jRfd7iRYcxYs93esg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/vite/node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.50.0.tgz", + "integrity": "sha512-XzNOVg/YnDOmFdDKcxxK410PrcbcqZkBmz+0FicpW5jtjKQxcW1BZJEQOF0NJa6JO7CZhett8GEtRN/wYLYJuw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/vite/node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.50.0.tgz", + "integrity": "sha512-xMmiWRR8sp72Zqwjgtf3QbZfF1wdh8X2ABu3EaozvZcyHJeU0r+XAnXdKgs4cCAp6ORoYoCygipYP1mjmbjrsg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/vite/node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "peer": true, + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/vite/node_modules/rollup": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.50.0.tgz", + "integrity": "sha512-/Zl4D8zPifNmyGzJS+3kVoyXeDeT/GrsJM94sACNg9RtUE0hrHa1bNPtRSrfHTMH5HjRzce6K7rlTh3Khiw+pw==", + "dev": true, + "peer": true, + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.50.0", + "@rollup/rollup-android-arm64": "4.50.0", + "@rollup/rollup-darwin-arm64": "4.50.0", + "@rollup/rollup-darwin-x64": "4.50.0", + "@rollup/rollup-freebsd-arm64": "4.50.0", + "@rollup/rollup-freebsd-x64": "4.50.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.50.0", + "@rollup/rollup-linux-arm-musleabihf": "4.50.0", + "@rollup/rollup-linux-arm64-gnu": "4.50.0", + "@rollup/rollup-linux-arm64-musl": "4.50.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.50.0", + "@rollup/rollup-linux-ppc64-gnu": "4.50.0", + "@rollup/rollup-linux-riscv64-gnu": "4.50.0", + "@rollup/rollup-linux-riscv64-musl": "4.50.0", + "@rollup/rollup-linux-s390x-gnu": "4.50.0", + "@rollup/rollup-linux-x64-gnu": "4.50.0", + "@rollup/rollup-linux-x64-musl": "4.50.0", + "@rollup/rollup-openharmony-arm64": "4.50.0", + "@rollup/rollup-win32-arm64-msvc": "4.50.0", + "@rollup/rollup-win32-ia32-msvc": "4.50.0", + "@rollup/rollup-win32-x64-msvc": "4.50.0", + "fsevents": "~2.3.2" + } + }, "node_modules/void-elements": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", @@ -5857,6 +13671,28 @@ "node": ">=0.10.0" } }, + "node_modules/watchpack": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, "node_modules/wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", @@ -5866,6 +13702,311 @@ "defaults": "^1.0.3" } }, + "node_modules/weak-lru-cache": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", + "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", + "dev": true, + "optional": true + }, + "node_modules/webpack": { + "version": "5.98.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.98.0.tgz", + "integrity": "sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.1", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz", + "integrity": "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^4.6.0", + "mime-types": "^2.1.31", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.2.tgz", + "integrity": "sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.21", + "@types/express-serve-static-core": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "express": "^4.21.2", + "graceful-fs": "^4.2.6", + "http-proxy-middleware": "^2.0.9", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "schema-utils": "^4.2.0", + "selfsigned": "^2.4.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^7.4.2", + "ws": "^8.18.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/webpack-dev-server/node_modules/http-proxy-middleware": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/webpack-dev-server/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-merge": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-subresource-integrity": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", + "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", + "dev": true, + "dependencies": { + "typed-assert": "^1.0.8" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "html-webpack-plugin": ">= 5.0.0-beta.1 < 6", + "webpack": "^5.12.0" + }, + "peerDependenciesMeta": { + "html-webpack-plugin": { + "optional": true + } + } + }, + "node_modules/webpack/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -5878,6 +14019,12 @@ "which": "bin/which" } }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, "node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -6129,6 +14276,18 @@ "node": ">=8" } }, + "node_modules/yocto-queue": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", + "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/yoctocolors-cjs": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", diff --git a/package.json b/package.json index d2d9994..d8a95ac 100644 --- a/package.json +++ b/package.json @@ -17,11 +17,17 @@ "@angular/platform-browser": "^19.2.0", "@angular/platform-browser-dynamic": "^19.2.0", "@angular/router": "^19.2.0", + "@fortawesome/angular-fontawesome": "^1.0.0", + "@fortawesome/fontawesome-svg-core": "^7.0.0", + "@fortawesome/free-brands-svg-icons": "^7.0.0", + "@fortawesome/free-regular-svg-icons": "^7.0.0", + "@fortawesome/free-solid-svg-icons": "^7.0.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.15.0" }, "devDependencies": { + "@angular-devkit/build-angular": "^19.2.15", "@angular/cli": "^19.2.15", "@angular/compiler-cli": "^19.2.0", "@types/jasmine": "~5.1.0", @@ -31,6 +37,7 @@ "karma-coverage": "~2.2.0", "karma-jasmine": "~5.1.0", "karma-jasmine-html-reporter": "~2.1.0", + "ng-packagr": "^19.2.0", "typescript": "~5.7.2" } } diff --git a/projects/demo-ui-essentials/public/favicon.ico b/projects/demo-ui-essentials/public/favicon.ico new file mode 100644 index 0000000..57614f9 Binary files /dev/null and b/projects/demo-ui-essentials/public/favicon.ico differ diff --git a/projects/demo-ui-essentials/src/app/app.component.spec.ts b/projects/demo-ui-essentials/src/app/app.component.spec.ts new file mode 100644 index 0000000..475e4d1 --- /dev/null +++ b/projects/demo-ui-essentials/src/app/app.component.spec.ts @@ -0,0 +1,29 @@ +import { TestBed } from '@angular/core/testing'; +import { AppComponent } from './app.component'; + +describe('AppComponent', () => { + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [AppComponent], + }).compileComponents(); + }); + + it('should create the app', () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.componentInstance; + expect(app).toBeTruthy(); + }); + + it(`should have the 'demo-ui-essentials' title`, () => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.componentInstance; + expect(app.title).toEqual('demo-ui-essentials'); + }); + + it('should render title', () => { + const fixture = TestBed.createComponent(AppComponent); + fixture.detectChanges(); + const compiled = fixture.nativeElement as HTMLElement; + expect(compiled.querySelector('h1')?.textContent).toContain('Hello, demo-ui-essentials'); + }); +}); diff --git a/projects/demo-ui-essentials/src/app/app.component.ts b/projects/demo-ui-essentials/src/app/app.component.ts new file mode 100644 index 0000000..2dea9ad --- /dev/null +++ b/projects/demo-ui-essentials/src/app/app.component.ts @@ -0,0 +1,15 @@ +import { Component } from '@angular/core'; +import { RouterOutlet } from '@angular/router'; +import { ButtonComponent } from '../../../ui-essentials/src/public-api'; + +@Component({ + selector: 'app-root', + imports: [RouterOutlet, ButtonComponent], + template: ` + + + ` +}) +export class AppComponent { + title = 'demo-ui-essentials'; +} diff --git a/projects/demo-ui-essentials/src/app/app.config.ts b/projects/demo-ui-essentials/src/app/app.config.ts new file mode 100644 index 0000000..a1e7d6f --- /dev/null +++ b/projects/demo-ui-essentials/src/app/app.config.ts @@ -0,0 +1,8 @@ +import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core'; +import { provideRouter } from '@angular/router'; + +import { routes } from './app.routes'; + +export const appConfig: ApplicationConfig = { + providers: [provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(routes)] +}; diff --git a/projects/demo-ui-essentials/src/app/app.routes.ts b/projects/demo-ui-essentials/src/app/app.routes.ts new file mode 100644 index 0000000..dc39edb --- /dev/null +++ b/projects/demo-ui-essentials/src/app/app.routes.ts @@ -0,0 +1,3 @@ +import { Routes } from '@angular/router'; + +export const routes: Routes = []; diff --git a/projects/demo-ui-essentials/src/index.html b/projects/demo-ui-essentials/src/index.html new file mode 100644 index 0000000..ae4a8c6 --- /dev/null +++ b/projects/demo-ui-essentials/src/index.html @@ -0,0 +1,13 @@ + + + + + DemoUiEssentials + + + + + + + + diff --git a/projects/demo-ui-essentials/src/main.ts b/projects/demo-ui-essentials/src/main.ts new file mode 100644 index 0000000..35b00f3 --- /dev/null +++ b/projects/demo-ui-essentials/src/main.ts @@ -0,0 +1,6 @@ +import { bootstrapApplication } from '@angular/platform-browser'; +import { appConfig } from './app/app.config'; +import { AppComponent } from './app/app.component'; + +bootstrapApplication(AppComponent, appConfig) + .catch((err) => console.error(err)); diff --git a/projects/demo-ui-essentials/src/styles.scss b/projects/demo-ui-essentials/src/styles.scss new file mode 100644 index 0000000..90d4ee0 --- /dev/null +++ b/projects/demo-ui-essentials/src/styles.scss @@ -0,0 +1 @@ +/* You can add global styles to this file, and also import other style files */ diff --git a/projects/demo-ui-essentials/tsconfig.app.json b/projects/demo-ui-essentials/tsconfig.app.json new file mode 100644 index 0000000..e40712b --- /dev/null +++ b/projects/demo-ui-essentials/tsconfig.app.json @@ -0,0 +1,15 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/app", + "types": [] + }, + "files": [ + "src/main.ts" + ], + "include": [ + "src/**/*.d.ts" + ] +} diff --git a/projects/demo-ui-essentials/tsconfig.spec.json b/projects/demo-ui-essentials/tsconfig.spec.json new file mode 100644 index 0000000..0a43b83 --- /dev/null +++ b/projects/demo-ui-essentials/tsconfig.spec.json @@ -0,0 +1,15 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/spec", + "types": [ + "jasmine" + ] + }, + "include": [ + "src/**/*.spec.ts", + "src/**/*.d.ts" + ] +} diff --git a/projects/shared-ui/README.md b/projects/shared-ui/README.md new file mode 100644 index 0000000..1237b18 --- /dev/null +++ b/projects/shared-ui/README.md @@ -0,0 +1,63 @@ +# SharedUi + +This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 19.2.0. + +## Code scaffolding + +Angular CLI includes powerful code scaffolding tools. To generate a new component, run: + +```bash +ng generate component component-name +``` + +For a complete list of available schematics (such as `components`, `directives`, or `pipes`), run: + +```bash +ng generate --help +``` + +## Building + +To build the library, run: + +```bash +ng build shared-ui +``` + +This command will compile your project, and the build artifacts will be placed in the `dist/` directory. + +### Publishing the Library + +Once the project is built, you can publish your library by following these steps: + +1. Navigate to the `dist` directory: + ```bash + cd dist/shared-ui + ``` + +2. Run the `npm publish` command to publish your library to the npm registry: + ```bash + npm publish + ``` + +## Running unit tests + +To execute unit tests with the [Karma](https://karma-runner.github.io) test runner, use the following command: + +```bash +ng test +``` + +## Running end-to-end tests + +For end-to-end (e2e) testing, run: + +```bash +ng e2e +``` + +Angular CLI does not come with an end-to-end testing framework by default. You can choose one that suits your needs. + +## Additional Resources + +For more information on using the Angular CLI, including detailed command references, visit the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page. diff --git a/projects/shared-ui/ng-package.json b/projects/shared-ui/ng-package.json new file mode 100644 index 0000000..d4946c8 --- /dev/null +++ b/projects/shared-ui/ng-package.json @@ -0,0 +1,10 @@ +{ + "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", + "dest": "../../dist/shared-ui", + "lib": { + "entryFile": "src/public-api.ts" + }, + "assets": [ + "src/styles/**/*.scss" + ] +} \ No newline at end of file diff --git a/projects/shared-ui/package.json b/projects/shared-ui/package.json new file mode 100644 index 0000000..b3ddba4 --- /dev/null +++ b/projects/shared-ui/package.json @@ -0,0 +1,12 @@ +{ + "name": "shared-ui", + "version": "0.0.1", + "peerDependencies": { + "@angular/common": "^19.2.0", + "@angular/core": "^19.2.0" + }, + "dependencies": { + "tslib": "^2.3.0" + }, + "sideEffects": false +} diff --git a/projects/shared-ui/src/lib/font-awesome/font-awesome.config.ts b/projects/shared-ui/src/lib/font-awesome/font-awesome.config.ts new file mode 100644 index 0000000..a34cd10 --- /dev/null +++ b/projects/shared-ui/src/lib/font-awesome/font-awesome.config.ts @@ -0,0 +1,129 @@ +import { FaIconLibrary } from '@fortawesome/angular-fontawesome'; +import { + faUser, + faHome, + faCog, + faSearch, + faPlus, + faEdit, + faTrash, + faSave, + faCancel, + faCheck, + faTimes, + faArrowLeft, + faArrowRight, + faChevronLeft, + faChevronRight, + faChevronUp, + faChevronDown, + faBars, + faEllipsisV, + faEye, + faEyeSlash, + faDownload, + faUpload, + faRefresh, + faSpinner, + faExclamationTriangle, + faInfoCircle, + faCheckCircle, + faTimesCircle, + faEnvelope, + faWindowMaximize, + faUserCircle, + faCertificate, + faHandPointer, + faIdCard, + faTags, + faCheckSquare, + faKeyboard, + faThLarge, + faList, + faDotCircle, + faToggleOn, + faTable, + faCirclePlus +} from '@fortawesome/free-solid-svg-icons'; +import { + faHeart, + faBookmark, + faComment, + faThumbsUp +} from '@fortawesome/free-regular-svg-icons'; +import { + faGithub, + faTwitter, + faLinkedin, + faGoogle +} from '@fortawesome/free-brands-svg-icons'; + +/** + * Configuration function to add commonly used Font Awesome icons to the library + * Call this function in your application's initialization to register icons + */ +export function configureFontAwesome(library: FaIconLibrary): void { + // Add solid icons + library.addIcons( + faUser, + faHome, + faCog, + faSearch, + faPlus, + faEdit, + faTrash, + faSave, + faCancel, + faCheck, + faTimes, + faArrowLeft, + faArrowRight, + faChevronLeft, + faChevronRight, + faChevronUp, + faChevronDown, + faBars, + faEllipsisV, + faEye, + faEyeSlash, + faDownload, + faUpload, + faRefresh, + faSpinner, + faExclamationTriangle, + faInfoCircle, + faCheckCircle, + faTimesCircle, + faEnvelope, + faWindowMaximize, + faUserCircle, + faCertificate, + faHandPointer, + faIdCard, + faTags, + faCheckSquare, + faKeyboard, + faThLarge, + faList, + faDotCircle, + faToggleOn, + faTable, + faCirclePlus + ); + + // Add regular icons + library.addIcons( + faHeart, + faBookmark, + faComment, + faThumbsUp + ); + + // Add brand icons + library.addIcons( + faGithub, + faTwitter, + faLinkedin, + faGoogle + ); +} \ No newline at end of file diff --git a/projects/shared-ui/src/lib/font-awesome/index.ts b/projects/shared-ui/src/lib/font-awesome/index.ts new file mode 100644 index 0000000..6dc3591 --- /dev/null +++ b/projects/shared-ui/src/lib/font-awesome/index.ts @@ -0,0 +1,50 @@ +// Font Awesome exports +export { FaIconComponent } from '@fortawesome/angular-fontawesome'; +export { configureFontAwesome } from './font-awesome.config'; + +// Re-export commonly used icon definitions +export { + faUser, + faHome, + faCog, + faSearch, + faPlus, + faEdit, + faTrash, + faSave, + faCancel, + faCheck, + faTimes, + faArrowLeft, + faArrowRight, + faChevronLeft, + faChevronRight, + faChevronUp, + faChevronDown, + faBars, + faEllipsisV, + faEye, + faEyeSlash, + faDownload, + faUpload, + faRefresh, + faSpinner, + faExclamationTriangle, + faInfoCircle, + faCheckCircle, + faTimesCircle +} from '@fortawesome/free-solid-svg-icons'; + +export { + faHeart, + faBookmark, + faComment, + faThumbsUp +} from '@fortawesome/free-regular-svg-icons'; + +export { + faGithub, + faTwitter, + faLinkedin, + faGoogle +} from '@fortawesome/free-brands-svg-icons'; \ No newline at end of file diff --git a/projects/shared-ui/src/lib/shared-ui.service.ts b/projects/shared-ui/src/lib/shared-ui.service.ts new file mode 100644 index 0000000..747077e --- /dev/null +++ b/projects/shared-ui/src/lib/shared-ui.service.ts @@ -0,0 +1,9 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ + providedIn: 'root' +}) +export class SharedUiService { + + constructor() { } +} \ No newline at end of file diff --git a/projects/shared-ui/src/public-api.ts b/projects/shared-ui/src/public-api.ts new file mode 100644 index 0000000..254587a --- /dev/null +++ b/projects/shared-ui/src/public-api.ts @@ -0,0 +1,22 @@ +/* + * Public API Surface of shared-ui + */ + +export * from './lib/shared-ui.service'; + +// Styles are available at: shared-ui/src/styles/ +// +// Usage examples: +// +// Import complete design system: +// @use 'shared-ui/src/styles' as ui; +// +// Import semantic tokens only: +// @use 'shared-ui/src/styles/semantic' as semantic; +// +// Import base tokens only: +// @use 'shared-ui/src/styles/base' as base; +// +// Import specific categories: +// @use 'shared-ui/src/styles/semantic/colors' as colors; +// @use 'shared-ui/src/styles/commons' as commons; \ No newline at end of file diff --git a/projects/shared-ui/src/styles/base/_ai.scss b/projects/shared-ui/src/styles/base/_ai.scss new file mode 100644 index 0000000..e111650 --- /dev/null +++ b/projects/shared-ui/src/styles/base/_ai.scss @@ -0,0 +1,272 @@ +// AI Enhancement Tokens +// Generated from base-tokens.json + +// AI State Classes +$base-ai-states-cognitive-thinking: 'ai-thinking'; +$base-ai-states-cognitive-analyzing: 'ai-analyzing'; +$base-ai-states-cognitive-processing: 'ai-processing'; +$base-ai-states-cognitive-deciding: 'ai-deciding'; +$base-ai-states-cognitive-learning: 'ai-learning'; +$base-ai-states-cognitive-validating: 'ai-validating'; + +$base-ai-states-activity-loading: 'ai-loading'; +$base-ai-states-activity-working: 'ai-working'; +$base-ai-states-activity-busy: 'ai-busy'; +$base-ai-states-activity-idle: 'ai-idle'; + +$base-ai-states-communication-listening: 'ai-listening'; +$base-ai-states-communication-speaking: 'ai-speaking'; +$base-ai-states-communication-waiting: 'ai-waiting'; +$base-ai-states-communication-responding: 'ai-responding'; + +$base-ai-states-status-complete: 'ai-complete'; +$base-ai-states-status-success: 'ai-success'; +$base-ai-states-status-error: 'ai-has-error'; +$base-ai-states-status-warning: 'ai-has-warning'; +$base-ai-states-status-paused: 'ai-is-paused'; +$base-ai-states-status-cancelled: 'ai-is-cancelled'; + +// AI Control Mode Classes +$base-ai-control-modes-cooperative: 'mode-cooperative'; +$base-ai-control-modes-ai-priority: 'mode-ai-priority'; +$base-ai-control-modes-ai-exclusive: 'mode-ai-exclusive'; +$base-ai-control-modes-human-override: 'mode-human-override'; + +$base-ai-control-locks-soft: 'ai-lock-soft'; +$base-ai-control-locks-hard: 'ai-lock-hard'; +$base-ai-control-locks-visual-only: 'ai-lock-visual-only'; + +// AI Enhancement Colors +$base-ai-glow-subtle-color: #8b5cf6; +$base-ai-glow-subtle-blur: 8px; +$base-ai-glow-subtle-spread: 2px; +$base-ai-glow-subtle-opacity: 0.2; + +$base-ai-glow-standard-color: #8b5cf6; +$base-ai-glow-standard-blur: 16px; +$base-ai-glow-standard-spread: 4px; +$base-ai-glow-standard-opacity: 0.3; + +$base-ai-glow-strong-color: #8b5cf6; +$base-ai-glow-strong-blur: 24px; +$base-ai-glow-strong-spread: 6px; +$base-ai-glow-strong-opacity: 0.4; + +// AI Gradient Colors +$base-ai-gradient-colors: (#8b5cf6, #06b6d4, #f59e0b); +$base-ai-gradient-blur: 20px; +$base-ai-gradient-spread: 4px; +$base-ai-gradient-opacity: 0.35; + +// AI Status Colors +$base-ai-status-thinking-color: #8b5cf6; +$base-ai-status-thinking-background: var(--color-gray-100); +$base-ai-status-thinking-indicator: #8b5cf6; +$base-ai-status-thinking-animation: pulse 2s ease-in-out infinite; + +$base-ai-status-ready-color: var(--color-success); +$base-ai-status-ready-background: #f0fdf4; +$base-ai-status-ready-indicator: var(--color-success); +$base-ai-status-ready-animation: none; + +$base-ai-status-processing-color: #06b6d4; +$base-ai-status-processing-background: #f0f9ff; +$base-ai-status-processing-indicator: #06b6d4; +$base-ai-status-processing-animation: spin 1s linear infinite; + +$base-ai-status-error-color: var(--color-danger); +$base-ai-status-error-background: #fef2f2; +$base-ai-status-error-indicator: var(--color-danger); +$base-ai-status-error-animation: none; + +$base-ai-status-offline-color: var(--color-gray-500); +$base-ai-status-offline-background: var(--color-gray-50); +$base-ai-status-offline-indicator: var(--color-gray-500); +$base-ai-status-offline-animation: none; + +// AI Confidence Levels +$base-ai-confidence-low-color: #f59e0b; +$base-ai-confidence-low-background: #fef3c7; +$base-ai-confidence-low-border: #f59e0b; +$base-ai-confidence-low-glow: 0 0 8px rgba(245, 158, 11, 0.2); + +$base-ai-confidence-medium-color: #06b6d4; +$base-ai-confidence-medium-background: #cffafe; +$base-ai-confidence-medium-border: #06b6d4; +$base-ai-confidence-medium-glow: 0 0 12px rgba(6, 182, 212, 0.3); + +$base-ai-confidence-high-color: var(--color-success); +$base-ai-confidence-high-background: #d1fae5; +$base-ai-confidence-high-border: var(--color-success); +$base-ai-confidence-high-glow: 0 0 16px rgba(16, 185, 129, 0.4); + +// AI Pulse Animations +$base-ai-pulse-thinking-duration: 2s; +$base-ai-pulse-thinking-easing: ease-in-out; +$base-ai-pulse-thinking-scale-from: 1; +$base-ai-pulse-thinking-scale-to: 1.02; +$base-ai-pulse-thinking-opacity-from: 0.8; +$base-ai-pulse-thinking-opacity-to: 1; +$base-ai-pulse-thinking-iteration: infinite; + +$base-ai-pulse-processing-duration: 1.5s; +$base-ai-pulse-processing-easing: ease-in-out; +$base-ai-pulse-processing-scale-from: 1; +$base-ai-pulse-processing-scale-to: 1.05; +$base-ai-pulse-processing-opacity-from: 0.7; +$base-ai-pulse-processing-opacity-to: 1; +$base-ai-pulse-processing-iteration: infinite; + +$base-ai-pulse-heartbeat-duration: 1s; +$base-ai-pulse-heartbeat-easing: ease-in-out; +$base-ai-pulse-heartbeat-scale-from: 1; +$base-ai-pulse-heartbeat-scale-to: 1.1; +$base-ai-pulse-heartbeat-opacity-from: 0.9; +$base-ai-pulse-heartbeat-opacity-to: 1; +$base-ai-pulse-heartbeat-iteration: infinite; + +// AI Feedback Colors +$base-ai-feedback-success-color: var(--color-success); +$base-ai-feedback-success-background: #d1fae5; +$base-ai-feedback-success-border: var(--color-success); +$base-ai-feedback-success-duration: 300ms; +$base-ai-feedback-success-easing: ease-out; + +$base-ai-feedback-warning-color: #f59e0b; +$base-ai-feedback-warning-background: #fef3c7; +$base-ai-feedback-warning-border: #f59e0b; +$base-ai-feedback-warning-duration: 300ms; +$base-ai-feedback-warning-easing: ease-out; + +$base-ai-feedback-error-color: var(--color-danger); +$base-ai-feedback-error-background: #fee2e2; +$base-ai-feedback-error-border: var(--color-danger); +$base-ai-feedback-error-duration: 300ms; +$base-ai-feedback-error-easing: ease-out; + +$base-ai-feedback-info-color: var(--color-primary); +$base-ai-feedback-info-background: #dbeafe; +$base-ai-feedback-info-border: var(--color-primary); +$base-ai-feedback-info-duration: 300ms; +$base-ai-feedback-info-easing: ease-out; + +// AI Gradients +$base-ai-gradient-primary: linear-gradient(135deg, #8b5cf6 0%, #7c3aed 100%); +$base-ai-gradient-secondary: linear-gradient(135deg, #06b6d4 0%, #0891b2 100%); +$base-ai-gradient-tertiary: linear-gradient(135deg, #f59e0b 0%, #d97706 100%); +$base-ai-gradient-thinking: linear-gradient(135deg, #8b5cf6 0%, #a855f7 50%, #8b5cf6 100%); +$base-ai-gradient-processing: linear-gradient(135deg, #06b6d4 0%, #0ea5e9 50%, #06b6d4 100%); +$base-ai-gradient-success: linear-gradient(135deg, var(--color-success) 0%, #059669 100%); +$base-ai-gradient-warning: linear-gradient(135deg, #f59e0b 0%, #d97706 100%); +$base-ai-gradient-error: linear-gradient(135deg, var(--color-danger) 0%, #dc2626 100%); + +// AI Border Animations +$base-ai-border-flowing-width: 2px; +$base-ai-border-flowing-style: solid; +$base-ai-border-flowing-colors: (#8b5cf6, #06b6d4, #f59e0b); +$base-ai-border-flowing-animation-duration: 3s; +$base-ai-border-flowing-animation-timing: linear; + +$base-ai-border-static-width: 1px; +$base-ai-border-static-style: solid; +$base-ai-border-static-color: #8b5cf6; + +$base-ai-border-processing-width: 2px; +$base-ai-border-processing-style: dashed; +$base-ai-border-processing-colors: (#06b6d4, #0ea5e9); +$base-ai-border-processing-animation-duration: 1.5s; +$base-ai-border-processing-animation-timing: ease-in-out; + +// AI Animation Properties +$base-ai-animation-glow-duration: 2s; +$base-ai-animation-glow-easing: ease-in-out; +$base-ai-animation-glow-iterations: infinite; + +$base-ai-animation-pulse-duration: 1.5s; +$base-ai-animation-pulse-easing: ease-in-out; +$base-ai-animation-pulse-iterations: infinite; + +// AI Timing Values +$base-ai-timing-selection: 150ms; +$base-ai-timing-press: 100ms; +$base-ai-timing-interaction: 200ms; + +// AI State Maps +$base-ai-states: ( + thinking: $base-ai-states-cognitive-thinking, + analyzing: $base-ai-states-cognitive-analyzing, + processing: $base-ai-states-cognitive-processing, + deciding: $base-ai-states-cognitive-deciding, + learning: $base-ai-states-cognitive-learning, + validating: $base-ai-states-cognitive-validating, + loading: $base-ai-states-activity-loading, + working: $base-ai-states-activity-working, + busy: $base-ai-states-activity-busy, + idle: $base-ai-states-activity-idle, + listening: $base-ai-states-communication-listening, + speaking: $base-ai-states-communication-speaking, + waiting: $base-ai-states-communication-waiting, + responding: $base-ai-states-communication-responding, + complete: $base-ai-states-status-complete, + success: $base-ai-states-status-success, + error: $base-ai-states-status-error, + warning: $base-ai-states-status-warning, + paused: $base-ai-states-status-paused, + cancelled: $base-ai-states-status-cancelled, +); + +// AI Glow Levels Map +$base-ai-glow-levels: ( + subtle: ( + color: $base-ai-glow-subtle-color, + blur: $base-ai-glow-subtle-blur, + spread: $base-ai-glow-subtle-spread, + opacity: $base-ai-glow-subtle-opacity, + ), + standard: ( + color: $base-ai-glow-standard-color, + blur: $base-ai-glow-standard-blur, + spread: $base-ai-glow-standard-spread, + opacity: $base-ai-glow-standard-opacity, + ), + strong: ( + color: $base-ai-glow-strong-color, + blur: $base-ai-glow-strong-blur, + spread: $base-ai-glow-strong-spread, + opacity: $base-ai-glow-strong-opacity, + ), +); + +// AI Status Map +$base-ai-status-map: ( + thinking: ( + color: $base-ai-status-thinking-color, + background: $base-ai-status-thinking-background, + indicator: $base-ai-status-thinking-indicator, + animation: $base-ai-status-thinking-animation, + ), + ready: ( + color: $base-ai-status-ready-color, + background: $base-ai-status-ready-background, + indicator: $base-ai-status-ready-indicator, + animation: $base-ai-status-ready-animation, + ), + processing: ( + color: $base-ai-status-processing-color, + background: $base-ai-status-processing-background, + indicator: $base-ai-status-processing-indicator, + animation: $base-ai-status-processing-animation, + ), + error: ( + color: $base-ai-status-error-color, + background: $base-ai-status-error-background, + indicator: $base-ai-status-error-indicator, + animation: $base-ai-status-error-animation, + ), + offline: ( + color: $base-ai-status-offline-color, + background: $base-ai-status-offline-background, + indicator: $base-ai-status-offline-indicator, + animation: $base-ai-status-offline-animation, + ), +); \ No newline at end of file diff --git a/projects/shared-ui/src/styles/base/_borders.scss b/projects/shared-ui/src/styles/base/_borders.scss new file mode 100644 index 0000000..182ebcb --- /dev/null +++ b/projects/shared-ui/src/styles/base/_borders.scss @@ -0,0 +1,76 @@ +// Border Tokens +// Generated from base-tokens.json + +// Border Widths +$base-border-width-0: 0px; +$base-border-width-1: 1px; +$base-border-width-2: 2px; +$base-border-width-3: 3px; +$base-border-width-4: 4px; +$base-border-width-5: 5px; +$base-border-width-6: 6px; +$base-border-width-7: 7px; +$base-border-width-8: 8px; +$base-border-width-10: 10px; +$base-border-width-hairline: 0.5px; + +// Border Radius +$base-border-radius-none: 0px; +$base-border-radius-xs: 0.125rem; +$base-border-radius-sm: 0.25rem; +$base-border-radius-md: 0.375rem; +$base-border-radius-lg: 0.5rem; +$base-border-radius-xl: 0.75rem; +$base-border-radius-2xl: 1rem; +$base-border-radius-3xl: 1.5rem; +$base-border-radius-4xl: 2rem; +$base-border-radius-5xl: 2.5rem; +$base-border-radius-full: 9999px; +$base-border-radius-pill: 50rem; + +// Border Styles +$base-border-style-none: none; +$base-border-style-solid: solid; +$base-border-style-dashed: dashed; +$base-border-style-dotted: dotted; +$base-border-style-double: double; + +// Border Width Map +$base-border-widths: ( + 0: $base-border-width-0, + 1: $base-border-width-1, + 2: $base-border-width-2, + 3: $base-border-width-3, + 4: $base-border-width-4, + 5: $base-border-width-5, + 6: $base-border-width-6, + 7: $base-border-width-7, + 8: $base-border-width-8, + 10: $base-border-width-10, + hairline: $base-border-width-hairline, +); + +// Border Radius Map +$base-border-radiuses: ( + none: $base-border-radius-none, + xs: $base-border-radius-xs, + sm: $base-border-radius-sm, + md: $base-border-radius-md, + lg: $base-border-radius-lg, + xl: $base-border-radius-xl, + 2xl: $base-border-radius-2xl, + 3xl: $base-border-radius-3xl, + 4xl: $base-border-radius-4xl, + 5xl: $base-border-radius-5xl, + full: $base-border-radius-full, + pill: $base-border-radius-pill, +); + +// Border Style Map +$base-border-styles: ( + none: $base-border-style-none, + solid: $base-border-style-solid, + dashed: $base-border-style-dashed, + dotted: $base-border-style-dotted, + double: $base-border-style-double, +); \ No newline at end of file diff --git a/projects/shared-ui/src/styles/base/_breakpoints.scss b/projects/shared-ui/src/styles/base/_breakpoints.scss new file mode 100644 index 0000000..491dc02 --- /dev/null +++ b/projects/shared-ui/src/styles/base/_breakpoints.scss @@ -0,0 +1,20 @@ +// Breakpoint Tokens +// Generated from base-tokens.json + +// Breakpoint Values +$base-breakpoint-xs: 475px; +$base-breakpoint-sm: 640px; +$base-breakpoint-md: 768px; +$base-breakpoint-lg: 1024px; +$base-breakpoint-xl: 1280px; +$base-breakpoint-2xl: 1536px; + +// Breakpoint Map +$base-breakpoints: ( + xs: $base-breakpoint-xs, + sm: $base-breakpoint-sm, + md: $base-breakpoint-md, + lg: $base-breakpoint-lg, + xl: $base-breakpoint-xl, + 2xl: $base-breakpoint-2xl, +); \ No newline at end of file diff --git a/projects/shared-ui/src/styles/base/_colors.scss b/projects/shared-ui/src/styles/base/_colors.scss new file mode 100644 index 0000000..3899fc0 --- /dev/null +++ b/projects/shared-ui/src/styles/base/_colors.scss @@ -0,0 +1,72 @@ +// ========================================================================== +// COLOR TOKENS +// ========================================================================== +// Tonal color system using HCL for tones +// Material Design 3 inspired color tokens with $base prefix +// ========================================================================== + +// KEY COLORS (Material M3 HCL Seed Colors) +$base-color-primary-key: hsl(258, 100%, 47%) !default; // Dynamic Color - Primary +$base-color-secondary-key: hsl(258, 29%, 16%) !default; // Dynamic Color - Secondary +$base-color-tertiary-key: hsl(295, 26%, 25%) !default; // Dynamic Color - Tertiary +$base-color-quaternary-key: hsl(76, 29%, 16%) !default; // Dynamic Color - Quaternary +$base-color-neutral-key: hsl(279, 14%, 11%) !default; // Dynamic Color - Neutral +$base-color-error-key: hsl(25, 84%, 44%) !default; // Dynamic Color - Error +$base-color-neutral-variant-key: hsl(287, 12%, 15%) !default; // Dynamic Color - Neutral Variant + +// PRIMARY COLORS (HCL Tonal Palette) +$base-color-primary: hsl(258, 100%, 47%) !default; // Tone 40 +$base-color-on-primary: hsl(0, 0%, 100%) !default; // Tone 100 +$base-color-primary-container: hsl(263, 100%, 88%) !default; // Tone 90 +$base-color-on-primary-container: hsl(260, 100%, 13%) !default; // Tone 10 +$base-color-inverse-primary: hsl(263, 100%, 78%) !default; // Tone 80 + +// SECONDARY COLORS (HCL Tonal Palette) +$base-color-secondary: hsl(258, 29%, 40%) !default; // Tone 40 +$base-color-on-secondary: hsl(0, 0%, 100%) !default; // Tone 100 +$base-color-secondary-container: hsl(262, 25%, 84%) !default; // Tone 90 +$base-color-on-secondary-container: hsl(256, 29%, 11%) !default; // Tone 10 + +// TERTIARY COLORS (HCL Tonal Palette) +$base-color-tertiary: hsl(295, 26%, 40%) !default; // Tone 40 +$base-color-on-tertiary: hsl(0, 0%, 100%) !default; // Tone 100 +$base-color-tertiary-container: hsl(307, 24%, 84%) !default; // Tone 90 +$base-color-on-tertiary-container: hsl(290, 26%, 11%) !default; // Tone 10 + +// NEUTRAL COLORS (HCL Tonal Palette) +$base-color-neutral: hsl(279, 14%, 22%) !default; // Tone 25 +$base-color-neutral-variant: hsl(287, 12%, 25%) !default; // Tone 30 + +// SURFACE COLORS (Light Theme - HCL Tonal System) +$base-color-surface: hsl(286, 20%, 99%) !default; // Tone 99 +$base-color-surface-bright: hsl(286, 20%, 99%) !default; // Tone 99 +$base-color-surface-dim: hsl(285, 9%, 87%) !default; // Tone 87 +$base-color-on-surface: hsl(279, 14%, 11%) !default; // Tone 10 +$base-color-surface-lowest: hsl(0, 0%, 100%) !default; // Tone 100 +$base-color-surface-low: hsl(289, 14%, 96%) !default; // Tone 96 +$base-color-surface-container: hsl(287, 8%, 94%) !default; // Tone 94 +$base-color-surface-high: hsl(286, 6%, 92%) !default; // Tone 92 +$base-color-surface-highest: hsl(284, 7%, 90%) !default; // Tone 90 +$base-color-surface-variant: hsl(289, 14%, 90%) !default; // Tone 90 +$base-color-on-surface-variant: hsl(287, 12%, 47%) !default; // Tone 50 +$base-color-inverse-surface: hsl(279, 14%, 20%) !default; // Tone 20 +$base-color-inverse-on-surface: hsl(285, 15%, 95%) !default; // Tone 95 + +// BACKGROUND COLORS (Light Theme) +$base-color-background: hsl(286, 20%, 99%) !default; // Tone 99 +$base-color-on-background: hsl(279, 14%, 11%) !default; // Tone 10 + +// ERROR COLORS (HCL Tonal Palette) +$base-color-error: hsl(25, 84%, 44%) !default; // Tone 40 +$base-color-on-error: hsl(0, 0%, 100%) !default; // Tone 100 +$base-color-error-container: hsl(25, 100%, 92%) !default; // Tone 90 +$base-color-on-error-container: hsl(25, 100%, 11%) !default; // Tone 10 + +// OUTLINE COLORS (HCL Tonal System) +$base-color-outline: hsl(287, 12%, 59%) !default; // Tone 50 +$base-color-outline-variant: hsl(289, 14%, 80%) !default; // Tone 80 + +// UTILITY COLORS (Material M3 Standards) +$base-color-shadow: hsl(0, 0%, 0%) !default; // Pure black shadow +$base-color-surface-tint: hsl(258, 100%, 47%) !default; // Primary color for tint +$base-color-scrim: hsl(0, 0%, 0%) !default; // Pure black scrim \ No newline at end of file diff --git a/projects/shared-ui/src/styles/base/_css-variables.scss b/projects/shared-ui/src/styles/base/_css-variables.scss new file mode 100644 index 0000000..8af9751 --- /dev/null +++ b/projects/shared-ui/src/styles/base/_css-variables.scss @@ -0,0 +1,220 @@ +// ========================================================================== +// CSS CUSTOM PROPERTIES MAPPING +// ========================================================================== +// Maps SCSS design tokens to CSS custom properties for runtime theming +// These variables can be dynamically updated via JavaScript +// ========================================================================== +@use 'colors' as colors; +@use 'glass' as glass; + +:root { + // ========================================================================== + // PRIMARY COLORS - Material Design 3 Tonal Palette + // ========================================================================== + --color-primary-key: #{colors.$base-color-primary-key}; + --color-primary: #{colors.$base-color-primary}; + --color-on-primary: #{colors.$base-color-on-primary}; + --color-primary-container: #{colors.$base-color-primary-container}; + --color-on-primary-container: #{colors.$base-color-on-primary-container}; + --color-inverse-primary: #{colors.$base-color-inverse-primary}; + + // ========================================================================== + // SECONDARY COLORS - Material Design 3 Tonal Palette + // ========================================================================== + --color-secondary-key: #{colors.$base-color-secondary-key}; + --color-secondary: #{colors.$base-color-secondary}; + --color-on-secondary: #{colors.$base-color-on-secondary}; + --color-secondary-container: #{colors.$base-color-secondary-container}; + --color-on-secondary-container: #{colors.$base-color-on-secondary-container}; + + // ========================================================================== + // TERTIARY COLORS - Material Design 3 Tonal Palette + // ========================================================================== + --color-tertiary-key: #{colors.$base-color-tertiary-key}; + --color-tertiary: #{colors.$base-color-tertiary}; + --color-on-tertiary: #{colors.$base-color-on-tertiary}; + --color-tertiary-container: #{colors.$base-color-tertiary-container}; + --color-on-tertiary-container: #{colors.$base-color-on-tertiary-container}; + + // ========================================================================== + // QUATERNARY COLORS - Extended Material Design 3 + // ========================================================================== + --color-quaternary-key: #{colors.$base-color-quaternary-key}; + + // ========================================================================== + // ERROR COLORS - Material Design 3 Error System + // ========================================================================== + --color-error-key: #{colors.$base-color-error-key}; + --color-error: #{colors.$base-color-error}; + --color-on-error: #{colors.$base-color-on-error}; + --color-error-container: #{colors.$base-color-error-container}; + --color-on-error-container: #{colors.$base-color-on-error-container}; + + // ========================================================================== + // NEUTRAL COLORS - Material Design 3 Neutral System + // ========================================================================== + --color-neutral-key: #{colors.$base-color-neutral-key}; + --color-neutral: #{colors.$base-color-neutral}; + --color-neutral-variant-key: #{colors.$base-color-neutral-variant-key}; + --color-neutral-variant: #{colors.$base-color-neutral-variant}; + + // ========================================================================== + // SURFACE COLORS - Material Design 3 Surface System + // ========================================================================== + --color-surface: #{colors.$base-color-surface}; + --color-surface-bright: #{colors.$base-color-surface-bright}; + --color-surface-dim: #{colors.$base-color-surface-dim}; + --color-on-surface: #{colors.$base-color-on-surface}; + --color-surface-lowest: #{colors.$base-color-surface-lowest}; + --color-surface-low: #{colors.$base-color-surface-low}; + --color-surface-container: #{colors.$base-color-surface-container}; + --color-surface-high: #{colors.$base-color-surface-high}; + --color-surface-highest: #{colors.$base-color-surface-highest}; + --color-surface-variant: #{colors.$base-color-surface-variant}; + --color-on-surface-variant: #{colors.$base-color-on-surface-variant}; + --color-inverse-surface: #{colors.$base-color-inverse-surface}; + --color-inverse-on-surface: #{colors.$base-color-inverse-on-surface}; + + // ========================================================================== + // BACKGROUND COLORS - Material Design 3 Background System + // ========================================================================== + --color-background: #{colors.$base-color-background}; + --color-on-background: #{colors.$base-color-on-background}; + + // ========================================================================== + // OUTLINE COLORS - Material Design 3 Outline System + // ========================================================================== + --color-outline: #{colors.$base-color-outline}; + --color-outline-variant: #{colors.$base-color-outline-variant}; + + // ========================================================================== + // UTILITY COLORS - Material Design 3 Utility Colors + // ========================================================================== + --color-shadow: #{colors.$base-color-shadow}; + --color-surface-tint: #{colors.$base-color-surface-tint}; + --color-scrim: #{colors.$base-color-scrim}; + + // ========================================================================== + // GLASS EFFECT VARIABLES - Default to Light Mode + // ========================================================================== + --glass-blur-xs: #{glass.$base-glass-blur-xs}; + --glass-blur-sm: #{glass.$base-glass-blur-sm}; + --glass-blur-md: #{glass.$base-glass-blur-md}; + --glass-blur-lg: #{glass.$base-glass-blur-lg}; + --glass-blur-xl: #{glass.$base-glass-blur-xl}; + --glass-blur-2xl: #{glass.$base-glass-blur-2xl}; + --glass-blur-3xl: #{glass.$base-glass-blur-3xl}; + + --glass-opacity-translucent: #{glass.$base-glass-opacity-translucent-light}; + --glass-opacity-light: #{glass.$base-glass-opacity-light-light}; + --glass-opacity-medium: #{glass.$base-glass-opacity-medium-light}; + --glass-opacity-heavy: #{glass.$base-glass-opacity-heavy-light}; + --glass-opacity-frosted: #{glass.$base-glass-opacity-frosted-light}; + + --glass-background-base: #{glass.$base-glass-bg-light}; + --glass-border-color: #{glass.$base-glass-border-light}; + --glass-shadow-color: #{glass.$base-glass-shadow-light}; + + --glass-duration-fast: #{glass.$base-glass-duration-fast}; + --glass-duration-normal: #{glass.$base-glass-duration-normal}; + --glass-duration-slow: #{glass.$base-glass-duration-slow}; +} + +// ========================================================================== +// CSS VARIABLE FALLBACK SYSTEM +// ========================================================================== +// Fallback variables that use SCSS tokens when CSS variables are not supported +// This ensures compatibility with older browsers + +// Primary system fallbacks +$css-color-primary: var(--color-primary, #{colors.$base-color-primary}) !default; +$css-color-on-primary: var(--color-on-primary, #{colors.$base-color-on-primary}) !default; +$css-color-primary-container: var(--color-primary-container, #{colors.$base-color-primary-container}) !default; +$css-color-on-primary-container: var(--color-on-primary-container, #{colors.$base-color-on-primary-container}) !default; +$css-color-inverse-primary: var(--color-inverse-primary, #{colors.$base-color-inverse-primary}) !default; + +// Secondary system fallbacks +$css-color-secondary: var(--color-secondary, #{colors.$base-color-secondary}) !default; +$css-color-on-secondary: var(--color-on-secondary, #{colors.$base-color-on-secondary}) !default; +$css-color-secondary-container: var(--color-secondary-container, #{colors.$base-color-secondary-container}) !default; +$css-color-on-secondary-container: var(--color-on-secondary-container, #{colors.$base-color-on-secondary-container}) !default; + +// Tertiary system fallbacks +$css-color-tertiary: var(--color-tertiary, #{colors.$base-color-tertiary}) !default; +$css-color-on-tertiary: var(--color-on-tertiary, #{colors.$base-color-on-tertiary}) !default; +$css-color-tertiary-container: var(--color-tertiary-container, #{colors.$base-color-tertiary-container}) !default; +$css-color-on-tertiary-container: var(--color-on-tertiary-container, #{colors.$base-color-on-tertiary-container}) !default; + +// Error system fallbacks +$css-color-error: var(--color-error, #{colors.$base-color-error}) !default; +$css-color-on-error: var(--color-on-error, #{colors.$base-color-on-error}) !default; +$css-color-error-container: var(--color-error-container, #{colors.$base-color-error-container}) !default; +$css-color-on-error-container: var(--color-on-error-container, #{colors.$base-color-on-error-container}) !default; + +// Surface system fallbacks +$css-color-surface: var(--color-surface, #{colors.$base-color-surface}) !default; +$css-color-surface-bright: var(--color-surface-bright, #{colors.$base-color-surface-bright}) !default; +$css-color-surface-dim: var(--color-surface-dim, #{colors.$base-color-surface-dim}) !default; +$css-color-on-surface: var(--color-on-surface, #{colors.$base-color-on-surface}) !default; +$css-color-surface-lowest: var(--color-surface-lowest, #{colors.$base-color-surface-lowest}) !default; +$css-color-surface-low: var(--color-surface-low, #{colors.$base-color-surface-low}) !default; +$css-color-surface-container: var(--color-surface-container, #{colors.$base-color-surface-container}) !default; +$css-color-surface-high: var(--color-surface-high, #{colors.$base-color-surface-high}) !default; +$css-color-surface-highest: var(--color-surface-highest, #{colors.$base-color-surface-highest}) !default; +$css-color-surface-variant: var(--color-surface-variant, #{colors.$base-color-surface-variant}) !default; +$css-color-on-surface-variant: var(--color-on-surface-variant, #{colors.$base-color-on-surface-variant}) !default; +$css-color-inverse-surface: var(--color-inverse-surface, #{colors.$base-color-inverse-surface}) !default; +$css-color-inverse-on-surface: var(--color-inverse-on-surface, #{colors.$base-color-inverse-on-surface}) !default; + +// Background system fallbacks +$css-color-background: var(--color-background, #{colors.$base-color-background}) !default; +$css-color-on-background: var(--color-on-background, #{colors.$base-color-on-background}) !default; + +// Outline system fallbacks +$css-color-outline: var(--color-outline, #{colors.$base-color-outline}) !default; +$css-color-outline-variant: var(--color-outline-variant, #{colors.$base-color-outline-variant}) !default; + +// Utility fallbacks +$css-color-shadow: var(--color-shadow, #{colors.$base-color-shadow}) !default; +$css-color-surface-tint: var(--color-surface-tint, #{colors.$base-color-surface-tint}) !default; +$css-color-scrim: var(--color-scrim, #{colors.$base-color-scrim}) !default; + +// Glass effect fallbacks +$css-glass-blur-xs: var(--glass-blur-xs, #{glass.$base-glass-blur-xs}) !default; +$css-glass-blur-sm: var(--glass-blur-sm, #{glass.$base-glass-blur-sm}) !default; +$css-glass-blur-md: var(--glass-blur-md, #{glass.$base-glass-blur-md}) !default; +$css-glass-blur-lg: var(--glass-blur-lg, #{glass.$base-glass-blur-lg}) !default; +$css-glass-blur-xl: var(--glass-blur-xl, #{glass.$base-glass-blur-xl}) !default; +$css-glass-blur-2xl: var(--glass-blur-2xl, #{glass.$base-glass-blur-2xl}) !default; +$css-glass-blur-3xl: var(--glass-blur-3xl, #{glass.$base-glass-blur-3xl}) !default; + +$css-glass-opacity-translucent: var(--glass-opacity-translucent, #{glass.$base-glass-opacity-translucent-light}) !default; +$css-glass-opacity-light: var(--glass-opacity-light, #{glass.$base-glass-opacity-light-light}) !default; +$css-glass-opacity-medium: var(--glass-opacity-medium, #{glass.$base-glass-opacity-medium-light}) !default; +$css-glass-opacity-heavy: var(--glass-opacity-heavy, #{glass.$base-glass-opacity-heavy-light}) !default; +$css-glass-opacity-frosted: var(--glass-opacity-frosted, #{glass.$base-glass-opacity-frosted-light}) !default; + +$css-glass-background-base: var(--glass-background-base, #{glass.$base-glass-bg-light}) !default; +$css-glass-border-color: var(--glass-border-color, #{glass.$base-glass-border-light}) !default; +$css-glass-shadow-color: var(--glass-shadow-color, #{glass.$base-glass-shadow-light}) !default; + +// ========================================================================== +// RUNTIME THEMING MIXIN +// ========================================================================== +// Mixin for applying CSS custom properties to components +// Use this to make components theme-aware + +@mixin theme-aware-colors($properties: ()) { + @each $property, $css-variable in $properties { + #{$property}: var(--color-#{$css-variable}); + } +} + +// Example usage: +// .my-component { +// @include theme-aware-colors(( +// 'color': 'on-surface', +// 'background-color': 'surface', +// 'border-color': 'outline' +// )); +// } \ No newline at end of file diff --git a/projects/shared-ui/src/styles/base/_glass.scss b/projects/shared-ui/src/styles/base/_glass.scss new file mode 100644 index 0000000..c52b666 --- /dev/null +++ b/projects/shared-ui/src/styles/base/_glass.scss @@ -0,0 +1,85 @@ +// ========================================================================== +// GLASS EFFECT TOKENS +// ========================================================================== +// Base tokens for glass morphism effects including blur and opacity values +// Supports both light and dark mode variants +// ========================================================================== + +// BLUR INTENSITIES +// Progressive blur values for different glass effect strengths +$base-glass-blur-none: 0 !default; +$base-glass-blur-xs: 2px !default; +$base-glass-blur-sm: 4px !default; +$base-glass-blur-md: 8px !default; +$base-glass-blur-lg: 16px !default; +$base-glass-blur-xl: 24px !default; +$base-glass-blur-2xl: 32px !default; +$base-glass-blur-3xl: 40px !default; + +// GLASS OPACITY VARIANTS - LIGHT MODE +// 5 levels from nearly transparent to nearly opaque +$base-glass-opacity-translucent-light: 0.1 !default; // Nearly transparent +$base-glass-opacity-light-light: 0.3 !default; // Light glass +$base-glass-opacity-medium-light: 0.5 !default; // Medium glass +$base-glass-opacity-heavy-light: 0.7 !default; // Heavy glass +$base-glass-opacity-frosted-light: 0.85 !default; // Nearly opaque + +// GLASS OPACITY VARIANTS - DARK MODE +// Adjusted for better visibility in dark environments +$base-glass-opacity-translucent-dark: 0.05 !default; // Nearly transparent +$base-glass-opacity-light-dark: 0.2 !default; // Light glass +$base-glass-opacity-medium-dark: 0.4 !default; // Medium glass +$base-glass-opacity-heavy-dark: 0.6 !default; // Heavy glass +$base-glass-opacity-frosted-dark: 0.8 !default; // Nearly opaque + +// GLASS BACKGROUND COLORS +// Base colors for glass effects (RGB values for rgba() usage) +$base-glass-bg-light: 255, 255, 255 !default; // White for light mode +$base-glass-bg-dark: 0, 0, 0 !default; // Black for dark mode + +// GLASS BORDER COLORS +$base-glass-border-light: rgba(255, 255, 255, 0.2) !default; +$base-glass-border-dark: rgba(255, 255, 255, 0.1) !default; + +// GLASS SHADOW COLORS +$base-glass-shadow-light: rgba(0, 0, 0, 0.1) !default; +$base-glass-shadow-dark: rgba(0, 0, 0, 0.5) !default; + +// GLASS ANIMATION DURATIONS +$base-glass-duration-fast: 200ms !default; +$base-glass-duration-normal: 300ms !default; +$base-glass-duration-slow: 500ms !default; + +// GLASS ANIMATION EASINGS +$base-glass-easing-smooth: cubic-bezier(0.4, 0, 0.2, 1) !default; +$base-glass-easing-bounce: cubic-bezier(0.68, -0.55, 0.265, 1.55) !default; + +// BLUR MAP FOR EASY ACCESS +$base-glass-blurs: ( + none: $base-glass-blur-none, + xs: $base-glass-blur-xs, + sm: $base-glass-blur-sm, + md: $base-glass-blur-md, + lg: $base-glass-blur-lg, + xl: $base-glass-blur-xl, + 2xl: $base-glass-blur-2xl, + 3xl: $base-glass-blur-3xl +) !default; + +// OPACITY MAP FOR EASY ACCESS - LIGHT MODE +$base-glass-opacities-light: ( + translucent: $base-glass-opacity-translucent-light, + light: $base-glass-opacity-light-light, + medium: $base-glass-opacity-medium-light, + heavy: $base-glass-opacity-heavy-light, + frosted: $base-glass-opacity-frosted-light +) !default; + +// OPACITY MAP FOR EASY ACCESS - DARK MODE +$base-glass-opacities-dark: ( + translucent: $base-glass-opacity-translucent-dark, + light: $base-glass-opacity-light-dark, + medium: $base-glass-opacity-medium-dark, + heavy: $base-glass-opacity-heavy-dark, + frosted: $base-glass-opacity-frosted-dark +) !default; \ No newline at end of file diff --git a/projects/shared-ui/src/styles/base/_motion.scss b/projects/shared-ui/src/styles/base/_motion.scss new file mode 100644 index 0000000..59da145 --- /dev/null +++ b/projects/shared-ui/src/styles/base/_motion.scss @@ -0,0 +1,124 @@ +// Motion Tokens +// Generated from base-tokens.json + +// Animation Durations +$base-motion-duration-instant: 50ms; +$base-motion-duration-fast: 150ms; +$base-motion-duration-normal: 300ms; +$base-motion-duration-slow: 500ms; +$base-motion-duration-slower: 700ms; +$base-motion-duration-slowest: 1000ms; +$base-motion-duration-ultra-slow: 2000ms; + +// Easing Functions +$base-motion-easing-linear: linear; +$base-motion-easing-ease: ease; +$base-motion-easing-ease-in: cubic-bezier(0.4, 0, 1, 1); +$base-motion-easing-ease-out: cubic-bezier(0, 0, 0.2, 1); +$base-motion-easing-ease-in-out: cubic-bezier(0.4, 0, 0.2, 1); +$base-motion-easing-spring: cubic-bezier(0.68, -0.55, 0.265, 1.55); +$base-motion-easing-bounce: cubic-bezier(0.175, 0.885, 0.32, 1.275); +$base-motion-easing-sharp: cubic-bezier(0.4, 0, 0.6, 1); +$base-motion-easing-elastic: cubic-bezier(0.175, 0.885, 0.32, 1.275); + +// Transition Properties +$base-motion-transition-property-none: none; +$base-motion-transition-property-all: all; +$base-motion-transition-property-colors: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke; +$base-motion-transition-property-opacity: opacity; +$base-motion-transition-property-shadow: box-shadow; +$base-motion-transition-property-transform: transform; +$base-motion-transition-property-spacing: margin, padding; +$base-motion-transition-property-size: width, height; + +// Transition Durations +$base-motion-transition-duration-0: 0ms; +$base-motion-transition-duration-75: 75ms; +$base-motion-transition-duration-100: 100ms; +$base-motion-transition-duration-150: 150ms; +$base-motion-transition-duration-200: 200ms; +$base-motion-transition-duration-300: 300ms; +$base-motion-transition-duration-500: 500ms; +$base-motion-transition-duration-700: 700ms; +$base-motion-transition-duration-1000: 1000ms; +$base-motion-transition-duration-1500: 1500ms; +$base-motion-transition-duration-2000: 2000ms; + +// Transition Timing Functions +$base-motion-transition-timing-linear: linear; +$base-motion-transition-timing-in: cubic-bezier(0.4, 0, 1, 1); +$base-motion-transition-timing-out: cubic-bezier(0, 0, 0.2, 1); +$base-motion-transition-timing-in-out: cubic-bezier(0.4, 0, 0.2, 1); +$base-motion-transition-timing-spring: cubic-bezier(0.68, -0.55, 0.265, 1.55); +$base-motion-transition-timing-out-back: cubic-bezier(0.34, 1.56, 0.64, 1); + +// Transition Delays +$base-motion-transition-delay-0: 0ms; +$base-motion-transition-delay-75: 75ms; +$base-motion-transition-delay-100: 100ms; +$base-motion-transition-delay-150: 150ms; +$base-motion-transition-delay-200: 200ms; +$base-motion-transition-delay-300: 300ms; +$base-motion-transition-delay-500: 500ms; +$base-motion-transition-delay-700: 700ms; +$base-motion-transition-delay-1000: 1000ms; + +// Duration Map +$base-motion-durations: ( + instant: $base-motion-duration-instant, + fast: $base-motion-duration-fast, + normal: $base-motion-duration-normal, + slow: $base-motion-duration-slow, + slower: $base-motion-duration-slower, + slowest: $base-motion-duration-slowest, + ultra-slow: $base-motion-duration-ultra-slow, +); + +// Easing Map +$base-motion-easings: ( + linear: $base-motion-easing-linear, + ease: $base-motion-easing-ease, + ease-in: $base-motion-easing-ease-in, + ease-out: $base-motion-easing-ease-out, + ease-in-out: $base-motion-easing-ease-in-out, + spring: $base-motion-easing-spring, + bounce: $base-motion-easing-bounce, + sharp: $base-motion-easing-sharp, + elastic: $base-motion-easing-elastic, +); + +// Hover Transform Values +$base-motion-hover-transform-none: none; +$base-motion-hover-transform-scale-sm: scale(1.02); +$base-motion-hover-transform-scale-md: scale(1.05); +$base-motion-hover-transform-scale-lg: scale(1.1); +$base-motion-hover-transform-lift-sm: translateY(-2px); +$base-motion-hover-transform-lift-md: translateY(-4px); +$base-motion-hover-transform-lift-lg: translateY(-8px); +$base-motion-hover-transform-scale-lift-sm: scale(1.02) translateY(-2px); +$base-motion-hover-transform-scale-lift-md: scale(1.05) translateY(-4px); + +// Transition Property Map +$base-motion-transition-properties: ( + none: $base-motion-transition-property-none, + all: $base-motion-transition-property-all, + colors: $base-motion-transition-property-colors, + opacity: $base-motion-transition-property-opacity, + shadow: $base-motion-transition-property-shadow, + transform: $base-motion-transition-property-transform, + spacing: $base-motion-transition-property-spacing, + size: $base-motion-transition-property-size, +); + +// Hover Transform Map +$base-motion-hover-transforms: ( + none: $base-motion-hover-transform-none, + scale-sm: $base-motion-hover-transform-scale-sm, + scale-md: $base-motion-hover-transform-scale-md, + scale-lg: $base-motion-hover-transform-scale-lg, + lift-sm: $base-motion-hover-transform-lift-sm, + lift-md: $base-motion-hover-transform-lift-md, + lift-lg: $base-motion-hover-transform-lift-lg, + scale-lift-sm: $base-motion-hover-transform-scale-lift-sm, + scale-lift-md: $base-motion-hover-transform-scale-lift-md, +); \ No newline at end of file diff --git a/projects/shared-ui/src/styles/base/_opacity.scss b/projects/shared-ui/src/styles/base/_opacity.scss new file mode 100644 index 0000000..fafa19f --- /dev/null +++ b/projects/shared-ui/src/styles/base/_opacity.scss @@ -0,0 +1,38 @@ +// Opacity Tokens +// Generated from base-tokens.json + +// Opacity Values +$base-opacity-0: 0; +$base-opacity-5: 0.05; +$base-opacity-10: 0.10; +$base-opacity-20: 0.20; +$base-opacity-25: 0.25; +$base-opacity-30: 0.30; +$base-opacity-40: 0.40; +$base-opacity-50: 0.50; +$base-opacity-60: 0.60; +$base-opacity-70: 0.70; +$base-opacity-75: 0.75; +$base-opacity-80: 0.80; +$base-opacity-90: 0.90; +$base-opacity-95: 0.95; +$base-opacity-100: 1; + +// Opacity Map +$base-opacities: ( + 0: $base-opacity-0, + 5: $base-opacity-5, + 10: $base-opacity-10, + 20: $base-opacity-20, + 25: $base-opacity-25, + 30: $base-opacity-30, + 40: $base-opacity-40, + 50: $base-opacity-50, + 60: $base-opacity-60, + 70: $base-opacity-70, + 75: $base-opacity-75, + 80: $base-opacity-80, + 90: $base-opacity-90, + 95: $base-opacity-95, + 100: $base-opacity-100, +); \ No newline at end of file diff --git a/projects/shared-ui/src/styles/base/_shadows.scss b/projects/shared-ui/src/styles/base/_shadows.scss new file mode 100644 index 0000000..afdc1f3 --- /dev/null +++ b/projects/shared-ui/src/styles/base/_shadows.scss @@ -0,0 +1,36 @@ +// Shadow Tokens +// Generated from base-tokens.json + +// Standard Shadows +$base-shadow-xs: 0 1px 2px 0 rgba(0, 0, 0, 0.05); +$base-shadow-sm: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1); +$base-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1); +$base-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1); +$base-shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1); +$base-shadow-2xl: 0 25px 50px -12px rgba(0, 0, 0, 0.25); +$base-shadow-inner: inset 0 2px 4px 0 rgba(0, 0, 0, 0.05); +$base-shadow-none: none; + +// AI Shadows +$base-shadow-ai-glow: 0 0 20px rgba(139, 92, 246, 0.3), 0 0 40px rgba(139, 92, 246, 0.1); +$base-shadow-ai-pulse: 0 0 30px rgba(6, 182, 212, 0.4), 0 0 60px rgba(6, 182, 212, 0.2); +$base-shadow-ai-soft: 0 0 15px rgba(139, 92, 246, 0.2), 0 0 30px rgba(139, 92, 246, 0.1); + +// Shadow Scale Map +$base-shadows: ( + xs: $base-shadow-xs, + sm: $base-shadow-sm, + md: $base-shadow-md, + lg: $base-shadow-lg, + xl: $base-shadow-xl, + 2xl: $base-shadow-2xl, + inner: $base-shadow-inner, + none: $base-shadow-none, +); + +// AI Shadow Map +$base-shadows-ai: ( + glow: $base-shadow-ai-glow, + pulse: $base-shadow-ai-pulse, + soft: $base-shadow-ai-soft, +); \ No newline at end of file diff --git a/projects/shared-ui/src/styles/base/_sizing.scss b/projects/shared-ui/src/styles/base/_sizing.scss new file mode 100644 index 0000000..a2bd066 --- /dev/null +++ b/projects/shared-ui/src/styles/base/_sizing.scss @@ -0,0 +1,206 @@ +// Sizing Tokens +// Generated from base-tokens.json + +// Icon Sizes +$base-sizing-icon-xxs: 8px; +$base-sizing-icon-xs: 12px; +$base-sizing-icon-sm: 16px; +$base-sizing-icon-md: 20px; +$base-sizing-icon-lg: 24px; +$base-sizing-icon-xl: 32px; +$base-sizing-icon-2xl: 40px; +$base-sizing-icon-3xl: 48px; +$base-sizing-icon-4xl: 64px; +$base-sizing-icon-5xl: 80px; + +// Avatar Sizes +$base-sizing-avatar-xs: 24px; +$base-sizing-avatar-sm: 32px; +$base-sizing-avatar-md: 40px; +$base-sizing-avatar-lg: 48px; +$base-sizing-avatar-xl: 64px; +$base-sizing-avatar-2xl: 80px; + +// Button Sizes +$base-sizing-button-sm: 32px; +$base-sizing-button-md: 40px; +$base-sizing-button-lg: 48px; + +// Input Sizes +$base-sizing-input-sm: 32px; +$base-sizing-input-md: 40px; +$base-sizing-input-lg: 48px; + +// Touch Target Sizes +$base-sizing-interaction-touch-target: 44px; +$base-sizing-interaction-min-clickable: 32px; + +$base-sizing-touch-minimum: 44px; +$base-sizing-touch-comfortable: 48px; +$base-sizing-touch-spacious: 56px; + +// Line Sizes +$base-sizing-line-1: 1px; +$base-sizing-line-2: 2px; +$base-sizing-line-4: 4px; +$base-sizing-line-8: 8px; + +// Width Values +$base-sizing-width-0: 0px; +$base-sizing-width-1: 0.25rem; +$base-sizing-width-2: 0.5rem; +$base-sizing-width-3: 0.75rem; +$base-sizing-width-4: 1rem; +$base-sizing-width-5: 1.25rem; +$base-sizing-width-6: 1.5rem; +$base-sizing-width-7: 1.75rem; +$base-sizing-width-8: 2rem; +$base-sizing-width-9: 2.25rem; +$base-sizing-width-10: 2.5rem; +$base-sizing-width-11: 2.75rem; +$base-sizing-width-12: 3rem; +$base-sizing-width-14: 3.5rem; +$base-sizing-width-16: 4rem; +$base-sizing-width-20: 5rem; +$base-sizing-width-24: 6rem; +$base-sizing-width-28: 7rem; +$base-sizing-width-32: 8rem; +$base-sizing-width-36: 9rem; +$base-sizing-width-40: 10rem; +$base-sizing-width-44: 11rem; +$base-sizing-width-48: 12rem; +$base-sizing-width-52: 13rem; +$base-sizing-width-56: 14rem; +$base-sizing-width-60: 15rem; +$base-sizing-width-64: 16rem; +$base-sizing-width-72: 18rem; +$base-sizing-width-80: 20rem; +$base-sizing-width-96: 24rem; +$base-sizing-width-auto: auto; +$base-sizing-width-full: 100%; +$base-sizing-width-screen: 100vw; +$base-sizing-width-min: min-content; +$base-sizing-width-max: max-content; +$base-sizing-width-fit: fit-content; + +// Height Values +$base-sizing-height-0: 0px; +$base-sizing-height-1: 0.25rem; +$base-sizing-height-2: 0.5rem; +$base-sizing-height-3: 0.75rem; +$base-sizing-height-4: 1rem; +$base-sizing-height-5: 1.25rem; +$base-sizing-height-6: 1.5rem; +$base-sizing-height-7: 1.75rem; +$base-sizing-height-8: 2rem; +$base-sizing-height-9: 2.25rem; +$base-sizing-height-10: 2.5rem; +$base-sizing-height-11: 2.75rem; +$base-sizing-height-12: 3rem; +$base-sizing-height-14: 3.5rem; +$base-sizing-height-16: 4rem; +$base-sizing-height-20: 5rem; +$base-sizing-height-24: 6rem; +$base-sizing-height-28: 7rem; +$base-sizing-height-32: 8rem; +$base-sizing-height-36: 9rem; +$base-sizing-height-40: 10rem; +$base-sizing-height-44: 11rem; +$base-sizing-height-48: 12rem; +$base-sizing-height-52: 13rem; +$base-sizing-height-56: 14rem; +$base-sizing-height-60: 15rem; +$base-sizing-height-64: 16rem; +$base-sizing-height-72: 18rem; +$base-sizing-height-80: 20rem; +$base-sizing-height-96: 24rem; +$base-sizing-height-auto: auto; +$base-sizing-height-full: 100%; +$base-sizing-height-screen: 100vh; +$base-sizing-height-min: min-content; +$base-sizing-height-max: max-content; +$base-sizing-height-fit: fit-content; + +// Max Width Values +$base-sizing-max-width-0: 0px; +$base-sizing-max-width-xs: 20rem; +$base-sizing-max-width-sm: 24rem; +$base-sizing-max-width-md: 28rem; +$base-sizing-max-width-lg: 32rem; +$base-sizing-max-width-xl: 36rem; +$base-sizing-max-width-2xl: 42rem; +$base-sizing-max-width-3xl: 48rem; +$base-sizing-max-width-4xl: 56rem; +$base-sizing-max-width-5xl: 64rem; +$base-sizing-max-width-6xl: 72rem; +$base-sizing-max-width-7xl: 80rem; +$base-sizing-max-width-full: 100%; +$base-sizing-max-width-min: min-content; +$base-sizing-max-width-max: max-content; +$base-sizing-max-width-fit: fit-content; +$base-sizing-max-width-prose: 65ch; +$base-sizing-max-width-screen-sm: 640px; +$base-sizing-max-width-screen-md: 768px; +$base-sizing-max-width-screen-lg: 1024px; +$base-sizing-max-width-screen-xl: 1280px; +$base-sizing-max-width-screen-2xl: 1536px; + +// Min Width/Height Values +$base-sizing-min-width-0: 0px; +$base-sizing-min-width-full: 100%; +$base-sizing-min-width-min: min-content; +$base-sizing-min-width-max: max-content; +$base-sizing-min-width-fit: fit-content; + +$base-sizing-min-height-0: 0px; +$base-sizing-min-height-full: 100%; +$base-sizing-min-height-screen: 100vh; +$base-sizing-min-height-min: min-content; +$base-sizing-min-height-max: max-content; +$base-sizing-min-height-fit: fit-content; + +$base-sizing-max-height-0: 0px; +$base-sizing-max-height-full: 100%; +$base-sizing-max-height-screen: 100vh; +$base-sizing-max-height-min: min-content; +$base-sizing-max-height-max: max-content; +$base-sizing-max-height-fit: fit-content; + +// AI Sizing +$base-sizing-ai-indicator: 20px; +$base-sizing-ai-glow: 40px; + +// Component Size Maps +$base-sizing-icons: ( + xxs: $base-sizing-icon-xxs, + xs: $base-sizing-icon-xs, + sm: $base-sizing-icon-sm, + md: $base-sizing-icon-md, + lg: $base-sizing-icon-lg, + xl: $base-sizing-icon-xl, + 2xl: $base-sizing-icon-2xl, + 3xl: $base-sizing-icon-3xl, + 4xl: $base-sizing-icon-4xl, + 5xl: $base-sizing-icon-5xl, +); + +$base-sizing-avatars: ( + xs: $base-sizing-avatar-xs, + sm: $base-sizing-avatar-sm, + md: $base-sizing-avatar-md, + lg: $base-sizing-avatar-lg, + xl: $base-sizing-avatar-xl, + 2xl: $base-sizing-avatar-2xl, +); + +$base-sizing-buttons: ( + sm: $base-sizing-button-sm, + md: $base-sizing-button-md, + lg: $base-sizing-button-lg, +); + +$base-sizing-inputs: ( + sm: $base-sizing-input-sm, + md: $base-sizing-input-md, + lg: $base-sizing-input-lg, +); \ No newline at end of file diff --git a/projects/shared-ui/src/styles/base/_spacing.scss b/projects/shared-ui/src/styles/base/_spacing.scss new file mode 100644 index 0000000..d3a4ff9 --- /dev/null +++ b/projects/shared-ui/src/styles/base/_spacing.scss @@ -0,0 +1,115 @@ +// Spacing Tokens +// Generated from base-tokens.json + +// Base Spacing Configuration +$base-spacing-base: 1rem; +$base-spacing-scale: 1.5; +$base-spacing-micro-hairline: 0.5px; + +// Spacing Values +$base-spacing-0: 0px; +$base-spacing-0-5: 0.125rem; +$base-spacing-1: 0.25rem; +$base-spacing-1-5: 0.375rem; +$base-spacing-2: 0.5rem; +$base-spacing-2-5: 0.625rem; +$base-spacing-3: 0.75rem; +$base-spacing-3-5: 0.875rem; +$base-spacing-4: 1rem; +$base-spacing-5: 1.25rem; +$base-spacing-6: 1.5rem; +$base-spacing-7: 1.75rem; +$base-spacing-8: 2rem; +$base-spacing-9: 2.25rem; +$base-spacing-10: 2.5rem; +$base-spacing-11: 2.75rem; +$base-spacing-12: 3rem; +$base-spacing-14: 3.5rem; +$base-spacing-16: 4rem; +$base-spacing-20: 5rem; +$base-spacing-24: 6rem; +$base-spacing-28: 7rem; +$base-spacing-32: 8rem; +$base-spacing-36: 9rem; +$base-spacing-40: 10rem; +$base-spacing-44: 11rem; +$base-spacing-48: 12rem; +$base-spacing-52: 13rem; +$base-spacing-56: 14rem; +$base-spacing-60: 15rem; +$base-spacing-64: 16rem; +$base-spacing-72: 18rem; +$base-spacing-80: 20rem; +$base-spacing-96: 24rem; +$base-spacing-128: 32rem; +$base-spacing-160: 40rem; +$base-spacing-192: 48rem; +$base-spacing-224: 56rem; +$base-spacing-256: 64rem; + +// Semantic Spacing +$base-spacing-semantic-xs: 0.5rem; +$base-spacing-semantic-sm: 0.75rem; +$base-spacing-semantic-md: 1rem; +$base-spacing-semantic-lg: 1.5rem; +$base-spacing-semantic-xl: 2rem; +$base-spacing-semantic-2xl: 2.5rem; +$base-spacing-semantic-3xl: 3rem; +$base-spacing-semantic-4xl: 4rem; +$base-spacing-semantic-5xl: 5rem; + +// Spacing Scale Map +$base-spacing-scale-map: ( + 0: $base-spacing-0, + 0.5: $base-spacing-0-5, + 1: $base-spacing-1, + 1.5: $base-spacing-1-5, + 2: $base-spacing-2, + 2.5: $base-spacing-2-5, + 3: $base-spacing-3, + 3.5: $base-spacing-3-5, + 4: $base-spacing-4, + 5: $base-spacing-5, + 6: $base-spacing-6, + 7: $base-spacing-7, + 8: $base-spacing-8, + 9: $base-spacing-9, + 10: $base-spacing-10, + 11: $base-spacing-11, + 12: $base-spacing-12, + 14: $base-spacing-14, + 16: $base-spacing-16, + 20: $base-spacing-20, + 24: $base-spacing-24, + 28: $base-spacing-28, + 32: $base-spacing-32, + 36: $base-spacing-36, + 40: $base-spacing-40, + 44: $base-spacing-44, + 48: $base-spacing-48, + 52: $base-spacing-52, + 56: $base-spacing-56, + 60: $base-spacing-60, + 64: $base-spacing-64, + 72: $base-spacing-72, + 80: $base-spacing-80, + 96: $base-spacing-96, + 128: $base-spacing-128, + 160: $base-spacing-160, + 192: $base-spacing-192, + 224: $base-spacing-224, + 256: $base-spacing-256, +); + +// Semantic Spacing Map +$base-spacing-semantic: ( + xs: $base-spacing-semantic-xs, + sm: $base-spacing-semantic-sm, + md: $base-spacing-semantic-md, + lg: $base-spacing-semantic-lg, + xl: $base-spacing-semantic-xl, + 2xl: $base-spacing-semantic-2xl, + 3xl: $base-spacing-semantic-3xl, + 4xl: $base-spacing-semantic-4xl, + 5xl: $base-spacing-semantic-5xl, +); \ No newline at end of file diff --git a/projects/shared-ui/src/styles/base/_typography.scss b/projects/shared-ui/src/styles/base/_typography.scss new file mode 100644 index 0000000..895ec9c --- /dev/null +++ b/projects/shared-ui/src/styles/base/_typography.scss @@ -0,0 +1,162 @@ +// Typography Tokens +// Generated from base-tokens.json +// Using Google Fonts: Inter, Playfair Display, JetBrains Mono + +// Font Families with Google Fonts +$base-typography-font-family-sans: 'Inter', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif; +$base-typography-font-family-serif: 'Playfair Display', ui-serif, Georgia, Cambria, 'Times New Roman', Times, serif; +$base-typography-font-family-mono: 'JetBrains Mono', ui-monospace, SFMono-Regular, Monaco, Consolas, 'Courier New', monospace; +$base-typography-font-family-display: 'Inter', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif; + +// Font Sizes +$base-typography-font-size-xs: 0.75rem; // 12px +$base-typography-font-size-sm: 0.875rem; // 14px +$base-typography-font-size-md: 1rem; // 16px +$base-typography-font-size-lg: 1.125rem; // 18px +$base-typography-font-size-xl: 1.25rem; // 20px +$base-typography-font-size-2xl: 1.5rem; // 24px +$base-typography-font-size-3xl: 1.875rem; // 30px +$base-typography-font-size-4xl: 2.25rem; // 36px +$base-typography-font-size-5xl: 3rem; // 48px +$base-typography-font-size-6xl: 3.75rem; // 60px +$base-typography-font-size-7xl: 4.5rem; // 72px +$base-typography-font-size-8xl: 6rem; // 96px +$base-typography-font-size-9xl: 8rem; // 128px +$base-typography-font-size-10xl: 10rem; // 160px +$base-typography-font-size-11xl: 12rem; // 192px + +// Font Weights +$base-typography-font-weight-100: 100; +$base-typography-font-weight-200: 200; +$base-typography-font-weight-300: 300; +$base-typography-font-weight-400: 400; +$base-typography-font-weight-500: 500; +$base-typography-font-weight-600: 600; +$base-typography-font-weight-700: 700; +$base-typography-font-weight-800: 800; +$base-typography-font-weight-900: 900; + +$base-typography-font-weight-thin: 100; +$base-typography-font-weight-extralight: 200; +$base-typography-font-weight-light: 300; +$base-typography-font-weight-normal: 400; +$base-typography-font-weight-medium: 500; +$base-typography-font-weight-semibold: 600; +$base-typography-font-weight-bold: 700; +$base-typography-font-weight-extrabold: 800; +$base-typography-font-weight-black: 900; + +// Line Heights +$base-typography-line-height-none: 1; +$base-typography-line-height-tight: 1.25; +$base-typography-line-height-snug: 1.375; +$base-typography-line-height-normal: 1.5; +$base-typography-line-height-relaxed: 1.625; +$base-typography-line-height-loose: 2; +$base-typography-line-height-3: 0.75rem; +$base-typography-line-height-4: 1rem; +$base-typography-line-height-5: 1.25rem; +$base-typography-line-height-6: 1.5rem; +$base-typography-line-height-7: 1.75rem; +$base-typography-line-height-8: 2rem; +$base-typography-line-height-9: 2.25rem; +$base-typography-line-height-10: 2.5rem; + +// Letter Spacing +$base-typography-letter-spacing-tighter: -0.05em; +$base-typography-letter-spacing-tight: -0.025em; +$base-typography-letter-spacing-normal: 0em; +$base-typography-letter-spacing-wide: 0.025em; +$base-typography-letter-spacing-wider: 0.05em; +$base-typography-letter-spacing-widest: 0.1em; + +// Word Spacing +$base-typography-word-spacing-tight: -0.05em; +$base-typography-word-spacing-normal: 0em; +$base-typography-word-spacing-wide: 0.05em; +$base-typography-word-spacing-wider: 0.1em; + +// Text Decoration +$base-typography-text-decoration-line-none: none; +$base-typography-text-decoration-line-underline: underline; +$base-typography-text-decoration-line-overline: overline; +$base-typography-text-decoration-line-line-through: line-through; + +$base-typography-text-decoration-style-solid: solid; +$base-typography-text-decoration-style-double: double; +$base-typography-text-decoration-style-dotted: dotted; +$base-typography-text-decoration-style-dashed: dashed; +$base-typography-text-decoration-style-wavy: wavy; + +$base-typography-text-decoration-thickness-auto: auto; +$base-typography-text-decoration-thickness-from-font: from-font; +$base-typography-text-decoration-thickness-0: 0px; +$base-typography-text-decoration-thickness-1: 1px; +$base-typography-text-decoration-thickness-2: 2px; +$base-typography-text-decoration-thickness-4: 4px; +$base-typography-text-decoration-thickness-8: 8px; + +$base-typography-text-decoration-offset-auto: auto; +$base-typography-text-decoration-offset-0: 0px; +$base-typography-text-decoration-offset-1: 1px; +$base-typography-text-decoration-offset-2: 2px; +$base-typography-text-decoration-offset-4: 4px; +$base-typography-text-decoration-offset-8: 8px; + +// Typography Scale Map +$base-typography-scale: ( + xs: ( + font-size: $base-typography-font-size-xs, + line-height: $base-typography-line-height-4, + ), + sm: ( + font-size: $base-typography-font-size-sm, + line-height: $base-typography-line-height-5, + ), + md: ( + font-size: $base-typography-font-size-md, + line-height: $base-typography-line-height-6, + ), + lg: ( + font-size: $base-typography-font-size-lg, + line-height: $base-typography-line-height-7, + ), + xl: ( + font-size: $base-typography-font-size-xl, + line-height: $base-typography-line-height-7, + ), + 2xl: ( + font-size: $base-typography-font-size-2xl, + line-height: $base-typography-line-height-8, + ), + 3xl: ( + font-size: $base-typography-font-size-3xl, + line-height: $base-typography-line-height-9, + ), + 4xl: ( + font-size: $base-typography-font-size-4xl, + line-height: $base-typography-line-height-10, + ), +); + +// Font Family Map +$base-typography-families: ( + sans: $base-typography-font-family-sans, + serif: $base-typography-font-family-serif, + mono: $base-typography-font-family-mono, + display: $base-typography-font-family-display, +); + +// Font Weight Map +$base-typography-weights: ( + thin: $base-typography-font-weight-thin, + extralight: $base-typography-font-weight-extralight, + light: $base-typography-font-weight-light, + normal: $base-typography-font-weight-normal, + medium: $base-typography-font-weight-medium, + semibold: $base-typography-font-weight-semibold, + bold: $base-typography-font-weight-bold, + extrabold: $base-typography-font-weight-extrabold, + black: $base-typography-font-weight-black, +); + diff --git a/projects/shared-ui/src/styles/base/_z-index.scss b/projects/shared-ui/src/styles/base/_z-index.scss new file mode 100644 index 0000000..c3ba81c --- /dev/null +++ b/projects/shared-ui/src/styles/base/_z-index.scss @@ -0,0 +1,60 @@ +// Z-Index Tokens +// Generated from base-tokens.json + +// Z-Index Values +$base-z-index-neg-10: -10; +$base-z-index-neg-1: -1; +$base-z-index-0: 0; +$base-z-index-10: 10; +$base-z-index-20: 20; +$base-z-index-30: 30; +$base-z-index-40: 40; +$base-z-index-50: 50; +$base-z-index-60: 60; +$base-z-index-70: 70; +$base-z-index-80: 80; +$base-z-index-90: 90; +$base-z-index-100: 100; + +// Semantic Z-Index Values +$base-z-index-dropdown: 1000; +$base-z-index-sticky: 1020; +$base-z-index-fixed: 1030; +$base-z-index-modal-backdrop: 1040; +$base-z-index-overlay: 1045; +$base-z-index-modal: 1050; +$base-z-index-banner: 1010; +$base-z-index-popover: 1060; +$base-z-index-tooltip: 1070; +$base-z-index-toast: 1080; +$base-z-index-max: 2147483647; +$base-z-index-debug: 9999; + +// Z-Index Map +$base-z-indexes: ( + -10: $base-z-index-neg-10, + -1: $base-z-index-neg-1, + 0: $base-z-index-0, + 10: $base-z-index-10, + 20: $base-z-index-20, + 30: $base-z-index-30, + 40: $base-z-index-40, + 50: $base-z-index-50, + 60: $base-z-index-60, + 70: $base-z-index-70, + 80: $base-z-index-80, + 90: $base-z-index-90, + 100: $base-z-index-100, + dropdown: $base-z-index-dropdown, + banner: $base-z-index-banner, + sticky: $base-z-index-sticky, + fixed: $base-z-index-fixed, + modal-backdrop: $base-z-index-modal-backdrop, + overlay: $base-z-index-overlay, + modal: $base-z-index-modal, + popover: $base-z-index-popover, + tooltip: $base-z-index-tooltip, + toast: $base-z-index-toast, + max: $base-z-index-max, + debug: $base-z-index-debug, +); \ No newline at end of file diff --git a/projects/shared-ui/src/styles/base/index.scss b/projects/shared-ui/src/styles/base/index.scss new file mode 100644 index 0000000..d01c24f --- /dev/null +++ b/projects/shared-ui/src/styles/base/index.scss @@ -0,0 +1,9 @@ +// Base tokens entry point +@forward 'colors'; +@forward 'spacing'; +@forward 'typography'; +@forward 'motion'; +@forward 'shadows'; + + +@forward 'css-variables'; diff --git a/projects/shared-ui/src/styles/commons/_index.scss b/projects/shared-ui/src/styles/commons/_index.scss new file mode 100644 index 0000000..42de605 --- /dev/null +++ b/projects/shared-ui/src/styles/commons/_index.scss @@ -0,0 +1,11 @@ +// ========================================================================== +// COMMONS INDEX +// ========================================================================== +// Import all commons modules in the correct order +// Theme-agnostic styles that work across all themes +// ========================================================================== + +@import 'layouts'; +@import 'components'; +@import 'patterns'; +@import 'utilities'; \ No newline at end of file diff --git a/projects/shared-ui/src/styles/commons/components/_base-buttons.scss b/projects/shared-ui/src/styles/commons/components/_base-buttons.scss new file mode 100644 index 0000000..7377c70 --- /dev/null +++ b/projects/shared-ui/src/styles/commons/components/_base-buttons.scss @@ -0,0 +1,340 @@ +// ========================================================================== +// BASE BUTTONS +// ========================================================================== +// Theme-agnostic button structures and behaviors +// Visual styling handled by themes +// ========================================================================== + +// BUTTON BASE +.btn { + display: inline-flex; + align-items: center; + justify-content: center; + gap: var(--btn-gap, #{$semantic-spacing-micro-icon-gap}); + padding: var(--btn-padding, #{$semantic-spacing-interactive-button-padding-y} #{$semantic-spacing-interactive-button-padding-x}); + border: var(--btn-border-width, #{$semantic-border-button-width}) solid transparent; + border-radius: var(--btn-border-radius, #{$semantic-border-button-radius}); + font-family: inherit; + font-size: var(--btn-font-size, 1rem); + font-weight: var(--btn-font-weight, 500); + line-height: var(--btn-line-height, 1.5); + text-align: center; + text-decoration: none; + white-space: nowrap; + vertical-align: middle; + cursor: pointer; + user-select: none; + transition: all var(--btn-transition-duration, 0.2s) var(--btn-transition-easing, ease); + position: relative; + overflow: hidden; + + &:focus { + outline: var(--btn-focus-outline, 2px solid transparent); + outline-offset: var(--btn-focus-outline-offset, 2px); + } + + &:disabled, + &.btn-disabled { + pointer-events: none; + opacity: var(--btn-disabled-opacity, 0.6); + cursor: not-allowed; + } + + &.btn-loading { + pointer-events: none; + + .btn-text { + opacity: 0; + } + + .btn-spinner { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + } + } +} + +// BUTTON SIZES - Using semantic sizing tokens +.btn-xs { + --btn-padding: #{$semantic-spacing-component-padding-xs} #{$semantic-spacing-component-padding-sm}; + --btn-font-size: 0.75rem; + --btn-gap: #{$base-spacing-1}; +} + +.btn-sm { + --btn-padding: #{$semantic-spacing-component-padding-sm} #{$semantic-spacing-component-padding-md}; + --btn-font-size: 0.875rem; + --btn-gap: #{$semantic-spacing-micro-icon-gap}; +} + +.btn-lg { + --btn-padding: #{$semantic-spacing-component-padding-md} #{$semantic-spacing-component-padding-xl}; + --btn-font-size: 1.125rem; + --btn-gap: #{$semantic-spacing-component-padding-sm}; +} + +.btn-xl { + --btn-padding: #{$semantic-spacing-component-padding-lg} #{$semantic-spacing-component-padding-xl}; + --btn-font-size: 1.25rem; + --btn-gap: 16px; +} + +// BUTTON SHAPES +.btn-rounded { + border-radius: var(--btn-rounded-radius, 50px); +} + +.btn-square { + border-radius: 0; +} + +.btn-circle { + border-radius: 50%; + width: var(--btn-circle-size, 48px); + height: var(--btn-circle-size, 48px); + padding: 0; +} + +// BUTTON WIDTHS +.btn-block { + display: flex; + width: 100%; +} + +.btn-auto { + width: auto; +} + +// BUTTON GROUPS +.btn-group { + display: inline-flex; + vertical-align: middle; + + > .btn { + position: relative; + flex: 1 1 auto; + border-radius: 0; + + &:first-child { + border-top-left-radius: var(--btn-border-radius, 4px); + border-bottom-left-radius: var(--btn-border-radius, 4px); + } + + &:last-child { + border-top-right-radius: var(--btn-border-radius, 4px); + border-bottom-right-radius: var(--btn-border-radius, 4px); + } + + &:not(:first-child) { + margin-left: calc(var(--btn-border-width, 1px) * -1); + } + + &:hover, + &:focus, + &.btn-active { + z-index: 1; + } + } + + &.btn-group-vertical { + flex-direction: column; + + > .btn { + &:first-child { + border-radius: var(--btn-border-radius, 4px) var(--btn-border-radius, 4px) 0 0; + } + + &:last-child { + border-radius: 0 0 var(--btn-border-radius, 4px) var(--btn-border-radius, 4px); + } + + &:not(:first-child) { + margin-left: 0; + margin-top: calc(var(--btn-border-width, 1px) * -1); + } + } + } +} + +// FLOATING ACTION BUTTON (FAB) +.btn-fab { + position: fixed; + bottom: var(--fab-bottom, 24px); + right: var(--fab-right, 24px); + width: var(--fab-size, 56px); + height: var(--fab-size, 56px); + border-radius: 50%; + padding: 0; + z-index: var(--z-fab, 1000); + box-shadow: var(--fab-shadow, 0 4px 12px rgba(0, 0, 0, 0.15)); + transition: all var(--fab-transition-duration, 0.3s) var(--fab-transition-easing, ease); + + &:hover { + transform: var(--fab-hover-transform, translateY(-2px)); + box-shadow: var(--fab-hover-shadow, 0 6px 20px rgba(0, 0, 0, 0.2)); + } + + &.btn-fab-mini { + --fab-size: 40px; + --fab-bottom: 16px; + --fab-right: 16px; + } + + &.btn-fab-extended { + width: auto; + min-width: var(--fab-extended-min-width, 120px); + border-radius: var(--fab-extended-radius, 28px); + padding: var(--fab-extended-padding, 0 20px); + gap: var(--fab-extended-gap, 8px); + } +} + +// BUTTON ICON HANDLING +.btn-icon { + width: var(--btn-icon-size, 24px); + height: var(--btn-icon-size, 24px); + flex-shrink: 0; + + &.btn-icon-start { + margin-right: var(--btn-icon-spacing, 8px); + margin-left: calc(var(--btn-icon-spacing, 8px) * -0.5); + } + + &.btn-icon-end { + margin-left: var(--btn-icon-spacing, 8px); + margin-right: calc(var(--btn-icon-spacing, 8px) * -0.5); + } +} + +.btn-icon-only { + width: var(--btn-icon-only-size, 40px); + height: var(--btn-icon-only-size, 40px); + padding: 0; + + &.btn-sm { + --btn-icon-only-size: 32px; + } + + &.btn-lg { + --btn-icon-only-size: 48px; + } + + &.btn-xl { + --btn-icon-only-size: 56px; + } +} + +// BUTTON STATES +.btn-loading-spinner { + display: inline-block; + width: var(--spinner-size, 16px); + height: var(--spinner-size, 16px); + border: 2px solid transparent; + border-top: 2px solid currentColor; + border-radius: 50%; + animation: btn-spin var(--spinner-duration, 1s) linear infinite; +} + +@keyframes btn-spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +// RIPPLE EFFECT (Structure only) +.btn-ripple { + position: relative; + overflow: hidden; + + &::before { + content: ''; + position: absolute; + top: 50%; + left: 50%; + width: 0; + height: 0; + border-radius: 50%; + transform: translate(-50%, -50%); + transition: width 0.6s, height 0.6s; + background: var(--btn-ripple-color, rgba(255, 255, 255, 0.3)); + } + + &:active::before { + width: 300px; + height: 300px; + } +} + +// TOGGLE BUTTON +.btn-toggle { + &.btn-toggle-active { + // Active state handled by theme + } + + &[aria-pressed="true"] { + // Pressed state handled by theme + } +} + +// DROPDOWN BUTTON +.btn-dropdown { + .dropdown-caret { + margin-left: var(--dropdown-caret-spacing, 8px); + transition: transform var(--dropdown-transition-duration, 0.2s); + } + + &.dropdown-open .dropdown-caret { + transform: rotate(180deg); + } +} + +// RESPONSIVE BUTTON ADJUSTMENTS +@media (max-width: 576px) { + .btn { + --btn-padding: 10px 20px; + --btn-font-size: 0.875rem; + } + + .btn-block-mobile { + display: flex; + width: 100%; + } + + .btn-fab { + --fab-size: 48px; + --fab-bottom: 16px; + --fab-right: 16px; + } +} + +// ACCESSIBILITY IMPROVEMENTS +@media (prefers-reduced-motion: reduce) { + .btn { + transition: none; + } + + .btn-fab { + transition: none; + + &:hover { + transform: none; + } + } + + .btn-loading-spinner { + animation: none; + } +} + +// HIGH CONTRAST MODE +@media (prefers-contrast: high) { + .btn { + border-width: 2px; + } + + .btn:focus { + outline: 3px solid; + outline-offset: 3px; + } +} \ No newline at end of file diff --git a/projects/shared-ui/src/styles/commons/components/_base-cards.scss b/projects/shared-ui/src/styles/commons/components/_base-cards.scss new file mode 100644 index 0000000..e8d44f6 --- /dev/null +++ b/projects/shared-ui/src/styles/commons/components/_base-cards.scss @@ -0,0 +1,424 @@ +// ========================================================================== +// BASE CARDS +// ========================================================================== +// Theme-agnostic card structures and layouts +// Visual styling handled by themes +// ========================================================================== + +// CARD BASE +.card { + position: relative; + display: flex; + flex-direction: column; + min-width: 0; + word-wrap: break-word; + background-clip: border-box; + border: var(--card-border-width, #{$semantic-border-card-width}) solid transparent; + border-radius: var(--card-border-radius, #{$semantic-border-card-radius}); + + &.card-interactive { + cursor: pointer; + transition: all var(--card-transition-duration, 0.2s) var(--card-transition-easing, ease); + + &:hover { + transform: var(--card-hover-transform, translateY(-2px)); + } + + &:active { + transform: var(--card-active-transform, translateY(0)); + } + } + + &.card-clickable { + cursor: pointer; + text-decoration: none; + + &:focus { + outline: var(--card-focus-outline, 2px solid transparent); + outline-offset: var(--card-focus-outline-offset, 2px); + } + } +} + +// CARD COMPONENTS +.card-header { + padding: var(--card-header-padding, #{$semantic-spacing-container-card-padding} #{$semantic-spacing-container-card-padding-lg}); + border-bottom: var(--card-header-border-width, #{$semantic-border-divider-width}) solid var(--card-header-border-color, transparent); + border-top-left-radius: inherit; + border-top-right-radius: inherit; + display: flex; + align-items: center; + gap: var(--card-header-gap, #{$semantic-spacing-component-padding-sm}); + min-height: var(--card-header-min-height, auto); + + &:first-child { + border-top-left-radius: var(--card-border-radius, #{$semantic-border-card-radius}); + border-top-right-radius: var(--card-border-radius, #{$semantic-border-card-radius}); + } + + &.card-header-borderless { + border-bottom: none; + } + + .card-title { + margin: 0; + font-size: var(--card-title-size, 1.125rem); + font-weight: var(--card-title-weight, 600); + line-height: var(--card-title-line-height, 1.4); + flex: 1; + } + + .card-subtitle { + margin: var(--card-subtitle-margin, 4px 0 0 0); + font-size: var(--card-subtitle-size, 0.875rem); + opacity: var(--card-subtitle-opacity, 0.7); + } + + .card-actions { + display: flex; + align-items: center; + gap: var(--card-actions-gap, 8px); + margin-left: auto; + } +} + +.card-body { + flex: 1 1 auto; + padding: var(--card-body-padding, 20px); + + &.card-body-compact { + padding: var(--card-body-compact-padding, 12px); + } + + &.card-body-spacious { + padding: var(--card-body-spacious-padding, 32px); + } + + &.card-body-flush { + padding: 0; + } + + &:first-child { + border-top-left-radius: inherit; + border-top-right-radius: inherit; + } + + &:last-child { + border-bottom-left-radius: inherit; + border-bottom-right-radius: inherit; + } + + .card-text { + margin: 0 0 var(--card-text-spacing, 16px) 0; + line-height: var(--card-text-line-height, 1.6); + + &:last-child { + margin-bottom: 0; + } + } +} + +.card-footer { + padding: var(--card-footer-padding, 12px 20px); + border-top: var(--card-footer-border-width, 1px) solid var(--card-footer-border-color, transparent); + border-bottom-left-radius: inherit; + border-bottom-right-radius: inherit; + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--card-footer-gap, 12px); + + &:last-child { + border-bottom-left-radius: var(--card-border-radius, 8px); + border-bottom-right-radius: var(--card-border-radius, 8px); + } + + &.card-footer-borderless { + border-top: none; + } + + &.card-footer-center { + justify-content: center; + } + + &.card-footer-end { + justify-content: flex-end; + } +} + +// CARD MEDIA +.card-img { + width: 100%; + border-radius: inherit; + + &.card-img-top { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + } + + &.card-img-bottom { + border-top-left-radius: 0; + border-top-right-radius: 0; + } +} + +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: var(--card-overlay-padding, 20px); + border-radius: inherit; + display: flex; + flex-direction: column; + justify-content: flex-end; +} + +// CARD VARIANTS +.card-horizontal { + flex-direction: row; + + .card-img { + flex-shrink: 0; + width: var(--card-horizontal-img-width, 200px); + height: auto; + border-radius: var(--card-border-radius, 8px) 0 0 var(--card-border-radius, 8px); + + &.card-img-end { + border-radius: 0 var(--card-border-radius, 8px) var(--card-border-radius, 8px) 0; + order: 2; + } + } + + .card-body { + display: flex; + flex-direction: column; + justify-content: center; + } +} + +@media (max-width: 768px) { + .card-horizontal { + flex-direction: column; + + .card-img { + width: 100%; + border-radius: var(--card-border-radius, 8px) var(--card-border-radius, 8px) 0 0; + + &.card-img-end { + border-radius: 0 0 var(--card-border-radius, 8px) var(--card-border-radius, 8px); + order: 0; + } + } + } +} + +// CARD SIZES +.card-sm { + --card-header-padding: 12px 16px; + --card-body-padding: 16px; + --card-footer-padding: 8px 16px; + --card-border-radius: 6px; +} + +.card-lg { + --card-header-padding: 24px 32px; + --card-body-padding: 32px; + --card-footer-padding: 16px 32px; + --card-border-radius: 12px; +} + +// CARD STATES +.card-loading { + pointer-events: none; + opacity: var(--card-loading-opacity, 0.7); + + .card-loading-overlay { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + display: flex; + align-items: center; + justify-content: center; + border-radius: inherit; + z-index: 1; + } +} + +.card-disabled { + pointer-events: none; + opacity: var(--card-disabled-opacity, 0.6); +} + +// CARD GROUPS +.card-group { + display: flex; + + > .card { + flex: 1 0 0%; + border-radius: 0; + + &:first-child { + border-top-left-radius: var(--card-border-radius, 8px); + border-bottom-left-radius: var(--card-border-radius, 8px); + } + + &:last-child { + border-top-right-radius: var(--card-border-radius, 8px); + border-bottom-right-radius: var(--card-border-radius, 8px); + } + + &:not(:last-child) { + border-right: none; + } + } +} + +@media (max-width: 768px) { + .card-group { + flex-direction: column; + + > .card { + border-radius: 0; + + &:first-child { + border-radius: var(--card-border-radius, 8px) var(--card-border-radius, 8px) 0 0; + } + + &:last-child { + border-radius: 0 0 var(--card-border-radius, 8px) var(--card-border-radius, 8px); + } + + &:not(:last-child) { + border-right: var(--card-border-width, 1px) solid transparent; + border-bottom: none; + } + } + } +} + +// CARD DECK +.card-deck { + display: flex; + flex-direction: column; + gap: var(--card-deck-gap, 24px); + + @media (min-width: 576px) { + flex-direction: row; + } + + > .card { + flex: 1 0 0%; + } +} + +// CARD COLUMNS (Masonry-style) +.card-columns { + column-count: 1; + column-gap: var(--card-columns-gap, 24px); + orphans: 1; + widows: 1; + + @media (min-width: 576px) { + column-count: 2; + } + + @media (min-width: 768px) { + column-count: 3; + } + + @media (min-width: 992px) { + column-count: 4; + } + + > .card { + display: inline-block; + width: 100%; + margin-bottom: var(--card-columns-gap, 24px); + break-inside: avoid; + } +} + +// CARD GRID +.card-grid { + display: grid; + gap: var(--card-grid-gap, 24px); + grid-template-columns: 1fr; + + @media (min-width: 576px) { + grid-template-columns: repeat(2, 1fr); + } + + @media (min-width: 768px) { + grid-template-columns: repeat(3, 1fr); + } + + @media (min-width: 992px) { + grid-template-columns: repeat(4, 1fr); + } + + &.card-grid-auto-fit { + grid-template-columns: repeat(auto-fit, minmax(var(--card-grid-min-width, 280px), 1fr)); + } + + &.card-grid-auto-fill { + grid-template-columns: repeat(auto-fill, minmax(var(--card-grid-min-width, 280px), 1fr)); + } +} + +// SPECIAL CARD TYPES +.card-feature { + text-align: center; + + .card-body { + padding: var(--card-feature-padding, 48px 32px); + } + + .card-icon { + width: var(--card-feature-icon-size, 64px); + height: var(--card-feature-icon-size, 64px); + margin: 0 auto var(--card-feature-icon-spacing, 24px) auto; + display: flex; + align-items: center; + justify-content: center; + border-radius: var(--card-feature-icon-radius, 12px); + } +} + +.card-profile { + text-align: center; + + .card-avatar { + width: var(--card-avatar-size, 80px); + height: var(--card-avatar-size, 80px); + border-radius: 50%; + margin: calc(var(--card-avatar-size, 80px) / -2) auto var(--card-avatar-spacing, 16px) auto; + border: var(--card-avatar-border, 4px solid white); + position: relative; + z-index: 1; + } + + .card-header { + padding-bottom: calc(var(--card-avatar-size, 80px) / 2 + var(--card-header-padding-bottom, 16px)); + } +} + +// ACCESSIBILITY +@media (prefers-reduced-motion: reduce) { + .card-interactive { + transition: none; + + &:hover { + transform: none; + } + } +} + +@media (prefers-contrast: high) { + .card { + border-width: 2px; + } +} \ No newline at end of file diff --git a/projects/shared-ui/src/styles/commons/components/_base-forms.scss b/projects/shared-ui/src/styles/commons/components/_base-forms.scss new file mode 100644 index 0000000..c8b9769 --- /dev/null +++ b/projects/shared-ui/src/styles/commons/components/_base-forms.scss @@ -0,0 +1,475 @@ +// ========================================================================== +// BASE FORMS +// ========================================================================== +// Theme-agnostic form structures and behaviors +// Visual styling handled by themes +// ========================================================================== + +// FORM CONTAINER +.form { + display: flex; + flex-direction: column; + gap: var(--form-gap, 24px); + max-width: var(--form-max-width, 100%); + margin: var(--form-margin, 0); + + &.form-inline { + flex-direction: row; + align-items: center; + flex-wrap: wrap; + gap: var(--form-inline-gap, 16px); + } + + &.form-compact { + gap: var(--form-compact-gap, 16px); + } + + &.form-spacious { + gap: var(--form-spacious-gap, 32px); + } +} + +// FIELDSET +.fieldset { + border: var(--fieldset-border, 1px solid transparent); + border-radius: var(--fieldset-border-radius, 8px); + padding: var(--fieldset-padding, 24px); + margin: var(--fieldset-margin, 0 0 24px 0); + + .fieldset-legend { + font-size: var(--fieldset-legend-size, 1.125rem); + font-weight: var(--fieldset-legend-weight, 600); + margin-bottom: var(--fieldset-legend-spacing, 16px); + padding: var(--fieldset-legend-padding, 0 8px); + } +} + +// FORM FIELD +.form-field { + display: flex; + flex-direction: column; + gap: var(--form-field-gap, 8px); + position: relative; + + &.form-field-inline { + flex-direction: row; + align-items: center; + gap: var(--form-field-inline-gap, 12px); + + .form-label { + flex-shrink: 0; + margin-bottom: 0; + min-width: var(--form-label-min-width, 120px); + } + + .form-input-wrapper { + flex: 1; + } + } + + &.form-field-checkbox, + &.form-field-radio { + flex-direction: row; + align-items: flex-start; + gap: var(--form-checkbox-gap, 8px); + + .form-input { + flex-shrink: 0; + margin: 0; + } + + .form-label { + flex: 1; + margin-bottom: 0; + cursor: pointer; + line-height: var(--form-checkbox-label-line-height, 1.5); + } + } + + &.form-field-error { + .form-input { + border-color: var(--form-error-color, #dc3545); + } + + .form-label { + color: var(--form-error-color, #dc3545); + } + } + + &.form-field-success { + .form-input { + border-color: var(--form-success-color, #28a745); + } + } + + &.form-field-disabled { + opacity: var(--form-disabled-opacity, 0.6); + pointer-events: none; + } +} + +// FORM LABEL +.form-label { + font-size: var(--form-label-size, 0.875rem); + font-weight: var(--form-label-weight, 500); + line-height: var(--form-label-line-height, 1.4); + margin-bottom: var(--form-label-spacing, 8px); + cursor: pointer; + + &.form-label-required::after { + content: var(--form-required-indicator, ' *'); + color: var(--form-required-color, #dc3545); + } + + &.form-label-optional::after { + content: var(--form-optional-indicator, ' (optional)'); + opacity: var(--form-optional-opacity, 0.6); + font-weight: normal; + } +} + +// FORM INPUTS +.form-input { + width: 100%; + padding: var(--form-input-padding, 12px 16px); + border: var(--form-input-border, 1px solid #d1d5db); + border-radius: var(--form-input-border-radius, 6px); + font-family: inherit; + font-size: var(--form-input-font-size, 1rem); + line-height: var(--form-input-line-height, 1.5); + transition: all var(--form-input-transition-duration, 0.2s) var(--form-input-transition-easing, ease); + background: var(--form-input-background, transparent); + + &:focus { + outline: var(--form-input-focus-outline, 2px solid transparent); + outline-offset: var(--form-input-focus-outline-offset, 2px); + border-color: var(--form-input-focus-border-color, #3b82f6); + } + + &:disabled, + &[readonly] { + opacity: var(--form-input-disabled-opacity, 0.6); + cursor: not-allowed; + background: var(--form-input-disabled-background, #f9fafb); + } + + &::placeholder { + color: var(--form-input-placeholder-color, #9ca3af); + opacity: 1; + } +} + +// INPUT SIZES +.form-input-sm { + --form-input-padding: 8px 12px; + --form-input-font-size: 0.875rem; +} + +.form-input-lg { + --form-input-padding: 16px 20px; + --form-input-font-size: 1.125rem; +} + +// TEXTAREA +.form-textarea { + min-height: var(--form-textarea-min-height, 120px); + resize: var(--form-textarea-resize, vertical); + line-height: var(--form-textarea-line-height, 1.6); +} + +// SELECT +.form-select { + cursor: pointer; + appearance: none; + background-image: var(--form-select-arrow, url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3E%3C/svg%3E")); + background-position: right 12px center; + background-repeat: no-repeat; + background-size: 16px 12px; + padding-right: var(--form-select-padding-right, 40px); + + &[multiple] { + background-image: none; + padding-right: var(--form-input-padding-right, 16px); + } +} + +// CHECKBOX & RADIO +.form-checkbox, +.form-radio { + width: var(--form-checkbox-size, 18px); + height: var(--form-checkbox-size, 18px); + margin: var(--form-checkbox-margin, 2px 0 0 0); + cursor: pointer; + appearance: none; + border: var(--form-checkbox-border, 2px solid #d1d5db); + transition: all var(--form-checkbox-transition-duration, 0.2s) var(--form-checkbox-transition-easing, ease); + + &:focus { + outline: var(--form-checkbox-focus-outline, 2px solid transparent); + outline-offset: var(--form-checkbox-focus-outline-offset, 2px); + } + + &:checked { + background: var(--form-checkbox-checked-background, #3b82f6); + border-color: var(--form-checkbox-checked-border-color, #3b82f6); + } + + &:disabled { + opacity: var(--form-checkbox-disabled-opacity, 0.5); + cursor: not-allowed; + } +} + +.form-checkbox { + border-radius: var(--form-checkbox-border-radius, 3px); + + &:checked { + background-image: var(--form-checkbox-check-icon, url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='m13.854 3.646-7.5 7.5a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6 10.293l7.146-7.147a.5.5 0 0 1 .708.708z'/%3E%3C/svg%3E")); + background-position: center; + background-repeat: no-repeat; + background-size: 12px 12px; + } + + &:indeterminate { + background: var(--form-checkbox-indeterminate-background, #3b82f6); + border-color: var(--form-checkbox-indeterminate-border-color, #3b82f6); + background-image: var(--form-checkbox-indeterminate-icon, url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3E%3Cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3E%3C/svg%3E")); + background-position: center; + background-repeat: no-repeat; + background-size: 12px 12px; + } +} + +.form-radio { + border-radius: 50%; + + &:checked { + background-image: var(--form-radio-dot-icon, radial-gradient(circle at center, white 4px, transparent 4px)); + } +} + +// INPUT GROUPS +.form-input-group { + display: flex; + position: relative; + + > .form-input { + position: relative; + flex: 1 1 auto; + min-width: 0; + + &:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + border-left: none; + } + + &:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + + &:focus { + z-index: 2; + } + } + + .form-input-addon, + .form-input-btn { + display: flex; + align-items: center; + padding: var(--form-input-addon-padding, 12px 16px); + font-size: var(--form-input-addon-font-size, 1rem); + border: var(--form-input-border, 1px solid #d1d5db); + white-space: nowrap; + + &:first-child { + border-top-left-radius: var(--form-input-border-radius, 6px); + border-bottom-left-radius: var(--form-input-border-radius, 6px); + border-right: none; + } + + &:last-child { + border-top-right-radius: var(--form-input-border-radius, 6px); + border-bottom-right-radius: var(--form-input-border-radius, 6px); + border-left: none; + } + } + + .form-input-btn { + cursor: pointer; + transition: all var(--form-input-btn-transition-duration, 0.2s); + + &:hover { + z-index: 2; + } + } +} + +// FLOATING LABELS +.form-floating { + position: relative; + + .form-input { + height: var(--form-floating-height, 56px); + padding: var(--form-floating-padding, 20px 16px 8px 16px); + + &:focus, + &:not(:placeholder-shown) { + padding: var(--form-floating-padding-active, 20px 16px 8px 16px); + } + + &::placeholder { + opacity: 0; + transition: opacity var(--form-floating-transition-duration, 0.2s); + } + + &:focus::placeholder { + opacity: 1; + } + } + + .form-label { + position: absolute; + top: 50%; + left: 16px; + margin-bottom: 0; + pointer-events: none; + transform: translateY(-50%); + transition: all var(--form-floating-transition-duration, 0.2s) var(--form-floating-transition-easing, ease); + transform-origin: left center; + cursor: text; + } + + .form-input:focus ~ .form-label, + .form-input:not(:placeholder-shown) ~ .form-label { + top: 12px; + transform: translateY(0) scale(0.85); + opacity: var(--form-floating-label-opacity, 0.7); + } +} + +// FORM FEEDBACK +.form-feedback { + font-size: var(--form-feedback-size, 0.875rem); + line-height: var(--form-feedback-line-height, 1.4); + margin-top: var(--form-feedback-spacing, 6px); + + &.form-feedback-error { + color: var(--form-error-color, #dc3545); + } + + &.form-feedback-success { + color: var(--form-success-color, #28a745); + } + + &.form-feedback-warning { + color: var(--form-warning-color, #ffc107); + } + + &.form-feedback-info { + color: var(--form-info-color, #17a2b8); + } +} + +.form-help-text { + font-size: var(--form-help-size, 0.875rem); + line-height: var(--form-help-line-height, 1.4); + margin-top: var(--form-help-spacing, 6px); + opacity: var(--form-help-opacity, 0.7); +} + +// FORM ACTIONS +.form-actions { + display: flex; + gap: var(--form-actions-gap, 12px); + align-items: center; + padding-top: var(--form-actions-padding, 16px); + margin-top: var(--form-actions-margin, 24px); + border-top: var(--form-actions-border, 1px solid transparent); + + &.form-actions-center { + justify-content: center; + } + + &.form-actions-end { + justify-content: flex-end; + } + + &.form-actions-between { + justify-content: space-between; + } + + &.form-actions-stack { + flex-direction: column; + + .btn { + width: 100%; + } + } +} + +@media (max-width: 576px) { + .form-actions { + flex-direction: column; + + .btn { + width: 100%; + } + } + + .form-field-inline { + flex-direction: column; + align-items: stretch; + + .form-label { + min-width: auto; + } + } +} + +// FORM VALIDATION +.was-validated { + .form-input { + &:valid { + border-color: var(--form-success-color, #28a745); + + &:focus { + border-color: var(--form-success-color, #28a745); + box-shadow: var(--form-success-focus-shadow, 0 0 0 0.2rem rgba(40, 167, 69, 0.25)); + } + } + + &:invalid { + border-color: var(--form-error-color, #dc3545); + + &:focus { + border-color: var(--form-error-color, #dc3545); + box-shadow: var(--form-error-focus-shadow, 0 0 0 0.2rem rgba(220, 53, 69, 0.25)); + } + } + } +} + +// ACCESSIBILITY +@media (prefers-reduced-motion: reduce) { + .form-input, + .form-checkbox, + .form-radio, + .form-floating .form-label { + transition: none; + } +} + +@media (prefers-contrast: high) { + .form-input, + .form-select, + .form-textarea { + border-width: 2px; + } + + .form-checkbox, + .form-radio { + border-width: 3px; + } +} \ No newline at end of file diff --git a/projects/shared-ui/src/styles/commons/components/_base-navigation.scss b/projects/shared-ui/src/styles/commons/components/_base-navigation.scss new file mode 100644 index 0000000..ccecfd0 --- /dev/null +++ b/projects/shared-ui/src/styles/commons/components/_base-navigation.scss @@ -0,0 +1,519 @@ +// ========================================================================== +// BASE NAVIGATION +// ========================================================================== +// Theme-agnostic navigation structures and behaviors +// Visual styling handled by themes +// ========================================================================== + +// NAVIGATION BASE +.nav { + display: flex; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none; + gap: var(--nav-gap, 8px); + + &.nav-vertical { + flex-direction: column; + } + + &.nav-horizontal { + flex-direction: row; + } + + &.nav-fill { + .nav-item { + flex: 1 1 auto; + text-align: center; + } + } + + &.nav-justified { + .nav-item { + flex-basis: 0; + flex-grow: 1; + text-align: center; + } + } +} + +.nav-item { + display: flex; +} + +.nav-link { + display: block; + padding: var(--nav-link-padding, 8px 16px); + text-decoration: none; + border: var(--nav-link-border, 1px solid transparent); + border-radius: var(--nav-link-border-radius, 4px); + transition: all var(--nav-link-transition-duration, 0.2s) var(--nav-link-transition-easing, ease); + cursor: pointer; + position: relative; + + &:hover { + text-decoration: none; + } + + &:focus { + outline: var(--nav-link-focus-outline, 2px solid transparent); + outline-offset: var(--nav-link-focus-outline-offset, 2px); + } + + &.nav-link-active { + // Active state styling handled by themes + } + + &.nav-link-disabled { + pointer-events: none; + opacity: var(--nav-link-disabled-opacity, 0.6); + cursor: not-allowed; + } +} + +// NAVIGATION TABS +.nav-tabs { + border-bottom: var(--nav-tabs-border, 1px solid #dee2e6); + + .nav-link { + margin-bottom: calc(var(--nav-tabs-border-width, 1px) * -1); + border: var(--nav-tabs-link-border, 1px solid transparent); + border-top-left-radius: var(--nav-tabs-border-radius, 4px); + border-top-right-radius: var(--nav-tabs-border-radius, 4px); + border-bottom: none; + + &.nav-link-active { + border-bottom: var(--nav-tabs-active-border-bottom, 1px solid transparent); + } + } +} + +// NAVIGATION PILLS +.nav-pills { + .nav-link { + border-radius: var(--nav-pills-border-radius, 20px); + } +} + +// NAVBAR +.navbar { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + padding: var(--navbar-padding, 8px 16px); + + &.navbar-expand { + flex-wrap: nowrap; + justify-content: flex-start; + } + + &.navbar-fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: var(--z-navbar, 1030); + } + + &.navbar-fixed-bottom { + position: fixed; + right: 0; + bottom: 0; + left: 0; + z-index: var(--z-navbar, 1030); + } + + &.navbar-sticky-top { + position: sticky; + top: 0; + z-index: var(--z-navbar, 1030); + } +} + +.navbar-brand { + display: inline-block; + padding-top: var(--navbar-brand-padding-y, 4px); + padding-bottom: var(--navbar-brand-padding-y, 4px); + margin-right: var(--navbar-brand-margin-end, 16px); + font-size: var(--navbar-brand-font-size, 1.25rem); + font-weight: var(--navbar-brand-font-weight, 600); + line-height: inherit; + text-decoration: none; + white-space: nowrap; + + &:hover, + &:focus { + text-decoration: none; + } +} + +.navbar-nav { + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + list-style: none; + + .nav-link { + padding-right: 0; + padding-left: 0; + } +} + +.navbar-collapse { + align-items: center; + width: 100%; + flex-basis: 100%; + flex-grow: 1; + + &.navbar-collapse-show { + display: flex !important; + } +} + +.navbar-toggler { + padding: var(--navbar-toggler-padding, 4px 8px); + font-size: var(--navbar-toggler-font-size, 1.25rem); + line-height: 1; + border: var(--navbar-toggler-border, 1px solid transparent); + border-radius: var(--navbar-toggler-border-radius, 4px); + background: transparent; + cursor: pointer; + transition: all var(--navbar-toggler-transition-duration, 0.2s); + + &:focus { + outline: var(--navbar-toggler-focus-outline, 2px solid transparent); + outline-offset: var(--navbar-toggler-focus-outline-offset, 2px); + } + + &:not(:disabled):not(.disabled):hover { + text-decoration: none; + } +} + +.navbar-toggler-icon { + display: inline-block; + width: var(--navbar-toggler-icon-size, 24px); + height: var(--navbar-toggler-icon-size, 24px); + vertical-align: middle; + background-repeat: no-repeat; + background-position: center; + background-size: 100%; +} + +// RESPONSIVE NAVBAR +@media (min-width: 576px) { + .navbar-expand-sm { + flex-wrap: nowrap; + justify-content: flex-start; + + .navbar-nav { + flex-direction: row; + + .nav-link { + padding-right: var(--navbar-nav-link-padding-x, 8px); + padding-left: var(--navbar-nav-link-padding-x, 8px); + } + } + + .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + + .navbar-toggler { + display: none; + } + } +} + +@media (min-width: 768px) { + .navbar-expand-md { + flex-wrap: nowrap; + justify-content: flex-start; + + .navbar-nav { + flex-direction: row; + + .nav-link { + padding-right: var(--navbar-nav-link-padding-x, 8px); + padding-left: var(--navbar-nav-link-padding-x, 8px); + } + } + + .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + + .navbar-toggler { + display: none; + } + } +} + +@media (min-width: 992px) { + .navbar-expand-lg { + flex-wrap: nowrap; + justify-content: flex-start; + + .navbar-nav { + flex-direction: row; + + .nav-link { + padding-right: var(--navbar-nav-link-padding-x, 8px); + padding-left: var(--navbar-nav-link-padding-x, 8px); + } + } + + .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + + .navbar-toggler { + display: none; + } + } +} + +// BREADCRUMB +.breadcrumb { + display: flex; + flex-wrap: wrap; + padding: var(--breadcrumb-padding, 12px 0); + margin-bottom: var(--breadcrumb-margin-bottom, 16px); + list-style: none; + border-radius: var(--breadcrumb-border-radius, 4px); +} + +.breadcrumb-item { + display: flex; + align-items: center; + + + .breadcrumb-item { + padding-left: var(--breadcrumb-divider-padding, 8px); + + &::before { + content: var(--breadcrumb-divider, '/'); + padding-right: var(--breadcrumb-divider-padding, 8px); + opacity: var(--breadcrumb-divider-opacity, 0.6); + } + } + + &.breadcrumb-item-active { + opacity: var(--breadcrumb-active-opacity, 0.6); + } + + .breadcrumb-link { + text-decoration: none; + transition: all var(--breadcrumb-link-transition-duration, 0.2s); + + &:hover { + text-decoration: underline; + } + + &:focus { + outline: var(--breadcrumb-link-focus-outline, 2px solid transparent); + outline-offset: var(--breadcrumb-link-focus-outline-offset, 2px); + } + } +} + +// PAGINATION +.pagination { + display: flex; + padding-left: 0; + list-style: none; + border-radius: var(--pagination-border-radius, 4px); + gap: var(--pagination-gap, 4px); +} + +.pagination-item { + &.pagination-item-active .pagination-link { + z-index: 3; + // Active styling handled by themes + } + + &.pagination-item-disabled .pagination-link { + pointer-events: none; + opacity: var(--pagination-disabled-opacity, 0.6); + cursor: not-allowed; + } +} + +.pagination-link { + position: relative; + display: block; + padding: var(--pagination-link-padding, 8px 12px); + text-decoration: none; + border: var(--pagination-link-border, 1px solid #dee2e6); + border-radius: var(--pagination-link-border-radius, 4px); + transition: all var(--pagination-link-transition-duration, 0.2s) var(--pagination-link-transition-easing, ease); + min-width: var(--pagination-link-min-width, 44px); + text-align: center; + + &:hover { + z-index: 2; + text-decoration: none; + } + + &:focus { + z-index: 3; + outline: var(--pagination-link-focus-outline, 2px solid transparent); + outline-offset: var(--pagination-link-focus-outline-offset, 2px); + } +} + +// PAGINATION SIZES +.pagination-sm { + .pagination-link { + padding: var(--pagination-sm-padding, 4px 8px); + font-size: var(--pagination-sm-font-size, 0.875rem); + min-width: var(--pagination-sm-min-width, 32px); + } +} + +.pagination-lg { + .pagination-link { + padding: var(--pagination-lg-padding, 12px 16px); + font-size: var(--pagination-lg-font-size, 1.125rem); + min-width: var(--pagination-lg-min-width, 52px); + } +} + +// SIDEBAR NAVIGATION +.nav-sidebar { + flex-direction: column; + width: 100%; + + .nav-item { + width: 100%; + } + + .nav-link { + display: flex; + align-items: center; + padding: var(--nav-sidebar-link-padding, 12px 16px); + border-radius: var(--nav-sidebar-link-border-radius, 6px); + margin-bottom: var(--nav-sidebar-link-margin, 4px); + text-decoration: none; + transition: all var(--nav-sidebar-link-transition-duration, 0.2s); + position: relative; + gap: var(--nav-sidebar-link-gap, 12px); + + .nav-icon { + width: var(--nav-sidebar-icon-size, 20px); + height: var(--nav-sidebar-icon-size, 20px); + flex-shrink: 0; + } + + .nav-text { + flex: 1; + min-width: 0; + } + + .nav-badge { + margin-left: auto; + flex-shrink: 0; + } + + .nav-arrow { + margin-left: auto; + transition: transform var(--nav-sidebar-arrow-transition-duration, 0.2s); + flex-shrink: 0; + } + + &.nav-link-expandable { + cursor: pointer; + + &.nav-link-expanded .nav-arrow { + transform: rotate(180deg); + } + } + + &.nav-link-active { + // Active styling handled by themes + + &::before { + content: ''; + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: var(--nav-sidebar-active-indicator-width, 4px); + border-radius: var(--nav-sidebar-active-indicator-radius, 0 2px 2px 0); + // Color handled by themes + } + } + } + + .nav-submenu { + margin-left: var(--nav-sidebar-submenu-indent, 32px); + margin-top: var(--nav-sidebar-submenu-margin, 4px); + padding-left: var(--nav-sidebar-submenu-padding, 16px); + border-left: var(--nav-sidebar-submenu-border, 1px solid rgba(0, 0, 0, 0.1)); + + .nav-link { + padding: var(--nav-sidebar-submenu-link-padding, 8px 12px); + font-size: var(--nav-sidebar-submenu-font-size, 0.875rem); + } + } +} + +// MOBILE NAVIGATION +@media (max-width: 768px) { + .nav-sidebar { + .nav-link { + padding: var(--nav-sidebar-mobile-padding, 16px); + font-size: var(--nav-sidebar-mobile-font-size, 1rem); + } + } + + .navbar-collapse { + display: none; + + &.navbar-collapse-show { + display: block !important; + } + } + + .navbar-nav { + .nav-item { + margin: var(--navbar-mobile-item-margin, 4px 0); + } + + .nav-link { + padding: var(--navbar-mobile-link-padding, 12px 16px); + } + } +} + +// ACCESSIBILITY +@media (prefers-reduced-motion: reduce) { + .nav-link, + .navbar-toggler, + .breadcrumb-link, + .pagination-link, + .nav-sidebar .nav-arrow { + transition: none; + } +} + +@media (prefers-contrast: high) { + .nav-link, + .navbar-toggler, + .pagination-link { + border-width: 2px; + } + + .nav-link:focus, + .navbar-toggler:focus, + .breadcrumb-link:focus, + .pagination-link:focus { + outline-width: 3px; + } +} \ No newline at end of file diff --git a/projects/shared-ui/src/styles/commons/components/_index.scss b/projects/shared-ui/src/styles/commons/components/_index.scss new file mode 100644 index 0000000..cc00fed --- /dev/null +++ b/projects/shared-ui/src/styles/commons/components/_index.scss @@ -0,0 +1,12 @@ +// ========================================================================== +// COMMONS COMPONENTS INDEX +// ========================================================================== +// Import all component-related commons files +// Theme-agnostic component structures and behaviors +// ========================================================================== + +@import 'base-buttons'; +@import 'base-cards'; +@import 'base-forms'; +@import 'base-navigation'; +@import 'utility-components'; \ No newline at end of file diff --git a/projects/shared-ui/src/styles/commons/components/_utility-components.scss b/projects/shared-ui/src/styles/commons/components/_utility-components.scss new file mode 100644 index 0000000..1b88e88 --- /dev/null +++ b/projects/shared-ui/src/styles/commons/components/_utility-components.scss @@ -0,0 +1,532 @@ +// ========================================================================== +// UTILITY COMPONENTS +// ========================================================================== +// Small, reusable utility components +// Theme-agnostic structures and behaviors +// ========================================================================== + +// BADGES +.badge { + display: inline-block; + padding: var(--badge-padding, 4px 8px); + font-size: var(--badge-font-size, 0.75rem); + font-weight: var(--badge-font-weight, 500); + line-height: 1; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: var(--badge-border-radius, 4px); + transition: all var(--badge-transition-duration, 0.2s); + + &.badge-pill { + padding: var(--badge-pill-padding, 4px 12px); + border-radius: var(--badge-pill-border-radius, 10em); + } + + &.badge-dot { + width: var(--badge-dot-size, 8px); + height: var(--badge-dot-size, 8px); + padding: 0; + border-radius: 50%; + } + + &.badge-lg { + padding: var(--badge-lg-padding, 8px 12px); + font-size: var(--badge-lg-font-size, 0.875rem); + } + + &.badge-sm { + padding: var(--badge-sm-padding, 2px 6px); + font-size: var(--badge-sm-font-size, 0.625rem); + } +} + +// ALERTS +.alert { + position: relative; + padding: var(--alert-padding, 16px 20px); + margin-bottom: var(--alert-margin-bottom, 16px); + border: var(--alert-border, 1px solid transparent); + border-radius: var(--alert-border-radius, 6px); + + .alert-title { + margin: 0 0 var(--alert-title-margin, 8px) 0; + font-size: var(--alert-title-size, 1rem); + font-weight: var(--alert-title-weight, 600); + } + + .alert-content { + margin: 0; + + p:last-child { + margin-bottom: 0; + } + } + + .alert-actions { + margin-top: var(--alert-actions-margin, 12px); + display: flex; + gap: var(--alert-actions-gap, 8px); + } + + .alert-close { + position: absolute; + top: var(--alert-close-top, 12px); + right: var(--alert-close-right, 12px); + padding: var(--alert-close-padding, 4px); + background: transparent; + border: none; + cursor: pointer; + opacity: var(--alert-close-opacity, 0.7); + transition: opacity var(--alert-close-transition-duration, 0.2s); + width: var(--alert-close-size, 24px); + height: var(--alert-close-size, 24px); + display: flex; + align-items: center; + justify-content: center; + + &:hover { + opacity: 1; + } + + &:focus { + outline: var(--alert-close-focus-outline, 2px solid transparent); + outline-offset: var(--alert-close-focus-outline-offset, 2px); + } + } + + &.alert-dismissible { + padding-right: var(--alert-dismissible-padding-right, 48px); + } +} + +// TOOLTIPS (Structure only - positioning handled by JS) +.tooltip { + position: absolute; + z-index: var(--z-tooltip, 1070); + display: block; + margin: var(--tooltip-margin, 0); + font-size: var(--tooltip-font-size, 0.875rem); + line-height: var(--tooltip-line-height, 1.4); + opacity: 0; + pointer-events: none; + transition: opacity var(--tooltip-transition-duration, 0.2s); + + &.tooltip-show { + opacity: 1; + } + + .tooltip-arrow { + position: absolute; + display: block; + width: var(--tooltip-arrow-size, 8px); + height: var(--tooltip-arrow-size, 8px); + } + + .tooltip-inner { + max-width: var(--tooltip-max-width, 200px); + padding: var(--tooltip-padding, 8px 12px); + text-align: center; + border-radius: var(--tooltip-border-radius, 4px); + } +} + +// POPOVER (Structure only - positioning handled by JS) +.popover { + position: absolute; + top: 0; + left: 0; + z-index: var(--z-popover, 1060); + display: block; + max-width: var(--popover-max-width, 276px); + font-size: var(--popover-font-size, 0.875rem); + line-height: var(--popover-line-height, 1.6); + word-wrap: break-word; + border: var(--popover-border, 1px solid rgba(0, 0, 0, 0.2)); + border-radius: var(--popover-border-radius, 6px); + opacity: 0; + pointer-events: none; + transition: opacity var(--popover-transition-duration, 0.2s); + + &.popover-show { + opacity: 1; + pointer-events: auto; + } + + .popover-arrow { + position: absolute; + display: block; + width: var(--popover-arrow-size, 12px); + height: var(--popover-arrow-size, 12px); + } + + .popover-header { + padding: var(--popover-header-padding, 12px 16px); + margin: 0; + font-size: var(--popover-header-font-size, 1rem); + font-weight: var(--popover-header-font-weight, 600); + border-bottom: var(--popover-header-border, 1px solid rgba(0, 0, 0, 0.1)); + border-top-left-radius: inherit; + border-top-right-radius: inherit; + + &:empty { + display: none; + } + } + + .popover-body { + padding: var(--popover-body-padding, 16px); + } +} + +// DROPDOWN +.dropdown { + position: relative; + display: inline-block; +} + +.dropdown-toggle { + &::after { + display: inline-block; + margin-left: var(--dropdown-caret-spacing, 8px); + vertical-align: middle; + content: ''; + border-top: var(--dropdown-caret-size, 4px) solid; + border-right: var(--dropdown-caret-size, 4px) solid transparent; + border-bottom: 0; + border-left: var(--dropdown-caret-size, 4px) solid transparent; + transition: transform var(--dropdown-caret-transition-duration, 0.2s); + } + + &[aria-expanded="true"]::after { + transform: rotate(180deg); + } + + &.dropdown-toggle-no-caret::after { + display: none; + } +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: var(--z-dropdown, 1000); + display: none; + float: left; + min-width: var(--dropdown-min-width, 160px); + padding: var(--dropdown-padding, 8px 0); + margin: var(--dropdown-margin, 2px 0 0); + font-size: var(--dropdown-font-size, 1rem); + text-align: left; + list-style: none; + border: var(--dropdown-border, 1px solid rgba(0, 0, 0, 0.15)); + border-radius: var(--dropdown-border-radius, 6px); + box-shadow: var(--dropdown-box-shadow, 0 6px 12px rgba(0, 0, 0, 0.175)); + background-clip: padding-box; + + &.dropdown-menu-end { + right: 0; + left: auto; + } + + &.dropdown-menu-show { + display: block; + } +} + +.dropdown-item { + display: block; + width: 100%; + padding: var(--dropdown-item-padding, 6px 20px); + clear: both; + font-weight: normal; + line-height: var(--dropdown-item-line-height, 1.5); + text-align: inherit; + text-decoration: none; + white-space: nowrap; + border: 0; + background: transparent; + cursor: pointer; + transition: all var(--dropdown-item-transition-duration, 0.2s); + + &:focus { + outline: var(--dropdown-item-focus-outline, 2px solid transparent); + outline-offset: var(--dropdown-item-focus-outline-offset, -2px); + } + + &.dropdown-item-active { + // Active styling handled by themes + } + + &.dropdown-item-disabled { + pointer-events: none; + opacity: var(--dropdown-item-disabled-opacity, 0.5); + } +} + +.dropdown-divider { + height: 0; + margin: var(--dropdown-divider-margin, 4px 0); + overflow: hidden; + border-top: 1px solid var(--dropdown-divider-color, rgba(0, 0, 0, 0.15)); +} + +.dropdown-header { + display: block; + padding: var(--dropdown-header-padding, 4px 20px); + margin-bottom: 0; + font-size: var(--dropdown-header-font-size, 0.875rem); + font-weight: var(--dropdown-header-font-weight, 600); + line-height: var(--dropdown-header-line-height, 1.5); + white-space: nowrap; + opacity: var(--dropdown-header-opacity, 0.6); +} + +// MODAL (Structure only - overlay/backdrop handled separately) +.modal { + position: fixed; + top: 0; + left: 0; + z-index: var(--z-modal, 1050); + width: 100%; + height: 100%; + overflow-x: hidden; + overflow-y: auto; + outline: 0; + opacity: 0; + pointer-events: none; + transition: opacity var(--modal-transition-duration, 0.3s) var(--modal-transition-easing, ease); + + &.modal-show { + opacity: 1; + pointer-events: auto; + } +} + +.modal-dialog { + position: relative; + width: auto; + margin: var(--modal-margin, 16px); + pointer-events: none; + transform: translateY(-50px); + transition: transform var(--modal-transition-duration, 0.3s) var(--modal-transition-easing, ease); + + .modal-show & { + transform: translateY(0); + } + + @media (min-width: 576px) { + max-width: var(--modal-sm-max-width, 500px); + margin: var(--modal-margin-sm, 32px auto); + } + + &.modal-sm { + @media (min-width: 576px) { + max-width: var(--modal-sm-width, 300px); + } + } + + &.modal-lg { + @media (min-width: 992px) { + max-width: var(--modal-lg-width, 800px); + } + } + + &.modal-xl { + @media (min-width: 1200px) { + max-width: var(--modal-xl-width, 1140px); + } + } + + &.modal-fullscreen { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + + .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + } +} + +.modal-content { + position: relative; + display: flex; + flex-direction: column; + width: 100%; + pointer-events: auto; + background-clip: padding-box; + border: var(--modal-content-border, 1px solid rgba(0, 0, 0, 0.2)); + border-radius: var(--modal-content-border-radius, 6px); + outline: 0; +} + +.modal-backdrop { + position: fixed; + top: 0; + left: 0; + z-index: var(--z-modal-backdrop, 1040); + width: 100vw; + height: 100vh; + background-color: var(--modal-backdrop-bg, rgba(0, 0, 0, 0.5)); + opacity: 0; + transition: opacity var(--modal-backdrop-transition-duration, 0.15s) linear; + + &.modal-backdrop-show { + opacity: 1; + } +} + +.modal-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: var(--modal-header-padding, 16px 24px); + border-bottom: var(--modal-header-border, 1px solid rgba(0, 0, 0, 0.125)); + border-top-left-radius: inherit; + border-top-right-radius: inherit; + + .modal-title { + margin: 0; + line-height: var(--modal-title-line-height, 1.5); + font-size: var(--modal-title-font-size, 1.25rem); + font-weight: var(--modal-title-font-weight, 600); + } +} + +.modal-body { + position: relative; + flex: 1 1 auto; + padding: var(--modal-body-padding, 24px); +} + +.modal-footer { + display: flex; + align-items: center; + justify-content: flex-end; + gap: var(--modal-footer-gap, 8px); + padding: var(--modal-footer-padding, 16px 24px); + border-top: var(--modal-footer-border, 1px solid rgba(0, 0, 0, 0.125)); + border-bottom-left-radius: inherit; + border-bottom-right-radius: inherit; + + &.modal-footer-center { + justify-content: center; + } + + &.modal-footer-between { + justify-content: space-between; + } +} + +// ACCORDION +.accordion { + border-radius: var(--accordion-border-radius, 6px); + overflow: hidden; +} + +.accordion-item { + border: var(--accordion-item-border, 1px solid rgba(0, 0, 0, 0.125)); + + &:not(:first-child) { + border-top: none; + } + + &:first-child { + border-top-left-radius: var(--accordion-border-radius, 6px); + border-top-right-radius: var(--accordion-border-radius, 6px); + } + + &:last-child { + border-bottom-left-radius: var(--accordion-border-radius, 6px); + border-bottom-right-radius: var(--accordion-border-radius, 6px); + } +} + +.accordion-header { + margin-bottom: 0; +} + +.accordion-button { + position: relative; + display: flex; + align-items: center; + width: 100%; + padding: var(--accordion-button-padding, 16px 20px); + font-size: var(--accordion-button-font-size, 1rem); + font-weight: var(--accordion-button-font-weight, 500); + text-align: left; + background: transparent; + border: 0; + border-radius: 0; + overflow-anchor: none; + transition: all var(--accordion-button-transition-duration, 0.2s) var(--accordion-button-transition-easing, ease); + cursor: pointer; + + &:focus { + z-index: 3; + outline: var(--accordion-button-focus-outline, 2px solid transparent); + outline-offset: var(--accordion-button-focus-outline-offset, -2px); + } + + &::after { + flex-shrink: 0; + width: var(--accordion-icon-size, 16px); + height: var(--accordion-icon-size, 16px); + margin-left: auto; + content: ''; + background-image: var(--accordion-button-icon, url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3E%3Cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3E%3C/svg%3E")); + background-repeat: no-repeat; + background-size: var(--accordion-icon-size, 16px); + transition: transform var(--accordion-icon-transition-duration, 0.2s) var(--accordion-icon-transition-easing, ease); + } + + &:not(.accordion-button-collapsed)::after { + transform: rotate(180deg); + } +} + +.accordion-collapse { + overflow: hidden; + transition: height var(--accordion-collapse-transition-duration, 0.3s) var(--accordion-collapse-transition-easing, ease); +} + +.accordion-body { + padding: var(--accordion-body-padding, 16px 20px); +} + +// ACCESSIBILITY +@media (prefers-reduced-motion: reduce) { + .alert-close, + .tooltip, + .popover, + .dropdown-toggle::after, + .modal, + .modal-dialog, + .modal-backdrop, + .accordion-button, + .accordion-button::after, + .accordion-collapse { + transition: none; + } +} + +@media (prefers-contrast: high) { + .alert, + .popover, + .dropdown-menu, + .modal-content, + .accordion-item { + border-width: 2px; + } + + .alert-close:focus, + .dropdown-item:focus, + .accordion-button:focus { + outline-width: 3px; + } +} \ No newline at end of file diff --git a/projects/shared-ui/src/styles/commons/index.scss b/projects/shared-ui/src/styles/commons/index.scss new file mode 100644 index 0000000..42de605 --- /dev/null +++ b/projects/shared-ui/src/styles/commons/index.scss @@ -0,0 +1,11 @@ +// ========================================================================== +// COMMONS INDEX +// ========================================================================== +// Import all commons modules in the correct order +// Theme-agnostic styles that work across all themes +// ========================================================================== + +@import 'layouts'; +@import 'components'; +@import 'patterns'; +@import 'utilities'; \ No newline at end of file diff --git a/projects/shared-ui/src/styles/commons/layouts/_content-containers.scss b/projects/shared-ui/src/styles/commons/layouts/_content-containers.scss new file mode 100644 index 0000000..f6b7482 --- /dev/null +++ b/projects/shared-ui/src/styles/commons/layouts/_content-containers.scss @@ -0,0 +1,319 @@ +// ========================================================================== +// CONTENT CONTAINERS +// ========================================================================== +// Theme-agnostic content container structures +// Focus on layout, spacing, and behavior - not visual styling +// ========================================================================== + +// PAGE CONTAINERS +.page-container { + min-height: 100vh; + display: flex; + flex-direction: column; + + &.page-centered { + align-items: center; + justify-content: center; + } + + &.page-top-aligned { + justify-content: flex-start; + } +} + +.page-header { + flex-shrink: 0; + position: relative; + z-index: var(--z-page-header, 50); + + &.page-header-sticky { + position: sticky; + top: 0; + } + + &.page-header-fixed { + position: fixed; + top: 0; + left: 0; + right: 0; + } +} + +.page-content { + flex: 1; + display: flex; + flex-direction: column; + position: relative; +} + +.page-footer { + flex-shrink: 0; + margin-top: auto; +} + +// MAIN CONTENT AREAS +.main-content { + flex: 1; + width: 100%; + max-width: var(--content-max-width, none); + margin: 0 auto; + padding: var(--content-padding, 24px); + + &.main-content-narrow { + max-width: var(--content-max-width-narrow, 768px); + } + + &.main-content-wide { + max-width: var(--content-max-width-wide, 1400px); + } + + &.main-content-full { + max-width: none; + padding: 0; + } +} + +// CONTENT SECTIONS +.content-section { + margin-bottom: var(--section-spacing, 48px); + + &:last-child { + margin-bottom: 0; + } + + &.content-section-compact { + margin-bottom: var(--section-spacing-compact, 24px); + } + + &.content-section-spacious { + margin-bottom: var(--section-spacing-spacious, 72px); + } +} + +.section-header { + margin-bottom: var(--section-header-spacing, 24px); + + .section-title { + margin: 0 0 var(--section-title-spacing, 8px) 0; + font-size: var(--section-title-size, 1.5rem); + font-weight: var(--section-title-weight, 600); + } + + .section-subtitle { + margin: 0; + opacity: 0.7; + } + + .section-actions { + margin-top: var(--section-actions-spacing, 16px); + } +} + +.section-content { + position: relative; +} + +// ARTICLE CONTAINERS +.article-container { + max-width: var(--article-max-width, 65ch); + margin: 0 auto; + padding: var(--article-padding, 24px); + + .article-header { + margin-bottom: var(--article-header-spacing, 32px); + text-align: center; + + .article-title { + margin: 0 0 var(--article-title-spacing, 16px) 0; + font-size: var(--article-title-size, 2rem); + font-weight: var(--article-title-weight, 700); + } + + .article-meta { + margin-bottom: var(--article-meta-spacing, 24px); + opacity: 0.7; + } + } + + .article-content { + line-height: var(--article-line-height, 1.6); + + > * + * { + margin-top: var(--article-element-spacing, 1.5em); + } + } + + .article-footer { + margin-top: var(--article-footer-spacing, 48px); + padding-top: var(--article-footer-padding, 24px); + border-top: 1px solid var(--border-color, #e5e5e5); + } +} + +// SIDEBAR CONTAINERS +.content-with-sidebar { + display: flex; + gap: var(--sidebar-gap, 32px); + align-items: flex-start; + + .main-column { + flex: 1; + min-width: 0; // Prevents flex item overflow + } + + .sidebar-column { + flex-shrink: 0; + width: var(--sidebar-width, 300px); + } + + &.sidebar-left { + flex-direction: row; + } + + &.sidebar-right { + flex-direction: row-reverse; + } +} + +@media (max-width: 768px) { + .content-with-sidebar { + flex-direction: column; + gap: var(--sidebar-gap-mobile, 24px); + + .sidebar-column { + width: 100%; + } + + &.sidebar-right { + flex-direction: column; + } + } +} + +// CARD CONTAINERS +.card-container { + display: flex; + flex-direction: column; + position: relative; + word-wrap: break-word; + background-clip: border-box; + + .card-header { + flex-shrink: 0; + padding: var(--card-header-padding, 16px 24px); + border-bottom: 1px solid var(--border-color, transparent); + + &:first-child { + border-top-left-radius: inherit; + border-top-right-radius: inherit; + } + + &.card-header-borderless { + border-bottom: none; + } + } + + .card-body { + flex: 1; + padding: var(--card-body-padding, 24px); + + &.card-body-compact { + padding: var(--card-body-padding-compact, 16px); + } + + &.card-body-spacious { + padding: var(--card-body-padding-spacious, 32px); + } + } + + .card-footer { + flex-shrink: 0; + padding: var(--card-footer-padding, 16px 24px); + border-top: 1px solid var(--border-color, transparent); + + &:last-child { + border-bottom-left-radius: inherit; + border-bottom-right-radius: inherit; + } + + &.card-footer-borderless { + border-top: none; + } + } +} + +// SPLIT CONTAINERS +.split-container { + display: flex; + min-height: 0; // Allows flex children to shrink + + &.split-horizontal { + flex-direction: row; + } + + &.split-vertical { + flex-direction: column; + } + + .split-pane { + flex: 1; + overflow: auto; + position: relative; + } + + .split-resizer { + flex-shrink: 0; + background: var(--resizer-background, transparent); + position: relative; + z-index: var(--z-resizer, 10); + + &.split-resizer-horizontal { + width: var(--resizer-size, 4px); + cursor: ew-resize; + } + + &.split-resizer-vertical { + height: var(--resizer-size, 4px); + cursor: ns-resize; + } + + &:hover { + background: var(--resizer-background-hover, rgba(0, 0, 0, 0.1)); + } + } +} + +// SCROLLABLE CONTAINERS +.scrollable { + overflow: auto; + + &.scrollable-x { + overflow-x: auto; + overflow-y: hidden; + } + + &.scrollable-y { + overflow-y: auto; + overflow-x: hidden; + } + + &.scrollable-hidden { + overflow: hidden; + } +} + +// CENTERED CONTAINERS +.centered-container { + display: flex; + align-items: center; + justify-content: center; + min-height: var(--centered-min-height, 400px); + + &.centered-full-height { + min-height: 100vh; + } + + &.centered-content { + text-align: center; + } +} \ No newline at end of file diff --git a/projects/shared-ui/src/styles/commons/layouts/_dashboard-layouts.scss b/projects/shared-ui/src/styles/commons/layouts/_dashboard-layouts.scss new file mode 100644 index 0000000..42dfe41 --- /dev/null +++ b/projects/shared-ui/src/styles/commons/layouts/_dashboard-layouts.scss @@ -0,0 +1,323 @@ +// ========================================================================== +// DASHBOARD LAYOUTS +// ========================================================================== +// Theme-agnostic dashboard layout structures +// Visual styling handled by themes +// ========================================================================== + +@use '../../semantic' as semantic; + +// DASHBOARD CONTAINER +.dashboard-container { + display: grid; + grid-template-areas: + "sidebar header" + "sidebar content"; + grid-template-columns: var(--sidebar-width, #{semantic.$semantic-sizing-sidebar-expanded}) 1fr; + grid-template-rows: var(--header-height, #{semantic.$semantic-sizing-navbar-height}) 1fr; + height: 100vh; + overflow: hidden; +} + +// DASHBOARD HEADER +.dashboard-header { + grid-area: header; + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 var(--header-padding, #{semantic.$semantic-spacing-container-card-padding-lg}); + z-index: var(--z-header, 100); + position: relative; + + .header-title { + font-size: var(--header-title-size, 1.25rem); + font-weight: var(--header-title-weight, 600); + margin: 0; + } + + .header-actions { + display: flex; + align-items: center; + gap: var(--header-actions-gap, #{semantic.$semantic-spacing-component-padding-md}); + } +} + +// DASHBOARD SIDEBAR +.dashboard-sidebar { + grid-area: sidebar; + display: flex; + flex-direction: column; + overflow-y: auto; + z-index: var(--z-sidebar, 90); + position: relative; + + .sidebar-header { + padding: var(--sidebar-header-padding, #{semantic.$semantic-spacing-container-card-padding-lg}); + flex-shrink: 0; + } + + .sidebar-nav { + flex: 1; + padding: 0 var(--sidebar-nav-padding, #{semantic.$semantic-spacing-component-padding-md}); + overflow-y: auto; + } + + .sidebar-footer { + padding: var(--sidebar-footer-padding, #{semantic.$semantic-spacing-component-padding-md}); + flex-shrink: 0; + } + + // Sidebar state classes + &.sidebar-is-collapsed { + width: var(--sidebar-width-collapsed, #{semantic.$semantic-sizing-sidebar-collapsed}); + + .sidebar-text, + .sidebar-nav-text { + opacity: 0; + visibility: hidden; + transition: opacity var(--transition-duration, 0.2s) var(--transition-easing, ease); + } + + .sidebar-nav-item { + justify-content: center; + padding: #{semantic.$semantic-spacing-component-padding-sm}; + } + } + + &.sidebar-overlay-mode { + position: fixed; + top: 0; + left: 0; + bottom: 0; + width: var(--sidebar-width, #{semantic.$semantic-sizing-sidebar-expanded}); + z-index: var(--z-sidebar-overlay, 1000); + transform: translateX(-100%); + transition: transform var(--transition-duration, 0.3s) var(--transition-easing, ease); + + &.sidebar-open { + transform: translateX(0); + } + } + + &.sidebar-fixed-position { + position: fixed; + top: 0; + left: 0; + bottom: 0; + } +} + +// DASHBOARD CONTENT +.dashboard-content { + grid-area: content; + overflow-y: auto; + padding: var(--content-padding, #{semantic.$semantic-spacing-container-card-padding-lg}); + position: relative; + + &.dashboard-content-full { + padding: 0; + } + + &.dashboard-content-constrained { + max-width: var(--content-max-width, #{semantic.$semantic-sizing-content-wide}); + margin: 0 auto; + } + + // Content state classes + &.content-with-padding { + padding: var(--content-padding, #{semantic.$semantic-spacing-container-card-padding-lg}); + } + + &.content-is-scrollable { + overflow-y: auto; + overflow-x: hidden; + max-height: calc(100vh - var(--header-height, #{semantic.$semantic-sizing-navbar-height})); + scrollbar-width: thin; + scrollbar-color: var(--scrollbar-thumb, rgba(0, 0, 0, 0.2)) var(--scrollbar-track, transparent); + + // Webkit scrollbar styling + &::-webkit-scrollbar { + width: #{$base-spacing-2}; // 8px + height: #{$base-spacing-2}; + } + + &::-webkit-scrollbar-track { + background: var(--scrollbar-track, transparent); + border-radius: #{$base-border-radius-sm}; + } + + &::-webkit-scrollbar-thumb { + background: var(--scrollbar-thumb, rgba(0, 0, 0, 0.2)); + border-radius: #{$base-border-radius-sm}; + border: 1px solid var(--scrollbar-thumb-border, transparent); + + &:hover { + background: var(--scrollbar-thumb-hover, rgba(0, 0, 0, 0.3)); + } + + &:active { + background: var(--scrollbar-thumb-active, rgba(0, 0, 0, 0.4)); + } + } + + // Invisible scrollbar variant + &.scrollbar-invisible { + scrollbar-width: none; + -ms-overflow-style: none; + + &::-webkit-scrollbar { + display: none; + } + } + } + + &.content-is-centered { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + text-align: center; + } + + &.content-has-breadcrumbs { + .content-breadcrumbs { + margin-bottom: #{semantic.$semantic-spacing-content-paragraph}; + padding-bottom: #{semantic.$semantic-spacing-component-padding-sm}; + border-bottom: #{semantic.$semantic-border-divider-width} solid var(--content-breadcrumb-border, transparent); + } + } + + // Content header styling + .content-header { + margin-bottom: #{semantic.$semantic-spacing-layout-section-sm}; + + .content-title { + font-size: var(--content-title-size, 2rem); + font-weight: var(--content-title-weight, 600); + margin: 0 0 #{semantic.$semantic-spacing-component-padding-sm} 0; + line-height: var(--content-title-line-height, 1.2); + } + + .content-subtitle { + font-size: var(--content-subtitle-size, 1.125rem); + color: var(--content-subtitle-color, rgba(0, 0, 0, 0.6)); + margin: 0; + line-height: var(--content-subtitle-line-height, 1.4); + } + } + + // Content actions styling + .content-actions { + margin-top: #{semantic.$semantic-spacing-layout-section-sm}; + padding-top: #{semantic.$semantic-spacing-component-padding-md}; + border-top: #{semantic.$semantic-border-divider-width} solid var(--content-actions-border, transparent); + display: flex; + gap: #{semantic.$semantic-spacing-component-padding-sm}; + justify-content: flex-end; + align-items: center; + } +} + +// COLLAPSIBLE SIDEBAR VARIANT +.dashboard-container.sidebar-collapsed { + grid-template-columns: var(--sidebar-width-collapsed, 72px) 1fr; + + .dashboard-sidebar { + .sidebar-text { + display: none; + } + } +} + +// RESPONSIVE DASHBOARD +@media (max-width: 768px) { + .dashboard-container { + grid-template-areas: + "header" + "content"; + grid-template-columns: 1fr; + grid-template-rows: var(--header-height, 64px) 1fr; + } + + .dashboard-sidebar { + position: fixed; + top: var(--header-height, 64px); + left: 0; + bottom: 0; + width: var(--sidebar-width, 280px); + transform: translateX(-100%); + transition: transform var(--transition-duration, 0.3s) var(--transition-easing, ease); + z-index: var(--z-sidebar-mobile, 1000); + + &.sidebar-open { + transform: translateX(0); + } + } + + .dashboard-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + opacity: 0; + visibility: hidden; + transition: all var(--transition-duration, 0.3s) var(--transition-easing, ease); + z-index: var(--z-overlay, 999); + pointer-events: none; + + &.overlay-active { + opacity: 1; + visibility: visible; + pointer-events: all; + } + } +} + +// DASHBOARD GRID LAYOUTS +.dashboard-grid { + display: grid; + gap: var(--dashboard-grid-gap, 24px); + + &.grid-2-cols { + grid-template-columns: repeat(2, 1fr); + } + + &.grid-3-cols { + grid-template-columns: repeat(3, 1fr); + } + + &.grid-4-cols { + grid-template-columns: repeat(4, 1fr); + } + + &.grid-auto-fill { + grid-template-columns: repeat(auto-fill, minmax(var(--grid-min-width, 300px), 1fr)); + } + + &.grid-auto-fit { + grid-template-columns: repeat(auto-fit, minmax(var(--grid-min-width, 300px), 1fr)); + } +} + +// RESPONSIVE GRID +@media (max-width: 1200px) { + .dashboard-grid.grid-4-cols { + grid-template-columns: repeat(3, 1fr); + } +} + +@media (max-width: 900px) { + .dashboard-grid.grid-3-cols, + .dashboard-grid.grid-4-cols { + grid-template-columns: repeat(2, 1fr); + } +} + +@media (max-width: 600px) { + .dashboard-grid.grid-2-cols, + .dashboard-grid.grid-3-cols, + .dashboard-grid.grid-4-cols { + grid-template-columns: 1fr; + } +} \ No newline at end of file diff --git a/projects/shared-ui/src/styles/commons/layouts/_grid-systems.scss b/projects/shared-ui/src/styles/commons/layouts/_grid-systems.scss new file mode 100644 index 0000000..e8a640d --- /dev/null +++ b/projects/shared-ui/src/styles/commons/layouts/_grid-systems.scss @@ -0,0 +1,304 @@ +// ========================================================================== +// GRID SYSTEMS +// ========================================================================== +// Flexible grid system supporting 12-column, CSS Grid, and Flexbox layouts +// Theme-agnostic structural definitions +// ========================================================================== + +// CSS VARIABLES - Using base design tokens +:root { + --grid-columns: 12; + --grid-gap: #{$base-spacing-6}; // 24px -> 1.5rem + --grid-gap-sm: #{$base-spacing-4}; // 16px -> 1rem + --grid-gap-lg: #{$base-spacing-8}; // 32px -> 2rem + --grid-max-width: #{$base-sizing-max-width-screen-xl}; // 1280px + --grid-padding: #{$base-spacing-6}; // 24px -> 1.5rem +} + +// CONTAINER SYSTEM +.container { + width: 100%; + max-width: var(--grid-max-width); + margin: 0 auto; + padding: 0 var(--grid-padding); + + &.container-fluid { + max-width: none; + } + + &.container-sm { + max-width: #{$base-breakpoint-sm}; + } + + &.container-md { + max-width: #{$base-breakpoint-md}; + } + + &.container-lg { + max-width: #{$base-breakpoint-lg}; + } + + &.container-xl { + max-width: #{$base-breakpoint-xl}; + } + + &.container-xxl { + max-width: #{$base-breakpoint-2xl}; + } + + // Container state classes + &.container-is-fluid { + max-width: none; + width: 100%; + } + + &.container-no-gutters { + padding-left: 0; + padding-right: 0; + } + + &.container-max-sm, + &.container-max-md, + &.container-max-lg, + &.container-max-xl, + &.container-max-xxl { + // These classes are applied dynamically by the component + // and use the existing container-* classes above + } +} + +// FLEXBOX GRID SYSTEM +.row { + display: flex; + flex-wrap: wrap; + margin: calc(var(--grid-gap) / -2); + + &.row-no-gutters { + margin: 0; + + > .col, + > [class*="col-"] { + padding: 0; + } + } + + &.row-gap-sm { + margin: calc(var(--grid-gap-sm) / -2); + } + + &.row-gap-lg { + margin: calc(var(--grid-gap-lg) / -2); + } + + // Row state classes from components + &.row-without-gutters { + margin: 0; + + > .col, + > [class*="col-"] { + padding: 0; + } + } + + &.row-justify-start { justify-content: flex-start; } + &.row-justify-center { justify-content: center; } + &.row-justify-end { justify-content: flex-end; } + &.row-justify-around { justify-content: space-around; } + &.row-justify-between { justify-content: space-between; } + &.row-justify-evenly { justify-content: space-evenly; } + + &.row-align-start { align-items: flex-start; } + &.row-align-center { align-items: center; } + &.row-align-end { align-items: flex-end; } + &.row-align-stretch { align-items: stretch; } + &.row-align-baseline { align-items: baseline; } +} + +.col { + flex: 1 0 0%; + padding: calc(var(--grid-gap) / 2); +} + +// RESPONSIVE COLUMNS +@for $i from 1 through 12 { + .col-#{$i} { + flex: 0 0 auto; + width: percentage($i / 12); + padding: calc(var(--grid-gap) / 2); + } +} + +// BREAKPOINT-SPECIFIC COLUMNS +@media (min-width: 576px) { + @for $i from 1 through 12 { + .col-sm-#{$i} { + flex: 0 0 auto; + width: percentage($i / 12); + } + } + .col-sm { + flex: 1 0 0%; + } +} + +@media (min-width: 768px) { + @for $i from 1 through 12 { + .col-md-#{$i} { + flex: 0 0 auto; + width: percentage($i / 12); + } + } + .col-md { + flex: 1 0 0%; + } +} + +@media (min-width: 992px) { + @for $i from 1 through 12 { + .col-lg-#{$i} { + flex: 0 0 auto; + width: percentage($i / 12); + } + } + .col-lg { + flex: 1 0 0%; + } +} + +@media (min-width: 1200px) { + @for $i from 1 through 12 { + .col-xl-#{$i} { + flex: 0 0 auto; + width: percentage($i / 12); + } + } + .col-xl { + flex: 1 0 0%; + } +} + +// CSS GRID SYSTEM +.grid { + display: grid; + gap: var(--grid-gap); + + &.grid-12 { + grid-template-columns: repeat(12, 1fr); + } + + &.grid-auto { + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); + } + + &.grid-auto-fill { + grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); + } +} + +// GRID SPANS +@for $i from 1 through 12 { + .span-#{$i} { + grid-column: span #{$i}; + } +} + +// GRID POSITIONING +@for $i from 1 through 12 { + .col-start-#{$i} { + grid-column-start: #{$i}; + } + + .col-end-#{$i} { + grid-column-end: #{$i}; + } + + .row-start-#{$i} { + grid-row-start: #{$i}; + } + + .row-end-#{$i} { + grid-row-end: #{$i}; + } +} + +// RESPONSIVE GRID SPANS +@media (min-width: 576px) { + @for $i from 1 through 12 { + .span-sm-#{$i} { + grid-column: span #{$i}; + } + } +} + +@media (min-width: 768px) { + @for $i from 1 through 12 { + .span-md-#{$i} { + grid-column: span #{$i}; + } + } +} + +@media (min-width: 992px) { + @for $i from 1 through 12 { + .span-lg-#{$i} { + grid-column: span #{$i}; + } + } +} + +@media (min-width: 1200px) { + @for $i from 1 through 12 { + .span-xl-#{$i} { + grid-column: span #{$i}; + } + } +} + +// ALIGNMENT UTILITIES +.justify-start { justify-content: start; } +.justify-end { justify-content: end; } +.justify-center { justify-content: center; } +.justify-between { justify-content: space-between; } +.justify-around { justify-content: space-around; } +.justify-evenly { justify-content: space-evenly; } + +.align-start { align-content: start; } +.align-end { align-content: end; } +.align-center { align-content: center; } +.align-between { align-content: space-between; } +.align-around { align-content: space-around; } +.align-evenly { align-content: space-evenly; } + +.items-start { align-items: start; } +.items-end { align-items: end; } +.items-center { align-items: center; } +.items-baseline { align-items: baseline; } +.items-stretch { align-items: stretch; } + +.self-start { align-self: start; } +.self-end { align-self: end; } +.self-center { align-self: center; } +.self-baseline { align-self: baseline; } +.self-stretch { align-self: stretch; } + +// RESPONSIVE CONTAINERS +@media (max-width: 575px) { + .container { + padding: 0 16px; + } +} + +@media (max-width: 767px) { + .row { + margin: calc(var(--grid-gap-sm) / -2); + } + + .col, + [class*="col-"] { + padding: calc(var(--grid-gap-sm) / 2); + } + + .grid { + gap: var(--grid-gap-sm); + } +} \ No newline at end of file diff --git a/projects/shared-ui/src/styles/commons/layouts/_index.scss b/projects/shared-ui/src/styles/commons/layouts/_index.scss new file mode 100644 index 0000000..1bed3b7 --- /dev/null +++ b/projects/shared-ui/src/styles/commons/layouts/_index.scss @@ -0,0 +1,13 @@ +// ========================================================================== +// COMMONS LAYOUTS INDEX +// ========================================================================== +// Import all layout-related commons files +// Theme-agnostic structural definitions +// ========================================================================== + +@import 'dashboard-layouts'; +@import 'grid-systems'; +@import 'content-containers'; +@import 'page-templates'; +@import 'responsive-layouts'; +@import 'layout-system'; \ No newline at end of file diff --git a/projects/shared-ui/src/styles/commons/layouts/_layout-system.scss b/projects/shared-ui/src/styles/commons/layouts/_layout-system.scss new file mode 100644 index 0000000..525c832 --- /dev/null +++ b/projects/shared-ui/src/styles/commons/layouts/_layout-system.scss @@ -0,0 +1,187 @@ +// ========================================================================== +// LAYOUT SYSTEM +// ========================================================================== +// Core layout utilities and patterns for the application shell +// ========================================================================== + +// Layout variables +:root { + --header-height: 64px; + --sidenav-width-expanded: 240px; + --sidenav-width-rail: 64px; + --sidenav-width-hidden: 0px; +} + +// ========================================================================== +// LAYOUT CONTAINERS +// ========================================================================== + +.layout-container { + width: 100%; + height: 100vh; + overflow: hidden; + display: flex; + flex-direction: column; +} + +.layout-header { + position: fixed; + top: 0; + left: 0; + right: 0; + height: var(--header-height); + z-index: 1000; + background-color: var(--surface-elevated, #ffffff); + border-bottom: 1px solid var(--border-secondary, #e5e5e5); +} + +.layout-body { + flex: 1; + display: flex; + margin-top: var(--header-height); + overflow: hidden; +} + +.layout-sidebar { + flex-shrink: 0; + height: 100%; + background-color: var(--surface-elevated, #ffffff); + border-right: 1px solid var(--border-secondary, #e5e5e5); + transition: width 0.3s cubic-bezier(0.4, 0, 0.2, 1); + + &.sidebar-expanded { + width: var(--sidenav-width-expanded); + } + + &.sidebar-rail { + width: var(--sidenav-width-rail); + } + + &.sidebar-hidden { + width: var(--sidenav-width-hidden); + } +} + +.layout-main { + flex: 1; + overflow: hidden; + display: flex; + flex-direction: column; +} + +.layout-content { + flex: 1; + overflow: auto; + padding: 1.5rem; + background-color: var(--surface-primary, #fafafa); +} + +// ========================================================================== +// RESPONSIVE LAYOUT UTILITIES +// ========================================================================== + +@media (max-width: 768px) { + .layout-sidebar { + position: fixed; + top: var(--header-height); + left: 0; + height: calc(100vh - var(--header-height)); + z-index: 900; + transform: translateX(-100%); + transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1); + + &.sidebar-visible { + transform: translateX(0); + width: 280px; + box-shadow: 4px 0 24px rgba(0, 0, 0, 0.15); + } + } + + .layout-main { + margin-left: 0 !important; + } + + .layout-content { + padding: 1rem; + } +} + +// ========================================================================== +// LAYOUT STATE UTILITIES +// ========================================================================== + +.layout-no-scroll { + overflow: hidden; +} + +.layout-with-sidebar-expanded .layout-main { + margin-left: var(--sidenav-width-expanded); +} + +.layout-with-sidebar-rail .layout-main { + margin-left: var(--sidenav-width-rail); +} + +.layout-with-sidebar-hidden .layout-main { + margin-left: var(--sidenav-width-hidden); +} + +// ========================================================================== +// LAYOUT ANIMATIONS +// ========================================================================== + +@keyframes slideInFromLeft { + from { + transform: translateX(-100%); + opacity: 0; + } + to { + transform: translateX(0); + opacity: 1; + } +} + +@keyframes slideOutToLeft { + from { + transform: translateX(0); + opacity: 1; + } + to { + transform: translateX(-100%); + opacity: 0; + } +} + +.layout-animation-enter { + animation: slideInFromLeft 0.3s cubic-bezier(0.4, 0, 0.2, 1); +} + +.layout-animation-leave { + animation: slideOutToLeft 0.3s cubic-bezier(0.4, 0, 0.2, 1); +} + +// ========================================================================== +// LAYOUT FOCUS MANAGEMENT +// ========================================================================== + +.layout-focus-trap { + position: relative; +} + +.layout-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.5); + z-index: 800; + opacity: 0; + visibility: hidden; + transition: all 0.3s ease-in-out; + + &.active { + opacity: 1; + visibility: visible; + } +} \ No newline at end of file diff --git a/projects/shared-ui/src/styles/commons/layouts/_page-templates.scss b/projects/shared-ui/src/styles/commons/layouts/_page-templates.scss new file mode 100644 index 0000000..c96ec69 --- /dev/null +++ b/projects/shared-ui/src/styles/commons/layouts/_page-templates.scss @@ -0,0 +1,352 @@ +// ========================================================================== +// PAGE TEMPLATES +// ========================================================================== +// Common page layout templates for different application pages +// Structural definitions without visual theming +// ========================================================================== + +// LANDING PAGE TEMPLATE +.landing-page { + display: flex; + flex-direction: column; + min-height: 100vh; + + .landing-hero { + flex-shrink: 0; + display: flex; + align-items: center; + justify-content: center; + min-height: var(--hero-min-height, 60vh); + text-align: center; + position: relative; + overflow: hidden; + + .hero-content { + max-width: var(--hero-content-max-width, 800px); + padding: var(--hero-content-padding, 48px 24px); + z-index: 2; + position: relative; + } + + .hero-background { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 1; + } + } + + .landing-features { + flex-shrink: 0; + padding: var(--features-padding, 80px 24px); + + .features-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: var(--features-gap, 48px); + max-width: var(--features-max-width, 1200px); + margin: 0 auto; + } + } + + .landing-cta { + flex-shrink: 0; + text-align: center; + padding: var(--cta-padding, 80px 24px); + } +} + +// DASHBOARD PAGE TEMPLATE +.dashboard-page { + display: flex; + flex-direction: column; + height: 100vh; + + .dashboard-nav { + flex-shrink: 0; + z-index: var(--z-nav, 100); + } + + .dashboard-body { + flex: 1; + display: flex; + overflow: hidden; + } + + .dashboard-main { + flex: 1; + display: flex; + flex-direction: column; + overflow: hidden; + } +} + +// PROFILE PAGE TEMPLATE +.profile-page { + max-width: var(--profile-max-width, 1000px); + margin: 0 auto; + padding: var(--profile-padding, 24px); + + .profile-header { + display: flex; + align-items: flex-start; + gap: var(--profile-header-gap, 24px); + margin-bottom: var(--profile-header-spacing, 48px); + + .profile-avatar { + flex-shrink: 0; + width: var(--profile-avatar-size, 120px); + height: var(--profile-avatar-size, 120px); + border-radius: var(--profile-avatar-radius, 50%); + overflow: hidden; + } + + .profile-info { + flex: 1; + min-width: 0; + + .profile-name { + margin: 0 0 var(--profile-name-spacing, 8px) 0; + font-size: var(--profile-name-size, 2rem); + font-weight: var(--profile-name-weight, 600); + } + + .profile-bio { + margin: 0 0 var(--profile-bio-spacing, 16px) 0; + opacity: 0.7; + } + + .profile-actions { + display: flex; + gap: var(--profile-actions-gap, 12px); + flex-wrap: wrap; + } + } + } + + .profile-content { + display: grid; + grid-template-columns: 2fr 1fr; + gap: var(--profile-content-gap, 48px); + align-items: flex-start; + + .profile-main { + min-width: 0; + } + + .profile-sidebar { + min-width: 0; + } + } +} + +@media (max-width: 768px) { + .profile-page { + .profile-header { + flex-direction: column; + text-align: center; + + .profile-info { + text-align: center; + } + } + + .profile-content { + grid-template-columns: 1fr; + gap: var(--profile-content-gap-mobile, 32px); + } + } +} + +// SETTINGS PAGE TEMPLATE +.settings-page { + max-width: var(--settings-max-width, 800px); + margin: 0 auto; + padding: var(--settings-padding, 24px); + + .settings-nav { + margin-bottom: var(--settings-nav-spacing, 32px); + + .nav-tabs { + display: flex; + gap: var(--nav-tabs-gap, 24px); + border-bottom: 1px solid var(--border-color, #e5e5e5); + + .nav-tab { + padding: var(--nav-tab-padding, 12px 0); + border-bottom: 2px solid transparent; + cursor: pointer; + transition: all var(--transition-duration, 0.2s); + + &.nav-tab-active { + border-bottom-color: var(--primary-color, #007bff); + } + } + } + } + + .settings-content { + .settings-section { + margin-bottom: var(--settings-section-spacing, 48px); + + &:last-child { + margin-bottom: 0; + } + + .section-title { + margin: 0 0 var(--section-title-spacing, 24px) 0; + font-size: var(--section-title-size, 1.25rem); + font-weight: var(--section-title-weight, 600); + } + + .section-description { + margin: 0 0 var(--section-description-spacing, 24px) 0; + opacity: 0.7; + } + + .setting-item { + display: flex; + justify-content: space-between; + align-items: flex-start; + padding: var(--setting-item-padding, 16px 0); + border-bottom: 1px solid var(--border-color-light, #f0f0f0); + + &:last-child { + border-bottom: none; + } + + .setting-info { + flex: 1; + margin-right: var(--setting-info-spacing, 24px); + + .setting-label { + margin: 0 0 var(--setting-label-spacing, 4px) 0; + font-weight: var(--setting-label-weight, 500); + } + + .setting-description { + margin: 0; + opacity: 0.7; + font-size: var(--setting-description-size, 0.875rem); + } + } + + .setting-control { + flex-shrink: 0; + } + } + } + } +} + +// ERROR PAGE TEMPLATE +.error-page { + display: flex; + align-items: center; + justify-content: center; + min-height: 100vh; + text-align: center; + padding: var(--error-page-padding, 24px); + + .error-content { + max-width: var(--error-content-max-width, 600px); + + .error-code { + font-size: var(--error-code-size, 6rem); + font-weight: var(--error-code-weight, 700); + line-height: 1; + margin: 0 0 var(--error-code-spacing, 24px) 0; + } + + .error-title { + font-size: var(--error-title-size, 2rem); + font-weight: var(--error-title-weight, 600); + margin: 0 0 var(--error-title-spacing, 16px) 0; + } + + .error-message { + margin: 0 0 var(--error-message-spacing, 32px) 0; + opacity: 0.7; + } + + .error-actions { + display: flex; + justify-content: center; + gap: var(--error-actions-gap, 16px); + flex-wrap: wrap; + } + } +} + +// AUTH PAGE TEMPLATE +.auth-page { + display: flex; + min-height: 100vh; + + .auth-visual { + flex: 1; + display: none; + position: relative; + overflow: hidden; + + @media (min-width: 768px) { + display: flex; + } + + .auth-visual-content { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + text-align: center; + z-index: 2; + } + + .auth-visual-background { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 1; + } + } + + .auth-form-container { + flex-shrink: 0; + width: 100%; + max-width: var(--auth-form-max-width, 480px); + display: flex; + align-items: center; + justify-content: center; + padding: var(--auth-form-padding, 48px 24px); + + .auth-form { + width: 100%; + max-width: var(--auth-form-width, 400px); + + .auth-header { + text-align: center; + margin-bottom: var(--auth-header-spacing, 48px); + + .auth-title { + margin: 0 0 var(--auth-title-spacing, 16px) 0; + font-size: var(--auth-title-size, 2rem); + font-weight: var(--auth-title-weight, 600); + } + + .auth-subtitle { + margin: 0; + opacity: 0.7; + } + } + + .auth-footer { + text-align: center; + margin-top: var(--auth-footer-spacing, 32px); + } + } + } +} \ No newline at end of file diff --git a/projects/shared-ui/src/styles/commons/layouts/_responsive-layouts.scss b/projects/shared-ui/src/styles/commons/layouts/_responsive-layouts.scss new file mode 100644 index 0000000..dd96a5a --- /dev/null +++ b/projects/shared-ui/src/styles/commons/layouts/_responsive-layouts.scss @@ -0,0 +1,356 @@ +// ========================================================================== +// RESPONSIVE LAYOUTS +// ========================================================================== +// Responsive layout utilities and patterns +// Mobile-first approach with progressive enhancement +// ========================================================================== + +// RESPONSIVE BREAKPOINTS (from base/_breakpoints.scss) +$breakpoints: ( + xs: 0, + sm: 576px, + md: 768px, + lg: 992px, + xl: 1200px, + xxl: 1400px +) !default; + +// RESPONSIVE UTILITIES +.d-none { display: none !important; } +.d-block { display: block !important; } +.d-flex { display: flex !important; } +.d-grid { display: grid !important; } +.d-inline { display: inline !important; } +.d-inline-block { display: inline-block !important; } +.d-inline-flex { display: inline-flex !important; } + +// RESPONSIVE DISPLAY UTILITIES +@media (max-width: 575px) { + .d-xs-none { display: none !important; } + .d-xs-block { display: block !important; } + .d-xs-flex { display: flex !important; } + .d-xs-grid { display: grid !important; } + .d-xs-inline { display: inline !important; } + .d-xs-inline-block { display: inline-block !important; } + .d-xs-inline-flex { display: inline-flex !important; } +} + +@media (min-width: 576px) { + .d-sm-none { display: none !important; } + .d-sm-block { display: block !important; } + .d-sm-flex { display: flex !important; } + .d-sm-grid { display: grid !important; } + .d-sm-inline { display: inline !important; } + .d-sm-inline-block { display: inline-block !important; } + .d-sm-inline-flex { display: inline-flex !important; } +} + +@media (min-width: 768px) { + .d-md-none { display: none !important; } + .d-md-block { display: block !important; } + .d-md-flex { display: flex !important; } + .d-md-grid { display: grid !important; } + .d-md-inline { display: inline !important; } + .d-md-inline-block { display: inline-block !important; } + .d-md-inline-flex { display: inline-flex !important; } +} + +@media (min-width: 992px) { + .d-lg-none { display: none !important; } + .d-lg-block { display: block !important; } + .d-lg-flex { display: flex !important; } + .d-lg-grid { display: grid !important; } + .d-lg-inline { display: inline !important; } + .d-lg-inline-block { display: inline-block !important; } + .d-lg-inline-flex { display: inline-flex !important; } +} + +@media (min-width: 1200px) { + .d-xl-none { display: none !important; } + .d-xl-block { display: block !important; } + .d-xl-flex { display: flex !important; } + .d-xl-grid { display: grid !important; } + .d-xl-inline { display: inline !important; } + .d-xl-inline-block { display: inline-block !important; } + .d-xl-inline-flex { display: inline-flex !important; } +} + +// RESPONSIVE FLEX DIRECTION +.flex-column { flex-direction: column !important; } +.flex-row { flex-direction: row !important; } +.flex-column-reverse { flex-direction: column-reverse !important; } +.flex-row-reverse { flex-direction: row-reverse !important; } + +@media (max-width: 575px) { + .flex-xs-column { flex-direction: column !important; } + .flex-xs-row { flex-direction: row !important; } + .flex-xs-column-reverse { flex-direction: column-reverse !important; } + .flex-xs-row-reverse { flex-direction: row-reverse !important; } +} + +@media (min-width: 576px) { + .flex-sm-column { flex-direction: column !important; } + .flex-sm-row { flex-direction: row !important; } + .flex-sm-column-reverse { flex-direction: column-reverse !important; } + .flex-sm-row-reverse { flex-direction: row-reverse !important; } +} + +@media (min-width: 768px) { + .flex-md-column { flex-direction: column !important; } + .flex-md-row { flex-direction: row !important; } + .flex-md-column-reverse { flex-direction: column-reverse !important; } + .flex-md-row-reverse { flex-direction: row-reverse !important; } +} + +// RESPONSIVE LAYOUT PATTERNS +.mobile-stack { + @media (max-width: 767px) { + flex-direction: column !important; + + > * { + width: 100% !important; + margin-bottom: var(--mobile-stack-gap, 16px); + + &:last-child { + margin-bottom: 0; + } + } + } +} + +.tablet-stack { + @media (max-width: 991px) { + flex-direction: column !important; + + > * { + width: 100% !important; + margin-bottom: var(--tablet-stack-gap, 20px); + + &:last-child { + margin-bottom: 0; + } + } + } +} + +// RESPONSIVE SPACING +.p-responsive { + padding: var(--spacing-mobile, 16px); + + @media (min-width: 768px) { + padding: var(--spacing-tablet, 24px); + } + + @media (min-width: 1200px) { + padding: var(--spacing-desktop, 32px); + } +} + +.m-responsive { + margin: var(--spacing-mobile, 16px); + + @media (min-width: 768px) { + margin: var(--spacing-tablet, 24px); + } + + @media (min-width: 1200px) { + margin: var(--spacing-desktop, 32px); + } +} + +// RESPONSIVE TEXT ALIGNMENT +.text-center { text-align: center !important; } +.text-left { text-align: left !important; } +.text-right { text-align: right !important; } + +@media (max-width: 575px) { + .text-xs-center { text-align: center !important; } + .text-xs-left { text-align: left !important; } + .text-xs-right { text-align: right !important; } +} + +@media (min-width: 576px) { + .text-sm-center { text-align: center !important; } + .text-sm-left { text-align: left !important; } + .text-sm-right { text-align: right !important; } +} + +@media (min-width: 768px) { + .text-md-center { text-align: center !important; } + .text-md-left { text-align: left !important; } + .text-md-right { text-align: right !important; } +} + +// RESPONSIVE LAYOUT COMPONENTS +.responsive-sidebar { + display: flex; + gap: var(--sidebar-gap, 32px); + + .sidebar-main { + flex: 1; + min-width: 0; + } + + .sidebar-aside { + flex-shrink: 0; + width: var(--sidebar-width, 300px); + } + + @media (max-width: 991px) { + flex-direction: column; + gap: var(--sidebar-gap-mobile, 24px); + + .sidebar-aside { + width: 100%; + order: -1; // Move sidebar to top on mobile + } + + &.sidebar-bottom { + .sidebar-aside { + order: 1; // Keep sidebar at bottom + } + } + } +} + +.responsive-cards { + display: grid; + gap: var(--cards-gap, 24px); + grid-template-columns: 1fr; + + @media (min-width: 576px) { + grid-template-columns: repeat(2, 1fr); + } + + @media (min-width: 768px) { + grid-template-columns: repeat(3, 1fr); + } + + @media (min-width: 1200px) { + grid-template-columns: repeat(4, 1fr); + } + + &.cards-auto-fit { + grid-template-columns: repeat(auto-fit, minmax(var(--card-min-width, 280px), 1fr)); + } + + &.cards-2-max { + @media (min-width: 768px) { + grid-template-columns: repeat(2, 1fr); + } + } + + &.cards-3-max { + @media (min-width: 1200px) { + grid-template-columns: repeat(3, 1fr); + } + } +} + +.responsive-hero { + padding: var(--hero-padding-mobile, 48px 16px); + text-align: center; + + @media (min-width: 768px) { + padding: var(--hero-padding-tablet, 80px 24px); + } + + @media (min-width: 1200px) { + padding: var(--hero-padding-desktop, 120px 32px); + } + + .hero-title { + font-size: var(--hero-title-mobile, 2rem); + + @media (min-width: 768px) { + font-size: var(--hero-title-tablet, 3rem); + } + + @media (min-width: 1200px) { + font-size: var(--hero-title-desktop, 4rem); + } + } + + .hero-subtitle { + font-size: var(--hero-subtitle-mobile, 1rem); + + @media (min-width: 768px) { + font-size: var(--hero-subtitle-tablet, 1.25rem); + } + + @media (min-width: 1200px) { + font-size: var(--hero-subtitle-desktop, 1.5rem); + } + } +} + +// RESPONSIVE NAVIGATION +.responsive-nav { + display: flex; + align-items: center; + justify-content: space-between; + padding: var(--nav-padding, 16px 24px); + + .nav-brand { + flex-shrink: 0; + } + + .nav-menu { + display: flex; + align-items: center; + gap: var(--nav-menu-gap, 24px); + + @media (max-width: 767px) { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + flex-direction: column; + justify-content: center; + background: var(--nav-mobile-bg, white); + transform: translateX(-100%); + transition: transform 0.3s ease; + z-index: var(--z-nav-mobile, 1000); + + &.nav-menu-open { + transform: translateX(0); + } + } + } + + .nav-toggle { + display: none; + flex-direction: column; + gap: 4px; + padding: 8px; + border: none; + background: transparent; + cursor: pointer; + + @media (max-width: 767px) { + display: flex; + } + + .nav-toggle-bar { + width: 24px; + height: 2px; + background: currentColor; + transition: all 0.3s ease; + } + + &.nav-toggle-active { + .nav-toggle-bar:nth-child(1) { + transform: rotate(45deg) translate(5px, 5px); + } + + .nav-toggle-bar:nth-child(2) { + opacity: 0; + } + + .nav-toggle-bar:nth-child(3) { + transform: rotate(-45deg) translate(7px, -6px); + } + } + } +} \ No newline at end of file diff --git a/projects/shared-ui/src/styles/commons/patterns/_content-patterns.scss b/projects/shared-ui/src/styles/commons/patterns/_content-patterns.scss new file mode 100644 index 0000000..984b312 --- /dev/null +++ b/projects/shared-ui/src/styles/commons/patterns/_content-patterns.scss @@ -0,0 +1,1003 @@ +// ========================================================================== +// CONTENT PATTERNS +// ========================================================================== +// Theme-agnostic content layout patterns and structures +// Visual styling handled by themes - includes component-specific classes +// ========================================================================== + +// COMPONENT-SPECIFIC CONTENT PATTERNS +// These classes are used by our Angular components + +// ARTICLE PATTERNS +.content-article { + display: block; + width: 100%; + max-width: var(--article-max-width, #{$semantic-sizing-content-medium}); + margin: 0 auto; + + &.article-is-featured { + max-width: var(--article-featured-max-width, #{$semantic-sizing-content-wide}); + + .article-title { + font-size: var(--article-featured-title-size, 3rem); + line-height: var(--article-featured-title-line-height, 1.1); + } + } + + &.article-is-compact { + max-width: var(--article-compact-max-width, #{$semantic-sizing-content-narrow}); + + .article-header { + margin-bottom: #{$semantic-spacing-component-padding-md}; + } + + .article-title { + font-size: var(--article-compact-title-size, 1.5rem); + } + } + + &.article-has-lead-image { + .article-lead-image { + margin-bottom: #{$semantic-spacing-content-paragraph}; + + img { + width: 100%; + height: auto; + display: block; + border-radius: var(--article-image-border-radius, #{$semantic-border-card-radius}); + } + } + } + + // Article structure + .article-header { + margin-bottom: #{$semantic-spacing-layout-section-sm}; + + .article-title { + font-size: var(--article-title-size, 2.5rem); + font-weight: var(--article-title-weight, 700); + line-height: var(--article-title-line-height, 1.2); + margin: 0 0 #{$semantic-spacing-component-padding-sm} 0; + } + + .article-subtitle { + font-size: var(--article-subtitle-size, 1.25rem); + font-weight: var(--article-subtitle-weight, 400); + line-height: var(--article-subtitle-line-height, 1.4); + margin: 0 0 #{$semantic-spacing-component-padding-md} 0; + color: var(--article-subtitle-color, rgba(0, 0, 0, 0.6)); + } + + .article-meta { + display: flex; + flex-wrap: wrap; + gap: #{$semantic-spacing-component-padding-sm}; + align-items: center; + font-size: var(--article-meta-size, 0.875rem); + color: var(--article-meta-color, rgba(0, 0, 0, 0.5)); + } + } + + .article-content { + line-height: var(--article-content-line-height, 1.7); + font-size: var(--article-content-size, 1rem); + + > * + * { + margin-top: #{$semantic-spacing-content-paragraph}; + } + } + + .article-footer { + margin-top: #{$semantic-spacing-layout-section-sm}; + padding-top: #{$semantic-spacing-component-padding-md}; + border-top: #{$semantic-border-divider-width} solid var(--article-footer-border, transparent); + } +} + +// HERO PATTERNS +.content-hero { + position: relative; + display: flex; + align-items: center; + justify-content: center; + min-height: var(--hero-min-height, 60vh); + overflow: hidden; + + &.hero-is-fullscreen { + min-height: 100vh; + height: 100vh; + } + + &.hero-content-centered { + text-align: center; + + .hero-content { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + } + } + + &.hero-has-background { + .hero-background { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 1; + + .hero-bg-image { + width: 100%; + height: 100%; + object-fit: cover; + object-position: center; + } + } + } + + &.hero-has-overlay-effect { + .hero-overlay { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: var(--hero-overlay-color, rgba(0, 0, 0, 0.3)); + z-index: 2; + } + } + + .hero-content { + position: relative; + z-index: 3; + padding: #{$semantic-spacing-layout-section-md}; + max-width: var(--hero-content-max-width, #{$semantic-sizing-content-medium}); + width: 100%; + + .hero-title { + font-size: var(--hero-title-size, 3.5rem); + font-weight: var(--hero-title-weight, 800); + line-height: var(--hero-title-line-height, 1.1); + margin: 0 0 #{$semantic-spacing-component-padding-lg} 0; + } + + .hero-subtitle { + font-size: var(--hero-subtitle-size, 1.5rem); + font-weight: var(--hero-subtitle-weight, 400); + line-height: var(--hero-subtitle-line-height, 1.3); + margin: 0 0 #{$semantic-spacing-component-padding-md} 0; + color: var(--hero-subtitle-color, rgba(0, 0, 0, 0.7)); + } + + .hero-description { + font-size: var(--hero-description-size, 1.125rem); + line-height: var(--hero-description-line-height, 1.6); + margin: 0 0 #{$semantic-spacing-layout-section-sm} 0; + color: var(--hero-description-color, rgba(0, 0, 0, 0.8)); + } + + .hero-actions { + display: flex; + gap: #{$semantic-spacing-component-padding-md}; + flex-wrap: wrap; + align-items: center; + } + } + + // Responsive hero + @media (max-width: #{$base-breakpoint-md}) { + .hero-content { + padding: #{$semantic-spacing-layout-section-sm}; + + .hero-title { + font-size: var(--hero-mobile-title-size, 2.5rem); + } + + .hero-subtitle { + font-size: var(--hero-mobile-subtitle-size, 1.25rem); + } + } + } +} + +// SECTION PATTERNS +.content-section { + width: 100%; + + &.section-is-padded { + padding: #{$semantic-spacing-layout-section-md} 0; + } + + &.section-is-contained { + max-width: var(--section-max-width, #{$semantic-sizing-content-medium}); + margin: 0 auto; + padding-left: #{$semantic-spacing-component-padding-lg}; + padding-right: #{$semantic-spacing-component-padding-lg}; + } + + &.section-content-centered { + text-align: center; + + .section-header, + .section-content { + display: flex; + flex-direction: column; + align-items: center; + } + } + + &.section-is-highlighted { + position: relative; + + &::before { + content: ''; + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: #{$base-spacing-1}; + background: var(--section-highlight-color, currentColor); + opacity: var(--section-highlight-opacity, 0.3); + } + + padding-left: #{$semantic-spacing-component-padding-lg}; + } + + .section-header { + margin-bottom: #{$semantic-spacing-layout-section-xs}; + + .section-title { + font-size: var(--section-title-size, 2rem); + font-weight: var(--section-title-weight, 600); + line-height: var(--section-title-line-height, 1.2); + margin: 0 0 #{$semantic-spacing-component-padding-sm} 0; + } + + .section-subtitle { + font-size: var(--section-subtitle-size, 1.125rem); + font-weight: var(--section-subtitle-weight, 400); + line-height: var(--section-subtitle-line-height, 1.4); + margin: 0; + color: var(--section-subtitle-color, rgba(0, 0, 0, 0.6)); + } + } + + .section-content { + line-height: var(--section-content-line-height, 1.6); + } + + .section-actions { + margin-top: #{$semantic-spacing-layout-section-xs}; + display: flex; + gap: #{$semantic-spacing-component-padding-sm}; + flex-wrap: wrap; + align-items: center; + } +} + +// MEDIA PATTERNS +.content-media { + display: block; + width: 100%; + + &.media-is-responsive { + .media-container { + position: relative; + width: 100%; + + img, video, audio { + max-width: 100%; + height: auto; + display: block; + } + } + } + + &.media-is-rounded { + .media-container { + border-radius: var(--media-border-radius, #{$semantic-border-card-radius}); + overflow: hidden; + } + } + + &.media-has-caption { + .media-caption { + padding: #{$semantic-spacing-component-padding-sm} 0; + + .caption-text { + font-size: var(--media-caption-size, 0.875rem); + line-height: var(--media-caption-line-height, 1.4); + color: var(--media-caption-color, rgba(0, 0, 0, 0.6)); + margin: 0; + font-style: var(--media-caption-style, italic); + } + + &.media-caption-top { + order: -1; + } + + &.media-caption-bottom { + order: 1; + } + } + } + + &.media-has-overlay { + .media-container { + position: relative; + + .media-overlay { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: var(--media-overlay-color, rgba(0, 0, 0, 0.3)); + display: flex; + align-items: center; + justify-content: center; + opacity: 0; + transition: opacity var(--transition-duration, 0.3s) var(--transition-easing, ease); + } + + &:hover .media-overlay { + opacity: 1; + } + } + } + + // Media layouts + &.media-layout-featured { + .media-container { + aspect-ratio: var(--media-featured-aspect-ratio, 16/9); + + img, video { + width: 100%; + height: 100%; + object-fit: cover; + } + } + } + + &.media-layout-thumbnail { + max-width: var(--media-thumbnail-size, #{$base-sizing-width-32}); + + .media-container { + aspect-ratio: var(--media-thumbnail-aspect-ratio, 1); + + img, video { + width: 100%; + height: 100%; + object-fit: cover; + } + } + } + + &.media-layout-gallery { + .media-container { + aspect-ratio: var(--media-gallery-aspect-ratio, 4/3); + + img, video { + width: 100%; + height: 100%; + object-fit: cover; + } + } + } + + // Media types + &.media-type-image { + .media-image { + &.media-cover { + object-fit: cover; + } + + &.media-contain { + object-fit: contain; + } + } + } + + &.media-type-video, + &.media-type-audio { + .media-video, + .media-audio { + width: 100%; + background: var(--media-player-bg, #000); + } + } + + &.media-type-embed { + .media-embed { + position: relative; + width: 100%; + height: 0; + padding-bottom: var(--media-embed-aspect-ratio, 56.25%); // 16:9 default + + iframe, + object, + embed { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + } + } + } +} + +// ========================================================================== +// LEGACY CONTENT PATTERNS - EXISTING PATTERNS BELOW +// ========================================================================== + +// MEDIA OBJECT PATTERN +.media { + display: flex; + align-items: flex-start; + gap: var(--media-gap, 16px); + + .media-object { + flex-shrink: 0; + width: var(--media-object-size, auto); + height: var(--media-object-size, auto); + border-radius: var(--media-object-border-radius, 4px); + + &.media-object-circle { + border-radius: 50%; + } + + &.media-object-sm { + --media-object-size: 32px; + } + + &.media-object-lg { + --media-object-size: 64px; + } + } + + .media-body { + flex: 1; + min-width: 0; // Prevents flex item overflow + + .media-heading { + margin: 0 0 var(--media-heading-margin, 8px) 0; + font-size: var(--media-heading-size, 1rem); + font-weight: var(--media-heading-weight, 600); + } + + .media-content { + margin: 0; + line-height: var(--media-content-line-height, 1.5); + } + + .media-meta { + margin-top: var(--media-meta-margin, 8px); + font-size: var(--media-meta-size, 0.875rem); + opacity: var(--media-meta-opacity, 0.7); + } + } + + &.media-reverse { + flex-direction: row-reverse; + } + + &.media-top { + align-items: flex-start; + } + + &.media-middle { + align-items: center; + } + + &.media-bottom { + align-items: flex-end; + } + + // Nested media objects + .media { + margin-top: var(--media-nested-margin, 16px); + } +} + +@media (max-width: 576px) { + .media { + --media-gap: 12px; + + &.media-stack-mobile { + flex-direction: column; + + .media-object { + align-self: center; + } + + .media-body { + text-align: center; + } + } + } +} + +// HERO SECTIONS +.hero { + position: relative; + display: flex; + align-items: center; + justify-content: center; + min-height: var(--hero-min-height, 400px); + padding: var(--hero-padding, 80px 24px); + text-align: center; + overflow: hidden; + + .hero-background { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 0; + + &.hero-background-image { + background-size: cover; + background-position: center; + background-repeat: no-repeat; + } + + &.hero-background-video { + video { + width: 100%; + height: 100%; + object-fit: cover; + } + } + + &.hero-background-overlay::after { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: var(--hero-overlay, rgba(0, 0, 0, 0.4)); + } + } + + .hero-content { + position: relative; + z-index: 1; + max-width: var(--hero-content-max-width, 800px); + width: 100%; + + .hero-title { + margin: 0 0 var(--hero-title-margin, 24px) 0; + font-size: var(--hero-title-size, 3rem); + font-weight: var(--hero-title-weight, 700); + line-height: var(--hero-title-line-height, 1.2); + } + + .hero-subtitle { + margin: 0 0 var(--hero-subtitle-margin, 32px) 0; + font-size: var(--hero-subtitle-size, 1.25rem); + line-height: var(--hero-subtitle-line-height, 1.5); + opacity: var(--hero-subtitle-opacity, 0.9); + } + + .hero-actions { + display: flex; + gap: var(--hero-actions-gap, 16px); + justify-content: center; + flex-wrap: wrap; + } + } + + &.hero-left { + text-align: left; + justify-content: flex-start; + + .hero-actions { + justify-content: flex-start; + } + } + + &.hero-right { + text-align: right; + justify-content: flex-end; + + .hero-actions { + justify-content: flex-end; + } + } + + &.hero-split { + display: grid; + grid-template-columns: 1fr 1fr; + gap: var(--hero-split-gap, 48px); + text-align: left; + + .hero-content { + display: flex; + flex-direction: column; + justify-content: center; + } + + .hero-media { + display: flex; + align-items: center; + justify-content: center; + + img, + video { + max-width: 100%; + height: auto; + border-radius: var(--hero-media-border-radius, 8px); + } + } + } +} + +@media (max-width: 768px) { + .hero { + --hero-padding: 60px 16px; + --hero-title-size: 2rem; + --hero-subtitle-size: 1rem; + + &.hero-split { + grid-template-columns: 1fr; + text-align: center; + + .hero-media { + order: -1; + } + + .hero-actions { + justify-content: center; + } + } + + .hero-actions { + flex-direction: column; + + .btn { + width: 100%; + } + } + } +} + +// FEATURE SECTIONS +.features { + padding: var(--features-padding, 80px 0); + + .features-header { + text-align: center; + margin-bottom: var(--features-header-margin, 64px); + + .features-title { + margin: 0 0 var(--features-title-margin, 16px) 0; + font-size: var(--features-title-size, 2.5rem); + font-weight: var(--features-title-weight, 700); + } + + .features-subtitle { + margin: 0; + font-size: var(--features-subtitle-size, 1.125rem); + opacity: var(--features-subtitle-opacity, 0.8); + max-width: var(--features-subtitle-max-width, 600px); + margin-left: auto; + margin-right: auto; + } + } + + .features-grid { + display: grid; + gap: var(--features-grid-gap, 48px); + grid-template-columns: 1fr; + + @media (min-width: 768px) { + grid-template-columns: repeat(2, 1fr); + } + + @media (min-width: 992px) { + grid-template-columns: repeat(3, 1fr); + } + + &.features-grid-2-col { + @media (min-width: 768px) { + grid-template-columns: repeat(2, 1fr); + } + } + + &.features-grid-4-col { + @media (min-width: 1200px) { + grid-template-columns: repeat(4, 1fr); + } + } + } + + .feature-item { + text-align: center; + + .feature-icon { + width: var(--feature-icon-size, 64px); + height: var(--feature-icon-size, 64px); + margin: 0 auto var(--feature-icon-margin, 24px) auto; + display: flex; + align-items: center; + justify-content: center; + border-radius: var(--feature-icon-border-radius, 12px); + } + + .feature-title { + margin: 0 0 var(--feature-title-margin, 16px) 0; + font-size: var(--feature-title-size, 1.25rem); + font-weight: var(--feature-title-weight, 600); + } + + .feature-description { + margin: 0; + line-height: var(--feature-description-line-height, 1.6); + opacity: var(--feature-description-opacity, 0.8); + } + + &.feature-item-left { + text-align: left; + + .feature-icon { + margin-left: 0; + margin-right: auto; + } + } + + &.feature-item-horizontal { + display: flex; + gap: var(--feature-horizontal-gap, 24px); + text-align: left; + + .feature-icon { + flex-shrink: 0; + margin: 0; + } + + .feature-content { + flex: 1; + } + } + } +} + +// TESTIMONIAL SECTIONS +.testimonials { + padding: var(--testimonials-padding, 80px 0); + + .testimonials-header { + text-align: center; + margin-bottom: var(--testimonials-header-margin, 64px); + + .testimonials-title { + margin: 0 0 var(--testimonials-title-margin, 16px) 0; + font-size: var(--testimonials-title-size, 2.5rem); + font-weight: var(--testimonials-title-weight, 700); + } + + .testimonials-subtitle { + margin: 0; + font-size: var(--testimonials-subtitle-size, 1.125rem); + opacity: var(--testimonials-subtitle-opacity, 0.8); + } + } + + .testimonials-grid { + display: grid; + gap: var(--testimonials-grid-gap, 32px); + grid-template-columns: 1fr; + + @media (min-width: 768px) { + grid-template-columns: repeat(2, 1fr); + } + + @media (min-width: 992px) { + grid-template-columns: repeat(3, 1fr); + } + } + + .testimonial-item { + display: flex; + flex-direction: column; + padding: var(--testimonial-padding, 32px); + border-radius: var(--testimonial-border-radius, 12px); + border: var(--testimonial-border, 1px solid rgba(0, 0, 0, 0.1)); + + .testimonial-content { + flex: 1; + margin-bottom: var(--testimonial-content-margin, 24px); + font-size: var(--testimonial-content-size, 1rem); + line-height: var(--testimonial-content-line-height, 1.6); + font-style: italic; + + &::before { + content: '"'; + } + + &::after { + content: '"'; + } + } + + .testimonial-author { + display: flex; + align-items: center; + gap: var(--testimonial-author-gap, 16px); + + .author-avatar { + width: var(--author-avatar-size, 48px); + height: var(--author-avatar-size, 48px); + border-radius: 50%; + flex-shrink: 0; + } + + .author-info { + .author-name { + margin: 0 0 var(--author-name-margin, 4px) 0; + font-size: var(--author-name-size, 1rem); + font-weight: var(--author-name-weight, 600); + } + + .author-title { + margin: 0; + font-size: var(--author-title-size, 0.875rem); + opacity: var(--author-title-opacity, 0.7); + } + } + } + } +} + +// CALL TO ACTION SECTIONS +.cta { + padding: var(--cta-padding, 80px 24px); + text-align: center; + position: relative; + overflow: hidden; + + .cta-background { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 0; + } + + .cta-content { + position: relative; + z-index: 1; + max-width: var(--cta-content-max-width, 600px); + margin: 0 auto; + + .cta-title { + margin: 0 0 var(--cta-title-margin, 24px) 0; + font-size: var(--cta-title-size, 2.5rem); + font-weight: var(--cta-title-weight, 700); + line-height: var(--cta-title-line-height, 1.2); + } + + .cta-subtitle { + margin: 0 0 var(--cta-subtitle-margin, 32px) 0; + font-size: var(--cta-subtitle-size, 1.125rem); + line-height: var(--cta-subtitle-line-height, 1.5); + opacity: var(--cta-subtitle-opacity, 0.9); + } + + .cta-actions { + display: flex; + gap: var(--cta-actions-gap, 16px); + justify-content: center; + flex-wrap: wrap; + } + } + + &.cta-split { + display: grid; + grid-template-columns: 1fr 1fr; + gap: var(--cta-split-gap, 48px); + align-items: center; + text-align: left; + + .cta-content { + max-width: none; + margin: 0; + + .cta-actions { + justify-content: flex-start; + } + } + + .cta-visual { + display: flex; + align-items: center; + justify-content: center; + + img, + video { + max-width: 100%; + height: auto; + border-radius: var(--cta-visual-border-radius, 8px); + } + } + } +} + +@media (max-width: 768px) { + .cta { + --cta-padding: 60px 16px; + --cta-title-size: 2rem; + --cta-subtitle-size: 1rem; + + &.cta-split { + grid-template-columns: 1fr; + text-align: center; + + .cta-visual { + order: -1; + } + + .cta-content .cta-actions { + justify-content: center; + } + } + + .cta-actions { + flex-direction: column; + + .btn { + width: 100%; + } + } + } +} + +// STATS/METRICS SECTIONS +.stats { + padding: var(--stats-padding, 80px 0); + + .stats-grid { + display: grid; + gap: var(--stats-grid-gap, 32px); + grid-template-columns: 1fr; + + @media (min-width: 576px) { + grid-template-columns: repeat(2, 1fr); + } + + @media (min-width: 992px) { + grid-template-columns: repeat(4, 1fr); + } + } + + .stat-item { + text-align: center; + + .stat-number { + display: block; + font-size: var(--stat-number-size, 3rem); + font-weight: var(--stat-number-weight, 700); + line-height: var(--stat-number-line-height, 1); + margin-bottom: var(--stat-number-margin, 8px); + } + + .stat-label { + font-size: var(--stat-label-size, 1rem); + font-weight: var(--stat-label-weight, 500); + opacity: var(--stat-label-opacity, 0.8); + margin: 0; + } + + .stat-description { + margin-top: var(--stat-description-margin, 8px); + font-size: var(--stat-description-size, 0.875rem); + opacity: var(--stat-description-opacity, 0.6); + } + } +} \ No newline at end of file diff --git a/projects/shared-ui/src/styles/commons/patterns/_index.scss b/projects/shared-ui/src/styles/commons/patterns/_index.scss new file mode 100644 index 0000000..9256713 --- /dev/null +++ b/projects/shared-ui/src/styles/commons/patterns/_index.scss @@ -0,0 +1,10 @@ +// ========================================================================== +// COMMONS PATTERNS INDEX +// ========================================================================== +// Import all pattern-related commons files +// Theme-agnostic patterns and behaviors +// ========================================================================== + +@import 'content-patterns'; +@import 'interaction-patterns'; +@import 'layout-patterns'; \ No newline at end of file diff --git a/projects/shared-ui/src/styles/commons/patterns/_interaction-patterns.scss b/projects/shared-ui/src/styles/commons/patterns/_interaction-patterns.scss new file mode 100644 index 0000000..e5ae17f --- /dev/null +++ b/projects/shared-ui/src/styles/commons/patterns/_interaction-patterns.scss @@ -0,0 +1,452 @@ +// ========================================================================== +// INTERACTION PATTERNS +// ========================================================================== +// Common interaction and state patterns +// Theme-agnostic behavioral styles +// ========================================================================== + +// HOVER EFFECTS +.hover-lift { + transition: transform var(--hover-transition-duration, 0.2s) var(--hover-transition-easing, ease); + + &:hover { + transform: var(--hover-lift-transform, translateY(-4px)); + } +} + +.hover-scale { + transition: transform var(--hover-transition-duration, 0.2s) var(--hover-transition-easing, ease); + + &:hover { + transform: var(--hover-scale-transform, scale(1.05)); + } +} + +.hover-glow { + transition: box-shadow var(--hover-transition-duration, 0.2s) var(--hover-transition-easing, ease); + + &:hover { + box-shadow: var(--hover-glow-shadow, 0 0 20px rgba(0, 0, 0, 0.15)); + } +} + +.hover-fade { + transition: opacity var(--hover-transition-duration, 0.2s) var(--hover-transition-easing, ease); + + &:hover { + opacity: var(--hover-fade-opacity, 0.8); + } +} + +.hover-brighten { + transition: filter var(--hover-transition-duration, 0.2s) var(--hover-transition-easing, ease); + + &:hover { + filter: brightness(var(--hover-brighten-value, 1.1)); + } +} + +.hover-darken { + transition: filter var(--hover-transition-duration, 0.2s) var(--hover-transition-easing, ease); + + &:hover { + filter: brightness(var(--hover-darken-value, 0.9)); + } +} + +// FOCUS STATES +.focus-ring { + &:focus, + &:focus-visible { + outline: var(--focus-ring-width, 2px) solid var(--focus-ring-color, #007bff); + outline-offset: var(--focus-ring-offset, 2px); + } +} + +.focus-ring-inset { + &:focus, + &:focus-visible { + outline: var(--focus-ring-width, 2px) solid var(--focus-ring-color, #007bff); + outline-offset: var(--focus-ring-inset-offset, -2px); + } +} + +.focus-glow { + &:focus, + &:focus-visible { + box-shadow: var(--focus-glow-shadow, 0 0 0 3px rgba(0, 123, 255, 0.25)); + outline: none; + } +} + +// ACTIVE STATES +.active-press { + transition: transform var(--active-transition-duration, 0.1s) var(--active-transition-easing, ease); + + &:active { + transform: var(--active-press-transform, scale(0.98)); + } +} + +.active-sink { + transition: transform var(--active-transition-duration, 0.1s) var(--active-transition-easing, ease); + + &:active { + transform: var(--active-sink-transform, translateY(2px)); + } +} + +// LOADING STATES +.loading { + position: relative; + pointer-events: none; + + &::after { + content: ''; + position: absolute; + top: 50%; + left: 50%; + width: var(--loading-spinner-size, 20px); + height: var(--loading-spinner-size, 20px); + margin-top: calc(var(--loading-spinner-size, 20px) / -2); + margin-left: calc(var(--loading-spinner-size, 20px) / -2); + border: 2px solid var(--loading-spinner-color, rgba(0, 0, 0, 0.3)); + border-top-color: var(--loading-spinner-active-color, #007bff); + border-radius: 50%; + animation: loading-spin var(--loading-spin-duration, 1s) linear infinite; + z-index: 1; + } + + &.loading-overlay::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: var(--loading-overlay-bg, rgba(255, 255, 255, 0.8)); + z-index: 0; + } +} + +@keyframes loading-spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +.loading-pulse { + animation: loading-pulse var(--loading-pulse-duration, 2s) infinite; +} + +@keyframes loading-pulse { + 0%, 100% { opacity: 1; } + 50% { opacity: var(--loading-pulse-opacity, 0.5); } +} + +.loading-skeleton { + background: var(--skeleton-bg, #f0f0f0); + background-image: linear-gradient( + 90deg, + var(--skeleton-bg, #f0f0f0), + var(--skeleton-highlight, #e0e0e0), + var(--skeleton-bg, #f0f0f0) + ); + background-size: 200px 100%; + background-repeat: no-repeat; + animation: loading-shimmer var(--skeleton-duration, 1.5s) infinite; + border-radius: var(--skeleton-border-radius, 4px); +} + +@keyframes loading-shimmer { + 0% { background-position: -200px 0; } + 100% { background-position: calc(200px + 100%) 0; } +} + +// DISABLED STATES +.disabled, +[disabled] { + opacity: var(--disabled-opacity, 0.6); + pointer-events: none; + cursor: not-allowed; +} + +.disabled-loading { + opacity: var(--disabled-loading-opacity, 0.8); + pointer-events: none; + cursor: wait; +} + +// SUCCESS STATES +.success-flash { + animation: success-flash var(--success-flash-duration, 0.5s) ease-in-out; +} + +@keyframes success-flash { + 0%, 100% { background-color: transparent; } + 50% { background-color: var(--success-flash-color, rgba(40, 167, 69, 0.2)); } +} + +.success-checkmark { + position: relative; + + &::after { + content: '✓'; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + color: var(--success-color, #28a745); + font-size: var(--success-checkmark-size, 1.5rem); + font-weight: bold; + animation: success-checkmark-appear var(--success-checkmark-duration, 0.3s) ease-in-out; + } +} + +@keyframes success-checkmark-appear { + 0% { opacity: 0; transform: translate(-50%, -50%) scale(0.5); } + 100% { opacity: 1; transform: translate(-50%, -50%) scale(1); } +} + +// ERROR STATES +.error-shake { + animation: error-shake var(--error-shake-duration, 0.5s) ease-in-out; +} + +@keyframes error-shake { + 0%, 20%, 40%, 60%, 80%, 100% { transform: translateX(0); } + 10%, 50%, 90% { transform: translateX(-5px); } + 30%, 70% { transform: translateX(5px); } +} + +.error-flash { + animation: error-flash var(--error-flash-duration, 0.5s) ease-in-out; +} + +@keyframes error-flash { + 0%, 100% { background-color: transparent; } + 50% { background-color: var(--error-flash-color, rgba(220, 53, 69, 0.2)); } +} + +// WARNING STATES +.warning-pulse { + animation: warning-pulse var(--warning-pulse-duration, 2s) infinite; +} + +@keyframes warning-pulse { + 0%, 100% { opacity: 1; } + 50% { opacity: var(--warning-pulse-opacity, 0.7); } +} + +// DRAG AND DROP STATES +.draggable { + cursor: grab; + user-select: none; + transition: transform var(--draggable-transition-duration, 0.2s) var(--draggable-transition-easing, ease); + + &:active { + cursor: grabbing; + } + + &.dragging { + cursor: grabbing; + opacity: var(--dragging-opacity, 0.8); + transform: var(--dragging-transform, rotate(5deg)); + z-index: var(--z-dragging, 1000); + } +} + +.drop-zone { + transition: all var(--drop-zone-transition-duration, 0.2s) var(--drop-zone-transition-easing, ease); + border: 2px dashed transparent; + border-radius: var(--drop-zone-border-radius, 8px); + padding: var(--drop-zone-padding, 20px); + + &.drop-zone-active { + border-color: var(--drop-zone-active-border, #007bff); + background-color: var(--drop-zone-active-bg, rgba(0, 123, 255, 0.05)); + } + + &.drop-zone-invalid { + border-color: var(--drop-zone-invalid-border, #dc3545); + background-color: var(--drop-zone-invalid-bg, rgba(220, 53, 69, 0.05)); + } +} + +// SELECTION STATES +.selectable { + cursor: pointer; + transition: all var(--selectable-transition-duration, 0.2s) var(--selectable-transition-easing, ease); + border: var(--selectable-border-width, 2px) solid transparent; + border-radius: var(--selectable-border-radius, 4px); + + &:hover { + border-color: var(--selectable-hover-border, rgba(0, 123, 255, 0.5)); + } + + &.selected { + border-color: var(--selectable-selected-border, #007bff); + background-color: var(--selectable-selected-bg, rgba(0, 123, 255, 0.05)); + } + + &.selecting { + opacity: var(--selecting-opacity, 0.7); + transform: var(--selecting-transform, scale(0.98)); + } +} + +// EXPANDABLE CONTENT +.expandable { + overflow: hidden; + transition: height var(--expandable-transition-duration, 0.3s) var(--expandable-transition-easing, ease); + + &.expanding { + transition: height var(--expanding-transition-duration, 0.3s) var(--expanding-transition-easing, ease-out); + } + + &.collapsing { + transition: height var(--collapsing-transition-duration, 0.3s) var(--collapsing-transition-easing, ease-in); + } +} + +.expandable-trigger { + cursor: pointer; + display: flex; + align-items: center; + gap: var(--expandable-trigger-gap, 8px); + + .expand-icon { + transition: transform var(--expand-icon-transition-duration, 0.2s) var(--expand-icon-transition-easing, ease); + } + + &.expanded .expand-icon { + transform: var(--expand-icon-expanded-transform, rotate(180deg)); + } +} + +// SORTABLE LISTS +.sortable { + .sortable-item { + cursor: move; + user-select: none; + transition: all var(--sortable-transition-duration, 0.2s) var(--sortable-transition-easing, ease); + + &.sortable-ghost { + opacity: var(--sortable-ghost-opacity, 0.5); + background: var(--sortable-ghost-bg, rgba(0, 123, 255, 0.1)); + } + + &.sortable-chosen { + opacity: var(--sortable-chosen-opacity, 0.8); + transform: var(--sortable-chosen-transform, scale(1.02)); + } + } + + .sortable-handle { + cursor: grab; + display: flex; + align-items: center; + justify-content: center; + padding: var(--sortable-handle-padding, 8px); + opacity: var(--sortable-handle-opacity, 0.6); + transition: opacity var(--sortable-handle-transition-duration, 0.2s); + + &:hover { + opacity: 1; + } + + &:active { + cursor: grabbing; + } + } +} + +// RIPPLE EFFECT +.ripple-effect { + position: relative; + overflow: hidden; + + &::before { + content: ''; + position: absolute; + top: 50%; + left: 50%; + width: 0; + height: 0; + border-radius: 50%; + background: var(--ripple-color, rgba(255, 255, 255, 0.3)); + transform: translate(-50%, -50%); + transition: width var(--ripple-duration, 0.6s), height var(--ripple-duration, 0.6s); + pointer-events: none; + } + + &.ripple-active::before { + width: var(--ripple-size, 200px); + height: var(--ripple-size, 200px); + } +} + +// FLOATING ELEMENTS +.floating { + animation: floating var(--floating-duration, 3s) ease-in-out infinite; +} + +@keyframes floating { + 0%, 100% { transform: translateY(0px); } + 50% { transform: translateY(var(--floating-distance, -10px)); } +} + +.bob { + animation: bob var(--bob-duration, 2s) ease-in-out infinite; +} + +@keyframes bob { + 0%, 20%, 50%, 80%, 100% { transform: translateY(0); } + 40% { transform: translateY(var(--bob-distance, -10px)); } + 60% { transform: translateY(var(--bob-distance-small, -5px)); } +} + +// ACCESSIBILITY ENHANCEMENTS +@media (prefers-reduced-motion: reduce) { + .hover-lift, + .hover-scale, + .hover-glow, + .hover-fade, + .hover-brighten, + .hover-darken, + .active-press, + .active-sink, + .expandable, + .expandable-trigger .expand-icon, + .sortable .sortable-item, + .ripple-effect, + .floating, + .bob { + transition: none; + animation: none; + } + + .loading::after { + animation: none; + } + + .loading-pulse, + .loading-skeleton, + .warning-pulse { + animation: none; + } +} + +@media (prefers-contrast: high) { + .focus-ring:focus, + .focus-ring:focus-visible { + outline-width: 3px; + } + + .selectable { + border-width: 3px; + } + + .drop-zone { + border-width: 3px; + } +} \ No newline at end of file diff --git a/projects/shared-ui/src/styles/commons/patterns/_layout-patterns.scss b/projects/shared-ui/src/styles/commons/patterns/_layout-patterns.scss new file mode 100644 index 0000000..febc028 --- /dev/null +++ b/projects/shared-ui/src/styles/commons/patterns/_layout-patterns.scss @@ -0,0 +1,556 @@ +// ========================================================================== +// LAYOUT PATTERNS +// ========================================================================== +// Common layout patterns and organizational structures +// Theme-agnostic layout behaviors +// ========================================================================== + +// STACK LAYOUT PATTERN +.stack { + display: flex; + flex-direction: column; + gap: var(--stack-gap, 16px); + + &.stack-sm { + gap: var(--stack-gap-sm, 8px); + } + + &.stack-lg { + gap: var(--stack-gap-lg, 24px); + } + + &.stack-xl { + gap: var(--stack-gap-xl, 32px); + } + + &.stack-horizontal { + flex-direction: row; + align-items: center; + } + + &.stack-center { + align-items: center; + } + + &.stack-end { + align-items: flex-end; + } + + &.stack-stretch { + align-items: stretch; + } +} + +// CLUSTER LAYOUT PATTERN (Flexbox wrap) +.cluster { + display: flex; + flex-wrap: wrap; + gap: var(--cluster-gap, 16px); + align-items: center; + + &.cluster-start { + justify-content: flex-start; + } + + &.cluster-center { + justify-content: center; + } + + &.cluster-end { + justify-content: flex-end; + } + + &.cluster-between { + justify-content: space-between; + } + + &.cluster-around { + justify-content: space-around; + } + + &.cluster-evenly { + justify-content: space-evenly; + } + + &.cluster-baseline { + align-items: baseline; + } + + &.cluster-stretch { + align-items: stretch; + } +} + +// SIDEBAR LAYOUT PATTERN +.sidebar-layout { + display: flex; + gap: var(--sidebar-gap, 32px); + align-items: flex-start; + + .sidebar { + flex-shrink: 0; + width: var(--sidebar-width, 250px); + min-width: var(--sidebar-min-width, 200px); + } + + .main-content { + flex: 1; + min-width: 0; // Prevents flex overflow + } + + &.sidebar-right { + flex-direction: row-reverse; + } + + &.sidebar-sticky { + .sidebar { + position: sticky; + top: var(--sidebar-sticky-top, 20px); + align-self: flex-start; + } + } + + // Responsive behavior + &.sidebar-collapse-md { + @media (max-width: 768px) { + flex-direction: column; + gap: var(--sidebar-gap-mobile, 24px); + + .sidebar { + width: 100%; + position: static; + } + } + } + + &.sidebar-collapse-lg { + @media (max-width: 992px) { + flex-direction: column; + gap: var(--sidebar-gap-mobile, 24px); + + .sidebar { + width: 100%; + position: static; + } + } + } +} + +// SWITCHER LAYOUT PATTERN (Responsive stack/row) +.switcher { + display: flex; + flex-wrap: wrap; + gap: var(--switcher-gap, 16px); + + > * { + flex-grow: 1; + flex-basis: calc((var(--switcher-threshold, 30rem) - 100%) * 999); + min-width: var(--switcher-min-width, 250px); + } + + &.switcher-no-grow > * { + flex-grow: 0; + } +} + +// COVER LAYOUT PATTERN (Centered content) +.cover { + display: flex; + flex-direction: column; + min-height: var(--cover-min-height, 100vh); + padding: var(--cover-padding, 24px); + + > * { + margin-top: var(--cover-spacing, 16px); + margin-bottom: var(--cover-spacing, 16px); + } + + > :first-child:not(.cover-centered) { + margin-top: 0; + } + + > :last-child:not(.cover-centered) { + margin-bottom: 0; + } + + .cover-centered { + margin-top: auto; + margin-bottom: auto; + } +} + +// IMPOSTER LAYOUT PATTERN (Absolute positioning) +.imposter { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + + &.imposter-contain { + max-width: calc(100% - var(--imposter-margin, 32px)); + max-height: calc(100% - var(--imposter-margin, 32px)); + overflow: auto; + } + + &.imposter-fixed { + position: fixed; + } + + &.imposter-top { + top: var(--imposter-offset, 20px); + transform: translate(-50%, 0); + } + + &.imposter-bottom { + top: auto; + bottom: var(--imposter-offset, 20px); + transform: translate(-50%, 0); + } + + &.imposter-left { + left: var(--imposter-offset, 20px); + transform: translate(0, -50%); + } + + &.imposter-right { + left: auto; + right: var(--imposter-offset, 20px); + transform: translate(0, -50%); + } +} + +// GRID LAYOUT PATTERNS +.auto-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(var(--auto-grid-min-width, 250px), 1fr)); + gap: var(--auto-grid-gap, 24px); + + &.auto-grid-fill { + grid-template-columns: repeat(auto-fill, minmax(var(--auto-grid-min-width, 250px), 1fr)); + } + + &.auto-grid-dense { + grid-auto-flow: dense; + } +} + +.reel { + display: flex; + overflow-x: auto; + gap: var(--reel-gap, 16px); + padding-bottom: var(--reel-scrollbar-space, 8px); + + > * { + flex-shrink: 0; + width: var(--reel-item-width, 250px); + } + + &.reel-auto-width > * { + width: auto; + min-width: var(--reel-min-width, 200px); + } + + // Snap scrolling + &.reel-snap { + scroll-snap-type: x mandatory; + + > * { + scroll-snap-align: start; + } + } + + // Hide scrollbar + &.reel-no-scrollbar { + scrollbar-width: none; + -ms-overflow-style: none; + + &::-webkit-scrollbar { + display: none; + } + } +} + +// HOLY GRAIL LAYOUT +.holy-grail { + display: grid; + grid-template-areas: + "header header header" + "nav main aside" + "footer footer footer"; + grid-template-rows: auto 1fr auto; + grid-template-columns: var(--nav-width, 200px) 1fr var(--aside-width, 200px); + min-height: 100vh; + gap: var(--holy-grail-gap, 0); + + .header { + grid-area: header; + } + + .nav { + grid-area: nav; + } + + .main { + grid-area: main; + min-width: 0; + } + + .aside { + grid-area: aside; + } + + .footer { + grid-area: footer; + } + + // Responsive collapse + @media (max-width: 768px) { + grid-template-areas: + "header" + "nav" + "main" + "aside" + "footer"; + grid-template-columns: 1fr; + grid-template-rows: auto auto 1fr auto auto; + } +} + +// PANCAKE STACK LAYOUT (Header, flexible content, footer) +.pancake-stack { + display: grid; + grid-template-rows: auto 1fr auto; + min-height: var(--pancake-min-height, 100vh); + + .header { + /* Header content */ + } + + .main { + /* Main content - grows to fill space */ + } + + .footer { + /* Footer content */ + } +} + +// MASONRY LAYOUT +.masonry { + columns: var(--masonry-columns, 3); + column-gap: var(--masonry-gap, 24px); + + > * { + break-inside: avoid; + margin-bottom: var(--masonry-gap, 24px); + } + + &.masonry-2 { + columns: 2; + } + + &.masonry-4 { + columns: 4; + } + + &.masonry-5 { + columns: 5; + } + + // Responsive columns + @media (max-width: 768px) { + columns: 1; + } + + @media (min-width: 769px) and (max-width: 1024px) { + columns: 2; + } +} + +// FLEX EQUAL HEIGHT PATTERN +.equal-height { + display: flex; + + > * { + flex: 1; + display: flex; + flex-direction: column; + } + + &.equal-height-baseline { + align-items: baseline; + } + + &.equal-height-center { + align-items: center; + } + + &.equal-height-end { + align-items: flex-end; + } +} + +// STICKY FOOTER PATTERN +.sticky-footer { + display: flex; + flex-direction: column; + min-height: 100vh; + + .content { + flex: 1; + } + + .footer { + margin-top: auto; + } +} + +// ASPECT RATIO CONTAINERS +.aspect-ratio { + position: relative; + width: 100%; + + &::before { + content: ''; + display: block; + padding-top: var(--aspect-ratio, 56.25%); /* 16:9 default */ + } + + > * { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + width: 100%; + height: 100%; + object-fit: cover; + } + + &.aspect-1-1 { + --aspect-ratio: 100%; /* 1:1 */ + } + + &.aspect-4-3 { + --aspect-ratio: 75%; /* 4:3 */ + } + + &.aspect-3-2 { + --aspect-ratio: 66.67%; /* 3:2 */ + } + + &.aspect-16-9 { + --aspect-ratio: 56.25%; /* 16:9 */ + } + + &.aspect-21-9 { + --aspect-ratio: 42.86%; /* 21:9 */ + } +} + +// INTRINSIC RATIO (modern aspect-ratio support) +@supports (aspect-ratio: 16 / 9) { + .intrinsic-ratio { + aspect-ratio: var(--intrinsic-ratio, 16 / 9); + + &.intrinsic-1-1 { + aspect-ratio: 1 / 1; + } + + &.intrinsic-4-3 { + aspect-ratio: 4 / 3; + } + + &.intrinsic-3-2 { + aspect-ratio: 3 / 2; + } + + &.intrinsic-16-9 { + aspect-ratio: 16 / 9; + } + + &.intrinsic-21-9 { + aspect-ratio: 21 / 9; + } + } +} + +// QUANTITY QUERIES (Layout based on number of items) +.quantity-query { + display: flex; + flex-wrap: wrap; + gap: var(--quantity-gap, 16px); + + /* Single item - full width */ + &:has(> :nth-child(1):nth-last-child(1)) > * { + flex-basis: 100%; + } + + /* Two items - 50% each */ + &:has(> :nth-child(2):nth-last-child(1)) > * { + flex-basis: calc(50% - var(--quantity-gap, 16px) / 2); + } + + /* Three items - 33% each */ + &:has(> :nth-child(3):nth-last-child(1)) > * { + flex-basis: calc(33.333% - var(--quantity-gap, 16px) * 2 / 3); + } + + /* Four or more items - 25% each */ + &:has(> :nth-child(4)) > * { + flex-basis: calc(25% - var(--quantity-gap, 16px) * 3 / 4); + } +} + +// RESPONSIVE UTILITIES FOR PATTERNS +@media (max-width: 576px) { + .stack-horizontal-mobile { + flex-direction: row; + align-items: center; + } + + .stack-vertical-mobile { + flex-direction: column; + align-items: stretch; + } + + .cluster-stack-mobile { + flex-direction: column; + align-items: stretch; + } +} + +@media (max-width: 768px) { + .equal-height { + flex-direction: column; + } + + .switcher { + flex-direction: column; + } +} + +// ACCESSIBILITY IMPROVEMENTS +@media (prefers-reduced-motion: reduce) { + .sticky-footer, + .cover, + .imposter { + transition: none; + } +} + +// PRINT OPTIMIZATIONS +@media print { + .reel { + display: block; + overflow: visible; + } + + .masonry { + columns: 1; + } + + .holy-grail { + display: block; + } +} \ No newline at end of file diff --git a/projects/shared-ui/src/styles/commons/utilities/_display-utilities.scss b/projects/shared-ui/src/styles/commons/utilities/_display-utilities.scss new file mode 100644 index 0000000..e8f007e --- /dev/null +++ b/projects/shared-ui/src/styles/commons/utilities/_display-utilities.scss @@ -0,0 +1,348 @@ +// ========================================================================== +// DISPLAY UTILITIES +// ========================================================================== +// Utility classes for display, visibility, and text formatting +// Theme-agnostic display and layout helpers +// ========================================================================== + +// TEXT ALIGNMENT +.text-left { text-align: left !important; } +.text-right { text-align: right !important; } +.text-center { text-align: center !important; } +.text-justify { text-align: justify !important; } +.text-start { text-align: left !important; } +.text-end { text-align: right !important; } + +// Responsive text alignment - Using base breakpoint tokens +@media (max-width: #{$base-breakpoint-xs - 1px}) { + .text-xs-left { text-align: left !important; } + .text-xs-right { text-align: right !important; } + .text-xs-center { text-align: center !important; } + .text-xs-start { text-align: left !important; } + .text-xs-end { text-align: right !important; } +} + +@media (min-width: #{$base-breakpoint-sm}) { + .text-sm-left { text-align: left !important; } + .text-sm-right { text-align: right !important; } + .text-sm-center { text-align: center !important; } + .text-sm-start { text-align: left !important; } + .text-sm-end { text-align: right !important; } +} + +@media (min-width: #{$base-breakpoint-md}) { + .text-md-left { text-align: left !important; } + .text-md-right { text-align: right !important; } + .text-md-center { text-align: center !important; } + .text-md-start { text-align: left !important; } + .text-md-end { text-align: right !important; } +} + +@media (min-width: #{$base-breakpoint-lg}) { + .text-lg-left { text-align: left !important; } + .text-lg-right { text-align: right !important; } + .text-lg-center { text-align: center !important; } + .text-lg-start { text-align: left !important; } + .text-lg-end { text-align: right !important; } +} + +// TEXT TRANSFORM +.text-lowercase { text-transform: lowercase !important; } +.text-uppercase { text-transform: uppercase !important; } +.text-capitalize { text-transform: capitalize !important; } +.text-normal-case { text-transform: none !important; } + +// FONT WEIGHT +.fw-light { font-weight: 300 !important; } +.fw-lighter { font-weight: lighter !important; } +.fw-normal { font-weight: 400 !important; } +.fw-medium { font-weight: 500 !important; } +.fw-semibold { font-weight: 600 !important; } +.fw-bold { font-weight: 700 !important; } +.fw-bolder { font-weight: bolder !important; } + +// FONT STYLE +.fst-italic { font-style: italic !important; } +.fst-normal { font-style: normal !important; } + +// TEXT DECORATION +.text-decoration-none { text-decoration: none !important; } +.text-decoration-underline { text-decoration: underline !important; } +.text-decoration-line-through { text-decoration: line-through !important; } + +// LINE HEIGHT +.lh-1 { line-height: 1 !important; } +.lh-sm { line-height: 1.25 !important; } +.lh-base { line-height: 1.5 !important; } +.lh-lg { line-height: 2 !important; } + +// TEXT WRAP +.text-wrap { white-space: normal !important; } +.text-nowrap { white-space: nowrap !important; } +.text-pre { white-space: pre !important; } +.text-pre-line { white-space: pre-line !important; } +.text-pre-wrap { white-space: pre-wrap !important; } + +// TEXT OVERFLOW +.text-truncate { + overflow: hidden !important; + text-overflow: ellipsis !important; + white-space: nowrap !important; +} + +.text-break { + word-wrap: break-word !important; + word-break: break-word !important; +} + +// WORD BREAK +.text-break-all { word-break: break-all !important; } +.text-break-keep { word-break: keep-all !important; } + +// VERTICAL ALIGNMENT +.align-baseline { vertical-align: baseline !important; } +.align-top { vertical-align: top !important; } +.align-middle { vertical-align: middle !important; } +.align-bottom { vertical-align: bottom !important; } +.align-text-bottom { vertical-align: text-bottom !important; } +.align-text-top { vertical-align: text-top !important; } + +// LIST STYLES +.list-unstyled { + padding-left: 0 !important; + list-style: none !important; +} + +.list-inline { + padding-left: 0 !important; + list-style: none !important; + + .list-inline-item { + display: inline-block !important; + + &:not(:last-child) { + margin-right: var(--list-inline-gap, 8px) !important; + } + } +} + +// OPACITY +.opacity-0 { opacity: 0 !important; } +.opacity-25 { opacity: 0.25 !important; } +.opacity-50 { opacity: 0.5 !important; } +.opacity-75 { opacity: 0.75 !important; } +.opacity-100 { opacity: 1 !important; } + +// BORDERS +.border { border: var(--border-width, 1px) solid var(--border-color, #dee2e6) !important; } +.border-0 { border: 0 !important; } +.border-top { border-top: var(--border-width, 1px) solid var(--border-color, #dee2e6) !important; } +.border-top-0 { border-top: 0 !important; } +.border-end { border-right: var(--border-width, 1px) solid var(--border-color, #dee2e6) !important; } +.border-end-0 { border-right: 0 !important; } +.border-bottom { border-bottom: var(--border-width, 1px) solid var(--border-color, #dee2e6) !important; } +.border-bottom-0 { border-bottom: 0 !important; } +.border-start { border-left: var(--border-width, 1px) solid var(--border-color, #dee2e6) !important; } +.border-start-0 { border-left: 0 !important; } + +// BORDER RADIUS - Using base border radius tokens +.rounded { border-radius: var(--border-radius, #{$base-border-radius-md}) !important; } +.rounded-0 { border-radius: #{$base-border-radius-none} !important; } +.rounded-1 { border-radius: var(--border-radius-sm, #{$base-border-radius-sm}) !important; } +.rounded-2 { border-radius: var(--border-radius, #{$base-border-radius-md}) !important; } +.rounded-3 { border-radius: var(--border-radius-lg, #{$base-border-radius-lg}) !important; } +.rounded-4 { border-radius: var(--border-radius-xl, #{$base-border-radius-xl}) !important; } +.rounded-5 { border-radius: var(--border-radius-xxl, #{$base-border-radius-2xl}) !important; } +.rounded-circle { border-radius: #{$base-border-radius-full} !important; } +.rounded-pill { border-radius: var(--rounded-pill, #{$base-border-radius-pill}) !important; } + +// Individual border radius +.rounded-top { border-top-left-radius: var(--border-radius, #{$base-border-radius-md}) !important; border-top-right-radius: var(--border-radius, #{$base-border-radius-md}) !important; } +.rounded-end { border-top-right-radius: var(--border-radius, #{$base-border-radius-md}) !important; border-bottom-right-radius: var(--border-radius, #{$base-border-radius-md}) !important; } +.rounded-bottom { border-bottom-right-radius: var(--border-radius, #{$base-border-radius-md}) !important; border-bottom-left-radius: var(--border-radius, #{$base-border-radius-md}) !important; } +.rounded-start { border-bottom-left-radius: var(--border-radius, #{$base-border-radius-md}) !important; border-top-left-radius: var(--border-radius, #{$base-border-radius-md}) !important; } + +.rounded-top-start { border-top-left-radius: var(--border-radius, #{$base-border-radius-md}) !important; } +.rounded-top-end { border-top-right-radius: var(--border-radius, #{$base-border-radius-md}) !important; } +.rounded-bottom-end { border-bottom-right-radius: var(--border-radius, #{$base-border-radius-md}) !important; } +.rounded-bottom-start { border-bottom-left-radius: var(--border-radius, #{$base-border-radius-md}) !important; } + +// WIDTH AND HEIGHT +.w-25 { width: 25% !important; } +.w-50 { width: 50% !important; } +.w-75 { width: 75% !important; } +.w-100 { width: 100% !important; } +.w-auto { width: auto !important; } + +.mw-100 { max-width: 100% !important; } +.mw-75 { max-width: 75% !important; } +.mw-50 { max-width: 50% !important; } +.mw-25 { max-width: 25% !important; } + +.h-25 { height: 25% !important; } +.h-50 { height: 50% !important; } +.h-75 { height: 75% !important; } +.h-100 { height: 100% !important; } +.h-auto { height: auto !important; } + +.mh-100 { max-height: 100% !important; } +.mh-75 { max-height: 75% !important; } +.mh-50 { max-height: 50% !important; } +.mh-25 { max-height: 25% !important; } + +// Min width/height +.min-w-0 { min-width: 0 !important; } +.min-w-100 { min-width: 100% !important; } +.min-h-0 { min-height: 0 !important; } +.min-h-100 { min-height: 100% !important; } + +// Viewport dimensions +.vw-100 { width: 100vw !important; } +.min-vw-100 { min-width: 100vw !important; } + +.vh-100 { height: 100vh !important; } +.min-vh-100 { min-height: 100vh !important; } + +// SHADOWS - Using base shadow tokens +.shadow-none { box-shadow: #{$base-shadow-none} !important; } +.shadow-sm { box-shadow: var(--shadow-sm, #{$base-shadow-sm}) !important; } +.shadow { box-shadow: var(--shadow, #{$base-shadow-md}) !important; } +.shadow-md { box-shadow: var(--shadow-md, #{$base-shadow-lg}) !important; } +.shadow-lg { box-shadow: var(--shadow-lg, #{$base-shadow-xl}) !important; } +.shadow-xl { box-shadow: var(--shadow-xl, #{$base-shadow-2xl}) !important; } + +// FOCUS UTILITIES +.focus\:outline-none:focus { + outline: 2px solid transparent !important; + outline-offset: 2px !important; +} + +.focus\:ring:focus { + outline: 2px solid transparent !important; + outline-offset: 2px !important; + box-shadow: var(--focus-ring-shadow, 0 0 0 3px rgba(59, 130, 246, 0.5)) !important; +} + +.focus\:ring-2:focus { + outline: 2px solid transparent !important; + outline-offset: 2px !important; + box-shadow: var(--focus-ring-shadow, 0 0 0 2px rgba(59, 130, 246, 0.5)) !important; +} + +.focus\:ring-4:focus { + outline: 2px solid transparent !important; + outline-offset: 2px !important; + box-shadow: var(--focus-ring-shadow, 0 0 0 4px rgba(59, 130, 246, 0.5)) !important; +} + +// SCREEN READER ONLY +.sr-only { + position: absolute !important; + width: 1px !important; + height: 1px !important; + padding: 0 !important; + margin: -1px !important; + overflow: hidden !important; + clip: rect(0, 0, 0, 0) !important; + white-space: nowrap !important; + border: 0 !important; +} + +.sr-only-focusable:focus { + position: static !important; + width: auto !important; + height: auto !important; + padding: inherit !important; + margin: inherit !important; + overflow: visible !important; + clip: auto !important; + white-space: normal !important; +} + +// PRINT UTILITIES +@media print { + .d-print-none { display: none !important; } + .d-print-inline { display: inline !important; } + .d-print-inline-block { display: inline-block !important; } + .d-print-block { display: block !important; } + .d-print-flex { display: flex !important; } + .d-print-inline-flex { display: inline-flex !important; } + .d-print-grid { display: grid !important; } + .d-print-table { display: table !important; } + .d-print-table-row { display: table-row !important; } + .d-print-table-cell { display: table-cell !important; } +} + +// IMAGE UTILITIES +.img-fluid { + max-width: 100% !important; + height: auto !important; +} + +.img-thumbnail { + padding: var(--img-thumbnail-padding, 4px) !important; + background-color: var(--img-thumbnail-bg, white) !important; + border: var(--img-thumbnail-border-width, 1px) solid var(--img-thumbnail-border-color, #dee2e6) !important; + border-radius: var(--img-thumbnail-border-radius, 6px) !important; + max-width: 100% !important; + height: auto !important; +} + +// FIGURE +.figure { + display: inline-block !important; + + .figure-img { + margin-bottom: var(--figure-caption-margin-top, 8px) !important; + line-height: 1 !important; + } + + .figure-caption { + font-size: var(--figure-caption-font-size, 0.875em) !important; + color: var(--figure-caption-color, rgba(0, 0, 0, 0.6)) !important; + } +} + +// TABLE UTILITIES +.table-responsive { + overflow-x: auto !important; + + .table { + margin-bottom: 0 !important; + } +} + +@media (max-width: #{$base-breakpoint-xs - 1px}) { + .table-responsive-sm { + overflow-x: auto !important; + } +} + +@media (max-width: #{$base-breakpoint-md - 1px}) { + .table-responsive-md { + overflow-x: auto !important; + } +} + +@media (max-width: #{$base-breakpoint-lg - 1px}) { + .table-responsive-lg { + overflow-x: auto !important; + } +} + +@media (max-width: #{$base-breakpoint-xl - 1px}) { + .table-responsive-xl { + overflow-x: auto !important; + } +} + +// STRETCHED LINK +.stretched-link::after { + position: absolute !important; + top: 0 !important; + right: 0 !important; + bottom: 0 !important; + left: 0 !important; + z-index: 1 !important; + content: "" !important; +} \ No newline at end of file diff --git a/projects/shared-ui/src/styles/commons/utilities/_index.scss b/projects/shared-ui/src/styles/commons/utilities/_index.scss new file mode 100644 index 0000000..3b89d37 --- /dev/null +++ b/projects/shared-ui/src/styles/commons/utilities/_index.scss @@ -0,0 +1,11 @@ +// ========================================================================== +// COMMONS UTILITIES INDEX +// ========================================================================== +// Import all utility-related commons files +// Theme-agnostic utility classes +// ========================================================================== + +@import 'layout-utilities'; +@import 'spacing-utilities'; +@import 'display-utilities'; +@import 'scrollbar-utilities'; \ No newline at end of file diff --git a/projects/shared-ui/src/styles/commons/utilities/_layout-utilities.scss b/projects/shared-ui/src/styles/commons/utilities/_layout-utilities.scss new file mode 100644 index 0000000..9178a37 --- /dev/null +++ b/projects/shared-ui/src/styles/commons/utilities/_layout-utilities.scss @@ -0,0 +1,392 @@ +// ========================================================================== +// LAYOUT UTILITIES +// ========================================================================== +// Utility classes for common layout needs +// Theme-agnostic layout helpers +// ========================================================================== + +// DISPLAY UTILITIES +.d-none { display: none !important; } +.d-inline { display: inline !important; } +.d-inline-block { display: inline-block !important; } +.d-block { display: block !important; } +.d-flex { display: flex !important; } +.d-inline-flex { display: inline-flex !important; } +.d-grid { display: grid !important; } +.d-inline-grid { display: inline-grid !important; } +.d-table { display: table !important; } +.d-table-cell { display: table-cell !important; } + +// RESPONSIVE DISPLAY UTILITIES - Using base breakpoint tokens +@media (max-width: #{$base-breakpoint-xs - 1px}) { + .d-xs-none { display: none !important; } + .d-xs-inline { display: inline !important; } + .d-xs-inline-block { display: inline-block !important; } + .d-xs-block { display: block !important; } + .d-xs-flex { display: flex !important; } + .d-xs-inline-flex { display: inline-flex !important; } + .d-xs-grid { display: grid !important; } + .d-xs-inline-grid { display: inline-grid !important; } +} + +@media (min-width: #{$base-breakpoint-sm}) { + .d-sm-none { display: none !important; } + .d-sm-inline { display: inline !important; } + .d-sm-inline-block { display: inline-block !important; } + .d-sm-block { display: block !important; } + .d-sm-flex { display: flex !important; } + .d-sm-inline-flex { display: inline-flex !important; } + .d-sm-grid { display: grid !important; } + .d-sm-inline-grid { display: inline-grid !important; } +} + +@media (min-width: #{$base-breakpoint-md}) { + .d-md-none { display: none !important; } + .d-md-inline { display: inline !important; } + .d-md-inline-block { display: inline-block !important; } + .d-md-block { display: block !important; } + .d-md-flex { display: flex !important; } + .d-md-inline-flex { display: inline-flex !important; } + .d-md-grid { display: grid !important; } + .d-md-inline-grid { display: inline-grid !important; } +} + +@media (min-width: #{$base-breakpoint-lg}) { + .d-lg-none { display: none !important; } + .d-lg-inline { display: inline !important; } + .d-lg-inline-block { display: inline-block !important; } + .d-lg-block { display: block !important; } + .d-lg-flex { display: flex !important; } + .d-lg-inline-flex { display: inline-flex !important; } + .d-lg-grid { display: grid !important; } + .d-lg-inline-grid { display: inline-grid !important; } +} + +@media (min-width: #{$base-breakpoint-xl}) { + .d-xl-none { display: none !important; } + .d-xl-inline { display: inline !important; } + .d-xl-inline-block { display: inline-block !important; } + .d-xl-block { display: block !important; } + .d-xl-flex { display: flex !important; } + .d-xl-inline-flex { display: inline-flex !important; } + .d-xl-grid { display: grid !important; } + .d-xl-inline-grid { display: inline-grid !important; } +} + +// POSITION UTILITIES +.position-static { position: static !important; } +.position-relative { position: relative !important; } +.position-absolute { position: absolute !important; } +.position-fixed { position: fixed !important; } +.position-sticky { position: sticky !important; } + +// POSITIONING +.top-0 { top: 0 !important; } +.top-50 { top: 50% !important; } +.top-100 { top: 100% !important; } +.bottom-0 { bottom: 0 !important; } +.bottom-50 { bottom: 50% !important; } +.bottom-100 { bottom: 100% !important; } +.start-0 { left: 0 !important; } +.start-50 { left: 50% !important; } +.start-100 { left: 100% !important; } +.end-0 { right: 0 !important; } +.end-50 { right: 50% !important; } +.end-100 { right: 100% !important; } + +// TRANSLATE UTILITIES +.translate-middle { transform: translate(-50%, -50%) !important; } +.translate-middle-x { transform: translateX(-50%) !important; } +.translate-middle-y { transform: translateY(-50%) !important; } + +// OVERFLOW UTILITIES +.overflow-auto { overflow: auto !important; } +.overflow-hidden { overflow: hidden !important; } +.overflow-visible { overflow: visible !important; } +.overflow-scroll { overflow: scroll !important; } +.overflow-x-auto { overflow-x: auto !important; } +.overflow-x-hidden { overflow-x: hidden !important; } +.overflow-x-visible { overflow-x: visible !important; } +.overflow-x-scroll { overflow-x: scroll !important; } +.overflow-y-auto { overflow-y: auto !important; } +.overflow-y-hidden { overflow-y: hidden !important; } +.overflow-y-visible { overflow-y: visible !important; } +.overflow-y-scroll { overflow-y: scroll !important; } + +// Z-INDEX UTILITIES +.z-n1 { z-index: -1 !important; } +.z-0 { z-index: 0 !important; } +.z-1 { z-index: 1 !important; } +.z-2 { z-index: 2 !important; } +.z-3 { z-index: 3 !important; } +.z-10 { z-index: 10 !important; } +.z-20 { z-index: 20 !important; } +.z-30 { z-index: 30 !important; } +.z-40 { z-index: 40 !important; } +.z-50 { z-index: 50 !important; } +.z-100 { z-index: 100 !important; } +.z-1000 { z-index: 1000 !important; } +.z-1010 { z-index: 1010 !important; } +.z-1020 { z-index: 1020 !important; } +.z-1030 { z-index: 1030 !important; } +.z-1040 { z-index: 1040 !important; } +.z-1050 { z-index: 1050 !important; } +.z-1060 { z-index: 1060 !important; } +.z-1070 { z-index: 1070 !important; } + +// FLEXBOX UTILITIES +// Direction +.flex-row { flex-direction: row !important; } +.flex-column { flex-direction: column !important; } +.flex-row-reverse { flex-direction: row-reverse !important; } +.flex-column-reverse { flex-direction: column-reverse !important; } + +// Responsive flex direction +@media (max-width: 575px) { + .flex-xs-row { flex-direction: row !important; } + .flex-xs-column { flex-direction: column !important; } + .flex-xs-row-reverse { flex-direction: row-reverse !important; } + .flex-xs-column-reverse { flex-direction: column-reverse !important; } +} + +@media (min-width: 576px) { + .flex-sm-row { flex-direction: row !important; } + .flex-sm-column { flex-direction: column !important; } + .flex-sm-row-reverse { flex-direction: row-reverse !important; } + .flex-sm-column-reverse { flex-direction: column-reverse !important; } +} + +@media (min-width: 768px) { + .flex-md-row { flex-direction: row !important; } + .flex-md-column { flex-direction: column !important; } + .flex-md-row-reverse { flex-direction: row-reverse !important; } + .flex-md-column-reverse { flex-direction: column-reverse !important; } +} + +// Wrap +.flex-wrap { flex-wrap: wrap !important; } +.flex-nowrap { flex-wrap: nowrap !important; } +.flex-wrap-reverse { flex-wrap: wrap-reverse !important; } + +// Justify content +.justify-content-start { justify-content: flex-start !important; } +.justify-content-end { justify-content: flex-end !important; } +.justify-content-center { justify-content: center !important; } +.justify-content-between { justify-content: space-between !important; } +.justify-content-around { justify-content: space-around !important; } +.justify-content-evenly { justify-content: space-evenly !important; } + +// Align items +.align-items-start { align-items: flex-start !important; } +.align-items-end { align-items: flex-end !important; } +.align-items-center { align-items: center !important; } +.align-items-baseline { align-items: baseline !important; } +.align-items-stretch { align-items: stretch !important; } + +// Align content +.align-content-start { align-content: flex-start !important; } +.align-content-end { align-content: flex-end !important; } +.align-content-center { align-content: center !important; } +.align-content-between { align-content: space-between !important; } +.align-content-around { align-content: space-around !important; } +.align-content-stretch { align-content: stretch !important; } + +// Align self +.align-self-auto { align-self: auto !important; } +.align-self-start { align-self: flex-start !important; } +.align-self-end { align-self: flex-end !important; } +.align-self-center { align-self: center !important; } +.align-self-baseline { align-self: baseline !important; } +.align-self-stretch { align-self: stretch !important; } + +// Flex grow/shrink +.flex-fill { flex: 1 1 auto !important; } +.flex-grow-0 { flex-grow: 0 !important; } +.flex-grow-1 { flex-grow: 1 !important; } +.flex-shrink-0 { flex-shrink: 0 !important; } +.flex-shrink-1 { flex-shrink: 1 !important; } + +// ORDER +.order-first { order: -1 !important; } +.order-0 { order: 0 !important; } +.order-1 { order: 1 !important; } +.order-2 { order: 2 !important; } +.order-3 { order: 3 !important; } +.order-4 { order: 4 !important; } +.order-5 { order: 5 !important; } +.order-last { order: 6 !important; } + +// GRID UTILITIES +.grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)) !important; } +.grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)) !important; } +.grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)) !important; } +.grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)) !important; } +.grid-cols-5 { grid-template-columns: repeat(5, minmax(0, 1fr)) !important; } +.grid-cols-6 { grid-template-columns: repeat(6, minmax(0, 1fr)) !important; } +.grid-cols-12 { grid-template-columns: repeat(12, minmax(0, 1fr)) !important; } + +.grid-rows-1 { grid-template-rows: repeat(1, minmax(0, 1fr)) !important; } +.grid-rows-2 { grid-template-rows: repeat(2, minmax(0, 1fr)) !important; } +.grid-rows-3 { grid-template-rows: repeat(3, minmax(0, 1fr)) !important; } +.grid-rows-4 { grid-template-rows: repeat(4, minmax(0, 1fr)) !important; } +.grid-rows-5 { grid-template-rows: repeat(5, minmax(0, 1fr)) !important; } +.grid-rows-6 { grid-template-rows: repeat(6, minmax(0, 1fr)) !important; } + +// Grid column spans +.col-span-1 { grid-column: span 1 / span 1 !important; } +.col-span-2 { grid-column: span 2 / span 2 !important; } +.col-span-3 { grid-column: span 3 / span 3 !important; } +.col-span-4 { grid-column: span 4 / span 4 !important; } +.col-span-5 { grid-column: span 5 / span 5 !important; } +.col-span-6 { grid-column: span 6 / span 6 !important; } +.col-span-full { grid-column: 1 / -1 !important; } + +// Grid row spans +.row-span-1 { grid-row: span 1 / span 1 !important; } +.row-span-2 { grid-row: span 2 / span 2 !important; } +.row-span-3 { grid-row: span 3 / span 3 !important; } +.row-span-4 { grid-row: span 4 / span 4 !important; } +.row-span-5 { grid-row: span 5 / span 5 !important; } +.row-span-6 { grid-row: span 6 / span 6 !important; } +.row-span-full { grid-row: 1 / -1 !important; } + +// Grid column start/end +.col-start-1 { grid-column-start: 1 !important; } +.col-start-2 { grid-column-start: 2 !important; } +.col-start-3 { grid-column-start: 3 !important; } +.col-start-4 { grid-column-start: 4 !important; } +.col-start-5 { grid-column-start: 5 !important; } +.col-start-6 { grid-column-start: 6 !important; } +.col-start-auto { grid-column-start: auto !important; } + +.col-end-1 { grid-column-end: 1 !important; } +.col-end-2 { grid-column-end: 2 !important; } +.col-end-3 { grid-column-end: 3 !important; } +.col-end-4 { grid-column-end: 4 !important; } +.col-end-5 { grid-column-end: 5 !important; } +.col-end-6 { grid-column-end: 6 !important; } +.col-end-auto { grid-column-end: auto !important; } + +// Grid row start/end +.row-start-1 { grid-row-start: 1 !important; } +.row-start-2 { grid-row-start: 2 !important; } +.row-start-3 { grid-row-start: 3 !important; } +.row-start-4 { grid-row-start: 4 !important; } +.row-start-5 { grid-row-start: 5 !important; } +.row-start-6 { grid-row-start: 6 !important; } +.row-start-auto { grid-row-start: auto !important; } + +.row-end-1 { grid-row-end: 1 !important; } +.row-end-2 { grid-row-end: 2 !important; } +.row-end-3 { grid-row-end: 3 !important; } +.row-end-4 { grid-row-end: 4 !important; } +.row-end-5 { grid-row-end: 5 !important; } +.row-end-6 { grid-row-end: 6 !important; } +.row-end-auto { grid-row-end: auto !important; } + +// Grid auto flow +.grid-flow-row { grid-auto-flow: row !important; } +.grid-flow-col { grid-auto-flow: column !important; } +.grid-flow-dense { grid-auto-flow: dense !important; } +.grid-flow-row-dense { grid-auto-flow: row dense !important; } +.grid-flow-col-dense { grid-auto-flow: column dense !important; } + +// FLOAT UTILITIES +.float-start { float: left !important; } +.float-end { float: right !important; } +.float-none { float: none !important; } + +// CLEAR UTILITIES +.clearfix::after { + display: block; + clear: both; + content: ""; +} + +// OBJECT FIT UTILITIES +.object-contain { object-fit: contain !important; } +.object-cover { object-fit: cover !important; } +.object-fill { object-fit: fill !important; } +.object-scale { object-fit: scale-down !important; } +.object-none { object-fit: none !important; } + +// OBJECT POSITION UTILITIES +.object-top { object-position: top !important; } +.object-bottom { object-position: bottom !important; } +.object-center { object-position: center !important; } +.object-left { object-position: left !important; } +.object-left-bottom { object-position: left bottom !important; } +.object-left-top { object-position: left top !important; } +.object-right { object-position: right !important; } +.object-right-bottom { object-position: right bottom !important; } +.object-right-top { object-position: right top !important; } + +// VISIBILITY UTILITIES +.visible { visibility: visible !important; } +.invisible { visibility: hidden !important; } + +// INTERACTION UTILITIES +.user-select-all { user-select: all !important; } +.user-select-auto { user-select: auto !important; } +.user-select-none { user-select: none !important; } + +.pointer-events-none { pointer-events: none !important; } +.pointer-events-auto { pointer-events: auto !important; } + +// CURSOR UTILITIES +.cursor-auto { cursor: auto !important; } +.cursor-default { cursor: default !important; } +.cursor-pointer { cursor: pointer !important; } +.cursor-wait { cursor: wait !important; } +.cursor-text { cursor: text !important; } +.cursor-move { cursor: move !important; } +.cursor-help { cursor: help !important; } +.cursor-not-allowed { cursor: not-allowed !important; } +.cursor-grab { cursor: grab !important; } +.cursor-grabbing { cursor: grabbing !important; } + +// RESIZE UTILITIES +.resize-none { resize: none !important; } +.resize-y { resize: vertical !important; } +.resize-x { resize: horizontal !important; } +.resize { resize: both !important; } + +// BOX SIZING UTILITIES +.box-border { box-sizing: border-box !important; } +.box-content { box-sizing: content-box !important; } + +// ASPECT RATIO UTILITIES (Modern) +@supports (aspect-ratio: 1 / 1) { + .aspect-auto { aspect-ratio: auto !important; } + .aspect-square { aspect-ratio: 1 / 1 !important; } + .aspect-video { aspect-ratio: 16 / 9 !important; } + .aspect-4-3 { aspect-ratio: 4 / 3 !important; } + .aspect-3-2 { aspect-ratio: 3 / 2 !important; } + .aspect-21-9 { aspect-ratio: 21 / 9 !important; } +} + +// CLIP PATH UTILITIES +.clip-ellipse { clip-path: ellipse(50% 50% at 50% 50%) !important; } +.clip-circle { clip-path: circle(50% at 50% 50%) !important; } +.clip-triangle { clip-path: polygon(50% 0%, 0% 100%, 100% 100%) !important; } +.clip-none { clip-path: none !important; } + +// TRANSFORM UTILITIES +.transform { transform: var(--tw-transform) !important; } +.transform-none { transform: none !important; } + +.rotate-0 { --tw-rotate: 0deg; transform: rotate(var(--tw-rotate)) !important; } +.rotate-45 { --tw-rotate: 45deg; transform: rotate(var(--tw-rotate)) !important; } +.rotate-90 { --tw-rotate: 90deg; transform: rotate(var(--tw-rotate)) !important; } +.rotate-180 { --tw-rotate: 180deg; transform: rotate(var(--tw-rotate)) !important; } + +.scale-0 { --tw-scale-x: 0; --tw-scale-y: 0; transform: scale(var(--tw-scale-x), var(--tw-scale-y)) !important; } +.scale-50 { --tw-scale-x: 0.5; --tw-scale-y: 0.5; transform: scale(var(--tw-scale-x), var(--tw-scale-y)) !important; } +.scale-75 { --tw-scale-x: 0.75; --tw-scale-y: 0.75; transform: scale(var(--tw-scale-x), var(--tw-scale-y)) !important; } +.scale-90 { --tw-scale-x: 0.9; --tw-scale-y: 0.9; transform: scale(var(--tw-scale-x), var(--tw-scale-y)) !important; } +.scale-95 { --tw-scale-x: 0.95; --tw-scale-y: 0.95; transform: scale(var(--tw-scale-x), var(--tw-scale-y)) !important; } +.scale-100 { --tw-scale-x: 1; --tw-scale-y: 1; transform: scale(var(--tw-scale-x), var(--tw-scale-y)) !important; } +.scale-105 { --tw-scale-x: 1.05; --tw-scale-y: 1.05; transform: scale(var(--tw-scale-x), var(--tw-scale-y)) !important; } +.scale-110 { --tw-scale-x: 1.1; --tw-scale-y: 1.1; transform: scale(var(--tw-scale-x), var(--tw-scale-y)) !important; } +.scale-125 { --tw-scale-x: 1.25; --tw-scale-y: 1.25; transform: scale(var(--tw-scale-x), var(--tw-scale-y)) !important; } +.scale-150 { --tw-scale-x: 1.5; --tw-scale-y: 1.5; transform: scale(var(--tw-scale-x), var(--tw-scale-y)) !important; } \ No newline at end of file diff --git a/projects/shared-ui/src/styles/commons/utilities/_scrollbar-utilities.scss b/projects/shared-ui/src/styles/commons/utilities/_scrollbar-utilities.scss new file mode 100644 index 0000000..966b884 --- /dev/null +++ b/projects/shared-ui/src/styles/commons/utilities/_scrollbar-utilities.scss @@ -0,0 +1,408 @@ +// ========================================================================== +// SCROLLBAR UTILITIES +// ========================================================================== +// Scrollbar styling utilities with visibility options +// Theme-agnostic scrollbar controls +// ========================================================================== + +// SCROLLBAR VISIBILITY OPTIONS +.scrollbar-visible { + scrollbar-width: thin; + scrollbar-color: var(--scrollbar-thumb, rgba(0, 0, 0, 0.2)) var(--scrollbar-track, transparent); + + // Webkit scrollbar styling (Chrome, Safari, Edge) + &::-webkit-scrollbar { + width: #{$base-spacing-2}; // 8px + height: #{$base-spacing-2}; + } + + &::-webkit-scrollbar-track { + background: var(--scrollbar-track, transparent); + border-radius: #{$base-border-radius-sm}; + } + + &::-webkit-scrollbar-thumb { + background: var(--scrollbar-thumb, rgba(0, 0, 0, 0.2)); + border-radius: #{$base-border-radius-sm}; + border: 1px solid var(--scrollbar-thumb-border, transparent); + + &:hover { + background: var(--scrollbar-thumb-hover, rgba(0, 0, 0, 0.3)); + } + + &:active { + background: var(--scrollbar-thumb-active, rgba(0, 0, 0, 0.4)); + } + } + + &::-webkit-scrollbar-corner { + background: var(--scrollbar-corner, transparent); + } +} + +.scrollbar-invisible { + // Firefox + scrollbar-width: none; + + // Internet Explorer and Edge + -ms-overflow-style: none; + + // Webkit browsers (Chrome, Safari, newer Edge) + &::-webkit-scrollbar { + display: none; + width: 0; + height: 0; + } +} + +// SCROLLBAR SIZING OPTIONS +.scrollbar-thin { + scrollbar-width: thin; + + &::-webkit-scrollbar { + width: #{$base-spacing-1}; // 4px + height: #{$base-spacing-1}; + } +} + +.scrollbar-thick { + scrollbar-width: auto; + + &::-webkit-scrollbar { + width: #{$base-spacing-3}; // 12px + height: #{$base-spacing-3}; + } +} + +// SCROLLBAR BEHAVIOR OPTIONS +.scroll-smooth { + scroll-behavior: smooth; +} + +.scroll-auto { + scroll-behavior: auto; +} + +// OVERFLOW UTILITIES WITH SCROLLBAR CONTROL +.overflow-auto-visible { + overflow: auto; + @extend .scrollbar-visible; +} + +.overflow-auto-invisible { + overflow: auto; + @extend .scrollbar-invisible; +} + +.overflow-scroll-visible { + overflow: scroll; + @extend .scrollbar-visible; +} + +.overflow-scroll-invisible { + overflow: scroll; + @extend .scrollbar-invisible; +} + +.overflow-y-auto-visible { + overflow-y: auto; + overflow-x: hidden; + @extend .scrollbar-visible; +} + +.overflow-y-auto-invisible { + overflow-y: auto; + overflow-x: hidden; + @extend .scrollbar-invisible; +} + +.overflow-x-auto-visible { + overflow-x: auto; + overflow-y: hidden; + @extend .scrollbar-visible; +} + +.overflow-x-auto-invisible { + overflow-x: auto; + overflow-y: hidden; + @extend .scrollbar-invisible; +} + +// HOVER-BASED SCROLLBAR VISIBILITY +.scrollbar-hover { + // Hide by default + @extend .scrollbar-invisible; + + // Show on hover + &:hover { + @extend .scrollbar-visible; + } +} + +// FOCUS-BASED SCROLLBAR VISIBILITY +.scrollbar-focus { + // Hide by default + @extend .scrollbar-invisible; + + // Show on focus-within + &:focus-within { + @extend .scrollbar-visible; + } +} + +// SCROLLBAR THEME VARIANTS +.scrollbar-light { + --scrollbar-track: rgba(255, 255, 255, 0.1); + --scrollbar-thumb: rgba(255, 255, 255, 0.3); + --scrollbar-thumb-hover: rgba(255, 255, 255, 0.5); + --scrollbar-thumb-active: rgba(255, 255, 255, 0.7); + --scrollbar-thumb-border: rgba(255, 255, 255, 0.1); +} + +.scrollbar-dark { + --scrollbar-track: rgba(0, 0, 0, 0.1); + --scrollbar-thumb: rgba(0, 0, 0, 0.3); + --scrollbar-thumb-hover: rgba(0, 0, 0, 0.5); + --scrollbar-thumb-active: rgba(0, 0, 0, 0.7); + --scrollbar-thumb-border: rgba(0, 0, 0, 0.1); +} + +// SCROLLBAR POSITION UTILITIES +.scroll-padding-block-start { + scroll-padding-block-start: var(--scroll-padding-block-start, #{$semantic-spacing-layout-section-sm}); +} + +.scroll-padding-block-end { + scroll-padding-block-end: var(--scroll-padding-block-end, #{$semantic-spacing-layout-section-sm}); +} + +.scroll-padding-inline-start { + scroll-padding-inline-start: var(--scroll-padding-inline-start, #{$semantic-spacing-component-padding-lg}); +} + +.scroll-padding-inline-end { + scroll-padding-inline-end: var(--scroll-padding-inline-end, #{$semantic-spacing-component-padding-lg}); +} + +// SCROLL SNAP UTILITIES +.scroll-snap-x { + scroll-snap-type: x mandatory; + + > * { + scroll-snap-align: start; + } +} + +.scroll-snap-y { + scroll-snap-type: y mandatory; + + > * { + scroll-snap-align: start; + } +} + +.scroll-snap-both { + scroll-snap-type: both mandatory; + + > * { + scroll-snap-align: start; + } +} + +.scroll-snap-proximity { + scroll-snap-type: y proximity; + + > * { + scroll-snap-align: start; + } +} + +.scroll-snap-center { + > * { + scroll-snap-align: center; + } +} + +.scroll-snap-end { + > * { + scroll-snap-align: end; + } +} + +// MOMENTUM SCROLLING (iOS) +.scroll-momentum { + -webkit-overflow-scrolling: touch; +} + +// CUSTOM SCROLLBAR COMPONENT CLASSES +.custom-scrollbar { + // Base scrollbar with custom styling + @extend .scrollbar-visible; + + &::-webkit-scrollbar-thumb { + background: linear-gradient(45deg, + var(--scrollbar-gradient-start, #667eea), + var(--scrollbar-gradient-end, #764ba2) + ); + border-radius: #{$base-border-radius-lg}; + border: 2px solid var(--scrollbar-border, transparent); + + &:hover { + transform: scale(1.1); + transition: transform 0.2s ease; + } + } + + &::-webkit-scrollbar-track { + background: var(--scrollbar-track-custom, rgba(0, 0, 0, 0.05)); + border-radius: #{$base-border-radius-lg}; + margin: #{$base-spacing-1}; + } +} + +// DEVELOPER CHOICE MIXINS - For programmatic scrollbar control +@mixin scrollbar-choice($visible: true) { + @if $visible { + @extend .scrollbar-visible; + } @else { + @extend .scrollbar-invisible; + } +} + +// Utility classes for Angular component integration +.scrollbar-auto-visible { + @include scrollbar-choice(true); +} + +.scrollbar-auto-invisible { + @include scrollbar-choice(false); +} + +// RESPONSIVE SCROLLBAR UTILITIES +@media (max-width: #{$base-breakpoint-md}) { + .scrollbar-mobile-invisible { + // Firefox + scrollbar-width: none; + + // Internet Explorer and Edge + -ms-overflow-style: none; + + // Webkit browsers (Chrome, Safari, newer Edge) + &::-webkit-scrollbar { + display: none; + width: 0; + height: 0; + } + } + + .scrollbar-mobile-visible { + scrollbar-width: thin; + scrollbar-color: var(--scrollbar-thumb, rgba(0, 0, 0, 0.2)) var(--scrollbar-track, transparent); + + // Webkit scrollbar styling (Chrome, Safari, Edge) + &::-webkit-scrollbar { + width: #{$base-spacing-2}; // 8px + height: #{$base-spacing-2}; + } + + &::-webkit-scrollbar-track { + background: var(--scrollbar-track, transparent); + border-radius: #{$base-border-radius-sm}; + } + + &::-webkit-scrollbar-thumb { + background: var(--scrollbar-thumb, rgba(0, 0, 0, 0.2)); + border-radius: #{$base-border-radius-sm}; + border: 1px solid var(--scrollbar-thumb-border, transparent); + + &:hover { + background: var(--scrollbar-thumb-hover, rgba(0, 0, 0, 0.3)); + } + + &:active { + background: var(--scrollbar-thumb-active, rgba(0, 0, 0, 0.4)); + } + } + + &::-webkit-scrollbar-corner { + background: var(--scrollbar-corner, transparent); + } + } +} + +@media (min-width: #{$base-breakpoint-md}) { + .scrollbar-desktop-invisible { + // Firefox + scrollbar-width: none; + + // Internet Explorer and Edge + -ms-overflow-style: none; + + // Webkit browsers (Chrome, Safari, newer Edge) + &::-webkit-scrollbar { + display: none; + width: 0; + height: 0; + } + } + + .scrollbar-desktop-visible { + scrollbar-width: thin; + scrollbar-color: var(--scrollbar-thumb, rgba(0, 0, 0, 0.2)) var(--scrollbar-track, transparent); + + // Webkit scrollbar styling (Chrome, Safari, Edge) + &::-webkit-scrollbar { + width: #{$base-spacing-2}; // 8px + height: #{$base-spacing-2}; + } + + &::-webkit-scrollbar-track { + background: var(--scrollbar-track, transparent); + border-radius: #{$base-border-radius-sm}; + } + + &::-webkit-scrollbar-thumb { + background: var(--scrollbar-thumb, rgba(0, 0, 0, 0.2)); + border-radius: #{$base-border-radius-sm}; + border: 1px solid var(--scrollbar-thumb-border, transparent); + + &:hover { + background: var(--scrollbar-thumb-hover, rgba(0, 0, 0, 0.3)); + } + + &:active { + background: var(--scrollbar-thumb-active, rgba(0, 0, 0, 0.4)); + } + } + + &::-webkit-scrollbar-corner { + background: var(--scrollbar-corner, transparent); + } + } +} + +// ACCESSIBILITY CONSIDERATIONS +.scrollbar-high-contrast { + --scrollbar-thumb: var(--color-text, #000); + --scrollbar-thumb-hover: var(--color-text-emphasis, #333); + --scrollbar-track: var(--color-border, #ccc); +} + +.scrollbar-reduced-motion { + scroll-behavior: auto; + + &::-webkit-scrollbar-thumb { + transition: none; + } +} + +@media (prefers-reduced-motion: reduce) { + .scrollbar-visible, + .custom-scrollbar { + scroll-behavior: auto; + + &::-webkit-scrollbar-thumb { + transition: none; + } + } +} \ No newline at end of file diff --git a/projects/shared-ui/src/styles/commons/utilities/_spacing-utilities.scss b/projects/shared-ui/src/styles/commons/utilities/_spacing-utilities.scss new file mode 100644 index 0000000..96f96e8 --- /dev/null +++ b/projects/shared-ui/src/styles/commons/utilities/_spacing-utilities.scss @@ -0,0 +1,455 @@ +// ========================================================================== +// SPACING UTILITIES +// ========================================================================== +// Utility classes for margin and padding +// Uses CSS custom properties for consistent spacing scale +// ========================================================================== + +// SPACING SCALE - Using base design tokens +:root { + --space-0: #{$base-spacing-0}; + --space-1: #{$base-spacing-1}; + --space-2: #{$base-spacing-2}; + --space-3: #{$base-spacing-3}; + --space-4: #{$base-spacing-4}; + --space-5: #{$base-spacing-5}; + --space-6: #{$base-spacing-6}; + --space-7: #{$base-spacing-7}; + --space-8: #{$base-spacing-8}; + --space-9: #{$base-spacing-9}; + --space-10: #{$base-spacing-10}; + --space-11: #{$base-spacing-11}; + --space-12: #{$base-spacing-12}; + --space-14: #{$base-spacing-14}; + --space-16: #{$base-spacing-16}; + --space-20: #{$base-spacing-20}; + --space-24: #{$base-spacing-24}; + --space-28: #{$base-spacing-28}; + --space-32: #{$base-spacing-32}; + --space-36: #{$base-spacing-36}; + --space-40: #{$base-spacing-40}; + --space-44: #{$base-spacing-44}; + --space-48: #{$base-spacing-48}; + --space-52: #{$base-spacing-52}; + --space-56: #{$base-spacing-56}; + --space-60: #{$base-spacing-60}; + --space-64: #{$base-spacing-64}; + --space-72: #{$base-spacing-72}; + --space-80: #{$base-spacing-80}; + --space-96: #{$base-spacing-96}; + + // Negative spacing + --space--1: -#{$base-spacing-1}; + --space--2: -#{$base-spacing-2}; + --space--3: -#{$base-spacing-3}; + --space--4: -#{$base-spacing-4}; + --space--5: -#{$base-spacing-5}; + --space--6: -#{$base-spacing-6}; + --space--7: -#{$base-spacing-7}; + --space--8: -#{$base-spacing-8}; + --space--9: -#{$base-spacing-9}; + --space--10: -#{$base-spacing-10}; + --space--11: -#{$base-spacing-11}; + --space--12: -#{$base-spacing-12}; + --space--14: -#{$base-spacing-14}; + --space--16: -#{$base-spacing-16}; + --space--20: -#{$base-spacing-20}; + --space--24: -#{$base-spacing-24}; + --space--28: -#{$base-spacing-28}; + --space--32: -#{$base-spacing-32}; +} + +// MARGIN UTILITIES +// All margins +.m-0 { margin: var(--space-0) !important; } +.m-1 { margin: var(--space-1) !important; } +.m-2 { margin: var(--space-2) !important; } +.m-3 { margin: var(--space-3) !important; } +.m-4 { margin: var(--space-4) !important; } +.m-5 { margin: var(--space-5) !important; } +.m-6 { margin: var(--space-6) !important; } +.m-7 { margin: var(--space-7) !important; } +.m-8 { margin: var(--space-8) !important; } +.m-9 { margin: var(--space-9) !important; } +.m-10 { margin: var(--space-10) !important; } +.m-11 { margin: var(--space-11) !important; } +.m-12 { margin: var(--space-12) !important; } +.m-14 { margin: var(--space-14) !important; } +.m-16 { margin: var(--space-16) !important; } +.m-20 { margin: var(--space-20) !important; } +.m-24 { margin: var(--space-24) !important; } +.m-28 { margin: var(--space-28) !important; } +.m-32 { margin: var(--space-32) !important; } +.m-36 { margin: var(--space-36) !important; } +.m-40 { margin: var(--space-40) !important; } +.m-44 { margin: var(--space-44) !important; } +.m-48 { margin: var(--space-48) !important; } +.m-52 { margin: var(--space-52) !important; } +.m-56 { margin: var(--space-56) !important; } +.m-60 { margin: var(--space-60) !important; } +.m-64 { margin: var(--space-64) !important; } +.m-72 { margin: var(--space-72) !important; } +.m-80 { margin: var(--space-80) !important; } +.m-96 { margin: var(--space-96) !important; } + +// Auto margin +.m-auto { margin: auto !important; } + +// Negative margins +.m-n1 { margin: var(--space--1) !important; } +.m-n2 { margin: var(--space--2) !important; } +.m-n3 { margin: var(--space--3) !important; } +.m-n4 { margin: var(--space--4) !important; } +.m-n5 { margin: var(--space--5) !important; } +.m-n6 { margin: var(--space--6) !important; } +.m-n8 { margin: var(--space--8) !important; } +.m-n10 { margin: var(--space--10) !important; } +.m-n12 { margin: var(--space--12) !important; } +.m-n16 { margin: var(--space--16) !important; } +.m-n20 { margin: var(--space--20) !important; } +.m-n24 { margin: var(--space--24) !important; } + +// Margin X (horizontal) +.mx-0 { margin-left: var(--space-0) !important; margin-right: var(--space-0) !important; } +.mx-1 { margin-left: var(--space-1) !important; margin-right: var(--space-1) !important; } +.mx-2 { margin-left: var(--space-2) !important; margin-right: var(--space-2) !important; } +.mx-3 { margin-left: var(--space-3) !important; margin-right: var(--space-3) !important; } +.mx-4 { margin-left: var(--space-4) !important; margin-right: var(--space-4) !important; } +.mx-5 { margin-left: var(--space-5) !important; margin-right: var(--space-5) !important; } +.mx-6 { margin-left: var(--space-6) !important; margin-right: var(--space-6) !important; } +.mx-8 { margin-left: var(--space-8) !important; margin-right: var(--space-8) !important; } +.mx-10 { margin-left: var(--space-10) !important; margin-right: var(--space-10) !important; } +.mx-12 { margin-left: var(--space-12) !important; margin-right: var(--space-12) !important; } +.mx-16 { margin-left: var(--space-16) !important; margin-right: var(--space-16) !important; } +.mx-20 { margin-left: var(--space-20) !important; margin-right: var(--space-20) !important; } +.mx-24 { margin-left: var(--space-24) !important; margin-right: var(--space-24) !important; } +.mx-32 { margin-left: var(--space-32) !important; margin-right: var(--space-32) !important; } + +.mx-auto { margin-left: auto !important; margin-right: auto !important; } + +// Margin Y (vertical) +.my-0 { margin-top: var(--space-0) !important; margin-bottom: var(--space-0) !important; } +.my-1 { margin-top: var(--space-1) !important; margin-bottom: var(--space-1) !important; } +.my-2 { margin-top: var(--space-2) !important; margin-bottom: var(--space-2) !important; } +.my-3 { margin-top: var(--space-3) !important; margin-bottom: var(--space-3) !important; } +.my-4 { margin-top: var(--space-4) !important; margin-bottom: var(--space-4) !important; } +.my-5 { margin-top: var(--space-5) !important; margin-bottom: var(--space-5) !important; } +.my-6 { margin-top: var(--space-6) !important; margin-bottom: var(--space-6) !important; } +.my-8 { margin-top: var(--space-8) !important; margin-bottom: var(--space-8) !important; } +.my-10 { margin-top: var(--space-10) !important; margin-bottom: var(--space-10) !important; } +.my-12 { margin-top: var(--space-12) !important; margin-bottom: var(--space-12) !important; } +.my-16 { margin-top: var(--space-16) !important; margin-bottom: var(--space-16) !important; } +.my-20 { margin-top: var(--space-20) !important; margin-bottom: var(--space-20) !important; } +.my-24 { margin-top: var(--space-24) !important; margin-bottom: var(--space-24) !important; } +.my-32 { margin-top: var(--space-32) !important; margin-bottom: var(--space-32) !important; } + +.my-auto { margin-top: auto !important; margin-bottom: auto !important; } + +// Individual margins +.mt-0 { margin-top: var(--space-0) !important; } +.mt-1 { margin-top: var(--space-1) !important; } +.mt-2 { margin-top: var(--space-2) !important; } +.mt-3 { margin-top: var(--space-3) !important; } +.mt-4 { margin-top: var(--space-4) !important; } +.mt-5 { margin-top: var(--space-5) !important; } +.mt-6 { margin-top: var(--space-6) !important; } +.mt-8 { margin-top: var(--space-8) !important; } +.mt-10 { margin-top: var(--space-10) !important; } +.mt-12 { margin-top: var(--space-12) !important; } +.mt-16 { margin-top: var(--space-16) !important; } +.mt-20 { margin-top: var(--space-20) !important; } +.mt-24 { margin-top: var(--space-24) !important; } +.mt-32 { margin-top: var(--space-32) !important; } +.mt-auto { margin-top: auto !important; } + +.mb-0 { margin-bottom: var(--space-0) !important; } +.mb-1 { margin-bottom: var(--space-1) !important; } +.mb-2 { margin-bottom: var(--space-2) !important; } +.mb-3 { margin-bottom: var(--space-3) !important; } +.mb-4 { margin-bottom: var(--space-4) !important; } +.mb-5 { margin-bottom: var(--space-5) !important; } +.mb-6 { margin-bottom: var(--space-6) !important; } +.mb-8 { margin-bottom: var(--space-8) !important; } +.mb-10 { margin-bottom: var(--space-10) !important; } +.mb-12 { margin-bottom: var(--space-12) !important; } +.mb-16 { margin-bottom: var(--space-16) !important; } +.mb-20 { margin-bottom: var(--space-20) !important; } +.mb-24 { margin-bottom: var(--space-24) !important; } +.mb-32 { margin-bottom: var(--space-32) !important; } +.mb-auto { margin-bottom: auto !important; } + +.ms-0 { margin-left: var(--space-0) !important; } +.ms-1 { margin-left: var(--space-1) !important; } +.ms-2 { margin-left: var(--space-2) !important; } +.ms-3 { margin-left: var(--space-3) !important; } +.ms-4 { margin-left: var(--space-4) !important; } +.ms-5 { margin-left: var(--space-5) !important; } +.ms-6 { margin-left: var(--space-6) !important; } +.ms-8 { margin-left: var(--space-8) !important; } +.ms-10 { margin-left: var(--space-10) !important; } +.ms-12 { margin-left: var(--space-12) !important; } +.ms-16 { margin-left: var(--space-16) !important; } +.ms-20 { margin-left: var(--space-20) !important; } +.ms-24 { margin-left: var(--space-24) !important; } +.ms-32 { margin-left: var(--space-32) !important; } +.ms-auto { margin-left: auto !important; } + +.me-0 { margin-right: var(--space-0) !important; } +.me-1 { margin-right: var(--space-1) !important; } +.me-2 { margin-right: var(--space-2) !important; } +.me-3 { margin-right: var(--space-3) !important; } +.me-4 { margin-right: var(--space-4) !important; } +.me-5 { margin-right: var(--space-5) !important; } +.me-6 { margin-right: var(--space-6) !important; } +.me-8 { margin-right: var(--space-8) !important; } +.me-10 { margin-right: var(--space-10) !important; } +.me-12 { margin-right: var(--space-12) !important; } +.me-16 { margin-right: var(--space-16) !important; } +.me-20 { margin-right: var(--space-20) !important; } +.me-24 { margin-right: var(--space-24) !important; } +.me-32 { margin-right: var(--space-32) !important; } +.me-auto { margin-right: auto !important; } + +// PADDING UTILITIES +// All padding +.p-0 { padding: var(--space-0) !important; } +.p-1 { padding: var(--space-1) !important; } +.p-2 { padding: var(--space-2) !important; } +.p-3 { padding: var(--space-3) !important; } +.p-4 { padding: var(--space-4) !important; } +.p-5 { padding: var(--space-5) !important; } +.p-6 { padding: var(--space-6) !important; } +.p-7 { padding: var(--space-7) !important; } +.p-8 { padding: var(--space-8) !important; } +.p-9 { padding: var(--space-9) !important; } +.p-10 { padding: var(--space-10) !important; } +.p-11 { padding: var(--space-11) !important; } +.p-12 { padding: var(--space-12) !important; } +.p-14 { padding: var(--space-14) !important; } +.p-16 { padding: var(--space-16) !important; } +.p-20 { padding: var(--space-20) !important; } +.p-24 { padding: var(--space-24) !important; } +.p-28 { padding: var(--space-28) !important; } +.p-32 { padding: var(--space-32) !important; } +.p-36 { padding: var(--space-36) !important; } +.p-40 { padding: var(--space-40) !important; } +.p-44 { padding: var(--space-44) !important; } +.p-48 { padding: var(--space-48) !important; } + +// Padding X (horizontal) +.px-0 { padding-left: var(--space-0) !important; padding-right: var(--space-0) !important; } +.px-1 { padding-left: var(--space-1) !important; padding-right: var(--space-1) !important; } +.px-2 { padding-left: var(--space-2) !important; padding-right: var(--space-2) !important; } +.px-3 { padding-left: var(--space-3) !important; padding-right: var(--space-3) !important; } +.px-4 { padding-left: var(--space-4) !important; padding-right: var(--space-4) !important; } +.px-5 { padding-left: var(--space-5) !important; padding-right: var(--space-5) !important; } +.px-6 { padding-left: var(--space-6) !important; padding-right: var(--space-6) !important; } +.px-8 { padding-left: var(--space-8) !important; padding-right: var(--space-8) !important; } +.px-10 { padding-left: var(--space-10) !important; padding-right: var(--space-10) !important; } +.px-12 { padding-left: var(--space-12) !important; padding-right: var(--space-12) !important; } +.px-16 { padding-left: var(--space-16) !important; padding-right: var(--space-16) !important; } +.px-20 { padding-left: var(--space-20) !important; padding-right: var(--space-20) !important; } +.px-24 { padding-left: var(--space-24) !important; padding-right: var(--space-24) !important; } +.px-32 { padding-left: var(--space-32) !important; padding-right: var(--space-32) !important; } + +// Padding Y (vertical) +.py-0 { padding-top: var(--space-0) !important; padding-bottom: var(--space-0) !important; } +.py-1 { padding-top: var(--space-1) !important; padding-bottom: var(--space-1) !important; } +.py-2 { padding-top: var(--space-2) !important; padding-bottom: var(--space-2) !important; } +.py-3 { padding-top: var(--space-3) !important; padding-bottom: var(--space-3) !important; } +.py-4 { padding-top: var(--space-4) !important; padding-bottom: var(--space-4) !important; } +.py-5 { padding-top: var(--space-5) !important; padding-bottom: var(--space-5) !important; } +.py-6 { padding-top: var(--space-6) !important; padding-bottom: var(--space-6) !important; } +.py-8 { padding-top: var(--space-8) !important; padding-bottom: var(--space-8) !important; } +.py-10 { padding-top: var(--space-10) !important; padding-bottom: var(--space-10) !important; } +.py-12 { padding-top: var(--space-12) !important; padding-bottom: var(--space-12) !important; } +.py-16 { padding-top: var(--space-16) !important; padding-bottom: var(--space-16) !important; } +.py-20 { padding-top: var(--space-20) !important; padding-bottom: var(--space-20) !important; } +.py-24 { padding-top: var(--space-24) !important; padding-bottom: var(--space-24) !important; } +.py-32 { padding-top: var(--space-32) !important; padding-bottom: var(--space-32) !important; } + +// Individual padding +.pt-0 { padding-top: var(--space-0) !important; } +.pt-1 { padding-top: var(--space-1) !important; } +.pt-2 { padding-top: var(--space-2) !important; } +.pt-3 { padding-top: var(--space-3) !important; } +.pt-4 { padding-top: var(--space-4) !important; } +.pt-5 { padding-top: var(--space-5) !important; } +.pt-6 { padding-top: var(--space-6) !important; } +.pt-8 { padding-top: var(--space-8) !important; } +.pt-10 { padding-top: var(--space-10) !important; } +.pt-12 { padding-top: var(--space-12) !important; } +.pt-16 { padding-top: var(--space-16) !important; } +.pt-20 { padding-top: var(--space-20) !important; } +.pt-24 { padding-top: var(--space-24) !important; } +.pt-32 { padding-top: var(--space-32) !important; } + +.pb-0 { padding-bottom: var(--space-0) !important; } +.pb-1 { padding-bottom: var(--space-1) !important; } +.pb-2 { padding-bottom: var(--space-2) !important; } +.pb-3 { padding-bottom: var(--space-3) !important; } +.pb-4 { padding-bottom: var(--space-4) !important; } +.pb-5 { padding-bottom: var(--space-5) !important; } +.pb-6 { padding-bottom: var(--space-6) !important; } +.pb-8 { padding-bottom: var(--space-8) !important; } +.pb-10 { padding-bottom: var(--space-10) !important; } +.pb-12 { padding-bottom: var(--space-12) !important; } +.pb-16 { padding-bottom: var(--space-16) !important; } +.pb-20 { padding-bottom: var(--space-20) !important; } +.pb-24 { padding-bottom: var(--space-24) !important; } +.pb-32 { padding-bottom: var(--space-32) !important; } + +.ps-0 { padding-left: var(--space-0) !important; } +.ps-1 { padding-left: var(--space-1) !important; } +.ps-2 { padding-left: var(--space-2) !important; } +.ps-3 { padding-left: var(--space-3) !important; } +.ps-4 { padding-left: var(--space-4) !important; } +.ps-5 { padding-left: var(--space-5) !important; } +.ps-6 { padding-left: var(--space-6) !important; } +.ps-8 { padding-left: var(--space-8) !important; } +.ps-10 { padding-left: var(--space-10) !important; } +.ps-12 { padding-left: var(--space-12) !important; } +.ps-16 { padding-left: var(--space-16) !important; } +.ps-20 { padding-left: var(--space-20) !important; } +.ps-24 { padding-left: var(--space-24) !important; } +.ps-32 { padding-left: var(--space-32) !important; } + +.pe-0 { padding-right: var(--space-0) !important; } +.pe-1 { padding-right: var(--space-1) !important; } +.pe-2 { padding-right: var(--space-2) !important; } +.pe-3 { padding-right: var(--space-3) !important; } +.pe-4 { padding-right: var(--space-4) !important; } +.pe-5 { padding-right: var(--space-5) !important; } +.pe-6 { padding-right: var(--space-6) !important; } +.pe-8 { padding-right: var(--space-8) !important; } +.pe-10 { padding-right: var(--space-10) !important; } +.pe-12 { padding-right: var(--space-12) !important; } +.pe-16 { padding-right: var(--space-16) !important; } +.pe-20 { padding-right: var(--space-20) !important; } +.pe-24 { padding-right: var(--space-24) !important; } +.pe-32 { padding-right: var(--space-32) !important; } + +// GAP UTILITIES (for flexbox and grid) +.gap-0 { gap: var(--space-0) !important; } +.gap-1 { gap: var(--space-1) !important; } +.gap-2 { gap: var(--space-2) !important; } +.gap-3 { gap: var(--space-3) !important; } +.gap-4 { gap: var(--space-4) !important; } +.gap-5 { gap: var(--space-5) !important; } +.gap-6 { gap: var(--space-6) !important; } +.gap-8 { gap: var(--space-8) !important; } +.gap-10 { gap: var(--space-10) !important; } +.gap-12 { gap: var(--space-12) !important; } +.gap-16 { gap: var(--space-16) !important; } +.gap-20 { gap: var(--space-20) !important; } +.gap-24 { gap: var(--space-24) !important; } +.gap-32 { gap: var(--space-32) !important; } + +.gap-x-0 { column-gap: var(--space-0) !important; } +.gap-x-1 { column-gap: var(--space-1) !important; } +.gap-x-2 { column-gap: var(--space-2) !important; } +.gap-x-3 { column-gap: var(--space-3) !important; } +.gap-x-4 { column-gap: var(--space-4) !important; } +.gap-x-5 { column-gap: var(--space-5) !important; } +.gap-x-6 { column-gap: var(--space-6) !important; } +.gap-x-8 { column-gap: var(--space-8) !important; } +.gap-x-10 { column-gap: var(--space-10) !important; } +.gap-x-12 { column-gap: var(--space-12) !important; } +.gap-x-16 { column-gap: var(--space-16) !important; } +.gap-x-20 { column-gap: var(--space-20) !important; } +.gap-x-24 { column-gap: var(--space-24) !important; } +.gap-x-32 { column-gap: var(--space-32) !important; } + +.gap-y-0 { row-gap: var(--space-0) !important; } +.gap-y-1 { row-gap: var(--space-1) !important; } +.gap-y-2 { row-gap: var(--space-2) !important; } +.gap-y-3 { row-gap: var(--space-3) !important; } +.gap-y-4 { row-gap: var(--space-4) !important; } +.gap-y-5 { row-gap: var(--space-5) !important; } +.gap-y-6 { row-gap: var(--space-6) !important; } +.gap-y-8 { row-gap: var(--space-8) !important; } +.gap-y-10 { row-gap: var(--space-10) !important; } +.gap-y-12 { row-gap: var(--space-12) !important; } +.gap-y-16 { row-gap: var(--space-16) !important; } +.gap-y-20 { row-gap: var(--space-20) !important; } +.gap-y-24 { row-gap: var(--space-24) !important; } +.gap-y-32 { row-gap: var(--space-32) !important; } + +// RESPONSIVE SPACING UTILITIES +@media (min-width: 576px) { + .m-sm-0 { margin: var(--space-0) !important; } + .m-sm-1 { margin: var(--space-1) !important; } + .m-sm-2 { margin: var(--space-2) !important; } + .m-sm-3 { margin: var(--space-3) !important; } + .m-sm-4 { margin: var(--space-4) !important; } + .m-sm-6 { margin: var(--space-6) !important; } + .m-sm-8 { margin: var(--space-8) !important; } + .m-sm-12 { margin: var(--space-12) !important; } + .m-sm-16 { margin: var(--space-16) !important; } + .m-sm-20 { margin: var(--space-20) !important; } + .m-sm-24 { margin: var(--space-24) !important; } + + .p-sm-0 { padding: var(--space-0) !important; } + .p-sm-1 { padding: var(--space-1) !important; } + .p-sm-2 { padding: var(--space-2) !important; } + .p-sm-3 { padding: var(--space-3) !important; } + .p-sm-4 { padding: var(--space-4) !important; } + .p-sm-6 { padding: var(--space-6) !important; } + .p-sm-8 { padding: var(--space-8) !important; } + .p-sm-12 { padding: var(--space-12) !important; } + .p-sm-16 { padding: var(--space-16) !important; } + .p-sm-20 { padding: var(--space-20) !important; } + .p-sm-24 { padding: var(--space-24) !important; } +} + +@media (min-width: 768px) { + .m-md-0 { margin: var(--space-0) !important; } + .m-md-1 { margin: var(--space-1) !important; } + .m-md-2 { margin: var(--space-2) !important; } + .m-md-3 { margin: var(--space-3) !important; } + .m-md-4 { margin: var(--space-4) !important; } + .m-md-6 { margin: var(--space-6) !important; } + .m-md-8 { margin: var(--space-8) !important; } + .m-md-12 { margin: var(--space-12) !important; } + .m-md-16 { margin: var(--space-16) !important; } + .m-md-20 { margin: var(--space-20) !important; } + .m-md-24 { margin: var(--space-24) !important; } + + .p-md-0 { padding: var(--space-0) !important; } + .p-md-1 { padding: var(--space-1) !important; } + .p-md-2 { padding: var(--space-2) !important; } + .p-md-3 { padding: var(--space-3) !important; } + .p-md-4 { padding: var(--space-4) !important; } + .p-md-6 { padding: var(--space-6) !important; } + .p-md-8 { padding: var(--space-8) !important; } + .p-md-12 { padding: var(--space-12) !important; } + .p-md-16 { padding: var(--space-16) !important; } + .p-md-20 { padding: var(--space-20) !important; } + .p-md-24 { padding: var(--space-24) !important; } +} + +@media (min-width: 992px) { + .m-lg-0 { margin: var(--space-0) !important; } + .m-lg-1 { margin: var(--space-1) !important; } + .m-lg-2 { margin: var(--space-2) !important; } + .m-lg-3 { margin: var(--space-3) !important; } + .m-lg-4 { margin: var(--space-4) !important; } + .m-lg-6 { margin: var(--space-6) !important; } + .m-lg-8 { margin: var(--space-8) !important; } + .m-lg-12 { margin: var(--space-12) !important; } + .m-lg-16 { margin: var(--space-16) !important; } + .m-lg-20 { margin: var(--space-20) !important; } + .m-lg-24 { margin: var(--space-24) !important; } + + .p-lg-0 { padding: var(--space-0) !important; } + .p-lg-1 { padding: var(--space-1) !important; } + .p-lg-2 { padding: var(--space-2) !important; } + .p-lg-3 { padding: var(--space-3) !important; } + .p-lg-4 { padding: var(--space-4) !important; } + .p-lg-6 { padding: var(--space-6) !important; } + .p-lg-8 { padding: var(--space-8) !important; } + .p-lg-12 { padding: var(--space-12) !important; } + .p-lg-16 { padding: var(--space-16) !important; } + .p-lg-20 { padding: var(--space-20) !important; } + .p-lg-24 { padding: var(--space-24) !important; } +} \ No newline at end of file diff --git a/projects/shared-ui/src/styles/fontfaces/_aileron.scss b/projects/shared-ui/src/styles/fontfaces/_aileron.scss new file mode 100644 index 0000000..72c05d1 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_aileron.scss @@ -0,0 +1,48 @@ +$aileron-font-path: "/fonts/aileron/" !default; + + +/*** Aileron**/ +@font-face { + font-family: 'Aileron Bold'; + src: url("#{$aileron-font-path}Aileron-Bold-webfont.ttf") format("truetype"), + url('#{$aileron-font-path}Aileron-Bold-webfont.woff2') format('woff2'), /* Super Modern Browsers */ + url('#{$aileron-font-path}Aileron-Bold-webfont.woff') format('woff'); /* Modern Browsers */ + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'Aileron Semi Bold'; + src: url("#{$aileron-font-path}Aileron-SemiBold.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'Aileron Heavy'; + src: url("#{$aileron-font-path}Aileron-Heavy-webfont.ttf") format("truetype"), + url('#{$aileron-font-path}Aileron-Heavy-webfont.woff2') format('woff2'), /* Super Modern Browsers */ + url('#{$aileron-font-path}Aileron-Heavy-webfont.woff') format('woff'); /* Modern Browsers */ + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'Aileron Light'; + src: url("#{$aileron-font-path}Aileron-Light.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Aileron Regular'; + src: url("#{$aileron-font-path}Aileron-Regular-webfont.ttf") format("truetype"), + url('#{$aileron-font-path}Aileron-Regular-webfont.woff2') format('woff2'), /* Super Modern Browsers */ + url('#{$aileron-font-path}Aileron-Regular-webfont.woff') format('woff'); /* Modern Browsers */ + font-weight: normal; + font-style: normal; +} + +.aileron { + font-family: 'Aileron Regular'; +} +.aileron-heavy { + font-family: 'Aileron Heavy'; +} diff --git a/projects/shared-ui/src/styles/fontfaces/_alegreya.scss b/projects/shared-ui/src/styles/fontfaces/_alegreya.scss new file mode 100644 index 0000000..596036e --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_alegreya.scss @@ -0,0 +1,10 @@ +$alegreya-font-path: "/fonts/alegreya/" !default; + +@font-face { + font-family: 'Alegreya'; + src: url("#{$alegreya-font-path}Alegreya-VariableFont_wght.ttf") format("truetype"); +} +@font-face { + font-family: 'Alegreya Italic'; + src: url("#{$alegreya-font-path}Alegreya-Italic-VariableFont_wght.ttf") format("truetype"); +} \ No newline at end of file diff --git a/projects/shared-ui/src/styles/fontfaces/_all-fontfaces.scss b/projects/shared-ui/src/styles/fontfaces/_all-fontfaces.scss new file mode 100644 index 0000000..df5cca0 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_all-fontfaces.scss @@ -0,0 +1,74 @@ +/* You can add global styles to this file, and also import other style files */ + ////////////////////////////////////////////////////////////////////// +// Fontfaces ./ +////////////////////////////////////////////////////////////////////// +@import './alegreya'; +@import './amarante'; +@import './archivo'; +@import './architectsdaughter.scss'; +@import './averiaseriflibre'; +@import './bebasneue'; +@import './blinker'; +@import './bonheurroyale'; +@import './bonveno'; +@import './cabin'; +@import './cinzel'; +@import './comfortaa'; +@import './commissioner'; +@import './crimson-text'; +@import './dellarespira'; +@import './dmsans'; +@import './ebgaramond'; +@import './epilogue'; +@import './exo2'; +@import './figtree'; +@import './fraunces'; +@import './iceland'; +@import './geist'; +@import './glassantiqua'; +@import './inter'; +@import './josefin_sans'; +@import './karla'; +@import './lato'; +@import './leaguespartan'; +@import './lexend'; +@import './librebaskerville'; +@import './limelight'; +@import './lora'; +@import './manrope'; +@import './monasans'; +@import './metropolis'; +@import './merriweather'; +@import './montserrat'; +@import './opensans'; +@import './outfit'; +@import './overused'; +@import './nacelle'; +@import './notosans'; +@import './nunito'; +@import './oswald'; +@import './playfair_display'; +@import './plusjakatasans'; +@import './poppins'; +@import './questrial'; +@import './quicksand'; +@import './raleway'; +@import './roboto'; +@import './robotomono'; +@import './robotoslab'; +@import './rubik'; +@import './sacramento'; +@import './satoshi'; +@import './sifonn'; +@import './sixcaps'; +@import './sourcesanspro'; +@import './sora'; +@import './sourcesanspro'; +@import './spacegrotesk'; +@import './spacemono'; +@import './unbounded'; +@import './urbanist'; +@import './vollkorn'; +@import './whisper'; +@import './worksans'; +@import './zillaslab'; \ No newline at end of file diff --git a/projects/shared-ui/src/styles/fontfaces/_amarante.scss b/projects/shared-ui/src/styles/fontfaces/_amarante.scss new file mode 100644 index 0000000..9f05d99 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_amarante.scss @@ -0,0 +1,8 @@ +$amarante-font-path: "/fonts/amarante/" !default; + +@font-face { + font-family: 'Amarante Regular'; + src: url("#{$amarante-font-path}Amarante-Regular.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} diff --git a/projects/shared-ui/src/styles/fontfaces/_architectsdaughter.scss b/projects/shared-ui/src/styles/fontfaces/_architectsdaughter.scss new file mode 100644 index 0000000..cdee2f8 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_architectsdaughter.scss @@ -0,0 +1,9 @@ +$architectsdaughter-font-path: "/fonts/architectsdaughter/" !default; + +@font-face { + font-family: 'Architects Daughter'; + src: url("#{$architectsdaughter-font-path}ArchitectsDaughter-Regular.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + diff --git a/projects/shared-ui/src/styles/fontfaces/_archivo.scss b/projects/shared-ui/src/styles/fontfaces/_archivo.scss new file mode 100644 index 0000000..e6f9606 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_archivo.scss @@ -0,0 +1,12 @@ +$archivo-font-path: "/fonts/archivo/" !default; + + +@font-face { + font-family: 'Archivo'; + src: url("#{$archivo-font-path}Archivo-VariableFont_wdth,wght.ttf") format("truetype"); +} + +@font-face { + font-family: 'Archivo'; + src: url("#{$archivo-font-path}Archivo-Italic-VariableFont_wght.ttf") format("truetype"); +} diff --git a/projects/shared-ui/src/styles/fontfaces/_archivonarrow.scss b/projects/shared-ui/src/styles/fontfaces/_archivonarrow.scss new file mode 100644 index 0000000..0987a0c --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_archivonarrow.scss @@ -0,0 +1,9 @@ +$archivonarrow-font-path: "/fonts/archivonarrow/" !default; + + +@font-face { + font-family: "Archivo Narrow Regular"; + src: local(Archivo Narrow Regular), url('#{$archivonarrow-font-path}ArchivoNarrow-Regular.ttf'); + src: url("#{$archivonarrow-font-path}ArchivoNarrow-Regular.ttf") format("truetype"); + font-weight: 500; +} diff --git a/projects/shared-ui/src/styles/fontfaces/_averiaseriflibre.scss b/projects/shared-ui/src/styles/fontfaces/_averiaseriflibre.scss new file mode 100644 index 0000000..65cbdf5 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_averiaseriflibre.scss @@ -0,0 +1,33 @@ +$averia-font-path: "/fonts/averiaseriflibre/" !default; + + +@font-face { + font-family: 'Averia Regular'; + src: url("#{$averia-font-path}AveriaSerifLibre-Regular.ttf") format("truetype"); +} + +@font-face { + font-family: 'Averia Bold'; + src: url("#{$averia-font-path}AveriaSerifLibre-Bold.ttf") format("truetype"); +} + +@font-face { + font-family: 'Averia Bold Italic'; + src: url("#{$averia-font-path}AveriaSerifLibre-BoldItalic.ttf") format("truetype"); +} + +@font-face { + font-family: 'Averia Italic'; + src: url("#{$averia-font-path}AveriaSerifLibre-talic.ttf") format("truetype"); +} + +@font-face { + font-family: 'Averia Light'; + src: url("#{$averia-font-path}AveriaSerifLibre-Light.ttf") format("truetype"); +} + +@font-face { + font-family: 'Averia Light Italic'; + src: url("#{$averia-font-path}AveriaSerifLibre-LightItalic.ttf") format("truetype"); +} + diff --git a/projects/shared-ui/src/styles/fontfaces/_bebasneue.scss b/projects/shared-ui/src/styles/fontfaces/_bebasneue.scss new file mode 100644 index 0000000..32bfc42 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_bebasneue.scss @@ -0,0 +1,16 @@ +$bebasneue-font-path: "/fonts/bebasneue/" !default; + +/*** Bebas Neue ***/ +@font-face { + font-family: 'Bebas Neue Regular'; + src: url("#{$bebasneue-font-path}bebasneue-regular-webfont.ttf") format("truetype"), + url('#{$bebasneue-font-path}bebasneue-regular-webfont.woff2') format('woff2'), /* Super Modern Browsers */ + url('#{$bebasneue-font-path}bebasneue-regular-webfont.woff') format('woff'); /* Modern Browsers */ + font-weight: normal; + font-style: normal; +} + + +.bebas-neue { + font-family: 'bebas_neueregular'; +} diff --git a/projects/shared-ui/src/styles/fontfaces/_blinker.scss b/projects/shared-ui/src/styles/fontfaces/_blinker.scss new file mode 100644 index 0000000..d1cdb2c --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_blinker.scss @@ -0,0 +1,36 @@ +$blinker-font-path: "/fonts/blinker/" !default; + + +/*** Blinker**/ +@font-face { + font-family: 'Blinker Bold'; + src: url("#{$blinker-font-path}Blinker-Bold.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'Blinker Semi Bold'; + src: url("#{$blinker-font-path}Blinker-SemiBold.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'Blinker Light'; + src: url("#{$blinker-font-path}Blinker-Light.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Blinker Regular'; + src: url("#{$blinker-font-path}Blinker-Regular.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Blinker Thin'; + src: url("#{$blinker-font-path}Blinker-Thin.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} diff --git a/projects/shared-ui/src/styles/fontfaces/_bonheurroyale.scss b/projects/shared-ui/src/styles/fontfaces/_bonheurroyale.scss new file mode 100644 index 0000000..8831d3d --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_bonheurroyale.scss @@ -0,0 +1,8 @@ +$bonheurroyale-font-path: "/fonts/bonheurroyale/" !default; + +@font-face { + font-family: 'Bonheur Royale Regular'; + src: url("#{$bonheurroyale-font-path}BonheurRoyale-Regular.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} diff --git a/projects/shared-ui/src/styles/fontfaces/_bonveno.scss b/projects/shared-ui/src/styles/fontfaces/_bonveno.scss new file mode 100644 index 0000000..7802fb8 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_bonveno.scss @@ -0,0 +1,9 @@ +$bonvenocf-font-path: "/fonts/bonvenocf/" !default; + + +@font-face { + font-family: "BonvenoCFLight"; + src: url("#{$bonvenocf-font-path}BonvenoCF-Light.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} diff --git a/projects/shared-ui/src/styles/fontfaces/_cabin.scss b/projects/shared-ui/src/styles/fontfaces/_cabin.scss new file mode 100644 index 0000000..d60ee27 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_cabin.scss @@ -0,0 +1,13 @@ +$cabin-font-path: "/fonts/cabin/" !default; + + +@font-face { + font-family: "Cabin"; + src: url("#{$cabin-font-path}Cabin-VariableFont_wdth,wght.ttf") format("truetype"); +} + +@font-face { + font-family: "Cabin Italic"; + src: url("#{$cabin-font-path}Cabin-Italic-VariableFont_wdth,wght.ttf") format("truetype"); +} + diff --git a/projects/shared-ui/src/styles/fontfaces/_cinzel.scss b/projects/shared-ui/src/styles/fontfaces/_cinzel.scss new file mode 100644 index 0000000..b07bf43 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_cinzel.scss @@ -0,0 +1,8 @@ +$cinzel-font-path: "/fonts/cinzel/" !default; + + +@font-face { + font-family: "Cinzel"; + src: url("#{$cinzel-font-path}Cinzel-VariableFont_wght.ttf") format("truetype"); +} + diff --git a/projects/shared-ui/src/styles/fontfaces/_comfortaa.scss b/projects/shared-ui/src/styles/fontfaces/_comfortaa.scss new file mode 100644 index 0000000..574542f --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_comfortaa.scss @@ -0,0 +1,9 @@ +$comfortaa-font-path: "/fonts/comfortaa/" !default; + + +@font-face { + font-family: 'Comfortaa'; + src: url("#{$comfortaa-font-path}Comfortaa-VariableFont_wght.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} diff --git a/projects/shared-ui/src/styles/fontfaces/_commissioner.scss b/projects/shared-ui/src/styles/fontfaces/_commissioner.scss new file mode 100644 index 0000000..6a1c728 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_commissioner.scss @@ -0,0 +1,6 @@ +$commissioner-font-path: "/fonts/commissioner/" !default; + +@font-face { + font-family: 'Commissioner'; + src: url("#{$commissioner-font-path}Commissioner-VariableFont_FLAR,VOLM,slnt,wght.ttf") format("truetype"); +} diff --git a/projects/shared-ui/src/styles/fontfaces/_cooperhewitt.scss b/projects/shared-ui/src/styles/fontfaces/_cooperhewitt.scss new file mode 100644 index 0000000..e771077 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_cooperhewitt.scss @@ -0,0 +1,100 @@ +$cooperhewitt-font-path: "/fonts/cooperhewitt/" !default; + +/*** Cooper Hewitt ***/ +@font-face { + font-family: 'Cooper Hewitt Bold'; + src: url('#{$cooperhewitt-font-path}CooperHewitt-Bold.woff') format('woff'); /* Super Modern Browsers */ + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Cooper Hewitt Bold Italic'; + src: url('#{$cooperhewitt-font-path}CooperHewitt-BoldItalic.woff') format('woff'); /* Super Modern Browsers */ + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Cooper Hewitt Book'; + src: url('#{$cooperhewitt-font-path}CooperHewitt-Book.woff') format('woff'); /* Super Modern Browsers */ + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Cooper Hewitt Book Italic'; + src: url('#{$cooperhewitt-font-path}CooperHewitt-BookItalic.woff') format('woff'); /* Super Modern Browsers */ + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Cooper Hewitt Heavy'; + src: url('#{$cooperhewitt-font-path}CooperHewitt-Heavy.woff') format('woff'); /* Super Modern Browsers */ + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Cooper Hewitt Heavy Italic'; + src: url('#{$cooperhewitt-font-path}CooperHewitt-HeavyItalic.woff') format('woff'); /* Super Modern Browsers */ + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Cooper Hewitt Light'; + src: url('#{$cooperhewitt-font-path}CooperHewitt-Light.woff') format('woff'); /* Super Modern Browsers */ + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Cooper Hewitt Light Italic'; + src: url('#{$cooperhewitt-font-path}CooperHewitt-LightItalic.woff') format('woff'); /* Super Modern Browsers */ + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Cooper Hewitt Medium'; + src: url('#{$cooperhewitt-font-path}CooperHewitt-Medium.woff') format('woff'); /* Super Modern Browsers */ + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Cooper Hewitt Medium Italic'; + src: url('#{$cooperhewitt-font-path}CooperHewitt-MediumItalic.woff') format('woff'); /* Super Modern Browsers */ + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Cooper Hewitt Semibold'; + src: url('#{$cooperhewitt-font-path}CooperHewitt-Semibold.woff') format('woff'); /* Super Modern Browsers */ + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Cooper Hewitt Semibold Italic'; + src: url('#{$cooperhewitt-font-path}CooperHewitt-SemiboldItalic.woff') format('woff'); /* Super Modern Browsers */ + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Cooper Hewitt Thin'; + src: url('#{$cooperhewitt-font-path}CooperHewitt-Thin.woff') format('woff'); /* Super Modern Browsers */ + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Cooper Hewitt Thin Italic'; + src: url('#{$cooperhewitt-font-path}CooperHewitt-ThinItalic.woff') format('woff'); /* Super Modern Browsers */ + font-weight: normal; + font-style: normal; +} diff --git a/projects/shared-ui/src/styles/fontfaces/_crimson-text.scss b/projects/shared-ui/src/styles/fontfaces/_crimson-text.scss new file mode 100644 index 0000000..c3faa20 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_crimson-text.scss @@ -0,0 +1,39 @@ +$crimsontext-font-path: "/fonts/crimson_text/" !default; + + +@font-face { + font-family: "Crimson Text Bold"; + src: local(Crimson Text Bold), url('#{$crimsontext-font-path}CrimsonText-Bold.ttf'); + src: url("#{$crimsontext-font-path}CrimsonText-Bold.ttf") format("truetype"); + font-weight: 700; +} +@font-face { + font-family: "Crimson Text Bold Italic"; + src: local(Crimson Text Bold Italic), url('#{$crimsontext-font-path}CrimsonText-BoldItalic.ttf'); + src: url("#{$crimsontext-font-path}CrimsonText-BoldItalic.ttf") format("truetype"); + font-weight: 700; +} +@font-face { + font-family: "Crimson Text Italic"; + src: local(Crimson Text Italic), url('#{$crimsontext-font-path}CrimsonText-Italic.ttf'); + src: url("#{$crimsontext-font-path}CrimsonText-Italic.ttf") format("truetype"); + font-weight: 400; +} +@font-face { + font-family: "Crimson Text Regular"; + src: local(Crimson Text Regular), url('#{$crimsontext-font-path}CrimsonText-Regular.ttf'); + src: url("#{$crimsontext-font-path}CrimsonText-Regular.ttf") format("truetype"); + font-weight: 400; +} +@font-face { + font-family: "Crimson Text Semi Bold"; + src: local(Crimson Text Semi Bold), url('#{$crimsontext-font-path}CrimsonText-SemiBold.ttf'); + src: url("#{$crimsontext-font-path}CrimsonText-SemiBold.ttf") format("truetype"); + font-weight: 600; +} +@font-face { + font-family: "Crimson Text Semi Bold Italic"; + src: local(Crimson Text Semi Bold Italic), url('#{$crimsontext-font-path}CrimsonText-SemiBoldItalic.ttf'); + src: url("#{$crimsontext-font-path}CrimsonText-SemiBoldItalic.ttf") format("truetype"); + font-weight: 600; +} diff --git a/projects/shared-ui/src/styles/fontfaces/_dancingscript.scss b/projects/shared-ui/src/styles/fontfaces/_dancingscript.scss new file mode 100644 index 0000000..f2b0e1f --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_dancingscript.scss @@ -0,0 +1,14 @@ +$dancingscript-font-path: "/fonts/dancingscript/" !default; + +/*** Poppins ***/ +@font-face { + font-family: "Dancing Script"; + src: local(Dancing Script), url('#{$dancingscript-font-path}DancingScript-Regular.ttf'); + src: url("#{$dancingscript-font-path}DancingScript-Regular.ttf") format("truetype"); + font-weight: 400; +} + + +.dancing-script { + font-family: "Dancing Script"; +} diff --git a/projects/shared-ui/src/styles/fontfaces/_dellarespira.scss b/projects/shared-ui/src/styles/fontfaces/_dellarespira.scss new file mode 100644 index 0000000..007e8c3 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_dellarespira.scss @@ -0,0 +1,9 @@ +$dellarespira-font-path: "/fonts/dellarespira/" !default; + +@font-face { + font-family: 'Della Respira'; + src: url("#{$dellarespira-font-path}DellaRespira-Regular.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + diff --git a/projects/shared-ui/src/styles/fontfaces/_dmsans.scss b/projects/shared-ui/src/styles/fontfaces/_dmsans.scss new file mode 100644 index 0000000..ec9c819 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_dmsans.scss @@ -0,0 +1,12 @@ +$dmsans-font-path: "/fonts/dmsans/" !default; + + +@font-face { + font-family: 'DM Sans'; + src: url("#{$dmsans-font-path}DMSans-VariableFont_opsz,wght.ttf") format("truetype") +} + +@font-face { + font-family: 'DM Sans Italic'; + src: url("#{$dmsans-font-path}DMSans-Italic-VariableFont_opsz,wght.ttf") format("truetype") +} diff --git a/projects/shared-ui/src/styles/fontfaces/_ebgaramond.scss b/projects/shared-ui/src/styles/fontfaces/_ebgaramond.scss new file mode 100644 index 0000000..ddfb602 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_ebgaramond.scss @@ -0,0 +1,73 @@ +$ebgaramond-font-path: "/fonts/ebgaramond/" !default; + + +@font-face { + font-family: 'EBGaramond'; + src: url("#{$ebgaramond-font-path}EBGaramond-VariableFont_wght.ttf") format("truetype"); +} + +@font-face { + font-family: 'EBGaramond Italic'; + src: url("#{$ebgaramond-font-path}EBGaramond-Italic-VariableFont_wght.ttf") format("truetype"); +} + +/* +@font-face { + font-family: 'EBGaramond Bold'; + src: url("#{$ebgaramond-font-path}EBGaramond-Bold.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'EBGaramond Bold Italic'; + src: url("#{$ebgaramond-font-path}EBGaramond-BoldItalic.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'EBGaramond Extra Bold'; + src: url("#{$ebgaramond-font-path}EBGaramond-ExtraBold.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'EBGaramond Extra Bold Italic'; + src: url("#{$ebgaramond-font-path}EBGaramond-ExtraBoldItalic.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'EBGaramond Semi Bold'; + src: url("#{$ebgaramond-font-path}EBGaramond-SemiBold.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'EBGaramond Semi Bold Italic'; + src: url("#{$ebgaramond-font-path}EBGaramond-SemiBoldItalic.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'EBGaramond Medium'; + src: url("#{$ebgaramond-font-path}EBGaramond-Medium.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'EBGaramond Medium Italic'; + src: url("#{$ebgaramond-font-path}EBGaramond-MediumItalic.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'EBGaramond Regular'; + src: url("#{$ebgaramond-font-path}EBGaramond-Regular.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} +*/ \ No newline at end of file diff --git a/projects/shared-ui/src/styles/fontfaces/_epilogue.scss b/projects/shared-ui/src/styles/fontfaces/_epilogue.scss new file mode 100644 index 0000000..0ff5f2c --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_epilogue.scss @@ -0,0 +1,12 @@ +$epilogue-font-path: "/fonts/epilogue/" !default; + + +/*** Aileron**/ +@font-face { + font-family: 'Epilogue'; + src: url("#{$epilogue-font-path}Epilogue-VariableFont_wght.ttf") format("truetype"); +} +@font-face { + font-family: 'Epilogue Italic'; + src: url("#{$epilogue-font-path}Epilogue-Italic-VariableFont_wght.ttf") format("truetype"); +} diff --git a/projects/shared-ui/src/styles/fontfaces/_exo2.scss b/projects/shared-ui/src/styles/fontfaces/_exo2.scss new file mode 100644 index 0000000..6262ffe --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_exo2.scss @@ -0,0 +1,16 @@ +$exo2-font-path: "/fonts/exo_2/" !default; + + +@font-face { + font-family: 'Exo2'; + src: url("#{$exo2-font-path}Exo2-VariableFont_wght.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Exo2 Italic'; + src: url("#{$exo2-font-path}Exo2-Italic-VariableFont_wght.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} diff --git a/projects/shared-ui/src/styles/fontfaces/_figtree.scss b/projects/shared-ui/src/styles/fontfaces/_figtree.scss new file mode 100644 index 0000000..f89b4ac --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_figtree.scss @@ -0,0 +1,12 @@ +$figtree-font-path: "/fonts/figtree/" !default; + + +@font-face { + font-family: 'Figtree'; + src: url("#{$figtree-font-path}Figtree-VariableFont_wght.ttf") format("truetype"); +} + +@font-face { + font-family: 'Figtree Italic'; + src: url("#{$figtree-font-path}Figtree-Italic-VariableFont_wght.ttf") format("truetype"); +} diff --git a/projects/shared-ui/src/styles/fontfaces/_fraunces.scss b/projects/shared-ui/src/styles/fontfaces/_fraunces.scss new file mode 100644 index 0000000..da79d6d --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_fraunces.scss @@ -0,0 +1,8 @@ +$fraunces-font-path: "/fonts/fraunces/" !default; + +@font-face { + font-family: 'Fraunces'; + src: url("#{$fraunces-font-path}Fraunces-VariableFontt.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} diff --git a/projects/shared-ui/src/styles/fontfaces/_geist.scss b/projects/shared-ui/src/styles/fontfaces/_geist.scss new file mode 100644 index 0000000..ffa090e --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_geist.scss @@ -0,0 +1,7 @@ +$geist-font-path: "/fonts/geist/" !default; + + +@font-face { + font-family: 'Geist'; + src: url("#{$geist-font-path}Geist-VariableFont_wght.ttf") format("truetype"); +} diff --git a/projects/shared-ui/src/styles/fontfaces/_glassantiqua.scss b/projects/shared-ui/src/styles/fontfaces/_glassantiqua.scss new file mode 100644 index 0000000..7215dfe --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_glassantiqua.scss @@ -0,0 +1,8 @@ +$glassantiqua-font-path: "/fonts/glassantiqua/" !default; + +@font-face { + font-family: 'Glass Antiqua'; + src: url("#{$glassantiqua-font-path}GlassAntiqua-Regular.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} diff --git a/projects/shared-ui/src/styles/fontfaces/_iceland.scss b/projects/shared-ui/src/styles/fontfaces/_iceland.scss new file mode 100644 index 0000000..053c0a9 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_iceland.scss @@ -0,0 +1,8 @@ +$iceland-font-path: "/fonts/iceland/" !default; + +@font-face { + font-family: "Iceland Regular"; + src: local(Lato Regular), url('#{$iceland-font-path}Iceland-Regular.ttf'); + src: url("#{$iceland-font-path}Iceland-Regular.ttf") format("truetype"); + font-weight: 400; +} diff --git a/projects/shared-ui/src/styles/fontfaces/_inter.scss b/projects/shared-ui/src/styles/fontfaces/_inter.scss new file mode 100644 index 0000000..95b70cf --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_inter.scss @@ -0,0 +1,164 @@ +$inter-font-path: "/fonts/inter/" !default; + +/* +@font-face { + font-family: 'Inter'; + src: urlll("#{$inter-font-path}Inter-V.otf") format("otf"); + font-weight: normal; + font-style: normal; +} +*/ + + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 100; + font-display: swap; + src: url("#{$inter-font-path}Inter-Thin.woff2") format("woff2"), + url("#{$inter-font-path}Inter-Thin.woff") format("woff"); +} +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 100; + font-display: swap; + src: url("#{$inter-font-path}Inter-ThinItalic.woff2") format("woff2"), + url("#{$inter-font-path}Inter-ThinItalic.woff") format("woff"); +} + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 200; + font-display: swap; + src: url("#{$inter-font-path}Inter-ExtraLight.woff2") format("woff2"), + url("#{$inter-font-path}Inter-ExtraLight.woff") format("woff"); +} +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 200; + font-display: swap; + src: url("#{$inter-font-path}Inter-ExtraLightItalic.woff2") format("woff2"), + url("#{$inter-font-path}Inter-ExtraLightItalic.woff") format("woff"); +} + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: url("#{$inter-font-path}Inter-Light.woff2") format("woff2"), + url("#{$inter-font-path}Inter-Light.woff") format("woff"); +} +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 300; + font-display: swap; + src: url("#{$inter-font-path}Inter-LightItalic.woff2") format("woff2"), + url("#{$inter-font-path}Inter-LightItalic.woff") format("woff"); +} + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url("#{$inter-font-path}Inter-Regular.woff2") format("woff2"), + url("#{$inter-font-path}Inter-Regular.woff") format("woff"); +} +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 400; + font-display: swap; + src: url("#{$inter-font-path}Inter-Italic.woff2") format("woff2"), + url("#{$inter-font-path}Inter-Italic.woff") format("woff"); +} + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url("#{$inter-font-path}Inter-Medium.woff2") format("woff2"), + url("#{$inter-font-path}Inter-Medium.woff") format("woff"); +} +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 500; + font-display: swap; + src: url("#{$inter-font-path}Inter-MediumItalic.woff2") format("woff2"), + url("#{$inter-font-path}Inter-MediumItalic.woff") format("woff"); +} + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 600; + font-display: swap; + src: url("#{$inter-font-path}Inter-SemiBold.woff2") format("woff2"), + url("#{$inter-font-path}Inter-SemiBold.woff") format("woff"); +} +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 600; + font-display: swap; + src: url("#{$inter-font-path}Inter-SemiBoldItalic.woff2") format("woff2"), + url("#{$inter-font-path}Inter-SemiBoldItalic.woff") format("woff"); +} + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url("#{$inter-font-path}Inter-Bold.woff2") format("woff2"), + url("#{$inter-font-path}Inter-Bold.woff") format("woff"); +} +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 700; + font-display: swap; + src: url("#{$inter-font-path}Inter-BoldItalic.woff2") format("woff2"), + url("#{$inter-font-path}Inter-BoldItalic.woff") format("woff"); +} + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 800; + font-display: swap; + src: url("#{$inter-font-path}Inter-ExtraBold.woff2") format("woff2"), + url("#{$inter-font-path}Inter-ExtraBold.woff") format("woff"); +} +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 800; + font-display: swap; + src: url("#{$inter-font-path}Inter-ExtraBoldItalic.woff2") format("woff2"), + url("#{$inter-font-path}Inter-ExtraBoldItalic.woff") format("woff"); +} + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 900; + font-display: swap; + src: url("#{$inter-font-path}Inter-Black.woff2") format("woff2"), + url("#{$inter-font-path}Inter-Black.woff") format("woff"); +} +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 900; + font-display: swap; + src: url("#{$inter-font-path}Inter-BlackItalic.woff2") format("woff2"), + url("#{$inter-font-path}Inter-BlackItalic.woff") format("woff"); +} diff --git a/projects/shared-ui/src/styles/fontfaces/_josefin_sans.scss b/projects/shared-ui/src/styles/fontfaces/_josefin_sans.scss new file mode 100644 index 0000000..e1e4e63 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_josefin_sans.scss @@ -0,0 +1,16 @@ +$josefin-font-path: "/fonts/josefin/" !default; + + +@font-face { + font-family: "Josefin Sans"; + src: local(Julius Sans One), url('#{$josefin-font-path}JosefinSans-VariableFont_wght.ttf'); + src: url("#{$josefin-font-path}JosefinSans-VariableFont_wght.ttf") format("truetype"); + font-weight: 500; +} + +@font-face { + font-family: "Josefin Sans Italic"; + src: local(Julius Sans One), url('#{$josefin-font-path}JosefinSans-Italic-VariableFont_wght.ttf'); + src: url("#{$josefin-font-path}JosefinSans-Italic-VariableFont_wght.ttf") format("truetype"); + font-weight: 500; +} diff --git a/projects/shared-ui/src/styles/fontfaces/_juliussansone.scss b/projects/shared-ui/src/styles/fontfaces/_juliussansone.scss new file mode 100644 index 0000000..7360258 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_juliussansone.scss @@ -0,0 +1,9 @@ +$juliussansone-font-path: "/fonts/juliussansone/" !default; + + +@font-face { + font-family: "Julius Sans One"; + src: local(Julius Sans One), url('#{$juliussansone-font-path}JuliusSansOne-Regular.ttf'); + src: url("#{$juliussansone-font-path}JuliusSansOne-Regular.ttf") format("truetype"); + font-weight: 500; +} diff --git a/projects/shared-ui/src/styles/fontfaces/_karla.scss b/projects/shared-ui/src/styles/fontfaces/_karla.scss new file mode 100644 index 0000000..821ac0c --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_karla.scss @@ -0,0 +1,10 @@ +$karla-font-path: "/fonts/karla/" !default; + +@font-face { + font-family: 'Karla'; + src: url("#{$karla-font-path}Karla-VariableFont_wght.ttf") format("truetype"); +} +@font-face { + font-family: 'Karla Italic'; + src: url("#{$karla-font-path}Karla-Italic-VariableFont_wght.ttf") format("truetype"); +} \ No newline at end of file diff --git a/projects/shared-ui/src/styles/fontfaces/_kollektif.scss b/projects/shared-ui/src/styles/fontfaces/_kollektif.scss new file mode 100644 index 0000000..c824a51 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_kollektif.scss @@ -0,0 +1,29 @@ +$kollektif-font-path: "/fonts/kollektif-webfont/" !default; + + +/*** Kollektif**/ +@font-face { + font-family: 'Kollektif Bold'; + src: url("#{$kollektif-font-path}kollektif-bold-webfont.ttf") format("truetype"), + url('#{$kollektif-font-path}kollektif-bold-webfont.woff2') format('woff2'), /* Super Modern Browsers */ + url('#{$kollektif-font-path}kollektif-bold-webfont.woff') format('woff'); /* Modern Browsers */ + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'Kollektif Regular'; + src: url("#{$kollektif-font-path}kollektif-webfont.ttf") format("truetype"), + url('#{$kollektif-font-path}kollektif-webfont.woff2') format('woff2'), /* Super Modern Browsers */ + url('#{$kollektif-font-path}kollektif-webfont.woff') format('woff'); /* Modern Browsers */ + font-weight: normal; + font-style: normal; +} + + +.kollektif-bold { + font-family: 'kollektifbold'; +} + +.kollektif { + font-family: 'kollektifregular'; +} diff --git a/projects/shared-ui/src/styles/fontfaces/_lato.scss b/projects/shared-ui/src/styles/fontfaces/_lato.scss new file mode 100644 index 0000000..b5ba9cf --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_lato.scss @@ -0,0 +1,30 @@ +$lato-font-path: "/fonts/lato/" !default; + + +@font-face { + font-family: "Lato Black"; + src: local(Lato Black), url('#{$lato-font-path}Lato-Black.ttf'); + src: url("#{$lato-font-path}Lato-Black.ttf") format("truetype"); + font-weight: 500; +} +@font-face { + font-family: "Lato Regular"; + src: local(Lato Regular), url('#{$lato-font-path}Lato-Regular.ttf'); + src: url("#{$lato-font-path}Lato-Regular.ttf") format("truetype"); + font-weight: 400; +} +@font-face { + font-family: "Lato Medium"; + src: local(Lato Regular), url('#{$lato-font-path}Lato-Medium.ttf'); + src: url("#{$lato-font-path}Lato-Medium.ttf") format("truetype"); + font-weight: 500; +} + + +.lato-black { + font-family: "Lato Black"; +} + +.lato-regular { + font-family: "Lato Regular"; +} diff --git a/projects/shared-ui/src/styles/fontfaces/_leaguespartan.scss b/projects/shared-ui/src/styles/fontfaces/_leaguespartan.scss new file mode 100644 index 0000000..4254b5e --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_leaguespartan.scss @@ -0,0 +1,8 @@ +$leaguespartan-font-path: "/fonts/leaguespartan/" !default; + + +@font-face { + font-family: "League Spartan"; + src: url("#{$leaguespartan-font-path}LeagueSpartan-VariableFont_wght.ttf") format("truetype"); +} + diff --git a/projects/shared-ui/src/styles/fontfaces/_lexend.scss b/projects/shared-ui/src/styles/fontfaces/_lexend.scss new file mode 100644 index 0000000..b9671f5 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_lexend.scss @@ -0,0 +1,9 @@ +$lexend-font-path: "/fonts/lexend/" !default; + + +@font-face { + font-family: 'Lexend'; + src: url("#{$lexend-font-path}Lexend-VariableFont_wght.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} diff --git a/projects/shared-ui/src/styles/fontfaces/_librebaskerville.scss b/projects/shared-ui/src/styles/fontfaces/_librebaskerville.scss new file mode 100644 index 0000000..9a27068 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_librebaskerville.scss @@ -0,0 +1,21 @@ +$librebaskerville-font-path: "/fonts/librebaskerville/" !default; + +@font-face { + font-family: "Libre Baskerville Bold"; + src: local(Lato Black), url('#{$librebaskerville-font-path}LibreBaskerville-Bold.ttf'); + src: url("#{$librebaskerville-font-path}LibreBaskerville-Bold.ttf") format("truetype"); + font-weight: 500; +} +@font-face { + font-family: "Libre Baskerville Italic"; + src: local(Lato Regular), url('#{$librebaskerville-font-path}LibreBaskerville-Bold.ttf'); + src: url("#{$librebaskerville-font-path}LibreBaskerville-Bold.ttf") format("truetype"); + font-weight: 400; +} + +@font-face { + font-family: "Libre Baskerville Regular"; + src: local(Lato Regular), url('#{$librebaskerville-font-path}LibreBaskerville-Regular.ttf'); + src: url("#{$librebaskerville-font-path}LibreBaskerville-Regular.ttf") format("truetype"); + font-weight: 400; +} diff --git a/projects/shared-ui/src/styles/fontfaces/_limelight.scss b/projects/shared-ui/src/styles/fontfaces/_limelight.scss new file mode 100644 index 0000000..d38635a --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_limelight.scss @@ -0,0 +1,8 @@ +$limelight-font-path: "/fonts/limelight/" !default; + +@font-face { + font-family: 'Limelight'; + src: url("#{$limelight-font-path}Limelight-Regular.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} diff --git a/projects/shared-ui/src/styles/fontfaces/_lora.scss b/projects/shared-ui/src/styles/fontfaces/_lora.scss new file mode 100644 index 0000000..2517197 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_lora.scss @@ -0,0 +1,11 @@ +$lora-font-path: "/fonts/lora/" !default; + +@font-face { + font-family: "Lora"; + src: url("#{$lora-font-path}Lora-VariableFont_wght.ttf") format("truetype"); +} + +@font-face { + font-family: "Lora Italic"; + src: url("#{$lora-font-path}Lora-Italic-VariableFont_wght.ttf") format("truetype"); +} diff --git a/projects/shared-ui/src/styles/fontfaces/_manrope.scss b/projects/shared-ui/src/styles/fontfaces/_manrope.scss new file mode 100644 index 0000000..065dc4f --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_manrope.scss @@ -0,0 +1,85 @@ +$manrope-font-path: "/fonts/manrope/" !default; + + + +/* +@font-face { + font-family: "Manrope"; + src: url("#{$manrope-font-path}Manrope-VariableFont_wght.ttf") format("truetype"); +} +*/ + + +@font-face { + font-family: 'Manrope'; + src: url("#{$manrope-font-path}Manrope-V.otf") format("otf"); + font-weight: normal; + font-style: normal; +} + + + + +@font-face { + font-family: 'Manrope'; + font-style: normal; + font-weight: 200; + font-display: swap; + src: url("#{$manrope-font-path}Manrope-ExtraLight.woff2") format("woff2"), + url("#{$manrope-font-path}Manrope-ExtraLight.woff") format("woff"); +} + +@font-face { + font-family: 'Manrope'; + font-style: normal; + font-weight: 300; + font-display: swap; + src: url("#{$manrope-font-path}Manrope-Light.woff2") format("woff2"), + url("#{$manrope-font-path}Manrope-Light.woff") format("woff"); +} + +@font-face { + font-family: 'Manrope'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url("#{$manrope-font-path}Manrope-Regular.woff2") format("woff2"), + url("#{$manrope-font-path}Manrope-Regular.woff") format("woff"); +} + +@font-face { + font-family: 'Manrope'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url("#{$manrope-font-path}Manrope-Medium.woff2") format("woff2"), + url("#{$manrope-font-path}Manrope-Medium.woff") format("woff"); +} + +@font-face { + font-family: 'Manrope'; + font-style: normal; + font-weight: 600; + font-display: swap; + src: url("#{$manrope-font-path}Manrope-SemiBold.woff2") format("woff2"), + url("#{$manrope-font-path}Manrope-SemiBold.woff") format("woff"); +} + +@font-face { + font-family: 'Manrope'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url("#{$manrope-font-path}Manrope-Bold.woff2") format("woff2"), + url("#{$manrope-font-path}Manrope-Bold.woff") format("woff"); +} + +@font-face { + font-family: 'Manrope'; + font-style: normal; + font-weight: 800; + font-display: swap; + src: url("#{$manrope-font-path}Manrope-ExtraBold.woff2") format("woff2"), + url("#{$manrope-font-path}Manrope-ExtraBold.woff") format("woff"); +} + diff --git a/projects/shared-ui/src/styles/fontfaces/_merriweather.scss b/projects/shared-ui/src/styles/fontfaces/_merriweather.scss new file mode 100644 index 0000000..71ceb10 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_merriweather.scss @@ -0,0 +1,12 @@ +$merriweather-font-path: "/fonts/merriweather/" !default; + + +@font-face { + font-family: 'Merriweather Regular'; + src: url("#{$merriweather-font-path}merriweather-regular-webfont.ttf"); +} + +@font-face { + font-family: 'Merriweather Italic'; + src: url("#{$merriweather-font-path}merriweather-italic-webfont.ttf"); +} diff --git a/projects/shared-ui/src/styles/fontfaces/_metropolis.scss b/projects/shared-ui/src/styles/fontfaces/_metropolis.scss new file mode 100644 index 0000000..9a4157d --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_metropolis.scss @@ -0,0 +1,121 @@ +$metropolis-font-path: "/fonts/metropolis/" !default; + + +@font-face { + font-family: 'Metropolis Regular'; + src: url("#{$metropolis-font-path}Metropolis-Regular.otf"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Metropolis Regular Italic'; + src: url("#{$metropolis-font-path}Metropolis-RegularItalic.otf"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Metropolis Medium'; + src: url("#{$metropolis-font-path}Metropolis-Medium.otf"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Metropolis Medium Italic'; + src: url("#{$metropolis-font-path}Metropolis-MediumItalic.otf"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Metropolis Bold'; + src: url("#{$metropolis-font-path}Metropolis-Bold.otf"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Metropolis Bold Italic'; + src: url("#{$metropolis-font-path}Metropolis-BoldItalic.otf"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Metropolis Extra Bold'; + src: url("#{$metropolis-font-path}Metropolis-Bold.otf"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Metropolis Extra Bold Italic'; + src: url("#{$metropolis-font-path}Metropolis-BoldItalic.otf"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Metropolis Black'; + src: url("#{$metropolis-font-path}Metropolis-Black.otf"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Metropolis Semi Bold'; + src: url("#{$metropolis-font-path}Metropolis-SemiBold.otf"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Metropolis Extra Bold Italic'; + src: url("#{$metropolis-font-path}Metropolis-SemiBoldItalic.otf"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Metropolis Thin'; + src: url("#{$metropolis-font-path}Metropolis-Thin.otf"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Metropolis Thin Italic'; + src: url("#{$metropolis-font-path}Metropolis-ThinItalic.otf"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Metropolis Light'; + src: url("#{$metropolis-font-path}Metropolis-Light.otf"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Metropolis Light Italic'; + src: url("#{$metropolis-font-path}Metropolis-LightItalic.otf"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Metropolis Extra Light'; + src: url("#{$metropolis-font-path}Metropolis-ExtraLight.otf"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Metropolis Extra Light Italic'; + src: url("#{$metropolis-font-path}Metropolis-ExtraLightItalic.otf"); + font-weight: normal; + font-style: normal; +} diff --git a/projects/shared-ui/src/styles/fontfaces/_monasans.scss b/projects/shared-ui/src/styles/fontfaces/_monasans.scss new file mode 100644 index 0000000..2f347d0 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_monasans.scss @@ -0,0 +1,9 @@ +$monasans-font-path: "/fonts/monasans/" !default; + + +@font-face { + font-family: 'Mona Sans'; + src: url("#{$monasans-font-path}Mona-Sans.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} \ No newline at end of file diff --git a/projects/shared-ui/src/styles/fontfaces/_montserrat.scss b/projects/shared-ui/src/styles/fontfaces/_montserrat.scss new file mode 100644 index 0000000..06b21ce --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_montserrat.scss @@ -0,0 +1,51 @@ +$montserrat-font-path: "/fonts/montserrat/" !default; + +@font-face { + font-family: "Montserrat"; + src: url("#{$montserrat-font-path}Montserrat-VariableFont_wght.ttf") format("truetype") +} +/* +@font-face { + font-family: "Montserrat Light"; + src: local(Montserrat Light), url('#{$montserrat-font-path}Montserrat-Light.ttf'); + src: url("#{$montserrat-font-path}Montserrat-Light.ttf") format("truetype"); + font-weight: 300; +} +@font-face { + font-family: "Montserrat Regular"; + src: local(Montserrat Regular), url('#{$montserrat-font-path}Montserrat-Regular.ttf'); + src: url("#{$montserrat-font-path}Montserrat-Regular.ttf") format("truetype"); + font-weight: 400; +} +@font-face { + font-family: "Montserrat Bold"; + src: local(Montserrat Bold), url('#{$montserrat-font-path}Montserrat-Bold.ttf'); + src: url("#{$montserrat-font-path}Montserrat-Bold.ttf") format("truetype"); + font-weight: 700; +} + +@font-face { + font-family: "Montserrat Semi Bold"; + src: local(Montserrat Semi Bold), url('#{$montserrat-font-path}Montserrat-SemiBold.ttf'); + src: url("#{$montserrat-font-path}Montserrat-SemiBold.ttf") format("truetype"); + font-weight: 600; +} + +@font-face { + font-family: "Montserrat Medium"; + src: local(Montserrat Medium), url('#{$montserrat-font-path}Montserrat-Medium.ttf'); + src: url("#{$montserrat-font-path}Montserrat-Medium.ttf") format("truetype"); + font-weight: 600; +} + +@font-face { + font-family: "Montserrat Hairline"; + src: local(Montserrat Hairline), url('#{$montserrat-font-path}Montserrat-Hairline.ttf'); + src: url("#{$montserrat-font-path}Montserrat-Hairline.ttf") format("truetype"); + font-weight: 100; +} + +.montserrat { + font-family: "Montserrat"; +} +*/ \ No newline at end of file diff --git a/projects/shared-ui/src/styles/fontfaces/_nacelle.scss b/projects/shared-ui/src/styles/fontfaces/_nacelle.scss new file mode 100644 index 0000000..49785ff --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_nacelle.scss @@ -0,0 +1,47 @@ +$nacelle-font-path: "/fonts/nacelle/" !default; + + +@font-face { + font-family: 'Nacelle Regular'; + src: url("#{$nacelle-font-path}Nacelle-Regular.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Nacelle Semi Bold'; + src: url("#{$nacelle-font-path}Nacelle-SemiBold.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Nacelle Bold'; + src: url("#{$nacelle-font-path}Nacelle-Bold.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Nacelle Heavy'; + src: url("#{$nacelle-font-path}Nacelle-Heavy.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Nacelle Black'; + src: url("#{$nacelle-font-path}Nacelle-Black.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + + +@font-face { + font-family: 'Nacelle Light'; + src: url("#{$nacelle-font-path}Nacelle-Light.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + + diff --git a/projects/shared-ui/src/styles/fontfaces/_norwester.scss b/projects/shared-ui/src/styles/fontfaces/_norwester.scss new file mode 100644 index 0000000..d512126 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_norwester.scss @@ -0,0 +1,17 @@ +$norwester-font-path: "/fonts/norwester/" !default; + +/*** Norwester ***/ +@font-face { + font-family: 'Norwester'; + src: url("#{$norwester-font-path}norwester-webfont.ttf") format("truetype"), + url('#{$norwester-font-path}norwester-webfont.woff2') format('woff2'), /* Super Modern Browsers */ + url('#{$norwester-font-path}norwester-webfont.woff') format('woff'); /* Modern Browsers */ + font-weight: normal; + font-style: normal; +} + + + +.norwester { + font-family: 'norwesterregular'; +} diff --git a/projects/shared-ui/src/styles/fontfaces/_notosans.scss b/projects/shared-ui/src/styles/fontfaces/_notosans.scss new file mode 100644 index 0000000..056f918 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_notosans.scss @@ -0,0 +1,12 @@ +$notosans-font-path: "/fonts/notosans/" !default; + + +/*** Aileron**/ +@font-face { + font-family: 'Noto Sans'; + src: url("#{$notosans-font-path}NotoSans-VariableFont_wdth,wght.ttf") format("truetype"); +} +@font-face { + font-family: 'Noto Sans Italic'; + src: url("#{$notosans-font-path}NotoSans-Italic-VariableFont_wdth,wght.ttf") format("truetype"); +} diff --git a/projects/shared-ui/src/styles/fontfaces/_nunito.scss b/projects/shared-ui/src/styles/fontfaces/_nunito.scss new file mode 100644 index 0000000..df0300d --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_nunito.scss @@ -0,0 +1,39 @@ +$nuntio-font-path: "/fonts/nunito/" !default; + + +@font-face { + font-family: 'Nunito'; + src: url("#{$nuntio-font-path}Nunito-VariableFont_wght.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Nunito Italic'; + src: url("#{$nuntio-font-path}Nunito-Italic-VariableFont_wght.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +/* +@font-face { + font-family: 'Nunito Regular'; + src: url("#{$nuntio-font-path}Nunito-Regular.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Nunito Light'; + src: url("#{$nuntio-font-path}Nunito-Light.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Nunito Semi Bold'; + src: url("#{$nuntio-font-path}Nunito-SemiBold.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} +*/ \ No newline at end of file diff --git a/projects/shared-ui/src/styles/fontfaces/_opensans.scss b/projects/shared-ui/src/styles/fontfaces/_opensans.scss new file mode 100644 index 0000000..3933470 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_opensans.scss @@ -0,0 +1,135 @@ +$opensans-font-path: "/fonts/opensans/" !default; + + +@font-face { + font-family: 'Open Sans'; + src: url("#{$opensans-font-path}OpenSans-VariableFont_wdth.ttf") format("truetype"); + font-style: normal; +} + +@font-face { + font-family: 'Open Sans Italic'; + src: url("#{$opensans-font-path}OpenSans-Italic-VariableFont_wdth.ttf") format("truetype"); + font-style: italic; +} + +/* +@font-face { + font-family: 'Open Sans Bold'; + src: url("#{$opensans-font-path}OpenSans-Bold.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +.opensans-bold { + font-family: 'Open Sans Bold'; +} + + +@font-face { + font-family: 'Open Sans Bold Italic'; + src: url("#{$opensans-font-path}OpenSans-BoldItalic.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +.opensans-bold-italic { + font-family: 'Open Sans Bold Italic'; +} + + +@font-face { + font-family: 'Open Sans Extra Bold'; + src: url("#{$opensans-font-path}OpenSans-ExtraBold.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +.opensans-extra-bold { + font-family: 'Open Sans Extra Bold'; +} + + +@font-face { + font-family: 'Open Sans Extra Bold Italic'; + src: url("#{$opensans-font-path}Open Sans-ExtraBoldItalic.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +.opensans-extra-bold-italic { + font-family: 'Open Sans Extra Bold Italic'; +} + + +@font-face { + font-family: 'Open Sans Italic'; + src: url("#{$opensans-font-path}OpenSans-Italic.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +.opensans-italic { + font-family: 'Open Sans Italic'; +} + + +@font-face { + font-family: 'Open Sans Light'; + src: url("#{$opensans-font-path}OpenSans-Light.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +.opensans-light { + font-family: 'Open Sans Light'; +} + +@font-face { + font-family: 'Open Sans Light Italic'; + src: url("#{$opensans-font-path}OpenSans-LightItalic.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +.opensans-light-italic { + font-family: 'Open Sans Light Italic'; +} + + + +@font-face { + font-family: 'Open Sans Regular'; + src: url("#{$opensans-font-path}OpenSans-Regular.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +.opensans-regular { + font-family: 'Open Sans Regular'; +} + + +@font-face { + font-family: 'Open Sans Semi Bold'; + src: url("#{$opensans-font-path}OpenSans-SemiBold.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +.opensans-semibold { + font-family: 'Open Sans Semi Bold'; +} + + +@font-face { + font-family: 'Open Sans Semi Bold Italic'; + src: url("#{$opensans-font-path}OpenSans-SemiBoldItalic.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +.opensans-semibold-italic { + font-family: 'Open Sans Semi Bold Italic'; +} +*/ \ No newline at end of file diff --git a/projects/shared-ui/src/styles/fontfaces/_oswald.scss b/projects/shared-ui/src/styles/fontfaces/_oswald.scss new file mode 100644 index 0000000..c26fe88 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_oswald.scss @@ -0,0 +1,8 @@ +$oswald-font-path: "/fonts/oswald/" !default; + + +@font-face { + font-family: "Oswald"; + src: url("#{$oswald-font-path}Oswald-VariableFont_wght.ttf") format("truetype"); +} + diff --git a/projects/shared-ui/src/styles/fontfaces/_outfit.scss b/projects/shared-ui/src/styles/fontfaces/_outfit.scss new file mode 100644 index 0000000..1ba83f3 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_outfit.scss @@ -0,0 +1,8 @@ +$outfit-font-path: "/fonts/outfit/" !default; + + +@font-face { + font-family: 'Outfit'; + src: url("#{$outfit-font-path}Outfit-VariableFont_wght.ttf") format("truetype"); +} + diff --git a/projects/shared-ui/src/styles/fontfaces/_overused.scss b/projects/shared-ui/src/styles/fontfaces/_overused.scss new file mode 100644 index 0000000..76873de --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_overused.scss @@ -0,0 +1,12 @@ +$overused-font-path: "/fonts/overused/" !default; + + +@font-face { + font-family: "Overused"; + src: url("#{$overused-font-path}OverusedGrotesk-VF.ttf") format("truetype"); +} + +@font-face { + font-family: "Overused Italic"; + src: url("#{$overused-font-path}OverusedGroteskRoman-VF.ttf") format("truetype"); +} diff --git a/projects/shared-ui/src/styles/fontfaces/_playfair_display.scss b/projects/shared-ui/src/styles/fontfaces/_playfair_display.scss new file mode 100644 index 0000000..16d05c3 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_playfair_display.scss @@ -0,0 +1,12 @@ +$playfairdisplay-font-path: "/fonts/playfair_display/" !default; + + +@font-face { + font-family: "Playfair Display"; + src: url("#{$playfairdisplay-font-path}PlayfairDisplay-VariableFont_wght.ttf") format("truetype"); +} + +@font-face { + font-family: "Playfair Display Italic"; + src: url("#{$playfairdisplay-font-path}PlayfairDisplay-Italic-VariableFont_wght.ttf") format("truetype"); +} diff --git a/projects/shared-ui/src/styles/fontfaces/_plusjakatasans.scss b/projects/shared-ui/src/styles/fontfaces/_plusjakatasans.scss new file mode 100644 index 0000000..021e8ad --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_plusjakatasans.scss @@ -0,0 +1,13 @@ +$plusJakartasans-font-path: "/fonts/plusjakatasans/" !default; + + +@font-face { + font-family: 'Plus Jakarta Sans'; + src: url("#{$plusJakartasans-font-path}PlusJakartaSans-VariableFont_wght.ttf") format("truetype"); +} + +@font-face { + font-family: 'Plus Jakarta Sans Italic'; + src: url("#{$plusJakartasans-font-path}PlusJakartaSans-Italic-VariableFont_wght.ttf") format("truetype"); +} + \ No newline at end of file diff --git a/projects/shared-ui/src/styles/fontfaces/_poppins.scss b/projects/shared-ui/src/styles/fontfaces/_poppins.scss new file mode 100644 index 0000000..54cc367 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_poppins.scss @@ -0,0 +1,38 @@ +$poppins-font-path: "/fonts/poppins/" !default; + +/*** Poppins ***/ +@font-face { + font-family: 'Poppins Regular'; + src: url("#{$poppins-font-path}poppins-regular-webfont.ttf") format("truetype"), + url('#{$poppins-font-path}poppins-regular-webfont.woff2') format('woff2'), /* Super Modern Browsers */ + url('#{$poppins-font-path}poppins-regular-webfont.woff') format('woff'); /* Modern Browsers */ + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Poppins Medium'; + src: url("#{$poppins-font-path}poppins-medium-webfont.ttf") format("truetype"), + url('#{$poppins-font-path}poppins-medium-webfont.woff2') format('woff2'), /* Super Modern Browsers */ + url('#{$poppins-font-path}poppins-medium-webfont.woff') format('woff'); /* Modern Browsers */ + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Poppins Light'; + src: url("#{$poppins-font-path}poppins-light-webfont.ttf") format("truetype"), + url('#{$poppins-font-path}poppins-light-webfont.woff2') format('woff2'), /* Super Modern Browsers */ + url('#{$poppins-font-path}poppins-light-webfont.woff') format('woff'); /* Modern Browsers */ + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Poppins Semi Bold'; + src: url("#{$poppins-font-path}poppins-semibold-webfont.ttf") format("truetype"), + url('#{$poppins-font-path}poppins-semibold-webfont.woff2') format('woff2'), /* Super Modern Browsers */ + url('#{$poppins-font-path}poppins-semibold-webfont.woff') format('woff'); /* Modern Browsers */ + font-weight: normal; + font-style: normal; +} diff --git a/projects/shared-ui/src/styles/fontfaces/_questrial.scss b/projects/shared-ui/src/styles/fontfaces/_questrial.scss new file mode 100644 index 0000000..b2be76a --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_questrial.scss @@ -0,0 +1,10 @@ +$questrial-font-path: "/fonts/questrial/" !default; + + +/*** Aileron**/ +@font-face { + font-family: 'Questrial Regular'; + src: url("#{$questrial-font-path}Questrial-Regular.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} diff --git a/projects/shared-ui/src/styles/fontfaces/_quicksand.scss b/projects/shared-ui/src/styles/fontfaces/_quicksand.scss new file mode 100644 index 0000000..20460d9 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_quicksand.scss @@ -0,0 +1,10 @@ +$quicksand-font-path: "/fonts/quicksand/" !default; + + +/*** Aileron**/ +@font-face { + font-family: 'Quicksand'; + src: url("#{$quicksand-font-path}Quicksand-VariableFont_wght.ttf") format("truetype"); + //font-weight: normal; + font-style: normal; +} diff --git a/projects/shared-ui/src/styles/fontfaces/_raleway.scss b/projects/shared-ui/src/styles/fontfaces/_raleway.scss new file mode 100644 index 0000000..519b05e --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_raleway.scss @@ -0,0 +1,226 @@ +$raleway-font-path: "/fonts/raleway/" !default; + +@font-face { + font-family: 'Raleway'; + src: url("#{$commissioner-font-path}Raleway-VariableFont_wght.ttf") format("truetype"); +} + +@font-face { + font-family: 'Raleway Italic'; + src: url("#{$commissioner-font-path}Raleway-Italic-VariableFont_wght.ttf") format("truetype"); +} + +/* +@font-face { + font-family: 'Raleway Black'; + src: url("#{$raleway-font-path}Raleway-Black.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +.raleway-black { + font-family: 'Raleway Black'; +} + +@font-face { + font-family: 'Raleway Black Italic'; + src: url("#{$raleway-font-path}Raleway-BlackItalic.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +.raleway-black-italic { + font-family: 'Raleway Black Italic'; +} + + + +@font-face { + font-family: 'Raleway Bold'; + src: url("#{$raleway-font-path}Raleway-Bold.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +.raleway-bold { + font-family: 'Raleway Bold'; +} + + +@font-face { + font-family: 'Raleway Bold Italic'; + src: url("#{$raleway-font-path}Raleway-BoldItalic.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +.raleway-bold-italic { + font-family: 'Raleway Bold Italic'; +} + + +@font-face { + font-family: 'Raleway Extra Bold'; + src: url("#{$raleway-font-path}Raleway-ExtraBold.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +.raleway-extra-bold { + font-family: 'Raleway Extra Bold'; +} + + +@font-face { + font-family: 'Raleway Extra Bold Italic'; + src: url("#{$raleway-font-path}Raleway-ExtraBoldItalic.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +.raleway-extra-bold-italic { + font-family: 'Raleway Extra Bold Italic'; +} + + +@font-face { + font-family: 'Raleway Extra Light'; + src: url("#{$raleway-font-path}Raleway-ExtraLight.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +.raleway-extra-light { + font-family: 'Raleway Extra Light'; +} + +@font-face { + font-family: 'Raleway Extra Light Italic'; + src: url("#{$raleway-font-path}Raleway-ExtraLightItalic.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +.raleway-extra-light-italic { + font-family: 'Raleway Extra Light Italic'; +} + + +@font-face { + font-family: 'Raleway Italic'; + src: url("#{$raleway-font-path}Raleway-Italic.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +.raleway-italic { + font-family: 'Raleway Italic'; +} + + +@font-face { + font-family: 'Raleway Light'; + src: url("#{$raleway-font-path}Raleway-Light.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +.raleway-light { + font-family: 'Raleway Light'; +} + +@font-face { + font-family: 'Raleway Light Italic'; + src: url("#{$raleway-font-path}Raleway-LightItalic.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +.raleway-light-italic { + font-family: 'Raleway Light Italic'; +} + + +@font-face { + font-family: 'Raleway Medium'; + src: url("#{$raleway-font-path}Raleway-Medium.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +.raleway-medium { + font-family: 'Raleway Medium'; +} + + +@font-face { + font-family: 'Raleway Medium Italic'; + src: url("#{$raleway-font-path}Raleway-MediumItalic.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +.raleway-medium-italic { + font-family: 'Raleway Medium Italic'; +} + + +@font-face { + font-family: 'Raleway Regular'; + src: url("#{$raleway-font-path}Raleway-Regular.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +.raleway-regular { + font-family: 'Raleway Regular'; +} + + +@font-face { + font-family: 'Raleway Semi Bold'; + src: url("#{$raleway-font-path}Raleway-SemiBold.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +.raleway-semibold { + font-family: 'Raleway Semi Bold'; +} + + +@font-face { + font-family: 'Raleway Semi Bold Italic'; + src: url("#{$raleway-font-path}Raleway-SemiBoldItalic.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +.raleway-semibold-italic { + font-family: 'Raleway Semi Bold Italic'; +} + + +@font-face { + font-family: 'Raleway Thin'; + src: url("#{$raleway-font-path}Raleway-Thin.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +.raleway-thin { + font-family: 'Raleway Thin'; +} + + +@font-face { + font-family: 'Raleway Thin Italic'; + src: url("#{$raleway-font-path}Raleway-ThinItalic.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +.raleway-thin-italic { + font-family: 'Raleway Thin Italic'; +} +*/ \ No newline at end of file diff --git a/projects/shared-ui/src/styles/fontfaces/_roboto.scss b/projects/shared-ui/src/styles/fontfaces/_roboto.scss new file mode 100644 index 0000000..0c179e8 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_roboto.scss @@ -0,0 +1,39 @@ +$roboto-font-path: "/fonts/roboto/" !default; + +/**************************************************************** +ROBOTO +****************************************************************/ +@font-face { + font-family: "Roboto"; + src: url("#{$roboto-font-path}Roboto-Thin.ttf") format("truetype"); + font-weight: 200; +} +@font-face { + font-family: "Roboto Light"; + src: url("#{$roboto-font-path}Roboto-Light.ttf") format("truetype"); + font-weight: 300; +} + +@font-face { + font-family: "Roboto Regular"; + src: url("#{$roboto-font-path}Roboto-Regular.ttf") format("truetype"); + font-weight: 400; +} + +@font-face { + font-family: "Roboto Medium"; + src: url("#{$roboto-font-path}Roboto-Medium.ttf") format("truetype"); + font-weight: 500; +} + +@font-face { + font-family: "Roboto"; + src: url("#{$roboto-font-path}Roboto-Bold.ttf") format("truetype"); + font-weight: 700; +} + + + +.roboto { + font-family: "Roboto"; +} diff --git a/projects/shared-ui/src/styles/fontfaces/_robotocondensed.scss b/projects/shared-ui/src/styles/fontfaces/_robotocondensed.scss new file mode 100644 index 0000000..181ef80 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_robotocondensed.scss @@ -0,0 +1,11 @@ +$robotocondensed-font-path: "/fonts/robotocondensed/" !default; + +@font-face { + font-family: 'Roboto Condensed'; + src: url("#{$robotocondensed-font-path}RobotoCondensed-VariableFont_wght.ttf") format("truetype"); +} + +@font-face { + font-family: 'Roboto Condensed Italic'; + src: url("#{$robotocondensed-font-path}RobotoCondensed-Italic-VariableFont_wght.ttf") format("truetype"); +} diff --git a/projects/shared-ui/src/styles/fontfaces/_robotomono.scss b/projects/shared-ui/src/styles/fontfaces/_robotomono.scss new file mode 100644 index 0000000..a70f6f5 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_robotomono.scss @@ -0,0 +1,11 @@ +$robotomono-font-path: "/fonts/robotomono/" !default; + +@font-face { + font-family: 'Ronotomono'; + src: url("#{$robotomono-font-path}RobotoMono-VariableFont_wght.ttf") format("truetype"); +} + +@font-face { + font-family: 'Ronotomono Italic'; + src: url("#{$robotomono-font-path}RobotoMono-Italic-VariableFont_wght.ttf") format("truetype"); +} diff --git a/projects/shared-ui/src/styles/fontfaces/_robotoslab.scss b/projects/shared-ui/src/styles/fontfaces/_robotoslab.scss new file mode 100644 index 0000000..46394cd --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_robotoslab.scss @@ -0,0 +1,8 @@ +$robotoslab-font-path: "/fonts/robotoslab/" !default; + + +@font-face { + font-family: "Roboto Slab"; + src: url("#{$robotoslab-font-path}RobotoSlab-VariableFont_wght.ttf") format("truetype"); +} + diff --git a/projects/shared-ui/src/styles/fontfaces/_rubik.scss b/projects/shared-ui/src/styles/fontfaces/_rubik.scss new file mode 100644 index 0000000..334a576 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_rubik.scss @@ -0,0 +1,11 @@ +$rubik-font-path: "/fonts/rubik/" !default; + +@font-face { + font-family: 'Rubik'; + src: url("#{$rubik-font-path}Rubik-VariableFont_wght.ttf") format("truetype"); +} + +@font-face { + font-family: 'Rubik Italic'; + src: url("#{$rubik-font-path}Rubik-Italic-VariableFont_wght.ttf") format("truetype"); +} diff --git a/projects/shared-ui/src/styles/fontfaces/_sacramento.scss b/projects/shared-ui/src/styles/fontfaces/_sacramento.scss new file mode 100644 index 0000000..63e9d8e --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_sacramento.scss @@ -0,0 +1,17 @@ +$sacramento-font-path: "/fonts/sacramento/" !default; + + +@font-face { + font-family: 'Sacramento Regular'; + font-style: normal; + src: url("#{$sacramento-font-path}Sacramento-Regular.ttf") format("truetype"), + url('#{$sacramento-font-path}sacramento-regular-webfont.woff2') format('woff2'), /* Super Modern Browsers */ + url('#{$sacramento-font-path}sacramento-regular-webfont.woff') format('woff'); /* Modern Browsers */ + + font-weight: 400; +} + + +.sacramento { + font-family: 'sacramentoregular'; +} diff --git a/projects/shared-ui/src/styles/fontfaces/_satoshi.scss b/projects/shared-ui/src/styles/fontfaces/_satoshi.scss new file mode 100644 index 0000000..1b27ab0 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_satoshi.scss @@ -0,0 +1,16 @@ +$satoshi-font-path: "/fonts/satoshi/" !default; + + +@font-face { + font-family: 'Satoshi'; + src: url("#{$satoshi-font-path}Satoshi-Variable.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Satoshi Semi Bold'; + src: url("#{$satoshi-font-path}Satoshi-Variable.ttf") format("truetype"); + font-weight:bolder; + font-style: normal; +} diff --git a/projects/shared-ui/src/styles/fontfaces/_sifonn.scss b/projects/shared-ui/src/styles/fontfaces/_sifonn.scss new file mode 100644 index 0000000..5af2c17 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_sifonn.scss @@ -0,0 +1,16 @@ +$sifonn-font-path: "/fonts/sifonn/" !default; + +/*** Sifonn ***/ +@font-face { + font-family: 'Sifonn'; + src: url("#{$sifonn-font-path}sifonn_basic-webfont.ttf") format("truetype"), + url('#{$sifonn-font-path}sifonn_basic-webfont.woff2') format('woff2'), /* Super Modern Browsers */ + url('#{$sifonn-font-path}sifonn_basic-webfont.woff') format('woff'); /* Modern Browsers */ + font-weight: normal; + font-style: normal; +} + + +.sifonn { + font-family: 'sifonnbasic'; +} diff --git a/projects/shared-ui/src/styles/fontfaces/_sixcaps.scss b/projects/shared-ui/src/styles/fontfaces/_sixcaps.scss new file mode 100644 index 0000000..f640c6c --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_sixcaps.scss @@ -0,0 +1,9 @@ +$sixcaps-font-path: "/fonts/six-caps/" !default; + + +@font-face { + font-family: 'Six Caps'; + src: url("#{$sixcaps-font-path}SixCaps.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} diff --git a/projects/shared-ui/src/styles/fontfaces/_sora.scss b/projects/shared-ui/src/styles/fontfaces/_sora.scss new file mode 100644 index 0000000..29827f4 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_sora.scss @@ -0,0 +1,14 @@ +$sora-font-path: "/fonts/sora/" !default; + +@font-face { + font-family: 'Sora'; + src: url("#{$sora-font-path}Sora[wght].ttf") format("truetype"); +} +@font-face { + font-family: 'Sora Italic'; + src: url("#{$sora-font-path}Sora-Italic[wght].ttf") format("truetype"); +} + +.sora-regular { + letter-spacing: -0.5%; +} \ No newline at end of file diff --git a/projects/shared-ui/src/styles/fontfaces/_sourcesanspro.scss b/projects/shared-ui/src/styles/fontfaces/_sourcesanspro.scss new file mode 100644 index 0000000..0ff55fb --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_sourcesanspro.scss @@ -0,0 +1,11 @@ +$sourcesanspro-font-path: "/fonts/sourcesanspro/" !default; + +/*** Source Sans Pro ***/ +@font-face { + font-family: 'Source Sans Pro'; + src: url("#{$sourcesanspro-font-path}SourceSans3-VariableFont_wght.ttf") format("truetype"); +} +@font-face { + font-family: 'Source Sans Pro Italic'; + src: url("#{$sourcesanspro-font-path}SourceSans3-Italic-VariableFont_wght.ttf") format("truetype"); +} diff --git a/projects/shared-ui/src/styles/fontfaces/_sourceserifpro.scss b/projects/shared-ui/src/styles/fontfaces/_sourceserifpro.scss new file mode 100644 index 0000000..4208d3b --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_sourceserifpro.scss @@ -0,0 +1,56 @@ +$sourceserifpro-font-path: "/fonts/sourceserifpro/" !default; + +/*** Source Sans Pro ***/ +@font-face { + font-family: 'Source Serif Pro Black'; + src: url("#{$sourceserifpro-font-path}sourceserifpro-black-webfont.ttf") format("truetype"), + url('#{$sourceserifpro-font-path}sourceserifpro-black-webfont.woff2') format('woff2'), /* Super Modern Browsers */ + url('#{$sourceserifpro-font-path}sourceserifpro-black-webfont.woff') format('woff'); /* Modern Browsers */ + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Source Serif Pro Bold'; + src: url("#{$sourceserifpro-font-path}sourceserifpro-bold-webfont.ttf") format("truetype"), + url('#{$sourceserifpro-font-path}sourceserifpro-bold-webfont.woff2') format('woff2'), /* Super Modern Browsers */ + url('#{$sourceserifpro-font-path}sourceserifpro-bold-webfont.woff') format('woff'); /* Modern Browsers */ + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Source Serif Pro SemiBold'; + src: url("#{$sourceserifpro-font-path}sourceserifpro-semibold-webfont.ttf") format("truetype"), + url('#{$sourceserifpro-font-path}sourceserifpro-semibold-webfont.woff2') format('woff2'), /* Super Modern Browsers */ + url('#{$sourceserifpro-font-path}sourceserifpro-semibold-webfont.woff') format('woff'); /* Modern Browsers */ + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Source Serif Pro ExtraLight'; + src: url("#{$sourceserifpro-font-path}sourceserifpro-extralight-webfont.ttf") format("truetype"), + url('#{$sourceserifpro-font-path}sourceserifpro-extralight-webfont.woff2') format('woff2'), /* Super Modern Browsers */ + url('#{$sourceserifpro-font-path}sourceserifpro-extralight-webfont.woff') format('woff'); /* Modern Browsers */ + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Source Serif Pro Light'; + src: url("#{$sourceserifpro-font-path}sourceserifpro-light-webfont.ttf") format("truetype"), + url('#{$sourceserifpro-font-path}sourceserifpro-light-webfont.woff2') format('woff2'), /* Super Modern Browsers */ + url('#{$sourceserifpro-font-path}sourceserifpro-light-webfont.woff') format('woff'); /* Modern Browsers */ + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Source Serif Pro Regular'; + src: url("#{$sourceserifpro-font-path}sourceserifpro-regular-webfont.ttf") format("truetype"), + url('#{$sourceserifpro-font-path}sourceserifpro-regular-webfont.woff2') format('woff2'), /* Super Modern Browsers */ + url('#{$sourceserifpro-font-path}sourceserifpro-regular-webfont.woff') format('woff'); /* Modern Browsers */ + font-weight: normal; + font-style: normal; +} diff --git a/projects/shared-ui/src/styles/fontfaces/_spacegrotesk.scss b/projects/shared-ui/src/styles/fontfaces/_spacegrotesk.scss new file mode 100644 index 0000000..020e1a6 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_spacegrotesk.scss @@ -0,0 +1,7 @@ +$spacegrotesk-font-path: "/fonts/spacegrotesk/" !default; + +@font-face { + font-family: "Space Grotesk"; + src: url("#{$spacegrotesk-font-path}SpaceGrotesk-VariableFont_wght.ttf") format("truetype"); +} + diff --git a/projects/shared-ui/src/styles/fontfaces/_spacemono.scss b/projects/shared-ui/src/styles/fontfaces/_spacemono.scss new file mode 100644 index 0000000..9804c22 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_spacemono.scss @@ -0,0 +1,22 @@ +$spacemono-font-path: "/fonts/spacemono/" !default; + + +@font-face { + font-family: 'Space Mono Bold'; + src: url("#{$spacemono-font-path}SpaceMono-Bold.ttf") format("truetype"); +} + +@font-face { + font-family: 'Space Mono Bold Italic'; + src: url("#{$spacemono-font-path}SpaceMono-BoldItalic.ttf") format("truetype"); +} + +@font-face { + font-family: 'Space Mono Italic'; + src: url("#{$spacemono-font-path}SpaceMono-Italic.ttf") format("truetype"); +} + +@font-face { + font-family: 'Space Mono Regular'; + src: url("#{$spacemono-font-path}SpaceMono-Regular.ttf") format("truetype"); +} diff --git a/projects/shared-ui/src/styles/fontfaces/_unbounded.scss b/projects/shared-ui/src/styles/fontfaces/_unbounded.scss new file mode 100644 index 0000000..8d55a83 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_unbounded.scss @@ -0,0 +1,8 @@ +$unbounded-font-path: "/fonts/unbounded/" !default; + + +/*** Aileron**/ +@font-face { + font-family: 'Unbounded'; + src: url("#{$unbounded-font-path}Unbounded-VariableFont_wght.ttf") format("truetype"); +} diff --git a/projects/shared-ui/src/styles/fontfaces/_urbanist.scss b/projects/shared-ui/src/styles/fontfaces/_urbanist.scss new file mode 100644 index 0000000..3f23c15 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_urbanist.scss @@ -0,0 +1,10 @@ +$urbanist-font-path: "/fonts/urbanist/" !default; + +@font-face { + font-family: 'Urbanist'; + src: url("#{$urbanist-font-path}Urbanist-VariableFont_wght.ttf") format("truetype"); +} +@font-face { + font-family: 'Urbanist Italic'; + src: url("#{$urbanist-font-path}Urbanist-Italic-VariableFont_wght.ttf") format("truetype"); +} \ No newline at end of file diff --git a/projects/shared-ui/src/styles/fontfaces/_vesperlibre.scss b/projects/shared-ui/src/styles/fontfaces/_vesperlibre.scss new file mode 100644 index 0000000..68fbec3 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_vesperlibre.scss @@ -0,0 +1,57 @@ +$vesperlibre-font-path: "/fonts/vesperlibre/" !default; + + +@font-face { + font-family: 'Vesper Libre Regular'; + src: url("#{$vesperlibre-font-path}VesperLibre-Regular.ttf") format("truetype"), + url('#{$vesperlibre-font-path}VesperLibre-Regular.woff2') format('woff2'), /* Super Modern Browsers */ + url('#{$vesperlibre-font-path}VesperLibre-Regular.woff') format('woff'); /* Modern Browsers */ + font-weight: normal; + font-style: normal; +} + +.vesperlibre-regular { + font-family: 'Vesper Libre Regular'; +} + + +@font-face { + font-family: 'Vesper Libre Bold'; + src: url("#{$vesperlibre-font-path}VesperLibre-Bold.ttf") format("truetype"), + url('#{$vesperlibre-font-path}VesperLibre-Bold.woff2') format('woff2'), /* Super Modern Browsers */ + url('#{$vesperlibre-font-path}VesperLibre-Bold.woff') format('woff'); /* Modern Browsers */ + font-weight: normal; + font-style: normal; +} + +.vesperlibre-bold { + font-family: 'Vesper Libre Bold'; +} + + +@font-face { + font-family: 'Vesper Libre Medium'; + src: url("#{$vesperlibre-font-path}VesperLibre-Medium.ttf") format("truetype"), + url('#{$vesperlibre-font-path}VesperLibre-Medium.woff2') format('woff2'), /* Super Modern Browsers */ + url('#{$vesperlibre-font-path}VesperLibre-Medium.woff') format('woff'); /* Modern Browsers */ + font-weight: normal; + font-style: normal; +} + +.vesperlibre-medium { + font-family: 'Vesper Libre Medium'; +} + + +@font-face { + font-family: 'Vesper Libre Heavy'; + src: url("#{$vesperlibre-font-path}VesperLibre-Heavy.ttf") format("truetype"), + url('#{$vesperlibre-font-path}VesperLibre-Heavy.woff2') format('woff2'), /* Super Modern Browsers */ + url('#{$vesperlibre-font-path}VesperLibre-Heavy.woff') format('woff'); /* Modern Browsers */ + font-weight: normal; + font-style: normal; +} + +.vesperlibre-heavy { + font-family: 'Vesper Libre Heavy'; +} diff --git a/projects/shared-ui/src/styles/fontfaces/_vollkorn.scss b/projects/shared-ui/src/styles/fontfaces/_vollkorn.scss new file mode 100644 index 0000000..3e96635 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_vollkorn.scss @@ -0,0 +1,16 @@ +$vollkorn-font-path: "/fonts/vollkorn/" !default; + + +@font-face { + font-family: 'Vollkorn'; + src: url("#{$vollkorn-font-path}Vollkorn-VariableFont_wght.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Vollkorn Italic'; + src: url("#{$vollkorn-font-path}Vollkorn-Italic-VariableFont_wght.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} diff --git a/projects/shared-ui/src/styles/fontfaces/_whisper.scss b/projects/shared-ui/src/styles/fontfaces/_whisper.scss new file mode 100644 index 0000000..fbe9918 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_whisper.scss @@ -0,0 +1,8 @@ +$whisper-font-path: "/fonts/whisper/" !default; + +@font-face { + font-family: 'Whisper Regular'; + src: url("#{$whisper-font-path}Whisper-Regular.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} diff --git a/projects/shared-ui/src/styles/fontfaces/_worksans.scss b/projects/shared-ui/src/styles/fontfaces/_worksans.scss new file mode 100644 index 0000000..361337a --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_worksans.scss @@ -0,0 +1,52 @@ +$worksans-font-path: "/fonts/worksans/" !default; + + +@font-face { + font-family: 'Work Sans'; + src: url("#{$worksans-font-path}WorkSans-VariableFont_wght.ttf") format("truetype"); +} +@font-face { + font-family: 'Work Sans Italic'; + src: url("#{$worksans-font-path}WorkSans-Italic-VariableFont_wght.ttf") format("truetype"); +} + +/* +@font-face { + font-family: 'Work Sans Bold'; + src: url("#{$worksans-font-path}WorkSans-Bold.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + + +@font-face { + font-family: 'Work Sans Extra Bold'; + src: url("#{$worksans-font-path}WorkSans-ExtraBold.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + + +@font-face { + font-family: 'Work Sans Light'; + src: url("#{$worksans-font-path}WorkSans-Light.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + + +@font-face { + font-family: 'Work Sans Regular'; + src: url("#{$worksans-font-path}WorkSans-Regular.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} + + +@font-face { + font-family: 'Work Sans Semi Bold'; + src: url("#{$worksans-font-path}WorkSans-SemiBold.ttf") format("truetype"); + font-weight: normal; + font-style: normal; +} +*/ \ No newline at end of file diff --git a/projects/shared-ui/src/styles/fontfaces/_zillaslab.scss b/projects/shared-ui/src/styles/fontfaces/_zillaslab.scss new file mode 100644 index 0000000..c0c8601 --- /dev/null +++ b/projects/shared-ui/src/styles/fontfaces/_zillaslab.scss @@ -0,0 +1,52 @@ +$zillaslab-font-path: "/fonts/zillaslab/" !default; + + +@font-face { + font-family: 'Zilla Slab Bold'; + src: url("#{$zillaslab-font-path}ZillaSlab-Bold.ttf") format("truetype"); +} + +@font-face { + font-family: 'Zilla Slab Bold Italic'; + src: url("#{$zillaslab-font-path}ZillaSlab-BoldItalic.ttf") format("truetype"); +} + +@font-face { + font-family: 'Zilla Slab Italic'; + src: url("#{$zillaslab-font-path}ZillaSlab-Italic.ttf") format("truetype"); +} + +@font-face { + font-family: 'Zilla Slab Regular'; + src: url("#{$zillaslab-font-path}ZillaSlab-Regular.ttf") format("truetype"); +} + +@font-face { + font-family: 'Zilla Slab Light'; + src: url("#{$zillaslab-font-path}ZillaSlab-Light.ttf") format("truetype"); +} + +@font-face { + font-family: 'Zilla Slab Light Italic'; + src: url("#{$zillaslab-font-path}ZillaSlab-LightItalic.ttf") format("truetype"); +} + +@font-face { + font-family: 'Zilla Slab Medium'; + src: url("#{$zillaslab-font-path}ZillaSlab-Medium.ttf") format("truetype"); +} + +@font-face { + font-family: 'Zilla Slab Medium Italic'; + src: url("#{$zillaslab-font-path}ZillaSlab-MediumItalic.ttf") format("truetype"); +} + +@font-face { + font-family: 'Zilla Slab Semi Bold'; + src: url("#{$zillaslab-font-path}ZillaSlab-SemiBold.ttf") format("truetype"); +} + +@font-face { + font-family: 'Zilla Slab Semi Bold Italic'; + src: url("#{$zillaslab-font-path}ZillaSlab-SemiBoldItalic.ttf") format("truetype"); +} diff --git a/projects/shared-ui/src/styles/index.scss b/projects/shared-ui/src/styles/index.scss new file mode 100644 index 0000000..6fd6b88 --- /dev/null +++ b/projects/shared-ui/src/styles/index.scss @@ -0,0 +1,23 @@ +// ========================================================================== +// SHARED-UI STYLES MAIN ENTRY POINT +// ========================================================================== +// Complete design system including base tokens, semantic tokens, and components +// This is the primary entry point for importing the entire design system +// +// Usage: +// @use 'path/to/shared-ui/src/styles' as styles; +// color: styles.$semantic-color-primary; +// +// For tokens only: +// @use 'path/to/shared-ui/src/styles/tokens' as tokens; +// ========================================================================== + +// Forward semantic layer (includes base tokens automatically) +@forward 'semantic/index'; + + +// Forward font faces +@forward 'fontfaces/all-fontfaces'; + +// Note: Commons should be imported separately to avoid circular dependencies +// Import commons: @use 'path/to/shared-ui/src/styles/commons'; \ No newline at end of file diff --git a/projects/shared-ui/src/styles/semantic/borders/_index.scss b/projects/shared-ui/src/styles/semantic/borders/_index.scss new file mode 100644 index 0000000..4c15920 --- /dev/null +++ b/projects/shared-ui/src/styles/semantic/borders/_index.scss @@ -0,0 +1,10 @@ +// ========================================================================== +// SEMANTIC BORDERS INDEX +// ========================================================================== +// Contextual border system for components and UI elements +// ========================================================================== + +// Note: base tokens imported at semantic/index level + +// Semantic border mappings +@import 'semantic-borders'; \ No newline at end of file diff --git a/projects/shared-ui/src/styles/semantic/borders/_semantic-borders.scss b/projects/shared-ui/src/styles/semantic/borders/_semantic-borders.scss new file mode 100644 index 0000000..88847d3 --- /dev/null +++ b/projects/shared-ui/src/styles/semantic/borders/_semantic-borders.scss @@ -0,0 +1,132 @@ +// ========================================================================== +// SEMANTIC BORDERS +// ========================================================================== +// Meaningful border tokens for components and UI elements +// Maps base border values to contextual usage patterns +// ========================================================================== +@use '../../base/borders' as *; + +// COMPONENT BORDERS - UI component border styles +$semantic-border-button-width: $base-border-width-1 !default; // Standard button border +$semantic-border-button-style: $base-border-style-solid !default; // Button border style +$semantic-border-button-radius: $base-border-radius-md !default; // Button corner radius + +$semantic-border-input-width: $base-border-width-1 !default; // Form input border +$semantic-border-input-style: $base-border-style-solid !default; // Input border style +$semantic-border-input-radius: $base-border-radius-md !default; // Input corner radius + +$semantic-border-card-width: $base-border-width-1 !default; // Card border width +$semantic-border-card-style: $base-border-style-solid !default; // Card border style +$semantic-border-card-radius: $base-border-radius-lg !default; // Card corner radius + +// INTERACTION BORDERS - State-based border styles +$semantic-border-focus-width: $base-border-width-2 !default; // Focus state border +$semantic-border-hover-width: $base-border-width-1 !default; // Hover state border +$semantic-border-active-width: $base-border-width-2 !default; // Active state border +$semantic-border-disabled-width: $base-border-width-1 !default; // Disabled state border + +// FEEDBACK BORDERS - Status and validation borders +$semantic-border-success-width: $base-border-width-1 !default; // Success state border +$semantic-border-warning-width: $base-border-width-1 !default; // Warning state border +$semantic-border-error-width: $base-border-width-1 !default; // Error state border +$semantic-border-info-width: $base-border-width-1 !default; // Info state border + +// LAYOUT BORDERS - Structure and separation +$semantic-border-divider-width: $base-border-width-1 !default; // Content dividers +$semantic-border-divider-style: $base-border-style-solid !default; // Divider style +$semantic-border-separator-width: $base-border-width-hairline !default; // Subtle separators +$semantic-border-separator-style: $base-border-style-solid !default; // Separator style + +// NAVIGATION BORDERS - Menu and navigation elements +$semantic-border-nav-width: $base-border-width-1 !default; // Navigation borders +$semantic-border-nav-style: $base-border-style-solid !default; // Nav border style +$semantic-border-nav-radius: $base-border-radius-sm !default; // Nav corner radius + +$semantic-border-tab-width: $base-border-width-2 !default; // Tab borders +$semantic-border-tab-style: $base-border-style-solid !default; // Tab border style +$semantic-border-tab-radius: $base-border-radius-sm !default; // Tab corner radius + +// CONTAINER BORDERS - Cards, panels, modals +$semantic-border-modal-width: $base-border-width-0 !default; // Modal border (usually none) +$semantic-border-modal-radius: $base-border-radius-xl !default; // Modal corner radius + +$semantic-border-panel-width: $base-border-width-1 !default; // Side panel border +$semantic-border-panel-style: $base-border-style-solid !default; // Panel border style +$semantic-border-panel-radius: $base-border-radius-lg !default; // Panel corner radius + +// SHAPE BORDERS - Geometric and utility borders +$semantic-border-pill: $base-border-radius-pill !default; // Pill-shaped elements +$semantic-border-circle: $base-border-radius-full !default; // Circular elements +$semantic-border-rounded-sm: $base-border-radius-sm !default; // Small rounded corners +$semantic-border-rounded-md: $base-border-radius-md !default; // Medium rounded corners +$semantic-border-rounded-lg: $base-border-radius-lg !default; // Large rounded corners +$semantic-border-rounded-xl: $base-border-radius-xl !default; // Extra large rounded corners + +// TABLE BORDERS - Data table styling +$semantic-border-table-width: $base-border-width-1 !default; // Table border width +$semantic-border-table-style: $base-border-style-solid !default; // Table border style +$semantic-border-table-radius: $base-border-radius-md !default; // Table corner radius + +$semantic-border-table-cell-width: $base-border-width-hairline !default; // Table cell borders +$semantic-border-table-cell-style: $base-border-style-solid !default; // Cell border style + +// AVATAR AND IMAGE BORDERS +$semantic-border-avatar-width: $base-border-width-2 !default; // Avatar border width +$semantic-border-avatar-style: $base-border-style-solid !default; // Avatar border style +$semantic-border-avatar-radius: $base-border-radius-full !default; // Avatar shape (circular) + +$semantic-border-image-width: $base-border-width-1 !default; // Image border width +$semantic-border-image-style: $base-border-style-solid !default; // Image border style +$semantic-border-image-radius: $base-border-radius-md !default; // Image corner radius + +// UTILITY BORDERS - Common border patterns +$semantic-border-outline-width: $base-border-width-1 !default; // Outline/stroke borders +$semantic-border-outline-style: $base-border-style-solid !default; // Outline border style + +$semantic-border-dashed-width: $base-border-width-1 !default; // Dashed borders +$semantic-border-dashed-style: $base-border-style-dashed !default; // Dashed border style + +$semantic-border-dotted-width: $base-border-width-1 !default; // Dotted borders +$semantic-border-dotted-style: $base-border-style-dotted !default; // Dotted border style + +// ========================================================================== +// BACKWARDS COMPATIBILITY ALIASES +// ========================================================================== +// Aliases for existing border radius patterns in the codebase + +$semantic-border-radius-xs: $base-border-radius-xs !default; // Extra small radius +$semantic-border-radius-sm: $base-border-radius-sm !default; // Small radius +$semantic-border-radius-md: $base-border-radius-md !default; // Medium radius +$semantic-border-radius-lg: $base-border-radius-lg !default; // Large radius +$semantic-border-radius-xl: $base-border-radius-xl !default; // Extra large radius + +// INDIVIDUAL SEMANTIC BORDER TOKENS - Direct access to all base border values + +// BORDER WIDTHS +$semantic-border-width-0: $base-border-width-0 !default; +$semantic-border-width-1: $base-border-width-1 !default; +$semantic-border-width-2: $base-border-width-2 !default; +$semantic-border-width-3: $base-border-width-3 !default; +$semantic-border-width-4: $base-border-width-4 !default; +$semantic-border-width-5: $base-border-width-5 !default; +$semantic-border-width-6: $base-border-width-6 !default; +$semantic-border-width-7: $base-border-width-7 !default; +$semantic-border-width-8: $base-border-width-8 !default; +$semantic-border-width-10: $base-border-width-10 !default; +$semantic-border-width-hairline: $base-border-width-hairline !default; + +// BORDER RADIUS +$semantic-border-radius-none: $base-border-radius-none !default; +$semantic-border-radius-2xl: $base-border-radius-2xl !default; +$semantic-border-radius-3xl: $base-border-radius-3xl !default; +$semantic-border-radius-4xl: $base-border-radius-4xl !default; +$semantic-border-radius-5xl: $base-border-radius-5xl !default; +$semantic-border-radius-full: $base-border-radius-full !default; +$semantic-border-radius-pill: $base-border-radius-pill !default; + +// BORDER STYLES +$semantic-border-style-none: $base-border-style-none !default; +$semantic-border-style-solid: $base-border-style-solid !default; +$semantic-border-style-dashed: $base-border-style-dashed !default; +$semantic-border-style-dotted: $base-border-style-dotted !default; +$semantic-border-style-double: $base-border-style-double !default; \ No newline at end of file diff --git a/projects/shared-ui/src/styles/semantic/colors/_index.scss b/projects/shared-ui/src/styles/semantic/colors/_index.scss new file mode 100644 index 0000000..a6c07b4 --- /dev/null +++ b/projects/shared-ui/src/styles/semantic/colors/_index.scss @@ -0,0 +1,13 @@ +// ========================================================================== +// SEMANTIC COLORS INDEX +// ========================================================================== +// Meaningful color system that bridges base tokens with component usage +// ========================================================================== + +// Note: base tokens imported at semantic/index level + +// Semantic color mappings +@import 'semantic-colors'; + +// Interactive state colors +@import 'state-colors'; \ No newline at end of file diff --git a/projects/shared-ui/src/styles/semantic/colors/_semantic-colors.scss b/projects/shared-ui/src/styles/semantic/colors/_semantic-colors.scss new file mode 100644 index 0000000..a0c31b6 --- /dev/null +++ b/projects/shared-ui/src/styles/semantic/colors/_semantic-colors.scss @@ -0,0 +1,150 @@ +// ========================================================================== +// SEMANTIC COLORS +// ========================================================================== +// Meaningful color tokens that map base tokens to contextual usage +// These provide semantic meaning and make components more maintainable +// ========================================================================== +@use '../../base/colors' as *; +@use '../../base/css-variables' as *; + +// BRAND COLORS - Core brand identity (now CSS variable aware) +$semantic-color-brand-primary: $css-color-primary !default; +$semantic-color-brand-secondary: $css-color-secondary !default; +$semantic-color-brand-tertiary: $css-color-tertiary !default; +$semantic-color-brand-accent: $css-color-tertiary !default; + +// BRAND ON COLORS - Text/icons on brand colors (now CSS variable aware) +$semantic-color-on-brand-primary: $css-color-on-primary !default; +$semantic-color-on-brand-secondary: $css-color-on-secondary !default; +$semantic-color-on-brand-tertiary: $css-color-on-tertiary !default; + +// FEEDBACK COLORS - User feedback and status +$semantic-color-success: $css-color-tertiary !default; // Often green in M3 +$semantic-color-warning: #ff9800 !default; // Amber/orange +$semantic-color-danger: $css-color-error !default; // Red/error +$semantic-color-info: #2196f3 !default; // Blue +$semantic-color-neutral-info: $base-color-neutral !default; // Neutral feedback + +// FEEDBACK ON COLORS - Text/icons on feedback colors +$semantic-color-on-success: $css-color-on-tertiary !default; +$semantic-color-on-warning: #000000 !default; +$semantic-color-on-danger: $css-color-on-error !default; +$semantic-color-on-info: #ffffff !default; + +// SURFACE COLORS - Background and container colors (now CSS variable aware) +$semantic-color-surface-primary: $css-color-surface !default; +$semantic-color-surface-secondary: $css-color-surface-variant !default; +$semantic-color-surface-elevated: $css-color-surface-high !default; +$semantic-color-surface-sunken: $css-color-surface-low !default; +$semantic-color-surface-interactive: $css-color-surface-container !default; +$semantic-color-surface-disabled: $css-color-surface-dim !default; + +// TEXT COLORS - Typography and content (now CSS variable aware) +$semantic-color-text-primary: $css-color-on-surface !default; +$semantic-color-text-secondary: $css-color-on-surface-variant !default; +$semantic-color-text-tertiary: $css-color-outline !default; +$semantic-color-text-disabled: $css-color-outline-variant !default; +$semantic-color-text-inverse: $css-color-inverse-on-surface !default; + +// BORDER COLORS - Lines, dividers, outlines (now CSS variable aware) +$semantic-color-border-primary: $css-color-outline !default; +$semantic-color-border-secondary: $css-color-outline-variant !default; +$semantic-color-border-subtle: $css-color-outline-variant !default; +$semantic-color-border-focus: $css-color-primary !default; +$semantic-color-focus: $css-color-primary !default; // General focus indicator color +$semantic-color-border-error: $css-color-error !default; +$semantic-color-border-disabled: $css-color-outline-variant !default; + +// INTERACTIVE COLORS - Buttons, links, actions (now CSS variable aware) +$semantic-color-interactive-primary: $css-color-primary !default; +$semantic-color-interactive-secondary: $css-color-secondary !default; +$semantic-color-interactive-tertiary: $css-color-tertiary !default; +$semantic-color-interactive-neutral: $css-color-surface-variant !default; + +// CONTAINER COLORS - Cards, panels, modals (now CSS variable aware) +$semantic-color-container-primary: $css-color-primary-container !default; +$semantic-color-container-secondary: $css-color-secondary-container !default; +$semantic-color-container-tertiary: $css-color-tertiary-container !default; +$semantic-color-container-error: $css-color-error-container !default; +$semantic-color-container-surface: $css-color-surface-container !default; + +// CONTAINER ON COLORS - Text/icons on containers (now CSS variable aware) +$semantic-color-on-container-primary: $css-color-on-primary-container !default; +$semantic-color-on-container-secondary: $css-color-on-secondary-container !default; +$semantic-color-on-container-tertiary: $css-color-on-tertiary-container !default; +$semantic-color-on-container-error: $css-color-on-error-container !default; + +// UTILITY COLORS - Special purpose colors (partially CSS variable aware) +$semantic-color-shadow: $css-color-shadow !default; +$semantic-color-scrim: $css-color-scrim !default; +$semantic-color-backdrop: rgba(0, 0, 0, 0.5) !default; +$semantic-color-overlay: rgba(255, 255, 255, 0.1) !default; +$semantic-color-focus-ring: rgba($base-color-primary, 0.12) !default; + +// INDIVIDUAL SEMANTIC COLOR TOKENS - Direct access to all base color values + +// KEY COLORS +$semantic-color-primary-key: $base-color-primary-key !default; +$semantic-color-secondary-key: $base-color-secondary-key !default; +$semantic-color-tertiary-key: $base-color-tertiary-key !default; +$semantic-color-quaternary-key: $base-color-quaternary-key !default; +$semantic-color-neutral-key: $base-color-neutral-key !default; +$semantic-color-error-key: $base-color-error-key !default; +$semantic-color-neutral-variant-key: $base-color-neutral-variant-key !default; + +// PRIMARY COLORS +$semantic-color-primary: $base-color-primary !default; +$semantic-color-on-primary: $base-color-on-primary !default; +$semantic-color-primary-container: $base-color-primary-container !default; +$semantic-color-on-primary-container: $base-color-on-primary-container !default; +$semantic-color-inverse-primary: $base-color-inverse-primary !default; + +// SECONDARY COLORS +$semantic-color-secondary: $base-color-secondary !default; +$semantic-color-on-secondary: $base-color-on-secondary !default; +$semantic-color-secondary-container: $base-color-secondary-container !default; +$semantic-color-on-secondary-container: $base-color-on-secondary-container !default; + +// TERTIARY COLORS +$semantic-color-tertiary: $base-color-tertiary !default; +$semantic-color-on-tertiary: $base-color-on-tertiary !default; +$semantic-color-tertiary-container: $base-color-tertiary-container !default; +$semantic-color-on-tertiary-container: $base-color-on-tertiary-container !default; + +// NEUTRAL COLORS +$semantic-color-neutral: $base-color-neutral !default; +$semantic-color-neutral-variant: $base-color-neutral-variant !default; + +// SURFACE COLORS +$semantic-color-surface: $base-color-surface !default; +$semantic-color-surface-bright: $base-color-surface-bright !default; +$semantic-color-surface-dim: $base-color-surface-dim !default; +$semantic-color-on-surface: $base-color-on-surface !default; +$semantic-color-surface-lowest: $base-color-surface-lowest !default; +$semantic-color-surface-low: $base-color-surface-low !default; +$semantic-color-surface-container: $base-color-surface-container !default; +$semantic-color-surface-high: $base-color-surface-high !default; +$semantic-color-surface-highest: $base-color-surface-highest !default; +$semantic-color-surface-variant: $base-color-surface-variant !default; +$semantic-color-on-surface-variant: $base-color-on-surface-variant !default; +$semantic-color-inverse-surface: $base-color-inverse-surface !default; +$semantic-color-inverse-on-surface: $base-color-inverse-on-surface !default; + +// BACKGROUND COLORS +$semantic-color-background: $base-color-background !default; +$semantic-color-on-background: $base-color-on-background !default; + +// ERROR COLORS +$semantic-color-error: $base-color-error !default; +$semantic-color-on-error: $base-color-on-error !default; +$semantic-color-error-container: $base-color-error-container !default; +$semantic-color-on-error-container: $base-color-on-error-container !default; + +// OUTLINE COLORS +$semantic-color-outline: $base-color-outline !default; +$semantic-color-outline-variant: $base-color-outline-variant !default; + +// UTILITY COLORS +$semantic-color-shadow: $base-color-shadow !default; +$semantic-color-surface-tint: $base-color-surface-tint !default; +$semantic-color-scrim: $base-color-scrim !default; \ No newline at end of file diff --git a/projects/shared-ui/src/styles/semantic/colors/_state-colors.scss b/projects/shared-ui/src/styles/semantic/colors/_state-colors.scss new file mode 100644 index 0000000..672c38f --- /dev/null +++ b/projects/shared-ui/src/styles/semantic/colors/_state-colors.scss @@ -0,0 +1,66 @@ +// ========================================================================== +// STATE COLORS +// ========================================================================== +// Interactive state colors for hover, active, focus, and disabled states +// Based on Material Design 3 state layer system +// ========================================================================== +@use '../../base/colors' as *; +@use '../../base/css-variables' as *; + +// PRIMARY STATE COLORS +$semantic-color-primary-hover: rgba($base-color-primary, 0.08) !default; +$semantic-color-primary-focus: rgba($base-color-primary, 0.12) !default; +$semantic-color-primary-pressed: rgba($base-color-primary, 0.16) !default; +$semantic-color-primary-selected: rgba($base-color-primary, 0.12) !default; +$semantic-color-primary-disabled: rgba($base-color-on-surface, 0.12) !default; + +// SECONDARY STATE COLORS +$semantic-color-secondary-hover: rgba($base-color-secondary, 0.08) !default; +$semantic-color-secondary-focus: rgba($base-color-secondary, 0.12) !default; +$semantic-color-secondary-pressed: rgba($base-color-secondary, 0.16) !default; +$semantic-color-secondary-selected: rgba($base-color-secondary, 0.12) !default; +$semantic-color-secondary-disabled: rgba($base-color-on-surface, 0.12) !default; + +// SURFACE STATE COLORS +$semantic-color-surface-hover: rgba($base-color-on-surface, 0.05) !default; +$semantic-color-surface-focus: rgba($base-color-on-surface, 0.08) !default; +$semantic-color-surface-pressed: rgba($base-color-on-surface, 0.12) !default; +$semantic-color-surface-selected: rgba($base-color-primary, 0.08) !default; +$semantic-color-surface-disabled: rgba($base-color-on-surface, 0.04) !default; + +// ERROR STATE COLORS +$semantic-color-error-hover: rgba($base-color-error, 0.08) !default; +$semantic-color-error-focus: rgba($base-color-error, 0.12) !default; +$semantic-color-error-pressed: rgba($base-color-error, 0.16) !default; +$semantic-color-error-selected: rgba($base-color-error, 0.12) !default; + +// SUCCESS STATE COLORS +$semantic-color-success-hover: rgba($semantic-color-success, 0.08) !default; +$semantic-color-success-focus: rgba($semantic-color-success, 0.12) !default; +$semantic-color-success-pressed: rgba($semantic-color-success, 0.16) !default; +$semantic-color-success-selected: rgba($semantic-color-success, 0.12) !default; + +// WARNING STATE COLORS +$semantic-color-warning-hover: rgba($semantic-color-warning, 0.08) !default; +$semantic-color-warning-focus: rgba($semantic-color-warning, 0.12) !default; +$semantic-color-warning-pressed: rgba($semantic-color-warning, 0.16) !default; +$semantic-color-warning-selected: rgba($semantic-color-warning, 0.12) !default; + +// OUTLINE STATE COLORS +$semantic-color-outline-hover: rgba($base-color-outline, 0.08) !default; +$semantic-color-outline-focus: $base-color-outline !default; +$semantic-color-outline-pressed: rgba($base-color-outline, 0.12) !default; +$semantic-color-outline-disabled: rgba($base-color-outline, 0.38) !default; + +// TEXT STATE COLORS +$semantic-color-text-hover: rgba($base-color-on-surface, 0.87) !default; +$semantic-color-text-focus: $base-color-on-surface !default; +$semantic-color-text-pressed: rgba($base-color-on-surface, 0.87) !default; +$semantic-color-text-disabled: rgba($base-color-on-surface, 0.38) !default; + +// ELEVATION STATE COLORS (for shadows and elevation changes) +$semantic-color-elevation-1: rgba($base-color-shadow, 0.05) !default; +$semantic-color-elevation-2: rgba($base-color-shadow, 0.08) !default; +$semantic-color-elevation-3: rgba($base-color-shadow, 0.12) !default; +$semantic-color-elevation-4: rgba($base-color-shadow, 0.16) !default; +$semantic-color-elevation-5: rgba($base-color-shadow, 0.20) !default; \ No newline at end of file diff --git a/projects/shared-ui/src/styles/semantic/glass/_glass-borders.scss b/projects/shared-ui/src/styles/semantic/glass/_glass-borders.scss new file mode 100644 index 0000000..c3e4e46 --- /dev/null +++ b/projects/shared-ui/src/styles/semantic/glass/_glass-borders.scss @@ -0,0 +1,55 @@ +// ========================================================================== +// GLASS BORDER SEMANTIC TOKENS +// ========================================================================== +// Semantic tokens for glass morphism border effects +// Enhances glass surfaces with subtle borders and edge highlights +// ========================================================================== +@use '../../base/glass' as *; +@use '../../base/borders' as *; +@use '../../base/css-variables' as *; + +// CORE GLASS BORDER VARIANTS +// Border styles that complement glass surfaces +$semantic-glass-border-subtle: $css-glass-border-color !default; +$semantic-glass-border-medium: rgba($css-glass-background-base, calc($css-glass-opacity-light + 0.1)) !default; +$semantic-glass-border-prominent: rgba($css-glass-background-base, calc($css-glass-opacity-medium + 0.1)) !default; + +// EDGE HIGHLIGHT EFFECTS +// Subtle highlights that enhance the glass illusion +$semantic-glass-border-highlight-top: rgba(255, 255, 255, 0.3) !default; +$semantic-glass-border-highlight-bottom: rgba(0, 0, 0, 0.1) !default; + +// COMPONENT-SPECIFIC GLASS BORDERS +$semantic-glass-border-card: $semantic-glass-border-subtle !default; +$semantic-glass-border-modal: $semantic-glass-border-medium !default; +$semantic-glass-border-dropdown: $semantic-glass-border-prominent !default; +$semantic-glass-border-tooltip: $semantic-glass-border-subtle !default; +$semantic-glass-border-button: $semantic-glass-border-medium !default; +$semantic-glass-border-input: $semantic-glass-border-subtle !default; + +// INTERACTIVE GLASS BORDERS +$semantic-glass-border-hover: rgba($css-glass-background-base, calc($css-glass-opacity-medium + 0.2)) !default; +$semantic-glass-border-focus: rgba($css-glass-background-base, calc($css-glass-opacity-heavy + 0.1)) !default; +$semantic-glass-border-active: rgba($css-glass-background-base, calc($css-glass-opacity-frosted + 0.1)) !default; + +// GLASS BORDER WIDTHS +$semantic-glass-border-width-thin: 1px !default; +$semantic-glass-border-width-medium: 2px !default; +$semantic-glass-border-width-thick: 3px !default; + +// GLASS BORDER RADIUS +// Complement existing border radius tokens with glass-specific values +$semantic-glass-border-radius-sm: $base-border-radius-sm !default; +$semantic-glass-border-radius-md: $base-border-radius-md !default; +$semantic-glass-border-radius-lg: $base-border-radius-lg !default; +$semantic-glass-border-radius-xl: $base-border-radius-xl !default; + +// GLASS BORDER MAP +$semantic-glass-borders: ( + subtle: $semantic-glass-border-subtle, + medium: $semantic-glass-border-medium, + prominent: $semantic-glass-border-prominent, + hover: $semantic-glass-border-hover, + focus: $semantic-glass-border-focus, + active: $semantic-glass-border-active +) !default; \ No newline at end of file diff --git a/projects/shared-ui/src/styles/semantic/glass/_glass-mixins.scss b/projects/shared-ui/src/styles/semantic/glass/_glass-mixins.scss new file mode 100644 index 0000000..22d223d --- /dev/null +++ b/projects/shared-ui/src/styles/semantic/glass/_glass-mixins.scss @@ -0,0 +1,226 @@ +// ========================================================================== +// GLASS EFFECT MIXINS +// ========================================================================== +// Comprehensive mixins for implementing glass morphism effects +// Includes animations, fallbacks, and responsive behavior +// ========================================================================== +@use '../../base/css-variables' as *; +@use '../../base/motion' as *; +@use '../../base/spacing' as *; +@use '../../base/glass' as *; +@use '../../base/breakpoints' as *; +@use '../../base/z-index' as *; + +@use '../spacing' as *; +@use '../colors' as *; + +@import 'glass-borders'; + +// CORE GLASS EFFECT MIXIN +// Primary mixin for applying glass morphism with full customization +@mixin glass-effect( + $variant: 'medium', + $blur: $css-glass-blur-md, + $border: true, + $shadow: true, + $animate: false, + $duration: var(--glass-duration-normal, 300ms) +) { + // Background with dynamic opacity + background: rgba($css-glass-background-base, var(--glass-opacity-#{$variant})); + + // Backdrop blur effect + backdrop-filter: blur($blur); + -webkit-backdrop-filter: blur($blur); + + // Optional border + @if $border { + border: $semantic-glass-border-width-thin solid $css-glass-border-color; + } + + // Optional shadow + @if $shadow { + box-shadow: + 0 4px 6px $css-glass-shadow-color, + 0 1px 3px rgba($css-glass-background-base, 0.1); + } + + // Animation support + @if $animate { + transition: + background $duration $base-glass-easing-smooth, + backdrop-filter $duration $base-glass-easing-smooth, + border-color $duration $base-glass-easing-smooth, + box-shadow $duration $base-glass-easing-smooth; + } + + // Performance optimization + will-change: backdrop-filter, background; + + // Fallback for browsers without backdrop-filter support + @supports not (backdrop-filter: blur(1px)) { + background: rgba($css-glass-background-base, calc(var(--glass-opacity-#{$variant}) + 0.15)); + } +} + +// SIMPLIFIED GLASS VARIANTS +// Quick mixins for common glass effect intensities +@mixin glass-translucent($animate: false) { + @include glass-effect('translucent', $css-glass-blur-sm, true, true, $animate); +} + +@mixin glass-light($animate: false) { + @include glass-effect('light', $css-glass-blur-md, true, true, $animate); +} + +@mixin glass-medium($animate: false) { + @include glass-effect('medium', $css-glass-blur-md, true, true, $animate); +} + +@mixin glass-heavy($animate: false) { + @include glass-effect('heavy', $css-glass-blur-lg, true, true, $animate); +} + +@mixin glass-frosted($animate: false) { + @include glass-effect('frosted', $css-glass-blur-xl, true, true, $animate); +} + +// GLASS TRANSITION MIXIN +// Animates from one glass state to another +@mixin glass-transition( + $from-variant: 'opaque', + $to-variant: 'medium', + $duration: var(--glass-duration-normal, 300ms), + $trigger: 'hover' +) { + // Initial state + @if $from-variant == 'opaque' { + background: rgb($css-glass-background-base); + backdrop-filter: blur(0); + -webkit-backdrop-filter: blur(0); + border: $semantic-glass-border-width-thin solid transparent; + } @else { + @include glass-effect($from-variant, $css-glass-blur-md, true, true, false); + } + + // Smooth transition properties + transition: + background $duration $base-glass-easing-smooth, + backdrop-filter $duration $base-glass-easing-smooth, + border-color $duration $base-glass-easing-smooth, + box-shadow $duration $base-glass-easing-smooth, + transform $duration $base-glass-easing-smooth; + + // Target state based on trigger + @if $trigger == 'hover' { + &:hover { + @include glass-effect($to-variant, $css-glass-blur-md, true, true, false); + transform: translateY(-1px); + } + } @else if $trigger == 'focus' { + &:focus, + &:focus-within { + @include glass-effect($to-variant, $css-glass-blur-md, true, true, false); + } + } @else if $trigger == 'active' { + &.glass-active, + &[data-glass-active="true"] { + @include glass-effect($to-variant, $css-glass-blur-md, true, true, false); + } + } +} + +// GLASS BORDER ENHANCEMENT MIXIN +// Adds subtle border highlights to enhance glass illusion +@mixin glass-border-enhance($style: 'subtle') { + position: relative; + + &::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + height: 1px; + background: $semantic-glass-border-highlight-top; + border-radius: inherit; + } + + &::after { + content: ''; + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 1px; + background: $semantic-glass-border-highlight-bottom; + border-radius: inherit; + } +} + +// RESPONSIVE GLASS MIXIN +// Adjusts glass intensity based on screen size +@mixin glass-responsive($mobile-variant: 'light', $desktop-variant: 'medium') { + @include glass-effect($mobile-variant); + + @media (min-width: $base-breakpoint-md) { + @include glass-effect($desktop-variant); + } +} + +// GLASS COMPONENT MIXIN +// Complete glass component styling with all enhancements +@mixin glass-component( + $variant: 'medium', + $border-radius: $semantic-glass-border-radius-md, + $padding: $semantic-spacing-component-md, + $enhance-borders: true, + $animate: true +) { + @include glass-effect($variant, $css-glass-blur-md, true, true, $animate); + + border-radius: $border-radius; + padding: $padding; + + @if $enhance-borders { + @include glass-border-enhance(); + } + + // Ensure content is readable on glass background + color: $semantic-color-text-primary; + + // Prevent content from interfering with glass effect + isolation: isolate; +} + +// UTILITY MIXIN FOR GLASS ANIMATIONS +@mixin glass-keyframes($name, $from-variant: 'opaque', $to-variant: 'medium') { + @keyframes #{$name} { + from { + @if $from-variant == 'opaque' { + background: rgb($css-glass-background-base); + backdrop-filter: blur(0); + } @else { + background: rgba($css-glass-background-base, var(--glass-opacity-#{$from-variant})); + backdrop-filter: blur($css-glass-blur-sm); + } + } + + to { + background: rgba($css-glass-background-base, var(--glass-opacity-#{$to-variant})); + backdrop-filter: blur($css-glass-blur-md); + } + } +} + +// GLASS DISABLED STATE MIXIN +@mixin glass-disabled() { + background: rgba($css-glass-background-base, calc($css-glass-opacity-light * 0.5)); + backdrop-filter: blur($css-glass-blur-xs); + opacity: 0.6; + cursor: not-allowed; + + &:hover { + transform: none; + } +} \ No newline at end of file diff --git a/projects/shared-ui/src/styles/semantic/glass/_glass-surfaces.scss b/projects/shared-ui/src/styles/semantic/glass/_glass-surfaces.scss new file mode 100644 index 0000000..e851f98 --- /dev/null +++ b/projects/shared-ui/src/styles/semantic/glass/_glass-surfaces.scss @@ -0,0 +1,130 @@ +// ========================================================================== +// GLASS SURFACE SEMANTIC TOKENS +// ========================================================================== +// Semantic tokens for glass morphism surface effects +// Uses CSS variables to support dynamic light/dark mode switching +// ========================================================================== +@use '../../base/glass' as *; +@use '../../base/css-variables' as *; + +// CORE GLASS SURFACE VARIANTS +// 5 opacity levels with CSS variable support for dynamic theming +$semantic-glass-surface-translucent: rgba($css-glass-background-base, $css-glass-opacity-translucent) !default; +$semantic-glass-surface-light: rgba($css-glass-background-base, $css-glass-opacity-light) !default; +$semantic-glass-surface-medium: rgba($css-glass-background-base, $css-glass-opacity-medium) !default; +$semantic-glass-surface-heavy: rgba($css-glass-background-base, $css-glass-opacity-heavy) !default; +$semantic-glass-surface-frosted: rgba($css-glass-background-base, $css-glass-opacity-frosted) !default; + +// COMPONENT-SPECIFIC GLASS SURFACES +// Common UI component glass effects using semantic variants +$semantic-glass-card: $semantic-glass-surface-medium !default; +$semantic-glass-card-elevated: $semantic-glass-surface-heavy !default; +$semantic-glass-card-subtle: $semantic-glass-surface-light !default; + +$semantic-glass-modal: $semantic-glass-surface-heavy !default; +$semantic-glass-modal-backdrop: $semantic-glass-surface-translucent !default; + +$semantic-glass-dropdown: $semantic-glass-surface-frosted !default; +$semantic-glass-dropdown-item: $semantic-glass-surface-light !default; + +$semantic-glass-tooltip: $semantic-glass-surface-light !default; +$semantic-glass-popover: $semantic-glass-surface-medium !default; + +$semantic-glass-navbar: $semantic-glass-surface-frosted !default; +$semantic-glass-sidebar: $semantic-glass-surface-medium !default; + +$semantic-glass-notification: $semantic-glass-surface-heavy !default; +$semantic-glass-alert: $semantic-glass-surface-medium !default; + +$semantic-glass-overlay: $semantic-glass-surface-translucent !default; +$semantic-glass-overlay-heavy: $semantic-glass-surface-light !default; + +// INTERACTIVE GLASS SURFACES +// Glass effects for interactive elements +$semantic-glass-button: $semantic-glass-surface-light !default; +$semantic-glass-button-hover: $semantic-glass-surface-medium !default; +$semantic-glass-button-active: $semantic-glass-surface-heavy !default; + +$semantic-glass-input: $semantic-glass-surface-translucent !default; +$semantic-glass-input-focus: $semantic-glass-surface-light !default; + +// LAYOUT GLASS SURFACES +// Glass effects for layout components +$semantic-glass-header: $semantic-glass-surface-frosted !default; +$semantic-glass-footer: $semantic-glass-surface-medium !default; +$semantic-glass-panel: $semantic-glass-surface-light !default; +$semantic-glass-panel-elevated: $semantic-glass-surface-medium !default; + +// STATUS-BASED GLASS SURFACES +// Glass effects with status/state implications +$semantic-glass-success: $semantic-glass-surface-light !default; +$semantic-glass-warning: $semantic-glass-surface-medium !default; +$semantic-glass-error: $semantic-glass-surface-heavy !default; +$semantic-glass-info: $semantic-glass-surface-light !default; + +// GLASS SURFACE MAP +// Easy access to all glass surface variants +$semantic-glass-surfaces: ( + translucent: $semantic-glass-surface-translucent, + light: $semantic-glass-surface-light, + medium: $semantic-glass-surface-medium, + heavy: $semantic-glass-surface-heavy, + frosted: $semantic-glass-surface-frosted, + + card: $semantic-glass-card, + modal: $semantic-glass-modal, + dropdown: $semantic-glass-dropdown, + tooltip: $semantic-glass-tooltip, + navbar: $semantic-glass-navbar, + button: $semantic-glass-button, + input: $semantic-glass-input, + overlay: $semantic-glass-overlay, + panel: $semantic-glass-panel +) !default; + +// INDIVIDUAL SEMANTIC GLASS TOKENS - Direct access to all base glass values + +// GLASS BLUR INTENSITIES +$semantic-glass-blur-none: $base-glass-blur-none !default; +$semantic-glass-blur-xs: $base-glass-blur-xs !default; +$semantic-glass-blur-sm: $base-glass-blur-sm !default; +$semantic-glass-blur-md: $base-glass-blur-md !default; +$semantic-glass-blur-lg: $base-glass-blur-lg !default; +$semantic-glass-blur-xl: $base-glass-blur-xl !default; +$semantic-glass-blur-2xl: $base-glass-blur-2xl !default; +$semantic-glass-blur-3xl: $base-glass-blur-3xl !default; + +// GLASS OPACITY VARIANTS - LIGHT MODE +$semantic-glass-opacity-translucent-light: $base-glass-opacity-translucent-light !default; +$semantic-glass-opacity-light-light: $base-glass-opacity-light-light !default; +$semantic-glass-opacity-medium-light: $base-glass-opacity-medium-light !default; +$semantic-glass-opacity-heavy-light: $base-glass-opacity-heavy-light !default; +$semantic-glass-opacity-frosted-light: $base-glass-opacity-frosted-light !default; + +// GLASS OPACITY VARIANTS - DARK MODE +$semantic-glass-opacity-translucent-dark: $base-glass-opacity-translucent-dark !default; +$semantic-glass-opacity-light-dark: $base-glass-opacity-light-dark !default; +$semantic-glass-opacity-medium-dark: $base-glass-opacity-medium-dark !default; +$semantic-glass-opacity-heavy-dark: $base-glass-opacity-heavy-dark !default; +$semantic-glass-opacity-frosted-dark: $base-glass-opacity-frosted-dark !default; + +// GLASS BACKGROUND COLORS +$semantic-glass-bg-light: $base-glass-bg-light !default; +$semantic-glass-bg-dark: $base-glass-bg-dark !default; + +// GLASS BORDER COLORS +$semantic-glass-border-light: $base-glass-border-light !default; +$semantic-glass-border-dark: $base-glass-border-dark !default; + +// GLASS SHADOW COLORS +$semantic-glass-shadow-light: $base-glass-shadow-light !default; +$semantic-glass-shadow-dark: $base-glass-shadow-dark !default; + +// GLASS ANIMATION DURATIONS +$semantic-glass-duration-fast: $base-glass-duration-fast !default; +$semantic-glass-duration-normal: $base-glass-duration-normal !default; +$semantic-glass-duration-slow: $base-glass-duration-slow !default; + +// GLASS ANIMATION EASINGS +$semantic-glass-easing-smooth: $base-glass-easing-smooth !default; +$semantic-glass-easing-bounce: $base-glass-easing-bounce !default; \ No newline at end of file diff --git a/projects/shared-ui/src/styles/semantic/glass/_glass-utilities.scss b/projects/shared-ui/src/styles/semantic/glass/_glass-utilities.scss new file mode 100644 index 0000000..880ce43 --- /dev/null +++ b/projects/shared-ui/src/styles/semantic/glass/_glass-utilities.scss @@ -0,0 +1,236 @@ +// ========================================================================== +// GLASS UTILITY CLASSES +// ========================================================================== +// Ready-to-use utility classes for rapid prototyping with glass effects +// Can be applied directly in HTML or used as @extend placeholders +// ========================================================================== + +@use '../../base/css-variables' as *; +@use '../../base/motion' as *; +@use '../../base/spacing' as *; +@use '../../base/glass' as *; +@use '../../base/glass' as *; +@use '../../base/breakpoints' as *; +@use '../../base/z-index' as *; + +@use '../spacing' as *; +@use '../colors' as *; + +// CORE GLASS UTILITY CLASSES +// Basic glass effect classes for each variant +.glass-translucent { + @include glass-translucent(); +} + +.glass-light { + @include glass-light(); +} + +.glass-medium { + @include glass-medium(); +} + +.glass-heavy { + @include glass-heavy(); +} + +.glass-frosted { + @include glass-frosted(); +} + +// ANIMATED GLASS UTILITIES +// Glass effects with built-in animations +.glass-translucent-animated { + @include glass-translucent(true); +} + +.glass-light-animated { + @include glass-light(true); +} + +.glass-medium-animated { + @include glass-medium(true); +} + +.glass-heavy-animated { + @include glass-heavy(true); +} + +.glass-frosted-animated { + @include glass-frosted(true); +} + +// TRANSITION UTILITIES +// Classes for animating to glass effects on interaction +.glass-on-hover { + @include glass-transition('opaque', 'medium', var(--glass-duration-normal), 'hover'); +} + +.glass-on-focus { + @include glass-transition('opaque', 'light', var(--glass-duration-normal), 'focus'); +} + +.glass-on-active { + @include glass-transition('opaque', 'heavy', var(--glass-duration-normal), 'active'); +} + +// SPECIFIC TRANSITION VARIANTS +@each $variant in (translucent, light, medium, heavy, frosted) { + .glass-hover-to-#{$variant} { + @include glass-transition('opaque', $variant, var(--glass-duration-normal), 'hover'); + } + + .glass-focus-to-#{$variant} { + @include glass-transition('opaque', $variant, var(--glass-duration-normal), 'focus'); + } + + .glass-active-to-#{$variant} { + @include glass-transition('opaque', $variant, var(--glass-duration-normal), 'active'); + } +} + +// COMPONENT-SPECIFIC UTILITIES +// Pre-configured glass effects for common components +.glass-card { + @include glass-component('medium', $semantic-glass-border-radius-lg); +} + +.glass-modal { + @include glass-component('heavy', $semantic-glass-border-radius-xl); +} + +.glass-dropdown { + @include glass-component('frosted', $semantic-glass-border-radius-md, $semantic-spacing-component-sm); +} + +.glass-tooltip { + @include glass-component('light', $semantic-glass-border-radius-sm, $semantic-spacing-component-xs); +} + +.glass-navbar { + @include glass-component('frosted', 0, $semantic-spacing-component-md, false); +} + +.glass-button { + @include glass-component('light', $semantic-glass-border-radius-md, $semantic-spacing-component-sm); + @include glass-transition('light', 'medium', var(--glass-duration-fast), 'hover'); + + &:active { + @include glass-effect('heavy', $css-glass-blur-lg, true, true, false); + transform: translateY(0); + } +} + +// BLUR-ONLY UTILITIES +// For cases where you only want the blur effect without the glass background +.blur-xs { + backdrop-filter: blur($css-glass-blur-xs); + -webkit-backdrop-filter: blur($css-glass-blur-xs); +} + +.blur-sm { + backdrop-filter: blur($css-glass-blur-sm); + -webkit-backdrop-filter: blur($css-glass-blur-sm); +} + +.blur-md { + backdrop-filter: blur($css-glass-blur-md); + -webkit-backdrop-filter: blur($css-glass-blur-md); +} + +.blur-lg { + backdrop-filter: blur($css-glass-blur-lg); + -webkit-backdrop-filter: blur($css-glass-blur-lg); +} + +.blur-xl { + backdrop-filter: blur($css-glass-blur-xl); + -webkit-backdrop-filter: blur($css-glass-blur-xl); +} + +// GLASS STATE MODIFIERS +// Utility classes for different states +.glass-disabled { + @include glass-disabled(); +} + +.glass-interactive { + cursor: pointer; + + &:hover { + transform: translateY(-2px); + } + + &:active { + transform: translateY(0); + } +} + +// RESPONSIVE GLASS UTILITIES +.glass-responsive { + @include glass-responsive('light', 'medium'); +} + +.glass-responsive-heavy { + @include glass-responsive('medium', 'heavy'); +} + +// GLASS OVERLAY UTILITIES +.glass-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: $base-z-index-overlay; + @include glass-effect('translucent', $css-glass-blur-lg); +} + +.glass-modal-backdrop { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: $base-z-index-modal-backdrop; + background: rgba($css-glass-background-base, calc($css-glass-opacity-translucent * 0.5)); + backdrop-filter: blur($css-glass-blur-md); + -webkit-backdrop-filter: blur($css-glass-blur-md); +} + +// GLASS ANIMATION CLASSES +// For JavaScript-triggered animations +.glass-fade-in { + animation: glassEffectFadeIn var(--glass-duration-normal) $base-glass-easing-smooth forwards; +} + +.glass-fade-out { + animation: glassEffectFadeOut var(--glass-duration-normal) $base-glass-easing-smooth forwards; +} + +// KEYFRAME ANIMATIONS +@keyframes glassEffectFadeIn { + from { + background: transparent; + backdrop-filter: blur(0); + opacity: 0; + } + to { + background: rgba($css-glass-background-base, $css-glass-opacity-medium); + backdrop-filter: blur($css-glass-blur-md); + opacity: 1; + } +} + +@keyframes glassEffectFadeOut { + from { + background: rgba($css-glass-background-base, $css-glass-opacity-medium); + backdrop-filter: blur($css-glass-blur-md); + opacity: 1; + } + to { + background: transparent; + backdrop-filter: blur(0); + opacity: 0; + } +} \ No newline at end of file diff --git a/projects/shared-ui/src/styles/semantic/glass/_index.scss b/projects/shared-ui/src/styles/semantic/glass/_index.scss new file mode 100644 index 0000000..a5aafff --- /dev/null +++ b/projects/shared-ui/src/styles/semantic/glass/_index.scss @@ -0,0 +1,12 @@ +// ========================================================================== +// GLASS EFFECT SEMANTIC TOKENS +// ========================================================================== +// Complete glass morphism design system with semantic tokens, mixins, and utilities +// Supports light/dark mode theming and responsive behavior +// ========================================================================== + +// Import all glass effect modules +@import 'glass-surfaces'; +@import 'glass-borders'; +@import 'glass-mixins'; +@import 'glass-utilities'; \ No newline at end of file diff --git a/projects/shared-ui/src/styles/semantic/index.scss b/projects/shared-ui/src/styles/semantic/index.scss new file mode 100644 index 0000000..97ab0ae --- /dev/null +++ b/projects/shared-ui/src/styles/semantic/index.scss @@ -0,0 +1,27 @@ +// ========================================================================== +// SEMANTIC TOKENS ENTRY POINT +// ========================================================================== +// Semantic tokens built on top of base design tokens +// Forward all semantic token categories for consumption by other projects +// ========================================================================== + +// Forward base tokens first (semantic tokens depend on base tokens) +@forward '../base'; + +// Forward semantic token categories +@forward 'colors/index'; +@forward 'typography/index'; +@forward 'spacing/index'; +@forward 'motion/index'; +//@forward 'elevation/index'; +//@forward 'layout/index'; +//@forward 'breakpoints/index'; + +// Forward additional semantic categories +@forward 'borders/index'; +@forward 'shadows/index'; +@forward 'sizing/index'; +@forward 'glass/index'; +@forward 'z-index/index'; +@forward 'opacity/index'; + diff --git a/projects/shared-ui/src/styles/semantic/motion/_index.scss b/projects/shared-ui/src/styles/semantic/motion/_index.scss new file mode 100644 index 0000000..5f5463b --- /dev/null +++ b/projects/shared-ui/src/styles/semantic/motion/_index.scss @@ -0,0 +1,10 @@ +// ========================================================================== +// SEMANTIC MOTION INDEX +// ========================================================================== +// Contextual motion system for animations and interactions +// ========================================================================== + +// Note: base tokens imported at semantic/index level + +// Semantic motion mappings +@import 'semantic-motion'; \ No newline at end of file diff --git a/projects/shared-ui/src/styles/semantic/motion/_semantic-motion.scss b/projects/shared-ui/src/styles/semantic/motion/_semantic-motion.scss new file mode 100644 index 0000000..297a413 --- /dev/null +++ b/projects/shared-ui/src/styles/semantic/motion/_semantic-motion.scss @@ -0,0 +1,287 @@ +// ========================================================================== +// SEMANTIC MOTION +// ========================================================================== +// Meaningful motion tokens for animations and interactions +// Maps base motion values to contextual usage patterns +// ========================================================================== +@use '../../base/motion' as *; + +// DURATION TOKENS - Semantic timing values +$semantic-duration-instant: $base-motion-duration-instant !default; // 50ms - Instant feedback +$semantic-duration-fast: $base-motion-duration-fast !default; // 150ms - Quick interactions +$semantic-duration-short: $base-motion-duration-normal !default; // 300ms - Standard transitions +$semantic-duration-medium: $base-motion-duration-slow !default; // 500ms - Moderate animations +$semantic-duration-long: $base-motion-duration-slower !default; // 700ms - Slower transitions + +// EASING TOKENS - Semantic timing functions +$semantic-easing-standard: $base-motion-easing-ease-in-out !default; // Standard easing curve +$semantic-easing-decelerate: $base-motion-easing-ease-out !default; // Deceleration curve +$semantic-easing-accelerate: $base-motion-easing-ease-in !default; // Acceleration curve +$semantic-easing-spring: $base-motion-easing-spring !default; // Spring-like easing + +// INTERACTION ANIMATIONS - User interface interactions +$semantic-motion-button-hover: ( + duration: $base-motion-duration-fast, + timing: $base-motion-easing-ease-out, + property: $base-motion-transition-property-colors, + transform: $base-motion-hover-transform-scale-sm, +) !default; + +$semantic-motion-button-press: ( + duration: $base-motion-duration-instant, + timing: $base-motion-easing-ease-in, + property: $base-motion-transition-property-transform, + transform: scale(0.98), +) !default; + +$semantic-motion-link-hover: ( + duration: $base-motion-duration-fast, + timing: $base-motion-easing-ease-out, + property: $base-motion-transition-property-colors, +) !default; + +// FORM ANIMATIONS - Input and form interactions +$semantic-motion-input-focus: ( + duration: $base-motion-duration-normal, + timing: $base-motion-easing-ease-out, + property: border-color box-shadow, +) !default; + +$semantic-motion-input-error: ( + duration: $base-motion-duration-fast, + timing: $base-motion-easing-spring, + property: border-color, + transform: translateX(-2px), +) !default; + +$semantic-motion-checkbox-check: ( + duration: $base-motion-duration-normal, + timing: $base-motion-easing-spring, + property: $base-motion-transition-property-transform, +) !default; + +// CARD ANIMATIONS - Card and container interactions +$semantic-motion-card-hover: ( + duration: $base-motion-duration-normal, + timing: $base-motion-easing-ease-out, + property: box-shadow transform, + transform: $base-motion-hover-transform-lift-sm, +) !default; + +$semantic-motion-card-press: ( + duration: $base-motion-duration-fast, + timing: $base-motion-easing-ease-in, + property: $base-motion-transition-property-transform, + transform: $base-motion-hover-transform-scale-sm, +) !default; + +// NAVIGATION ANIMATIONS - Menu and navigation +$semantic-motion-nav-item-hover: ( + duration: $base-motion-duration-fast, + timing: $base-motion-easing-ease-out, + property: $base-motion-transition-property-colors, +) !default; + +$semantic-motion-dropdown-enter: ( + duration: $base-motion-duration-normal, + timing: $base-motion-easing-ease-out, + property: opacity transform, + transform: translateY(-8px), +) !default; + +$semantic-motion-dropdown-exit: ( + duration: $base-motion-duration-fast, + timing: $base-motion-easing-ease-in, + property: opacity transform, +) !default; + +// MODAL AND OVERLAY ANIMATIONS +$semantic-motion-modal-enter: ( + duration: $base-motion-duration-normal, + timing: $base-motion-easing-ease-out, + property: opacity transform, + transform: scale(0.95) translateY(-20px), +) !default; + +$semantic-motion-modal-exit: ( + duration: $base-motion-duration-fast, + timing: $base-motion-easing-ease-in, + property: opacity transform, +) !default; + +$semantic-motion-backdrop-enter: ( + duration: $base-motion-duration-normal, + timing: $base-motion-easing-ease-out, + property: $base-motion-transition-property-opacity, +) !default; + +$semantic-motion-backdrop-exit: ( + duration: $base-motion-duration-fast, + timing: $base-motion-easing-ease-in, + property: $base-motion-transition-property-opacity, +) !default; + +// TOAST AND NOTIFICATION ANIMATIONS +$semantic-motion-toast-enter: ( + duration: $base-motion-duration-normal, + timing: $base-motion-easing-spring, + property: opacity transform, + transform: translateX(100%), +) !default; + +$semantic-motion-toast-exit: ( + duration: $base-motion-duration-normal, + timing: $base-motion-easing-ease-in, + property: opacity transform, + transform: translateX(100%), +) !default; + +// LOADING ANIMATIONS +$semantic-motion-spinner: ( + duration: $base-motion-duration-slowest, + timing: $base-motion-easing-linear, + property: $base-motion-transition-property-transform, + iteration-count: infinite, +) !default; + +$semantic-motion-pulse: ( + duration: $base-motion-duration-slower, + timing: $base-motion-easing-ease-in-out, + property: $base-motion-transition-property-opacity, + iteration-count: infinite, + direction: alternate, +) !default; + +$semantic-motion-skeleton: ( + duration: 1500ms, + timing: $base-motion-easing-ease-in-out, + property: background-position, + iteration-count: infinite, +) !default; + +// PAGE TRANSITIONS +$semantic-motion-page-enter: ( + duration: $base-motion-duration-slow, + timing: $base-motion-easing-ease-out, + property: opacity transform, + transform: translateY(20px), +) !default; + +$semantic-motion-page-exit: ( + duration: $base-motion-duration-normal, + timing: $base-motion-easing-ease-in, + property: opacity transform, +) !default; + +// UTILITY MOTIONS - Common animation patterns +$semantic-motion-fade-in: ( + duration: $base-motion-duration-normal, + timing: $base-motion-easing-ease-out, + property: $base-motion-transition-property-opacity, +) !default; + +$semantic-motion-fade-out: ( + duration: $base-motion-duration-fast, + timing: $base-motion-easing-ease-in, + property: $base-motion-transition-property-opacity, +) !default; + +$semantic-motion-slide-up: ( + duration: $base-motion-duration-normal, + timing: $base-motion-easing-ease-out, + property: opacity transform, + transform: translateY(16px), +) !default; + +$semantic-motion-slide-down: ( + duration: $base-motion-duration-normal, + timing: $base-motion-easing-ease-out, + property: opacity transform, + transform: translateY(-16px), +) !default; + +// ACCESSIBILITY MOTIONS - Respecting user preferences +$semantic-motion-reduced: ( + duration: $base-motion-duration-instant, + timing: $base-motion-easing-linear, + property: $base-motion-transition-property-none, +) !default; + +$semantic-motion-standard: ( + duration: $base-motion-duration-normal, + timing: $base-motion-easing-ease-out, + property: $base-motion-transition-property-all, +) !default; + +// INDIVIDUAL SEMANTIC MOTION DURATIONS - Direct access to duration values +$semantic-motion-duration-instant: $base-motion-duration-instant !default; +$semantic-motion-duration-fast: $base-motion-duration-fast !default; +$semantic-motion-duration-normal: $base-motion-duration-normal !default; +$semantic-motion-duration-slow: $base-motion-duration-slow !default; +$semantic-motion-duration-slower: $base-motion-duration-slower !default; +$semantic-motion-duration-slowest: $base-motion-duration-slowest !default; +$semantic-motion-duration-ultra-slow: $base-motion-duration-ultra-slow !default; + +// INDIVIDUAL SEMANTIC MOTION EASING - Direct access to easing functions +$semantic-motion-easing-linear: $base-motion-easing-linear !default; +$semantic-motion-easing-ease: $base-motion-easing-ease !default; +$semantic-motion-easing-ease-in: $base-motion-easing-ease-in !default; +$semantic-motion-easing-ease-out: $base-motion-easing-ease-out !default; +$semantic-motion-easing-ease-in-out: $base-motion-easing-ease-in-out !default; +$semantic-motion-easing-spring: $base-motion-easing-spring !default; +$semantic-motion-easing-bounce: $base-motion-easing-bounce !default; +$semantic-motion-easing-sharp: $base-motion-easing-sharp !default; +$semantic-motion-easing-elastic: $base-motion-easing-elastic !default; + +// INDIVIDUAL SEMANTIC TRANSITION PROPERTIES - Direct access to transition properties +$semantic-motion-transition-property-none: $base-motion-transition-property-none !default; +$semantic-motion-transition-property-all: $base-motion-transition-property-all !default; +$semantic-motion-transition-property-colors: $base-motion-transition-property-colors !default; +$semantic-motion-transition-property-opacity: $base-motion-transition-property-opacity !default; +$semantic-motion-transition-property-shadow: $base-motion-transition-property-shadow !default; +$semantic-motion-transition-property-transform: $base-motion-transition-property-transform !default; +$semantic-motion-transition-property-spacing: $base-motion-transition-property-spacing !default; +$semantic-motion-transition-property-size: $base-motion-transition-property-size !default; + +// INDIVIDUAL SEMANTIC TRANSITION DURATIONS - Direct access to transition duration values +$semantic-motion-transition-duration-0: $base-motion-transition-duration-0 !default; +$semantic-motion-transition-duration-75: $base-motion-transition-duration-75 !default; +$semantic-motion-transition-duration-100: $base-motion-transition-duration-100 !default; +$semantic-motion-transition-duration-150: $base-motion-transition-duration-150 !default; +$semantic-motion-transition-duration-200: $base-motion-transition-duration-200 !default; +$semantic-motion-transition-duration-300: $base-motion-transition-duration-300 !default; +$semantic-motion-transition-duration-500: $base-motion-transition-duration-500 !default; +$semantic-motion-transition-duration-700: $base-motion-transition-duration-700 !default; +$semantic-motion-transition-duration-1000: $base-motion-transition-duration-1000 !default; +$semantic-motion-transition-duration-1500: $base-motion-transition-duration-1500 !default; +$semantic-motion-transition-duration-2000: $base-motion-transition-duration-2000 !default; + +// INDIVIDUAL SEMANTIC TRANSITION TIMING FUNCTIONS - Direct access to timing functions +$semantic-motion-transition-timing-linear: $base-motion-transition-timing-linear !default; +$semantic-motion-transition-timing-in: $base-motion-transition-timing-in !default; +$semantic-motion-transition-timing-out: $base-motion-transition-timing-out !default; +$semantic-motion-transition-timing-in-out: $base-motion-transition-timing-in-out !default; +$semantic-motion-transition-timing-spring: $base-motion-transition-timing-spring !default; +$semantic-motion-transition-timing-out-back: $base-motion-transition-timing-out-back !default; + +// INDIVIDUAL SEMANTIC TRANSITION DELAYS - Direct access to transition delay values +$semantic-motion-transition-delay-0: $base-motion-transition-delay-0 !default; +$semantic-motion-transition-delay-75: $base-motion-transition-delay-75 !default; +$semantic-motion-transition-delay-100: $base-motion-transition-delay-100 !default; +$semantic-motion-transition-delay-150: $base-motion-transition-delay-150 !default; +$semantic-motion-transition-delay-200: $base-motion-transition-delay-200 !default; +$semantic-motion-transition-delay-300: $base-motion-transition-delay-300 !default; +$semantic-motion-transition-delay-500: $base-motion-transition-delay-500 !default; +$semantic-motion-transition-delay-700: $base-motion-transition-delay-700 !default; +$semantic-motion-transition-delay-1000: $base-motion-transition-delay-1000 !default; + +// INDIVIDUAL SEMANTIC HOVER TRANSFORMS - Direct access to hover transform values +$semantic-motion-hover-transform-none: $base-motion-hover-transform-none !default; +$semantic-motion-hover-transform-scale-sm: $base-motion-hover-transform-scale-sm !default; +$semantic-motion-hover-transform-scale-md: $base-motion-hover-transform-scale-md !default; +$semantic-motion-hover-transform-scale-lg: $base-motion-hover-transform-scale-lg !default; +$semantic-motion-hover-transform-lift-sm: $base-motion-hover-transform-lift-sm !default; +$semantic-motion-hover-transform-lift-md: $base-motion-hover-transform-lift-md !default; +$semantic-motion-hover-transform-lift-lg: $base-motion-hover-transform-lift-lg !default; +$semantic-motion-hover-transform-scale-lift-sm: $base-motion-hover-transform-scale-lift-sm !default; +$semantic-motion-hover-transform-scale-lift-md: $base-motion-hover-transform-scale-lift-md !default; \ No newline at end of file diff --git a/projects/shared-ui/src/styles/semantic/opacity/_index.scss b/projects/shared-ui/src/styles/semantic/opacity/_index.scss new file mode 100644 index 0000000..a3ca3ad --- /dev/null +++ b/projects/shared-ui/src/styles/semantic/opacity/_index.scss @@ -0,0 +1,7 @@ +// ========================================================================== +// OPACITY INDEX +// ========================================================================== +// Main index file for semantic opacity tokens +// ========================================================================== + +@forward 'semantic-opacity'; \ No newline at end of file diff --git a/projects/shared-ui/src/styles/semantic/opacity/_semantic-opacity.scss b/projects/shared-ui/src/styles/semantic/opacity/_semantic-opacity.scss new file mode 100644 index 0000000..9f7132c --- /dev/null +++ b/projects/shared-ui/src/styles/semantic/opacity/_semantic-opacity.scss @@ -0,0 +1,80 @@ +// ========================================================================== +// SEMANTIC OPACITY +// ========================================================================== +// Meaningful opacity tokens for visibility and transparency effects +// Maps base opacity values to contextual usage patterns +// ========================================================================== +@use '../../base/opacity' as *; + +// VISIBILITY HIERARCHY - Progressive transparency levels +$semantic-opacity-invisible: $base-opacity-0 !default; // Completely transparent +$semantic-opacity-subtle: $base-opacity-5 !default; // Barely visible +$semantic-opacity-faint: $base-opacity-10 !default; // Very faint +$semantic-opacity-light: $base-opacity-20 !default; // Light transparency +$semantic-opacity-medium: $base-opacity-50 !default; // Half transparent +$semantic-opacity-heavy: $base-opacity-75 !default; // Mostly opaque +$semantic-opacity-opaque: $base-opacity-100 !default; // Fully opaque + +// INTERACTION STATES - Element state opacity +$semantic-opacity-disabled: $base-opacity-40 !default; // Disabled elements +$semantic-opacity-hover: $base-opacity-80 !default; // Hover state +$semantic-opacity-active: $base-opacity-90 !default; // Active/pressed state +$semantic-opacity-focus: $base-opacity-100 !default; // Focused elements + +// OVERLAY OPACITY - Background overlays and modals +$semantic-opacity-backdrop: $base-opacity-50 !default; // Modal backdrop +$semantic-opacity-scrim: $base-opacity-75 !default; // Dark overlay +$semantic-opacity-overlay-light: $base-opacity-10 !default; // Light overlay +$semantic-opacity-overlay-medium: $base-opacity-30 !default; // Medium overlay +$semantic-opacity-overlay-heavy: $base-opacity-60 !default; // Heavy overlay + +// TEXT OPACITY - Text visibility levels +$semantic-opacity-text-primary: $base-opacity-100 !default; // Primary text +$semantic-opacity-text-secondary: $base-opacity-70 !default; // Secondary text +$semantic-opacity-text-tertiary: $base-opacity-50 !default; // Tertiary text +$semantic-opacity-text-disabled: $base-opacity-30 !default; // Disabled text +$semantic-opacity-text-placeholder: $base-opacity-60 !default; // Placeholder text + +// BORDER OPACITY - Border visibility levels +$semantic-opacity-border-subtle: $base-opacity-10 !default; // Subtle borders +$semantic-opacity-border-normal: $base-opacity-20 !default; // Normal borders +$semantic-opacity-border-emphasis: $base-opacity-40 !default; // Emphasized borders +$semantic-opacity-border-strong: $base-opacity-60 !default; // Strong borders + +// SHADOW OPACITY - Shadow transparency levels +$semantic-opacity-shadow-subtle: $base-opacity-5 !default; // Subtle shadows +$semantic-opacity-shadow-normal: $base-opacity-10 !default; // Normal shadows +$semantic-opacity-shadow-emphasis: $base-opacity-25 !default; // Emphasized shadows +$semantic-opacity-shadow-strong: $base-opacity-40 !default; // Strong shadows + +// LOADING STATES - Loading animation opacity +$semantic-opacity-loading-min: $base-opacity-30 !default; // Loading animation min +$semantic-opacity-loading-max: $base-opacity-70 !default; // Loading animation max +$semantic-opacity-skeleton: $base-opacity-10 !default; // Skeleton loading + +// NOTIFICATION OPACITY - Alert and notification transparency +$semantic-opacity-toast: $base-opacity-95 !default; // Toast notifications +$semantic-opacity-alert: $base-opacity-90 !default; // Alert messages +$semantic-opacity-badge: $base-opacity-100 !default; // Badge elements + +// GLASS EFFECT OPACITY - Glassmorphism transparency levels +$semantic-opacity-glass-light: $base-opacity-10 !default; // Light glass effect +$semantic-opacity-glass-medium: $base-opacity-20 !default; // Medium glass effect +$semantic-opacity-glass-heavy: $base-opacity-30 !default; // Heavy glass effect + +// INDIVIDUAL SEMANTIC OPACITY TOKENS - Direct access to all base opacity values +$semantic-opacity-0: $base-opacity-0 !default; +$semantic-opacity-5: $base-opacity-5 !default; +$semantic-opacity-10: $base-opacity-10 !default; +$semantic-opacity-20: $base-opacity-20 !default; +$semantic-opacity-25: $base-opacity-25 !default; +$semantic-opacity-30: $base-opacity-30 !default; +$semantic-opacity-40: $base-opacity-40 !default; +$semantic-opacity-50: $base-opacity-50 !default; +$semantic-opacity-60: $base-opacity-60 !default; +$semantic-opacity-70: $base-opacity-70 !default; +$semantic-opacity-75: $base-opacity-75 !default; +$semantic-opacity-80: $base-opacity-80 !default; +$semantic-opacity-90: $base-opacity-90 !default; +$semantic-opacity-95: $base-opacity-95 !default; +$semantic-opacity-100: $base-opacity-100 !default; \ No newline at end of file diff --git a/projects/shared-ui/src/styles/semantic/shadows/_index.scss b/projects/shared-ui/src/styles/semantic/shadows/_index.scss new file mode 100644 index 0000000..21df0e1 --- /dev/null +++ b/projects/shared-ui/src/styles/semantic/shadows/_index.scss @@ -0,0 +1,14 @@ +// ========================================================================== +// SEMANTIC SHADOWS INDEX +// ========================================================================== +// Contextual shadow system for elevation and depth hierarchy +// ========================================================================== + +// Note: base tokens imported at semantic/index level + +// Import semantic colors for context-aware shadows +//@import '../colors/semantic-colors'; + +// Semantic shadow mappings +@import 'semantic-shadows'; + diff --git a/projects/shared-ui/src/styles/semantic/shadows/_semantic-shadows.scss b/projects/shared-ui/src/styles/semantic/shadows/_semantic-shadows.scss new file mode 100644 index 0000000..fe0e31e --- /dev/null +++ b/projects/shared-ui/src/styles/semantic/shadows/_semantic-shadows.scss @@ -0,0 +1,93 @@ +// ========================================================================== +// SEMANTIC SHADOWS +// ========================================================================== +// Meaningful shadow tokens for elevation and depth hierarchy +// Maps base shadow values to contextual usage patterns +// ========================================================================== +@use '../../base/shadows' as *; +@use '../colors' as *; // Add this line + + +// ELEVATION HIERARCHY - Material Design inspired depth levels +$semantic-shadow-elevation-0: $base-shadow-none !default; // No elevation - flat elements +$semantic-shadow-elevation-1: $base-shadow-xs !default; // Subtle lift - cards at rest +$semantic-shadow-elevation-2: $base-shadow-sm !default; // Light hover - interactive cards +$semantic-shadow-elevation-3: $base-shadow-md !default; // Medium lift - dropdowns, popovers +$semantic-shadow-elevation-4: $base-shadow-lg !default; // High lift - modals, dialogs +$semantic-shadow-elevation-5: $base-shadow-xl !default; // Maximum lift - tooltips, notifications + +// COMPONENT SHADOWS - Specific component contexts +$semantic-shadow-card-rest: $base-shadow-xs !default; // Cards in default state +$semantic-shadow-card-hover: $base-shadow-sm !default; // Cards on hover +$semantic-shadow-card-active: $base-shadow-md !default; // Cards when pressed/active +$semantic-shadow-card-featured: $base-shadow-lg !default; // Featured/highlighted cards + +// INTERACTIVE SHADOWS - User interaction feedback +$semantic-shadow-button-rest: $base-shadow-none !default; // Buttons in default state +$semantic-shadow-button-hover: $base-shadow-xs !default; // Buttons on hover +$semantic-shadow-button-active: $base-shadow-sm !default; // Buttons when pressed +$semantic-shadow-button-focus: 0 0 0 3px rgba($semantic-color-brand-primary, 0.12) !default; // Button focus ring +//$semantic-shadow-button-focus: 0 0 0 3px rgba($base-color-primary, 0.12) !default; // Button focus ring + +// OVERLAY SHADOWS - Floating elements +$semantic-shadow-dropdown: $base-shadow-md !default; // Dropdown menus +$semantic-shadow-popover: $base-shadow-lg !default; // Popovers and tooltips +$semantic-shadow-modal: $base-shadow-2xl !default; // Modal dialogs +$semantic-shadow-drawer: $base-shadow-xl !default; // Side drawers/panels + +// FORM SHADOWS - Input and form elements +$semantic-shadow-input-rest: $base-shadow-none !default; // Inputs in default state +$semantic-shadow-input-focus: 0 0 0 2px rgba($semantic-color-brand-primary, 0.12) !default; // Input focus ring +$semantic-shadow-input-error: 0 0 0 2px rgba($semantic-color-brand-primary, 0.12) !default; // Input error state +$semantic-shadow-input-inner: $base-shadow-inner !default; // Inset input shadow + +// NAVIGATION SHADOWS - Menu and navigation elements +$semantic-shadow-nav-primary: $base-shadow-sm !default; // Primary navigation bar +$semantic-shadow-nav-secondary: $base-shadow-xs !default; // Secondary navigation elements +$semantic-shadow-nav-submenu: $base-shadow-md !default; // Submenu dropdowns + +// SURFACE SHADOWS - Background and container elements +$semantic-shadow-surface-raised: $base-shadow-xs !default; // Slightly raised surfaces +$semantic-shadow-surface-floating: $base-shadow-sm !default; // Floating surfaces +$semantic-shadow-surface-overlay: $base-shadow-lg !default; // Overlay surfaces + +// UTILITY SHADOWS - Special purpose shadows +$semantic-shadow-text: 0 1px 2px rgba(0, 0, 0, 0.1) !default; // Text shadow for legibility +$semantic-shadow-image: $base-shadow-sm !default; // Image/media shadows +$semantic-shadow-separator: $base-shadow-inner !default; // Divider/separator shadows + +// AI-SPECIFIC SHADOWS - Special AI/tech themed shadows +$semantic-shadow-ai-element: $base-shadow-ai-glow !default; // AI/tech themed glow +$semantic-shadow-ai-active: $base-shadow-ai-pulse !default; // Active AI elements +$semantic-shadow-ai-subtle: $base-shadow-ai-soft !default; // Subtle AI theming + +// CONTEXT-AWARE SHADOWS - Theme and context sensitive +$semantic-shadow-success: 0 0 0 2px rgba($semantic-color-success, 0.12) !default; // Success state +$semantic-shadow-warning: 0 0 0 2px rgba($semantic-color-warning, 0.12) !default; // Warning state +$semantic-shadow-danger: 0 0 0 2px rgba($semantic-color-danger, 0.12) !default; // Danger state +$semantic-shadow-info: 0 0 0 2px rgba($semantic-color-info, 0.12) !default; // Info state + +// ========================================================================== +// BACKWARDS COMPATIBILITY ALIASES +// ========================================================================== +// Aliases for existing shadow patterns in the codebase + +$semantic-shadow-elevated: $base-shadow-md !default; // General elevated elements +$semantic-shadow-floating: $base-shadow-lg !default; // Floating elements + +// INDIVIDUAL SEMANTIC SHADOW TOKENS - Direct access to all base shadow values + +// STANDARD SHADOWS +$semantic-shadow-xs: $base-shadow-xs !default; +$semantic-shadow-sm: $base-shadow-sm !default; +$semantic-shadow-md: $base-shadow-md !default; +$semantic-shadow-lg: $base-shadow-lg !default; +$semantic-shadow-xl: $base-shadow-xl !default; +$semantic-shadow-2xl: $base-shadow-2xl !default; +$semantic-shadow-inner: $base-shadow-inner !default; +$semantic-shadow-none: $base-shadow-none !default; + +// AI SHADOWS +$semantic-shadow-ai-glow: $base-shadow-ai-glow !default; +$semantic-shadow-ai-pulse: $base-shadow-ai-pulse !default; +$semantic-shadow-ai-soft: $base-shadow-ai-soft !default; \ No newline at end of file diff --git a/projects/shared-ui/src/styles/semantic/sizing/_index.scss b/projects/shared-ui/src/styles/semantic/sizing/_index.scss new file mode 100644 index 0000000..2e3ce62 --- /dev/null +++ b/projects/shared-ui/src/styles/semantic/sizing/_index.scss @@ -0,0 +1,10 @@ +// ========================================================================== +// SEMANTIC SIZING INDEX +// ========================================================================== +// Contextual sizing system for components and layout elements +// ========================================================================== + +// Note: base tokens imported at semantic/index level + +// Semantic sizing mappings +@import 'semantic-sizing'; \ No newline at end of file diff --git a/projects/shared-ui/src/styles/semantic/sizing/_semantic-sizing.scss b/projects/shared-ui/src/styles/semantic/sizing/_semantic-sizing.scss new file mode 100644 index 0000000..ddc56d1 --- /dev/null +++ b/projects/shared-ui/src/styles/semantic/sizing/_semantic-sizing.scss @@ -0,0 +1,122 @@ +// ========================================================================== +// SEMANTIC SIZING +// ========================================================================== +// Meaningful sizing tokens for components and layout elements +// Maps base sizing values to contextual usage patterns +// ========================================================================== +@use '../../base/sizing' as *; + +// COMPONENT SIZING - UI element dimensions +$semantic-sizing-button-height-sm: $base-sizing-button-sm !default; // 32px - Small button height +$semantic-sizing-button-height-md: $base-sizing-button-md !default; // 40px - Medium button height +$semantic-sizing-button-height-lg: $base-sizing-button-lg !default; // 48px - Large button height + +$semantic-sizing-input-height-sm: $base-sizing-input-sm !default; // 32px - Small input height +$semantic-sizing-input-height-md: $base-sizing-input-md !default; // 40px - Medium input height +$semantic-sizing-input-height-lg: $base-sizing-input-lg !default; // 48px - Large input height + +// ICON SIZING - Icon dimensions for different contexts +$semantic-sizing-icon-inline: $base-sizing-icon-sm !default; // 16px - Inline with text +$semantic-sizing-icon-button: $base-sizing-icon-md !default; // 20px - In buttons +$semantic-sizing-icon-navigation: $base-sizing-icon-lg !default; // 24px - Navigation items +$semantic-sizing-icon-header: $base-sizing-icon-xl !default; // 32px - Page headers +$semantic-sizing-icon-hero: $base-sizing-icon-3xl !default; // 48px - Hero sections +$semantic-sizing-icon-feature: $base-sizing-icon-4xl !default; // 64px - Feature highlights + +// AVATAR SIZING - User avatar dimensions +$semantic-sizing-avatar-inline: $base-sizing-avatar-xs !default; // 24px - Inline avatars +$semantic-sizing-avatar-comment: $base-sizing-avatar-sm !default; // 32px - Comment avatars +$semantic-sizing-avatar-card: $base-sizing-avatar-md !default; // 40px - Card avatars +$semantic-sizing-avatar-nav: $base-sizing-avatar-lg !default; // 48px - Navigation avatars +$semantic-sizing-avatar-profile: $base-sizing-avatar-xl !default; // 64px - Profile avatars +$semantic-sizing-avatar-hero: $base-sizing-avatar-2xl !default; // 80px - Hero profile avatars + +// INTERACTION SIZING - Touch and click targets +$semantic-sizing-touch-minimum: $base-sizing-touch-minimum !default; // 44px - Minimum touch target +$semantic-sizing-touch-comfortable: $base-sizing-touch-comfortable !default; // 48px - Comfortable touch +$semantic-sizing-touch-spacious: $base-sizing-touch-spacious !default; // 56px - Spacious touch + +$semantic-sizing-clickable-minimum: $base-sizing-interaction-min-clickable !default; // 32px - Minimum clickable + +// LAYOUT SIZING - Container and layout dimensions +$semantic-sizing-sidebar-collapsed: $base-sizing-width-16 !default; // 4rem - Collapsed sidebar +$semantic-sizing-sidebar-expanded: $base-sizing-width-64 !default; // 16rem - Expanded sidebar +$semantic-sizing-sidebar-wide: $base-sizing-width-80 !default; // 20rem - Wide sidebar + +$semantic-sizing-navbar-height: $base-sizing-height-16 !default; // 4rem - Navigation bar height +$semantic-sizing-header-height: $base-sizing-height-20 !default; // 5rem - Page header height +$semantic-sizing-footer-height: $base-sizing-height-24 !default; // 6rem - Footer height + +// CONTENT SIZING - Text and content areas +$semantic-sizing-content-narrow: $base-sizing-max-width-2xl !default; // 42rem - Narrow content +$semantic-sizing-content-medium: $base-sizing-max-width-4xl !default; // 56rem - Medium content +$semantic-sizing-content-wide: $base-sizing-max-width-6xl !default; // 72rem - Wide content +$semantic-sizing-content-full: $base-sizing-max-width-full !default; // 100% - Full width content + +$semantic-sizing-prose-width: $base-sizing-max-width-prose !default; // 65ch - Optimal reading width + +// CARD SIZING - Card and panel dimensions +$semantic-sizing-card-width-sm: $base-sizing-width-64 !default; // 16rem - Small cards +$semantic-sizing-card-width-md: $base-sizing-width-80 !default; // 20rem - Medium cards +$semantic-sizing-card-width-lg: $base-sizing-width-96 !default; // 24rem - Large cards + +$semantic-sizing-card-height-sm: $base-sizing-height-32 !default; // 8rem - Small card height +$semantic-sizing-card-height-md: $base-sizing-height-48 !default; // 12rem - Medium card height +$semantic-sizing-card-height-lg: $base-sizing-height-64 !default; // 16rem - Large card height + +// MODAL SIZING - Dialog and modal dimensions +$semantic-sizing-modal-width-sm: $base-sizing-max-width-md !default; // 28rem - Small modals +$semantic-sizing-modal-width-md: $base-sizing-max-width-lg !default; // 32rem - Medium modals +$semantic-sizing-modal-width-lg: $base-sizing-max-width-2xl !default; // 42rem - Large modals +$semantic-sizing-modal-width-xl: $base-sizing-max-width-4xl !default; // 56rem - Extra large modals + +$semantic-sizing-modal-height-max: 80vh !default; // Maximum modal height + +// BREAKPOINT SIZING - Responsive design breakpoints +$semantic-sizing-breakpoint-mobile: $base-sizing-max-width-screen-sm !default; // 640px +$semantic-sizing-breakpoint-tablet: $base-sizing-max-width-screen-md !default; // 768px +$semantic-sizing-breakpoint-desktop: $base-sizing-max-width-screen-lg !default; // 1024px +$semantic-sizing-breakpoint-wide: $base-sizing-max-width-screen-xl !default; // 1280px +$semantic-sizing-breakpoint-ultra: $base-sizing-max-width-screen-2xl !default; // 1536px + +// FORM SIZING - Form element dimensions +$semantic-sizing-form-field-width-sm: $base-sizing-width-32 !default; // 8rem - Small form fields +$semantic-sizing-form-field-width-md: $base-sizing-width-48 !default; // 12rem - Medium form fields +$semantic-sizing-form-field-width-lg: $base-sizing-width-64 !default; // 16rem - Large form fields +$semantic-sizing-form-field-width-full: $base-sizing-width-full !default; // 100% - Full width fields + +// DIVIDER SIZING - Line and separator dimensions +$semantic-sizing-divider-thin: $base-sizing-line-1 !default; // 1px - Thin dividers +$semantic-sizing-divider-medium: $base-sizing-line-2 !default; // 2px - Medium dividers +$semantic-sizing-divider-thick: $base-sizing-line-4 !default; // 4px - Thick dividers +$semantic-sizing-divider-heavy: $base-sizing-line-8 !default; // 8px - Heavy dividers + +// UTILITY SIZING - Common sizing patterns +$semantic-sizing-full-viewport-width: 100vw !default; // Full viewport width +$semantic-sizing-full-viewport-height: 100vh !default; // Full viewport height +$semantic-sizing-half-viewport-height: 50vh !default; // Half viewport height + +$semantic-sizing-container-padding: $base-sizing-width-4 !default; // 1rem - Container padding +$semantic-sizing-container-padding-lg: $base-sizing-width-6 !default; // 1.5rem - Large container padding + +// APPBAR SIZING - Application bar height variants +$semantic-sizing-appbar-compact: $base-sizing-height-12 !default; // 3rem/48px - Compact appbar +$semantic-sizing-appbar-standard: $base-sizing-height-16 !default; // 4rem/64px - Standard appbar +$semantic-sizing-appbar-large: $base-sizing-height-20 !default; // 5rem/80px - Large appbar +$semantic-sizing-appbar-prominent: $base-sizing-height-24 !default; // 6rem/96px - Prominent appbar + +$semantic-sizing-touch-target: $base-sizing-touch-comfortable !default; // 48px - Touch target size + +// LAYER/Z-INDEX TOKENS - Stacking order hierarchy +$semantic-layer-base: 0 !default; // Base layer for content +$semantic-layer-dropdown: 1000 !default; // Dropdowns and menus +$semantic-layer-overlay: 2000 !default; // Overlays and backdrops +$semantic-layer-modal: 3000 !default; // Modal dialogs +$semantic-layer-tooltip: 4000 !default; // Tooltips and hints +$semantic-layer-appbar: 100 !default; // App bars and navigation +$semantic-layer-sidebar: 50 !default; // Side navigation +$semantic-layer-banner: 200 !default; // Banners and alerts + +// AI-SPECIFIC SIZING - Special AI/tech themed sizes +$semantic-sizing-ai-indicator: $base-sizing-ai-indicator !default; // 20px - AI indicators +$semantic-sizing-ai-glow: $base-sizing-ai-glow !default; // 40px - AI glow effects \ No newline at end of file diff --git a/projects/shared-ui/src/styles/semantic/spacing/_index.scss b/projects/shared-ui/src/styles/semantic/spacing/_index.scss new file mode 100644 index 0000000..65538b8 --- /dev/null +++ b/projects/shared-ui/src/styles/semantic/spacing/_index.scss @@ -0,0 +1,10 @@ +// ========================================================================== +// SEMANTIC SPACING INDEX +// ========================================================================== +// Contextual spacing system for components and layouts +// ========================================================================== + +// Note: base tokens imported at semantic/index level + +// Semantic spacing mappings +@import 'semantic-spacing'; \ No newline at end of file diff --git a/projects/shared-ui/src/styles/semantic/spacing/_semantic-spacing.scss b/projects/shared-ui/src/styles/semantic/spacing/_semantic-spacing.scss new file mode 100644 index 0000000..ab53395 --- /dev/null +++ b/projects/shared-ui/src/styles/semantic/spacing/_semantic-spacing.scss @@ -0,0 +1,157 @@ +// ========================================================================== +// SEMANTIC SPACING +// ========================================================================== +// Meaningful spacing tokens for layout and component design +// Maps base spacing values to contextual usage patterns +// ========================================================================== +@use '../../base/spacing' as *; + +// COMPONENT SPACING - Internal component spacing +$semantic-spacing-component-xs: $base-spacing-1 !default; // 0.25rem - tight spacing +$semantic-spacing-component-sm: $base-spacing-2 !default; // 0.5rem - small spacing +$semantic-spacing-component-md: $base-spacing-3 !default; // 0.75rem - medium spacing +$semantic-spacing-component-lg: $base-spacing-4 !default; // 1rem - large spacing +$semantic-spacing-component-xl: $base-spacing-6 !default; // 1.5rem - extra large spacing + +$semantic-spacing-component-padding-xs: $base-spacing-1 !default; // 0.25rem - tight padding +$semantic-spacing-component-padding-sm: $base-spacing-2 !default; // 0.5rem - small padding +$semantic-spacing-component-padding-md: $base-spacing-3 !default; // 0.75rem - medium padding +$semantic-spacing-component-padding-lg: $base-spacing-4 !default; // 1rem - large padding +$semantic-spacing-component-padding-xl: $base-spacing-6 !default; // 1.5rem - extra large padding + +// LAYOUT SPACING - Between major layout elements +$semantic-spacing-layout-section-xs: $base-spacing-8 !default; // 2rem - small section gap +$semantic-spacing-layout-section-sm: $base-spacing-12 !default; // 3rem - medium section gap +$semantic-spacing-layout-section-md: $base-spacing-16 !default; // 4rem - large section gap +$semantic-spacing-layout-section-lg: $base-spacing-20 !default; // 5rem - extra large section gap +$semantic-spacing-layout-section-xl: $base-spacing-24 !default; // 6rem - huge section gap + +// CONTENT SPACING - Text and content flow +$semantic-spacing-content-paragraph: $base-spacing-4 !default; // 1rem - paragraph spacing +$semantic-spacing-content-heading: $base-spacing-6 !default; // 1.5rem - heading spacing +$semantic-spacing-content-list-item: $base-spacing-2 !default; // 0.5rem - list item spacing +$semantic-spacing-content-line-tight: $base-spacing-1 !default; // 0.25rem - tight line spacing +$semantic-spacing-content-line-normal: $base-spacing-2 !default; // 0.5rem - normal line spacing + +// INTERACTIVE SPACING - Clickable elements +$semantic-spacing-interactive-button-padding-x: $base-spacing-4 !default; // 1rem - button horizontal padding +$semantic-spacing-interactive-button-padding-y: $base-spacing-2 !default; // 0.5rem - button vertical padding +$semantic-spacing-interactive-input-padding-x: $base-spacing-3 !default; // 0.75rem - input horizontal padding +$semantic-spacing-interactive-input-padding-y: $base-spacing-2-5 !default; // 0.625rem - input vertical padding +$semantic-spacing-interactive-touch-target: $base-spacing-11 !default; // 2.75rem - minimum touch target + +// CARD AND CONTAINER SPACING +$semantic-spacing-container-card-padding: $base-spacing-4 !default; // 1rem - card internal padding +$semantic-spacing-container-card-padding-lg: $base-spacing-6 !default; // 1.5rem - large card padding +$semantic-spacing-container-modal-padding: $base-spacing-6 !default; // 1.5rem - modal padding +$semantic-spacing-container-sidebar-padding: $base-spacing-4 !default; // 1rem - sidebar padding + +// NAVIGATION SPACING +$semantic-spacing-nav-item-padding-x: $base-spacing-3 !default; // 0.75rem - nav item horizontal padding +$semantic-spacing-nav-item-padding-y: $base-spacing-2 !default; // 0.5rem - nav item vertical padding +$semantic-spacing-nav-section-gap: $base-spacing-6 !default; // 1.5rem - nav section gaps +$semantic-spacing-nav-submenu-indent: $base-spacing-4 !default; // 1rem - submenu indentation + +// GRID AND LAYOUT GAPS +$semantic-spacing-grid-gap-xs: $base-spacing-2 !default; // 0.5rem - tight grid +$semantic-spacing-grid-gap-sm: $base-spacing-3 !default; // 0.75rem - small grid +$semantic-spacing-grid-gap-md: $base-spacing-4 !default; // 1rem - medium grid +$semantic-spacing-grid-gap-lg: $base-spacing-6 !default; // 1.5rem - large grid +$semantic-spacing-grid-gap-xl: $base-spacing-8 !default; // 2rem - extra large grid + +// FORM SPACING +$semantic-spacing-form-field-gap: $base-spacing-4 !default; // 1rem - gap between form fields +$semantic-spacing-form-group-gap: $base-spacing-6 !default; // 1.5rem - gap between form groups +$semantic-spacing-form-section-gap: $base-spacing-8 !default; // 2rem - gap between form sections +$semantic-spacing-form-label-gap: $base-spacing-1 !default; // 0.25rem - label to input gap + +// UTILITY SPACING - Common spacing needs +$semantic-spacing-stack-xs: $base-spacing-1 !default; // 0.25rem - tight stack +$semantic-spacing-stack-sm: $base-spacing-2 !default; // 0.5rem - small stack +$semantic-spacing-stack-md: $base-spacing-4 !default; // 1rem - medium stack +$semantic-spacing-stack-lg: $base-spacing-6 !default; // 1.5rem - large stack +$semantic-spacing-stack-xl: $base-spacing-8 !default; // 2rem - extra large stack + +// MICRO SPACING - Fine-tuned spacing +$semantic-spacing-micro-hairline: $base-spacing-micro-hairline !default; // 0.5px - hairline +$semantic-spacing-micro-tight: $base-spacing-0-5 !default; // 0.125rem - very tight +$semantic-spacing-micro-icon-gap: $base-spacing-1-5 !default; // 0.375rem - icon to text gap + +// ========================================================================== +// BACKWARDS COMPATIBILITY ALIASES +// ========================================================================== +// Aliases for existing usage patterns in the codebase + +// Component spacing aliases +$semantic-spacing-component-2xs: $base-spacing-1 !default; // 0.25rem +$semantic-spacing-component-xs: $base-spacing-2 !default; // 0.5rem +$semantic-spacing-component-sm: $base-spacing-3 !default; // 0.75rem +$semantic-spacing-component-md: $base-spacing-4 !default; // 1rem +$semantic-spacing-component-lg: $base-spacing-6 !default; // 1.5rem +$semantic-spacing-component-xl: $base-spacing-8 !default; // 2rem + +// Layout spacing aliases +$semantic-spacing-layout-xs: $base-spacing-2 !default; // 0.5rem +$semantic-spacing-layout-sm: $base-spacing-4 !default; // 1rem +$semantic-spacing-layout-md: $base-spacing-6 !default; // 1.5rem +$semantic-spacing-layout-lg: $base-spacing-8 !default; // 2rem +$semantic-spacing-layout-xl: $base-spacing-12 !default; // 3rem + +// Section spacing aliases +$semantic-spacing-section-xs: $base-spacing-8 !default; // 2rem +$semantic-spacing-section-sm: $base-spacing-12 !default; // 3rem +$semantic-spacing-section-md: $base-spacing-16 !default; // 4rem +$semantic-spacing-section-lg: $base-spacing-20 !default; // 5rem +$semantic-spacing-section-xl: $base-spacing-24 !default; // 6rem + +// INDIVIDUAL SEMANTIC SPACING VARIABLES - Direct access to all base spacing values +$semantic-spacing-0: $base-spacing-0 !default; +$semantic-spacing-0-5: $base-spacing-0-5 !default; +$semantic-spacing-1: $base-spacing-1 !default; +$semantic-spacing-1-5: $base-spacing-1-5 !default; +$semantic-spacing-2: $base-spacing-2 !default; +$semantic-spacing-2-5: $base-spacing-2-5 !default; +$semantic-spacing-3: $base-spacing-3 !default; +$semantic-spacing-3-5: $base-spacing-3-5 !default; +$semantic-spacing-4: $base-spacing-4 !default; +$semantic-spacing-5: $base-spacing-5 !default; +$semantic-spacing-6: $base-spacing-6 !default; +$semantic-spacing-7: $base-spacing-7 !default; +$semantic-spacing-8: $base-spacing-8 !default; +$semantic-spacing-9: $base-spacing-9 !default; +$semantic-spacing-10: $base-spacing-10 !default; +$semantic-spacing-11: $base-spacing-11 !default; +$semantic-spacing-12: $base-spacing-12 !default; +$semantic-spacing-14: $base-spacing-14 !default; +$semantic-spacing-16: $base-spacing-16 !default; +$semantic-spacing-20: $base-spacing-20 !default; +$semantic-spacing-24: $base-spacing-24 !default; +$semantic-spacing-28: $base-spacing-28 !default; +$semantic-spacing-32: $base-spacing-32 !default; +$semantic-spacing-36: $base-spacing-36 !default; +$semantic-spacing-40: $base-spacing-40 !default; +$semantic-spacing-44: $base-spacing-44 !default; +$semantic-spacing-48: $base-spacing-48 !default; +$semantic-spacing-52: $base-spacing-52 !default; +$semantic-spacing-56: $base-spacing-56 !default; +$semantic-spacing-60: $base-spacing-60 !default; +$semantic-spacing-64: $base-spacing-64 !default; +$semantic-spacing-72: $base-spacing-72 !default; +$semantic-spacing-80: $base-spacing-80 !default; +$semantic-spacing-96: $base-spacing-96 !default; +$semantic-spacing-128: $base-spacing-128 !default; +$semantic-spacing-160: $base-spacing-160 !default; +$semantic-spacing-192: $base-spacing-192 !default; +$semantic-spacing-224: $base-spacing-224 !default; +$semantic-spacing-256: $base-spacing-256 !default; + +// SEMANTIC SIZE ALIASES - Common semantic size names +$semantic-spacing-xs: $base-spacing-semantic-xs !default; // 0.5rem +$semantic-spacing-sm: $base-spacing-semantic-sm !default; // 0.75rem +$semantic-spacing-md: $base-spacing-semantic-md !default; // 1rem +$semantic-spacing-lg: $base-spacing-semantic-lg !default; // 1.5rem +$semantic-spacing-xl: $base-spacing-semantic-xl !default; // 2rem +$semantic-spacing-2xl: $base-spacing-semantic-2xl !default; // 2.5rem +$semantic-spacing-3xl: $base-spacing-semantic-3xl !default; // 3rem +$semantic-spacing-4xl: $base-spacing-semantic-4xl !default; // 4rem +$semantic-spacing-5xl: $base-spacing-semantic-5xl !default; // 5rem \ No newline at end of file diff --git a/projects/shared-ui/src/styles/semantic/typography/_index.scss b/projects/shared-ui/src/styles/semantic/typography/_index.scss new file mode 100644 index 0000000..1eff490 --- /dev/null +++ b/projects/shared-ui/src/styles/semantic/typography/_index.scss @@ -0,0 +1,10 @@ +// ========================================================================== +// SEMANTIC TYPOGRAPHY INDEX +// ========================================================================== +// Contextual typography system for content hierarchy and UI components +// ========================================================================== + +// Note: base tokens imported at semantic/index level + +// Semantic typography mappings +@import 'semantic-typography'; \ No newline at end of file diff --git a/projects/shared-ui/src/styles/semantic/typography/_semantic-typography.scss b/projects/shared-ui/src/styles/semantic/typography/_semantic-typography.scss new file mode 100644 index 0000000..f4b2291 --- /dev/null +++ b/projects/shared-ui/src/styles/semantic/typography/_semantic-typography.scss @@ -0,0 +1,271 @@ +// ========================================================================== +// SEMANTIC TYPOGRAPHY +// ========================================================================== +// Meaningful typography tokens for content hierarchy and UI components +// Maps base typography values to contextual usage patterns +// ========================================================================== +@use '../../base/typography' as *; + +// CONTENT HIERARCHY - Semantic text roles +$semantic-typography-heading-display: ( + font-family: $base-typography-font-family-display, + font-size: $base-typography-font-size-4xl, + font-weight: $base-typography-font-weight-bold, + line-height: $base-typography-line-height-tight, + letter-spacing: $base-typography-letter-spacing-tight, +) !default; + +$semantic-typography-heading-h1: ( + font-family: $base-typography-font-family-sans, + font-size: $base-typography-font-size-3xl, + font-weight: $base-typography-font-weight-bold, + line-height: $base-typography-line-height-tight, + letter-spacing: $base-typography-letter-spacing-tight, +) !default; + +$semantic-typography-heading-h2: ( + font-family: $base-typography-font-family-sans, + font-size: $base-typography-font-size-2xl, + font-weight: $base-typography-font-weight-semibold, + line-height: $base-typography-line-height-snug, + letter-spacing: $base-typography-letter-spacing-normal, +) !default; + +$semantic-typography-heading-h3: ( + font-family: $base-typography-font-family-sans, + font-size: $base-typography-font-size-xl, + font-weight: $base-typography-font-weight-semibold, + line-height: $base-typography-line-height-snug, + letter-spacing: $base-typography-letter-spacing-normal, +) !default; + +$semantic-typography-heading-h4: ( + font-family: $base-typography-font-family-sans, + font-size: $base-typography-font-size-lg, + font-weight: $base-typography-font-weight-medium, + line-height: $base-typography-line-height-normal, + letter-spacing: $base-typography-letter-spacing-normal, +) !default; + +$semantic-typography-heading-h5: ( + font-family: $base-typography-font-family-sans, + font-size: $base-typography-font-size-md, + font-weight: $base-typography-font-weight-medium, + line-height: $base-typography-line-height-normal, + letter-spacing: $base-typography-letter-spacing-normal, +) !default; + +$semantic-typography-font-family-sans: $base-typography-font-family-sans !default; +$semantic-typography-font-family-serif: $base-typography-font-family-serif !default; +$semantic-typography-font-family-mono: $base-typography-font-family-mono !default; +$semantic-typography-font-family-display: $base-typography-font-family-display !default; + + + +// INDIVIDUAL TOKENS - For easier access in component styles +$semantic-typography-heading-h1-size: $base-typography-font-size-3xl !default; +$semantic-typography-heading-h1-weight: $base-typography-font-weight-bold !default; +$semantic-typography-heading-h1-line-height: $base-typography-line-height-tight !default; + +$semantic-typography-heading-h2-size: $base-typography-font-size-2xl !default; +$semantic-typography-heading-h2-weight: $base-typography-font-weight-semibold !default; +$semantic-typography-heading-h2-line-height: $base-typography-line-height-snug !default; + +$semantic-typography-heading-h3-size: $base-typography-font-size-xl !default; +$semantic-typography-heading-h3-weight: $base-typography-font-weight-semibold !default; +$semantic-typography-heading-h3-line-height: $base-typography-line-height-snug !default; + +$semantic-typography-heading-h4-size: $base-typography-font-size-lg !default; +$semantic-typography-heading-h4-weight: $base-typography-font-weight-medium !default; +$semantic-typography-heading-h4-line-height: $base-typography-line-height-normal !default; + +$semantic-typography-heading-h5-size: $base-typography-font-size-md !default; +$semantic-typography-heading-h5-weight: $base-typography-font-weight-medium !default; +$semantic-typography-heading-h5-line-height: $base-typography-line-height-normal !default; + +// ICON TYPOGRAPHY - Icon sizing for different contexts +$semantic-typography-icon-small-size: $base-typography-font-size-sm !default; +$semantic-typography-icon-medium-size: $base-typography-font-size-lg !default; +$semantic-typography-icon-large-size: $base-typography-font-size-xl !default; + +// BREAKPOINT TOKENS - For responsive adjustments +$semantic-breakpoint-sm: 640px !default; +$semantic-breakpoint-md: 768px !default; +$semantic-breakpoint-lg: 1024px !default; + +// BODY TEXT - Content text styles +$semantic-typography-body-large: ( + font-family: $base-typography-font-family-sans, + font-size: $base-typography-font-size-lg, + font-weight: $base-typography-font-weight-normal, + line-height: $base-typography-line-height-relaxed, + letter-spacing: $base-typography-letter-spacing-normal, +) !default; + +$semantic-typography-body-medium: ( + font-family: $base-typography-font-family-sans, + font-size: $base-typography-font-size-md, + font-weight: $base-typography-font-weight-normal, + line-height: $base-typography-line-height-relaxed, + letter-spacing: $base-typography-letter-spacing-normal, +) !default; + +$semantic-typography-body-small: ( + font-family: $base-typography-font-family-sans, + font-size: $base-typography-font-size-sm, + font-weight: $base-typography-font-weight-normal, + line-height: $base-typography-line-height-normal, + letter-spacing: $base-typography-letter-spacing-normal, +) !default; + +// UI COMPONENT TEXT - Interface elements +$semantic-typography-button-large: ( + font-family: $base-typography-font-family-sans, + font-size: $base-typography-font-size-md, + font-weight: $base-typography-font-weight-medium, + line-height: $base-typography-line-height-none, + letter-spacing: $base-typography-letter-spacing-wide, +) !default; + +$semantic-typography-button-medium: ( + font-family: $base-typography-font-family-sans, + font-size: $base-typography-font-size-sm, + font-weight: $base-typography-font-weight-medium, + line-height: $base-typography-line-height-none, + letter-spacing: $base-typography-letter-spacing-wide, +) !default; + +$semantic-typography-button-small: ( + font-family: $base-typography-font-family-sans, + font-size: $base-typography-font-size-xs, + font-weight: $base-typography-font-weight-medium, + line-height: $base-typography-line-height-none, + letter-spacing: $base-typography-letter-spacing-wider, +) !default; + +// FORM TEXT - Input and label styles +$semantic-typography-label: ( + font-family: $base-typography-font-family-sans, + font-size: $base-typography-font-size-sm, + font-weight: $base-typography-font-weight-medium, + line-height: $base-typography-line-height-normal, + letter-spacing: $base-typography-letter-spacing-normal, +) !default; + +$semantic-typography-input: ( + font-family: $base-typography-font-family-sans, + font-size: $base-typography-font-size-md, + font-weight: $base-typography-font-weight-normal, + line-height: $base-typography-line-height-normal, + letter-spacing: $base-typography-letter-spacing-normal, +) !default; + +$semantic-typography-placeholder: ( + font-family: $base-typography-font-family-sans, + font-size: $base-typography-font-size-md, + font-weight: $base-typography-font-weight-normal, + line-height: $base-typography-line-height-normal, + letter-spacing: $base-typography-letter-spacing-normal, +) !default; + +// NAVIGATION TEXT - Menu and navigation styles +$semantic-typography-nav-primary: ( + font-family: $base-typography-font-family-sans, + font-size: $base-typography-font-size-md, + font-weight: $base-typography-font-weight-medium, + line-height: $base-typography-line-height-normal, + letter-spacing: $base-typography-letter-spacing-normal, +) !default; + +$semantic-typography-nav-secondary: ( + font-family: $base-typography-font-family-sans, + font-size: $base-typography-font-size-sm, + font-weight: $base-typography-font-weight-normal, + line-height: $base-typography-line-height-normal, + letter-spacing: $base-typography-letter-spacing-normal, +) !default; + +// UTILITY TEXT - Captions, tags, etc. +$semantic-typography-caption: ( + font-family: $base-typography-font-family-sans, + font-size: $base-typography-font-size-xs, + font-weight: $base-typography-font-weight-normal, + line-height: $base-typography-line-height-normal, + letter-spacing: $base-typography-letter-spacing-normal, +) !default; + +$semantic-typography-tag: ( + font-family: $base-typography-font-family-sans, + font-size: $base-typography-font-size-xs, + font-weight: $base-typography-font-weight-medium, + line-height: $base-typography-line-height-none, + letter-spacing: $base-typography-letter-spacing-wide, +) !default; + +$semantic-typography-code-inline: ( + font-family: $base-typography-font-family-mono, + font-size: $base-typography-font-size-sm, + font-weight: $base-typography-font-weight-normal, + line-height: $base-typography-line-height-normal, + letter-spacing: $base-typography-letter-spacing-normal, +) !default; + +$semantic-typography-code-block: ( + font-family: $base-typography-font-family-mono, + font-size: $base-typography-font-size-sm, + font-weight: $base-typography-font-weight-normal, + line-height: $base-typography-line-height-relaxed, + letter-spacing: $base-typography-letter-spacing-normal, +) !default; + +// INDIVIDUAL SEMANTIC FONT WEIGHTS - Direct access to weight values +$semantic-typography-font-weight-thin: $base-typography-font-weight-thin !default; +$semantic-typography-font-weight-extralight: $base-typography-font-weight-extralight !default; +$semantic-typography-font-weight-light: $base-typography-font-weight-light !default; +$semantic-typography-font-weight-normal: $base-typography-font-weight-normal !default; +$semantic-typography-font-weight-medium: $base-typography-font-weight-medium !default; +$semantic-typography-font-weight-semibold: $base-typography-font-weight-semibold !default; +$semantic-typography-font-weight-bold: $base-typography-font-weight-bold !default; +$semantic-typography-font-weight-extrabold: $base-typography-font-weight-extrabold !default; +$semantic-typography-font-weight-black: $base-typography-font-weight-black !default; + +// INDIVIDUAL SEMANTIC FONT SIZES - Direct access to size values +$semantic-typography-font-size-xs: $base-typography-font-size-xs !default; +$semantic-typography-font-size-sm: $base-typography-font-size-sm !default; +$semantic-typography-font-size-md: $base-typography-font-size-md !default; +$semantic-typography-font-size-lg: $base-typography-font-size-lg !default; +$semantic-typography-font-size-xl: $base-typography-font-size-xl !default; +$semantic-typography-font-size-2xl: $base-typography-font-size-2xl !default; +$semantic-typography-font-size-3xl: $base-typography-font-size-3xl !default; +$semantic-typography-font-size-4xl: $base-typography-font-size-4xl !default; +$semantic-typography-font-size-5xl: $base-typography-font-size-5xl !default; +$semantic-typography-font-size-6xl: $base-typography-font-size-6xl !default; +$semantic-typography-font-size-7xl: $base-typography-font-size-7xl !default; +$semantic-typography-font-size-8xl: $base-typography-font-size-8xl !default; +$semantic-typography-font-size-9xl: $base-typography-font-size-9xl !default; +$semantic-typography-font-size-10xl: $base-typography-font-size-10xl !default; +$semantic-typography-font-size-11xl: $base-typography-font-size-11xl !default; + +// INDIVIDUAL SEMANTIC LINE HEIGHTS - Direct access to line height values +$semantic-typography-line-height-none: $base-typography-line-height-none !default; +$semantic-typography-line-height-tight: $base-typography-line-height-tight !default; +$semantic-typography-line-height-snug: $base-typography-line-height-snug !default; +$semantic-typography-line-height-normal: $base-typography-line-height-normal !default; +$semantic-typography-line-height-relaxed: $base-typography-line-height-relaxed !default; +$semantic-typography-line-height-loose: $base-typography-line-height-loose !default; +$semantic-typography-line-height-3: $base-typography-line-height-3 !default; +$semantic-typography-line-height-4: $base-typography-line-height-4 !default; +$semantic-typography-line-height-5: $base-typography-line-height-5 !default; +$semantic-typography-line-height-6: $base-typography-line-height-6 !default; +$semantic-typography-line-height-7: $base-typography-line-height-7 !default; +$semantic-typography-line-height-8: $base-typography-line-height-8 !default; +$semantic-typography-line-height-9: $base-typography-line-height-9 !default; +$semantic-typography-line-height-10: $base-typography-line-height-10 !default; + +// INDIVIDUAL SEMANTIC LETTER SPACING - Direct access to letter spacing values +$semantic-typography-letter-spacing-tighter: $base-typography-letter-spacing-tighter !default; +$semantic-typography-letter-spacing-tight: $base-typography-letter-spacing-tight !default; +$semantic-typography-letter-spacing-normal: $base-typography-letter-spacing-normal !default; +$semantic-typography-letter-spacing-wide: $base-typography-letter-spacing-wide !default; +$semantic-typography-letter-spacing-wider: $base-typography-letter-spacing-wider !default; +$semantic-typography-letter-spacing-widest: $base-typography-letter-spacing-widest !default; \ No newline at end of file diff --git a/projects/shared-ui/src/styles/semantic/z-index/_index.scss b/projects/shared-ui/src/styles/semantic/z-index/_index.scss new file mode 100644 index 0000000..ce3b6cb --- /dev/null +++ b/projects/shared-ui/src/styles/semantic/z-index/_index.scss @@ -0,0 +1,7 @@ +// ========================================================================== +// Z-INDEX INDEX +// ========================================================================== +// Main index file for semantic z-index tokens +// ========================================================================== + +@forward 'semantic-z-index'; \ No newline at end of file diff --git a/projects/shared-ui/src/styles/semantic/z-index/_semantic-z-index.scss b/projects/shared-ui/src/styles/semantic/z-index/_semantic-z-index.scss new file mode 100644 index 0000000..256e1fe --- /dev/null +++ b/projects/shared-ui/src/styles/semantic/z-index/_semantic-z-index.scss @@ -0,0 +1,64 @@ +// ========================================================================== +// SEMANTIC Z-INDEX +// ========================================================================== +// Meaningful z-index tokens for layering and stacking context +// Maps base z-index values to contextual usage patterns +// ========================================================================== +@use '../../base/z-index' as *; + +// LAYERING HIERARCHY - Component and UI element stacking +$semantic-z-index-background: $base-z-index-neg-1 !default; // Background elements +$semantic-z-index-base: $base-z-index-0 !default; // Base layer elements +$semantic-z-index-content: $base-z-index-10 !default; // Main content layer +$semantic-z-index-elevated: $base-z-index-20 !default; // Elevated content +$semantic-z-index-floating: $base-z-index-30 !default; // Floating elements + +// NAVIGATION LAYERS - Menu and navigation stacking +$semantic-z-index-nav-primary: $base-z-index-40 !default; // Primary navigation +$semantic-z-index-nav-secondary: $base-z-index-50 !default; // Secondary navigation +$semantic-z-index-breadcrumb: $base-z-index-10 !default; // Breadcrumb navigation + +// INTERACTIVE LAYERS - User interaction elements +$semantic-z-index-dropdown: $base-z-index-dropdown !default; // Dropdown menus +$semantic-z-index-popover: $base-z-index-popover !default; // Popovers and tooltips +$semantic-z-index-tooltip: $base-z-index-tooltip !default; // Tooltips +$semantic-z-index-banner: $base-z-index-banner !default; // Notification banners + +// OVERLAY LAYERS - Modal and overlay elements +$semantic-z-index-sticky: $base-z-index-sticky !default; // Sticky elements +$semantic-z-index-fixed: $base-z-index-fixed !default; // Fixed position elements +$semantic-z-index-modal-backdrop: $base-z-index-modal-backdrop !default; // Modal backdrop +$semantic-z-index-overlay: $base-z-index-overlay !default; // General overlays +$semantic-z-index-modal: $base-z-index-modal !default; // Modal dialogs + +// NOTIFICATION LAYERS - Alerts and notifications +$semantic-z-index-toast: $base-z-index-toast !default; // Toast notifications +$semantic-z-index-alert: $base-z-index-60 !default; // Alert messages +$semantic-z-index-snackbar: $base-z-index-70 !default; // Snackbar notifications + +// UTILITY LAYERS - Special purpose elements +$semantic-z-index-loading: $base-z-index-80 !default; // Loading overlays +$semantic-z-index-debug: $base-z-index-debug !default; // Debug/development elements +$semantic-z-index-max: $base-z-index-max !default; // Maximum z-index value + +// COMPONENT-SPECIFIC LAYERS +$semantic-z-index-header: $base-z-index-30 !default; // Page/section headers +$semantic-z-index-sidebar: $base-z-index-20 !default; // Sidebar panels +$semantic-z-index-footer: $base-z-index-10 !default; // Page/section footers +$semantic-z-index-card-hover: $base-z-index-10 !default; // Cards on hover +$semantic-z-index-button-focus: $base-z-index-10 !default; // Focused buttons + +// INDIVIDUAL SEMANTIC Z-INDEX TOKENS - Direct access to all base z-index values +$semantic-z-index-neg-10: $base-z-index-neg-10 !default; +$semantic-z-index-neg-1: $base-z-index-neg-1 !default; +$semantic-z-index-0: $base-z-index-0 !default; +$semantic-z-index-10: $base-z-index-10 !default; +$semantic-z-index-20: $base-z-index-20 !default; +$semantic-z-index-30: $base-z-index-30 !default; +$semantic-z-index-40: $base-z-index-40 !default; +$semantic-z-index-50: $base-z-index-50 !default; +$semantic-z-index-60: $base-z-index-60 !default; +$semantic-z-index-70: $base-z-index-70 !default; +$semantic-z-index-80: $base-z-index-80 !default; +$semantic-z-index-90: $base-z-index-90 !default; +$semantic-z-index-100: $base-z-index-100 !default; \ No newline at end of file diff --git a/projects/shared-ui/src/styles/tokens.scss b/projects/shared-ui/src/styles/tokens.scss new file mode 100644 index 0000000..5d0b279 --- /dev/null +++ b/projects/shared-ui/src/styles/tokens.scss @@ -0,0 +1,14 @@ +// ========================================================================== +// DESIGN TOKENS ENTRY POINT +// ========================================================================== +// Complete design token system including base and semantic tokens +// Use this file to import only tokens without components/commons +// +// Usage: +// @use 'path/to/shared-ui/src/styles/tokens' as tokens; +// color: tokens.$semantic-color-primary; +// margin: tokens.$base-space-4; +// ========================================================================== + +// Forward complete semantic layer (includes base tokens) +@forward 'semantic/index"; \ No newline at end of file diff --git a/projects/shared-ui/tsconfig.lib.json b/projects/shared-ui/tsconfig.lib.json new file mode 100644 index 0000000..2359bf6 --- /dev/null +++ b/projects/shared-ui/tsconfig.lib.json @@ -0,0 +1,15 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/lib", + "declaration": true, + "declarationMap": true, + "inlineSources": true, + "types": [] + }, + "exclude": [ + "**/*.spec.ts" + ] +} diff --git a/projects/shared-ui/tsconfig.lib.prod.json b/projects/shared-ui/tsconfig.lib.prod.json new file mode 100644 index 0000000..9215caa --- /dev/null +++ b/projects/shared-ui/tsconfig.lib.prod.json @@ -0,0 +1,11 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "./tsconfig.lib.json", + "compilerOptions": { + "declarationMap": false + }, + "angularCompilerOptions": { + "compilationMode": "partial" + } +} diff --git a/projects/shared-ui/tsconfig.spec.json b/projects/shared-ui/tsconfig.spec.json new file mode 100644 index 0000000..254686d --- /dev/null +++ b/projects/shared-ui/tsconfig.spec.json @@ -0,0 +1,15 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/spec", + "types": [ + "jasmine" + ] + }, + "include": [ + "**/*.spec.ts", + "**/*.d.ts" + ] +} diff --git a/projects/shared-utils/README.md b/projects/shared-utils/README.md new file mode 100644 index 0000000..2b76a2f --- /dev/null +++ b/projects/shared-utils/README.md @@ -0,0 +1,63 @@ +# SharedUtils + +This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 19.2.0. + +## Code scaffolding + +Angular CLI includes powerful code scaffolding tools. To generate a new component, run: + +```bash +ng generate component component-name +``` + +For a complete list of available schematics (such as `components`, `directives`, or `pipes`), run: + +```bash +ng generate --help +``` + +## Building + +To build the library, run: + +```bash +ng build shared-utils +``` + +This command will compile your project, and the build artifacts will be placed in the `dist/` directory. + +### Publishing the Library + +Once the project is built, you can publish your library by following these steps: + +1. Navigate to the `dist` directory: + ```bash + cd dist/shared-utils + ``` + +2. Run the `npm publish` command to publish your library to the npm registry: + ```bash + npm publish + ``` + +## Running unit tests + +To execute unit tests with the [Karma](https://karma-runner.github.io) test runner, use the following command: + +```bash +ng test +``` + +## Running end-to-end tests + +For end-to-end (e2e) testing, run: + +```bash +ng e2e +``` + +Angular CLI does not come with an end-to-end testing framework by default. You can choose one that suits your needs. + +## Additional Resources + +For more information on using the Angular CLI, including detailed command references, visit the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page. diff --git a/projects/shared-utils/ng-package.json b/projects/shared-utils/ng-package.json new file mode 100644 index 0000000..e3a7327 --- /dev/null +++ b/projects/shared-utils/ng-package.json @@ -0,0 +1,7 @@ +{ + "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", + "dest": "../../dist/shared-utils", + "lib": { + "entryFile": "src/public-api.ts" + } +} \ No newline at end of file diff --git a/projects/shared-utils/package.json b/projects/shared-utils/package.json new file mode 100644 index 0000000..38bad6e --- /dev/null +++ b/projects/shared-utils/package.json @@ -0,0 +1,12 @@ +{ + "name": "shared-utils", + "version": "0.0.1", + "peerDependencies": { + "@angular/common": "^19.2.0", + "@angular/core": "^19.2.0" + }, + "dependencies": { + "tslib": "^2.3.0" + }, + "sideEffects": false +} diff --git a/projects/shared-utils/src/lib/shared-utils.component.spec.ts b/projects/shared-utils/src/lib/shared-utils.component.spec.ts new file mode 100644 index 0000000..369d56c --- /dev/null +++ b/projects/shared-utils/src/lib/shared-utils.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SharedUtilsComponent } from './shared-utils.component'; + +describe('SharedUtilsComponent', () => { + let component: SharedUtilsComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [SharedUtilsComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(SharedUtilsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/projects/shared-utils/src/lib/shared-utils.component.ts b/projects/shared-utils/src/lib/shared-utils.component.ts new file mode 100644 index 0000000..979d392 --- /dev/null +++ b/projects/shared-utils/src/lib/shared-utils.component.ts @@ -0,0 +1,15 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'lib-shared-utils', + imports: [], + template: ` +

+ shared-utils works! +

+ `, + styles: `` +}) +export class SharedUtilsComponent { + +} diff --git a/projects/shared-utils/src/lib/shared-utils.service.spec.ts b/projects/shared-utils/src/lib/shared-utils.service.spec.ts new file mode 100644 index 0000000..484ed4d --- /dev/null +++ b/projects/shared-utils/src/lib/shared-utils.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { SharedUtilsService } from './shared-utils.service'; + +describe('SharedUtilsService', () => { + let service: SharedUtilsService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(SharedUtilsService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/projects/shared-utils/src/lib/shared-utils.service.ts b/projects/shared-utils/src/lib/shared-utils.service.ts new file mode 100644 index 0000000..ad84344 --- /dev/null +++ b/projects/shared-utils/src/lib/shared-utils.service.ts @@ -0,0 +1,9 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ + providedIn: 'root' +}) +export class SharedUtilsService { + + constructor() { } +} diff --git a/projects/shared-utils/src/public-api.ts b/projects/shared-utils/src/public-api.ts new file mode 100644 index 0000000..caf6734 --- /dev/null +++ b/projects/shared-utils/src/public-api.ts @@ -0,0 +1,6 @@ +/* + * Public API Surface of shared-utils + */ + +export * from './lib/shared-utils.service'; +export * from './lib/shared-utils.component'; diff --git a/projects/shared-utils/tsconfig.lib.json b/projects/shared-utils/tsconfig.lib.json new file mode 100644 index 0000000..2359bf6 --- /dev/null +++ b/projects/shared-utils/tsconfig.lib.json @@ -0,0 +1,15 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/lib", + "declaration": true, + "declarationMap": true, + "inlineSources": true, + "types": [] + }, + "exclude": [ + "**/*.spec.ts" + ] +} diff --git a/projects/shared-utils/tsconfig.lib.prod.json b/projects/shared-utils/tsconfig.lib.prod.json new file mode 100644 index 0000000..9215caa --- /dev/null +++ b/projects/shared-utils/tsconfig.lib.prod.json @@ -0,0 +1,11 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "./tsconfig.lib.json", + "compilerOptions": { + "declarationMap": false + }, + "angularCompilerOptions": { + "compilationMode": "partial" + } +} diff --git a/projects/shared-utils/tsconfig.spec.json b/projects/shared-utils/tsconfig.spec.json new file mode 100644 index 0000000..254686d --- /dev/null +++ b/projects/shared-utils/tsconfig.spec.json @@ -0,0 +1,15 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/spec", + "types": [ + "jasmine" + ] + }, + "include": [ + "**/*.spec.ts", + "**/*.d.ts" + ] +} diff --git a/projects/ui-essentials/README.md b/projects/ui-essentials/README.md new file mode 100644 index 0000000..3cf870b --- /dev/null +++ b/projects/ui-essentials/README.md @@ -0,0 +1,63 @@ +# UiEssentials + +This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 19.2.0. + +## Code scaffolding + +Angular CLI includes powerful code scaffolding tools. To generate a new component, run: + +```bash +ng generate component component-name +``` + +For a complete list of available schematics (such as `components`, `directives`, or `pipes`), run: + +```bash +ng generate --help +``` + +## Building + +To build the library, run: + +```bash +ng build ui-essentials +``` + +This command will compile your project, and the build artifacts will be placed in the `dist/` directory. + +### Publishing the Library + +Once the project is built, you can publish your library by following these steps: + +1. Navigate to the `dist` directory: + ```bash + cd dist/ui-essentials + ``` + +2. Run the `npm publish` command to publish your library to the npm registry: + ```bash + npm publish + ``` + +## Running unit tests + +To execute unit tests with the [Karma](https://karma-runner.github.io) test runner, use the following command: + +```bash +ng test +``` + +## Running end-to-end tests + +For end-to-end (e2e) testing, run: + +```bash +ng e2e +``` + +Angular CLI does not come with an end-to-end testing framework by default. You can choose one that suits your needs. + +## Additional Resources + +For more information on using the Angular CLI, including detailed command references, visit the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page. diff --git a/projects/ui-essentials/ng-package.json b/projects/ui-essentials/ng-package.json new file mode 100644 index 0000000..e27c1eb --- /dev/null +++ b/projects/ui-essentials/ng-package.json @@ -0,0 +1,7 @@ +{ + "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", + "dest": "../../dist/ui-essentials", + "lib": { + "entryFile": "src/public-api.ts" + } +} \ No newline at end of file diff --git a/projects/ui-essentials/package.json b/projects/ui-essentials/package.json new file mode 100644 index 0000000..6ecbb94 --- /dev/null +++ b/projects/ui-essentials/package.json @@ -0,0 +1,12 @@ +{ + "name": "ui-essentials", + "version": "0.0.1", + "peerDependencies": { + "@angular/common": "^19.2.0", + "@angular/core": "^19.2.0" + }, + "dependencies": { + "tslib": "^2.3.0" + }, + "sideEffects": false +} diff --git a/projects/ui-essentials/src/lib/components/buttons/button.component.scss b/projects/ui-essentials/src/lib/components/buttons/button.component.scss new file mode 100644 index 0000000..6481dba --- /dev/null +++ b/projects/ui-essentials/src/lib/components/buttons/button.component.scss @@ -0,0 +1,247 @@ +@use "../../../../../shared-ui/src/styles/semantic/index" as *; + +// Tokens available globally via main application styles + +.ui-button { + // Reset and base styles + display: inline-flex; + align-items: center; + justify-content: center; + border: none; + border-radius: $semantic-border-radius-md; + cursor: pointer; + text-decoration: none; + outline: none; + position: relative; + overflow: hidden; + + // Typography + font-family: $semantic-typography-font-family-sans; + font-weight: $semantic-typography-font-weight-medium; + text-align: center; + text-transform: none; + letter-spacing: $semantic-typography-letter-spacing-normal; + white-space: nowrap; + + // Interaction states + user-select: none; + -webkit-tap-highlight-color: transparent; + box-sizing: border-box; + + // Transitions + transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1); + + // Size variants + &--small { + height: $semantic-spacing-9; // 2.25rem + padding: 0 $semantic-spacing-3; // 0.75rem + font-size: $semantic-typography-font-size-sm; + line-height: $semantic-typography-line-height-tight; + min-width: $semantic-spacing-16; // 4rem + } + + &--medium { + height: $semantic-spacing-11; // 2.75rem + padding: 0 $semantic-spacing-4; // 1rem + font-size: $semantic-typography-font-size-md; + line-height: $semantic-typography-line-height-normal; + min-width: $semantic-spacing-20; // 5rem + } + + &--large { + height: $semantic-spacing-12; // 3rem + a bit + padding: 0 $semantic-spacing-6; // 1.5rem + font-size: $semantic-typography-font-size-lg; + line-height: $semantic-typography-line-height-normal; + min-width: $semantic-spacing-24; // 6rem + } + + // Filled variant (primary) + &--filled { + background-color: $semantic-color-interactive-primary; + color: $semantic-color-on-brand-primary; + + &:hover:not(:disabled) { + background-color: $semantic-color-brand-primary; + transform: translateY(-1px); + box-shadow: $semantic-shadow-button-hover; + } + + &:active:not(:disabled) { + transform: scale(0.98); + box-shadow: $semantic-shadow-button-active; + } + + &:focus-visible { + outline: 2px solid $semantic-color-brand-primary; + outline-offset: 2px; + } + } + + // Tonal variant + &--tonal { + background-color: $semantic-color-container-primary; + color: $semantic-color-on-container-primary; + + &:hover:not(:disabled) { + background-color: $semantic-color-container-primary; + transform: translateY(-1px); + box-shadow: $semantic-shadow-button-hover; + filter: brightness(0.95); + } + + &:active:not(:disabled) { + transform: scale(0.98); + } + + &:focus-visible { + outline: 2px solid $semantic-color-brand-primary; + outline-offset: 2px; + } + } + + // Outlined variant + &--outlined { + background-color: transparent; + color: $semantic-color-interactive-primary; + border: $semantic-border-width-1 solid $semantic-color-border-primary; + + &:hover:not(:disabled) { + background-color: $semantic-color-container-primary; + border-color: $semantic-color-interactive-primary; + transform: translateY(-1px); + } + + &:active:not(:disabled) { + background-color: $semantic-color-container-primary; + transform: scale(0.98); + filter: brightness(0.9); + } + + &:focus-visible { + outline: 2px solid $semantic-color-brand-primary; + outline-offset: 2px; + } + } + + // States + &--disabled { + opacity: 0.38; + cursor: not-allowed; + pointer-events: none; + } + + &--loading { + cursor: wait; + + .button-content { + opacity: 0; + } + } + + &--full-width { + width: 100%; + } + + // Icon styles + .button-content { + display: flex; + align-items: center; + justify-content: center; + } + + .button-icon { + display: inline-flex; + align-items: center; + flex-shrink: 0; + + &--left { + margin-right: $semantic-spacing-2; // 0.5rem + } + + &--right { + margin-left: $semantic-spacing-2; // 0.5rem + } + } + + // Size-specific icon adjustments + &--small .button-icon { + font-size: $semantic-typography-font-size-xs; + + &--left { + margin-right: $semantic-spacing-1-5; // 0.375rem + } + + &--right { + margin-left: $semantic-spacing-1-5; // 0.375rem + } + } + + &--medium .button-icon { + font-size: $semantic-typography-font-size-sm; + + &--left { + margin-right: $semantic-spacing-2; // 0.5rem + } + + &--right { + margin-left: $semantic-spacing-2; // 0.5rem + } + } + + &--large .button-icon { + font-size: $semantic-typography-font-size-md; + + &--left { + margin-right: $semantic-spacing-2-5; // 0.625rem + } + + &--right { + margin-left: $semantic-spacing-2-5; // 0.625rem + } + } + + // Loader styles + .button-loader { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + } + + .button-spinner { + width: $semantic-spacing-4; // 1rem + height: $semantic-spacing-4; // 1rem + border: 2px solid currentColor; + border-top: 2px solid transparent; + border-radius: 50%; + animation: spin 1s linear infinite; + opacity: 0.7; + } + + @keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } + } + + // Ripple effect + &::after { + content: ''; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: radial-gradient(circle, rgba(255, 255, 255, 0.3) 0%, transparent 70%); + transform: scale(0); + opacity: 0; + pointer-events: none; + transition: transform 0.3s ease, opacity 0.3s ease; + } + + &:active:not(:disabled)::after { + transform: scale(1); + opacity: 1; + transition: none; + } +} \ No newline at end of file diff --git a/projects/ui-essentials/src/lib/components/buttons/button.component.ts b/projects/ui-essentials/src/lib/components/buttons/button.component.ts new file mode 100644 index 0000000..7d61a68 --- /dev/null +++ b/projects/ui-essentials/src/lib/components/buttons/button.component.ts @@ -0,0 +1,75 @@ +import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; +import { IconDefinition } from '@fortawesome/fontawesome-svg-core'; + +export type ButtonVariant = 'filled' | 'tonal' | 'outlined'; +export type ButtonSize = 'small' | 'medium' | 'large'; +export type IconPosition = 'left' | 'right'; + +@Component({ + selector: 'ui-button', + standalone: true, + imports: [CommonModule, FontAwesomeModule], + changeDetection: ChangeDetectionStrategy.OnPush, + template: ` + + `, + styleUrl: './button.component.scss' +}) +export class ButtonComponent { + @Input() variant: ButtonVariant = 'filled'; + @Input() size: ButtonSize = 'medium'; + @Input() disabled: boolean = false; + @Input() loading: boolean = false; + @Input() type: 'button' | 'submit' | 'reset' = 'button'; + @Input() fullWidth: boolean = false; + @Input() class: string = ''; + @Input() icon?: IconDefinition; + @Input() iconPosition: IconPosition = 'left'; + + @Output() clicked = new EventEmitter(); + + get buttonClasses(): string { + return [ + 'ui-button', + `ui-button--${this.variant}`, + `ui-button--${this.size}`, + this.disabled ? 'ui-button--disabled' : '', + this.loading ? 'ui-button--loading' : '', + this.fullWidth ? 'ui-button--full-width' : '', + this.icon ? 'ui-button--with-icon' : '', + this.icon ? `ui-button--icon-${this.iconPosition}` : '', + this.class + ].filter(Boolean).join(' '); + } + + handleClick(event: Event): void { + if (!this.disabled && !this.loading) { + this.clicked.emit(event); + } + } +} \ No newline at end of file diff --git a/projects/ui-essentials/src/lib/components/buttons/index.ts b/projects/ui-essentials/src/lib/components/buttons/index.ts new file mode 100644 index 0000000..643ee81 --- /dev/null +++ b/projects/ui-essentials/src/lib/components/buttons/index.ts @@ -0,0 +1 @@ +export * from './button.component'; diff --git a/projects/ui-essentials/src/public-api.ts b/projects/ui-essentials/src/public-api.ts new file mode 100644 index 0000000..6bbf316 --- /dev/null +++ b/projects/ui-essentials/src/public-api.ts @@ -0,0 +1,5 @@ +/* + * Public API Surface of ui-essentials + */ + +export * from './lib/components/buttons/index'; diff --git a/projects/ui-essentials/tsconfig.lib.json b/projects/ui-essentials/tsconfig.lib.json new file mode 100644 index 0000000..2359bf6 --- /dev/null +++ b/projects/ui-essentials/tsconfig.lib.json @@ -0,0 +1,15 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/lib", + "declaration": true, + "declarationMap": true, + "inlineSources": true, + "types": [] + }, + "exclude": [ + "**/*.spec.ts" + ] +} diff --git a/projects/ui-essentials/tsconfig.lib.prod.json b/projects/ui-essentials/tsconfig.lib.prod.json new file mode 100644 index 0000000..9215caa --- /dev/null +++ b/projects/ui-essentials/tsconfig.lib.prod.json @@ -0,0 +1,11 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "./tsconfig.lib.json", + "compilerOptions": { + "declarationMap": false + }, + "angularCompilerOptions": { + "compilationMode": "partial" + } +} diff --git a/projects/ui-essentials/tsconfig.spec.json b/projects/ui-essentials/tsconfig.spec.json new file mode 100644 index 0000000..254686d --- /dev/null +++ b/projects/ui-essentials/tsconfig.spec.json @@ -0,0 +1,15 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../out-tsc/spec", + "types": [ + "jasmine" + ] + }, + "include": [ + "**/*.spec.ts", + "**/*.d.ts" + ] +} diff --git a/run.sh b/run.sh new file mode 100755 index 0000000..afce797 --- /dev/null +++ b/run.sh @@ -0,0 +1,2 @@ +lsof -t -i tcp:4200 | xargs kill -9 +ng serve diff --git a/tsconfig.json b/tsconfig.json index 5525117..ad0da3f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,6 +14,17 @@ "esModuleInterop": true, "experimentalDecorators": true, "moduleResolution": "bundler", + "paths": { + "shared-ui": [ + "./dist/shared-ui" + ], + "shared-utils": [ + "./dist/shared-utils" + ], + "ui-essentials": [ + "./dist/ui-essentials" + ] + }, "importHelpers": true, "target": "ES2022", "module": "ES2022"