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"