diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index b77d7c7..3276dc6 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -2,9 +2,9 @@ name: Node.js CI on: push: - branches: [ "main", "develop" ] + branches: ['main', 'develop'] pull_request: - branches: [ "main", "develop" ] + branches: ['main', 'develop'] jobs: build: @@ -16,30 +16,30 @@ jobs: # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ steps: - - uses: actions/checkout@v4 - - - name: Set up Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v4 - with: - node-version: ${{ matrix.node-version }} - cache: 'pnpm' # Cache pnpm instead of npm - - # Install pnpm - - name: Install pnpm - run: npm install -g pnpm - - # Install dependencies using pnpm - - name: Install Dependencies - run: pnpm install --frozen-lockfile - - # Run build (Nx should handle the build, can be adjusted if specific commands are needed) - - name: Build the project - run: pnpm run build --if-present - - # Run tests using Nx (adjust the test command if needed for Nx-specific testing) - - name: Run Tests - run: pnpm run test --if-present - - # Optionally, you can also run linting if set up in Nx - - name: Run Lint - run: pnpm run lint --if-present + - uses: actions/checkout@v4 + + - name: Set up Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + cache: 'pnpm' # Cache pnpm instead of npm + + # Install pnpm + - name: Install pnpm + run: npm install -g pnpm + + # Install dependencies using pnpm + - name: Install Dependencies + run: pnpm install --frozen-lockfile + + # Run build (Nx should handle the build, can be adjusted if specific commands are needed) + - name: Build the project + run: pnpm run build --if-present + + # Run tests using Nx (adjust the test command if needed for Nx-specific testing) + - name: Run Tests + run: pnpm run test --if-present + + # Optionally, you can also run linting if set up in Nx + - name: Run Lint + run: pnpm run lint --if-present diff --git a/CHANGELOG.md b/CHANGELOG.md index cb9a6e1..5923f52 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,36 @@ +## 0.0.2 (2024-12-01) + +### 🚀 Features + +- add package design system ([e0d1a78](https://github.com/ngx-primer/primer-ui/commit/e0d1a78)) + +### 🩹 Fixes + +- fixing packcge json per dependencies ([cdc4049](https://github.com/ngx-primer/primer-ui/commit/cdc4049)) +- implement base root accordion component ([2c42648](https://github.com/ngx-primer/primer-ui/commit/2c42648)) +- add docs ([0cfbd66](https://github.com/ngx-primer/primer-ui/commit/0cfbd66)) +- add id generation utils with interospection capability for genric componnet ([72ab09d](https://github.com/ngx-primer/primer-ui/commit/72ab09d)) +- update readme ([99ae953](https://github.com/ngx-primer/primer-ui/commit/99ae953)) +- fixing add license and readme ([bd59b69](https://github.com/ngx-primer/primer-ui/commit/bd59b69)) +- add credit tags ([317e880](https://github.com/ngx-primer/primer-ui/commit/317e880)) +- add project info ([d9c0618](https://github.com/ngx-primer/primer-ui/commit/d9c0618)) +- uipdate readme ([2bbb119](https://github.com/ngx-primer/primer-ui/commit/2bbb119)) +- fixing and migrate documentation to use analog js ([e9a410e](https://github.com/ngx-primer/primer-ui/commit/e9a410e)) +- fixing al module boundaries issue ([c3dfe1c](https://github.com/ngx-primer/primer-ui/commit/c3dfe1c)) +- fix strat documenting projects ([ec3d899](https://github.com/ngx-primer/primer-ui/commit/ec3d899)) +- fix ci node js ([0e352ac](https://github.com/ngx-primer/primer-ui/commit/0e352ac)) +- fixing context ([d9d85be](https://github.com/ngx-primer/primer-ui/commit/d9d85be)) +- fixing ad accoridon all context an make it optional ([cddefaa](https://github.com/ngx-primer/primer-ui/commit/cddefaa)) +- fixing remove un used conceept ([4a5ece7](https://github.com/ngx-primer/primer-ui/commit/4a5ece7)) +- remove unused apps ([1fdba33](https://github.com/ngx-primer/primer-ui/commit/1fdba33)) +- add base compoennt structure ([a46b9cb](https://github.com/ngx-primer/primer-ui/commit/a46b9cb)) +- fixing all accordion base mechanisme ([c8a1428](https://github.com/ngx-primer/primer-ui/commit/c8a1428)) +- format code ([98cd36c](https://github.com/ngx-primer/primer-ui/commit/98cd36c)) + +### ❤️ Thank You + +- ATS - Elhakim Cool + ## 0.0.2-0 (2024-11-17) ### 🩹 Fixes diff --git a/apps/documentations-e2e/project.json b/apps/documentations-e2e/project.json deleted file mode 100644 index 9066d70..0000000 --- a/apps/documentations-e2e/project.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "documentations-e2e", - "$schema": "../../node_modules/nx/schemas/project-schema.json", - "projectType": "application", - "sourceRoot": "apps/documentations-e2e/src", - "implicitDependencies": ["documentations"], - "// targets": "to see all targets run: nx show project documentations-e2e --web", - "targets": {} -} diff --git a/apps/documentations/index.html b/apps/documentations/index.html deleted file mode 100644 index 3cd9bee..0000000 --- a/apps/documentations/index.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - documentations - - - - - - - - - - diff --git a/apps/documentations/jest.config.ts b/apps/documentations/jest.config.ts deleted file mode 100644 index 0d86411..0000000 --- a/apps/documentations/jest.config.ts +++ /dev/null @@ -1,21 +0,0 @@ -export default { - displayName: 'documentations', - preset: '../../jest.preset.js', - setupFilesAfterEnv: ['/src/test-setup.ts'], - coverageDirectory: '../../coverage/apps/documentations', - transform: { - '^.+\\.(ts|mjs|js|html)$': [ - 'jest-preset-angular', - { - tsconfig: '/tsconfig.spec.json', - stringifyContentPathRegex: '\\.(html|svg)$', - }, - ], - }, - transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'], - snapshotSerializers: [ - 'jest-preset-angular/build/serializers/no-ng-attributes', - 'jest-preset-angular/build/serializers/ng-snapshot', - 'jest-preset-angular/build/serializers/html-comment', - ], -}; diff --git a/apps/documentations/package.json b/apps/documentations/package.json deleted file mode 100644 index fde3818..0000000 --- a/apps/documentations/package.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "module", - "dependencies": { - "@angular/common": "~18.2.13", - "@angular/core": "~18.2.13", - "@angular/platform-browser": "~18.2.13", - "@angular/platform-server": "~18.2.13", - "@angular/router": "~18.2.13", - "@angular/ssr": "~18.2.12", - "@ngx-primer/primitive/accordion": "0.0.2-0", - "@nx/angular": "20.1.0", - "express": "~4.18.3", - "zone.js": "~0.14.10", - "jest-preset-angular": "~14.1.1", - "vite": "^5.4.11", - "@analogjs/platform": "1.10.0-beta.6", - "@nx/vite": "20.1.0", - "@analogjs/vite-plugin-angular": "^1.9.0", - "tailwindcss": "^3.4.15", - "vite-tsconfig-paths": "^4.2.0", - "@ngx-primer/primitive/utilities": "0.0.2-0" - } -} diff --git a/apps/documentations/project.json b/apps/documentations/project.json deleted file mode 100644 index bb6579b..0000000 --- a/apps/documentations/project.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "name": "documentations", - "$schema": "../../node_modules/nx/schemas/project-schema.json", - "projectType": "application", - "prefix": "app", - "sourceRoot": "apps/documentations/src", - "tags": [], - "targets": { - "build": { - "executor": "@analogjs/platform:vite", - "options": { - "configFile": "apps/documentations/vite.config.ts", - "main": "apps/documentations/src/main.ts", - "outputPath": "dist/apps/documentations/client", - "tsConfig": "apps/documentations/tsconfig.app.json" - }, - "defaultConfiguration": "production", - "configurations": { - "development": { - "mode": "development" - }, - "production": { - "sourcemap": false, - "mode": "production" - } - } - }, - "serve": { - "executor": "@analogjs/platform:vite-dev-server", - "defaultConfiguration": "development", - "options": { - "buildTarget": "documentations:build", - "port": 4200 - }, - "configurations": { - "development": { - "buildTarget": "documentations:build:development", - "hmr": true - }, - "production": { - "buildTarget": "documentations:build:production" - } - } - }, - "extract-i18n": { - "executor": "@angular-devkit/build-angular:extract-i18n", - "options": { - "buildTarget": "documentations:build" - } - }, - "lint": { - "executor": "@nx/eslint:lint" - }, - "test": { - "executor": "@nx/jest:jest", - "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], - "options": { - "jestConfig": "apps/documentations/jest.config.ts" - } - }, - "serve-static": { - "executor": "@nx/web:file-server", - "options": { - "buildTarget": "documentations:build", - "port": 4200, - "staticFilePath": "dist/apps/documentations/browser", - "spa": true - } - } - } -} diff --git a/apps/documentations/src/app/app.component.html b/apps/documentations/src/app/app.component.html deleted file mode 100644 index c7523b2..0000000 --- a/apps/documentations/src/app/app.component.html +++ /dev/null @@ -1,261 +0,0 @@ - - - - haloe - - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Placeat quo - commodi optio ab perspiciatis quae obcaecati est, sit voluptatibus. Ea - temporibus laboriosam soluta sequi corrupti aperiam officia consequuntur - autem obcaecati. - - - - - - - haloe - - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Placeat quo - commodi optio ab perspiciatis quae obcaecati est, sit voluptatibus. Ea - temporibus laboriosam soluta sequi corrupti aperiam officia consequuntur - autem obcaecati. - - - - - - - haloe - - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Placeat quo - commodi optio ab perspiciatis quae obcaecati est, sit voluptatibus. Ea - temporibus laboriosam soluta sequi corrupti aperiam officia consequuntur - autem obcaecati. - - - - - - - haloe - - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Placeat quo - commodi optio ab perspiciatis quae obcaecati est, sit voluptatibus. Ea - temporibus laboriosam soluta sequi corrupti aperiam officia consequuntur - autem obcaecati. - - - - - - - haloe - - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Placeat quo - commodi optio ab perspiciatis quae obcaecati est, sit voluptatibus. Ea - temporibus laboriosam soluta sequi corrupti aperiam officia consequuntur - autem obcaecati. - - - - - - - haloe - - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Placeat quo - commodi optio ab perspiciatis quae obcaecati est, sit voluptatibus. Ea - temporibus laboriosam soluta sequi corrupti aperiam officia consequuntur - autem obcaecati. - - - - - - - haloe - - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Placeat quo - commodi optio ab perspiciatis quae obcaecati est, sit voluptatibus. Ea - temporibus laboriosam soluta sequi corrupti aperiam officia consequuntur - autem obcaecati. - - - - - - - haloe - - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Placeat quo - commodi optio ab perspiciatis quae obcaecati est, sit voluptatibus. Ea - temporibus laboriosam soluta sequi corrupti aperiam officia consequuntur - autem obcaecati. - - - - - - - haloe - - - Lorem ipsum dolor sit amet consectetur adipisicing elit. Placeat quo - commodi optio ab perspiciatis quae obcaecati est, sit voluptatibus. Ea - temporibus laboriosam soluta sequi corrupti aperiam officia consequuntur - autem obcaecati. - - - diff --git a/apps/documentations/src/app/app.component.ts b/apps/documentations/src/app/app.component.ts deleted file mode 100644 index 3c990bc..0000000 --- a/apps/documentations/src/app/app.component.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { - NgxPrimerAccordionContentComponent, - NgxPrimerAccordionItemComponent, - NgxPrimerAccordionRootComponent, - NgxPrimerAccordionRootThemeVariantDirective, - NgxPrimerAccordionTriggerComponent, -} from '@ngx-primer/primitive/accordion'; - -import { Component } from '@angular/core'; -import { NgxPrimerIdGeneratorDirective } from '@ngx-primer/primitive/utilities'; -import { RouterModule } from '@angular/router'; - -@Component({ - standalone: true, - imports: [ - RouterModule, - NgxPrimerAccordionRootComponent, - NgxPrimerAccordionItemComponent, - NgxPrimerAccordionContentComponent, - NgxPrimerAccordionTriggerComponent, - NgxPrimerAccordionRootThemeVariantDirective, - NgxPrimerIdGeneratorDirective, - ], - selector: 'app-root', - templateUrl: './app.component.html', - styleUrl: './app.component.scss', -}) -export class AppComponent { - title = 'documentations'; -} diff --git a/apps/documentations/src/test-setup.ts b/apps/documentations/src/test-setup.ts deleted file mode 100644 index ab1eeeb..0000000 --- a/apps/documentations/src/test-setup.ts +++ /dev/null @@ -1,8 +0,0 @@ -// @ts-expect-error https://thymikee.github.io/jest-preset-angular/docs/getting-started/test-environment -globalThis.ngJest = { - testEnvironmentOptions: { - errorOnUnknownElements: true, - errorOnUnknownProperties: true, - }, -}; -import 'jest-preset-angular/setup-jest'; diff --git a/apps/documentations/tsconfig.app.json b/apps/documentations/tsconfig.app.json deleted file mode 100644 index b135cc8..0000000 --- a/apps/documentations/tsconfig.app.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "../../dist/out-tsc", - "types": ["node"] - }, - "files": ["src/main.ts", "src/main.server.ts", "server.ts"], - "include": ["src/**/*.d.ts", "src/app/pages/**/*.page.ts"], - "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] -} diff --git a/apps/documentations/tsconfig.editor.json b/apps/documentations/tsconfig.editor.json deleted file mode 100644 index a8ac182..0000000 --- a/apps/documentations/tsconfig.editor.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": "./tsconfig.json", - "include": ["src/**/*.ts"], - "compilerOptions": {}, - "exclude": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts"] -} diff --git a/apps/documentations/tsconfig.spec.json b/apps/documentations/tsconfig.spec.json deleted file mode 100644 index 53fbfcd..0000000 --- a/apps/documentations/tsconfig.spec.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "../../dist/out-tsc", - "module": "commonjs", - "target": "es2016", - "types": ["jest", "node"] - }, - "files": ["src/test-setup.ts"], - "include": [ - "jest.config.ts", - "src/**/*.test.ts", - "src/**/*.spec.ts", - "src/**/*.d.ts" - ] -} diff --git a/apps/documentations/vite.config.ts b/apps/documentations/vite.config.ts deleted file mode 100644 index 1108290..0000000 --- a/apps/documentations/vite.config.ts +++ /dev/null @@ -1,53 +0,0 @@ -/// - -import analog from '@analogjs/platform'; -import angular from '@analogjs/vite-plugin-angular'; -import { defineConfig } from 'vite'; -import { nxViteTsPaths } from '@nx/vite/plugins/nx-tsconfig-paths.plugin'; -import tailwindcss from 'tailwindcss'; -import tsconfigPaths from 'vite-tsconfig-paths'; - -// https://vitejs.dev/config/ -export default defineConfig(({ mode }) => { - return { - root: __dirname, - cacheDir: '../../node_modules/.vite', - build: { - outDir: '../../dist/apps/documentations/client', - reportCompressedSize: true, - target: ['es2020'], - }, - plugins: [ - analog({ - ssr: false, - static: true, - prerender: { - routes: [], - }, - }), - angular(), - nxViteTsPaths(), - tsconfigPaths(), - ], - server: { - fs: { - allow: ['.'], - }, - }, - test: { - globals: true, - environment: 'jsdom', - setupFiles: ['src/test-setup.ts'], - include: ['**/*.spec.ts'], - reporters: ['default'], - }, - define: { - 'import.meta.vitest': mode !== 'production', - }, - css: { - postcss: { - plugins: [tailwindcss], - }, - }, - }; -}); diff --git a/apps/documentations-e2e/eslint.config.js b/apps/playground-e2e/eslint.config.js similarity index 100% rename from apps/documentations-e2e/eslint.config.js rename to apps/playground-e2e/eslint.config.js diff --git a/apps/documentations-e2e/playwright.config.ts b/apps/playground-e2e/playwright.config.ts similarity index 96% rename from apps/documentations-e2e/playwright.config.ts rename to apps/playground-e2e/playwright.config.ts index 8ca737b..8c3f9b1 100644 --- a/apps/documentations-e2e/playwright.config.ts +++ b/apps/playground-e2e/playwright.config.ts @@ -25,7 +25,7 @@ export default defineConfig({ }, /* Run your local dev server before starting the tests */ webServer: { - command: 'pnpm exec nx run documentations:serve', + command: 'pnpm exec nx run playground:serve', url: 'http://localhost:4200', reuseExistingServer: !process.env.CI, cwd: workspaceRoot, diff --git a/apps/playground-e2e/project.json b/apps/playground-e2e/project.json new file mode 100644 index 0000000..f85e591 --- /dev/null +++ b/apps/playground-e2e/project.json @@ -0,0 +1,9 @@ +{ + "name": "playground-e2e", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "projectType": "application", + "sourceRoot": "apps/playground-e2e/src", + "implicitDependencies": ["playground"], + "// targets": "to see all targets run: nx show project playground-e2e --web", + "targets": {} +} diff --git a/apps/documentations-e2e/src/example.spec.ts b/apps/playground-e2e/src/example.spec.ts similarity index 100% rename from apps/documentations-e2e/src/example.spec.ts rename to apps/playground-e2e/src/example.spec.ts diff --git a/apps/documentations-e2e/tsconfig.json b/apps/playground-e2e/tsconfig.json similarity index 100% rename from apps/documentations-e2e/tsconfig.json rename to apps/playground-e2e/tsconfig.json diff --git a/apps/documentations/eslint.config.cjs b/apps/playground/eslint.config.js similarity index 100% rename from apps/documentations/eslint.config.cjs rename to apps/playground/eslint.config.js diff --git a/apps/playground/project.json b/apps/playground/project.json new file mode 100644 index 0000000..7ff4daa --- /dev/null +++ b/apps/playground/project.json @@ -0,0 +1,88 @@ +{ + "name": "playground", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "projectType": "application", + "prefix": "app", + "sourceRoot": "apps/playground/src", + "tags": ["ngx-primer-playground"], + "targets": { + "build": { + "executor": "@angular-devkit/build-angular:application", + "outputs": ["{options.outputPath}"], + "options": { + "outputPath": "dist/apps/playground", + "index": "apps/playground/src/index.html", + "browser": "apps/playground/src/main.ts", + "polyfills": ["zone.js"], + "tsConfig": "apps/playground/tsconfig.app.json", + "inlineStyleLanguage": "scss", + "assets": [ + { + "glob": "**/*", + "input": "apps/playground/public" + } + ], + "styles": ["apps/playground/src/styles.scss"], + "scripts": [], + "server": "apps/playground/src/main.server.ts", + "prerender": true, + "ssr": { + "entry": "apps/playground/server.ts" + } + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "500kb", + "maximumError": "1mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "2kb", + "maximumError": "4kb" + } + ], + "outputHashing": "all" + }, + "development": { + "optimization": false, + "extractLicenses": false, + "sourceMap": true + } + }, + "defaultConfiguration": "production" + }, + "serve": { + "executor": "@angular-devkit/build-angular:dev-server", + "configurations": { + "production": { + "buildTarget": "playground:build:production" + }, + "development": { + "buildTarget": "playground:build:development" + } + }, + "defaultConfiguration": "development" + }, + "extract-i18n": { + "executor": "@angular-devkit/build-angular:extract-i18n", + "options": { + "buildTarget": "playground:build" + } + }, + "lint": { + "executor": "@nx/eslint:lint" + }, + "serve-static": { + "executor": "@nx/web:file-server", + "options": { + "buildTarget": "playground:build", + "port": 4200, + "staticFilePath": "dist/apps/playground/browser", + "spa": true + } + } + } +} diff --git a/apps/documentations/public/favicon.ico b/apps/playground/public/favicon.ico similarity index 100% rename from apps/documentations/public/favicon.ico rename to apps/playground/public/favicon.ico diff --git a/apps/documentations/server.ts b/apps/playground/server.ts similarity index 100% rename from apps/documentations/server.ts rename to apps/playground/server.ts diff --git a/apps/playground/src/app/app.component.html b/apps/playground/src/app/app.component.html new file mode 100644 index 0000000..dc08bba --- /dev/null +++ b/apps/playground/src/app/app.component.html @@ -0,0 +1,107 @@ +
+ + @for (item of accordionData; track $index) { + + +
+ {{ item.label }} +
+
+ +
+
+ + + + {{ item.content }} + + +
+ } +
+ + + @for (item of accordion2Data; track $index) { + + +
+ {{ item.label }} +
+
+ +
+
+ + + {{ item.content }} + + +
+ } +
+
\ No newline at end of file diff --git a/apps/documentations/src/app/app.component.scss b/apps/playground/src/app/app.component.scss similarity index 100% rename from apps/documentations/src/app/app.component.scss rename to apps/playground/src/app/app.component.scss diff --git a/apps/documentations/src/app/app.component.spec.ts b/apps/playground/src/app/app.component.spec.ts similarity index 85% rename from apps/documentations/src/app/app.component.spec.ts rename to apps/playground/src/app/app.component.spec.ts index d8ae232..fe1d21a 100644 --- a/apps/documentations/src/app/app.component.spec.ts +++ b/apps/playground/src/app/app.component.spec.ts @@ -15,13 +15,13 @@ describe('AppComponent', () => { fixture.detectChanges(); const compiled = fixture.nativeElement as HTMLElement; expect(compiled.querySelector('h1')?.textContent).toContain( - 'Welcome documentations' + 'Welcome playground' ); }); - it(`should have as title 'documentations'`, () => { + it(`should have as title 'playground'`, () => { const fixture = TestBed.createComponent(AppComponent); const app = fixture.componentInstance; - expect(app.title).toEqual('documentations'); + expect(app.title).toEqual('playground'); }); }); diff --git a/apps/playground/src/app/app.component.ts b/apps/playground/src/app/app.component.ts new file mode 100644 index 0000000..53f99cf --- /dev/null +++ b/apps/playground/src/app/app.component.ts @@ -0,0 +1,119 @@ +import { NgIcon, provideIcons } from '@ng-icons/core'; +import { + NgxPrimerAccordionContentComponent, + NgxPrimerAccordionItemComponent, + NgxPrimerAccordionRootComponent, + NgxPrimerAccordionTriggerComponent, + NgxPrimerCollapseExpandAnimationDirective, + collapseExpandAnimation, +} from '@ngx-primer/primitive/accordion'; +import { + heroChevronDownMini, + heroChevronUpMini, +} from '@ng-icons/heroicons/mini'; + +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +@Component({ + standalone: true, + imports: [ + CommonModule, + RouterModule, + NgIcon, + NgxPrimerAccordionRootComponent, + NgxPrimerAccordionItemComponent, + NgxPrimerAccordionTriggerComponent, + NgxPrimerAccordionContentComponent, + NgxPrimerCollapseExpandAnimationDirective, + ], + selector: 'app-root', + templateUrl: './app.component.html', + styleUrl: './app.component.scss', + viewProviders: [ + provideIcons({ + heroChevronDownMini, + heroChevronUpMini, + }), + ], + animations: [collapseExpandAnimation], +}) +export class AppComponent { + title = 'playground'; + accordionData = [ + { + label: 'Introduction', + value: 'intro', + content: + 'Welcome to our platform! Here, you’ll learn about our purpose, the problem we solve, and how we aim to make your life easier.', + }, + { + label: 'Features', + value: 'features', + content: + 'Explore a range of features, including real-time collaboration, intuitive design tools, and seamless integrations with popular apps.', + }, + { + label: 'Usage Guidelines', + value: 'usage', + content: + 'Follow these simple guidelines to get the most out of our platform, from account setup to leveraging advanced functionalities.', + }, + { + label: 'FAQs', + value: 'faqs', + content: + 'Have questions? Check out our Frequently Asked Questions to find answers on account management, pricing, and troubleshooting. lorem kflkldskkklsklkdlksskdkldkskldklkdkl k sdlmlmlkfsdk k klmlk kkmeklm', + }, + { + label: 'Contact Us', + value: 'contact', + content: + 'Need help? Reach out to our support team via email, phone, or live chat. We’re here to assist you 24/7.', + }, + { + label: 'Other Ask', + value: 'other-ask', + content: + 'Need help? Reach out to our support team via email, phone, or live chat. We’re here to assist you 24/7.', + }, + ] as const; + + accordionVal = this.accordionData[5].value; + + accordion2Data = [ + { + label: 'About Our Company', + value: 'about', + content: + 'Learn about our journey, mission, and the core values that drive us to deliver exceptional products and services.', + }, + { + label: 'How It Works', + value: 'how-it-works', + content: + 'Understand the step-by-step process of how our platform functions, from signing up to achieving your goals.', + }, + { + label: 'Pricing Plans', + value: 'pricing', + content: + 'Discover our flexible pricing options designed to meet the needs of individuals, startups, and enterprises.', + }, + { + label: 'Customer Success Stories', + value: 'success-stories', + content: + 'Read inspiring stories of how our platform has helped customers achieve success in their projects and businesses.', + }, + { + label: 'Get Started', + value: 'get-started', + content: + 'Ready to begin? Follow our quick start guide to set up your account and start using our platform in minutes.', + }, + ] as const; + + accordion2Val = this.accordion2Data[1].value; +} diff --git a/apps/documentations/src/app/app.config.server.ts b/apps/playground/src/app/app.config.server.ts similarity index 54% rename from apps/documentations/src/app/app.config.server.ts rename to apps/playground/src/app/app.config.server.ts index 38fe8ae..1980cfe 100644 --- a/apps/documentations/src/app/app.config.server.ts +++ b/apps/playground/src/app/app.config.server.ts @@ -1,11 +1,9 @@ -import { ApplicationConfig, mergeApplicationConfig } from '@angular/core'; - -import { appConfig } from './app.config'; -import { provideClientHydration } from '@angular/platform-browser'; +import { mergeApplicationConfig, ApplicationConfig } from '@angular/core'; import { provideServerRendering } from '@angular/platform-server'; +import { appConfig } from './app.config'; const serverConfig: ApplicationConfig = { - providers: [provideServerRendering(), provideClientHydration()], + providers: [provideServerRendering()], }; export const config = mergeApplicationConfig(appConfig, serverConfig); diff --git a/apps/documentations/src/app/app.config.ts b/apps/playground/src/app/app.config.ts similarity index 81% rename from apps/documentations/src/app/app.config.ts rename to apps/playground/src/app/app.config.ts index 72e26cc..8600b9b 100644 --- a/apps/documentations/src/app/app.config.ts +++ b/apps/playground/src/app/app.config.ts @@ -1,11 +1,13 @@ import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core'; import { appRoutes } from './app.routes'; +import { provideAnimations } from '@angular/platform-browser/animations'; import { provideClientHydration } from '@angular/platform-browser'; import { provideRouter } from '@angular/router'; export const appConfig: ApplicationConfig = { providers: [ + provideAnimations(), provideClientHydration(), provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(appRoutes), diff --git a/apps/documentations/src/app/app.routes.ts b/apps/playground/src/app/app.routes.ts similarity index 100% rename from apps/documentations/src/app/app.routes.ts rename to apps/playground/src/app/app.routes.ts diff --git a/apps/documentations/src/app/nx-welcome.component.ts b/apps/playground/src/app/nx-welcome.component.ts similarity index 99% rename from apps/documentations/src/app/nx-welcome.component.ts rename to apps/playground/src/app/nx-welcome.component.ts index 54b8e80..f899c0a 100644 --- a/apps/documentations/src/app/nx-welcome.component.ts +++ b/apps/playground/src/app/nx-welcome.component.ts @@ -433,7 +433,7 @@ import { CommonModule } from '@angular/common';

Hello there, - Welcome documentations 👋 + Welcome playground 👋

@@ -742,11 +742,7 @@ import { CommonModule } from '@angular/common';

Your Nx Cloud remote cache setup is almost complete.

- + Click here to finish @@ -799,7 +795,7 @@ nx run-many -t build test lint View project details -
nx show project documentations
+
nx show project playground
diff --git a/apps/playground/src/index.html b/apps/playground/src/index.html new file mode 100644 index 0000000..2831728 --- /dev/null +++ b/apps/playground/src/index.html @@ -0,0 +1,13 @@ + + + + + playground + + + + + + + + diff --git a/apps/documentations/src/main.server.ts b/apps/playground/src/main.server.ts similarity index 91% rename from apps/documentations/src/main.server.ts rename to apps/playground/src/main.server.ts index 8c505f3..4b9d4d1 100644 --- a/apps/documentations/src/main.server.ts +++ b/apps/playground/src/main.server.ts @@ -1,7 +1,5 @@ -import 'zone.js/node'; - -import { AppComponent } from './app/app.component'; import { bootstrapApplication } from '@angular/platform-browser'; +import { AppComponent } from './app/app.component'; import { config } from './app/app.config.server'; const bootstrap = () => bootstrapApplication(AppComponent, config); diff --git a/apps/documentations/src/main.ts b/apps/playground/src/main.ts similarity index 93% rename from apps/documentations/src/main.ts rename to apps/playground/src/main.ts index 1b4a52a..424b367 100644 --- a/apps/documentations/src/main.ts +++ b/apps/playground/src/main.ts @@ -1,7 +1,6 @@ -import 'zone.js'; -import { bootstrapApplication } from '@angular/platform-browser'; -import { appConfig } from './app/app.config'; import { AppComponent } from './app/app.component'; +import { appConfig } from './app/app.config'; +import { bootstrapApplication } from '@angular/platform-browser'; bootstrapApplication(AppComponent, appConfig).catch((err) => console.error(err) diff --git a/apps/documentations/src/styles.scss b/apps/playground/src/styles.scss similarity index 100% rename from apps/documentations/src/styles.scss rename to apps/playground/src/styles.scss diff --git a/apps/playground/src/test-setup.ts b/apps/playground/src/test-setup.ts new file mode 100644 index 0000000..318c3b9 --- /dev/null +++ b/apps/playground/src/test-setup.ts @@ -0,0 +1,12 @@ +import '@analogjs/vitest-angular/setup-zone'; + +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting, +} from '@angular/platform-browser-dynamic/testing'; +import { getTestBed } from '@angular/core/testing'; + +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() +); diff --git a/apps/playground/tailwind-base.config.ts b/apps/playground/tailwind-base.config.ts new file mode 100644 index 0000000..333d1f5 --- /dev/null +++ b/apps/playground/tailwind-base.config.ts @@ -0,0 +1,1075 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: [], + presets: [], + darkMode: 'media', // or 'class' + theme: { + accentColor: ({ theme }) => ({ + ...theme('colors'), + auto: 'auto', + }), + animation: { + none: 'none', + spin: 'spin 1s linear infinite', + ping: 'ping 1s cubic-bezier(0, 0, 0.2, 1) infinite', + pulse: 'pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite', + bounce: 'bounce 1s infinite', + }, + aria: { + busy: 'busy="true"', + checked: 'checked="true"', + disabled: 'disabled="true"', + expanded: 'expanded="true"', + hidden: 'hidden="true"', + pressed: 'pressed="true"', + readonly: 'readonly="true"', + required: 'required="true"', + selected: 'selected="true"', + }, + aspectRatio: { + auto: 'auto', + square: '1 / 1', + video: '16 / 9', + }, + backdropBlur: ({ theme }) => theme('blur'), + backdropBrightness: ({ theme }) => theme('brightness'), + backdropContrast: ({ theme }) => theme('contrast'), + backdropGrayscale: ({ theme }) => theme('grayscale'), + backdropHueRotate: ({ theme }) => theme('hueRotate'), + backdropInvert: ({ theme }) => theme('invert'), + backdropOpacity: ({ theme }) => theme('opacity'), + backdropSaturate: ({ theme }) => theme('saturate'), + backdropSepia: ({ theme }) => theme('sepia'), + backgroundColor: ({ theme }) => theme('colors'), + backgroundImage: { + none: 'none', + 'gradient-to-t': 'linear-gradient(to top, var(--tw-gradient-stops))', + 'gradient-to-tr': + 'linear-gradient(to top right, var(--tw-gradient-stops))', + 'gradient-to-r': 'linear-gradient(to right, var(--tw-gradient-stops))', + 'gradient-to-br': + 'linear-gradient(to bottom right, var(--tw-gradient-stops))', + 'gradient-to-b': 'linear-gradient(to bottom, var(--tw-gradient-stops))', + 'gradient-to-bl': + 'linear-gradient(to bottom left, var(--tw-gradient-stops))', + 'gradient-to-l': 'linear-gradient(to left, var(--tw-gradient-stops))', + 'gradient-to-tl': + 'linear-gradient(to top left, var(--tw-gradient-stops))', + }, + backgroundOpacity: ({ theme }) => theme('opacity'), + backgroundPosition: { + bottom: 'bottom', + center: 'center', + left: 'left', + 'left-bottom': 'left bottom', + 'left-top': 'left top', + right: 'right', + 'right-bottom': 'right bottom', + 'right-top': 'right top', + top: 'top', + }, + backgroundSize: { + auto: 'auto', + cover: 'cover', + contain: 'contain', + }, + blur: { + 0: '0', + none: '', + sm: '4px', + DEFAULT: '8px', + md: '12px', + lg: '16px', + xl: '24px', + '2xl': '40px', + '3xl': '64px', + }, + borderColor: ({ theme }) => ({ + ...theme('colors'), + DEFAULT: theme('colors.gray.200', 'currentColor'), + }), + borderOpacity: ({ theme }) => theme('opacity'), + borderRadius: { + none: '0px', + sm: '0.125rem', + DEFAULT: '0.25rem', + md: '0.375rem', + lg: '0.5rem', + xl: '0.75rem', + '2xl': '1rem', + '3xl': '1.5rem', + full: '9999px', + }, + borderSpacing: ({ theme }) => ({ + ...theme('spacing'), + }), + borderWidth: { + DEFAULT: '1px', + 0: '0px', + 2: '2px', + 4: '4px', + 8: '8px', + }, + boxShadow: { + sm: '0 1px 2px 0 rgb(0 0 0 / 0.05)', + DEFAULT: '0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1)', + md: '0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)', + lg: '0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)', + xl: '0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)', + '2xl': '0 25px 50px -12px rgb(0 0 0 / 0.25)', + inner: 'inset 0 2px 4px 0 rgb(0 0 0 / 0.05)', + none: 'none', + }, + boxShadowColor: ({ theme }) => theme('colors'), + brightness: { + 0: '0', + 50: '.5', + 75: '.75', + 90: '.9', + 95: '.95', + 100: '1', + 105: '1.05', + 110: '1.1', + 125: '1.25', + 150: '1.5', + 200: '2', + }, + caretColor: ({ theme }) => theme('colors'), + colors: ({ colors }) => ({ + inherit: colors.inherit, + current: colors.current, + transparent: colors.transparent, + black: colors.black, + white: colors.white, + slate: colors.slate, + gray: colors.gray, + zinc: colors.zinc, + neutral: colors.neutral, + stone: colors.stone, + red: colors.red, + orange: colors.orange, + amber: colors.amber, + yellow: colors.yellow, + lime: colors.lime, + green: colors.green, + emerald: colors.emerald, + teal: colors.teal, + cyan: colors.cyan, + sky: colors.sky, + blue: colors.blue, + indigo: colors.indigo, + violet: colors.violet, + purple: colors.purple, + fuchsia: colors.fuchsia, + pink: colors.pink, + rose: colors.rose, + }), + columns: { + auto: 'auto', + 1: '1', + 2: '2', + 3: '3', + 4: '4', + 5: '5', + 6: '6', + 7: '7', + 8: '8', + 9: '9', + 10: '10', + 11: '11', + 12: '12', + '3xs': '16rem', + '2xs': '18rem', + xs: '20rem', + sm: '24rem', + md: '28rem', + lg: '32rem', + xl: '36rem', + '2xl': '42rem', + '3xl': '48rem', + '4xl': '56rem', + '5xl': '64rem', + '6xl': '72rem', + '7xl': '80rem', + }, + container: {}, + content: { + none: 'none', + }, + contrast: { + 0: '0', + 50: '.5', + 75: '.75', + 100: '1', + 125: '1.25', + 150: '1.5', + 200: '2', + }, + cursor: { + auto: 'auto', + default: 'default', + pointer: 'pointer', + wait: 'wait', + text: 'text', + move: 'move', + help: 'help', + 'not-allowed': 'not-allowed', + none: 'none', + 'context-menu': 'context-menu', + progress: 'progress', + cell: 'cell', + crosshair: 'crosshair', + 'vertical-text': 'vertical-text', + alias: 'alias', + copy: 'copy', + 'no-drop': 'no-drop', + grab: 'grab', + grabbing: 'grabbing', + 'all-scroll': 'all-scroll', + 'col-resize': 'col-resize', + 'row-resize': 'row-resize', + 'n-resize': 'n-resize', + 'e-resize': 'e-resize', + 's-resize': 's-resize', + 'w-resize': 'w-resize', + 'ne-resize': 'ne-resize', + 'nw-resize': 'nw-resize', + 'se-resize': 'se-resize', + 'sw-resize': 'sw-resize', + 'ew-resize': 'ew-resize', + 'ns-resize': 'ns-resize', + 'nesw-resize': 'nesw-resize', + 'nwse-resize': 'nwse-resize', + 'zoom-in': 'zoom-in', + 'zoom-out': 'zoom-out', + }, + divideColor: ({ theme }) => theme('borderColor'), + divideOpacity: ({ theme }) => theme('borderOpacity'), + divideWidth: ({ theme }) => theme('borderWidth'), + dropShadow: { + sm: '0 1px 1px rgb(0 0 0 / 0.05)', + DEFAULT: ['0 1px 2px rgb(0 0 0 / 0.1)', '0 1px 1px rgb(0 0 0 / 0.06)'], + md: ['0 4px 3px rgb(0 0 0 / 0.07)', '0 2px 2px rgb(0 0 0 / 0.06)'], + lg: ['0 10px 8px rgb(0 0 0 / 0.04)', '0 4px 3px rgb(0 0 0 / 0.1)'], + xl: ['0 20px 13px rgb(0 0 0 / 0.03)', '0 8px 5px rgb(0 0 0 / 0.08)'], + '2xl': '0 25px 25px rgb(0 0 0 / 0.15)', + none: '0 0 #0000', + }, + fill: ({ theme }) => ({ + none: 'none', + ...theme('colors'), + }), + flex: { + 1: '1 1 0%', + auto: '1 1 auto', + initial: '0 1 auto', + none: 'none', + }, + flexBasis: ({ theme }) => ({ + auto: 'auto', + ...theme('spacing'), + '1/2': '50%', + '1/3': '33.333333%', + '2/3': '66.666667%', + '1/4': '25%', + '2/4': '50%', + '3/4': '75%', + '1/5': '20%', + '2/5': '40%', + '3/5': '60%', + '4/5': '80%', + '1/6': '16.666667%', + '2/6': '33.333333%', + '3/6': '50%', + '4/6': '66.666667%', + '5/6': '83.333333%', + '1/12': '8.333333%', + '2/12': '16.666667%', + '3/12': '25%', + '4/12': '33.333333%', + '5/12': '41.666667%', + '6/12': '50%', + '7/12': '58.333333%', + '8/12': '66.666667%', + '9/12': '75%', + '10/12': '83.333333%', + '11/12': '91.666667%', + full: '100%', + }), + flexGrow: { + 0: '0', + DEFAULT: '1', + }, + flexShrink: { + 0: '0', + DEFAULT: '1', + }, + fontFamily: { + sans: [ + 'ui-sans-serif', + 'system-ui', + 'sans-serif', + '"Apple Color Emoji"', + '"Segoe UI Emoji"', + '"Segoe UI Symbol"', + '"Noto Color Emoji"', + ], + serif: [ + 'ui-serif', + 'Georgia', + 'Cambria', + '"Times New Roman"', + 'Times', + 'serif', + ], + mono: [ + 'ui-monospace', + 'SFMono-Regular', + 'Menlo', + 'Monaco', + 'Consolas', + '"Liberation Mono"', + '"Courier New"', + 'monospace', + ], + }, + fontSize: { + xs: ['0.75rem', { lineHeight: '1rem' }], + sm: ['0.875rem', { lineHeight: '1.25rem' }], + base: ['1rem', { lineHeight: '1.5rem' }], + lg: ['1.125rem', { lineHeight: '1.75rem' }], + xl: ['1.25rem', { lineHeight: '1.75rem' }], + '2xl': ['1.5rem', { lineHeight: '2rem' }], + '3xl': ['1.875rem', { lineHeight: '2.25rem' }], + '4xl': ['2.25rem', { lineHeight: '2.5rem' }], + '5xl': ['3rem', { lineHeight: '1' }], + '6xl': ['3.75rem', { lineHeight: '1' }], + '7xl': ['4.5rem', { lineHeight: '1' }], + '8xl': ['6rem', { lineHeight: '1' }], + '9xl': ['8rem', { lineHeight: '1' }], + }, + fontWeight: { + thin: '100', + extralight: '200', + light: '300', + normal: '400', + medium: '500', + semibold: '600', + bold: '700', + extrabold: '800', + black: '900', + }, + gap: ({ theme }) => theme('spacing'), + gradientColorStops: ({ theme }) => theme('colors'), + gradientColorStopPositions: { + '0%': '0%', + '5%': '5%', + '10%': '10%', + '15%': '15%', + '20%': '20%', + '25%': '25%', + '30%': '30%', + '35%': '35%', + '40%': '40%', + '45%': '45%', + '50%': '50%', + '55%': '55%', + '60%': '60%', + '65%': '65%', + '70%': '70%', + '75%': '75%', + '80%': '80%', + '85%': '85%', + '90%': '90%', + '95%': '95%', + '100%': '100%', + }, + grayscale: { + 0: '0', + DEFAULT: '100%', + }, + gridAutoColumns: { + auto: 'auto', + min: 'min-content', + max: 'max-content', + fr: 'minmax(0, 1fr)', + }, + gridAutoRows: { + auto: 'auto', + min: 'min-content', + max: 'max-content', + fr: 'minmax(0, 1fr)', + }, + gridColumn: { + auto: 'auto', + 'span-1': 'span 1 / span 1', + 'span-2': 'span 2 / span 2', + 'span-3': 'span 3 / span 3', + 'span-4': 'span 4 / span 4', + 'span-5': 'span 5 / span 5', + 'span-6': 'span 6 / span 6', + 'span-7': 'span 7 / span 7', + 'span-8': 'span 8 / span 8', + 'span-9': 'span 9 / span 9', + 'span-10': 'span 10 / span 10', + 'span-11': 'span 11 / span 11', + 'span-12': 'span 12 / span 12', + 'span-full': '1 / -1', + }, + gridColumnEnd: { + auto: 'auto', + 1: '1', + 2: '2', + 3: '3', + 4: '4', + 5: '5', + 6: '6', + 7: '7', + 8: '8', + 9: '9', + 10: '10', + 11: '11', + 12: '12', + 13: '13', + }, + gridColumnStart: { + auto: 'auto', + 1: '1', + 2: '2', + 3: '3', + 4: '4', + 5: '5', + 6: '6', + 7: '7', + 8: '8', + 9: '9', + 10: '10', + 11: '11', + 12: '12', + 13: '13', + }, + gridRow: { + auto: 'auto', + 'span-1': 'span 1 / span 1', + 'span-2': 'span 2 / span 2', + 'span-3': 'span 3 / span 3', + 'span-4': 'span 4 / span 4', + 'span-5': 'span 5 / span 5', + 'span-6': 'span 6 / span 6', + 'span-7': 'span 7 / span 7', + 'span-8': 'span 8 / span 8', + 'span-9': 'span 9 / span 9', + 'span-10': 'span 10 / span 10', + 'span-11': 'span 11 / span 11', + 'span-12': 'span 12 / span 12', + 'span-full': '1 / -1', + }, + gridRowEnd: { + auto: 'auto', + 1: '1', + 2: '2', + 3: '3', + 4: '4', + 5: '5', + 6: '6', + 7: '7', + 8: '8', + 9: '9', + 10: '10', + 11: '11', + 12: '12', + 13: '13', + }, + gridRowStart: { + auto: 'auto', + 1: '1', + 2: '2', + 3: '3', + 4: '4', + 5: '5', + 6: '6', + 7: '7', + 8: '8', + 9: '9', + 10: '10', + 11: '11', + 12: '12', + 13: '13', + }, + gridTemplateColumns: { + none: 'none', + subgrid: 'subgrid', + 1: 'repeat(1, minmax(0, 1fr))', + 2: 'repeat(2, minmax(0, 1fr))', + 3: 'repeat(3, minmax(0, 1fr))', + 4: 'repeat(4, minmax(0, 1fr))', + 5: 'repeat(5, minmax(0, 1fr))', + 6: 'repeat(6, minmax(0, 1fr))', + 7: 'repeat(7, minmax(0, 1fr))', + 8: 'repeat(8, minmax(0, 1fr))', + 9: 'repeat(9, minmax(0, 1fr))', + 10: 'repeat(10, minmax(0, 1fr))', + 11: 'repeat(11, minmax(0, 1fr))', + 12: 'repeat(12, minmax(0, 1fr))', + }, + gridTemplateRows: { + none: 'none', + subgrid: 'subgrid', + 1: 'repeat(1, minmax(0, 1fr))', + 2: 'repeat(2, minmax(0, 1fr))', + 3: 'repeat(3, minmax(0, 1fr))', + 4: 'repeat(4, minmax(0, 1fr))', + 5: 'repeat(5, minmax(0, 1fr))', + 6: 'repeat(6, minmax(0, 1fr))', + 7: 'repeat(7, minmax(0, 1fr))', + 8: 'repeat(8, minmax(0, 1fr))', + 9: 'repeat(9, minmax(0, 1fr))', + 10: 'repeat(10, minmax(0, 1fr))', + 11: 'repeat(11, minmax(0, 1fr))', + 12: 'repeat(12, minmax(0, 1fr))', + }, + height: ({ theme }) => ({ + auto: 'auto', + ...theme('spacing'), + '1/2': '50%', + '1/3': '33.333333%', + '2/3': '66.666667%', + '1/4': '25%', + '2/4': '50%', + '3/4': '75%', + '1/5': '20%', + '2/5': '40%', + '3/5': '60%', + '4/5': '80%', + '1/6': '16.666667%', + '2/6': '33.333333%', + '3/6': '50%', + '4/6': '66.666667%', + '5/6': '83.333333%', + full: '100%', + screen: '100vh', + svh: '100svh', + lvh: '100lvh', + dvh: '100dvh', + min: 'min-content', + max: 'max-content', + fit: 'fit-content', + }), + hueRotate: { + 0: '0deg', + 15: '15deg', + 30: '30deg', + 60: '60deg', + 90: '90deg', + 180: '180deg', + }, + inset: ({ theme }) => ({ + auto: 'auto', + ...theme('spacing'), + '1/2': '50%', + '1/3': '33.333333%', + '2/3': '66.666667%', + '1/4': '25%', + '2/4': '50%', + '3/4': '75%', + full: '100%', + }), + invert: { + 0: '0', + DEFAULT: '100%', + }, + keyframes: { + spin: { + to: { + transform: 'rotate(360deg)', + }, + }, + ping: { + '75%, 100%': { + transform: 'scale(2)', + opacity: '0', + }, + }, + pulse: { + '50%': { + opacity: '.5', + }, + }, + bounce: { + '0%, 100%': { + transform: 'translateY(-25%)', + animationTimingFunction: 'cubic-bezier(0.8,0,1,1)', + }, + '50%': { + transform: 'none', + animationTimingFunction: 'cubic-bezier(0,0,0.2,1)', + }, + }, + }, + letterSpacing: { + tighter: '-0.05em', + tight: '-0.025em', + normal: '0em', + wide: '0.025em', + wider: '0.05em', + widest: '0.1em', + }, + lineHeight: { + none: '1', + tight: '1.25', + snug: '1.375', + normal: '1.5', + relaxed: '1.625', + loose: '2', + 3: '.75rem', + 4: '1rem', + 5: '1.25rem', + 6: '1.5rem', + 7: '1.75rem', + 8: '2rem', + 9: '2.25rem', + 10: '2.5rem', + }, + listStyleType: { + none: 'none', + disc: 'disc', + decimal: 'decimal', + }, + listStyleImage: { + none: 'none', + }, + margin: ({ theme }) => ({ + auto: 'auto', + ...theme('spacing'), + }), + lineClamp: { + 1: '1', + 2: '2', + 3: '3', + 4: '4', + 5: '5', + 6: '6', + }, + maxHeight: ({ theme }) => ({ + ...theme('spacing'), + none: 'none', + full: '100%', + screen: '100vh', + svh: '100svh', + lvh: '100lvh', + dvh: '100dvh', + min: 'min-content', + max: 'max-content', + fit: 'fit-content', + }), + maxWidth: ({ theme, breakpoints }) => ({ + ...theme('spacing'), + none: 'none', + xs: '20rem', + sm: '24rem', + md: '28rem', + lg: '32rem', + xl: '36rem', + '2xl': '42rem', + '3xl': '48rem', + '4xl': '56rem', + '5xl': '64rem', + '6xl': '72rem', + '7xl': '80rem', + full: '100%', + min: 'min-content', + max: 'max-content', + fit: 'fit-content', + prose: '65ch', + ...breakpoints(theme('screens')), + }), + minHeight: ({ theme }) => ({ + ...theme('spacing'), + full: '100%', + screen: '100vh', + svh: '100svh', + lvh: '100lvh', + dvh: '100dvh', + min: 'min-content', + max: 'max-content', + fit: 'fit-content', + }), + minWidth: ({ theme }) => ({ + ...theme('spacing'), + full: '100%', + min: 'min-content', + max: 'max-content', + fit: 'fit-content', + }), + objectPosition: { + bottom: 'bottom', + center: 'center', + left: 'left', + 'left-bottom': 'left bottom', + 'left-top': 'left top', + right: 'right', + 'right-bottom': 'right bottom', + 'right-top': 'right top', + top: 'top', + }, + opacity: { + 0: '0', + 5: '0.05', + 10: '0.1', + 15: '0.15', + 20: '0.2', + 25: '0.25', + 30: '0.3', + 35: '0.35', + 40: '0.4', + 45: '0.45', + 50: '0.5', + 55: '0.55', + 60: '0.6', + 65: '0.65', + 70: '0.7', + 75: '0.75', + 80: '0.8', + 85: '0.85', + 90: '0.9', + 95: '0.95', + 100: '1', + }, + order: { + first: '-9999', + last: '9999', + none: '0', + 1: '1', + 2: '2', + 3: '3', + 4: '4', + 5: '5', + 6: '6', + 7: '7', + 8: '8', + 9: '9', + 10: '10', + 11: '11', + 12: '12', + }, + outlineColor: ({ theme }) => theme('colors'), + outlineOffset: { + 0: '0px', + 1: '1px', + 2: '2px', + 4: '4px', + 8: '8px', + }, + outlineWidth: { + 0: '0px', + 1: '1px', + 2: '2px', + 4: '4px', + 8: '8px', + }, + padding: ({ theme }) => theme('spacing'), + placeholderColor: ({ theme }) => theme('colors'), + placeholderOpacity: ({ theme }) => theme('opacity'), + ringColor: ({ theme }) => ({ + DEFAULT: theme('colors.blue.500', '#3b82f6'), + ...theme('colors'), + }), + ringOffsetColor: ({ theme }) => theme('colors'), + ringOffsetWidth: { + 0: '0px', + 1: '1px', + 2: '2px', + 4: '4px', + 8: '8px', + }, + ringOpacity: ({ theme }) => ({ + DEFAULT: '0.5', + ...theme('opacity'), + }), + ringWidth: { + DEFAULT: '3px', + 0: '0px', + 1: '1px', + 2: '2px', + 4: '4px', + 8: '8px', + }, + rotate: { + 0: '0deg', + 1: '1deg', + 2: '2deg', + 3: '3deg', + 6: '6deg', + 12: '12deg', + 45: '45deg', + 90: '90deg', + 180: '180deg', + }, + saturate: { + 0: '0', + 50: '.5', + 100: '1', + 150: '1.5', + 200: '2', + }, + scale: { + 0: '0', + 50: '.5', + 75: '.75', + 90: '.9', + 95: '.95', + 100: '1', + 105: '1.05', + 110: '1.1', + 125: '1.25', + 150: '1.5', + }, + screens: { + sm: '640px', + md: '768px', + lg: '1024px', + xl: '1280px', + '2xl': '1536px', + }, + scrollMargin: ({ theme }) => ({ + ...theme('spacing'), + }), + scrollPadding: ({ theme }) => theme('spacing'), + sepia: { + 0: '0', + DEFAULT: '100%', + }, + skew: { + 0: '0deg', + 1: '1deg', + 2: '2deg', + 3: '3deg', + 6: '6deg', + 12: '12deg', + }, + space: ({ theme }) => ({ + ...theme('spacing'), + }), + spacing: { + px: '1px', + 0: '0px', + 0.5: '0.125rem', + 1: '0.25rem', + 1.5: '0.375rem', + 2: '0.5rem', + 2.5: '0.625rem', + 3: '0.75rem', + 3.5: '0.875rem', + 4: '1rem', + 5: '1.25rem', + 6: '1.5rem', + 7: '1.75rem', + 8: '2rem', + 9: '2.25rem', + 10: '2.5rem', + 11: '2.75rem', + 12: '3rem', + 14: '3.5rem', + 16: '4rem', + 20: '5rem', + 24: '6rem', + 28: '7rem', + 32: '8rem', + 36: '9rem', + 40: '10rem', + 44: '11rem', + 48: '12rem', + 52: '13rem', + 56: '14rem', + 60: '15rem', + 64: '16rem', + 72: '18rem', + 80: '20rem', + 96: '24rem', + }, + stroke: ({ theme }) => ({ + none: 'none', + ...theme('colors'), + }), + strokeWidth: { + 0: '0', + 1: '1', + 2: '2', + }, + supports: {}, + data: {}, + textColor: ({ theme }) => theme('colors'), + textDecorationColor: ({ theme }) => theme('colors'), + textDecorationThickness: { + auto: 'auto', + 'from-font': 'from-font', + 0: '0px', + 1: '1px', + 2: '2px', + 4: '4px', + 8: '8px', + }, + textIndent: ({ theme }) => ({ + ...theme('spacing'), + }), + textOpacity: ({ theme }) => theme('opacity'), + textUnderlineOffset: { + auto: 'auto', + 0: '0px', + 1: '1px', + 2: '2px', + 4: '4px', + 8: '8px', + }, + transformOrigin: { + center: 'center', + top: 'top', + 'top-right': 'top right', + right: 'right', + 'bottom-right': 'bottom right', + bottom: 'bottom', + 'bottom-left': 'bottom left', + left: 'left', + 'top-left': 'top left', + }, + transitionDelay: { + 0: '0s', + 75: '75ms', + 100: '100ms', + 150: '150ms', + 200: '200ms', + 300: '300ms', + 500: '500ms', + 700: '700ms', + 1000: '1000ms', + }, + transitionDuration: { + DEFAULT: '150ms', + 0: '0s', + 75: '75ms', + 100: '100ms', + 150: '150ms', + 200: '200ms', + 300: '300ms', + 500: '500ms', + 700: '700ms', + 1000: '1000ms', + }, + transitionProperty: { + none: 'none', + all: 'all', + DEFAULT: + 'color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter', + colors: + 'color, background-color, border-color, text-decoration-color, fill, stroke', + opacity: 'opacity', + shadow: 'box-shadow', + transform: 'transform', + }, + transitionTimingFunction: { + DEFAULT: 'cubic-bezier(0.4, 0, 0.2, 1)', + linear: 'linear', + in: 'cubic-bezier(0.4, 0, 1, 1)', + out: 'cubic-bezier(0, 0, 0.2, 1)', + 'in-out': 'cubic-bezier(0.4, 0, 0.2, 1)', + }, + translate: ({ theme }) => ({ + ...theme('spacing'), + '1/2': '50%', + '1/3': '33.333333%', + '2/3': '66.666667%', + '1/4': '25%', + '2/4': '50%', + '3/4': '75%', + full: '100%', + }), + size: ({ theme }) => ({ + auto: 'auto', + ...theme('spacing'), + '1/2': '50%', + '1/3': '33.333333%', + '2/3': '66.666667%', + '1/4': '25%', + '2/4': '50%', + '3/4': '75%', + '1/5': '20%', + '2/5': '40%', + '3/5': '60%', + '4/5': '80%', + '1/6': '16.666667%', + '2/6': '33.333333%', + '3/6': '50%', + '4/6': '66.666667%', + '5/6': '83.333333%', + '1/12': '8.333333%', + '2/12': '16.666667%', + '3/12': '25%', + '4/12': '33.333333%', + '5/12': '41.666667%', + '6/12': '50%', + '7/12': '58.333333%', + '8/12': '66.666667%', + '9/12': '75%', + '10/12': '83.333333%', + '11/12': '91.666667%', + full: '100%', + min: 'min-content', + max: 'max-content', + fit: 'fit-content', + }), + width: ({ theme }) => ({ + auto: 'auto', + ...theme('spacing'), + '1/2': '50%', + '1/3': '33.333333%', + '2/3': '66.666667%', + '1/4': '25%', + '2/4': '50%', + '3/4': '75%', + '1/5': '20%', + '2/5': '40%', + '3/5': '60%', + '4/5': '80%', + '1/6': '16.666667%', + '2/6': '33.333333%', + '3/6': '50%', + '4/6': '66.666667%', + '5/6': '83.333333%', + '1/12': '8.333333%', + '2/12': '16.666667%', + '3/12': '25%', + '4/12': '33.333333%', + '5/12': '41.666667%', + '6/12': '50%', + '7/12': '58.333333%', + '8/12': '66.666667%', + '9/12': '75%', + '10/12': '83.333333%', + '11/12': '91.666667%', + full: '100%', + screen: '100vw', + svw: '100svw', + lvw: '100lvw', + dvw: '100dvw', + min: 'min-content', + max: 'max-content', + fit: 'fit-content', + }), + willChange: { + auto: 'auto', + scroll: 'scroll-position', + contents: 'contents', + transform: 'transform', + }, + zIndex: { + auto: 'auto', + 0: '0', + 10: '10', + 20: '20', + 30: '30', + 40: '40', + 50: '50', + }, + }, + plugins: [], +}; diff --git a/apps/documentations/tailwind.config.js b/apps/playground/tailwind.config.js similarity index 74% rename from apps/documentations/tailwind.config.js rename to apps/playground/tailwind.config.js index 38183db..18444b8 100644 --- a/apps/documentations/tailwind.config.js +++ b/apps/playground/tailwind.config.js @@ -1,5 +1,6 @@ const { createGlobPatternsForDependencies } = require('@nx/angular/tailwind'); const { join } = require('path'); +const baseTheme = require('./tailwind-base.config'); /** @type {import('tailwindcss').Config} */ module.exports = { @@ -8,7 +9,10 @@ module.exports = { ...createGlobPatternsForDependencies(__dirname), ], theme: { - extend: {}, + extend: { + ...baseTheme, + // place theme here + }, }, plugins: [], }; diff --git a/apps/playground/tsconfig.app.json b/apps/playground/tsconfig.app.json new file mode 100644 index 0000000..e4ed0a8 --- /dev/null +++ b/apps/playground/tsconfig.app.json @@ -0,0 +1,25 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "types": ["node"] + }, + "files": ["src/main.ts", "src/main.server.ts", "server.ts"], + "include": ["src/**/*.d.ts"], + "exclude": [ + "jest.config.ts", + "src/**/*.test.ts", + "src/**/*.spec.ts", + "vite.config.ts", + "vite.config.mts", + "vitest.config.ts", + "vitest.config.mts", + "src/**/*.test.tsx", + "src/**/*.spec.tsx", + "src/**/*.test.js", + "src/**/*.spec.js", + "src/**/*.test.jsx", + "src/**/*.spec.jsx", + "src/test-setup.ts" + ] +} diff --git a/packages/design-system/tsconfig.lib.json b/apps/playground/tsconfig.editor.json similarity index 70% rename from packages/design-system/tsconfig.lib.json rename to apps/playground/tsconfig.editor.json index ea5a20d..77629e2 100644 --- a/packages/design-system/tsconfig.lib.json +++ b/apps/playground/tsconfig.editor.json @@ -1,23 +1,21 @@ { "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "../../dist/out-tsc", - "declaration": true, - "types": ["node", "vite/client"] - }, "include": ["src/**/*.ts"], + "compilerOptions": {}, "exclude": [ + "jest.config.ts", + "src/**/*.test.ts", + "src/**/*.spec.ts", "vite.config.ts", "vite.config.mts", "vitest.config.ts", "vitest.config.mts", - "src/**/*.test.ts", - "src/**/*.spec.ts", "src/**/*.test.tsx", "src/**/*.spec.tsx", "src/**/*.test.js", "src/**/*.spec.js", "src/**/*.test.jsx", - "src/**/*.spec.jsx" + "src/**/*.spec.jsx", + "src/test-setup.ts" ] } diff --git a/apps/documentations/tsconfig.json b/apps/playground/tsconfig.json similarity index 100% rename from apps/documentations/tsconfig.json rename to apps/playground/tsconfig.json diff --git a/packages/design-system/tsconfig.spec.json b/apps/playground/tsconfig.spec.json similarity index 93% rename from packages/design-system/tsconfig.spec.json rename to apps/playground/tsconfig.spec.json index 56b7488..19ef165 100644 --- a/packages/design-system/tsconfig.spec.json +++ b/apps/playground/tsconfig.spec.json @@ -24,5 +24,6 @@ "src/**/*.test.jsx", "src/**/*.spec.jsx", "src/**/*.d.ts" - ] + ], + "files": ["src/test-setup.ts"] } diff --git a/package.json b/package.json index 11c6433..e31015c 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,8 @@ "@angular/compiler-cli": "~18.2.13", "@angular/language-service": "~18.2.13", "@eslint/js": "^9.15.0", + "@ng-icons/core": "^29.10.0", + "@ng-icons/heroicons": "^29.10.0", "@nx/angular": "20.1.3", "@nx/devkit": "20.1.3", "@nx/eslint": "20.1.3", diff --git a/packages/design-system/.babelrc b/packages/design-system/.babelrc deleted file mode 100644 index fd4cbcd..0000000 --- a/packages/design-system/.babelrc +++ /dev/null @@ -1,10 +0,0 @@ -{ - "presets": [ - [ - "@nx/js/babel", - { - "useBuiltIns": "usage" - } - ] - ] -} diff --git a/packages/design-system/README.md b/packages/design-system/README.md deleted file mode 100644 index c1018ca..0000000 --- a/packages/design-system/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# design-system - -This library was generated with [Nx](https://nx.dev). - -## Building - -Run `nx build design-system` to build the library. - -## Running unit tests - -Run `nx test design-system` to execute the unit tests via [Vitest](https://vitest.dev/). diff --git a/packages/design-system/eslint.config.js b/packages/design-system/eslint.config.js deleted file mode 100644 index 6e58c36..0000000 --- a/packages/design-system/eslint.config.js +++ /dev/null @@ -1,22 +0,0 @@ -const baseConfig = require('../../eslint.config.js'); - -module.exports = [ - ...baseConfig, - { - files: ['**/*.json'], - rules: { - '@nx/dependency-checks': [ - 'error', - { - ignoredFiles: [ - '{projectRoot}/eslint.config.{js,cjs,mjs}', - '{projectRoot}/vite.config.{js,ts,mjs,mts}', - ], - }, - ], - }, - languageOptions: { - parser: require('jsonc-eslint-parser'), - }, - }, -]; diff --git a/packages/design-system/package.json b/packages/design-system/package.json deleted file mode 100644 index d379cf0..0000000 --- a/packages/design-system/package.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "design-system", - "version": "0.0.1", - "dependencies": {}, - "main": "./index.js", - "module": "./index.mjs", - "typings": "./index.d.ts" -} diff --git a/packages/design-system/project.json b/packages/design-system/project.json deleted file mode 100644 index 2cf5968..0000000 --- a/packages/design-system/project.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "design-system", - "$schema": "../../node_modules/nx/schemas/project-schema.json", - "sourceRoot": "packages/deisgn-system/src", - "projectType": "library", - "release": { - "version": { - "generatorOptions": { - "packageRoot": "dist/{projectRoot}", - "currentVersionResolver": "git-tag" - } - } - }, - "tags": [], - "targets": { - "nx-release-publish": { - "options": { - "packageRoot": "dist/{projectRoot}" - } - } - } -} diff --git a/packages/design-system/src/index.ts b/packages/design-system/src/index.ts deleted file mode 100644 index 9c1f76e..0000000 --- a/packages/design-system/src/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './tokens/token'; - -import { tokenFactory } from './tokens/token-factory'; -const base = tokenFactory.create('base'); diff --git a/packages/design-system/src/tokens/token-factory.ts b/packages/design-system/src/tokens/token-factory.ts deleted file mode 100644 index bbea0ae..0000000 --- a/packages/design-system/src/tokens/token-factory.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { Token } from './token'; - -export const CustomPrefix = ['primitive'] as const; - -function baseTokenFactory() { - return new Token<(typeof CustomPrefix)[number]>(); -} - -function functionalTokenFactory() { - return new Token(); -} - -function compoentTokenFactory() { - return new Token(); -} - -const factory = { - create: (category: 'base' | 'functional' | 'component') => { - let instance: Token; - switch (category) { - case 'base': - instance = baseTokenFactory(); - break; - case 'functional': - instance = functionalTokenFactory(); - break; - case 'component': - instance = compoentTokenFactory(); - break; - default: - instance = new Token(); - break; - } - return instance; - }, -}; - -export { factory as tokenFactory }; diff --git a/packages/design-system/src/tokens/token.ts b/packages/design-system/src/tokens/token.ts deleted file mode 100644 index ab11986..0000000 --- a/packages/design-system/src/tokens/token.ts +++ /dev/null @@ -1,82 +0,0 @@ -/* eslint-disable @typescript-eslint/no-non-null-assertion */ -export const TokenPrefix: string[] = [] as const; -export const TokenNamespace = ['base', 'pattern', 'functional'] as const; -export const TokenPattern = ['control', 'button', 'overlay', 'text'] as const; -export const TokenProperty = [ - 'color', - 'background', - 'font', - 'spacing', - 'border', - 'radius', -] as const; -export const TokenVariant = [ - 'primary', - 'secondary', - 'danger', - 'success', - 'light', - 'dark', -] as const; -export const TokenScale = ['small', 'medium', 'large', 'xlarge'] as const; - -export type TokenPrefixType = (typeof TokenPrefix)[number]; -export type TokenNamespaceType = (typeof TokenNamespace)[number]; -export type TokenPropertyType = (typeof TokenProperty)[number]; -export type TokenVariantType = (typeof TokenVariant)[number]; -export type TokenScaleType = (typeof TokenScale)[number]; - -export class Token< - Prefix extends TokenPrefixType = TokenPrefixType, - Namespace extends TokenNamespaceType = TokenNamespaceType, - Property extends TokenPropertyType = TokenPropertyType, - Variant extends TokenVariantType | undefined = undefined, - Scale extends TokenScaleType | undefined = undefined -> { - // Token properties - name: string; // Name will be composed based on the semantic structure - value: string; // CSS value (e.g., #fff, 16px) - prefix: Prefix; - namespace: Namespace; - property: Property; - variant?: Variant; - scale?: Scale; - - // Constructor with type-safe parameters - constructor( - prefix?: Prefix, - namespace?: Namespace, - property?: Property, - value?: string, - variant?: Variant, - scale?: Scale - ) { - this.prefix = prefix!; - this.namespace = namespace!; - this.property = property!; - this.value = value!; - this.variant = variant; - this.scale = scale; - this.name = this.generateTokenName(); - } - - // Generates the semantic token name based on the structure: prefix-namespace-base-patterns-variant-property - generateTokenName(): string { - const nameParts = [ - this.prefix, // e.g., 'brand', 'global' - this.namespace, // e.g., 'base', 'pattern', 'functional' - this.property, // e.g., 'color', 'background', etc. - this.variant, // e.g., 'primary', 'secondary' (if any) - this.scale, // e.g., 'small', 'large' (if any) - ] - .filter(Boolean) // Remove undefined values - .join('-'); // Join with a hyphen - - return nameParts; - } - - // Optionally return a CSS variable for the generated token - generateCSSVariable(): string { - return `--${this.generateTokenName()}: ${this.value};`; - } -} diff --git a/packages/design-system/tsconfig.json b/packages/design-system/tsconfig.json deleted file mode 100644 index 6f7169a..0000000 --- a/packages/design-system/tsconfig.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "module": "commonjs", - "forceConsistentCasingInFileNames": true, - "strict": true, - "noImplicitOverride": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true, - "noPropertyAccessFromIndexSignature": true - }, - "files": [], - "include": [], - "references": [ - { - "path": "./tsconfig.lib.json" - }, - { - "path": "./tsconfig.spec.json" - } - ] -} diff --git a/packages/design-system/vite.config.ts b/packages/design-system/vite.config.ts deleted file mode 100644 index e9679f6..0000000 --- a/packages/design-system/vite.config.ts +++ /dev/null @@ -1,58 +0,0 @@ -import * as path from 'path'; - -/// -import { defineConfig } from 'vite'; -import dts from 'vite-plugin-dts'; -import { nxCopyAssetsPlugin } from '@nx/vite/plugins/nx-copy-assets.plugin'; -import { nxViteTsPaths } from '@nx/vite/plugins/nx-tsconfig-paths.plugin'; - -export default defineConfig({ - root: __dirname, - cacheDir: '../../node_modules/.vite/packages/design-system', - plugins: [ - nxViteTsPaths(), - nxCopyAssetsPlugin(['*.md']), - dts({ - entryRoot: 'src', - tsconfigPath: path.join(__dirname, 'tsconfig.lib.json'), - }), - ], - // Uncomment this if you are using workers. - // worker: { - // plugins: [ nxViteTsPaths() ], - // }, - // Configuration for building your library. - // See: https://vitejs.dev/guide/build.html#library-mode - build: { - outDir: '../../dist/packages/design-system', - emptyOutDir: true, - reportCompressedSize: true, - commonjsOptions: { - transformMixedEsModules: true, - }, - lib: { - // Could also be a dictionary or array of multiple entry points. - entry: 'src/index.ts', - name: 'design-system', - fileName: 'index', - // Change this to the formats you want to support. - // Don't forget to update your package.json as well. - formats: ['es', 'cjs'], - }, - rollupOptions: { - // External packages that should not be bundled into your library. - external: [], - }, - }, - test: { - watch: false, - globals: true, - environment: 'node', - include: ['src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], - reporters: ['default'], - coverage: { - reportsDirectory: '../../coverage/packages/design-system', - provider: 'v8', - }, - }, -}); diff --git a/packages/primitives/accordion/package.json b/packages/primitives/accordion/package.json index dc664fc..a10f2c1 100644 --- a/packages/primitives/accordion/package.json +++ b/packages/primitives/accordion/package.json @@ -1,6 +1,6 @@ { "name": "@ngx-primer/primitive/accordion", - "version": "0.0.2-0", + "version": "0.0.2", "peerDependencies": { "@angular/common": "^18.2.0", "@angular/core": "^18.2.0", diff --git a/packages/primitives/accordion/src/components/accordion-content/accordion-content.component.ts b/packages/primitives/accordion/src/components/accordion-content/accordion-content.component.ts index 755ca30..b181a17 100644 --- a/packages/primitives/accordion/src/components/accordion-content/accordion-content.component.ts +++ b/packages/primitives/accordion/src/components/accordion-content/accordion-content.component.ts @@ -1,4 +1,3 @@ -/* eslint-disable @angular-eslint/no-input-rename */ /** * Copyright [2024] [ElhakimDev] * @@ -13,22 +12,106 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - */ import { Component, input } from '@angular/core'; + */ + +import { Component, HostBinding, OnInit, inject } from '@angular/core'; import { CommonModule } from '@angular/common'; +import { NgxPrimerAccordionContentContext } from '../../contexts/accordion-content/accordion-content.context'; +import { NgxPrimerAccordionContentContextDirective } from '../../directives'; import { NgxPrimerAccordionItemComponent } from '../accordion-item/accordion-item.component'; +import { NgxPrimerAccordionItemContext } from '../../contexts/accordion-item/accordion-item.context'; +import { NgxPrimerAccordionRootComponent } from '../accordion-root/accordion-root.component'; +import { NgxPrimerIdGeneratorDirective } from '@ngx-primer/primitive/utilities'; @Component({ selector: 'ngx-primer-accordion-content', standalone: true, imports: [CommonModule], + providers: [NgxPrimerAccordionContentContext], templateUrl: './accordion-content.component.html', styleUrl: './accordion-content.component.scss', + hostDirectives: [ + { + directive: NgxPrimerIdGeneratorDirective, + inputs: ['ngxPrimerIdAttr'], + }, + { + directive: NgxPrimerAccordionContentContextDirective + } + ], }) -export class NgxPrimerAccordionContentComponent { - public readonly accordionItem = input.required< - NgxPrimerAccordionItemComponent - >({ - alias: 'ngxPrimerAccordionItemInstanceRef', +export class NgxPrimerAccordionContentComponent implements OnInit { + protected readonly idGenerator = inject(NgxPrimerIdGeneratorDirective, { + host: true, + optional: true, }); + + public readonly accordionContentId = this.idGenerator?.resolvedId; + + protected readonly accordionItemContext = inject( + NgxPrimerAccordionItemContext, + { + optional: true, + } + ); + + protected readonly accordionContentContext = inject( + NgxPrimerAccordionContentContext, + { + optional: true, + } + ); + + @HostBinding('role') + public get roleAttr() { + return 'region'; + } + + @HostBinding('attr.data-orientation') + public get dataOrientationAttr() { + return this.accordionRoot?.orientation(); + } + + @HostBinding('attr.data-expanded') + public get dataExpandedAttr() { + return this.accordionItem?.isOpen(); + } + + @HostBinding('attr.data-is-open') + public get dataIsOpenAttr() { + return this.accordionItem.isOpen(); + } + + @HostBinding('attr.aria-labelledby') + public get dataAriaLabelledByAttr() { + return this.accordionItem?.accordionTrigger()?.accordionTriggerId; + } + + ngOnInit(): void { + this.runInitializationFn(); + } + + protected runInitializationFn(doneFn?:

(args?: P) => void): void { + if (doneFn) { + doneFn({ + context: this.accordionContentContext + }); + } + } + + protected get accordionContent() { + return this.accordionContentContext + ?.instance as NgxPrimerAccordionContentComponent; + } + + protected get accordionItem() { + return this.accordionItemContext + ?.instance as NgxPrimerAccordionItemComponent; + } + + protected get accordionRoot() { + return this.accordionItem?.accordionRootContext + ?.instance as NgxPrimerAccordionRootComponent; + } } diff --git a/packages/primitives/accordion/src/components/accordion-item/accordion-item.component.ts b/packages/primitives/accordion/src/components/accordion-item/accordion-item.component.ts index fd90dcf..694ba89 100644 --- a/packages/primitives/accordion/src/components/accordion-item/accordion-item.component.ts +++ b/packages/primitives/accordion/src/components/accordion-item/accordion-item.component.ts @@ -14,29 +14,60 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Component, contentChild, input } from '@angular/core'; +import { + Component, + HostBinding, + Injector, + OnInit, + computed, + contentChild, + inject, + input, +} from '@angular/core'; import { CommonModule } from '@angular/common'; import { NgxPrimerAccordionContentComponent } from '../accordion-content/accordion-content.component'; +import { NgxPrimerAccordionItemContext } from '../../contexts/accordion-item/accordion-item.context'; +import { NgxPrimerAccordionItemContextDirective } from '../../directives'; import { NgxPrimerAccordionRootComponent } from '../accordion-root/accordion-root.component'; +import { NgxPrimerAccordionRootContext } from '../../contexts/accordion-root/accordion-root.context'; import { NgxPrimerAccordionTriggerComponent } from '../accordion-trigger/accordion-trigger.component'; +import { NgxPrimerIdGeneratorDirective } from '@ngx-primer/primitive/utilities'; @Component({ selector: 'ngx-primer-accordion-item', standalone: true, imports: [CommonModule], + providers: [NgxPrimerAccordionItemContext], templateUrl: './accordion-item.component.html', styleUrl: './accordion-item.component.scss', exportAs: 'ngxPrimerAccordionItemComponent', + hostDirectives: [ + { + directive: NgxPrimerIdGeneratorDirective, + inputs: ['ngxPrimerIdAttr'], + }, + { + directive: NgxPrimerAccordionItemContextDirective + } + ], }) -export class NgxPrimerAccordionItemComponent { - /** - * Accordion root instance. - */ - public readonly accordionRoot = input.required< - NgxPrimerAccordionRootComponent - >({ - alias: 'ngxPrimerAccordionRootInstanceRef', +export class NgxPrimerAccordionItemComponent implements OnInit { + protected readonly injector = inject(Injector); + + protected readonly idGenerator = inject(NgxPrimerIdGeneratorDirective, { + host: true, + optional: true, + }); + + public readonly accordionItemId = this.idGenerator?.resolvedId; + + public readonly accordionRootContext = inject(NgxPrimerAccordionRootContext, { + optional: true, + }); + + public readonly accordionItemContext = inject(NgxPrimerAccordionItemContext, { + optional: true, }); /** @@ -60,4 +91,93 @@ export class NgxPrimerAccordionItemComponent { read: NgxPrimerAccordionTriggerComponent, } ); + + public readonly value = input.required({ + alias: 'ngxPrimerAccordionItemValue', + }); + + public readonly isOpen = computed(() => + this.accordionRoot?.isOpen(this.value()) + ); + + @HostBinding('attr.data-orientation') + public get dataOrientationAttr() { + return this.accordionRoot?.orientation(); + } + + @HostBinding('attr.data-is-open') + public get dataIsOpenAttr() { + return this.isOpen(); + } + + @HostBinding('attr.data-value') + public get dataValueAttr() { + return this.value(); + } + + @HostBinding('attr.data-disabled') + public get dataDisabledAttr() { + return this.accordionRoot?.disabled(); + } + + ngOnInit(): void { + this.runInitializationFn(); + } + + /** + * Runs the initialization logic for the accordion component, setting up default values and context. + * + * This method initializes the accordion component, optionally setting a default value if provided. + * It also sets the context instance to allow dependency injection in child components, + * preventing the need for manual prop drilling. + * + * If a `doneFn` callback is provided, it will be executed after the initialization process + * with the current context and value. + * + * ### Parameters + * - `doneFn` (Optional): A callback function that will be executed after initialization. + * It receives an object with the `context` and `value` properties, where: + * - `context`: The current instance of the accordion component's root context. + * - `value`: The current value of the accordion, either the default value or a set value. + * + * ### Returns + * This method does not return anything. It performs initialization tasks and optionally invokes the callback. + * + * ### Example Usage + * ```typescript + * // In the accordion component + * this.runInitializationFn((params) => { + * console.log('Accordion initialized with context:', params.context); + * console.log('Initial value:', params.value); + * }); + * ``` + * + * ### Description + * - **Context Setup**: The `accordionRootContext.instance` is set to the current accordion instance, + * making it accessible for child components through dependency injection. + * - **Default Value**: If a default value is set for the accordion, it will be applied at initialization. + * - **Callback Execution**: If the `doneFn` callback is provided, it is executed with the current context and value. + */ + protected runInitializationFn(doneFn?:

(args?: P) => void): void { + if (doneFn) { + // ensure context being initalized + setTimeout(() => doneFn({ + context: this.accordionItemContext + })); + } + } + + protected get accordionItem() { + return this.accordionItemContext + ?.instance as NgxPrimerAccordionItemComponent; + } + + protected get accordionRoot() { + return this.accordionItem?.accordionRootContext + ?.instance as NgxPrimerAccordionRootComponent; + } + + focus(){ + this.accordionTrigger()?.focus(); + } } diff --git a/packages/primitives/accordion/src/components/accordion-root/accordion-root.component.ts b/packages/primitives/accordion/src/components/accordion-root/accordion-root.component.ts index e23f379..13c7e72 100644 --- a/packages/primitives/accordion/src/components/accordion-root/accordion-root.component.ts +++ b/packages/primitives/accordion/src/components/accordion-root/accordion-root.component.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ /* eslint-disable @angular-eslint/no-input-rename */ /** * Copyright [2024] [ElhakimDev] @@ -16,19 +17,19 @@ */ import { Component, + HostBinding, OnInit, booleanAttribute, - contentChild, contentChildren, inject, input, model, } from '@angular/core'; -import { AccordionRootContext } from '../../contexts/accordion-root/accordion-root.context'; import { CommonModule } from '@angular/common'; import { NgxPrimerAccordionItemComponent } from '../accordion-item/accordion-item.component'; -import { NgxPrimerAccordionRootThemeVariantDirective } from '../../directives'; +import { NgxPrimerAccordionRootContext } from '../../contexts/accordion-root/accordion-root.context'; +import { NgxPrimerAccordionRootContextDirective } from '../../directives/component-context'; import { NgxPrimerIdGeneratorDirective } from '@ngx-primer/primitive/utilities'; import { injectAccordionConfig } from '../../configs/accordion-config'; @@ -36,12 +37,27 @@ import { injectAccordionConfig } from '../../configs/accordion-config'; selector: 'ngx-primer-accordion-root', standalone: true, imports: [CommonModule], - providers: [], + providers: [NgxPrimerAccordionRootContext], + hostDirectives: [ + { + directive: NgxPrimerIdGeneratorDirective, + inputs: ['ngxPrimerIdAttr'], + }, + { + directive: NgxPrimerAccordionRootContextDirective, + }, + ], templateUrl: './accordion-root.component.html', styleUrl: './accordion-root.component.scss', exportAs: 'ngxPrimerAccordionRootComponent', }) export class NgxPrimerAccordionRootComponent implements OnInit { + protected readonly idGenerator = inject(NgxPrimerIdGeneratorDirective, { + host: true, + optional: true, + }); + + public readonly accordionRootId = this.idGenerator?.resolvedId; /** * Injects the `AccordionRootContext` service into the component or directive. * @@ -49,17 +65,6 @@ export class NgxPrimerAccordionRootComponent implements OnInit { * enabling interaction or data sharing between the accordion root * and its child components, such as items, triggers, and content. * - * ### Example Usage - * ```typescript - * export class AccordionItemComponent { - * public readonly accordionRootContext = inject(AccordionRootContext); - * - * constructor() { - * const context = this.accordionRootContext.getInstance(); - * console.log(context); // Access the accordion root instance - * } - * } - * ``` * * ### Purpose * - Facilitates communication between the root and its children. @@ -67,7 +72,9 @@ export class NgxPrimerAccordionRootComponent implements OnInit { * * @see AccordionRootContext */ - public readonly accordionRootContext = inject(AccordionRootContext); + public readonly accordionRootContext = inject(NgxPrimerAccordionRootContext, { + optional: true, + }); /** * Provides the configuration for the accordion component by injecting the `AccordionConfig` service. @@ -76,18 +83,8 @@ export class NgxPrimerAccordionRootComponent implements OnInit { * and configurations for the accordion, such as default behaviors, styles, * or other shared properties. These configurations can be tailored globally * or overridden at specific component levels. - * - * ### Example Usage - * ```typescript - * export class AccordionComponent { - * public readonly accordionConfig = injectAccordionConfig(); - * - * constructor() { - * console.log(this.accordionConfig); // Access accordion-specific configurations - * } - * } - * ``` - * + * + * * ### Purpose * - Centralizes the configuration for the accordion component. * - Promotes consistency and reusability across multiple accordion instances. @@ -97,70 +94,6 @@ export class NgxPrimerAccordionRootComponent implements OnInit { */ public readonly accordionConfig = injectAccordionConfig(); - /** - * Retrieves the instance of `NgxPrimerIdGeneratorDirective` within the content of the accordion component. - * - * The `accordionIdGenerator` is a `ContentChild` query that looks for the `NgxPrimerIdGeneratorDirective` - * within the component's content, ensuring unique and consistent ID generation for accordion elements. - * - * ### Configuration - * - **descendants**: Ensures the query searches recursively through all descendant elements. - * - **read**: Specifies the directive (`NgxPrimerIdGeneratorDirective`) to be queried and retrieved. - * - * ### Use Case - * This property is typically used to provide a mechanism for generating unique IDs for - * accordion elements, such as items, triggers, or content sections. It enables better accessibility - * and avoids ID conflicts in dynamically generated content. - * - * ### Example Usage - * ```typescript - * export class AccordionComponent { - * @ContentChild(NgxPrimerIdGeneratorDirective, { descendants: true, read: NgxPrimerIdGeneratorDirective }) - * public readonly accordionIdGenerator; - * - * generateUniqueId(): string { - * return this.accordionIdGenerator.generateId(); - * } - * } - * ``` - * - * ### Benefits - * - Ensures ID uniqueness across all accordion elements. - * - Integrates seamlessly with dynamic content or programmatic ID generation. - * - * @see NgxPrimerIdGeneratorDirective - */ - public readonly accordionIdGenerator = contentChild( - NgxPrimerIdGeneratorDirective, - { - descendants: true, - read: NgxPrimerIdGeneratorDirective, - } - ); - - /** - * Retrieves the unique ID for the accordion component, generated by the injected ID generator. - * - * If the ID generator is unavailable or not provided, the method falls back to a default ID value. - * This ensures that each accordion component has a unique identifier, which can be useful for accessibility or dynamic content rendering. - * - * ### Returns - * - **string**: The unique ID for the accordion component, either generated by the injected ID generator or a default value if unavailable. - * - * ### Example Usage - * ```typescript - * // Access the generated accordion ID - * const id = this.accordionId; - * ``` - * - * ### Behavior: - * - If `accordionIdGenerator` is available, the `generatedId` from the generator is returned. - * - If `accordionIdGenerator` is not available, a fallback ID value is returned (usually a default or empty string). - */ - public get accordionId() { - return this.accordionIdGenerator()?.generatedId; - } - /** * The list of accordion item instances that belong to this accordion root. * @@ -170,17 +103,7 @@ export class NgxPrimerAccordionRootComponent implements OnInit { * * ### Type * - **QueryList**: A list of accordion items that are part of the current accordion root component. - * - * ### Example Usage - * ```typescript - * // Accessing the list of accordion items - * const items = this.accordionItems; - * - * // Looping through the accordion items - * this.accordionItems.forEach(item => { - * // Perform actions on each item - * }); - * ``` + * * * ### Behavior: * - The `accordionItems` list includes all `NgxPrimerAccordionItemComponent` instances that are within the root accordion, including descendants. @@ -196,19 +119,6 @@ export class NgxPrimerAccordionRootComponent implements OnInit { } ); - /** - * Reference to the accordion root theme variant directive. - * Allows access to the theme configuration for the accordion root. - * - * @type {NgxPrimerAccordionRootThemeVariantDirective | null} The theme variant directive or null if not provided. - */ - public readonly accordionRootThemeVariant = inject( - NgxPrimerAccordionRootThemeVariantDirective, - { - optional: true, - } - ); - /** * The accordion type (Single/Multiple). * This defines whether the accordion allows single or multiple items to be open at once. @@ -287,16 +197,7 @@ export class NgxPrimerAccordionRootComponent implements OnInit { * @param {T} value The value to check. This can be any type defined for the accordion values (e.g., string, number, etc.). * * @returns {boolean} True if the value is open (i.e., selected or expanded), false otherwise. - * - * ### Example Usage - * ```typescript - * const isItemOpen = this.isOpen(itemValue); - * if (isItemOpen) { - * // Handle the case where the item is open - * } else { - * // Handle the case where the item is closed - * } - * ``` + * * * ### Behavior: * - **Multiple Type**: If the accordion type is set to "Multiple", the method checks if the value exists in the list of selected/open values. @@ -322,12 +223,7 @@ export class NgxPrimerAccordionRootComponent implements OnInit { * * ### Returns * This method does not return anything. It modifies the internal state of the accordion based on the toggled value. - * - * ### Example Usage - * ```typescript - * // To toggle an accordion item - * this.toggle('item1'); // Toggles the open/closed state of 'item1' - * ``` + * * * ### Behavior: * - **Single Accordion Mode**: @@ -340,26 +236,48 @@ export class NgxPrimerAccordionRootComponent implements OnInit { public toggle(value: T): void { const isOpenValue = this.isOpen(value); - // Prevent toggle for single-type accordion when collapsible is false and already open. - if (this.type() === 'Single' && isOpenValue && !this.collapsible()) { - return; + if (this.type() === 'Single') { + this.toogleSingle(value, isOpenValue); } - if (this.type() === 'Single') { - this.value.set(isOpenValue ? null : value); // Set to null for single-value mode. + if (this.type() === 'Multiple') { + this.toogleMultiple(value, isOpenValue); } + } - const values = (this.value() as T[]) ?? []; + protected toogleSingle(value: T, isOpen: boolean) { + if (isOpen && !this.collapsible()) return; + this.value.set(isOpen ? null : value); + } + + protected toogleMultiple(value: T, isOpenValue: boolean) { + const values = Array.isArray(this.value()) + ? [...(this.value() as T[])] + : [this.value()]; - // Toggle the value in the selected values list. if (isOpenValue) { - this.value.set(values.filter((v) => v !== value)); // Remove if currently open. + // @ts-expect-error + this.value.set(values?.filter((v) => v !== value)); } else { - this.value.set([...values, value]); // Add if currently closed. + this.value.set([...(values as T[]), value]); } } - // --------------------------- Hooks ---------------------------------- // + // -------------------------- Host Bindings --------------------------- // + @HostBinding('attr.data-orientation') + public get dataOrientationAttr() { + return this.accordionConfig.orientation; + } + + @HostBinding('attr.data-disabled') + public get dataDisabledAttr() { + return this.disabled() ? '' : null; + } + + @HostBinding('attr.data-type') + public get dataTypeAttr() { + return this.type(); + } /** * Angular initialization hook. @@ -368,9 +286,7 @@ export class NgxPrimerAccordionRootComponent implements OnInit { * @returns {void} This method does not return anything. */ ngOnInit(): void { - this.runInitializationFn((ctx) => { - console.log({ ctx }); - }); + this.runInitializationFn(); } /** @@ -391,15 +307,7 @@ export class NgxPrimerAccordionRootComponent implements OnInit { * * ### Returns * This method does not return anything. It performs initialization tasks and optionally invokes the callback. - * - * ### Example Usage - * ```typescript - * // In the accordion component - * this.runInitializationFn((params) => { - * console.log('Accordion initialized with context:', params.context); - * console.log('Initial value:', params.value); - * }); - * ``` + * * * ### Description * - **Context Setup**: The `accordionRootContext.instance` is set to the current accordion instance, @@ -408,19 +316,28 @@ export class NgxPrimerAccordionRootComponent implements OnInit { * - **Callback Execution**: If the `doneFn` callback is provided, it is executed with the current context and value. */ protected runInitializationFn(doneFn?:

(args?: P) => void): void { - // set the context instance to allow inject in child component prevent manual prop drilling - this.accordionRootContext.instance = this; - if (this.defaultValue()) { this.value.set(this.defaultValue()); // Set default value if provided. } if (doneFn) { - doneFn({ + setTimeout(() => doneFn({ context: this.accordionRootContext - .instance as NgxPrimerAccordionRootComponent, - value: this.value(), - }); // Execute the callback with the current value. + })) } } + + moveFocus(currentIndex: number, direction: number) { + const accordionItems = this.accordionItems(); + const nextIndex = (currentIndex + direction + accordionItems.length) % accordionItems.length; + accordionItems[nextIndex].focus() + } + + moveFocusToEnd(){ + this.accordionItems()[this.accordionItems().length -1].focus(); + } + + moveFocusToStart() { + this.accordionItems()[0].focus(); + } } diff --git a/packages/primitives/accordion/src/components/accordion-trigger/accordion-trigger.component.ts b/packages/primitives/accordion/src/components/accordion-trigger/accordion-trigger.component.ts index 0119345..324fa62 100644 --- a/packages/primitives/accordion/src/components/accordion-trigger/accordion-trigger.component.ts +++ b/packages/primitives/accordion/src/components/accordion-trigger/accordion-trigger.component.ts @@ -1,4 +1,4 @@ -/* eslint-disable @angular-eslint/no-input-rename */ +import { CommonModule, isPlatformBrowser } from '@angular/common'; /** * Copyright [2024] [ElhakimDev] * @@ -14,25 +14,166 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Component, input } from '@angular/core'; +import { + Component, + HostBinding, + HostListener, + OnInit, + PLATFORM_ID, + ViewContainerRef, + inject, +} from '@angular/core'; +import { + NgxPrimerAccordionItemContext, + NgxPrimerAccordionTriggerContext, +} from '../../contexts'; -import { CommonModule } from '@angular/common'; +import { NgxPrimerAccordionContentComponent } from '../accordion-content/accordion-content.component'; import { NgxPrimerAccordionItemComponent } from '../accordion-item/accordion-item.component'; +import { NgxPrimerAccordionRootComponent } from '../accordion-root/accordion-root.component'; +import { NgxPrimerAccordionTriggerContextDirective } from '../../directives'; +import { NgxPrimerIdGeneratorDirective } from '@ngx-primer/primitive/utilities'; @Component({ selector: 'ngx-primer-accordion-trigger', standalone: true, imports: [CommonModule], + providers: [NgxPrimerAccordionTriggerContext], templateUrl: './accordion-trigger.component.html', styleUrl: './accordion-trigger.component.scss', + hostDirectives: [ + { + directive: NgxPrimerIdGeneratorDirective, + inputs: ['ngxPrimerIdAttr'], + }, + { + directive: NgxPrimerAccordionTriggerContextDirective + } + ], }) -export class NgxPrimerAccordionTriggerComponent { - /** - * Accodion item instance. - */ - public readonly accordionItem = input.required< - NgxPrimerAccordionItemComponent - >({ - alias: 'ngxPrimerAccordionItemInstanceRef', +export class NgxPrimerAccordionTriggerComponent implements OnInit { + protected readonly platformId = inject(PLATFORM_ID); + protected readonly viewContainerRef = inject(ViewContainerRef); + protected readonly idGenerator = inject(NgxPrimerIdGeneratorDirective, { + host: true, + optional: true, }); + + public readonly accordionTriggerId = this.idGenerator?.resolvedId; + + protected readonly accordionItemContext = inject( + NgxPrimerAccordionItemContext, + { + optional: true, + } + ); + + protected readonly accordionTriggerContext = inject( + NgxPrimerAccordionTriggerContext, + { + optional: true, + } + ); + + ngOnInit(): void { + this.runInitializationFn(); + } + + protected runInitializationFn(doneFn?:

(args?: P) => void): void { + if (doneFn) { + setTimeout(() => doneFn({ + context: this.accordionTriggerContext + })); + } + } + + @HostListener('click') + toogle() { + if (this.accordionRoot?.disabled()) return; + this.accordionRoot?.toggle(this.accordionItem?.value()); + } + + @HostBinding('role') + public get roleAttr() { + return 'button'; + } + + @HostBinding('tabIndex') + public get tabIndexAttr() { + return this.accordionItem.isOpen() ? 0 : -1; + } + + @HostBinding('attr.data-focus') + public get dataFocusAttr() { + return isPlatformBrowser(this.platformId) ? document.activeElement === this.viewContainerRef.element.nativeElement : false; + } + + @HostBinding('attr.data-orientation') + public get dataOrientationAttr() { + return this.accordionRoot?.orientation(); + } + + @HostBinding('attr.data-is-open') + public get dataIsOpenAttr() { + return this.accordionItem?.isOpen(); + } + + @HostBinding('attr.data-expanded') + public get dataExpandedAttr() { + return this.accordionItem?.isOpen(); + } + + @HostBinding('attr.aria-controls') + public get dataControlsAttr() { + return this.accordionItem?.accordionContent()?.accordionContentId; + } + + @HostListener('keydown', ['$event']) + onKeyDown(event: KeyboardEvent) { + const currentIndex = this.accordionRoot.accordionItems().findIndex((item: NgxPrimerAccordionItemComponent) => item.accordionTrigger() === this); + + switch (event.key) { + case 'Enter': + case ' ': + this.toogle(); + event.preventDefault(); + break; + case 'ArrowDown': + this.accordionRoot.moveFocus(currentIndex, 1); + event.preventDefault(); + break; + case 'ArrowUp': + this.accordionRoot.moveFocus(currentIndex, -1); + event.preventDefault(); + break; + case 'Home': + this.accordionRoot.moveFocusToStart(); + event.preventDefault(); + break; + case 'End': + this.accordionRoot.moveFocusToEnd(); + event.preventDefault(); + break; + } + } + + protected get accordionItem() { + return this.accordionItemContext + ?.instance as NgxPrimerAccordionItemComponent; + } + + protected get accordionRoot() { + return this.accordionItem?.accordionRootContext + ?.instance as NgxPrimerAccordionRootComponent; + } + + protected get accordionContent() { + return this.accordionItem?.accordionItemContext?.instance as NgxPrimerAccordionContentComponent; + } + + focus() { + (this.viewContainerRef.element.nativeElement as HTMLElement).focus({ + preventScroll: false + }) + } } diff --git a/packages/primitives/accordion/src/contexts/accordion-content/accordion-content.context.spec.ts b/packages/primitives/accordion/src/contexts/accordion-content/accordion-content.context.spec.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/primitives/accordion/src/contexts/accordion-content/accordion-content.context.ts b/packages/primitives/accordion/src/contexts/accordion-content/accordion-content.context.ts new file mode 100644 index 0000000..d15e3cc --- /dev/null +++ b/packages/primitives/accordion/src/contexts/accordion-content/accordion-content.context.ts @@ -0,0 +1,8 @@ +import { Component, Injectable } from '@angular/core'; + +import { Context } from '@ngx-primer/primitive/utilities'; + +@Injectable() +export class NgxPrimerAccordionContentContext< + NgxPrimerAccordionContentComponent extends Component +> extends Context {} diff --git a/packages/primitives/accordion/src/contexts/accordion-item/accordion-item.context.spec.ts b/packages/primitives/accordion/src/contexts/accordion-item/accordion-item.context.spec.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/primitives/accordion/src/contexts/accordion-item/accordion-item.context.ts b/packages/primitives/accordion/src/contexts/accordion-item/accordion-item.context.ts new file mode 100644 index 0000000..6f983e7 --- /dev/null +++ b/packages/primitives/accordion/src/contexts/accordion-item/accordion-item.context.ts @@ -0,0 +1,8 @@ +import { Component, Injectable } from '@angular/core'; + +import { Context } from '@ngx-primer/primitive/utilities'; + +@Injectable() +export class NgxPrimerAccordionItemContext< + NgxPrimerAccordionItemComponent extends Component +> extends Context {} diff --git a/packages/primitives/accordion/src/contexts/accordion-root/accordion-root.context.ts b/packages/primitives/accordion/src/contexts/accordion-root/accordion-root.context.ts index df42b77..eb1c4e4 100644 --- a/packages/primitives/accordion/src/contexts/accordion-root/accordion-root.context.ts +++ b/packages/primitives/accordion/src/contexts/accordion-root/accordion-root.context.ts @@ -2,9 +2,7 @@ import { Component, Injectable } from '@angular/core'; import { Context } from '@ngx-primer/primitive/utilities'; -@Injectable({ - providedIn: 'root', -}) -export class AccordionRootContext< +@Injectable() +export class NgxPrimerAccordionRootContext< NgxPrimerAccordionRootComponent extends Component > extends Context {} diff --git a/packages/primitives/accordion/src/contexts/accordion-trigger/accordion-trigger.context.spec.ts b/packages/primitives/accordion/src/contexts/accordion-trigger/accordion-trigger.context.spec.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/primitives/accordion/src/contexts/accordion-trigger/accordion-trigger.context.ts b/packages/primitives/accordion/src/contexts/accordion-trigger/accordion-trigger.context.ts new file mode 100644 index 0000000..91d3eeb --- /dev/null +++ b/packages/primitives/accordion/src/contexts/accordion-trigger/accordion-trigger.context.ts @@ -0,0 +1,8 @@ +import { Component, Injectable } from '@angular/core'; + +import { Context } from '@ngx-primer/primitive/utilities'; + +@Injectable() +export class NgxPrimerAccordionTriggerContext< + NgxPrimerAccordionTriggerComponent extends Component +> extends Context {} diff --git a/packages/primitives/accordion/src/contexts/index.ts b/packages/primitives/accordion/src/contexts/index.ts new file mode 100644 index 0000000..3baa3d4 --- /dev/null +++ b/packages/primitives/accordion/src/contexts/index.ts @@ -0,0 +1,4 @@ +export * from './accordion-root/accordion-root.context'; +export * from './accordion-item/accordion-item.context'; +export * from './accordion-content/accordion-content.context'; +export * from './accordion-trigger/accordion-trigger.context'; diff --git a/packages/primitives/accordion/src/directives/accordion-root/accordion-root-theme-variant.directive.spec.ts b/packages/primitives/accordion/src/directives/accordion-root/accordion-root-theme-variant.directive.spec.ts deleted file mode 100644 index 1608b65..0000000 --- a/packages/primitives/accordion/src/directives/accordion-root/accordion-root-theme-variant.directive.spec.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { NgxPrimerAccordionRootThemeVariantDirective } from './accordion-root-theme-variant.directive'; - -describe('NgxPrimerAccordionRootThemeVariantDirective', () => { - it('should create an instance', () => { - const directive = new NgxPrimerAccordionRootThemeVariantDirective(); - expect(directive).toBeTruthy(); - }); -}); diff --git a/packages/primitives/accordion/src/directives/accordion-root/accordion-root-theme-variant.directive.ts b/packages/primitives/accordion/src/directives/accordion-root/accordion-root-theme-variant.directive.ts deleted file mode 100644 index 51305d0..0000000 --- a/packages/primitives/accordion/src/directives/accordion-root/accordion-root-theme-variant.directive.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { - AccordionRootThemeVariant, - accordionRootThemeVariant, -} from '../../themes'; -import { Directive, HostBinding, model } from '@angular/core'; - -import { injectAccordionConfig } from '../../configs/accordion-config'; - -interface AccordionRootProps extends HTMLElement, AccordionRootThemeVariant {} -@Directive({ - selector: '[ngxPrimerAccordionRootThemeVariant]', - standalone: true, - exportAs: 'ngxPrimerAccordionRootThemeVariant', -}) -export class NgxPrimerAccordionRootThemeVariantDirective { - /** - * The accordion root variant. - */ - public readonly variant = model('light', { - alias: 'ngxPrimerAccordionRootVariant', - }); - - /** - * The accordion root size. - */ - public readonly size = model('md', { - alias: 'ngxPrimerAccordionRootSize', - }); - - /** - * The accordion root border radius. - */ - public readonly borderRadius = model( - 'md', - { - alias: 'ngxPrimerAcordionRootBorderRadius', - } - ); - - /** - * The accordion config instance. - */ - protected readonly accordionConfig = injectAccordionConfig(); - - /** - * Check wether the built in theme variants was enabled. - */ - protected get isEnableBuiltinThemeVariant() { - return this.accordionConfig.theme.builtIn; - } - - /** - * Resolve built in theme variant. - */ - protected get useBuiltinThemeVariant() { - return accordionRootThemeVariant({ - size: this.size(), - variant: this.variant(), - borderRadius: this.borderRadius(), - }); - } - - /** - * Bind class attributes to the current accordion root instance. - */ - @HostBinding('class') - public get classLists() { - return this.isEnableBuiltinThemeVariant ? this.useBuiltinThemeVariant : {}; - } -} diff --git a/packages/primitives/accordion/src/directives/animations/collapse-expand-animation/collapse-expand-animation.directive.ts b/packages/primitives/accordion/src/directives/animations/collapse-expand-animation/collapse-expand-animation.directive.ts new file mode 100644 index 0000000..b484d92 --- /dev/null +++ b/packages/primitives/accordion/src/directives/animations/collapse-expand-animation/collapse-expand-animation.directive.ts @@ -0,0 +1,52 @@ +import { CollapsibleState, animationTriggerName } from '../../../utils'; +/* eslint-disable @angular-eslint/no-input-rename */ +import { Directive, HostBinding, input } from '@angular/core'; + +import { NgxPrimerAccordionOrientation } from '../../../configs/accordion-config'; + +@Directive({ + selector: '[ngxPrimerCollapsibleDirective]', + exportAs: 'ngxPrimerCollapsibleDirective', + standalone: true, +}) +export class NgxPrimerCollapseExpandAnimationDirective { + public readonly collapsed = input.required({ + alias: 'ngxPrimerCollapsed', + }); + + public readonly collapsibleDirection = input.required< + NgxPrimerAccordionOrientation | 'Vertical' | 'Horizontal' + >({ + alias: 'ngxPrimerCollapsibleDirection', + }); + + @HostBinding(`@${animationTriggerName}`) + public get animationParams() { + return { + value: this.collapsed() + ? CollapsibleState.Collapsed + : CollapsibleState.Expanded, + params: { + collapsedHeight: + this.collapsibleDirection() === NgxPrimerAccordionOrientation.Vertical + ? '0px' + : '*', + collapsedWidth: + this.collapsibleDirection() === + NgxPrimerAccordionOrientation.Horizontal + ? '0px' + : '*', + expandedHeight: + this.collapsibleDirection() === NgxPrimerAccordionOrientation.Vertical + ? '*' + : '*', + expandedWidth: + this.collapsibleDirection() === + NgxPrimerAccordionOrientation.Horizontal + ? '*' + : '*', + duration: '300ms', + }, + }; + } +} diff --git a/packages/primitives/accordion/src/directives/appearance/accordion-root/accordion-root-style.directive.ts b/packages/primitives/accordion/src/directives/appearance/accordion-root/accordion-root-style.directive.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/packages/primitives/accordion/src/directives/appearance/accordion-root/accordion-root-style.directive.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/primitives/accordion/src/directives/component-context/accordion-content/accordion-content.context.spec.ts b/packages/primitives/accordion/src/directives/component-context/accordion-content/accordion-content.context.spec.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/primitives/accordion/src/directives/component-context/accordion-content/accordion-content.context.ts b/packages/primitives/accordion/src/directives/component-context/accordion-content/accordion-content.context.ts new file mode 100644 index 0000000..4affeda --- /dev/null +++ b/packages/primitives/accordion/src/directives/component-context/accordion-content/accordion-content.context.ts @@ -0,0 +1,32 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +import { Context, ContextDirective } from '@ngx-primer/primitive/utilities'; + +import { Directive, inject, OnInit } from '@angular/core'; +import { NgxPrimerAccordionContentComponent} from '../../../components'; +import { NgxPrimerAccordionContentContext } from '../../../contexts'; + +@Directive({ + selector: '[ngxPrimerAccordionContentContextDirective]', + exportAs: 'ngxPrimerAccordionContentContextDirective', + standalone: true, +}) +export class NgxPrimerAccordionContentContextDirective extends ContextDirective> +implements OnInit{ + + protected override host: NgxPrimerAccordionContentComponent = inject(NgxPrimerAccordionContentComponent, { + host: true, + optional: true + })!; + + protected override context: Context> = inject(NgxPrimerAccordionContentContext, { + optional: true, + })!; + + ngOnInit(): void { + this.context.instance = this.host; + } + + get instance() { + return this.context?.instance as NgxPrimerAccordionContentComponent; + } +} diff --git a/packages/primitives/accordion/src/directives/component-context/accordion-item/accordion-item-context.directive.spec.ts b/packages/primitives/accordion/src/directives/component-context/accordion-item/accordion-item-context.directive.spec.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/primitives/accordion/src/directives/component-context/accordion-item/accordion-item-context.directive.ts b/packages/primitives/accordion/src/directives/component-context/accordion-item/accordion-item-context.directive.ts new file mode 100644 index 0000000..e85fa26 --- /dev/null +++ b/packages/primitives/accordion/src/directives/component-context/accordion-item/accordion-item-context.directive.ts @@ -0,0 +1,32 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +import { Context, ContextDirective } from '@ngx-primer/primitive/utilities'; + +import { Directive, inject, OnInit } from '@angular/core'; +import { NgxPrimerAccordionItemComponent} from '../../../components'; +import { NgxPrimerAccordionItemContext } from '../../../contexts'; + +@Directive({ + selector: '[ngxPrimerAccordionItemContextDirective]', + exportAs: 'ngxPrimerAccordionItemContextDirective', + standalone: true, +}) +export class NgxPrimerAccordionItemContextDirective extends ContextDirective> +implements OnInit{ + + protected override host: NgxPrimerAccordionItemComponent = inject(NgxPrimerAccordionItemComponent, { + host: true, + optional: true + })!; + + protected override context: Context> = inject(NgxPrimerAccordionItemContext, { + optional: true, + })!; + + ngOnInit(): void { + this.context.instance = this.host; + } + + get instance() { + return this.context?.instance as NgxPrimerAccordionItemComponent; + } +} diff --git a/packages/primitives/accordion/src/directives/component-context/accordion-root/accordion-root-context.directive.spec.ts b/packages/primitives/accordion/src/directives/component-context/accordion-root/accordion-root-context.directive.spec.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/primitives/accordion/src/directives/component-context/accordion-root/accordion-root-context.directive.ts b/packages/primitives/accordion/src/directives/component-context/accordion-root/accordion-root-context.directive.ts new file mode 100644 index 0000000..14dfa7a --- /dev/null +++ b/packages/primitives/accordion/src/directives/component-context/accordion-root/accordion-root-context.directive.ts @@ -0,0 +1,36 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +import { Directive, OnInit, inject } from '@angular/core'; + +import { ContextDirective } from '@ngx-primer/primitive/utilities'; +import { NgxPrimerAccordionRootComponent } from '../../../components'; +import { NgxPrimerAccordionRootContext } from '../../../contexts'; + +@Directive({ + selector: '[ngxPrimerAccordionRootContextDirective]', + exportAs: 'ngxPrimerAccordionRootContextDirective', + standalone: true, +}) +export class NgxPrimerAccordionRootContextDirective + extends ContextDirective> + implements OnInit +{ + protected override host: NgxPrimerAccordionRootComponent = inject( + NgxPrimerAccordionRootComponent, + { + host: true, + optional: true, + } + )!; + + protected readonly context = inject(NgxPrimerAccordionRootContext, { + optional: true, + })!; + + ngOnInit(): void { + this.context.instance = this.host; + } + + get instance() { + return this.context?.instance as NgxPrimerAccordionRootComponent; + } +} diff --git a/packages/primitives/accordion/src/directives/component-context/accordion-trigger/accordion-trigger-context.directive.spec.ts b/packages/primitives/accordion/src/directives/component-context/accordion-trigger/accordion-trigger-context.directive.spec.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/primitives/accordion/src/directives/component-context/accordion-trigger/accordion-trigger-context.directive.ts b/packages/primitives/accordion/src/directives/component-context/accordion-trigger/accordion-trigger-context.directive.ts new file mode 100644 index 0000000..dc7b3c0 --- /dev/null +++ b/packages/primitives/accordion/src/directives/component-context/accordion-trigger/accordion-trigger-context.directive.ts @@ -0,0 +1,32 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +import { Context, ContextDirective } from '@ngx-primer/primitive/utilities'; + +import { Directive, inject, OnInit } from '@angular/core'; +import { NgxPrimerAccordionTriggerComponent} from '../../../components'; +import { NgxPrimerAccordionTriggerContext } from '../../../contexts'; + +@Directive({ + selector: '[ngxPrimerAccordionTriggerContextDirective]', + exportAs: 'ngxPrimerAccordionTriggerContextDirective', + standalone: true, +}) +export class NgxPrimerAccordionTriggerContextDirective extends ContextDirective> +implements OnInit{ + + protected override host: NgxPrimerAccordionTriggerComponent = inject(NgxPrimerAccordionTriggerComponent, { + host: true, + optional: true + })!; + + protected override context: Context> = inject(NgxPrimerAccordionTriggerContext, { + optional: true, + })!; + + ngOnInit(): void { + this.context.instance = this.host; + } + + get instance() { + return this.context?.instance as NgxPrimerAccordionTriggerComponent; + } +} diff --git a/packages/primitives/accordion/src/directives/component-context/index.ts b/packages/primitives/accordion/src/directives/component-context/index.ts new file mode 100644 index 0000000..6ec29fa --- /dev/null +++ b/packages/primitives/accordion/src/directives/component-context/index.ts @@ -0,0 +1,4 @@ +export * from './accordion-root/accordion-root-context.directive'; +export * from './accordion-item/accordion-item-context.directive'; +export * from './accordion-content/accordion-content.context'; +export * from './accordion-trigger/accordion-trigger-context.directive'; diff --git a/packages/primitives/accordion/src/directives/index.ts b/packages/primitives/accordion/src/directives/index.ts index 8f4fd77..bf99962 100644 --- a/packages/primitives/accordion/src/directives/index.ts +++ b/packages/primitives/accordion/src/directives/index.ts @@ -1 +1,2 @@ -export * from './accordion-root/accordion-root-theme-variant.directive'; \ No newline at end of file +export * from './animations/collapse-expand-animation/collapse-expand-animation.directive'; +export * from './component-context'; diff --git a/packages/primitives/accordion/src/index.ts b/packages/primitives/accordion/src/index.ts index a8405e3..bdd9265 100644 --- a/packages/primitives/accordion/src/index.ts +++ b/packages/primitives/accordion/src/index.ts @@ -1,3 +1,5 @@ export * from './components'; export * from './directives'; -export * from './themes'; \ No newline at end of file +export * from './themes'; +export * from './tokens'; +export * from './utils'; diff --git a/packages/primitives/accordion/src/tokens/accordion-component.token.ts b/packages/primitives/accordion/src/tokens/accordion-component.token.ts index e73b9b5..cf0d133 100644 --- a/packages/primitives/accordion/src/tokens/accordion-component.token.ts +++ b/packages/primitives/accordion/src/tokens/accordion-component.token.ts @@ -1,6 +1,24 @@ +import { + NgxPrimerAccordionContentComponent, + NgxPrimerAccordionItemComponent, + NgxPrimerAccordionRootComponent, + NgxPrimerAccordionTriggerComponent, +} from '../components'; + import { InjectionToken } from '@angular/core'; -import { NgxPrimerAccordionRootComponent } from '../components'; export const NgxPrimerAccordionRootComponentToken = new InjectionToken< NgxPrimerAccordionRootComponent >('NgxPrimerAccordionRootComponentToken'); + +export const NgxPrimerAccordionItemComponentToken = new InjectionToken< + NgxPrimerAccordionItemComponent +>('NgxPrimerAccordionItemComponentToken'); + +export const NgxPrimerAccordionTriggerComponentToken = new InjectionToken< + NgxPrimerAccordionTriggerComponent +>('NgxPrimerAccordionTriggerComponentToken'); + +export const NgxPrimerAccordionContentComponentToken = new InjectionToken< + NgxPrimerAccordionContentComponent +>('NgxPrimerAccordionContentComponentToken'); diff --git a/packages/primitives/accordion/src/tokens/index.ts b/packages/primitives/accordion/src/tokens/index.ts new file mode 100644 index 0000000..a4b7097 --- /dev/null +++ b/packages/primitives/accordion/src/tokens/index.ts @@ -0,0 +1,2 @@ +export * from './accordion-component.token'; +export * from './accordion-config.token'; diff --git a/packages/primitives/accordion/src/utils/animations/collapse-expand-animation/collapse-expand-animation.ts b/packages/primitives/accordion/src/utils/animations/collapse-expand-animation/collapse-expand-animation.ts new file mode 100644 index 0000000..2f64b1e --- /dev/null +++ b/packages/primitives/accordion/src/utils/animations/collapse-expand-animation/collapse-expand-animation.ts @@ -0,0 +1,71 @@ +import { + animate, + state, + style, + transition, + trigger, +} from '@angular/animations'; +export enum CollapsibleState { + Collapsed = 'collapsed', + Expanded = 'Expanded', +} +export const animationTriggerName = 'ngxPrimerCollapsibleAnimation'; +export const animationTimingDuration = '200ms'; +export const animationEasingFn = 'cubic-bezier(0.5, 0.0, 0.5, 1)'; +const expandedState = state( + CollapsibleState.Expanded, + style({ + maxHeight: '{{expandedHeight}}', + maxWidth: '{{expandedWidth}}', + opacity: 1, + paddingTop: '8px', + paddingBottom: '8px', + paddingLeft: '8px', + paddingRight: '8px', + }), + { + params: { + expandedHeight: '500px', + expandedWidth: '500px', + }, + } +); +const collapsedState = state( + CollapsibleState.Collapsed, + style({ + maxHeight: '{{collapsedHeight}}', + maxWidth: '{{collapsedWidth}}', + opacity: 0, + paddingTop: '0px', + paddingBottom: '0px', + paddingLeft: '8px', + paddingRight: '8px', + }), + { + params: { + collapsedHeight: '0px', + collapsedWidth: '0px', + }, + } +); +export const collapsibleState = { + collapse: collapsedState, + expanded: expandedState, +}; +export const collapsibleTransition = { + default: transition( + `${CollapsibleState.Collapsed} <=> ${CollapsibleState.Expanded}`, + [animate('{{timingDuration}} {{easingFunction}}')], + { + params: { + timingDuration: animationTimingDuration, + easingFunction: animationEasingFn, + }, + } + ), +}; +export const collapseExpandAnimation = trigger(animationTriggerName, [ + collapsibleState.collapse, + collapsibleState.expanded, + collapsibleTransition.default, +]); diff --git a/packages/primitives/accordion/src/utils/animations/index.ts b/packages/primitives/accordion/src/utils/animations/index.ts new file mode 100644 index 0000000..1ae68d3 --- /dev/null +++ b/packages/primitives/accordion/src/utils/animations/index.ts @@ -0,0 +1 @@ +export * from './collapse-expand-animation/collapse-expand-animation'; diff --git a/packages/primitives/accordion/src/utils/index.ts b/packages/primitives/accordion/src/utils/index.ts new file mode 100644 index 0000000..bdc583c --- /dev/null +++ b/packages/primitives/accordion/src/utils/index.ts @@ -0,0 +1 @@ +export * from './animations/collapse-expand-animation/collapse-expand-animation'; diff --git a/packages/primitives/slot/package.json b/packages/primitives/slot/package.json index fc3b84f..f8b0393 100644 --- a/packages/primitives/slot/package.json +++ b/packages/primitives/slot/package.json @@ -1,6 +1,6 @@ { "name": "@ngx-primer/primitive/slot", - "version": "0.0.2-0", + "version": "0.0.2", "peerDependencies": { "@angular/common": "^18.2.0", "@angular/core": "^18.2.0" diff --git a/packages/primitives/utilities/package.json b/packages/primitives/utilities/package.json index 83ca142..49de46b 100644 --- a/packages/primitives/utilities/package.json +++ b/packages/primitives/utilities/package.json @@ -1,6 +1,6 @@ { "name": "@ngx-primer/primitive/utilities", - "version": "0.0.2-0", + "version": "0.0.2", "peerDependencies": { "@angular/core": "^18.2.0", "nanoid": "5.0.8" diff --git a/packages/primitives/utilities/src/directives/event-listeners/index.ts b/packages/primitives/utilities/src/directives/event-listeners/index.ts new file mode 100644 index 0000000..13f00f3 --- /dev/null +++ b/packages/primitives/utilities/src/directives/event-listeners/index.ts @@ -0,0 +1,2 @@ +export * from './keyboard-event/keyboard-event.directive'; +export * from './mouse-event/mouse-event.directive'; diff --git a/packages/primitives/utilities/src/directives/event-listeners/keyboard-event/keyboard-event-key.interface.ts b/packages/primitives/utilities/src/directives/event-listeners/keyboard-event/keyboard-event-key.interface.ts new file mode 100644 index 0000000..852837e --- /dev/null +++ b/packages/primitives/utilities/src/directives/event-listeners/keyboard-event/keyboard-event-key.interface.ts @@ -0,0 +1,12 @@ +export enum FunctionalKey { + Enter = 'Enter', // Activates a button, form submission, etc. + Escape = 'Escape', // Cancels an action or closes a modal. + Tab = 'Tab', // Move focus to the next focusable element. + Backspace = 'Backspace', // Deletes a character to the left. + Delete = 'Delete', // Deletes a character to the right. + ArrowUp = 'ArrowUp', // Moves up (e.g., in dropdowns, lists, etc.). + ArrowDown = 'ArrowDown', // Moves down. + ArrowLeft = 'ArrowLeft', // Moves left. + ArrowRight = 'ArrowRight', // Moves right. + Space = 'Space', // Activates a button or checkbox when focused. +} diff --git a/packages/primitives/utilities/src/directives/event-listeners/keyboard-event/keyboard-event.directive.spec.ts b/packages/primitives/utilities/src/directives/event-listeners/keyboard-event/keyboard-event.directive.spec.ts new file mode 100644 index 0000000..aa45791 --- /dev/null +++ b/packages/primitives/utilities/src/directives/event-listeners/keyboard-event/keyboard-event.directive.spec.ts @@ -0,0 +1,8 @@ +import { NgxPrimerKeyboardEventDirective } from './keyboard-event.directive'; + +describe('KeyboardEventDirective', () => { + it('should create an instance', () => { + const directive = new NgxPrimerKeyboardEventDirective(); + expect(directive).toBeTruthy(); + }); +}); diff --git a/packages/primitives/utilities/src/directives/event-listeners/keyboard-event/keyboard-event.directive.ts b/packages/primitives/utilities/src/directives/event-listeners/keyboard-event/keyboard-event.directive.ts new file mode 100644 index 0000000..9e41f1d --- /dev/null +++ b/packages/primitives/utilities/src/directives/event-listeners/keyboard-event/keyboard-event.directive.ts @@ -0,0 +1,63 @@ +/* eslint-disable @angular-eslint/no-input-rename */ +import { Directive, HostListener, input } from '@angular/core'; + +@Directive({ + selector: '[ngxPrimerKeyboardEventDirective]', + exportAs: 'ngxPrimerKeyboardEventDirective', + standalone: true, +}) +export class NgxPrimerKeyboardEventDirective { + public readonly onKeyUp = input<((event: KeyboardEvent) => void) | null>( + null, + { + alias: 'ngxPrimerOnKeyUpEvent', + } + ); + + public readonly onKeyDown = input<((event: KeyboardEvent) => void) | null>( + null, + { + alias: 'ngxPrimerOnKeyDownEvent', + } + ); + + public readonly onKeyPress = input<((event: KeyboardEvent) => void) | null>( + null, + { + alias: 'ngxPrimerOnKeyPressEvent', + } + ); + + @HostListener('keyup', ['$event']) handleOnKeyUpListener( + event: KeyboardEvent + ) { + if (this.onKeyUp()) { + const onKeyUpFn = this.onKeyUp() as unknown as ( + event: KeyboardEvent + ) => void; + onKeyUpFn(event); + } + } + + @HostListener('keydown', ['$event']) handleOnKeyDownListener( + event: KeyboardEvent + ) { + if (this.onKeyDown()) { + const onKeyDown = this.onKeyDown() as unknown as ( + event: KeyboardEvent + ) => void; + onKeyDown(event); + } + } + + @HostListener('keypress', ['$event']) handleOnKeyPressListener( + event: KeyboardEvent + ) { + if (this.onKeyPress()) { + const onKeyPress = this.onKeyPress() as unknown as ( + event: KeyboardEvent + ) => void; + onKeyPress(event); + } + } +} diff --git a/packages/primitives/utilities/src/directives/event-listeners/keyboard-event/keyboard-event.summaries.md b/packages/primitives/utilities/src/directives/event-listeners/keyboard-event/keyboard-event.summaries.md new file mode 100644 index 0000000..3cc8765 --- /dev/null +++ b/packages/primitives/utilities/src/directives/event-listeners/keyboard-event/keyboard-event.summaries.md @@ -0,0 +1,122 @@ +Here is a comprehensive list of keyboard events in the **DOM** that you can handle using Angular's `@HostListener` or JavaScript. These events are divided into categories based on their purpose: + +--- + +### **1. General Keyboard Events** + +These events are triggered during keyboard interaction. + +| **Event Name** | **Description** | +| -------------- | ------------------------------------------------------------------------------------------- | +| `keydown` | Fired when a key is pressed down. This event fires continuously as long as the key is held. | +| `keypress` | (Deprecated) Similar to `keydown`, but only for printable characters. | +| `keyup` | Fired when a key is released. | + +--- + +### **2. Key Properties (KeyboardEvent API)** + +You can access specific properties in the event object: + +| **Property** | **Description** | +| ------------- | ----------------------------------------------------------------------------- | +| `key` | The value of the key pressed (e.g., `"Enter"`, `"A"`, `"1"`). | +| `code` | The physical key on the keyboard (e.g., `"KeyA"`, `"Digit1"`, `"ArrowUp"`). | +| `altKey` | `true` if the `Alt` key is pressed. | +| `ctrlKey` | `true` if the `Control` key is pressed. | +| `metaKey` | `true` if the `Meta` key is pressed (Windows Key / Command Key on macOS). | +| `shiftKey` | `true` if the `Shift` key is pressed. | +| `repeat` | `true` if the event is fired repeatedly when a key is held down. | +| `isComposing` | `true` if the input method is composing (used for IME - Input Method Editor). | + +--- + +### **3. Commonly Used Keys** + +These are frequently used keys in web applications: + +#### **Functional Keys** + +| **Key** | **Description** | +| ------------ | -------------------------------------------- | +| `Enter` | Activates a button, form submission, etc. | +| `Escape` | Cancels an action or closes a modal. | +| `Tab` | Moves focus to the next focusable element. | +| `Backspace` | Deletes a character to the left. | +| `Delete` | Deletes a character to the right. | +| `ArrowUp` | Moves up (e.g., in dropdowns, lists, etc.). | +| `ArrowDown` | Moves down. | +| `ArrowLeft` | Moves left. | +| `ArrowRight` | Moves right. | +| `Space` | Activates a button or checkbox when focused. | + +#### **Modifier Keys** + +| **Key** | **Description** | +| ------------------ | --------------------------------------------- | +| `Shift` | Used to modify other keys (e.g., uppercase). | +| `Control` / `Ctrl` | Modifier for shortcuts (e.g., `Ctrl+C`). | +| `Alt` | Modifier for alternate functions. | +| `Meta` | Windows Key (Windows) or Command Key (macOS). | + +#### **Navigation Keys** + +| **Key** | **Description** | +| ---------- | --------------------------------------------- | +| `Home` | Moves to the beginning of a document or line. | +| `End` | Moves to the end of a document or line. | +| `PageUp` | Scrolls up one page. | +| `PageDown` | Scrolls down one page. | + +#### **Media Keys (if supported by the device)** + +| **Key** | **Description** | +| -------------------- | ---------------------------- | +| `MediaPlayPause` | Plays/pauses media. | +| `MediaNextTrack` | Skips to the next track. | +| `MediaPreviousTrack` | Skips to the previous track. | +| `VolumeUp` | Increases the volume. | +| `VolumeDown` | Decreases the volume. | +| `Mute` | Mutes the audio. | + +--- + +### **4. Handling Accessibility** + +These keys are commonly used for accessibility purposes: + +| **Key** | **Description** | +| ----------------------- | ------------------------------------------- | +| `ArrowUp` / `ArrowDown` | Navigate within menus, dropdowns, or lists. | +| `Tab` | Navigate between focusable elements. | +| `Enter` | Activates a selected item. | +| `Escape` | Closes dialogs, modals, or dropdowns. | +| `Space` | Activates focused controls like checkboxes. | + +--- + +### **5. Deprecated Keyboard Events** + +- **`keypress`**: Deprecated because it doesn't handle non-printable keys (e.g., `Arrow`, `Escape`). + +--- + +### **6. Key Combinations** + +You can handle key combinations by checking `event.altKey`, `event.ctrlKey`, `event.shiftKey`, or `event.metaKey`. + +#### Examples: + +```typescript +@HostListener('keydown', ['$event']) +handleKeyDown(event: KeyboardEvent): void { + if (event.ctrlKey && event.key === 's') { + console.log('Ctrl+S pressed!'); + event.preventDefault(); // Prevent the default browser save behavior. + } +} +``` + +--- + +Would you like more details on specific scenarios, such as keyboard navigation or shortcut handling? diff --git a/packages/primitives/utilities/src/directives/event-listeners/mouse-event/mouse-event.directive.spec.ts b/packages/primitives/utilities/src/directives/event-listeners/mouse-event/mouse-event.directive.spec.ts new file mode 100644 index 0000000..78a49a7 --- /dev/null +++ b/packages/primitives/utilities/src/directives/event-listeners/mouse-event/mouse-event.directive.spec.ts @@ -0,0 +1,8 @@ +import { NgxPrimerMouseEventDirective } from './mouse-event.directive'; + +describe('MouseEventDirective', () => { + it('should create an instance', () => { + const directive = new NgxPrimerMouseEventDirective(); + expect(directive).toBeTruthy(); + }); +}); diff --git a/packages/primitives/utilities/src/directives/event-listeners/mouse-event/mouse-event.directive.ts b/packages/primitives/utilities/src/directives/event-listeners/mouse-event/mouse-event.directive.ts new file mode 100644 index 0000000..4cc7776 --- /dev/null +++ b/packages/primitives/utilities/src/directives/event-listeners/mouse-event/mouse-event.directive.ts @@ -0,0 +1,17 @@ +/* eslint-disable @angular-eslint/no-output-rename */ +import { Directive, HostListener, output } from '@angular/core'; + +@Directive({ + selector: '[ngxPrimerMouseEventDirective]', + exportAs: 'ngxPrimerMouseEventDirective', + standalone: true, +}) +export class NgxPrimerMouseEventDirective { + protected readonly clickEvent = output({ + alias: 'ngxPrimerOnClickEvent', + }); + + @HostListener('click', ['$event']) handleOnCLickListener(event: MouseEvent) { + this.clickEvent.emit(event); + } +} diff --git a/packages/primitives/utilities/src/directives/id-generator/id-generator.config.ts b/packages/primitives/utilities/src/directives/id-generator/id-generator.config.ts deleted file mode 100644 index bcd0551..0000000 --- a/packages/primitives/utilities/src/directives/id-generator/id-generator.config.ts +++ /dev/null @@ -1,3 +0,0 @@ -export type IdGeneratorConfig = { - prefix: string; -}; diff --git a/packages/primitives/utilities/src/directives/id-generator/id-generator.directive.spec.ts b/packages/primitives/utilities/src/directives/id-generator/id-generator.directive.spec.ts index 26a81b6..246b811 100644 --- a/packages/primitives/utilities/src/directives/id-generator/id-generator.directive.spec.ts +++ b/packages/primitives/utilities/src/directives/id-generator/id-generator.directive.spec.ts @@ -1,124 +1,8 @@ -/* eslint-disable @typescript-eslint/ban-ts-comment */ -import { ElementRef, ViewContainerRef } from '@angular/core'; +import { IdGeneratorDirective } from './id-generator.directive'; -import { IdGeneratorConfig } from '../../providers/id-generator/id-generator.provider'; -import { NgxPrimerIdGeneratorDirective } from './id-generator.directive'; - -describe('NgxPrimerIdGeneratorDirective', () => { - let directive: NgxPrimerIdGeneratorDirective; - let mockElementRef: Partial; - let mockViewContainerRef: Partial; - - beforeEach(() => { - mockElementRef = { - nativeElement: { tagName: 'DIV' }, - }; - mockViewContainerRef = { - element: { - nativeElement: { tagName: 'APP-MY-COMPONENT' }, - }, - }; - - directive = new NgxPrimerIdGeneratorDirective(); - }); - - describe('given a valid configuration and custom ID', () => { - beforeEach(() => { - // @ts-expect-error - directive.customId = () => 'custom-id'; - directive.config = { - prefix: 'test', - separator: '-', - } as Partial; - }); - - describe('when the directive initializes', () => { - it('should generate a unique and sanitized ID', () => { - directive.ngOnInit(); - - expect(directive.generatedId).toMatch( - /^app-my-component-custom-id-\d+-[a-z0-9]+$/ - ); - }); - - it('should correctly sanitize the ID', () => { - // @ts-expect-error - directive.customId = () => 'Invalid@ID'; - directive.ngOnInit(); - - expect(directive.generatedId).toContain('invalid-id'); - }); - }); - }); - - describe('given no custom ID is provided', () => { - beforeEach(() => { - // @ts-expect-error - directive.customId = undefined; - }); - - describe('when the directive initializes', () => { - it('should generate a unique ID based on the component and tag name', () => { - directive.ngOnInit(); - - expect(directive.generatedId).toMatch( - /^app-my-component-div-\d+-[a-z0-9]+$/ - ); - }); - }); - }); - - describe('given an invalid component or tag name', () => { - beforeEach(() => { - mockElementRef.nativeElement = { tagName: 'INVALID@TAG' }; - }); - - describe('when the directive initializes', () => { - it('should sanitize the tag name in the generated ID', () => { - directive.ngOnInit(); - - expect(directive.generatedId).toContain('invalid-tag'); - }); - - it('should still produce a unique ID', () => { - directive.ngOnInit(); - - expect(directive.generatedId).toMatch(/-[a-z0-9]+$/); - }); - }); - }); - - describe('given no host component is resolved', () => { - beforeEach(() => { - // @ts-expect-error - mockViewContainerRef.element.nativeElement = undefined; - }); - - describe('when the directive initializes', () => { - it('should default to an unknown component name', () => { - directive.ngOnInit(); - - expect(directive.generatedId).toContain('unknown-element'); - }); - }); - }); - - describe('given multiple instances of the same tag', () => { - beforeEach(() => { - mockElementRef.nativeElement = { tagName: 'DIV' }; - }); - - describe('when the directive initializes multiple times', () => { - it('should increment the counter for the same tag', () => { - directive.ngOnInit(); - const firstId = directive.generatedId; - - const anotherDirective = new NgxPrimerIdGeneratorDirective(); - anotherDirective.ngOnInit(); - const secondId = anotherDirective.generatedId; - - expect(firstId).not.toEqual(secondId); - }); - }); +describe('IdGeneratorDirective', () => { + it('should create an instance', () => { + const directive = new IdGeneratorDirective(); + expect(directive).toBeTruthy(); }); }); diff --git a/packages/primitives/utilities/src/directives/id-generator/id-generator.directive.ts b/packages/primitives/utilities/src/directives/id-generator/id-generator.directive.ts index 1c443ef..543355d 100644 --- a/packages/primitives/utilities/src/directives/id-generator/id-generator.directive.ts +++ b/packages/primitives/utilities/src/directives/id-generator/id-generator.directive.ts @@ -1,187 +1,63 @@ /* eslint-disable @angular-eslint/no-input-rename */ -/* eslint-disable @typescript-eslint/no-explicit-any */ -/* eslint-disable @typescript-eslint/no-non-null-assertion */ -/** - * Copyright [2024] [ElhakimDev] - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ import { Directive, - ElementRef, HostBinding, - OnInit, ViewContainerRef, + computed, inject, input, } from '@angular/core'; -import { IdGeneratorConfig } from './id-generator.config'; -import { nanoid } from 'nanoid'; +import { customAlphabet } from 'nanoid'; -// Map to track counters for each component and tag -const COMPONENT_COUNTERS: Map> = new Map(); +const nanoid = customAlphabet('1234567890abcdef', 10); +const nextIdentifier = nanoid(10); @Directive({ selector: '[ngxPrimerIdGenerator]', exportAs: 'ngxPrimerIdGenerator', standalone: true, }) -export class NgxPrimerIdGeneratorDirective implements OnInit { - private _config!: IdGeneratorConfig; - - /** - * User-provided custom ID, if any. - * This ID will be used if provided, otherwise, a default ID will be generated. - */ - public readonly customId = input('', { - alias: 'ngxPrimerId', +export class NgxPrimerIdGeneratorDirective { + public readonly idAttr = input('', { + alias: 'ngxPrimerIdAttr', }); - /** - * Access to the element reference. - * Injected to provide direct interaction with the DOM element. - */ - private readonly elementRef = inject(ElementRef); - - /** - * Access to the view container reference. - * This allows interaction with the container where the directive is applied. - */ - private readonly viewContainerRef = inject(ViewContainerRef); - - /** - * The host component instance, if available. - * Will be used to resolve the component's selector for ID generation. - */ - public hostComponent: unknown | null = null; - - @HostBinding('attr.id') - public generatedId!: string; - - /** - * Set configuration options. - * Merges the provided config with the current settings. - */ - set config(config: Partial) { - this._config = { ...this._config, ...config }; - } - - /** - * On initialization, generates and assigns a unique ID to the element. - * The ID is composed of a sanitized component name, tag name, and a unique counter. - */ - ngOnInit(): void { - // Get the component's selector if available - this.hostComponent = this.getComponentSelector(); - const componentName = (this.hostComponent ?? - 'ngx-primer-component') as string; - const tagName = this.elementRef.nativeElement.tagName.toLowerCase(); - - // Initialize counters for components and tags - this.initializeComponentCounters(componentName, tagName); - - // Sanitize the component and tag names for a valid ID format - const sanitizedComponent = this.sanitize(componentName as string); - const sanitizedTag = this.sanitize(tagName); - - // Generate a unique ID for the component - this.generatedId = this.customId - ? `${sanitizedComponent}-${this.sanitize(this.customId())}-${ - COMPONENT_COUNTERS.get(componentName)![tagName] - }-${nanoid()}` - : `${sanitizedComponent}-${sanitizedTag}-${ - COMPONENT_COUNTERS.get(componentName)![tagName] - }-${nanoid()}`; - - // Increment the counter for this component-tag pair - COMPONENT_COUNTERS.get(componentName)![tagName]++; + protected readonly _uniqueKey = nextIdentifier; - // Normalize multiple hyphens to a single one - this.generatedId = this.generatedId.replace(/-+/g, '-').toLowerCase(); + protected readonly _viewContainerRef = inject(ViewContainerRef); - // this.provider.register('NgxPrimerIdGeneratorDirective', this as NgxPrimerIdGeneratorDirective) - } - - /** - * Sanitizes a string by replacing invalid characters with a hyphen. - * Ensures that the component and tag names are valid in the ID. - */ - private sanitize(value: string): string { - return value.replace(/[^a-zA-Z0-9-_\\.]/g, '-').toLowerCase(); - } + protected readonly _element = computed( + () => this._viewContainerRef.element.nativeElement as HTMLElement + ); + protected readonly _hostNodeRef = computed(() => ({ + tagName: this._element().tagName, + localName: this._element().localName, + originalId: this._element().id, + })); - /** - * Initializes the component's counter for a given tag name. - * Ensures that each component-tag combination has a starting counter. - */ - private initializeComponentCounters( - componentName: string, - tagName: string - ): void { - if (!COMPONENT_COUNTERS.has(componentName)) { - COMPONENT_COUNTERS.set(componentName, {}); - } + protected readonly _resolvedId = computed(() => { + const { id, ...parts } = this.resolveHostId(); + return id ?? Object.values(parts).join('-'); + }); - const tagCounters = COMPONENT_COUNTERS.get(componentName)!; - if (!tagCounters[tagName]) { - tagCounters[tagName] = 0; + protected resolveHostId() { + if (this._element().id.length !== 0) { + return { id: this._element().id }; } - } - - /** - * Resolves the host component selector from the view container reference. - * If no component is found, defaults to 'unknown-component'. - */ - private getComponentSelector(): string | null { - const nativeElement = this.viewContainerRef.element.nativeElement; - - const tagName = nativeElement.tagName?.toLowerCase(); - if (tagName) return tagName; - - // Try to resolve the host component if tag name is not available - const hostComponent = this.resolveHostComponent(); - return hostComponent - ? (hostComponent.constructor as any).selector ?? 'unknown-component' - : 'unknown-element'; - } - - /** - * Resolves the host component from the view container. - * This function uses the internal `_lContainer` to fetch the component. - */ - private resolveHostComponent(): unknown | null { - const lContainer = (this.viewContainerRef as any)._lContainer; - if (!lContainer) return null; - // Indexing used to resolve the component's context from the LView container - const HOST_INDEX = 0; - const CONTEXT_INDEX = 8; + const customPrefix = this.idAttr(); + const componentName = this._hostNodeRef().localName; + const uniquedIdentifierKey = this._uniqueKey; - const lView = lContainer[HOST_INDEX]; - return lView ? lView[CONTEXT_INDEX] || null : null; + return { + customPrefix, + componentName, + uniquedIdentifierKey, + }; } - /** - * A snapshot of the current component counters. - * Returns an array of components and their respective tag counters. - */ - get countersSnapshot() { - return Array.from(COMPONENT_COUNTERS.entries()).map( - ([component, tags]) => ({ - component, - tags, - }) - ); + @HostBinding('attr.id') get resolvedId() { + return this._resolvedId(); } } diff --git a/packages/primitives/utilities/src/directives/index.ts b/packages/primitives/utilities/src/directives/index.ts index c386b5d..dd44abb 100644 --- a/packages/primitives/utilities/src/directives/index.ts +++ b/packages/primitives/utilities/src/directives/index.ts @@ -1 +1,2 @@ export * from './id-generator/id-generator.directive'; +export * from './event-listeners'; diff --git a/packages/primitives/utilities/src/index.ts b/packages/primitives/utilities/src/index.ts index 0fd8dfa..963da9e 100644 --- a/packages/primitives/utilities/src/index.ts +++ b/packages/primitives/utilities/src/index.ts @@ -1,2 +1,3 @@ -export * from './directives/id-generator/id-generator.directive'; export * from './utils/context/context'; +export * from './utils/context/context-directive'; +export * from './directives'; diff --git a/packages/primitives/utilities/src/utils/context/context-directive.ts b/packages/primitives/utilities/src/utils/context/context-directive.ts new file mode 100644 index 0000000..67430a7 --- /dev/null +++ b/packages/primitives/utilities/src/utils/context/context-directive.ts @@ -0,0 +1,12 @@ +import { Context } from './context'; +import { Directive } from '@angular/core'; + +@Directive({ + selector: '[ngxPrimerContextDirective]', + exportAs: 'ngxPrimerContextDirective', + standalone: true, +}) +export abstract class ContextDirective { + protected abstract readonly host: T; + protected abstract readonly context: Context; +} diff --git a/packages/primitives/utilities/src/utils/context/context.ts b/packages/primitives/utilities/src/utils/context/context.ts index 0e0d265..ce4a654 100644 --- a/packages/primitives/utilities/src/utils/context/context.ts +++ b/packages/primitives/utilities/src/utils/context/context.ts @@ -1,7 +1,7 @@ -import { Component, Injectable, signal } from '@angular/core'; +import { Injectable, signal } from '@angular/core'; @Injectable() -export abstract class Context { +export abstract class Context { private _instance = signal(null); set instance(instance: T) { @@ -9,6 +9,6 @@ export abstract class Context { } get instance(): T | null { - return this._instance(); + return this._instance() as T; } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d618308..1776b66 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,10 +9,10 @@ importers: dependencies: '@analogjs/content': specifier: ^1.7.0 - version: 1.9.4(eziz7pypilkdu6gvivmuk3c4am) + version: 1.9.4(o2i2lnlh4hta6usg74df5sntw4) '@analogjs/router': specifier: ^1.7.0 - version: 1.9.4(@analogjs/content@1.9.4(eziz7pypilkdu6gvivmuk3c4am))(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10))(@angular/router@18.2.13(@angular/common@18.2.13(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10))(@angular/platform-browser@18.2.13(@angular/animations@18.2.13(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10)))(@angular/common@18.2.13(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10)))(rxjs@7.8.1)) + version: 1.9.4(@analogjs/content@1.9.4(o2i2lnlh4hta6usg74df5sntw4))(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10))(@angular/router@18.2.13(@angular/common@18.2.13(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10))(@angular/platform-browser@18.2.13(@angular/animations@18.2.13(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10)))(@angular/common@18.2.13(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10)))(rxjs@7.8.1)) '@angular/animations': specifier: ~18.2.13 version: 18.2.13(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10)) @@ -70,7 +70,7 @@ importers: devDependencies: '@analogjs/platform': specifier: 1.10.0-beta.6 - version: 1.10.0-beta.6(nyoojjlqzpoaiiylwftngxmatm) + version: 1.10.0-beta.6(d2pvisb3dcolhizruxpy64qjtm) '@analogjs/vite-plugin-angular': specifier: ^1.9.0 version: 1.9.4(eqvhc5kwfcihayihcvjnnlx36i) @@ -98,36 +98,42 @@ importers: '@eslint/js': specifier: ^9.15.0 version: 9.15.0 + '@ng-icons/core': + specifier: ^29.10.0 + version: 29.10.0(@angular/common@18.2.13(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1) + '@ng-icons/heroicons': + specifier: ^29.10.0 + version: 29.10.0 '@nx/angular': - specifier: 20.1.0 - version: 20.1.0(@angular-devkit/build-angular@18.2.12(hn5fv266wbcc3iqid2ur7btcfm))(@angular-devkit/core@18.2.12(chokidar@3.6.0))(@angular-devkit/schematics@18.2.12(chokidar@3.6.0))(@babel/traverse@7.25.9)(@schematics/angular@18.2.12(chokidar@3.6.0))(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(@zkochan/js-yaml@0.0.7)(eslint@9.15.0(jiti@2.4.0))(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.1)(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0))(vue-template-compiler@2.7.16)(vue-tsc@1.8.27(typescript@5.5.4)) + specifier: 20.1.3 + version: 20.1.3(@angular-devkit/build-angular@18.2.12(hn5fv266wbcc3iqid2ur7btcfm))(@angular-devkit/core@18.2.12(chokidar@3.6.0))(@angular-devkit/schematics@18.2.12(chokidar@3.6.0))(@babel/traverse@7.25.9)(@schematics/angular@18.2.12(chokidar@3.6.0))(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(@zkochan/js-yaml@0.0.7)(eslint@9.15.0(jiti@2.4.0))(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.1)(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0))(vue-template-compiler@2.7.16)(vue-tsc@1.8.27(typescript@5.5.4)) '@nx/devkit': - specifier: 20.1.0 - version: 20.1.0(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))) + specifier: 20.1.3 + version: 20.1.3(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))) '@nx/eslint': - specifier: 20.1.0 - version: 20.1.0(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(@zkochan/js-yaml@0.0.7)(eslint@9.15.0(jiti@2.4.0))(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0)) + specifier: 20.1.3 + version: 20.1.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(@zkochan/js-yaml@0.0.7)(eslint@9.15.0(jiti@2.4.0))(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0)) '@nx/eslint-plugin': - specifier: 20.1.0 - version: 20.1.0(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(@typescript-eslint/parser@8.16.0(eslint@9.15.0(jiti@2.4.0))(typescript@5.5.4))(eslint-config-prettier@9.1.0(eslint@9.15.0(jiti@2.4.0)))(eslint@9.15.0(jiti@2.4.0))(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0)) + specifier: 20.1.3 + version: 20.1.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(@typescript-eslint/parser@8.16.0(eslint@9.15.0(jiti@2.4.0))(typescript@5.5.4))(eslint-config-prettier@9.1.0(eslint@9.15.0(jiti@2.4.0)))(eslint@9.15.0(jiti@2.4.0))(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0)) '@nx/jest': - specifier: 20.1.0 - version: 20.1.0(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(typescript@5.5.4))(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0)) + specifier: 20.1.3 + version: 20.1.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(typescript@5.5.4))(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0)) '@nx/js': - specifier: 20.1.0 - version: 20.1.0(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0)) + specifier: 20.1.3 + version: 20.1.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0)) '@nx/playwright': - specifier: 20.1.0 - version: 20.1.0(@babel/traverse@7.25.9)(@playwright/test@1.49.0)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(@zkochan/js-yaml@0.0.7)(eslint@9.15.0(jiti@2.4.0))(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0))(vite@5.4.11(@types/node@18.16.9)(less@4.1.3)(sass@1.81.0)(stylus@0.64.0)(terser@5.31.6))(vitest@2.1.6)(vue-template-compiler@2.7.16)(vue-tsc@1.8.27(typescript@5.5.4)) + specifier: 20.1.3 + version: 20.1.3(@babel/traverse@7.25.9)(@playwright/test@1.49.0)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(@zkochan/js-yaml@0.0.7)(eslint@9.15.0(jiti@2.4.0))(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0))(vite@5.4.11(@types/node@18.16.9)(less@4.1.3)(sass@1.81.0)(stylus@0.64.0)(terser@5.31.6))(vitest@2.1.6)(vue-template-compiler@2.7.16)(vue-tsc@1.8.27(typescript@5.5.4)) '@nx/vite': - specifier: 20.1.0 - version: 20.1.0(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0))(vite@5.4.11(@types/node@18.16.9)(less@4.1.3)(sass@1.81.0)(stylus@0.64.0)(terser@5.31.6))(vitest@2.1.6) + specifier: 20.1.3 + version: 20.1.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0))(vite@5.4.11(@types/node@18.16.9)(less@4.1.3)(sass@1.81.0)(stylus@0.64.0)(terser@5.31.6))(vitest@2.1.6) '@nx/web': - specifier: 20.1.0 - version: 20.1.0(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0)) + specifier: 20.1.3 + version: 20.1.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0)) '@nx/workspace': - specifier: 20.1.0 - version: 20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)) + specifier: 20.1.3 + version: 20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)) '@playwright/test': specifier: ^1.49.0 version: 1.49.0 @@ -201,8 +207,8 @@ importers: specifier: ~18.2.1 version: 18.2.1(@angular/compiler-cli@18.2.13(@angular/compiler@18.2.13(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.5.4))(tailwindcss@3.4.15(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(typescript@5.5.4)))(tslib@2.8.1)(typescript@5.5.4) nx: - specifier: 20.1.0 - version: 20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)) + specifier: 20.1.3 + version: 20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)) postcss: specifier: ^8.4.49 version: 8.4.49 @@ -3720,6 +3726,22 @@ packages: } engines: { node: '>=18.0.0' } + '@ng-icons/core@29.10.0': + resolution: + { + integrity: sha512-PR6SO00yvFhwDhh37BWhtAgRfzxuXpJQBsAQ44Pg3gjc83fOAwOtMSXizYwtN0uUFIkAYZHZCEuV7Sb8eosK+w==, + } + peerDependencies: + '@angular/common': '>=18.0.0' + '@angular/core': '>=18.0.0' + rxjs: ^6.5.3 || ^7.4.0 + + '@ng-icons/heroicons@29.10.0': + resolution: + { + integrity: sha512-xUUXUYFL42eO0J14JOWoom/hxvBZr6E5H34icVNIThX022SjIArFYUQ21U5pf9KMoUDp9wxQJCKAGK1ZJbtmTA==, + } + '@ngtools/webpack@18.2.12': resolution: { @@ -3821,10 +3843,10 @@ packages: } engines: { node: ^16.14.0 || >=18.0.0 } - '@nx/angular@20.1.0': + '@nx/angular@20.1.3': resolution: { - integrity: sha512-13WlZuZ6Ln7KGn+H2jWGKEP0NpFcdo6Eevls09DDUB+A6iYEpo1DsWCeST18Y2ywjaK0i5zWxfhYhFnP7rSlzQ==, + integrity: sha512-A+AJc0FNwlPb9jafpXVAHI+Z+xlpxN3ROfYFpb3g6/SJ8NHMDybphR6DxlNi0UJMKV5+96p0v4MJ2UIk7NMoaQ==, } peerDependencies: '@angular-devkit/build-angular': '>= 16.0.0 < 19.0.0' @@ -3833,18 +3855,18 @@ packages: '@schematics/angular': '>= 16.0.0 < 19.0.0' rxjs: ^6.5.3 || ^7.5.0 - '@nx/devkit@20.1.0': + '@nx/devkit@20.1.3': resolution: { - integrity: sha512-TDWT3d7nei+FtqoZscR7KtbQ9BXzV1c1Wvk9UUejo7eXbrQ/+YnHVVze8EMuIgTXaHxNIBTKGUPcRi3cibmCDw==, + integrity: sha512-+bNCRNSHKS7SS4Q2xI/p4hhd4mIibIbeF+hpF3TLO5wxyXbrYGSdhCVK5SwclwWUN/KhcKQjOrVGW5CKAm7HAw==, } peerDependencies: nx: '>= 19 <= 21' - '@nx/eslint-plugin@20.1.0': + '@nx/eslint-plugin@20.1.3': resolution: { - integrity: sha512-INNNpcED5qfmqSHzDapwoSWppd0ryfAtP/9HlMj8C3F8Sjy9LjxVKOFINsbilbNmxKVxxuDGix4gRl8s1YnjQA==, + integrity: sha512-EnYr8HxFZDVckugKMvb7DDkYeyZ4zMJDckPiqCJZAEnUgr97usk2kUDAc5LYyBfTohQPKC84t81ztcIRZ9jMbw==, } peerDependencies: '@typescript-eslint/parser': ^6.13.2 || ^7.0.0 || ^8.0.0 @@ -3853,10 +3875,10 @@ packages: eslint-config-prettier: optional: true - '@nx/eslint@20.1.0': + '@nx/eslint@20.1.3': resolution: { - integrity: sha512-r33P116QT5d8iLS18pZKOp1VBUueprESjHrVozDhUmTy0d/Xu5y/ExbhxcnlSicHFPxM7auYUoj1vE/6llRLQw==, + integrity: sha512-XYgnBmQwYRCKHocTKvEVaeugg/TspaoUUJW5cr0lPywEEUnxwQoGMl91CK+rll079mJp9CIBD7zeZs5rZgqVcQ==, } peerDependencies: '@zkochan/js-yaml': 0.0.7 @@ -3865,16 +3887,16 @@ packages: '@zkochan/js-yaml': optional: true - '@nx/jest@20.1.0': + '@nx/jest@20.1.3': resolution: { - integrity: sha512-miFXntl6XcdexPBedPfef9Lhc4VamqL1VhSCRz7xVRHY8MPq5dloGhr9TFx6KI0t8/IHfJ3cYZbhgi/1Uaw1GA==, + integrity: sha512-OGP7iCrpfuVscVeMtQRvC/dvCkyNKSuoqcEnP9bs79agKknxhpvhFmFNwELh9Ovcf6MJber13QeSZCE+p9rxOw==, } - '@nx/js@20.1.0': + '@nx/js@20.1.3': resolution: { - integrity: sha512-E5iDtTchK1vkEGFHXUM+PZnIvQvs3JjK+3SUfPfobVV60jKb4T2YiBLJPqXdk123hwVGKSKebgrUhO6mGGNMFQ==, + integrity: sha512-PS6GjPWS0u37JJ6Gh7MVq+r25p5YRHcm+FlxzIfngDesLB8rZ2GFgztsz2r21WlOncGurDmjzJ8aRKQZNWXl8Q==, } peerDependencies: verdaccio: ^5.0.4 @@ -3882,100 +3904,100 @@ packages: verdaccio: optional: true - '@nx/nx-darwin-arm64@20.1.0': + '@nx/nx-darwin-arm64@20.1.3': resolution: { - integrity: sha512-fel9LpSWuwY0cGAsRFEPxLp6J5VcK/5sjeWA0lZWrFf1oQJCOlKBfkxzi384Nd7eK5JSjxIXrpYfRLaqSbp+IA==, + integrity: sha512-m0Rwawht7Jwq6u2QPmAtsv+khFsTUIZUfiO1kXGcKOX3nQdJ7i82zLRd5yGbrDTAyRbAsgWO3v8zWQyhC1oGjw==, } engines: { node: '>= 10' } cpu: [arm64] os: [darwin] - '@nx/nx-darwin-x64@20.1.0': + '@nx/nx-darwin-x64@20.1.3': resolution: { - integrity: sha512-l1DB8dk2rCLGgXW26HmFOKYpUCF259LRus8z+z7dsFv5vz9TeN+fk5m9aAdiENgMA2cGlndQQW+E8UIo3yv+9g==, + integrity: sha512-WsQK1sxOJFzD0vOtFqSHpLzWuFO4vG7G1PUyJ1Y5mPo4vbRslqoAUTqF7n42bBRPY/lE2aT7BqAAj8hm4PgcnQ==, } engines: { node: '>= 10' } cpu: [x64] os: [darwin] - '@nx/nx-freebsd-x64@20.1.0': + '@nx/nx-freebsd-x64@20.1.3': resolution: { - integrity: sha512-f8uMRIhiOA/73cIjiyS3gpKvaAtsHgyUkkoCOPc4xdxoSLAjlxb6VOUPIFj9rzLA6qQXImVpsiNPG+p1sJ1GAQ==, + integrity: sha512-HV57XMtCVPy/0LZtifcEHbOpVNKLTOBFUoUXkmGYBmAKfw7lccfF600/tunTCZ4aijsD6+opEeGHzlDUK0Ir1w==, } engines: { node: '>= 10' } cpu: [x64] os: [freebsd] - '@nx/nx-linux-arm-gnueabihf@20.1.0': + '@nx/nx-linux-arm-gnueabihf@20.1.3': resolution: { - integrity: sha512-M7pay8hFJQZ3uJHlr5hZK/8o1BcHt95hy/SU7Azt7+LKQGOy42tXhHO30As9APzXqRmvoA2Iq1IyrJJicrz+Ew==, + integrity: sha512-RzP0vc4yhXktKxz7iiwVYFkgpyb5TN/lLGcKLMM4kjuyYJ0IUX58Kk5FDoqCy+HMKiMfGyTOT4fP+/UEsgW6qQ==, } engines: { node: '>= 10' } cpu: [arm] os: [linux] - '@nx/nx-linux-arm64-gnu@20.1.0': + '@nx/nx-linux-arm64-gnu@20.1.3': resolution: { - integrity: sha512-A5+Kpk1uwYIj6CPm0DWLVz5wNTN4ewNl7ajLS9YJOi4yHx/FhfMMyPj4ZnbTpc4isuvgZwBZNl8kwFb2RdXq4w==, + integrity: sha512-WCaU5AiGx21C3t3v4+d7nrA1r5Xc5Wk7yVxZFWh+mKHdcqk1JebDIr1qj/7yoKHD2R9k2Vp5x5Kd0pzAGS8AyA==, } engines: { node: '>= 10' } cpu: [arm64] os: [linux] - '@nx/nx-linux-arm64-musl@20.1.0': + '@nx/nx-linux-arm64-musl@20.1.3': resolution: { - integrity: sha512-pWIQPt9Fst1O4dgrWHdU1b+5wpfLmsmaSeRvLQ9b2VFp3tKGko4ie0skme62TuMgpcqMWDBFKs8KgbHESOi7vw==, + integrity: sha512-lKAvR9jNyx/qvk3UZGYNJAoK5mkZc+rDD4gA23tOGYPjNrWHJEgbWycCk5A9tQ4QX4CskCNmkgQx0lOMdLeXsw==, } engines: { node: '>= 10' } cpu: [arm64] os: [linux] - '@nx/nx-linux-x64-gnu@20.1.0': + '@nx/nx-linux-x64-gnu@20.1.3': resolution: { - integrity: sha512-sOpeGOHznk2ztCXzKhRPAKG3WtwaQUsfQ/3aYDXE6z+rSfyZTGY29M/a9FbdjI4cLJX+NdLAAMj15c3VecJ65g==, + integrity: sha512-RKNm7RnTgCSl2HstDb/qMKO9r8o81EUe+UZB5fgjNR89PB757iHUX30kM0xbkiRZui1vIkMAvWcNsidxBnGGfg==, } engines: { node: '>= 10' } cpu: [x64] os: [linux] - '@nx/nx-linux-x64-musl@20.1.0': + '@nx/nx-linux-x64-musl@20.1.3': resolution: { - integrity: sha512-SxnQJhjOvuOfUZnF4Wt4/O/l1e21qpACZzfMaPIvmiTLk9zPJZWtfgbqlKtTXHKWq9DfIUZQqZXRIpHPM1sDZQ==, + integrity: sha512-aCXEWt1WQDPLzgp5I+NfqaP0y4ZKi2aauZMnSO6KE54MnZmvB+B4HQMZvqHM3dfU0jluvLRBmVIPLeTHiCccrw==, } engines: { node: '>= 10' } cpu: [x64] os: [linux] - '@nx/nx-win32-arm64-msvc@20.1.0': + '@nx/nx-win32-arm64-msvc@20.1.3': resolution: { - integrity: sha512-Z/KoaAA+Rg9iqqOPkKZV61MejPoJBOHlecFpq0G4TgKMJEJ/hEsjojq5usO1fUGAbvQT/SXL3pYWgZwhD3VEHw==, + integrity: sha512-625rRYFfoCTu73bjDZ+jOLU0lvEN2heiiUGlErc6GchfcWuIcZy16oyYQzZX69UQqryGkkZVTaoyMXhGS5p7Tg==, } engines: { node: '>= 10' } cpu: [arm64] os: [win32] - '@nx/nx-win32-x64-msvc@20.1.0': + '@nx/nx-win32-x64-msvc@20.1.3': resolution: { - integrity: sha512-pbxacjLsW9vXD9FibvU8Pal/r5+Yq6AaW6I57CDi7jsLt+K6jcS0fP4FlfXT8QFWdx9+bOKNfOsKEIwpirMN1w==, + integrity: sha512-XUbxSB6vUWoixNyCXkaXGkeUy/syqFOBXVh5Wbi6bqwTJ5o6EFUxCnzK/JsK55dfOz+I/jMXJzDWYEDAsikTSA==, } engines: { node: '>= 10' } cpu: [x64] os: [win32] - '@nx/playwright@20.1.0': + '@nx/playwright@20.1.3': resolution: { - integrity: sha512-A/7HCSJVTgobgBq7jS7BtZKmc9XkqEX5I4ogcHfpPr0Ju3xHI2IpqEwkEkb9PQV4jBJs7iQlUd9HK+W3dPP+Wg==, + integrity: sha512-Avl1LN78TX2aSbG8MmE5zyeOVBtzgBjAcM7zx4XaI9xE3ykPkFddCCurORMlMGxlxAUE0WZVa9sQ1zj1iskACQ==, } peerDependencies: '@playwright/test': ^1.36.0 @@ -3983,31 +4005,31 @@ packages: '@playwright/test': optional: true - '@nx/vite@20.1.0': + '@nx/vite@20.1.3': resolution: { - integrity: sha512-Z27yzmhnAdZchfEBHeRM32h6dBlj92UPRp1tmHKei8qzOEd7EzuwYFemp4jSYP/JSQsWIcQ4nyF39tF9kMR0jg==, + integrity: sha512-rVWGGTEo9T2YQobBL/AztWXTjnSVqItpby5xCyBmmx1U4nLswKS39PI18ImUbkmU627P1aPNAx1cBFwgBeq8Fg==, } peerDependencies: vite: ^5.0.0 vitest: ^1.3.1 || ^2.0.0 - '@nx/web@20.1.0': + '@nx/web@20.1.3': resolution: { - integrity: sha512-0mT9f7Usgr3bN4oxO8FdE+w2g1Hm/7/7XqZQ9xoAKG0qM4LB9KOIJolq7fQjXCpmg64lF7t4EqSrvUIqizPoZg==, + integrity: sha512-V2OtqgKx+LIGZAldv5n/tt13FxOXAzWRHnhkxdP/q6/jY43bcHOHJEdtjWlI9gcmrzyGTjErNQejd/3Ux3OtPQ==, } - '@nx/webpack@20.1.0': + '@nx/webpack@20.1.3': resolution: { - integrity: sha512-KBiJDxtv0RjRo7Ud3lgFXRMYCn1sWlNTVMQpP65O0aPs1I0yrriIOeiZhMKZm3xp4r4S9ABIWV1rrz0ILp1Qog==, + integrity: sha512-0tytQ3evuAH3EctkEJe6KuHj7CYXutnXFzlvz/uzNrq/kTLjIaNsjEpihxy3J/Ut1S7EJYG/3LoBqllZS46+XQ==, } - '@nx/workspace@20.1.0': + '@nx/workspace@20.1.3': resolution: { - integrity: sha512-1L432K76uWfo+hR5SD/XIdJGiArXQ6u0+q1MB49slObRNYQHMWqyB3/6C7QRN0sOqh5k893i9wXUH8vokYpPew==, + integrity: sha512-YOFzkvCcREG4sYNrW3GukBiXCUjxfe4dN2qgYZJ7p4aGoStgfIntjP0REwbgdrZMPTQi9gfAQo27+wTJ6O0FwA==, } '@oozcitak/dom@1.15.10': @@ -11396,10 +11418,10 @@ packages: integrity: sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==, } - nx@20.1.0: + nx@20.1.3: resolution: { - integrity: sha512-d8Ywh1AvG3szYqWEHg2n9DHh/hF0jtVhMZKxwsr7n+kSVxp7gE/rHCCfOo8H+OmP030qXoox5e4Ovp7H9CEJnA==, + integrity: sha512-mipsacEpn0gLd/4NSlOgyHW6Ozl++8ZIfuv42RtZEnS3BaGnnW+L2dkt85h4zffq+zBILoudd/VDFzaLY7Yrfw==, } hasBin: true peerDependencies: @@ -15310,13 +15332,13 @@ snapshots: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - '@analogjs/content@1.9.4(eziz7pypilkdu6gvivmuk3c4am)': + '@analogjs/content@1.9.4(o2i2lnlh4hta6usg74df5sntw4)': dependencies: '@angular/common': 18.2.13(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1) '@angular/core': 18.2.13(rxjs@7.8.1)(zone.js@0.14.10) '@angular/platform-browser': 18.2.13(@angular/animations@18.2.13(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10)))(@angular/common@18.2.13(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10)) '@angular/router': 18.2.13(@angular/common@18.2.13(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10))(@angular/platform-browser@18.2.13(@angular/animations@18.2.13(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10)))(@angular/common@18.2.13(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10)))(rxjs@7.8.1) - '@nx/devkit': 20.1.0(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))) + '@nx/devkit': 20.1.3(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))) front-matter: 4.0.2 marked: 5.1.2 marked-gfm-heading-id: 3.2.0(marked@5.1.2) @@ -15326,13 +15348,13 @@ snapshots: rxjs: 7.8.1 tslib: 2.8.1 - '@analogjs/platform@1.10.0-beta.6(nyoojjlqzpoaiiylwftngxmatm)': + '@analogjs/platform@1.10.0-beta.6(d2pvisb3dcolhizruxpy64qjtm)': dependencies: '@analogjs/vite-plugin-angular': 1.10.0-beta.6(eqvhc5kwfcihayihcvjnnlx36i) '@analogjs/vite-plugin-nitro': 1.10.0-beta.6(encoding@0.1.13)(typescript@5.5.4) - '@nx/angular': 20.1.0(@angular-devkit/build-angular@18.2.12(hn5fv266wbcc3iqid2ur7btcfm))(@angular-devkit/core@18.2.12(chokidar@3.6.0))(@angular-devkit/schematics@18.2.12(chokidar@3.6.0))(@babel/traverse@7.25.9)(@schematics/angular@18.2.12(chokidar@3.6.0))(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(@zkochan/js-yaml@0.0.7)(eslint@9.15.0(jiti@2.4.0))(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.1)(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0))(vue-template-compiler@2.7.16)(vue-tsc@1.8.27(typescript@5.5.4)) - '@nx/devkit': 20.1.0(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))) - '@nx/vite': 20.1.0(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0))(vite@5.4.11(@types/node@18.16.9)(less@4.1.3)(sass@1.81.0)(stylus@0.64.0)(terser@5.31.6))(vitest@2.1.6) + '@nx/angular': 20.1.3(@angular-devkit/build-angular@18.2.12(hn5fv266wbcc3iqid2ur7btcfm))(@angular-devkit/core@18.2.12(chokidar@3.6.0))(@angular-devkit/schematics@18.2.12(chokidar@3.6.0))(@babel/traverse@7.25.9)(@schematics/angular@18.2.12(chokidar@3.6.0))(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(@zkochan/js-yaml@0.0.7)(eslint@9.15.0(jiti@2.4.0))(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.1)(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0))(vue-template-compiler@2.7.16)(vue-tsc@1.8.27(typescript@5.5.4)) + '@nx/devkit': 20.1.3(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))) + '@nx/vite': 20.1.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0))(vite@5.4.11(@types/node@18.16.9)(less@4.1.3)(sass@1.81.0)(stylus@0.64.0)(terser@5.31.6))(vitest@2.1.6) marked: 5.1.2 marked-gfm-heading-id: 3.2.0(marked@5.1.2) marked-mangle: 1.1.10(marked@5.1.2) @@ -15367,9 +15389,9 @@ snapshots: - vite - xml2js - '@analogjs/router@1.9.4(@analogjs/content@1.9.4(eziz7pypilkdu6gvivmuk3c4am))(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10))(@angular/router@18.2.13(@angular/common@18.2.13(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10))(@angular/platform-browser@18.2.13(@angular/animations@18.2.13(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10)))(@angular/common@18.2.13(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10)))(rxjs@7.8.1))': + '@analogjs/router@1.9.4(@analogjs/content@1.9.4(o2i2lnlh4hta6usg74df5sntw4))(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10))(@angular/router@18.2.13(@angular/common@18.2.13(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10))(@angular/platform-browser@18.2.13(@angular/animations@18.2.13(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10)))(@angular/common@18.2.13(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10)))(rxjs@7.8.1))': dependencies: - '@analogjs/content': 1.9.4(eziz7pypilkdu6gvivmuk3c4am) + '@analogjs/content': 1.9.4(o2i2lnlh4hta6usg74df5sntw4) '@angular/core': 18.2.13(rxjs@7.8.1)(zone.js@0.14.10) '@angular/router': 18.2.13(@angular/common@18.2.13(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10))(@angular/platform-browser@18.2.13(@angular/animations@18.2.13(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10)))(@angular/common@18.2.13(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10)))(rxjs@7.8.1) tslib: 2.8.1 @@ -18342,6 +18364,17 @@ snapshots: '@netlify/node-cookies': 0.1.0 urlpattern-polyfill: 8.0.2 + '@ng-icons/core@29.10.0(@angular/common@18.2.13(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1)': + dependencies: + '@angular/common': 18.2.13(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1) + '@angular/core': 18.2.13(rxjs@7.8.1)(zone.js@0.14.10) + rxjs: 7.8.1 + tslib: 2.8.1 + + '@ng-icons/heroicons@29.10.0': + dependencies: + tslib: 2.8.1 + '@ngtools/webpack@18.2.12(@angular/compiler-cli@18.2.13(@angular/compiler@18.2.13(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.5.4))(typescript@5.5.4)(webpack@5.94.0(@swc/core@1.5.29(@swc/helpers@0.5.15))(esbuild@0.23.0))': dependencies: '@angular/compiler-cli': 18.2.13(@angular/compiler@18.2.13(@angular/core@18.2.13(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.5.4) @@ -18425,18 +18458,18 @@ snapshots: - bluebird - supports-color - '@nx/angular@20.1.0(@angular-devkit/build-angular@18.2.12(hn5fv266wbcc3iqid2ur7btcfm))(@angular-devkit/core@18.2.12(chokidar@3.6.0))(@angular-devkit/schematics@18.2.12(chokidar@3.6.0))(@babel/traverse@7.25.9)(@schematics/angular@18.2.12(chokidar@3.6.0))(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(@zkochan/js-yaml@0.0.7)(eslint@9.15.0(jiti@2.4.0))(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.1)(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0))(vue-template-compiler@2.7.16)(vue-tsc@1.8.27(typescript@5.5.4))': + '@nx/angular@20.1.3(@angular-devkit/build-angular@18.2.12(hn5fv266wbcc3iqid2ur7btcfm))(@angular-devkit/core@18.2.12(chokidar@3.6.0))(@angular-devkit/schematics@18.2.12(chokidar@3.6.0))(@babel/traverse@7.25.9)(@schematics/angular@18.2.12(chokidar@3.6.0))(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(@zkochan/js-yaml@0.0.7)(eslint@9.15.0(jiti@2.4.0))(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rxjs@7.8.1)(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0))(vue-template-compiler@2.7.16)(vue-tsc@1.8.27(typescript@5.5.4))': dependencies: '@angular-devkit/build-angular': 18.2.12(hn5fv266wbcc3iqid2ur7btcfm) '@angular-devkit/core': 18.2.12(chokidar@3.6.0) '@angular-devkit/schematics': 18.2.12(chokidar@3.6.0) '@module-federation/enhanced': 0.6.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4)(vue-tsc@1.8.27(typescript@5.5.4))(webpack@5.96.1(@swc/core@1.5.29(@swc/helpers@0.5.15))) - '@nx/devkit': 20.1.0(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))) - '@nx/eslint': 20.1.0(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(@zkochan/js-yaml@0.0.7)(eslint@9.15.0(jiti@2.4.0))(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0)) - '@nx/js': 20.1.0(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0)) - '@nx/web': 20.1.0(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0)) - '@nx/webpack': 20.1.0(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0))(vue-template-compiler@2.7.16)(vue-tsc@1.8.27(typescript@5.5.4)) - '@nx/workspace': 20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)) + '@nx/devkit': 20.1.3(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))) + '@nx/eslint': 20.1.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(@zkochan/js-yaml@0.0.7)(eslint@9.15.0(jiti@2.4.0))(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0)) + '@nx/js': 20.1.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0)) + '@nx/web': 20.1.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0)) + '@nx/webpack': 20.1.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0))(vue-template-compiler@2.7.16)(vue-tsc@1.8.27(typescript@5.5.4)) + '@nx/workspace': 20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)) '@phenomnomnominal/tsquery': 5.0.1(typescript@5.5.4) '@schematics/angular': 18.2.12(chokidar@3.6.0) '@typescript-eslint/type-utils': 8.16.0(eslint@9.15.0(jiti@2.4.0))(typescript@5.5.4) @@ -18483,22 +18516,22 @@ snapshots: - vue-tsc - webpack-cli - '@nx/devkit@20.1.0(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))': + '@nx/devkit@20.1.3(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))': dependencies: ejs: 3.1.10 enquirer: 2.3.6 ignore: 5.3.2 minimatch: 9.0.3 - nx: 20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)) + nx: 20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)) semver: 7.6.3 tmp: 0.2.3 tslib: 2.8.1 yargs-parser: 21.1.1 - '@nx/eslint-plugin@20.1.0(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(@typescript-eslint/parser@8.16.0(eslint@9.15.0(jiti@2.4.0))(typescript@5.5.4))(eslint-config-prettier@9.1.0(eslint@9.15.0(jiti@2.4.0)))(eslint@9.15.0(jiti@2.4.0))(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0))': + '@nx/eslint-plugin@20.1.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(@typescript-eslint/parser@8.16.0(eslint@9.15.0(jiti@2.4.0))(typescript@5.5.4))(eslint-config-prettier@9.1.0(eslint@9.15.0(jiti@2.4.0)))(eslint@9.15.0(jiti@2.4.0))(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0))': dependencies: - '@nx/devkit': 20.1.0(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))) - '@nx/js': 20.1.0(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0)) + '@nx/devkit': 20.1.3(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))) + '@nx/js': 20.1.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0)) '@typescript-eslint/parser': 8.16.0(eslint@9.15.0(jiti@2.4.0))(typescript@5.5.4) '@typescript-eslint/type-utils': 8.16.0(eslint@9.15.0(jiti@2.4.0))(typescript@5.5.4) '@typescript-eslint/utils': 8.16.0(eslint@9.15.0(jiti@2.4.0))(typescript@5.5.4) @@ -18523,10 +18556,10 @@ snapshots: - typescript - verdaccio - '@nx/eslint@20.1.0(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(@zkochan/js-yaml@0.0.7)(eslint@9.15.0(jiti@2.4.0))(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0))': + '@nx/eslint@20.1.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(@zkochan/js-yaml@0.0.7)(eslint@9.15.0(jiti@2.4.0))(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0))': dependencies: - '@nx/devkit': 20.1.0(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))) - '@nx/js': 20.1.0(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(typescript@5.4.5)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0)) + '@nx/devkit': 20.1.3(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))) + '@nx/js': 20.1.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(typescript@5.4.5)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0)) eslint: 9.15.0(jiti@2.4.0) semver: 7.6.3 tslib: 2.8.1 @@ -18544,12 +18577,12 @@ snapshots: - supports-color - verdaccio - '@nx/jest@20.1.0(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(typescript@5.5.4))(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0))': + '@nx/jest@20.1.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(ts-node@10.9.1(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(typescript@5.5.4))(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0))': dependencies: '@jest/reporters': 29.7.0 '@jest/test-result': 29.7.0 - '@nx/devkit': 20.1.0(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))) - '@nx/js': 20.1.0(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0)) + '@nx/devkit': 20.1.3(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))) + '@nx/js': 20.1.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0)) '@phenomnomnominal/tsquery': 5.0.1(typescript@5.5.4) chalk: 4.1.2 identity-obj-proxy: 3.0.0 @@ -18576,7 +18609,7 @@ snapshots: - typescript - verdaccio - '@nx/js@20.1.0(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(typescript@5.4.5)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0))': + '@nx/js@20.1.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(typescript@5.4.5)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0))': dependencies: '@babel/core': 7.26.0 '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.26.0) @@ -18585,8 +18618,8 @@ snapshots: '@babel/preset-env': 7.26.0(@babel/core@7.26.0) '@babel/preset-typescript': 7.26.0(@babel/core@7.26.0) '@babel/runtime': 7.26.0 - '@nx/devkit': 20.1.0(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))) - '@nx/workspace': 20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)) + '@nx/devkit': 20.1.3(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))) + '@nx/workspace': 20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)) '@zkochan/js-yaml': 0.0.7 babel-plugin-const-enum: 1.2.0(@babel/core@7.26.0) babel-plugin-macros: 2.8.0 @@ -18621,7 +18654,7 @@ snapshots: - supports-color - typescript - '@nx/js@20.1.0(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0))': + '@nx/js@20.1.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0))': dependencies: '@babel/core': 7.26.0 '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.26.0) @@ -18630,8 +18663,8 @@ snapshots: '@babel/preset-env': 7.26.0(@babel/core@7.26.0) '@babel/preset-typescript': 7.26.0(@babel/core@7.26.0) '@babel/runtime': 7.26.0 - '@nx/devkit': 20.1.0(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))) - '@nx/workspace': 20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)) + '@nx/devkit': 20.1.3(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))) + '@nx/workspace': 20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)) '@zkochan/js-yaml': 0.0.7 babel-plugin-const-enum: 1.2.0(@babel/core@7.26.0) babel-plugin-macros: 2.8.0 @@ -18666,43 +18699,43 @@ snapshots: - supports-color - typescript - '@nx/nx-darwin-arm64@20.1.0': + '@nx/nx-darwin-arm64@20.1.3': optional: true - '@nx/nx-darwin-x64@20.1.0': + '@nx/nx-darwin-x64@20.1.3': optional: true - '@nx/nx-freebsd-x64@20.1.0': + '@nx/nx-freebsd-x64@20.1.3': optional: true - '@nx/nx-linux-arm-gnueabihf@20.1.0': + '@nx/nx-linux-arm-gnueabihf@20.1.3': optional: true - '@nx/nx-linux-arm64-gnu@20.1.0': + '@nx/nx-linux-arm64-gnu@20.1.3': optional: true - '@nx/nx-linux-arm64-musl@20.1.0': + '@nx/nx-linux-arm64-musl@20.1.3': optional: true - '@nx/nx-linux-x64-gnu@20.1.0': + '@nx/nx-linux-x64-gnu@20.1.3': optional: true - '@nx/nx-linux-x64-musl@20.1.0': + '@nx/nx-linux-x64-musl@20.1.3': optional: true - '@nx/nx-win32-arm64-msvc@20.1.0': + '@nx/nx-win32-arm64-msvc@20.1.3': optional: true - '@nx/nx-win32-x64-msvc@20.1.0': + '@nx/nx-win32-x64-msvc@20.1.3': optional: true - '@nx/playwright@20.1.0(@babel/traverse@7.25.9)(@playwright/test@1.49.0)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(@zkochan/js-yaml@0.0.7)(eslint@9.15.0(jiti@2.4.0))(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0))(vite@5.4.11(@types/node@18.16.9)(less@4.1.3)(sass@1.81.0)(stylus@0.64.0)(terser@5.31.6))(vitest@2.1.6)(vue-template-compiler@2.7.16)(vue-tsc@1.8.27(typescript@5.5.4))': + '@nx/playwright@20.1.3(@babel/traverse@7.25.9)(@playwright/test@1.49.0)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(@zkochan/js-yaml@0.0.7)(eslint@9.15.0(jiti@2.4.0))(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0))(vite@5.4.11(@types/node@18.16.9)(less@4.1.3)(sass@1.81.0)(stylus@0.64.0)(terser@5.31.6))(vitest@2.1.6)(vue-template-compiler@2.7.16)(vue-tsc@1.8.27(typescript@5.5.4))': dependencies: - '@nx/devkit': 20.1.0(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))) - '@nx/eslint': 20.1.0(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(@zkochan/js-yaml@0.0.7)(eslint@9.15.0(jiti@2.4.0))(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0)) - '@nx/js': 20.1.0(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0)) - '@nx/vite': 20.1.0(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0))(vite@5.4.11(@types/node@18.16.9)(less@4.1.3)(sass@1.81.0)(stylus@0.64.0)(terser@5.31.6))(vitest@2.1.6) - '@nx/webpack': 20.1.0(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0))(vue-template-compiler@2.7.16)(vue-tsc@1.8.27(typescript@5.5.4)) + '@nx/devkit': 20.1.3(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))) + '@nx/eslint': 20.1.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(@zkochan/js-yaml@0.0.7)(eslint@9.15.0(jiti@2.4.0))(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0)) + '@nx/js': 20.1.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0)) + '@nx/vite': 20.1.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0))(vite@5.4.11(@types/node@18.16.9)(less@4.1.3)(sass@1.81.0)(stylus@0.64.0)(terser@5.31.6))(vitest@2.1.6) + '@nx/webpack': 20.1.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0))(vue-template-compiler@2.7.16)(vue-tsc@1.8.27(typescript@5.5.4)) '@phenomnomnominal/tsquery': 5.0.1(typescript@5.5.4) minimatch: 9.0.3 tslib: 2.8.1 @@ -18743,10 +18776,10 @@ snapshots: - vue-tsc - webpack-cli - '@nx/vite@20.1.0(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0))(vite@5.4.11(@types/node@18.16.9)(less@4.1.3)(sass@1.81.0)(stylus@0.64.0)(terser@5.31.6))(vitest@2.1.6)': + '@nx/vite@20.1.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0))(vite@5.4.11(@types/node@18.16.9)(less@4.1.3)(sass@1.81.0)(stylus@0.64.0)(terser@5.31.6))(vitest@2.1.6)': dependencies: - '@nx/devkit': 20.1.0(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))) - '@nx/js': 20.1.0(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0)) + '@nx/devkit': 20.1.3(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))) + '@nx/js': 20.1.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0)) '@phenomnomnominal/tsquery': 5.0.1(typescript@5.5.4) '@swc/helpers': 0.5.15 enquirer: 2.3.6 @@ -18766,10 +18799,10 @@ snapshots: - typescript - verdaccio - '@nx/web@20.1.0(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0))': + '@nx/web@20.1.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0))': dependencies: - '@nx/devkit': 20.1.0(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))) - '@nx/js': 20.1.0(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0)) + '@nx/devkit': 20.1.3(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))) + '@nx/js': 20.1.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0)) detect-port: 1.6.1 http-server: 14.1.1 picocolors: 1.1.1 @@ -18786,13 +18819,13 @@ snapshots: - typescript - verdaccio - '@nx/webpack@20.1.0(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0))(vue-template-compiler@2.7.16)(vue-tsc@1.8.27(typescript@5.5.4))': + '@nx/webpack@20.1.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0))(vue-template-compiler@2.7.16)(vue-tsc@1.8.27(typescript@5.5.4))': dependencies: '@babel/core': 7.26.0 '@module-federation/enhanced': 0.6.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.4)(vue-tsc@1.8.27(typescript@5.5.4))(webpack@5.96.1(@swc/core@1.5.29(@swc/helpers@0.5.15))) '@module-federation/sdk': 0.6.16 - '@nx/devkit': 20.1.0(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))) - '@nx/js': 20.1.0(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0)) + '@nx/devkit': 20.1.3(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))) + '@nx/js': 20.1.3(@babel/traverse@7.25.9)(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))(@types/node@18.16.9)(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)))(typescript@5.5.4)(verdaccio@5.33.0(encoding@0.1.13)(typanion@3.14.0)) '@phenomnomnominal/tsquery': 5.0.1(typescript@5.5.4) ajv: 8.17.1 autoprefixer: 10.4.20(postcss@8.4.49) @@ -18860,12 +18893,12 @@ snapshots: - vue-tsc - webpack-cli - '@nx/workspace@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))': + '@nx/workspace@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))': dependencies: - '@nx/devkit': 20.1.0(nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))) + '@nx/devkit': 20.1.3(nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15))) chalk: 4.1.2 enquirer: 2.3.6 - nx: 20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)) + nx: 20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)) tslib: 2.8.1 yargs-parser: 21.1.1 transitivePeerDependencies: @@ -23987,7 +24020,7 @@ snapshots: nwsapi@2.2.13: {} - nx@20.1.0(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)): + nx@20.1.3(@swc-node/register@1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4))(@swc/core@1.5.29(@swc/helpers@0.5.15)): dependencies: '@napi-rs/wasm-runtime': 0.2.4 '@yarnpkg/lockfile': 1.1.0 @@ -24022,16 +24055,16 @@ snapshots: yargs: 17.7.2 yargs-parser: 21.1.1 optionalDependencies: - '@nx/nx-darwin-arm64': 20.1.0 - '@nx/nx-darwin-x64': 20.1.0 - '@nx/nx-freebsd-x64': 20.1.0 - '@nx/nx-linux-arm-gnueabihf': 20.1.0 - '@nx/nx-linux-arm64-gnu': 20.1.0 - '@nx/nx-linux-arm64-musl': 20.1.0 - '@nx/nx-linux-x64-gnu': 20.1.0 - '@nx/nx-linux-x64-musl': 20.1.0 - '@nx/nx-win32-arm64-msvc': 20.1.0 - '@nx/nx-win32-x64-msvc': 20.1.0 + '@nx/nx-darwin-arm64': 20.1.3 + '@nx/nx-darwin-x64': 20.1.3 + '@nx/nx-freebsd-x64': 20.1.3 + '@nx/nx-linux-arm-gnueabihf': 20.1.3 + '@nx/nx-linux-arm64-gnu': 20.1.3 + '@nx/nx-linux-arm64-musl': 20.1.3 + '@nx/nx-linux-x64-gnu': 20.1.3 + '@nx/nx-linux-x64-musl': 20.1.3 + '@nx/nx-win32-arm64-msvc': 20.1.3 + '@nx/nx-win32-x64-msvc': 20.1.3 '@swc-node/register': 1.9.2(@swc/core@1.5.29(@swc/helpers@0.5.15))(@swc/types@0.1.17)(typescript@5.5.4) '@swc/core': 1.5.29(@swc/helpers@0.5.15) transitivePeerDependencies: diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..12a703d --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/project.json b/project.json index e5a8ec1..c398c43 100644 --- a/project.json +++ b/project.json @@ -10,5 +10,17 @@ "storage": "tmp/local-registry/storage" } } + }, + "release": { + "changelog": { + "projectChangelogs": { + "renderOptions": { + "authors": true, + "mapAuthorsToGitHubUsernames": true, + "commitReferences": true, + "versionTitleDate": true + } + } + } } }