From 0d506d52ed1cd024a50d19694336a14ef1260822 Mon Sep 17 00:00:00 2001 From: Airike Jaska <95303654+airikej@users.noreply.github.com> Date: Thu, 13 Nov 2025 11:34:01 +0200 Subject: [PATCH 1/8] feat(theme-provider): add global theme support #191 --- .storybook/preview.tsx | 80 +++++-- package-lock.json | 8 +- package.json | 2 +- public/fonts/SpaceGrotesk-Light.woff | Bin 0 -> 41856 bytes public/fonts/SpaceGrotesk-Light.woff2 | Bin 0 -> 30476 bytes tedi/directives/index.ts | 1 + .../theme-host/theme-host.directive.spec.ts | 105 +++++++++ .../theme-host/theme-host.directive.ts | 50 +++++ .../directives/theme-host/theme-host.docs.mdx | 209 ++++++++++++++++++ .../theme-host/theme-host.stories.ts | 45 ++++ tedi/services/index.ts | 1 + tedi/services/themes/themes.service.ts | 99 +++++++++ 12 files changed, 573 insertions(+), 27 deletions(-) create mode 100644 public/fonts/SpaceGrotesk-Light.woff create mode 100644 public/fonts/SpaceGrotesk-Light.woff2 create mode 100644 tedi/directives/theme-host/theme-host.directive.spec.ts create mode 100644 tedi/directives/theme-host/theme-host.directive.ts create mode 100644 tedi/directives/theme-host/theme-host.docs.mdx create mode 100644 tedi/directives/theme-host/theme-host.stories.ts create mode 100644 tedi/services/themes/themes.service.ts diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx index df6a45663..f4c77daf4 100644 --- a/.storybook/preview.tsx +++ b/.storybook/preview.tsx @@ -1,4 +1,5 @@ -import { Preview } from "@storybook/angular"; +import { Preview, StoryContext } from '@storybook/angular'; +import { ThemeService, Theme } from '../tedi/services/themes/themes.service'; import { Controls, Description, @@ -8,7 +9,56 @@ import { Title, } from "@storybook/blocks"; +export const globalTypes = { + theme: { + name: 'Theme', + description: 'Global theme for components', + defaultValue: 'default', + toolbar: { + icon: 'paintbrush', + items: [ + { value: 'default', title: 'Default' }, + { value: 'dark', title: 'Dark' }, + ], + showName: true, + }, + }, +}; + +const themeDecorator = (storyFn: any, context: StoryContext) => { + const theme = (context.globals['theme'] as Theme) ?? 'default'; + + const applyTheme = (newTheme: Theme) => { + const html = document.documentElement; + const prefix = 'tedi-theme--'; + const currentClass = Array.from(html.classList).find(cls => + cls.startsWith(prefix) + ); + + if (currentClass) { + html.classList.replace(currentClass, `${prefix}${newTheme}`); + } else { + html.classList.add(`${prefix}${newTheme}`); + } + + const bg = newTheme === 'dark' ? 'var(--color-bg-inverted, #1a1a1a)' : ''; + const selectors = '.sb-show-main, .docs-story > div'; + + requestAnimationFrame(() => { + document.querySelectorAll(selectors).forEach(el => { + el.style.backgroundColor = bg; + }); + }); + }; + + applyTheme(theme); + + const story = storyFn(); + return story; +}; + const preview: Preview = { + decorators: [themeDecorator], parameters: { viewMode: "docs", backgrounds: { @@ -29,29 +79,15 @@ const preview: Preview = { }, status: { statuses: { - devComponent: { - background: "#ff8000", - color: "#ffffff", - description: "This component is dev only and not found in Figma", - }, - breakpointSupport: { - background: "#308653", - color: "#ffffff", - description: "This component has breakpoint support", - }, - internalComponent: { - background: "#fff", - color: "#000", - description: - "This component is only used to build other components and not being exported from library", - }, - existsInTediReady: { - background: "#005aa3", - color: "#fff", - description: "This component has been migrated to TEDI-Ready", - }, + devComponent: { background: '#ff8000', color: '#fff', description: 'Dev only' }, + breakpointSupport: { background: '#308653', color: '#fff', description: 'Breakpoint support' }, + internalComponent: { background: '#fff', color: '#000', description: 'Internal only' }, + existsInTediReady: { background: '#005aa3', color: '#fff', description: 'TEDI-ready' }, }, }, + injector: { + get: (token: any) => (token === ThemeService ? new ThemeService({} as any) : null), + }, }, }; diff --git a/package-lock.json b/package-lock.json index d6b600d61..ac109ec0d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,7 @@ "name": "@tedi-design-system/angular", "version": "0.0.0-semantic-version", "dependencies": { - "@tedi-design-system/core": "^2.0.0" + "@tedi-design-system/core": "^2.1.0" }, "devDependencies": { "@angular-devkit/core": "19.2.15", @@ -9423,9 +9423,9 @@ } }, "node_modules/@tedi-design-system/core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tedi-design-system/core/-/core-2.0.0.tgz", - "integrity": "sha512-ODuJgRoQYxyvs702iphOuRd68vTBpmIEe/ol4rFssSVDAZ+pZOCbfd87qvoEHW+iDWDlsxHJIOrzMTl3qsTHAQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@tedi-design-system/core/-/core-2.1.0.tgz", + "integrity": "sha512-WHPs3LrsmU0lpzqEPFk4oq9QIBwaVBaTNbrpJbzf0ZxsBg2Fy9HM/KbVg/p5PsOgamy0iwUhpESNMHXpNL8dyg==", "engines": { "node": ">=18.0.0", "npm": ">=8.0.0" diff --git a/package.json b/package.json index d0436c693..a1bc94a7b 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "ngx-float-ui": "^19.0.1 || ^20.0.0" }, "dependencies": { - "@tedi-design-system/core": "^2.0.0" + "@tedi-design-system/core": "^2.1.0" }, "devDependencies": { "@angular-devkit/core": "19.2.15", diff --git a/public/fonts/SpaceGrotesk-Light.woff b/public/fonts/SpaceGrotesk-Light.woff new file mode 100644 index 0000000000000000000000000000000000000000..55963015a0d062b76fdf4ef58ae5435649837314 GIT binary patch literal 41856 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%0A%LI&$d3@k0%YJdZIC?# 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 literal 0 HcmV?d00001 diff --git a/public/fonts/SpaceGrotesk-Light.woff2 b/public/fonts/SpaceGrotesk-Light.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..189db25edbe83d51916f757c5422a9948c65bd65 GIT binary patch literal 30476 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 TPp+H7Z)tG void)[] = []; + + themeChanges$ = { + subscribe: (fn: (theme: Theme) => void) => { + this.listeners.push(fn); + fn(this.current as Theme); + return { unsubscribe: () => this.listeners.splice(this.listeners.indexOf(fn), 1) }; + }, + }; + + getTheme = () => this.current; + setTheme = (theme: Theme) => { + this.current = theme; + this.listeners.forEach(fn => fn(theme)); + }; +} + +@Component({ + template: `

`, + standalone: true, + imports: [ThemeHostDirective], +}) +class HostComponent { + inputTheme?: Theme = 'default'; +} + +describe('ThemeHostDirective', () => { + let fixture: ComponentFixture; + let hostEl: HTMLElement; + let mockService: MockThemeService; + + beforeEach(async () => { + mockService = new MockThemeService(); + + await TestBed.configureTestingModule({ + imports: [HostComponent, ThemeHostDirective], + providers: [ + { provide: ThemeService, useValue: mockService }, + ], + }).compileComponents(); + + fixture = TestBed.createComponent(HostComponent); + hostEl = fixture.debugElement.query(By.css('div')).nativeElement; + fixture.detectChanges(); + }); + + it('should create host component with directive', () => { + expect(hostEl).toBeTruthy(); + expect(hostEl.classList.contains(`${THEME_CLASS_PREFIX}default`)).toBe(true); + }); + + it('should apply initial theme from service on ngOnInit', () => { + mockService.setTheme('dark'); + fixture.detectChanges(); + + expect(hostEl.classList.contains(`${THEME_CLASS_PREFIX}dark`)).toBe(true); + expect(hostEl.classList.contains(`${THEME_CLASS_PREFIX}default`)).toBe(false); + }); + + it('should update class when service emits new theme', () => { + mockService.setTheme('rit'); + fixture.detectChanges(); + + expect(hostEl.classList.contains(`${THEME_CLASS_PREFIX}rit`)).toBe(true); + expect(hostEl.classList.contains(`${THEME_CLASS_PREFIX}dark`)).toBe(false); + }); + + it('should apply input theme and sync to service on ngOnChanges', () => { + const component = fixture.componentInstance; + component.inputTheme = 'dark'; + fixture.detectChanges(); + + expect(hostEl.classList.contains(`${THEME_CLASS_PREFIX}dark`)).toBe(true); + expect(mockService.getTheme()).toBe('dark'); + }); + + it('should remove old theme classes and add new one', () => { + hostEl.classList.add(`${THEME_CLASS_PREFIX}rit`); + hostEl.classList.add(`${THEME_CLASS_PREFIX}dark`); + + mockService.setTheme('default'); + fixture.detectChanges(); + + expect(hostEl.classList.contains(`${THEME_CLASS_PREFIX}default`)).toBe(true); + expect(hostEl.classList.contains(`${THEME_CLASS_PREFIX}rit`)).toBe(false); + expect(hostEl.classList.contains(`${THEME_CLASS_PREFIX}dark`)).toBe(false); + }); + + it('should not fail if input theme is undefined', () => { + const component = fixture.componentInstance; + component.inputTheme = undefined; + fixture.detectChanges(); + + expect(hostEl.classList.contains(`${THEME_CLASS_PREFIX}default`)).toBe(true); + }); +}); \ No newline at end of file diff --git a/tedi/directives/theme-host/theme-host.directive.ts b/tedi/directives/theme-host/theme-host.directive.ts new file mode 100644 index 000000000..e301d1737 --- /dev/null +++ b/tedi/directives/theme-host/theme-host.directive.ts @@ -0,0 +1,50 @@ +import { Directive, ElementRef, Input, OnChanges, OnDestroy, OnInit, SimpleChanges } from '@angular/core'; +import { Subscription } from 'rxjs'; +import { Theme, THEME_CLASS_PREFIX, ThemeService } from '../../services/themes/themes.service'; + +@Directive({ + selector: '[tediThemeHost]', + standalone: true, +}) +export class ThemeHostDirective implements OnInit, OnChanges, OnDestroy { + private subscription = new Subscription(); + + @Input('tediThemeHost') theme?: Theme; + + constructor( + private el: ElementRef, + private themeService: ThemeService + ) {} + + ngOnInit(): void { + this.subscription.add( + this.themeService.themeChanges$.subscribe((theme) => { + this.applyTheme(theme); + }) + ); + + this.applyTheme(this.themeService.getTheme()); + } + + ngOnChanges(changes: SimpleChanges): void { + if (changes['theme'] && this.theme) { + this.applyTheme(this.theme); + this.themeService.setTheme(this.theme); + } + } + + private applyTheme(theme: Theme): void { + const prefix = THEME_CLASS_PREFIX; + const classList = this.el.nativeElement.classList; + + Array.from(classList) + .filter((c) => c.startsWith(prefix)) + .forEach((c) => classList.remove(c)); + + classList.add(`${prefix}${theme}`); + } + + ngOnDestroy(): void { + this.subscription.unsubscribe(); + } +} \ No newline at end of file diff --git a/tedi/directives/theme-host/theme-host.docs.mdx b/tedi/directives/theme-host/theme-host.docs.mdx new file mode 100644 index 000000000..6ba3492e7 --- /dev/null +++ b/tedi/directives/theme-host/theme-host.docs.mdx @@ -0,0 +1,209 @@ +import { + Meta, + Title, + Subtitle, + Canvas, + Story, + Controls, + ArgsTable, +} from "@storybook/blocks"; +import * as ThemeHostStories from "./theme-host.stories.ts"; + + + +The `tediThemeHost` directive enables theme management across your Angular app +by applying the correct theme class (`.tedi-theme--*`) to the host element and +syncing with `ThemeService`. + +## Features + +- **Automatic persistence** - Themes are saved to localStorage and restored on page load +- **SSR compatible** - Browser-specific logic is skipped on the server +- **Multiple themes** - Supports 'default', 'dark', and 'rit' themes out of the box +- **Reactive updates** - All components using the service stay in sync + +## Usage + +### Directive Example + +Use the tediThemeHost directive on any container: + +<Canvas> + <Story name="Default Theme" of={ThemeHostStories.Default} /> +</Canvas> + +### Basic Template Usage + +Apply the directive with a static theme: + +```angular +<div tediThemeHost="dark"> + <your-content></your-content> +</div> +``` + +Or bind to a component property for dynamic themes: + +```angular +<div [tediThemeHost]="currentTheme"> + <your-app></your-app> +</div> +``` + +### Complete App Integration Example + +Here's how to properly integrate the theme system in your Angular app: + +**app.component.ts** + +```typescript +import { Component, inject } from "@angular/core"; +import { + ThemeService, + Theme, + ThemeHostDirective, +} from "@tedi-design-system/angular/tedi"; + +@Component({ + selector: "app-root", + standalone: true, + imports: [ThemeHostDirective], + template: ` <div + [tediThemeHost]="themeService.getTheme()" + class="app-container" + > + <h1>My App</h1> + <app-theme-switcher></app-theme-switcher> + <!-- Your app content --> + </div>`, +}) +export class AppComponent { + themeService = inject(ThemeService); +} +``` + +### Theme Switcher Component example + +Create a theme switcher that persists user preferences: + +**theme-switcher.component.ts** + +```typescript +import { Component } from "@angular/core"; +import { ThemeService, Theme } from "@tedi-design-system/angular/tedi"; + +@Component({ + selector: "app-theme-switcher", + template: `html + <div class="theme-switcher"> + <button + (click)="setTheme('default')" + [class.active]="currentTheme === 'default'" + > + Default + </button> + <button + (click)="setTheme('dark')" + [class.active]="currentTheme === 'dark'" + > + Dark + </button> + </div> `, +}) +export class ThemeSwitcherComponent { + currentTheme: Theme; + + constructor(private themeService: ThemeService) { + // Initialize with current theme from service + this.currentTheme = this.themeService.getTheme(); + + // Subscribe to theme changes + this.themeService.themeChanges$.subscribe((theme) => { + this.currentTheme = theme; + }); + } + + setTheme(theme: Theme): void { + this.themeService.setTheme(theme); + } +} +``` + +### Manual Theme Control + +For advanced use cases, you can control themes programmatically: + +```typescript +import { Component, inject } from "@angular/core"; +import { ThemeService, Theme } from "@tedi-design-system/angular/tedi"; + +@Component({ + selector: "app-theme-manager", + template: `html + <button (click)="toggleTheme()"> + Switch to {{ currentTheme === "dark" ? "Default" : "Dark" }} + </button> + <p>Current theme: {{ currentTheme }}</p> `, +}) +export class ThemeManagerComponent { + private themeService = inject(ThemeService); + currentTheme: Theme = this.themeService.getTheme(); + + constructor() { + this.themeService.themeChanges$.subscribe((theme) => { + this.currentTheme = theme; + }); + } + + toggleTheme() { + const newTheme: Theme = this.currentTheme === "dark" ? "default" : "dark"; + this.themeService.setTheme(newTheme); + } + + // Set specific theme + setDarkTheme() { + this.themeService.setTheme("dark"); + } + + // Check current theme + isDarkTheme(): boolean { + return this.themeService.getTheme() === "dark"; + } +} +``` + +## Persistence Behavior + +The theme system automatically persists user preferences: + +- **Automatic Save**: Theme choices are automatically saved to `localStorage` +- **Automatic Load**: Saved theme is restored on app initialization +- **Key**: Uses `tedi-theme` as the storage key +- **No Setup**: Works out of the box with no additional configuration + +### Optional Cookie Support + +For advanced use cases (SSR, cross-subdomain), you can enable cookie persistence: + +```typescript +export class AppComponent implements OnInit { + themeService = inject(ThemeService); + + ngOnInit() { + // Enable cookie persistence alongside localStorage + this.themeService.enableCookies(true); + } +} +``` + +## Browser vs SSR + +**Client-side only apps**: Works automatically with DOM and localStorage. Themes persist across sessions. + +**Server-side rendering (SSR)**: + +- Browser-specific logic is skipped on the server +- Theme applies when hydration completes in the browser +- Persistence works seamlessly once client takes over + +<Controls /> diff --git a/tedi/directives/theme-host/theme-host.stories.ts b/tedi/directives/theme-host/theme-host.stories.ts new file mode 100644 index 000000000..23e3db619 --- /dev/null +++ b/tedi/directives/theme-host/theme-host.stories.ts @@ -0,0 +1,45 @@ +import { Meta, moduleMetadata, StoryObj } from '@storybook/angular'; +import { ThemeHostDirective } from './theme-host.directive'; + +import ThemeProviderDocs from './theme-host.docs.mdx'; +import { ButtonComponent, ColComponent, RowComponent, TextComponent } from '../../components'; + +const meta: Meta<ThemeHostDirective> = { + title: 'Tedi-Ready/Providers/ThemeHost', + component: ThemeHostDirective, + decorators: [ + moduleMetadata({ + imports: [ + ButtonComponent, + TextComponent, + RowComponent, + ColComponent + ], + }), + ], + parameters: { + docs: { + page: ThemeProviderDocs, + }, + }, +}; + +export default meta; +type Story = StoryObj<ThemeHostDirective>; + +export const Default: Story = { + render: () => ({ + template: ` + <h2 tedi-text>ThemeHost Directive</h2> + <p tedi-text>This entire block is wrapped with the theme provider.</p> + <tedi-row [cols]="5" alignItems="center" [gapX]="1" style="margin-top: 15px;"> + <tedi-col [width]="1"> + <button tedi-button variant="primary">Primary Button</button> + </tedi-col> + <tedi-col [width]="1"> + <button tedi-button variant="secondary">Secondary</button> + </tedi-col> + </tedi-row> + `, + }), +}; \ No newline at end of file diff --git a/tedi/services/index.ts b/tedi/services/index.ts index a4467a161..924c54532 100644 --- a/tedi/services/index.ts +++ b/tedi/services/index.ts @@ -1,3 +1,4 @@ export * from "./breakpoint/breakpoint.service"; export * from "./translation/translation.service"; +export * from "./themes/themes.service"; export * from "./translation/translation.pipe"; diff --git a/tedi/services/themes/themes.service.ts b/tedi/services/themes/themes.service.ts new file mode 100644 index 000000000..dad09eb92 --- /dev/null +++ b/tedi/services/themes/themes.service.ts @@ -0,0 +1,99 @@ +import { Injectable, Inject, PLATFORM_ID, signal } from '@angular/core'; +import { isPlatformBrowser } from '@angular/common'; +import { BehaviorSubject } from 'rxjs'; + +export type Theme = 'default' | 'dark' | 'rit'; +export const AVAILABLE_THEMES: Theme[] = ['default', 'dark', 'rit']; +export const THEME_CLASS_PREFIX = 'tedi-theme--'; +export const THEME_STORAGE_KEY = 'tedi-theme'; +export const THEME_COOKIE_NAME = 'tedi-theme'; + +@Injectable({ providedIn: 'root' }) +export class ThemeService { + private readonly themeSubject = new BehaviorSubject<Theme>('default'); + themeChanges$ = this.themeSubject.asObservable(); + + readonly currentTheme = signal<Theme>('default'); + + private isBrowser: boolean; + private useCookies = false; + + constructor(@Inject(PLATFORM_ID) platformId: object) { + this.isBrowser = isPlatformBrowser(platformId); + + if (this.isBrowser) { + const stored = this.getStoredTheme(); + const initialTheme = stored ?? 'default'; + this.setTheme(initialTheme, false); + } + } + + enableCookies(enable: boolean = true): void { + this.useCookies = enable && this.isBrowser; + } + + setTheme(theme: Theme, persist = true): void { + if (!AVAILABLE_THEMES.includes(theme)) { + console.warn(`Theme ${theme} is not supported. Available:`, AVAILABLE_THEMES); + return; + } + + this.themeSubject.next(theme); + this.currentTheme.set(theme); + + if (this.isBrowser) { + this.applyGlobalTheme(theme); + if (persist) { + this.persistTheme(theme); + } + } + } + + getTheme(): Theme { + return this.themeSubject.value; + } + + private applyGlobalTheme(theme: Theme): void { + const root = document.documentElement; + const prefix = THEME_CLASS_PREFIX; + + AVAILABLE_THEMES.forEach(t => root.classList.remove(`${prefix}${t}`)); + root.classList.add(`${prefix}${theme}`); + } + + private persistTheme(theme: Theme): void { + localStorage.setItem(THEME_STORAGE_KEY, theme); + + if (this.useCookies) { + this.setThemeCookie(theme); + } + } + + private getStoredTheme(): Theme | null { + const local = localStorage.getItem(THEME_STORAGE_KEY) as Theme | null; + if (local && AVAILABLE_THEMES.includes(local)) { + return local; + } + + if (this.useCookies) { + const cookie = this.getThemeCookie(); + if (cookie && AVAILABLE_THEMES.includes(cookie)) { + localStorage.setItem(THEME_STORAGE_KEY, cookie); + return cookie; + } + } + + return null; + } + + private setThemeCookie(theme: Theme): void { + const expires = new Date(); + expires.setFullYear(expires.getFullYear() + 1); + document.cookie = `${THEME_COOKIE_NAME}=${theme}; expires=${expires.toUTCString()}; path=/; SameSite=Lax`; + } + + private getThemeCookie(): Theme | null { + const match = document.cookie.match(new RegExp(`(?:^|; )${THEME_COOKIE_NAME}=([^;]+)`)); + return match ? (match[1] as Theme) : null; + } +} \ No newline at end of file From 41327f13375de1949110c0dc0d0ac2348c525b78 Mon Sep 17 00:00:00 2001 From: Airike Jaska <95303654+airikej@users.noreply.github.com> Date: Thu, 13 Nov 2025 11:38:29 +0200 Subject: [PATCH 2/8] fix(theme-provider): fix import names #191 --- tedi/directives/theme-host/theme-host.stories.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tedi/directives/theme-host/theme-host.stories.ts b/tedi/directives/theme-host/theme-host.stories.ts index 23e3db619..a3999b5df 100644 --- a/tedi/directives/theme-host/theme-host.stories.ts +++ b/tedi/directives/theme-host/theme-host.stories.ts @@ -1,7 +1,7 @@ import { Meta, moduleMetadata, StoryObj } from '@storybook/angular'; import { ThemeHostDirective } from './theme-host.directive'; -import ThemeProviderDocs from './theme-host.docs.mdx'; +import ThemeHostDocs from './theme-host.docs.mdx'; import { ButtonComponent, ColComponent, RowComponent, TextComponent } from '../../components'; const meta: Meta<ThemeHostDirective> = { @@ -19,7 +19,7 @@ const meta: Meta<ThemeHostDirective> = { ], parameters: { docs: { - page: ThemeProviderDocs, + page: ThemeHostDocs, }, }, }; From 2e5378bf79a5e3da058fa19995c8619d9a387ea9 Mon Sep 17 00:00:00 2001 From: Romet Pastak <mart.sessman@bitweb.ee> Date: Mon, 17 Nov 2025 16:12:21 +0200 Subject: [PATCH 3/8] feat(theme-provider): add provider, tokens, change theme service, change translation service #191 --- .storybook/preview.tsx | 59 +- package-lock.json | 2722 ++++------------- tedi/directives/index.ts | 3 +- .../theme-host/theme-host.directive.spec.ts | 105 - .../theme-host/theme-host.directive.ts | 50 - .../directives/theme-host/theme-host.docs.mdx | 209 -- .../theme-host/theme-host.stories.ts | 45 - tedi/index.ts | 2 + tedi/providers/index.ts | 1 + tedi/providers/tedi.provider.ts | 80 + tedi/services/index.ts | 2 +- tedi/services/theme/theme.service.ts | 80 + tedi/services/themes/themes.service.ts | 99 - .../translation/translation.service.ts | 65 +- tedi/tokens/index.ts | 2 + tedi/tokens/theme.token.ts | 10 + tedi/tokens/translation.token.ts | 10 + 17 files changed, 813 insertions(+), 2731 deletions(-) delete mode 100644 tedi/directives/theme-host/theme-host.directive.spec.ts delete mode 100644 tedi/directives/theme-host/theme-host.directive.ts delete mode 100644 tedi/directives/theme-host/theme-host.docs.mdx delete mode 100644 tedi/directives/theme-host/theme-host.stories.ts create mode 100644 tedi/providers/index.ts create mode 100644 tedi/providers/tedi.provider.ts create mode 100644 tedi/services/theme/theme.service.ts delete mode 100644 tedi/services/themes/themes.service.ts create mode 100644 tedi/tokens/index.ts create mode 100644 tedi/tokens/theme.token.ts create mode 100644 tedi/tokens/translation.token.ts diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx index f4c77daf4..e03ce4eec 100644 --- a/.storybook/preview.tsx +++ b/.storybook/preview.tsx @@ -1,5 +1,5 @@ -import { Preview, StoryContext } from '@storybook/angular'; -import { ThemeService, Theme } from '../tedi/services/themes/themes.service'; +import { Preview, StoryContext } from "@storybook/angular"; +import { Theme } from "../tedi/services/theme/theme.service"; import { Controls, Description, @@ -11,14 +11,14 @@ import { export const globalTypes = { theme: { - name: 'Theme', - description: 'Global theme for components', - defaultValue: 'default', + name: "Theme", + description: "Global theme for components", + defaultValue: "default", toolbar: { - icon: 'paintbrush', + icon: "paintbrush", items: [ - { value: 'default', title: 'Default' }, - { value: 'dark', title: 'Dark' }, + { value: "default", title: "Default" }, + { value: "dark", title: "Dark" }, ], showName: true, }, @@ -26,26 +26,26 @@ export const globalTypes = { }; const themeDecorator = (storyFn: any, context: StoryContext) => { - const theme = (context.globals['theme'] as Theme) ?? 'default'; + const theme = (context.globals["theme"] as Theme) ?? "default"; const applyTheme = (newTheme: Theme) => { const html = document.documentElement; - const prefix = 'tedi-theme--'; - const currentClass = Array.from(html.classList).find(cls => - cls.startsWith(prefix) + const prefix = "tedi-theme--"; + const currentClass = Array.from(html.classList).find((cls) => + cls.startsWith(prefix), ); - + if (currentClass) { html.classList.replace(currentClass, `${prefix}${newTheme}`); } else { html.classList.add(`${prefix}${newTheme}`); } - const bg = newTheme === 'dark' ? 'var(--color-bg-inverted, #1a1a1a)' : ''; - const selectors = '.sb-show-main, .docs-story > div'; + const bg = newTheme === "dark" ? "var(--color-bg-inverted, #1a1a1a)" : ""; + const selectors = ".sb-show-main, .docs-story > div"; requestAnimationFrame(() => { - document.querySelectorAll<HTMLElement>(selectors).forEach(el => { + document.querySelectorAll<HTMLElement>(selectors).forEach((el) => { el.style.backgroundColor = bg; }); }); @@ -79,15 +79,28 @@ const preview: Preview = { }, status: { statuses: { - devComponent: { background: '#ff8000', color: '#fff', description: 'Dev only' }, - breakpointSupport: { background: '#308653', color: '#fff', description: 'Breakpoint support' }, - internalComponent: { background: '#fff', color: '#000', description: 'Internal only' }, - existsInTediReady: { background: '#005aa3', color: '#fff', description: 'TEDI-ready' }, + devComponent: { + background: "#ff8000", + color: "#fff", + description: "Dev only", + }, + breakpointSupport: { + background: "#308653", + color: "#fff", + description: "Breakpoint support", + }, + internalComponent: { + background: "#fff", + color: "#000", + description: "Internal only", + }, + existsInTediReady: { + background: "#005aa3", + color: "#fff", + description: "TEDI-ready", + }, }, }, - injector: { - get: (token: any) => (token === ThemeService ? new ThemeService({} as any) : null), - }, }, }; diff --git a/package-lock.json b/package-lock.json index ac109ec0d..d054dde19 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3915,827 +3915,622 @@ "node": ">=0.8.0" } }, - "node_modules/@esbuild/aix-ppc64": { + "node_modules/@esbuild/darwin-arm64": { "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", - "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", + "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", "cpu": [ - "ppc64" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "aix" + "darwin" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", - "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", - "cpu": [ - "arm" - ], + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, "engines": { - "node": ">=18" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", - "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">=18" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", - "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", - "cpu": [ - "x64" - ], + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", - "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", - "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", - "cpu": [ - "x64" - ], + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, "engines": { - "node": ">=18" + "node": "*" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", - "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@eslint/core": "^0.17.0" + }, "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", - "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", - "cpu": [ - "x64" - ], + "node_modules/@eslint/config-helpers/node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.15" + }, "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", - "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", - "cpu": [ - "arm" - ], + "node_modules/@eslint/core": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz", + "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.15" + }, "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", - "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "peer": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", - "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", - "cpu": [ - "ia32" - ], + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", - "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", - "cpu": [ - "loong64" - ], + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", - "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", - "cpu": [ - "mips64el" - ], + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "peer": true, "engines": { - "node": ">=18" + "node": ">= 4" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", - "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", - "cpu": [ - "ppc64" - ], + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } + "peer": true }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", - "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", - "cpu": [ - "riscv64" - ], + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, "engines": { - "node": ">=18" + "node": "*" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", - "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", - "cpu": [ - "s390x" - ], + "node_modules/@eslint/js": { + "version": "9.38.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.38.0.tgz", + "integrity": "sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "peer": true, "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", - "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", - "cpu": [ - "x64" - ], + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "license": "Apache-2.0", + "peer": true, "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", - "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", - "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", - "cpu": [ - "x64" - ], + "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.15" + }, "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", - "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", - "cpu": [ - "arm64" - ], + "node_modules/@etchteam/storybook-addon-status": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@etchteam/storybook-addon-status/-/storybook-addon-status-5.0.0.tgz", + "integrity": "sha512-0Dg94xQ3T+rYTi6ekFkaH0XU9k0IQOqidiSmwN47Oqw4u1qjxK6m7wV3j7C0deLEuf4U4PrAcsDfDjyehKne2A==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" + "dependencies": { + "lodash": "^4.17.21" } }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", - "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", - "cpu": [ - "x64" - ], + "node_modules/@floating-ui/core": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", + "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" + "dependencies": { + "@floating-ui/utils": "^0.2.10" } }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", - "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", - "cpu": [ - "x64" - ], + "node_modules/@floating-ui/dom": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", + "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" + "dependencies": { + "@floating-ui/core": "^1.7.3", + "@floating-ui/utils": "^0.2.10" } }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", - "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", - "cpu": [ - "arm64" - ], + "node_modules/@floating-ui/utils": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "license": "MIT" + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "peer": true, "engines": { - "node": ">=18" + "node": ">=18.18.0" } }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", - "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", - "cpu": [ - "ia32" - ], + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, "engines": { - "node": ">=18" + "node": ">=18.18.0" } }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", - "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", - "cpu": [ - "x64" - ], + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "license": "Apache-2.0", + "peer": true, "engines": { - "node": ">=18" + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", - "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, + "license": "Apache-2.0", + "peer": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=18.18" }, "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "node_modules/@inquirer/ansi": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.1.tgz", + "integrity": "sha512-yqq0aJW/5XPhi5xOAL1xRCpe1eh8UFVgYFpFsjEqmIR8rKLyP+HINvFXwUaxYICflJrVlxnp7lLN6As735kVpw==", "dev": true, "license": "MIT", "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=18" } }, - "node_modules/@eslint/config-array": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", - "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "node_modules/@inquirer/checkbox": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.0.tgz", + "integrity": "sha512-5+Q3PKH35YsnoPTh75LucALdAxom6xh5D1oeY561x4cqBuH24ZFVyFREPe14xgnrtmGu3EEt1dIi60wRVSnGCw==", "dev": true, - "license": "Apache-2.0", - "peer": true, + "license": "MIT", "dependencies": { - "@eslint/object-schema": "^2.1.7", - "debug": "^4.3.1", - "minimatch": "^3.1.2" + "@inquirer/ansi": "^1.0.1", + "@inquirer/core": "^10.3.0", + "@inquirer/figures": "^1.0.14", + "@inquirer/type": "^3.0.9", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "node_modules/@inquirer/confirm": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.6.tgz", + "integrity": "sha512-6ZXYK3M1XmaVBZX6FCfChgtponnL0R6I7k8Nu+kaoNkT828FVZTcca1MqmWQipaW2oNREQl5AaPCUOOCVNdRMw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4" }, "engines": { - "node": "*" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@eslint/config-helpers": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "node_modules/@inquirer/core": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.0.tgz", + "integrity": "sha512-Uv2aPPPSK5jeCplQmQ9xadnFx2Zhj9b5Dj7bU6ZeCdDNNY11nhYy4btcSdtDguHqCT2h5oNeQTcUNSGGLA7NTA==", "dev": true, - "license": "Apache-2.0", - "peer": true, + "license": "MIT", "dependencies": { - "@eslint/core": "^0.17.0" + "@inquirer/ansi": "^1.0.1", + "@inquirer/figures": "^1.0.14", + "@inquirer/type": "^3.0.9", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@eslint/config-helpers/node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "node_modules/@inquirer/editor": { + "version": "4.2.21", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.21.tgz", + "integrity": "sha512-MjtjOGjr0Kh4BciaFShYpZ1s9400idOdvQ5D7u7lE6VztPFoyLcVNE5dXBmEEIQq5zi4B9h2kU+q7AVBxJMAkQ==", "dev": true, - "license": "Apache-2.0", - "peer": true, + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.15" + "@inquirer/core": "^10.3.0", + "@inquirer/external-editor": "^1.0.2", + "@inquirer/type": "^3.0.9" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@eslint/core": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz", - "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==", + "node_modules/@inquirer/expand": { + "version": "4.0.21", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.21.tgz", + "integrity": "sha512-+mScLhIcbPFmuvU3tAGBed78XvYHSvCl6dBiYMlzCLhpr0bzGzd8tfivMMeqND6XZiaZ1tgusbUHJEfc6YzOdA==", "dev": true, - "license": "Apache-2.0", - "peer": true, + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.15" + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "node_modules/@inquirer/external-editor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.2.tgz", + "integrity": "sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "chardet": "^2.1.0", + "iconv-lite": "^0.7.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=18" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/@inquirer/figures": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.14.tgz", + "integrity": "sha512-DbFgdt+9/OZYFM+19dbpXOSeAstPy884FPy1KjDu4anWwymZeOYhMY1mdFri172htv6mvc/uvIAAi7b7tvjJBQ==", "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=18" } }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "node_modules/@inquirer/input": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.2.5.tgz", + "integrity": "sha512-7GoWev7P6s7t0oJbenH0eQ0ThNdDJbEAEtVt9vsrYZ9FulIokvd823yLyhQlWHJPGce1wzP53ttfdCZmonMHyA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@eslint/eslintrc/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "node_modules/@inquirer/number": { + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.21.tgz", + "integrity": "sha512-5QWs0KGaNMlhbdhOSCFfKsW+/dcAVC2g4wT/z2MCiZM47uLgatC5N20kpkDQf7dHx+XFct/MJvvNGy6aYJn4Pw==", "dev": true, "license": "MIT", - "peer": true, + "dependencies": { + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9" + }, "engines": { - "node": ">= 4" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "node_modules/@inquirer/password": { + "version": "4.0.21", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.21.tgz", + "integrity": "sha512-xxeW1V5SbNFNig2pLfetsDb0svWlKuhmr7MPJZMYuDnCTkpVBI+X/doudg4pznc1/U+yYmWFFOi4hNvGgUo7EA==", "dev": true, "license": "MIT", - "peer": true - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "peer": true, "dependencies": { - "brace-expansion": "^1.1.7" + "@inquirer/ansi": "^1.0.1", + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9" }, "engines": { - "node": "*" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@eslint/js": { - "version": "9.38.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.38.0.tgz", - "integrity": "sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==", + "node_modules/@inquirer/prompts": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.3.2.tgz", + "integrity": "sha512-G1ytyOoHh5BphmEBxSwALin3n1KGNYB6yImbICcRQdzXfOGbuJ9Jske/Of5Sebk339NSGGNfUshnzK8YWkTPsQ==", "dev": true, "license": "MIT", - "peer": true, + "dependencies": { + "@inquirer/checkbox": "^4.1.2", + "@inquirer/confirm": "^5.1.6", + "@inquirer/editor": "^4.2.7", + "@inquirer/expand": "^4.0.9", + "@inquirer/input": "^4.1.6", + "@inquirer/number": "^3.0.9", + "@inquirer/password": "^4.0.9", + "@inquirer/rawlist": "^4.0.9", + "@inquirer/search": "^3.0.9", + "@inquirer/select": "^4.0.9" + }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", - "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", - "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@eslint/core": "^0.17.0", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@etchteam/storybook-addon-status": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@etchteam/storybook-addon-status/-/storybook-addon-status-5.0.0.tgz", - "integrity": "sha512-0Dg94xQ3T+rYTi6ekFkaH0XU9k0IQOqidiSmwN47Oqw4u1qjxK6m7wV3j7C0deLEuf4U4PrAcsDfDjyehKne2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash": "^4.17.21" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", - "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@floating-ui/utils": "^0.2.10" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", - "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@floating-ui/core": "^1.7.3", - "@floating-ui/utils": "^0.2.10" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", - "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.4.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@inquirer/ansi": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.1.tgz", - "integrity": "sha512-yqq0aJW/5XPhi5xOAL1xRCpe1eh8UFVgYFpFsjEqmIR8rKLyP+HINvFXwUaxYICflJrVlxnp7lLN6As735kVpw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@inquirer/checkbox": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.0.tgz", - "integrity": "sha512-5+Q3PKH35YsnoPTh75LucALdAxom6xh5D1oeY561x4cqBuH24ZFVyFREPe14xgnrtmGu3EEt1dIi60wRVSnGCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/ansi": "^1.0.1", - "@inquirer/core": "^10.3.0", - "@inquirer/figures": "^1.0.14", - "@inquirer/type": "^3.0.9", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/confirm": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.6.tgz", - "integrity": "sha512-6ZXYK3M1XmaVBZX6FCfChgtponnL0R6I7k8Nu+kaoNkT828FVZTcca1MqmWQipaW2oNREQl5AaPCUOOCVNdRMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.1.7", - "@inquirer/type": "^3.0.4" - }, - "engines": { - "node": ">=18" + "node": ">=18" }, "peerDependencies": { "@types/node": ">=18" @@ -4746,20 +4541,15 @@ } } }, - "node_modules/@inquirer/core": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.0.tgz", - "integrity": "sha512-Uv2aPPPSK5jeCplQmQ9xadnFx2Zhj9b5Dj7bU6ZeCdDNNY11nhYy4btcSdtDguHqCT2h5oNeQTcUNSGGLA7NTA==", + "node_modules/@inquirer/rawlist": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.9.tgz", + "integrity": "sha512-AWpxB7MuJrRiSfTKGJ7Y68imYt8P9N3Gaa7ySdkFj1iWjr6WfbGAhdZvw/UnhFXTHITJzxGUI9k8IX7akAEBCg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/ansi": "^1.0.1", - "@inquirer/figures": "^1.0.14", + "@inquirer/core": "^10.3.0", "@inquirer/type": "^3.0.9", - "cli-width": "^4.1.0", - "mute-stream": "^2.0.0", - "signal-exit": "^4.1.0", - "wrap-ansi": "^6.2.0", "yoctocolors-cjs": "^2.1.2" }, "engines": { @@ -4774,16 +4564,17 @@ } } }, - "node_modules/@inquirer/editor": { - "version": "4.2.21", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.21.tgz", - "integrity": "sha512-MjtjOGjr0Kh4BciaFShYpZ1s9400idOdvQ5D7u7lE6VztPFoyLcVNE5dXBmEEIQq5zi4B9h2kU+q7AVBxJMAkQ==", + "node_modules/@inquirer/search": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.0.tgz", + "integrity": "sha512-a5SzB/qrXafDX1Z4AZW3CsVoiNxcIYCzYP7r9RzrfMpaLpB+yWi5U8BWagZyLmwR0pKbbL5umnGRd0RzGVI8bQ==", "dev": true, "license": "MIT", "dependencies": { "@inquirer/core": "^10.3.0", - "@inquirer/external-editor": "^1.0.2", - "@inquirer/type": "^3.0.9" + "@inquirer/figures": "^1.0.14", + "@inquirer/type": "^3.0.9", + "yoctocolors-cjs": "^2.1.2" }, "engines": { "node": ">=18" @@ -4797,14 +4588,16 @@ } } }, - "node_modules/@inquirer/expand": { - "version": "4.0.21", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.21.tgz", - "integrity": "sha512-+mScLhIcbPFmuvU3tAGBed78XvYHSvCl6dBiYMlzCLhpr0bzGzd8tfivMMeqND6XZiaZ1tgusbUHJEfc6YzOdA==", + "node_modules/@inquirer/select": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.0.tgz", + "integrity": "sha512-kaC3FHsJZvVyIjYBs5Ih8y8Bj4P/QItQWrZW22WJax7zTN+ZPXVGuOM55vzbdCP9zKUiBd9iEJVdesujfF+cAA==", "dev": true, "license": "MIT", "dependencies": { + "@inquirer/ansi": "^1.0.1", "@inquirer/core": "^10.3.0", + "@inquirer/figures": "^1.0.14", "@inquirer/type": "^3.0.9", "yoctocolors-cjs": "^2.1.2" }, @@ -4820,16 +4613,12 @@ } } }, - "node_modules/@inquirer/external-editor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.2.tgz", - "integrity": "sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==", + "node_modules/@inquirer/type": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.9.tgz", + "integrity": "sha512-QPaNt/nmE2bLGQa9b7wwyRJoLZ7pN6rcyXvzU0YCmivmJyq1BVo94G98tStRWkoD1RgDX5C+dPlhhHzNdu/W/w==", "dev": true, "license": "MIT", - "dependencies": { - "chardet": "^2.1.0", - "iconv-lite": "^0.7.0" - }, "engines": { "node": ">=18" }, @@ -4842,221 +4631,24 @@ } } }, - "node_modules/@inquirer/figures": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.14.tgz", - "integrity": "sha512-DbFgdt+9/OZYFM+19dbpXOSeAstPy884FPy1KjDu4anWwymZeOYhMY1mdFri172htv6mvc/uvIAAi7b7tvjJBQ==", + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=18" + "node": "20 || >=22" } }, - "node_modules/@inquirer/input": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.2.5.tgz", - "integrity": "sha512-7GoWev7P6s7t0oJbenH0eQ0ThNdDJbEAEtVt9vsrYZ9FulIokvd823yLyhQlWHJPGce1wzP53ttfdCZmonMHyA==", + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.0", - "@inquirer/type": "^3.0.9" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/number": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.21.tgz", - "integrity": "sha512-5QWs0KGaNMlhbdhOSCFfKsW+/dcAVC2g4wT/z2MCiZM47uLgatC5N20kpkDQf7dHx+XFct/MJvvNGy6aYJn4Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.3.0", - "@inquirer/type": "^3.0.9" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/password": { - "version": "4.0.21", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.21.tgz", - "integrity": "sha512-xxeW1V5SbNFNig2pLfetsDb0svWlKuhmr7MPJZMYuDnCTkpVBI+X/doudg4pznc1/U+yYmWFFOi4hNvGgUo7EA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/ansi": "^1.0.1", - "@inquirer/core": "^10.3.0", - "@inquirer/type": "^3.0.9" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/prompts": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.3.2.tgz", - "integrity": "sha512-G1ytyOoHh5BphmEBxSwALin3n1KGNYB6yImbICcRQdzXfOGbuJ9Jske/Of5Sebk339NSGGNfUshnzK8YWkTPsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/checkbox": "^4.1.2", - "@inquirer/confirm": "^5.1.6", - "@inquirer/editor": "^4.2.7", - "@inquirer/expand": "^4.0.9", - "@inquirer/input": "^4.1.6", - "@inquirer/number": "^3.0.9", - "@inquirer/password": "^4.0.9", - "@inquirer/rawlist": "^4.0.9", - "@inquirer/search": "^3.0.9", - "@inquirer/select": "^4.0.9" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/rawlist": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.9.tgz", - "integrity": "sha512-AWpxB7MuJrRiSfTKGJ7Y68imYt8P9N3Gaa7ySdkFj1iWjr6WfbGAhdZvw/UnhFXTHITJzxGUI9k8IX7akAEBCg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.3.0", - "@inquirer/type": "^3.0.9", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/search": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.0.tgz", - "integrity": "sha512-a5SzB/qrXafDX1Z4AZW3CsVoiNxcIYCzYP7r9RzrfMpaLpB+yWi5U8BWagZyLmwR0pKbbL5umnGRd0RzGVI8bQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.3.0", - "@inquirer/figures": "^1.0.14", - "@inquirer/type": "^3.0.9", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/select": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.0.tgz", - "integrity": "sha512-kaC3FHsJZvVyIjYBs5Ih8y8Bj4P/QItQWrZW22WJax7zTN+ZPXVGuOM55vzbdCP9zKUiBd9iEJVdesujfF+cAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/ansi": "^1.0.1", - "@inquirer/core": "^10.3.0", - "@inquirer/figures": "^1.0.14", - "@inquirer/type": "^3.0.9", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/type": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.9.tgz", - "integrity": "sha512-QPaNt/nmE2bLGQa9b7wwyRJoLZ7pN6rcyXvzU0YCmivmJyq1BVo94G98tStRWkoD1RgDX5C+dPlhhHzNdu/W/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@isaacs/balanced-match": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/brace-expansion": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", - "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@isaacs/balanced-match": "^4.0.1" + "@isaacs/balanced-match": "^4.0.1" }, "engines": { "node": "20 || >=22" @@ -6098,81 +5690,6 @@ ], "peer": true }, - "node_modules/@lmdb/lmdb-darwin-x64": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.2.6.tgz", - "integrity": "sha512-5BbCumsFLbCi586Bb1lTWQFkekdQUw8/t8cy++Uq251cl3hbDIGEwD9HAwh8H6IS2F6QA9KdKmO136LmipRNkg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true - }, - "node_modules/@lmdb/lmdb-linux-arm": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.2.6.tgz", - "integrity": "sha512-+6XgLpMb7HBoWxXj+bLbiiB4s0mRRcDPElnRS3LpWRzdYSe+gFk5MT/4RrVNqd2MESUDmb53NUXw1+BP69bjiQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@lmdb/lmdb-linux-arm64": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.2.6.tgz", - "integrity": "sha512-l5VmJamJ3nyMmeD1ANBQCQqy7do1ESaJQfKPSm2IG9/ADZryptTyCj8N6QaYgIWewqNUrcbdMkJajRQAt5Qjfg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@lmdb/lmdb-linux-x64": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.2.6.tgz", - "integrity": "sha512-nDYT8qN9si5+onHYYaI4DiauDMx24OAiuZAUsEqrDy+ja/3EbpXPX/VAkMV8AEaQhy3xc4dRC+KcYIvOFefJ4Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@lmdb/lmdb-win32-x64": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.2.6.tgz", - "integrity": "sha512-XlqVtILonQnG+9fH2N3Aytria7P/1fwDgDhl29rde96uH2sLB8CHORIf2PfuLVzFQJ7Uqp8py9AYwr3ZUCFfWg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true - }, "node_modules/@mdx-js/react": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", @@ -6206,85 +5723,10 @@ ], "peer": true }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", - "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", - "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", - "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", - "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", - "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true - }, - "node_modules/@napi-rs/nice": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.1.1.tgz", - "integrity": "sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw==", + "node_modules/@napi-rs/nice": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.1.1.tgz", + "integrity": "sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw==", "dev": true, "license": "MIT", "optional": true, @@ -6315,40 +5757,6 @@ "@napi-rs/nice-win32-x64-msvc": "1.1.1" } }, - "node_modules/@napi-rs/nice-android-arm-eabi": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.1.1.tgz", - "integrity": "sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-android-arm64": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.1.1.tgz", - "integrity": "sha512-blG0i7dXgbInN5urONoUCNf+DUEAavRffrO7fZSeoRMJc5qD+BJeNcpr54msPF6qfDD6kzs9AQJogZvT2KD5nw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, "node_modules/@napi-rs/nice-darwin-arm64": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.1.1.tgz", @@ -6366,244 +5774,6 @@ "node": ">= 10" } }, - "node_modules/@napi-rs/nice-darwin-x64": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.1.1.tgz", - "integrity": "sha512-dGoEBnVpsdcC+oHHmW1LRK5eiyzLwdgNQq3BmZIav+9/5WTZwBYX7r5ZkQC07Nxd3KHOCkgbHSh4wPkH1N1LiQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-freebsd-x64": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.1.1.tgz", - "integrity": "sha512-kHv4kEHAylMYmlNwcQcDtXjklYp4FCf0b05E+0h6nDHsZ+F0bDe04U/tXNOqrx5CmIAth4vwfkjjUmp4c4JktQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-arm-gnueabihf": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.1.1.tgz", - "integrity": "sha512-E1t7K0efyKXZDoZg1LzCOLxgolxV58HCkaEkEvIYQx12ht2pa8hoBo+4OB3qh7e+QiBlp1SRf+voWUZFxyhyqg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-arm64-gnu": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.1.1.tgz", - "integrity": "sha512-CIKLA12DTIZlmTaaKhQP88R3Xao+gyJxNWEn04wZwC2wmRapNnxCUZkVwggInMJvtVElA+D4ZzOU5sX4jV+SmQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-arm64-musl": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.1.1.tgz", - "integrity": "sha512-+2Rzdb3nTIYZ0YJF43qf2twhqOCkiSrHx2Pg6DJaCPYhhaxbLcdlV8hCRMHghQ+EtZQWGNcS2xF4KxBhSGeutg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-ppc64-gnu": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.1.1.tgz", - "integrity": "sha512-4FS8oc0GeHpwvv4tKciKkw3Y4jKsL7FRhaOeiPei0X9T4Jd619wHNe4xCLmN2EMgZoeGg+Q7GY7BsvwKpL22Tg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-riscv64-gnu": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.1.1.tgz", - "integrity": "sha512-HU0nw9uD4FO/oGCCk409tCi5IzIZpH2agE6nN4fqpwVlCn5BOq0MS1dXGjXaG17JaAvrlpV5ZeyZwSon10XOXw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-s390x-gnu": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.1.1.tgz", - "integrity": "sha512-2YqKJWWl24EwrX0DzCQgPLKQBxYDdBxOHot1KWEq7aY2uYeX+Uvtv4I8xFVVygJDgf6/92h9N3Y43WPx8+PAgQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-x64-gnu": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.1.1.tgz", - "integrity": "sha512-/gaNz3R92t+dcrfCw/96pDopcmec7oCcAQ3l/M+Zxr82KT4DljD37CpgrnXV+pJC263JkW572pdbP3hP+KjcIg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-linux-x64-musl": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.1.1.tgz", - "integrity": "sha512-xScCGnyj/oppsNPMnevsBe3pvNaoK7FGvMjT35riz9YdhB2WtTG47ZlbxtOLpjeO9SqqQ2J2igCmz6IJOD5JYw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-openharmony-arm64": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-openharmony-arm64/-/nice-openharmony-arm64-1.1.1.tgz", - "integrity": "sha512-6uJPRVwVCLDeoOaNyeiW0gp2kFIM4r7PL2MczdZQHkFi9gVlgm+Vn+V6nTWRcu856mJ2WjYJiumEajfSm7arPQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-win32-arm64-msvc": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.1.1.tgz", - "integrity": "sha512-uoTb4eAvM5B2aj/z8j+Nv8OttPf2m+HVx3UjA5jcFxASvNhQriyCQF1OB1lHL43ZhW+VwZlgvjmP5qF3+59atA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-win32-ia32-msvc": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.1.1.tgz", - "integrity": "sha512-CNQqlQT9MwuCsg1Vd/oKXiuH+TcsSPJmlAFc5frFyX/KkOh0UpBLEj7aoY656d5UKZQMQFP7vJNa1DNUNORvug==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/nice-win32-x64-msvc": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.1.1.tgz", - "integrity": "sha512-vB+4G/jBQCAh0jelMTY3+kgFy00Hlx2f2/1zjMoH821IbplbWZOkLiTYXQkygNTzQJTq5cvwBDgn2ppHD+bglQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, "node_modules/@ngtools/webpack": { "version": "19.2.19", "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-19.2.19.tgz", @@ -7157,10 +6327,10 @@ "@parcel/watcher-win32-x64": "2.5.1" } }, - "node_modules/@parcel/watcher-android-arm64": { + "node_modules/@parcel/watcher-darwin-arm64": { "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", - "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", "cpu": [ "arm64" ], @@ -7168,259 +6338,7 @@ "license": "MIT", "optional": true, "os": [ - "android" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", - "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", - "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", - "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", - "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", - "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", - "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", - "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", - "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", - "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", - "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", - "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", - "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" + "darwin" ], "engines": { "node": ">= 10.0.0" @@ -7517,427 +6435,81 @@ "@pnpm/network.ca-file": "^1.0.1", "config-chain": "^1.1.11" }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@polka/send-type": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@polka/send-type/-/send-type-0.5.2.tgz", - "integrity": "sha512-jGXalKihnhGQmMQ+xxfxrRfI2cWs38TIZuwgYpnbQDD4r9TkOiU3ocjAS+6CqqMNQNAu9Ul2iHU5YFRDODak2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@polka/url": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-0.5.0.tgz", - "integrity": "sha512-oZLYFEAzUKyi3SKnXvj32ZCEGH6RDnao7COuCVhDydMS9NrCSVXhM79VaKyP5+Zc33m0QXEd2DN3UkU7OsHcfw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/plugin-json": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz", - "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.1.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", - "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.8.tgz", - "integrity": "sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.8.tgz", - "integrity": "sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.8.tgz", - "integrity": "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.8.tgz", - "integrity": "sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.8.tgz", - "integrity": "sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.8.tgz", - "integrity": "sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.8.tgz", - "integrity": "sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.8.tgz", - "integrity": "sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.8.tgz", - "integrity": "sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.8.tgz", - "integrity": "sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.5.tgz", - "integrity": "sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.8.tgz", - "integrity": "sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.8.tgz", - "integrity": "sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.5.tgz", - "integrity": "sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.8.tgz", - "integrity": "sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.5.tgz", - "integrity": "sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.8.tgz", - "integrity": "sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.8.tgz", - "integrity": "sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.8.tgz", - "integrity": "sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true + "engines": { + "node": ">=12" + } }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.5.tgz", - "integrity": "sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==", - "cpu": [ - "arm64" - ], + "node_modules/@polka/send-type": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@polka/send-type/-/send-type-0.5.2.tgz", + "integrity": "sha512-jGXalKihnhGQmMQ+xxfxrRfI2cWs38TIZuwgYpnbQDD4r9TkOiU3ocjAS+6CqqMNQNAu9Ul2iHU5YFRDODak2w==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "peer": true + "license": "MIT" }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.8.tgz", - "integrity": "sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==", - "cpu": [ - "arm64" - ], + "node_modules/@polka/url": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-0.5.0.tgz", + "integrity": "sha512-oZLYFEAzUKyi3SKnXvj32ZCEGH6RDnao7COuCVhDydMS9NrCSVXhM79VaKyP5+Zc33m0QXEd2DN3UkU7OsHcfw==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true + "license": "MIT" }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.8.tgz", - "integrity": "sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==", - "cpu": [ - "ia32" - ], + "node_modules/@rollup/plugin-json": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz", + "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true + "dependencies": { + "@rollup/pluginutils": "^5.1.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.5.tgz", - "integrity": "sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==", - "cpu": [ - "x64" - ], + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } }, - "node_modules/@rollup/rollup-win32-x64-msvc": { + "node_modules/@rollup/rollup-darwin-arm64": { "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.8.tgz", - "integrity": "sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.8.tgz", + "integrity": "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==", "cpu": [ - "x64" + "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" - ], - "peer": true + "darwin" + ] }, "node_modules/@rollup/wasm-node": { "version": "4.52.5", @@ -30922,36 +29494,6 @@ } } }, - "node_modules/vite/node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.5.tgz", - "integrity": "sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true - }, - "node_modules/vite/node_modules/@rollup/rollup-android-arm64": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.5.tgz", - "integrity": "sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true - }, "node_modules/vite/node_modules/@rollup/rollup-darwin-arm64": { "version": "4.52.5", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.5.tgz", @@ -30967,216 +29509,6 @@ ], "peer": true }, - "node_modules/vite/node_modules/@rollup/rollup-darwin-x64": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.5.tgz", - "integrity": "sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true - }, - "node_modules/vite/node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.5.tgz", - "integrity": "sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true - }, - "node_modules/vite/node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.5.tgz", - "integrity": "sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true - }, - "node_modules/vite/node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.5.tgz", - "integrity": "sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/vite/node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.5.tgz", - "integrity": "sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/vite/node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.5.tgz", - "integrity": "sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/vite/node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.5.tgz", - "integrity": "sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/vite/node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.5.tgz", - "integrity": "sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/vite/node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.5.tgz", - "integrity": "sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/vite/node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.5.tgz", - "integrity": "sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/vite/node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.5.tgz", - "integrity": "sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/vite/node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.5.tgz", - "integrity": "sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true - }, - "node_modules/vite/node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.5.tgz", - "integrity": "sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true - }, - "node_modules/vite/node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.5.tgz", - "integrity": "sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true - }, "node_modules/vite/node_modules/postcss": { "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", diff --git a/tedi/directives/index.ts b/tedi/directives/index.ts index 8dfdd8c2f..350450751 100644 --- a/tedi/directives/index.ts +++ b/tedi/directives/index.ts @@ -1,4 +1,3 @@ export * from "./hide-at/hide-at.directive"; export * from "./show-at/show-at.directive"; -export * from "./theme-host/theme-host.directive"; -export * from "./vertical-spacing"; \ No newline at end of file +export * from "./vertical-spacing"; diff --git a/tedi/directives/theme-host/theme-host.directive.spec.ts b/tedi/directives/theme-host/theme-host.directive.spec.ts deleted file mode 100644 index 0c5c0b43a..000000000 --- a/tedi/directives/theme-host/theme-host.directive.spec.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { Component } from '@angular/core'; -import { By } from '@angular/platform-browser'; - -import { ThemeHostDirective } from './theme-host.directive'; -import { Theme, THEME_CLASS_PREFIX, ThemeService } from '../../services/themes/themes.service'; - -class MockThemeService { - private current = 'default'; - private listeners: ((theme: Theme) => void)[] = []; - - themeChanges$ = { - subscribe: (fn: (theme: Theme) => void) => { - this.listeners.push(fn); - fn(this.current as Theme); - return { unsubscribe: () => this.listeners.splice(this.listeners.indexOf(fn), 1) }; - }, - }; - - getTheme = () => this.current; - setTheme = (theme: Theme) => { - this.current = theme; - this.listeners.forEach(fn => fn(theme)); - }; -} - -@Component({ - template: `<div tediThemeHost [tediThemeHost]="inputTheme"></div>`, - standalone: true, - imports: [ThemeHostDirective], -}) -class HostComponent { - inputTheme?: Theme = 'default'; -} - -describe('ThemeHostDirective', () => { - let fixture: ComponentFixture<HostComponent>; - let hostEl: HTMLElement; - let mockService: MockThemeService; - - beforeEach(async () => { - mockService = new MockThemeService(); - - await TestBed.configureTestingModule({ - imports: [HostComponent, ThemeHostDirective], - providers: [ - { provide: ThemeService, useValue: mockService }, - ], - }).compileComponents(); - - fixture = TestBed.createComponent(HostComponent); - hostEl = fixture.debugElement.query(By.css('div')).nativeElement; - fixture.detectChanges(); - }); - - it('should create host component with directive', () => { - expect(hostEl).toBeTruthy(); - expect(hostEl.classList.contains(`${THEME_CLASS_PREFIX}default`)).toBe(true); - }); - - it('should apply initial theme from service on ngOnInit', () => { - mockService.setTheme('dark'); - fixture.detectChanges(); - - expect(hostEl.classList.contains(`${THEME_CLASS_PREFIX}dark`)).toBe(true); - expect(hostEl.classList.contains(`${THEME_CLASS_PREFIX}default`)).toBe(false); - }); - - it('should update class when service emits new theme', () => { - mockService.setTheme('rit'); - fixture.detectChanges(); - - expect(hostEl.classList.contains(`${THEME_CLASS_PREFIX}rit`)).toBe(true); - expect(hostEl.classList.contains(`${THEME_CLASS_PREFIX}dark`)).toBe(false); - }); - - it('should apply input theme and sync to service on ngOnChanges', () => { - const component = fixture.componentInstance; - component.inputTheme = 'dark'; - fixture.detectChanges(); - - expect(hostEl.classList.contains(`${THEME_CLASS_PREFIX}dark`)).toBe(true); - expect(mockService.getTheme()).toBe('dark'); - }); - - it('should remove old theme classes and add new one', () => { - hostEl.classList.add(`${THEME_CLASS_PREFIX}rit`); - hostEl.classList.add(`${THEME_CLASS_PREFIX}dark`); - - mockService.setTheme('default'); - fixture.detectChanges(); - - expect(hostEl.classList.contains(`${THEME_CLASS_PREFIX}default`)).toBe(true); - expect(hostEl.classList.contains(`${THEME_CLASS_PREFIX}rit`)).toBe(false); - expect(hostEl.classList.contains(`${THEME_CLASS_PREFIX}dark`)).toBe(false); - }); - - it('should not fail if input theme is undefined', () => { - const component = fixture.componentInstance; - component.inputTheme = undefined; - fixture.detectChanges(); - - expect(hostEl.classList.contains(`${THEME_CLASS_PREFIX}default`)).toBe(true); - }); -}); \ No newline at end of file diff --git a/tedi/directives/theme-host/theme-host.directive.ts b/tedi/directives/theme-host/theme-host.directive.ts deleted file mode 100644 index e301d1737..000000000 --- a/tedi/directives/theme-host/theme-host.directive.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { Directive, ElementRef, Input, OnChanges, OnDestroy, OnInit, SimpleChanges } from '@angular/core'; -import { Subscription } from 'rxjs'; -import { Theme, THEME_CLASS_PREFIX, ThemeService } from '../../services/themes/themes.service'; - -@Directive({ - selector: '[tediThemeHost]', - standalone: true, -}) -export class ThemeHostDirective implements OnInit, OnChanges, OnDestroy { - private subscription = new Subscription(); - - @Input('tediThemeHost') theme?: Theme; - - constructor( - private el: ElementRef<HTMLElement>, - private themeService: ThemeService - ) {} - - ngOnInit(): void { - this.subscription.add( - this.themeService.themeChanges$.subscribe((theme) => { - this.applyTheme(theme); - }) - ); - - this.applyTheme(this.themeService.getTheme()); - } - - ngOnChanges(changes: SimpleChanges): void { - if (changes['theme'] && this.theme) { - this.applyTheme(this.theme); - this.themeService.setTheme(this.theme); - } - } - - private applyTheme(theme: Theme): void { - const prefix = THEME_CLASS_PREFIX; - const classList = this.el.nativeElement.classList; - - Array.from(classList) - .filter((c) => c.startsWith(prefix)) - .forEach((c) => classList.remove(c)); - - classList.add(`${prefix}${theme}`); - } - - ngOnDestroy(): void { - this.subscription.unsubscribe(); - } -} \ No newline at end of file diff --git a/tedi/directives/theme-host/theme-host.docs.mdx b/tedi/directives/theme-host/theme-host.docs.mdx deleted file mode 100644 index 6ba3492e7..000000000 --- a/tedi/directives/theme-host/theme-host.docs.mdx +++ /dev/null @@ -1,209 +0,0 @@ -import { - Meta, - Title, - Subtitle, - Canvas, - Story, - Controls, - ArgsTable, -} from "@storybook/blocks"; -import * as ThemeHostStories from "./theme-host.stories.ts"; - -<Title /> - -The `tediThemeHost` directive enables theme management across your Angular app -by applying the correct theme class (`.tedi-theme--*`) to the host element and -syncing with `ThemeService`. - -## Features - -- **Automatic persistence** - Themes are saved to localStorage and restored on page load -- **SSR compatible** - Browser-specific logic is skipped on the server -- **Multiple themes** - Supports 'default', 'dark', and 'rit' themes out of the box -- **Reactive updates** - All components using the service stay in sync - -## Usage - -### Directive Example - -Use the tediThemeHost directive on any container: - -<Canvas> - <Story name="Default Theme" of={ThemeHostStories.Default} /> -</Canvas> - -### Basic Template Usage - -Apply the directive with a static theme: - -```angular -<div tediThemeHost="dark"> - <your-content></your-content> -</div> -``` - -Or bind to a component property for dynamic themes: - -```angular -<div [tediThemeHost]="currentTheme"> - <your-app></your-app> -</div> -``` - -### Complete App Integration Example - -Here's how to properly integrate the theme system in your Angular app: - -**app.component.ts** - -```typescript -import { Component, inject } from "@angular/core"; -import { - ThemeService, - Theme, - ThemeHostDirective, -} from "@tedi-design-system/angular/tedi"; - -@Component({ - selector: "app-root", - standalone: true, - imports: [ThemeHostDirective], - template: ` <div - [tediThemeHost]="themeService.getTheme()" - class="app-container" - > - <h1>My App</h1> - <app-theme-switcher></app-theme-switcher> - <!-- Your app content --> - </div>`, -}) -export class AppComponent { - themeService = inject(ThemeService); -} -``` - -### Theme Switcher Component example - -Create a theme switcher that persists user preferences: - -**theme-switcher.component.ts** - -```typescript -import { Component } from "@angular/core"; -import { ThemeService, Theme } from "@tedi-design-system/angular/tedi"; - -@Component({ - selector: "app-theme-switcher", - template: `html - <div class="theme-switcher"> - <button - (click)="setTheme('default')" - [class.active]="currentTheme === 'default'" - > - Default - </button> - <button - (click)="setTheme('dark')" - [class.active]="currentTheme === 'dark'" - > - Dark - </button> - </div> `, -}) -export class ThemeSwitcherComponent { - currentTheme: Theme; - - constructor(private themeService: ThemeService) { - // Initialize with current theme from service - this.currentTheme = this.themeService.getTheme(); - - // Subscribe to theme changes - this.themeService.themeChanges$.subscribe((theme) => { - this.currentTheme = theme; - }); - } - - setTheme(theme: Theme): void { - this.themeService.setTheme(theme); - } -} -``` - -### Manual Theme Control - -For advanced use cases, you can control themes programmatically: - -```typescript -import { Component, inject } from "@angular/core"; -import { ThemeService, Theme } from "@tedi-design-system/angular/tedi"; - -@Component({ - selector: "app-theme-manager", - template: `html - <button (click)="toggleTheme()"> - Switch to {{ currentTheme === "dark" ? "Default" : "Dark" }} - </button> - <p>Current theme: {{ currentTheme }}</p> `, -}) -export class ThemeManagerComponent { - private themeService = inject(ThemeService); - currentTheme: Theme = this.themeService.getTheme(); - - constructor() { - this.themeService.themeChanges$.subscribe((theme) => { - this.currentTheme = theme; - }); - } - - toggleTheme() { - const newTheme: Theme = this.currentTheme === "dark" ? "default" : "dark"; - this.themeService.setTheme(newTheme); - } - - // Set specific theme - setDarkTheme() { - this.themeService.setTheme("dark"); - } - - // Check current theme - isDarkTheme(): boolean { - return this.themeService.getTheme() === "dark"; - } -} -``` - -## Persistence Behavior - -The theme system automatically persists user preferences: - -- **Automatic Save**: Theme choices are automatically saved to `localStorage` -- **Automatic Load**: Saved theme is restored on app initialization -- **Key**: Uses `tedi-theme` as the storage key -- **No Setup**: Works out of the box with no additional configuration - -### Optional Cookie Support - -For advanced use cases (SSR, cross-subdomain), you can enable cookie persistence: - -```typescript -export class AppComponent implements OnInit { - themeService = inject(ThemeService); - - ngOnInit() { - // Enable cookie persistence alongside localStorage - this.themeService.enableCookies(true); - } -} -``` - -## Browser vs SSR - -**Client-side only apps**: Works automatically with DOM and localStorage. Themes persist across sessions. - -**Server-side rendering (SSR)**: - -- Browser-specific logic is skipped on the server -- Theme applies when hydration completes in the browser -- Persistence works seamlessly once client takes over - -<Controls /> diff --git a/tedi/directives/theme-host/theme-host.stories.ts b/tedi/directives/theme-host/theme-host.stories.ts deleted file mode 100644 index a3999b5df..000000000 --- a/tedi/directives/theme-host/theme-host.stories.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { Meta, moduleMetadata, StoryObj } from '@storybook/angular'; -import { ThemeHostDirective } from './theme-host.directive'; - -import ThemeHostDocs from './theme-host.docs.mdx'; -import { ButtonComponent, ColComponent, RowComponent, TextComponent } from '../../components'; - -const meta: Meta<ThemeHostDirective> = { - title: 'Tedi-Ready/Providers/ThemeHost', - component: ThemeHostDirective, - decorators: [ - moduleMetadata({ - imports: [ - ButtonComponent, - TextComponent, - RowComponent, - ColComponent - ], - }), - ], - parameters: { - docs: { - page: ThemeHostDocs, - }, - }, -}; - -export default meta; -type Story = StoryObj<ThemeHostDirective>; - -export const Default: Story = { - render: () => ({ - template: ` - <h2 tedi-text>ThemeHost Directive</h2> - <p tedi-text>This entire block is wrapped with the theme provider.</p> - <tedi-row [cols]="5" alignItems="center" [gapX]="1" style="margin-top: 15px;"> - <tedi-col [width]="1"> - <button tedi-button variant="primary">Primary Button</button> - </tedi-col> - <tedi-col [width]="1"> - <button tedi-button variant="secondary">Secondary</button> - </tedi-col> - </tedi-row> - `, - }), -}; \ No newline at end of file diff --git a/tedi/index.ts b/tedi/index.ts index 2dd02d25a..c4d9f1432 100644 --- a/tedi/index.ts +++ b/tedi/index.ts @@ -3,3 +3,5 @@ export * from "./directives"; export * from "./services"; export * from "./types"; export * from "./helpers"; +export * from "./providers"; +export * from "./tokens"; diff --git a/tedi/providers/index.ts b/tedi/providers/index.ts new file mode 100644 index 000000000..24f169f0a --- /dev/null +++ b/tedi/providers/index.ts @@ -0,0 +1 @@ +export * from "./tedi.provider"; diff --git a/tedi/providers/tedi.provider.ts b/tedi/providers/tedi.provider.ts new file mode 100644 index 000000000..9de773d50 --- /dev/null +++ b/tedi/providers/tedi.provider.ts @@ -0,0 +1,80 @@ +import { + EnvironmentProviders, + inject, + makeEnvironmentProviders, + PLATFORM_ID, + REQUEST, +} from "@angular/core"; +import { TEDI_THEME_DEFAULT_TOKEN } from "../tokens/theme.token"; +import { + AVAILABLE_THEMES, + Theme, + THEME_COOKIE_NAME, +} from "../services/theme/theme.service"; +import { TEDI_TRANSLATION_DEFAULT_TOKEN } from "../tokens/translation.token"; +import { + AVAILABLE_LANGUAGES, + Language, + LANGUAGE_COOKIE_NAME, +} from "../services/translation/translation.service"; +import { DOCUMENT, isPlatformServer } from "@angular/common"; + +export interface TediConfig { + theme?: Theme | (() => Theme); + language?: Language | (() => Language); +} + +function readCookie(name: string) { + const platformId = inject(PLATFORM_ID); + + if (isPlatformServer(platformId)) { + const req = inject(REQUEST, { optional: true }); + const cookieHeader = req?.headers.get("cookie") || ""; + return cookieHeader + .split("; ") + .find((c) => c.startsWith(name + "=")) + ?.split("=")[1]; + } + + const document = inject(DOCUMENT); + return document.cookie + ?.split("; ") + .find((c) => c.startsWith(name + "=")) + ?.split("=")[1]; +} + +function resolveValue<T extends string>( + value: T | (() => T) | undefined, + cookie: T | undefined, + allowed: readonly T[], + fallback: T, +): T { + if (value !== undefined) { + return typeof value === "function" ? value() : value; + } + + if (cookie && allowed.includes(cookie)) { + return cookie; + } + + return fallback; +} + +export function provideTedi(config: TediConfig = {}): EnvironmentProviders { + return makeEnvironmentProviders([ + { + provide: TEDI_THEME_DEFAULT_TOKEN, + useFactory: () => { + const cookie = readCookie(THEME_COOKIE_NAME) as Theme | undefined; + return resolveValue(config.theme, cookie, AVAILABLE_THEMES, "default"); + }, + }, + { + provide: TEDI_TRANSLATION_DEFAULT_TOKEN, + useFactory: () => { + const cookie = readCookie(LANGUAGE_COOKIE_NAME) as Language | undefined; + return resolveValue(config.language, cookie, AVAILABLE_LANGUAGES, "et"); + }, + }, + ]); +} diff --git a/tedi/services/index.ts b/tedi/services/index.ts index 924c54532..549e7a9f5 100644 --- a/tedi/services/index.ts +++ b/tedi/services/index.ts @@ -1,4 +1,4 @@ export * from "./breakpoint/breakpoint.service"; export * from "./translation/translation.service"; -export * from "./themes/themes.service"; +export * from "./theme/theme.service"; export * from "./translation/translation.pipe"; diff --git a/tedi/services/theme/theme.service.ts b/tedi/services/theme/theme.service.ts new file mode 100644 index 000000000..12e5f78fa --- /dev/null +++ b/tedi/services/theme/theme.service.ts @@ -0,0 +1,80 @@ +import { + Injectable, + signal, + inject, + effect, + PLATFORM_ID, + REQUEST, +} from "@angular/core"; +import { DOCUMENT, isPlatformBrowser, isPlatformServer } from "@angular/common"; +import { TEDI_THEME_DEFAULT_TOKEN } from "../../tokens/theme.token"; + +export type Theme = "default" | "dark" | "rit"; +export const AVAILABLE_THEMES: Theme[] = ["default", "dark", "rit"]; +export const THEME_CLASS_PREFIX = "tedi-theme--"; +export const THEME_STORAGE_KEY = "tedi-theme"; +export const THEME_COOKIE_NAME = "tedi-theme"; + +@Injectable({ providedIn: "root" }) +export class ThemeService { + private readonly document = inject(DOCUMENT); + private readonly platformId = inject(PLATFORM_ID); + private readonly defaultTheme = inject(TEDI_THEME_DEFAULT_TOKEN); + + private readonly req = isPlatformServer(this.platformId) + ? inject(REQUEST) + : null; + + private getInitialTheme(): Theme { + if (isPlatformServer(this.platformId) && this.req) { + const cookieHeader = this.req.headers.get("cookie") || ""; + const cookie = cookieHeader + .split("; ") + .find((c) => c.startsWith(THEME_COOKIE_NAME + "=")) + ?.split("=")[1] as Theme | undefined; + + if (cookie && AVAILABLE_THEMES.includes(cookie)) { + return cookie; + } + + return this.defaultTheme; + } + + if (isPlatformBrowser(this.platformId)) { + const cookie = this.document.cookie + ?.split("; ") + .find((c) => c.startsWith(THEME_COOKIE_NAME + "=")) + ?.split("=")[1] as Theme | undefined; + + if (cookie && AVAILABLE_THEMES.includes(cookie)) { + return cookie; + } + + return this.defaultTheme; + } + + return this.defaultTheme; + } + + readonly theme = signal<Theme>(this.getInitialTheme()); + + constructor() { + effect(() => { + const html = this.document.documentElement; + + for (const t of AVAILABLE_THEMES) { + html.classList.remove(`${THEME_CLASS_PREFIX}${t}`); + } + + html.classList.add(`tedi-theme--${this.theme()}`); + + if (isPlatformBrowser(this.platformId)) { + document.cookie = `${THEME_COOKIE_NAME}=${this.theme()};path=/;max-age=31536000`; + } + }); + } + + setTheme(theme: Theme): void { + this.theme.set(theme); + } +} diff --git a/tedi/services/themes/themes.service.ts b/tedi/services/themes/themes.service.ts deleted file mode 100644 index dad09eb92..000000000 --- a/tedi/services/themes/themes.service.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { Injectable, Inject, PLATFORM_ID, signal } from '@angular/core'; -import { isPlatformBrowser } from '@angular/common'; -import { BehaviorSubject } from 'rxjs'; - -export type Theme = 'default' | 'dark' | 'rit'; -export const AVAILABLE_THEMES: Theme[] = ['default', 'dark', 'rit']; -export const THEME_CLASS_PREFIX = 'tedi-theme--'; -export const THEME_STORAGE_KEY = 'tedi-theme'; -export const THEME_COOKIE_NAME = 'tedi-theme'; - -@Injectable({ providedIn: 'root' }) -export class ThemeService { - private readonly themeSubject = new BehaviorSubject<Theme>('default'); - themeChanges$ = this.themeSubject.asObservable(); - - readonly currentTheme = signal<Theme>('default'); - - private isBrowser: boolean; - private useCookies = false; - - constructor(@Inject(PLATFORM_ID) platformId: object) { - this.isBrowser = isPlatformBrowser(platformId); - - if (this.isBrowser) { - const stored = this.getStoredTheme(); - const initialTheme = stored ?? 'default'; - this.setTheme(initialTheme, false); - } - } - - enableCookies(enable: boolean = true): void { - this.useCookies = enable && this.isBrowser; - } - - setTheme(theme: Theme, persist = true): void { - if (!AVAILABLE_THEMES.includes(theme)) { - console.warn(`Theme ${theme} is not supported. Available:`, AVAILABLE_THEMES); - return; - } - - this.themeSubject.next(theme); - this.currentTheme.set(theme); - - if (this.isBrowser) { - this.applyGlobalTheme(theme); - if (persist) { - this.persistTheme(theme); - } - } - } - - getTheme(): Theme { - return this.themeSubject.value; - } - - private applyGlobalTheme(theme: Theme): void { - const root = document.documentElement; - const prefix = THEME_CLASS_PREFIX; - - AVAILABLE_THEMES.forEach(t => root.classList.remove(`${prefix}${t}`)); - root.classList.add(`${prefix}${theme}`); - } - - private persistTheme(theme: Theme): void { - localStorage.setItem(THEME_STORAGE_KEY, theme); - - if (this.useCookies) { - this.setThemeCookie(theme); - } - } - - private getStoredTheme(): Theme | null { - const local = localStorage.getItem(THEME_STORAGE_KEY) as Theme | null; - if (local && AVAILABLE_THEMES.includes(local)) { - return local; - } - - if (this.useCookies) { - const cookie = this.getThemeCookie(); - if (cookie && AVAILABLE_THEMES.includes(cookie)) { - localStorage.setItem(THEME_STORAGE_KEY, cookie); - return cookie; - } - } - - return null; - } - - private setThemeCookie(theme: Theme): void { - const expires = new Date(); - expires.setFullYear(expires.getFullYear() + 1); - document.cookie = `${THEME_COOKIE_NAME}=${theme}; expires=${expires.toUTCString()}; path=/; SameSite=Lax`; - } - - private getThemeCookie(): Theme | null { - const match = document.cookie.match(new RegExp(`(?:^|; )${THEME_COOKIE_NAME}=([^;]+)`)); - return match ? (match[1] as Theme) : null; - } -} \ No newline at end of file diff --git a/tedi/services/translation/translation.service.ts b/tedi/services/translation/translation.service.ts index 282fa72af..61992bbfc 100644 --- a/tedi/services/translation/translation.service.ts +++ b/tedi/services/translation/translation.service.ts @@ -1,15 +1,76 @@ -import { computed, Injectable, isSignal, signal, Signal } from "@angular/core"; +import { + computed, + effect, + inject, + Injectable, + isSignal, + PLATFORM_ID, + REQUEST, + signal, + Signal, +} from "@angular/core"; import { translationsMap, TranslationMap, TediTranslationsMap, } from "./translations"; +import { TEDI_TRANSLATION_DEFAULT_TOKEN } from "../../tokens/translation.token"; +import { DOCUMENT, isPlatformBrowser, isPlatformServer } from "@angular/common"; export type Language = "en" | "et" | "ru"; +export const LANGUAGE_COOKIE_NAME = "tedi-lang"; +export const AVAILABLE_LANGUAGES: Language[] = ["et", "en", "ru"]; @Injectable({ providedIn: "root" }) export class TediTranslationService { - private currentLang = signal<Language>("et"); + private readonly document = inject(DOCUMENT); + private readonly platformId = inject(PLATFORM_ID); + private readonly defaultLang = inject(TEDI_TRANSLATION_DEFAULT_TOKEN); + + private readonly req = isPlatformServer(this.platformId) + ? inject(REQUEST) + : null; + + private getInitialLang(): Language { + if (isPlatformServer(this.platformId) && this.req) { + const cookieHeader = this.req.headers.get("cookie") || ""; + const cookie = cookieHeader + .split("; ") + .find((c) => c.startsWith(LANGUAGE_COOKIE_NAME + "=")) + ?.split("=")[1] as Language | undefined; + + if (cookie && AVAILABLE_LANGUAGES.includes(cookie)) { + return cookie; + } + + return this.defaultLang; + } + + if (isPlatformBrowser(this.platformId)) { + const cookie = this.document.cookie + ?.split("; ") + .find((c) => c.startsWith(LANGUAGE_COOKIE_NAME + "=")) + ?.split("=")[1] as Language | undefined; + + if (cookie && AVAILABLE_LANGUAGES.includes(cookie)) { + return cookie; + } + + return this.defaultLang; + } + + return this.defaultLang; + } + + constructor() { + effect(() => { + if (isPlatformBrowser(this.platformId)) { + document.cookie = `${LANGUAGE_COOKIE_NAME}=${this.currentLang()};path=/;max-age=31536000`; + } + }); + } + + private readonly currentLang = signal<Language>(this.getInitialLang()); private translations = signal<TranslationMap>(translationsMap); getLanguage = this.currentLang.asReadonly(); diff --git a/tedi/tokens/index.ts b/tedi/tokens/index.ts new file mode 100644 index 000000000..508f34a7c --- /dev/null +++ b/tedi/tokens/index.ts @@ -0,0 +1,2 @@ +export * from "./theme.token"; +export * from "./translation.token"; diff --git a/tedi/tokens/theme.token.ts b/tedi/tokens/theme.token.ts new file mode 100644 index 000000000..9a7b41ba0 --- /dev/null +++ b/tedi/tokens/theme.token.ts @@ -0,0 +1,10 @@ +import { InjectionToken } from "@angular/core"; +import type { Theme } from "../services/theme/theme.service"; + +export const TEDI_THEME_DEFAULT_TOKEN = new InjectionToken<Theme>( + "TEDI_THEME_DEFAULT_TOKEN", + { + providedIn: "root", + factory: () => "default", + }, +); diff --git a/tedi/tokens/translation.token.ts b/tedi/tokens/translation.token.ts new file mode 100644 index 000000000..92d3ece3a --- /dev/null +++ b/tedi/tokens/translation.token.ts @@ -0,0 +1,10 @@ +import { InjectionToken } from "@angular/core"; +import { Language } from "../services/translation/translation.service"; + +export const TEDI_TRANSLATION_DEFAULT_TOKEN = new InjectionToken<Language>( + "TEDI_TRANSLATION_DEFAULT_TOKEN", + { + providedIn: "root", + factory: () => "et", + }, +); From f7776aa82535eb912f95c5bd3ae7deea4b2530d9 Mon Sep 17 00:00:00 2001 From: Airike Jaska <95303654+airikej@users.noreply.github.com> Date: Tue, 18 Nov 2025 14:49:50 +0200 Subject: [PATCH 4/8] fix(theme-provider): fix package-lock #191 --- package-lock.json | 2660 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 2194 insertions(+), 466 deletions(-) diff --git a/package-lock.json b/package-lock.json index d054dde19..0049b8505 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3213,14 +3213,14 @@ } }, "node_modules/@compodoc/compodoc": { - "version": "1.1.31", - "resolved": "https://registry.npmjs.org/@compodoc/compodoc/-/compodoc-1.1.31.tgz", - "integrity": "sha512-DUGLmjjE78OiiFSq1jHq2uxsGGEgah+cXUfqi9Yj8gHYv4xNgGcJv5iCnYsDWFk4UHT7MOo1/NsNzsVLYzCfJg==", + "version": "1.1.32", + "resolved": "https://registry.npmjs.org/@compodoc/compodoc/-/compodoc-1.1.32.tgz", + "integrity": "sha512-kaYk5+o4k7GB585iphwV5NE49BKKk8d+gJLNBE8eu2fIRdhnHOWblasRbOBRULfwJ+qxfmgrIqi32K34wCag6A==", "dev": true, "hasInstallScript": true, "license": "MIT", "dependencies": { - "@angular-devkit/schematics": "20.3.2", + "@angular-devkit/schematics": "20.3.4", "@babel/core": "7.28.4", "@babel/plugin-transform-private-methods": "7.27.1", "@babel/preset-env": "7.28.3", @@ -3242,7 +3242,7 @@ "glob": "^11.0.3", "handlebars": "^4.7.8", "html-entities": "^2.6.0", - "i18next": "25.5.2", + "i18next": "25.5.3", "json5": "^2.2.3", "lodash": "^4.17.21", "loglevel": "^1.9.2", @@ -3261,7 +3261,7 @@ "svg-pan-zoom": "^3.6.2", "tablesort": "^5.6.0", "ts-morph": "^27.0.0", - "uuid": "^13.0.0", + "uuid": "11.1.0", "vis-network": "^10.0.2" }, "bin": { @@ -3272,9 +3272,9 @@ } }, "node_modules/@compodoc/compodoc/node_modules/@angular-devkit/core": { - "version": "20.3.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.3.2.tgz", - "integrity": "sha512-MsYPu/WaHQInCxLRfX3vOaf4uedvwX5yI29X/tQpD59/gI5Yq4YMDT48ntryZHclRuQ9x4vdm2Gp9e/LcP0ydw==", + "version": "20.3.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.3.4.tgz", + "integrity": "sha512-r83jn9yVdPh618oGgoKPggMsQGOkQqJbxEutd4CE9mnotPCE2uRTIyaFMh8sohNUeoQNRmj9rbr2pWGVlgERpg==", "dev": true, "license": "MIT", "dependencies": { @@ -3300,13 +3300,13 @@ } }, "node_modules/@compodoc/compodoc/node_modules/@angular-devkit/schematics": { - "version": "20.3.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.3.2.tgz", - "integrity": "sha512-CHHq2qWgHNi3fkhBMpSxVSrST2mBN31QfZpvKFp1sWvtJDN7sRHlvLCML81+KplVd8aWkbQqeAG73dgRDPbSBw==", + "version": "20.3.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.3.4.tgz", + "integrity": "sha512-JYlcmVBKNT9+cQ6T2tmu+yVQ2bJk8tG0mXvPHWXrl/M4c6NObhSSThK50tJHy0Xo3gl8WgogOxUeJNnBq67cIQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "20.3.2", + "@angular-devkit/core": "20.3.4", "jsonc-parser": "3.3.1", "magic-string": "0.30.17", "ora": "8.2.0", @@ -3915,6 +3915,74 @@ "node": ">=0.8.0" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", + "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", + "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", + "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", + "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/darwin-arm64": { "version": "0.25.4", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", @@ -3932,6 +4000,346 @@ "node": ">=18" } }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", + "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", + "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", + "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", + "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", + "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", + "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", + "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", + "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", + "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", + "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", + "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", + "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", + "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", + "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", + "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", + "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", + "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", + "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", + "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", + "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.9.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", @@ -4017,7 +4425,7 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/config-helpers/node_modules/@eslint/core": { + "node_modules/@eslint/core": { "version": "0.17.0", "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", @@ -4031,20 +4439,6 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/core": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz", - "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, "node_modules/@eslint/eslintrc": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", @@ -4134,9 +4528,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.38.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.38.0.tgz", - "integrity": "sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==", + "version": "9.39.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz", + "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==", "dev": true, "license": "MIT", "peer": true, @@ -4173,20 +4567,6 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, "node_modules/@etchteam/storybook-addon-status": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@etchteam/storybook-addon-status/-/storybook-addon-status-5.0.0.tgz", @@ -4282,9 +4662,9 @@ } }, "node_modules/@inquirer/ansi": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.1.tgz", - "integrity": "sha512-yqq0aJW/5XPhi5xOAL1xRCpe1eh8UFVgYFpFsjEqmIR8rKLyP+HINvFXwUaxYICflJrVlxnp7lLN6As735kVpw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", + "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", "dev": true, "license": "MIT", "engines": { @@ -4292,17 +4672,17 @@ } }, "node_modules/@inquirer/checkbox": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.0.tgz", - "integrity": "sha512-5+Q3PKH35YsnoPTh75LucALdAxom6xh5D1oeY561x4cqBuH24ZFVyFREPe14xgnrtmGu3EEt1dIi60wRVSnGCw==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", + "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/ansi": "^1.0.1", - "@inquirer/core": "^10.3.0", - "@inquirer/figures": "^1.0.14", - "@inquirer/type": "^3.0.9", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" @@ -4339,20 +4719,20 @@ } }, "node_modules/@inquirer/core": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.0.tgz", - "integrity": "sha512-Uv2aPPPSK5jeCplQmQ9xadnFx2Zhj9b5Dj7bU6ZeCdDNNY11nhYy4btcSdtDguHqCT2h5oNeQTcUNSGGLA7NTA==", + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", + "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/ansi": "^1.0.1", - "@inquirer/figures": "^1.0.14", - "@inquirer/type": "^3.0.9", + "@inquirer/ansi": "^1.0.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", "cli-width": "^4.1.0", "mute-stream": "^2.0.0", "signal-exit": "^4.1.0", "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" @@ -4367,15 +4747,15 @@ } }, "node_modules/@inquirer/editor": { - "version": "4.2.21", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.21.tgz", - "integrity": "sha512-MjtjOGjr0Kh4BciaFShYpZ1s9400idOdvQ5D7u7lE6VztPFoyLcVNE5dXBmEEIQq5zi4B9h2kU+q7AVBxJMAkQ==", + "version": "4.2.23", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", + "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.0", - "@inquirer/external-editor": "^1.0.2", - "@inquirer/type": "^3.0.9" + "@inquirer/core": "^10.3.2", + "@inquirer/external-editor": "^1.0.3", + "@inquirer/type": "^3.0.10" }, "engines": { "node": ">=18" @@ -4390,15 +4770,15 @@ } }, "node_modules/@inquirer/expand": { - "version": "4.0.21", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.21.tgz", - "integrity": "sha512-+mScLhIcbPFmuvU3tAGBed78XvYHSvCl6dBiYMlzCLhpr0bzGzd8tfivMMeqND6XZiaZ1tgusbUHJEfc6YzOdA==", + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", + "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.0", - "@inquirer/type": "^3.0.9", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" @@ -4413,13 +4793,13 @@ } }, "node_modules/@inquirer/external-editor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.2.tgz", - "integrity": "sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", + "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", "dev": true, "license": "MIT", "dependencies": { - "chardet": "^2.1.0", + "chardet": "^2.1.1", "iconv-lite": "^0.7.0" }, "engines": { @@ -4435,9 +4815,9 @@ } }, "node_modules/@inquirer/figures": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.14.tgz", - "integrity": "sha512-DbFgdt+9/OZYFM+19dbpXOSeAstPy884FPy1KjDu4anWwymZeOYhMY1mdFri172htv6mvc/uvIAAi7b7tvjJBQ==", + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", + "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", "dev": true, "license": "MIT", "engines": { @@ -4445,14 +4825,14 @@ } }, "node_modules/@inquirer/input": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.2.5.tgz", - "integrity": "sha512-7GoWev7P6s7t0oJbenH0eQ0ThNdDJbEAEtVt9vsrYZ9FulIokvd823yLyhQlWHJPGce1wzP53ttfdCZmonMHyA==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", + "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.0", - "@inquirer/type": "^3.0.9" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" }, "engines": { "node": ">=18" @@ -4467,14 +4847,14 @@ } }, "node_modules/@inquirer/number": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.21.tgz", - "integrity": "sha512-5QWs0KGaNMlhbdhOSCFfKsW+/dcAVC2g4wT/z2MCiZM47uLgatC5N20kpkDQf7dHx+XFct/MJvvNGy6aYJn4Pw==", + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", + "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.0", - "@inquirer/type": "^3.0.9" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" }, "engines": { "node": ">=18" @@ -4489,15 +4869,15 @@ } }, "node_modules/@inquirer/password": { - "version": "4.0.21", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.21.tgz", - "integrity": "sha512-xxeW1V5SbNFNig2pLfetsDb0svWlKuhmr7MPJZMYuDnCTkpVBI+X/doudg4pznc1/U+yYmWFFOi4hNvGgUo7EA==", + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz", + "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/ansi": "^1.0.1", - "@inquirer/core": "^10.3.0", - "@inquirer/type": "^3.0.9" + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" }, "engines": { "node": ">=18" @@ -4542,15 +4922,15 @@ } }, "node_modules/@inquirer/rawlist": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.9.tgz", - "integrity": "sha512-AWpxB7MuJrRiSfTKGJ7Y68imYt8P9N3Gaa7ySdkFj1iWjr6WfbGAhdZvw/UnhFXTHITJzxGUI9k8IX7akAEBCg==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", + "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.0", - "@inquirer/type": "^3.0.9", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" @@ -4565,16 +4945,16 @@ } }, "node_modules/@inquirer/search": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.0.tgz", - "integrity": "sha512-a5SzB/qrXafDX1Z4AZW3CsVoiNxcIYCzYP7r9RzrfMpaLpB+yWi5U8BWagZyLmwR0pKbbL5umnGRd0RzGVI8bQ==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", + "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.3.0", - "@inquirer/figures": "^1.0.14", - "@inquirer/type": "^3.0.9", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" @@ -4589,17 +4969,17 @@ } }, "node_modules/@inquirer/select": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.0.tgz", - "integrity": "sha512-kaC3FHsJZvVyIjYBs5Ih8y8Bj4P/QItQWrZW22WJax7zTN+ZPXVGuOM55vzbdCP9zKUiBd9iEJVdesujfF+cAA==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", + "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/ansi": "^1.0.1", - "@inquirer/core": "^10.3.0", - "@inquirer/figures": "^1.0.14", - "@inquirer/type": "^3.0.9", - "yoctocolors-cjs": "^2.1.2" + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" }, "engines": { "node": ">=18" @@ -4614,9 +4994,9 @@ } }, "node_modules/@inquirer/type": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.9.tgz", - "integrity": "sha512-QPaNt/nmE2bLGQa9b7wwyRJoLZ7pN6rcyXvzU0YCmivmJyq1BVo94G98tStRWkoD1RgDX5C+dPlhhHzNdu/W/w==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", + "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", "dev": true, "license": "MIT", "engines": { @@ -4758,9 +5138,9 @@ } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "dev": true, "license": "MIT", "dependencies": { @@ -5680,13 +6060,88 @@ "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.2.6.tgz", "integrity": "sha512-yF/ih9EJJZc72psFQbwnn8mExIWfTnzWJg+N02hnpXtDPETYLmQswIMBn7+V88lfCaFrMozJsUvcEQIkEPU0Gg==", "cpu": [ - "arm64" + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true + }, + "node_modules/@lmdb/lmdb-darwin-x64": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.2.6.tgz", + "integrity": "sha512-5BbCumsFLbCi586Bb1lTWQFkekdQUw8/t8cy++Uq251cl3hbDIGEwD9HAwh8H6IS2F6QA9KdKmO136LmipRNkg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true + }, + "node_modules/@lmdb/lmdb-linux-arm": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.2.6.tgz", + "integrity": "sha512-+6XgLpMb7HBoWxXj+bLbiiB4s0mRRcDPElnRS3LpWRzdYSe+gFk5MT/4RrVNqd2MESUDmb53NUXw1+BP69bjiQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@lmdb/lmdb-linux-arm64": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.2.6.tgz", + "integrity": "sha512-l5VmJamJ3nyMmeD1ANBQCQqy7do1ESaJQfKPSm2IG9/ADZryptTyCj8N6QaYgIWewqNUrcbdMkJajRQAt5Qjfg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@lmdb/lmdb-linux-x64": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.2.6.tgz", + "integrity": "sha512-nDYT8qN9si5+onHYYaI4DiauDMx24OAiuZAUsEqrDy+ja/3EbpXPX/VAkMV8AEaQhy3xc4dRC+KcYIvOFefJ4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@lmdb/lmdb-win32-x64": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.2.6.tgz", + "integrity": "sha512-XlqVtILonQnG+9fH2N3Aytria7P/1fwDgDhl29rde96uH2sLB8CHORIf2PfuLVzFQJ7Uqp8py9AYwr3ZUCFfWg==", + "cpu": [ + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "darwin" + "win32" ], "peer": true }, @@ -5723,6 +6178,81 @@ ], "peer": true }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", + "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", + "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", + "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", + "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", + "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, "node_modules/@napi-rs/nice": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.1.1.tgz", @@ -5757,18 +6287,290 @@ "@napi-rs/nice-win32-x64-msvc": "1.1.1" } }, - "node_modules/@napi-rs/nice-darwin-arm64": { + "node_modules/@napi-rs/nice-android-arm-eabi": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.1.1.tgz", + "integrity": "sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-android-arm64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.1.1.tgz", + "integrity": "sha512-blG0i7dXgbInN5urONoUCNf+DUEAavRffrO7fZSeoRMJc5qD+BJeNcpr54msPF6qfDD6kzs9AQJogZvT2KD5nw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-darwin-arm64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.1.1.tgz", + "integrity": "sha512-s/E7w45NaLqTGuOjC2p96pct4jRfo61xb9bU1unM/MJ/RFkKlJyJDx7OJI/O0ll/hrfpqKopuAFDV8yo0hfT7A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-darwin-x64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.1.1.tgz", + "integrity": "sha512-dGoEBnVpsdcC+oHHmW1LRK5eiyzLwdgNQq3BmZIav+9/5WTZwBYX7r5ZkQC07Nxd3KHOCkgbHSh4wPkH1N1LiQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-freebsd-x64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.1.1.tgz", + "integrity": "sha512-kHv4kEHAylMYmlNwcQcDtXjklYp4FCf0b05E+0h6nDHsZ+F0bDe04U/tXNOqrx5CmIAth4vwfkjjUmp4c4JktQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm-gnueabihf": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.1.1.tgz", + "integrity": "sha512-E1t7K0efyKXZDoZg1LzCOLxgolxV58HCkaEkEvIYQx12ht2pa8hoBo+4OB3qh7e+QiBlp1SRf+voWUZFxyhyqg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm64-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.1.1.tgz", + "integrity": "sha512-CIKLA12DTIZlmTaaKhQP88R3Xao+gyJxNWEn04wZwC2wmRapNnxCUZkVwggInMJvtVElA+D4ZzOU5sX4jV+SmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm64-musl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.1.1.tgz", + "integrity": "sha512-+2Rzdb3nTIYZ0YJF43qf2twhqOCkiSrHx2Pg6DJaCPYhhaxbLcdlV8hCRMHghQ+EtZQWGNcS2xF4KxBhSGeutg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-ppc64-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.1.1.tgz", + "integrity": "sha512-4FS8oc0GeHpwvv4tKciKkw3Y4jKsL7FRhaOeiPei0X9T4Jd619wHNe4xCLmN2EMgZoeGg+Q7GY7BsvwKpL22Tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-riscv64-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.1.1.tgz", + "integrity": "sha512-HU0nw9uD4FO/oGCCk409tCi5IzIZpH2agE6nN4fqpwVlCn5BOq0MS1dXGjXaG17JaAvrlpV5ZeyZwSon10XOXw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-s390x-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.1.1.tgz", + "integrity": "sha512-2YqKJWWl24EwrX0DzCQgPLKQBxYDdBxOHot1KWEq7aY2uYeX+Uvtv4I8xFVVygJDgf6/92h9N3Y43WPx8+PAgQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-x64-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.1.1.tgz", + "integrity": "sha512-/gaNz3R92t+dcrfCw/96pDopcmec7oCcAQ3l/M+Zxr82KT4DljD37CpgrnXV+pJC263JkW572pdbP3hP+KjcIg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-x64-musl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.1.1.tgz", + "integrity": "sha512-xScCGnyj/oppsNPMnevsBe3pvNaoK7FGvMjT35riz9YdhB2WtTG47ZlbxtOLpjeO9SqqQ2J2igCmz6IJOD5JYw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-openharmony-arm64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-openharmony-arm64/-/nice-openharmony-arm64-1.1.1.tgz", + "integrity": "sha512-6uJPRVwVCLDeoOaNyeiW0gp2kFIM4r7PL2MczdZQHkFi9gVlgm+Vn+V6nTWRcu856mJ2WjYJiumEajfSm7arPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-arm64-msvc": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.1.1.tgz", + "integrity": "sha512-uoTb4eAvM5B2aj/z8j+Nv8OttPf2m+HVx3UjA5jcFxASvNhQriyCQF1OB1lHL43ZhW+VwZlgvjmP5qF3+59atA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-ia32-msvc": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.1.1.tgz", + "integrity": "sha512-CNQqlQT9MwuCsg1Vd/oKXiuH+TcsSPJmlAFc5frFyX/KkOh0UpBLEj7aoY656d5UKZQMQFP7vJNa1DNUNORvug==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-x64-msvc": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.1.1.tgz", - "integrity": "sha512-s/E7w45NaLqTGuOjC2p96pct4jRfo61xb9bU1unM/MJ/RFkKlJyJDx7OJI/O0ll/hrfpqKopuAFDV8yo0hfT7A==", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.1.1.tgz", + "integrity": "sha512-vB+4G/jBQCAh0jelMTY3+kgFy00Hlx2f2/1zjMoH821IbplbWZOkLiTYXQkygNTzQJTq5cvwBDgn2ppHD+bglQ==", "cpu": [ - "arm64" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "darwin" + "win32" ], "engines": { "node": ">= 10" @@ -5981,9 +6783,9 @@ } }, "node_modules/@npmcli/package-json/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "dev": true, "license": "ISC", "dependencies": { @@ -6145,17 +6947,17 @@ } }, "node_modules/@octokit/core": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.5.tgz", - "integrity": "sha512-t54CUOsFMappY1Jbzb7fetWeO0n6K0k/4+/ZpkS+3Joz8I4VcvY9OiEBFRYISqaI2fq5sCiPtAjRDOzVYG8m+Q==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.6.tgz", + "integrity": "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==", "dev": true, "license": "MIT", "dependencies": { "@octokit/auth-token": "^6.0.0", - "@octokit/graphql": "^9.0.2", - "@octokit/request": "^10.0.4", - "@octokit/request-error": "^7.0.1", - "@octokit/types": "^15.0.0", + "@octokit/graphql": "^9.0.3", + "@octokit/request": "^10.0.6", + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0", "before-after-hook": "^4.0.0", "universal-user-agent": "^7.0.0" }, @@ -6164,13 +6966,13 @@ } }, "node_modules/@octokit/endpoint": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.1.tgz", - "integrity": "sha512-7P1dRAZxuWAOPI7kXfio88trNi/MegQ0IJD3vfgC3b+LZo1Qe6gRJc2v0mz2USWWJOKrB2h5spXCzGbw+fAdqA==", + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.2.tgz", + "integrity": "sha512-4zCpzP1fWc7QlqunZ5bSEjxc6yLAlRTnDwKtgXfcI/FxxGoqedDG8V2+xJ60bV2kODqcGB+nATdtap/XYq2NZQ==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/types": "^15.0.0", + "@octokit/types": "^16.0.0", "universal-user-agent": "^7.0.2" }, "engines": { @@ -6178,14 +6980,14 @@ } }, "node_modules/@octokit/graphql": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.2.tgz", - "integrity": "sha512-iz6KzZ7u95Fzy9Nt2L8cG88lGRMr/qy1Q36ih/XVzMIlPDMYwaNLE/ENhqmIzgPrlNWiYJkwmveEetvxAgFBJw==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.3.tgz", + "integrity": "sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/request": "^10.0.4", - "@octokit/types": "^15.0.0", + "@octokit/request": "^10.0.6", + "@octokit/types": "^16.0.0", "universal-user-agent": "^7.0.0" }, "engines": { @@ -6193,9 +6995,9 @@ } }, "node_modules/@octokit/openapi-types": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-26.0.0.tgz", - "integrity": "sha512-7AtcfKtpo77j7Ts73b4OWhOZHTKo/gGY8bB3bNBQz4H+GRSWqx2yvj8TXRsbdTE0eRmYmXOEY66jM7mJ7LzfsA==", + "version": "27.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-27.0.0.tgz", + "integrity": "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==", "dev": true, "license": "MIT" }, @@ -6215,15 +7017,32 @@ "@octokit/core": ">=6" } }, + "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-26.0.0.tgz", + "integrity": "sha512-7AtcfKtpo77j7Ts73b4OWhOZHTKo/gGY8bB3bNBQz4H+GRSWqx2yvj8TXRsbdTE0eRmYmXOEY66jM7mJ7LzfsA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-15.0.2.tgz", + "integrity": "sha512-rR+5VRjhYSer7sC51krfCctQhVTmjyUMAaShfPB8mscVa8tSoLyon3coxQmXu0ahJoLVWl8dSGD/3OGZlFV44Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^26.0.0" + } + }, "node_modules/@octokit/plugin-retry": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-8.0.2.tgz", - "integrity": "sha512-mVPCe77iaD8g1lIX46n9bHPUirFLzc3BfIzsZOpB7bcQh1ecS63YsAgcsyMGqvGa2ARQWKEFTrhMJX2MLJVHVw==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-8.0.3.tgz", + "integrity": "sha512-vKGx1i3MC0za53IzYBSBXcrhmd+daQDzuZfYDd52X5S0M2otf3kVZTVP8bLA3EkU0lTvd1WEC2OlNNa4G+dohA==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/request-error": "^7.0.1", - "@octokit/types": "^15.0.0", + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0", "bottleneck": "^2.15.3" }, "engines": { @@ -6234,13 +7053,13 @@ } }, "node_modules/@octokit/plugin-throttling": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-11.0.2.tgz", - "integrity": "sha512-ntNIig4zZhQVOZF4fG9Wt8QCoz9ehb+xnlUwp74Ic2ANChCk8oKmRwV9zDDCtrvU1aERIOvtng8wsalEX7Jk5Q==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-11.0.3.tgz", + "integrity": "sha512-34eE0RkFCKycLl2D2kq7W+LovheM/ex3AwZCYN8udpi6bxsyjZidb2McXs69hZhLmJlDqTSP8cH+jSRpiaijBg==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/types": "^15.0.0", + "@octokit/types": "^16.0.0", "bottleneck": "^2.15.3" }, "engines": { @@ -6251,15 +7070,15 @@ } }, "node_modules/@octokit/request": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.5.tgz", - "integrity": "sha512-TXnouHIYLtgDhKo+N6mXATnDBkV05VwbR0TtMWpgTHIoQdRQfCSzmy/LGqR1AbRMbijq/EckC/E3/ZNcU92NaQ==", + "version": "10.0.7", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.7.tgz", + "integrity": "sha512-v93h0i1yu4idj8qFPZwjehoJx4j3Ntn+JhXsdJrG9pYaX6j/XRz2RmasMUHtNgQD39nrv/VwTWSqK0RNXR8upA==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/endpoint": "^11.0.1", - "@octokit/request-error": "^7.0.1", - "@octokit/types": "^15.0.0", + "@octokit/endpoint": "^11.0.2", + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0", "fast-content-type-parse": "^3.0.0", "universal-user-agent": "^7.0.2" }, @@ -6268,26 +7087,26 @@ } }, "node_modules/@octokit/request-error": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.0.1.tgz", - "integrity": "sha512-CZpFwV4+1uBrxu7Cw8E5NCXDWFNf18MSY23TdxCBgjw1tXXHvTrZVsXlW8hgFTOLw8RQR1BBrMvYRtuyaijHMA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.1.0.tgz", + "integrity": "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/types": "^15.0.0" + "@octokit/types": "^16.0.0" }, "engines": { "node": ">= 20" } }, "node_modules/@octokit/types": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-15.0.2.tgz", - "integrity": "sha512-rR+5VRjhYSer7sC51krfCctQhVTmjyUMAaShfPB8mscVa8tSoLyon3coxQmXu0ahJoLVWl8dSGD/3OGZlFV44Q==", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-16.0.0.tgz", + "integrity": "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==", "dev": true, "license": "MIT", "dependencies": { - "@octokit/openapi-types": "^26.0.0" + "@octokit/openapi-types": "^27.0.0" } }, "node_modules/@parcel/watcher": { @@ -6310,35 +7129,287 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.1", - "@parcel/watcher-darwin-arm64": "2.5.1", - "@parcel/watcher-darwin-x64": "2.5.1", - "@parcel/watcher-freebsd-x64": "2.5.1", - "@parcel/watcher-linux-arm-glibc": "2.5.1", - "@parcel/watcher-linux-arm-musl": "2.5.1", - "@parcel/watcher-linux-arm64-glibc": "2.5.1", - "@parcel/watcher-linux-arm64-musl": "2.5.1", - "@parcel/watcher-linux-x64-glibc": "2.5.1", - "@parcel/watcher-linux-x64-musl": "2.5.1", - "@parcel/watcher-win32-arm64": "2.5.1", - "@parcel/watcher-win32-ia32": "2.5.1", - "@parcel/watcher-win32-x64": "2.5.1" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/watcher-darwin-arm64": { + "node_modules/@parcel/watcher-win32-x64": { "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", - "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", "cpu": [ - "arm64" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "darwin" + "win32" ], "engines": { "node": ">= 10.0.0" @@ -6497,24 +7568,370 @@ } } }, - "node_modules/@rollup/rollup-darwin-arm64": { + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.8.tgz", + "integrity": "sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.8.tgz", + "integrity": "sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.8.tgz", + "integrity": "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.8.tgz", + "integrity": "sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.8.tgz", + "integrity": "sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.8.tgz", + "integrity": "sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.8.tgz", + "integrity": "sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.8.tgz", + "integrity": "sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.8.tgz", + "integrity": "sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.8.tgz", + "integrity": "sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.2.tgz", + "integrity": "sha512-8ms8sjmyc1jWJS6WdNSA23rEfdjWB30LH8Wqj0Cqvv7qSHnvw6kgMMXRdop6hkmGPlyYBdRPkjJnj3KCUHV/uQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.8.tgz", + "integrity": "sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.8.tgz", + "integrity": "sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.2.tgz", + "integrity": "sha512-3HRQLUQbpBDMmzoxPJYd3W6vrVHOo2cVW8RUo87Xz0JPJcBLBr5kZ1pGcQAhdZgX9VV7NbGNipah1omKKe23/g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.8.tgz", + "integrity": "sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.2.tgz", + "integrity": "sha512-XuGFGU+VwUUV5kLvoAdi0Wz5Xbh2SrjIxCtZj6Wq8MDp4bflb/+ThZsVxokM7n0pcbkEr2h5/pzqzDYI7cCgLQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.8.tgz", + "integrity": "sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.8.tgz", + "integrity": "sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.8.tgz", + "integrity": "sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.2.tgz", + "integrity": "sha512-4VEd19Wmhr+Zy7hbUsFZ6YXEiP48hE//KPLCSVNY5RMGX2/7HZ+QkN55a3atM1C/BZCGIgqN+xrVgtdak2S9+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "peer": true + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.8.tgz", + "integrity": "sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.8.tgz", + "integrity": "sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.2.tgz", + "integrity": "sha512-S6YojNVrHybQis2lYov1sd+uj7K0Q05NxHcGktuMMdIQ2VixGwAfbJ23NnlvvVV1bdpR2m5MsNBViHJKcA4ADw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.8.tgz", - "integrity": "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.8.tgz", + "integrity": "sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==", "cpu": [ - "arm64" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "darwin" - ] + "win32" + ], + "peer": true }, "node_modules/@rollup/wasm-node": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/wasm-node/-/wasm-node-4.52.5.tgz", - "integrity": "sha512-ldY4tEzSMBHNwB8TfRpi7RRRjjyfKlwjdebw5pS1lu0xaY3g4RDc6ople2wEYulVOKVeH7ZJwRx0iw4pGtjMHg==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/wasm-node/-/wasm-node-4.53.2.tgz", + "integrity": "sha512-oPSy4fH0C66muvPr/HU13K8X9QFO74Em+JUegHUpEwD61M3lihIlfrLpilhrEiiReFOfG00Qyhf7NGFuwkX2yA==", "dev": true, "license": "MIT", "dependencies": { @@ -7995,9 +9412,9 @@ } }, "node_modules/@tedi-design-system/core": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@tedi-design-system/core/-/core-2.1.0.tgz", - "integrity": "sha512-WHPs3LrsmU0lpzqEPFk4oq9QIBwaVBaTNbrpJbzf0ZxsBg2Fy9HM/KbVg/p5PsOgamy0iwUhpESNMHXpNL8dyg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@tedi-design-system/core/-/core-2.3.0.tgz", + "integrity": "sha512-mbx8V13nXzGkI/qOO54GtNt5IdIcPQBe9elx4lS1lCkJjSKHEmrxBSWXMX59KyY8oPjyMpQ0uXjVyK6XaMDK/Q==", "engines": { "node": ">=18.0.0", "npm": ">=8.0.0" @@ -8200,9 +9617,9 @@ } }, "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", + "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", "dev": true, "license": "MIT" }, @@ -8555,9 +9972,9 @@ "peer": true }, "node_modules/@types/node": { - "version": "22.18.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.13.tgz", - "integrity": "sha512-Bo45YKIjnmFtv6I1TuC8AaHBbqXtIo+Om5fE4QiU1Tj8QR/qt+8O3BAtOimG5IFmwaWiPmB3Mv3jtYzBA4Us2A==", + "version": "22.19.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.1.tgz", + "integrity": "sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8613,14 +10030,14 @@ "peer": true }, "node_modules/@types/react": { - "version": "18.3.26", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.26.tgz", - "integrity": "sha512-RFA/bURkcKzx/X9oumPG9Vp3D3JUgus/d0b67KB0t5S/raciymilkOa66olh78MUI92QLbEJevO7rvqU/kjwKA==", + "version": "18.3.27", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.27.tgz", + "integrity": "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==", "dev": true, "license": "MIT", "dependencies": { "@types/prop-types": "*", - "csstype": "^3.0.2" + "csstype": "^3.2.2" } }, "node_modules/@types/react-dom": { @@ -8746,9 +10163,9 @@ } }, "node_modules/@types/yargs": { - "version": "17.0.34", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.34.tgz", - "integrity": "sha512-KExbHVa92aJpw9WDQvzBaGVE2/Pz+pLZQloT2hjL8IqsZnV62rlPOYvNnLmf/L2dyllfVUOVBj64M0z/46eR2A==", + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", "dev": true, "license": "MIT", "dependencies": { @@ -8763,17 +10180,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.2.tgz", - "integrity": "sha512-ZGBMToy857/NIPaaCucIUQgqueOiq7HeAKkhlvqVV4lm089zUFW6ikRySx2v+cAhKeUCPuWVHeimyk6Dw1iY3w==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.47.0.tgz", + "integrity": "sha512-fe0rz9WJQ5t2iaLfdbDc9T80GJy0AeO453q8C3YCilnGozvOyCG5t+EZtg7j7D88+c3FipfP/x+wzGnh1xp8ZA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.46.2", - "@typescript-eslint/type-utils": "8.46.2", - "@typescript-eslint/utils": "8.46.2", - "@typescript-eslint/visitor-keys": "8.46.2", + "@typescript-eslint/scope-manager": "8.47.0", + "@typescript-eslint/type-utils": "8.47.0", + "@typescript-eslint/utils": "8.47.0", + "@typescript-eslint/visitor-keys": "8.47.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -8787,23 +10204,23 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.46.2", + "@typescript-eslint/parser": "^8.47.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.2.tgz", - "integrity": "sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.47.0.tgz", + "integrity": "sha512-lJi3PfxVmo0AkEY93ecfN+r8SofEqZNGByvHAI3GBLrvt1Cw6H5k1IM02nSzu0RfUafr2EvFSw0wAsZgubNplQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.46.2", - "@typescript-eslint/types": "8.46.2", - "@typescript-eslint/typescript-estree": "8.46.2", - "@typescript-eslint/visitor-keys": "8.46.2", + "@typescript-eslint/scope-manager": "8.47.0", + "@typescript-eslint/types": "8.47.0", + "@typescript-eslint/typescript-estree": "8.47.0", + "@typescript-eslint/visitor-keys": "8.47.0", "debug": "^4.3.4" }, "engines": { @@ -8819,14 +10236,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.2.tgz", - "integrity": "sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.47.0.tgz", + "integrity": "sha512-2X4BX8hUeB5JcA1TQJ7GjcgulXQ+5UkNb0DL8gHsHUHdFoiCTJoYLTpib3LtSDPZsRET5ygN4qqIWrHyYIKERA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.46.2", - "@typescript-eslint/types": "^8.46.2", + "@typescript-eslint/tsconfig-utils": "^8.47.0", + "@typescript-eslint/types": "^8.47.0", "debug": "^4.3.4" }, "engines": { @@ -8841,14 +10258,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.2.tgz", - "integrity": "sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.47.0.tgz", + "integrity": "sha512-a0TTJk4HXMkfpFkL9/WaGTNuv7JWfFTQFJd6zS9dVAjKsojmv9HT55xzbEpnZoY+VUb+YXLMp+ihMLz/UlZfDg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.46.2", - "@typescript-eslint/visitor-keys": "8.46.2" + "@typescript-eslint/types": "8.47.0", + "@typescript-eslint/visitor-keys": "8.47.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8859,9 +10276,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.2.tgz", - "integrity": "sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.47.0.tgz", + "integrity": "sha512-ybUAvjy4ZCL11uryalkKxuT3w3sXJAuWhOoGS3T/Wu+iUu1tGJmk5ytSY8gbdACNARmcYEB0COksD2j6hfGK2g==", "dev": true, "license": "MIT", "engines": { @@ -8876,15 +10293,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.2.tgz", - "integrity": "sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.47.0.tgz", + "integrity": "sha512-QC9RiCmZ2HmIdCEvhd1aJELBlD93ErziOXXlHEZyuBo3tBiAZieya0HLIxp+DoDWlsQqDawyKuNEhORyku+P8A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.46.2", - "@typescript-eslint/typescript-estree": "8.46.2", - "@typescript-eslint/utils": "8.46.2", + "@typescript-eslint/types": "8.47.0", + "@typescript-eslint/typescript-estree": "8.47.0", + "@typescript-eslint/utils": "8.47.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -8901,9 +10318,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.2.tgz", - "integrity": "sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.47.0.tgz", + "integrity": "sha512-nHAE6bMKsizhA2uuYZbEbmp5z2UpffNrPEqiKIeN7VsV6UY/roxanWfoRrf6x/k9+Obf+GQdkm0nPU+vnMXo9A==", "dev": true, "license": "MIT", "engines": { @@ -8915,16 +10332,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.2.tgz", - "integrity": "sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.47.0.tgz", + "integrity": "sha512-k6ti9UepJf5NpzCjH31hQNLHQWupTRPhZ+KFF8WtTuTpy7uHPfeg2NM7cP27aCGajoEplxJDFVCEm9TGPYyiVg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.46.2", - "@typescript-eslint/tsconfig-utils": "8.46.2", - "@typescript-eslint/types": "8.46.2", - "@typescript-eslint/visitor-keys": "8.46.2", + "@typescript-eslint/project-service": "8.47.0", + "@typescript-eslint/tsconfig-utils": "8.47.0", + "@typescript-eslint/types": "8.47.0", + "@typescript-eslint/visitor-keys": "8.47.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -8944,16 +10361,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.2.tgz", - "integrity": "sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.47.0.tgz", + "integrity": "sha512-g7XrNf25iL4TJOiPqatNuaChyqt49a/onq5YsJ9+hXeugK+41LVg7AxikMfM02PC6jbNtZLCJj6AUcQXJS/jGQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.46.2", - "@typescript-eslint/types": "8.46.2", - "@typescript-eslint/typescript-estree": "8.46.2" + "@typescript-eslint/scope-manager": "8.47.0", + "@typescript-eslint/types": "8.47.0", + "@typescript-eslint/typescript-estree": "8.47.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8968,13 +10385,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.2.tgz", - "integrity": "sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.47.0.tgz", + "integrity": "sha512-SIV3/6eftCy1bNzCQoPmbWsRLujS8t5iDIZ4spZOBHqrM+yfX2ogg8Tt3PDTAVKw3sSCiUgg30uOAvK2r9zGjQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/types": "8.47.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -9484,19 +10901,19 @@ } }, "node_modules/angular-eslint": { - "version": "20.5.0", - "resolved": "https://registry.npmjs.org/angular-eslint/-/angular-eslint-20.5.0.tgz", - "integrity": "sha512-TSZWjLl3NF6C+PV4wEs6EV1lw+ENo6aOkLCoZ41jXB2bmSvH76LqgTLzWtVNaSZE/MmAL0RkDJFyRtGcE4dtgQ==", + "version": "20.6.0", + "resolved": "https://registry.npmjs.org/angular-eslint/-/angular-eslint-20.6.0.tgz", + "integrity": "sha512-SOQLhUjL5ulikHIFRrDA41euGsv9z6tYhYsmb6DYRLSaSglAiyiH/wb8sbW+COzsztBkSLb6gDVBMW+kzQ+yjw==", "dev": true, "license": "MIT", "dependencies": { "@angular-devkit/core": ">= 20.0.0 < 21.0.0", "@angular-devkit/schematics": ">= 20.0.0 < 21.0.0", - "@angular-eslint/builder": "20.5.0", - "@angular-eslint/eslint-plugin": "20.5.0", - "@angular-eslint/eslint-plugin-template": "20.5.0", - "@angular-eslint/schematics": "20.5.0", - "@angular-eslint/template-parser": "20.5.0", + "@angular-eslint/builder": "20.6.0", + "@angular-eslint/eslint-plugin": "20.6.0", + "@angular-eslint/eslint-plugin-template": "20.6.0", + "@angular-eslint/schematics": "20.6.0", + "@angular-eslint/template-parser": "20.6.0", "@typescript-eslint/types": "^8.0.0", "@typescript-eslint/utils": "^8.0.0" }, @@ -9507,13 +10924,13 @@ } }, "node_modules/angular-eslint/node_modules/@angular-devkit/architect": { - "version": "0.2003.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2003.8.tgz", - "integrity": "sha512-pbXQ2NlZQwzjsSIEoRQMGB1WrgZFCyM0zoD9h+rDjyR8PEB1Evl4evZ4Q5CJzjEBxC8IEG61PHKHjh8GdLb+sg==", + "version": "0.2003.10", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2003.10.tgz", + "integrity": "sha512-2SWetxJzS8gRX6OKQstkWx37VRvZVgcEBDLsDSaeTjpnwh81A+niZQjAVRdwL0NEt1Wixk/RxfeUuCmdyyHvhQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "20.3.8", + "@angular-devkit/core": "20.3.10", "rxjs": "7.8.2" }, "engines": { @@ -9523,9 +10940,9 @@ } }, "node_modules/angular-eslint/node_modules/@angular-devkit/core": { - "version": "20.3.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.3.8.tgz", - "integrity": "sha512-+YFpJdvlL4gxnMm/++8rseE7ZNRHlYPmOqpoiXSuP5eGPSmdklEoQGTQvpMw42S3bll1g6/029DmV2FCZ/dtEQ==", + "version": "20.3.10", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.3.10.tgz", + "integrity": "sha512-COOT2eVebDwHhwENk12VR6m0wjL8D7p0dncEHF15zaBt1IXEnVhGESjSrs5klnPnt5T55qCBKyCTaeK7i/cS8Q==", "dev": true, "license": "MIT", "dependencies": { @@ -9551,13 +10968,13 @@ } }, "node_modules/angular-eslint/node_modules/@angular-devkit/schematics": { - "version": "20.3.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.3.8.tgz", - "integrity": "sha512-Ymv7nWLTDB1gBh2laRveO912eUpQ/rUIzKRr8VQFMVG/wNipL88vzyrlKhJa7WhQ3CdKxLD7kplFIjdev7XUVg==", + "version": "20.3.10", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.3.10.tgz", + "integrity": "sha512-2N2WF9lj+kr3uCG4+vFadYCL5hAT4dxMgzwScSdOqSd0O+GZD0CzKbDzlfvWIWC/ZealC5Sh4dFEQaRfmy72xA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": "20.3.8", + "@angular-devkit/core": "20.3.10", "jsonc-parser": "3.3.1", "magic-string": "0.30.17", "ora": "8.2.0", @@ -9570,9 +10987,9 @@ } }, "node_modules/angular-eslint/node_modules/@angular-eslint/builder": { - "version": "20.5.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-20.5.0.tgz", - "integrity": "sha512-ycrvgomFgitSwzDndo+i3Ob1iu9lAJeuZZ8cwBR4E/RYsCxNm02NLCv5qjQ3ya57yjkh12N6yvjzWnCO9Vdiuw==", + "version": "20.6.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-20.6.0.tgz", + "integrity": "sha512-bEvQxjnxXiajcPoSnFPRmc9MYLtultZX7Z/psqj6jiGVujgs5UObs91JcmT4QY56ZkdZjETw9RhztLmRTuLB3Q==", "dev": true, "license": "MIT", "dependencies": { @@ -9585,21 +11002,21 @@ } }, "node_modules/angular-eslint/node_modules/@angular-eslint/bundled-angular-compiler": { - "version": "20.5.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-20.5.0.tgz", - "integrity": "sha512-XjvSZk+G/4rRUOLHHjlHBeS4OnnsLV9G1YtE5OerBB2H4x6nKgUEzpptad3uuL4iYWI9rGaWMLqGPTvyYqw/IA==", + "version": "20.6.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-20.6.0.tgz", + "integrity": "sha512-axeU33lBOcfQ/kcpBc/70vR69PFX9kqgUtroENK0lq6dBeRgi6LJVbBOAHRtR2Xfxd9Lv4YbqWuJ0oQ5BwSTGQ==", "dev": true, "license": "MIT" }, "node_modules/angular-eslint/node_modules/@angular-eslint/eslint-plugin": { - "version": "20.5.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-20.5.0.tgz", - "integrity": "sha512-xpBrx4qCq0mzQ1lmqHa06faxHuKvBZGYb5owP/vTQBr2kZvQ502ENp5vwv+NS04TRKcWht1zHbMfy9rKRdhL5w==", + "version": "20.6.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-20.6.0.tgz", + "integrity": "sha512-hvFtluNRjMqlkwxYGMO1RFgJ5N5/InFZZSHIOput+XXVXYwPrNjbyMY29/ndynpvNktcVq1UPpjv5JAucp0GlA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "20.5.0", - "@angular-eslint/utils": "20.5.0", + "@angular-eslint/bundled-angular-compiler": "20.6.0", + "@angular-eslint/utils": "20.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { @@ -9609,19 +11026,19 @@ } }, "node_modules/angular-eslint/node_modules/@angular-eslint/eslint-plugin-template": { - "version": "20.5.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-20.5.0.tgz", - "integrity": "sha512-sX3TgTTGusYv4CjnEWWNvSyVCPmf2WF2LT5NpcKF+4BLcIVLXHdTXKz9H+OxIHeHk9R7QSRkuop/F7DAKyEPhA==", + "version": "20.6.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-20.6.0.tgz", + "integrity": "sha512-HoV0QeZFP63vUyD+uBYdqGi95xNJ64Wsb9vG0/auY5sqHsed8tbmFZgNmr8/ho1AHMyQ2HhH7eLIsV2glftyEg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "20.5.0", - "@angular-eslint/utils": "20.5.0", + "@angular-eslint/bundled-angular-compiler": "20.6.0", + "@angular-eslint/utils": "20.6.0", "aria-query": "5.3.2", "axobject-query": "4.1.0" }, "peerDependencies": { - "@angular-eslint/template-parser": "20.5.0", + "@angular-eslint/template-parser": "20.6.0", "@typescript-eslint/types": "^7.11.0 || ^8.0.0", "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", "eslint": "^8.57.0 || ^9.0.0", @@ -9629,29 +11046,29 @@ } }, "node_modules/angular-eslint/node_modules/@angular-eslint/schematics": { - "version": "20.5.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-20.5.0.tgz", - "integrity": "sha512-pYGxMKocgUzKIMOOYBcGjvtxRcvnOY5ETs64IFcdHnwKoFfWeQV0a77sJdDj1YGOu/mj4PeORTRHfQyLvbhvyQ==", + "version": "20.6.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-20.6.0.tgz", + "integrity": "sha512-bZ3FFyfEUqnLkNj4OzU+0LQH4NiHtWbleuoaaTeIXAG9AHZP9H5PPD9loR3CUaLoHvwY22zWBkBOEuBBDkBAtw==", "dev": true, "license": "MIT", "dependencies": { "@angular-devkit/core": ">= 20.0.0 < 21.0.0", "@angular-devkit/schematics": ">= 20.0.0 < 21.0.0", - "@angular-eslint/eslint-plugin": "20.5.0", - "@angular-eslint/eslint-plugin-template": "20.5.0", + "@angular-eslint/eslint-plugin": "20.6.0", + "@angular-eslint/eslint-plugin-template": "20.6.0", "ignore": "7.0.5", "semver": "7.7.3", "strip-json-comments": "3.1.1" } }, "node_modules/angular-eslint/node_modules/@angular-eslint/template-parser": { - "version": "20.5.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-20.5.0.tgz", - "integrity": "sha512-dWaz2Knjy6yJI5/xVYqp5iu65b725wveMwt1DgJ9EDTZ5gpJcTsvSCW4zQr/6iXfpAZHKPh9LJvVW1svowhtWw==", + "version": "20.6.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-20.6.0.tgz", + "integrity": "sha512-dDsABCf8qoFEUmSQa2F0NBZtkxT+I4GQxKcYSpsFZdgv6zrE46lpJSuRgK8OKOq1jqMmbIEXp2h0FeHyJS/qmg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "20.5.0", + "@angular-eslint/bundled-angular-compiler": "20.6.0", "eslint-scope": "^8.0.2" }, "peerDependencies": { @@ -9660,13 +11077,13 @@ } }, "node_modules/angular-eslint/node_modules/@angular-eslint/utils": { - "version": "20.5.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-20.5.0.tgz", - "integrity": "sha512-eP8al/UKP9FpmwK3hVWkYUjBuq4BnUDrcboS51L9mRZsoOblkPt1/UgU6MJqW8sh6sfebP9N3RxLQOAFrM3juQ==", + "version": "20.6.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-20.6.0.tgz", + "integrity": "sha512-usjCCjbdtqy4p8I3BMPn6LrXECFLCohBa75h59PK0kV/TEb8OlnIWIWTVtZAMw/MgohtExl69GkSNmL3ElWbUQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "20.5.0" + "@angular-eslint/bundled-angular-compiler": "20.6.0" }, "peerDependencies": { "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", @@ -10355,9 +11772,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.8.21", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.21.tgz", - "integrity": "sha512-JU0h5APyQNsHOlAM7HnQnPToSDQoEBZqzu/YBlqDnEeymPnZDREeXJA3KBMQee+dKteAxZ2AtvQEvVYdZf241Q==", + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.29.tgz", + "integrity": "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA==", "dev": true, "license": "Apache-2.0", "bin": { @@ -10631,9 +12048,9 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.27.0.tgz", - "integrity": "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==", + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz", + "integrity": "sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==", "dev": true, "funding": [ { @@ -10651,10 +12068,10 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.8.19", - "caniuse-lite": "^1.0.30001751", - "electron-to-chromium": "^1.5.238", - "node-releases": "^2.0.26", + "baseline-browser-mapping": "^2.8.25", + "caniuse-lite": "^1.0.30001754", + "electron-to-chromium": "^1.5.249", + "node-releases": "^2.0.27", "update-browserslist-db": "^1.1.4" }, "bin": { @@ -10781,9 +12198,9 @@ } }, "node_modules/cacache/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "dev": true, "license": "ISC", "dependencies": { @@ -10842,11 +12259,11 @@ } }, "node_modules/cacache/node_modules/tar": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz", - "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.2.tgz", + "integrity": "sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -10959,9 +12376,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001751", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001751.tgz", - "integrity": "sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==", + "version": "1.0.30001755", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001755.tgz", + "integrity": "sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA==", "dev": true, "funding": [ { @@ -12174,13 +13591,13 @@ } }, "node_modules/core-js-compat": { - "version": "3.46.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.46.0.tgz", - "integrity": "sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law==", + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.47.0.tgz", + "integrity": "sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.26.3" + "browserslist": "^4.28.0" }, "funding": { "type": "opencollective", @@ -12474,9 +13891,9 @@ "license": "MIT" }, "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "dev": true, "license": "MIT" }, @@ -12607,9 +14024,9 @@ } }, "node_modules/default-browser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", - "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.4.0.tgz", + "integrity": "sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==", "dev": true, "license": "MIT", "peer": true, @@ -12625,9 +14042,9 @@ } }, "node_modules/default-browser-id": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", - "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", "dev": true, "license": "MIT", "peer": true, @@ -13006,9 +14423,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.243", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.243.tgz", - "integrity": "sha512-ZCphxFW3Q1TVhcgS9blfut1PX8lusVi2SvXQgmEEnK4TCmE1JhH2JkjJN+DNt0pJJwfBri5AROBnz2b/C+YU9g==", + "version": "1.5.255", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.255.tgz", + "integrity": "sha512-Z9oIp4HrFF/cZkDPMpz2XSuVpc1THDpT4dlmATFlJUIBVCy9Vap5/rIXsASP1CscBacBqhabwh8vLctqBwEerQ==", "dev": true, "license": "ISC" }, @@ -13543,9 +14960,9 @@ } }, "node_modules/eslint": { - "version": "9.38.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.38.0.tgz", - "integrity": "sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==", + "version": "9.39.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz", + "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", "dev": true, "license": "MIT", "peer": true, @@ -13553,11 +14970,11 @@ "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.1", - "@eslint/config-helpers": "^0.4.1", - "@eslint/core": "^0.16.0", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.38.0", - "@eslint/plugin-kit": "^0.4.0", + "@eslint/js": "9.39.1", + "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", @@ -15000,9 +16417,9 @@ } }, "node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "dev": true, "license": "MIT", "dependencies": { @@ -15338,15 +16755,15 @@ } }, "node_modules/glob": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", - "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.1.0.tgz", + "integrity": "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { "foreground-child": "^3.3.1", "jackspeak": "^4.1.1", - "minimatch": "^10.0.3", + "minimatch": "^10.1.1", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^2.0.0" @@ -15836,9 +17253,9 @@ } }, "node_modules/html-webpack-plugin": { - "version": "5.6.4", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.4.tgz", - "integrity": "sha512-V/PZeWsqhfpE27nKeX9EO2sbR+D17A+tLf6qU+ht66jdUsN0QLKJN27Z+1+gHrVMKgndBahes0PU6rRihDgHTw==", + "version": "5.6.5", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.5.tgz", + "integrity": "sha512-4xynFbKNNk+WlzXeQQ+6YYsH2g7mpfPszQZUi3ovKlj+pDmngQ7vRXjrrmGROabmKwyQkcgcX5hqfOwHbFmK5g==", "dev": true, "license": "MIT", "dependencies": { @@ -16101,9 +17518,9 @@ } }, "node_modules/i18next": { - "version": "25.5.2", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-25.5.2.tgz", - "integrity": "sha512-lW8Zeh37i/o0zVr+NoCHfNnfvVw+M6FQbRp36ZZ/NyHDJ3NJVpp2HhAUyU9WafL5AssymNoOjMRB48mmx2P6Hw==", + "version": "25.5.3", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-25.5.3.tgz", + "integrity": "sha512-joFqorDeQ6YpIXni944upwnuHBf5IoPMuqAchGVeQLdWC2JOjxgM9V8UGLhNIIH/Q8QleRxIi0BSRQehSrDLcg==", "dev": true, "funding": [ { @@ -16491,9 +17908,9 @@ } }, "node_modules/ip-address": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", - "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", "dev": true, "license": "MIT", "engines": { @@ -18523,9 +19940,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "license": "MIT", "dependencies": { @@ -19537,9 +20954,9 @@ } }, "node_modules/log-update/node_modules/ansi-escapes": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.1.1.tgz", - "integrity": "sha512-Zhl0ErHcSRUaVfGUeUdDuLgpkEo8KIFjB4Y9uAc46ScOpdDiU1Dbyplh7qWJeJ/ZHpbyMSM26+X3BySgnIz40Q==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.2.0.tgz", + "integrity": "sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==", "dev": true, "license": "MIT", "dependencies": { @@ -19729,6 +21146,37 @@ "@jridgewell/sourcemap-codec": "^1.5.0" } }, + "node_modules/make-asynchronous": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-asynchronous/-/make-asynchronous-1.0.1.tgz", + "integrity": "sha512-T9BPOmEOhp6SmV25SwLVcHK4E6JyG/coH3C6F1NjNXSziv/fd4GmsqMk8YR6qpPOswfaOCApSNkZv6fxoaYFcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-event": "^6.0.0", + "type-fest": "^4.6.0", + "web-worker": "1.2.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-asynchronous/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/make-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", @@ -19835,9 +21283,9 @@ } }, "node_modules/marked-terminal/node_modules/ansi-escapes": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.1.1.tgz", - "integrity": "sha512-Zhl0ErHcSRUaVfGUeUdDuLgpkEo8KIFjB4Y9uAc46ScOpdDiU1Dbyplh7qWJeJ/ZHpbyMSM26+X3BySgnIz40Q==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.2.0.tgz", + "integrity": "sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==", "dev": true, "license": "MIT", "dependencies": { @@ -20854,11 +22302,11 @@ } }, "node_modules/node-gyp/node_modules/tar": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz", - "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.2.tgz", + "integrity": "sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -24084,6 +25532,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-event": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-6.0.1.tgz", + "integrity": "sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-timeout": "^6.1.2" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/p-filter": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-4.1.0.tgz", @@ -24159,9 +25623,9 @@ } }, "node_modules/p-locate/node_modules/yocto-queue": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", - "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", "dev": true, "license": "MIT", "engines": { @@ -24172,9 +25636,9 @@ } }, "node_modules/p-map": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", - "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", + "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", "dev": true, "license": "MIT", "engines": { @@ -24224,6 +25688,19 @@ "node": ">= 4" } }, + "node_modules/p-timeout": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", + "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -24495,9 +25972,9 @@ "license": "MIT" }, "node_modules/path-scurry": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", - "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", + "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -25732,9 +27209,9 @@ } }, "node_modules/replace-in-file/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", "dev": true, "license": "ISC", "dependencies": { @@ -26106,9 +27583,9 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.93.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.93.2.tgz", - "integrity": "sha512-t+YPtOQHpGW1QWsh1CHQ5cPIr9lbbGZLZnbihP/D/qZj/yuV68m8qarcV17nvkOX81BCrvzAlq2klCQFZghyTg==", + "version": "1.94.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.94.1.tgz", + "integrity": "sha512-/YVm5FRQaRlr3oNh2LLFYne1PdPlRZGyKnHh1sLleOqLcohTR4eUUvBjBIqkl1fEXd1MGOHgzJGJh+LgTtV4KQ==", "dev": true, "license": "MIT", "dependencies": { @@ -26169,11 +27646,11 @@ } }, "node_modules/sax": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.3.tgz", + "integrity": "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "optional": true }, "node_modules/saxes": { @@ -27856,13 +29333,14 @@ } }, "node_modules/super-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/super-regex/-/super-regex-1.0.0.tgz", - "integrity": "sha512-CY8u7DtbvucKuquCmOFEKhr9Besln7n9uN8eFbwcoGYWXOMW07u2o8njWaiXt11ylS3qoGF55pILjRmPlbodyg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/super-regex/-/super-regex-1.1.0.tgz", + "integrity": "sha512-WHkws2ZflZe41zj6AolvvmaTrWds/VuyeYr9iPVv/oQeaIoVxMKaushfFWpOGDT+GuBrM/sVqF8KUCYQlSSTdQ==", "dev": true, "license": "MIT", "dependencies": { "function-timeout": "^1.0.1", + "make-asynchronous": "^1.0.1", "time-span": "^5.1.0" }, "engines": { @@ -28416,11 +29894,14 @@ "license": "MIT" }, "node_modules/tinyexec": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz", - "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=18" + } }, "node_modules/tinyglobby": { "version": "0.2.15", @@ -28957,17 +30438,17 @@ } }, "node_modules/typescript-eslint": { - "version": "8.46.2", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.46.2.tgz", - "integrity": "sha512-vbw8bOmiuYNdzzV3lsiWv6sRwjyuKJMQqWulBOU7M0RrxedXledX8G8kBbQeiOYDnTfiXz0Y4081E1QMNB6iQg==", + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.47.0.tgz", + "integrity": "sha512-Lwe8i2XQ3WoMjua/r1PHrCTpkubPYJCAfOurtn+mtTzqB6jNd+14n9UN1bJ4s3F49x9ixAm0FLflB/JzQ57M8Q==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/eslint-plugin": "8.46.2", - "@typescript-eslint/parser": "8.46.2", - "@typescript-eslint/typescript-estree": "8.46.2", - "@typescript-eslint/utils": "8.46.2" + "@typescript-eslint/eslint-plugin": "8.47.0", + "@typescript-eslint/parser": "8.47.0", + "@typescript-eslint/typescript-estree": "8.47.0", + "@typescript-eslint/utils": "8.47.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -29291,9 +30772,9 @@ } }, "node_modules/uuid": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz", - "integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", "dev": true, "funding": [ "https://github.com/sponsors/broofa", @@ -29301,7 +30782,7 @@ ], "license": "MIT", "bin": { - "uuid": "dist-node/bin/uuid" + "uuid": "dist/esm/bin/uuid" } }, "node_modules/v8-compile-cache-lib": { @@ -29494,10 +30975,40 @@ } } }, + "node_modules/vite/node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.2.tgz", + "integrity": "sha512-yDPzwsgiFO26RJA4nZo8I+xqzh7sJTZIWQOxn+/XOdPE31lAvLIYCKqjV+lNH/vxE2L2iH3plKxDCRK6i+CwhA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true + }, + "node_modules/vite/node_modules/@rollup/rollup-android-arm64": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.2.tgz", + "integrity": "sha512-k8FontTxIE7b0/OGKeSN5B6j25EuppBcWM33Z19JoVT7UTXFSo3D9CdU39wGTeb29NO3XxpMNauh09B+Ibw+9g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true + }, "node_modules/vite/node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.5.tgz", - "integrity": "sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.2.tgz", + "integrity": "sha512-A6s4gJpomNBtJ2yioj8bflM2oogDwzUiMl2yNJ2v9E7++sHrSrsQ29fOfn5DM/iCzpWcebNYEdXpaK4tr2RhfQ==", "cpu": [ "arm64" ], @@ -29509,6 +31020,216 @@ ], "peer": true }, + "node_modules/vite/node_modules/@rollup/rollup-darwin-x64": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.2.tgz", + "integrity": "sha512-e6XqVmXlHrBlG56obu9gDRPW3O3hLxpwHpLsBJvuI8qqnsrtSZ9ERoWUXtPOkY8c78WghyPHZdmPhHLWNdAGEw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true + }, + "node_modules/vite/node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.2.tgz", + "integrity": "sha512-v0E9lJW8VsrwPux5Qe5CwmH/CF/2mQs6xU1MF3nmUxmZUCHazCjLgYvToOk+YuuUqLQBio1qkkREhxhc656ViA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true + }, + "node_modules/vite/node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.2.tgz", + "integrity": "sha512-ClAmAPx3ZCHtp6ysl4XEhWU69GUB1D+s7G9YjHGhIGCSrsg00nEGRRZHmINYxkdoJehde8VIsDC5t9C0gb6yqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true + }, + "node_modules/vite/node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.2.tgz", + "integrity": "sha512-EPlb95nUsz6Dd9Qy13fI5kUPXNSljaG9FiJ4YUGU1O/Q77i5DYFW5KR8g1OzTcdZUqQQ1KdDqsTohdFVwCwjqg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/vite/node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.2.tgz", + "integrity": "sha512-BOmnVW+khAUX+YZvNfa0tGTEMVVEerOxN0pDk2E6N6DsEIa2Ctj48FOMfNDdrwinocKaC7YXUZ1pHlKpnkja/Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/vite/node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.2.tgz", + "integrity": "sha512-Xt2byDZ+6OVNuREgBXr4+CZDJtrVso5woFtpKdGPhpTPHcNG7D8YXeQzpNbFRxzTVqJf7kvPMCub/pcGUWgBjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/vite/node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.2.tgz", + "integrity": "sha512-+LdZSldy/I9N8+klim/Y1HsKbJ3BbInHav5qE9Iy77dtHC/pibw1SR/fXlWyAk0ThnpRKoODwnAuSjqxFRDHUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/vite/node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.2.tgz", + "integrity": "sha512-fMjKi+ojnmIvhk34gZP94vjogXNNUKMEYs+EDaB/5TG/wUkoeua7p7VCHnE6T2Tx+iaghAqQX8teQzcvrYpaQA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/vite/node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.2.tgz", + "integrity": "sha512-w6yjZF0P+NGzWR3AXWX9zc0DNEGdtvykB03uhonSHMRa+oWA6novflo2WaJr6JZakG2ucsyb+rvhrKac6NIy+w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/vite/node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.2.tgz", + "integrity": "sha512-yo8d6tdfdeBArzC7T/PnHd7OypfI9cbuZzPnzLJIyKYFhAQ8SvlkKtKBMbXDxe1h03Rcr7u++nFS7tqXz87Gtw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/vite/node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.2.tgz", + "integrity": "sha512-ah59c1YkCxKExPP8O9PwOvs+XRLKwh/mV+3YdKqQ5AMQ0r4M4ZDuOrpWkUaqO7fzAHdINzV9tEVu8vNw48z0lA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, + "node_modules/vite/node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.2.tgz", + "integrity": "sha512-IlbHFYc/pQCgew/d5fslcy1KEaYVCJ44G8pajugd8VoOEI8ODhtb/j8XMhLpwHCMB3yk2J07ctup10gpw2nyMA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/vite/node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.2.tgz", + "integrity": "sha512-lNlPEGgdUfSzdCWU176ku/dQRnA7W+Gp8d+cWv73jYrb8uT7HTVVxq62DUYxjbaByuf1Yk0RIIAbDzp+CnOTFg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/vite/node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.2.tgz", + "integrity": "sha512-k+/Rkcyx//P6fetPoLMb8pBeqJBNGx81uuf7iljX9++yNBVRDQgD04L+SVXmXmh5ZP4/WOp4mWF0kmi06PW2tA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, "node_modules/vite/node_modules/postcss": { "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", @@ -29540,9 +31261,9 @@ } }, "node_modules/vite/node_modules/rollup": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.5.tgz", - "integrity": "sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==", + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.2.tgz", + "integrity": "sha512-MHngMYwGJVi6Fmnk6ISmnk7JAHRNF0UkuucA0CUW3N3a4KnONPEZz+vUanQP/ZC/iY1Qkf3bwPWzyY84wEks1g==", "dev": true, "license": "MIT", "peer": true, @@ -29557,28 +31278,28 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.52.5", - "@rollup/rollup-android-arm64": "4.52.5", - "@rollup/rollup-darwin-arm64": "4.52.5", - "@rollup/rollup-darwin-x64": "4.52.5", - "@rollup/rollup-freebsd-arm64": "4.52.5", - "@rollup/rollup-freebsd-x64": "4.52.5", - "@rollup/rollup-linux-arm-gnueabihf": "4.52.5", - "@rollup/rollup-linux-arm-musleabihf": "4.52.5", - "@rollup/rollup-linux-arm64-gnu": "4.52.5", - "@rollup/rollup-linux-arm64-musl": "4.52.5", - "@rollup/rollup-linux-loong64-gnu": "4.52.5", - "@rollup/rollup-linux-ppc64-gnu": "4.52.5", - "@rollup/rollup-linux-riscv64-gnu": "4.52.5", - "@rollup/rollup-linux-riscv64-musl": "4.52.5", - "@rollup/rollup-linux-s390x-gnu": "4.52.5", - "@rollup/rollup-linux-x64-gnu": "4.52.5", - "@rollup/rollup-linux-x64-musl": "4.52.5", - "@rollup/rollup-openharmony-arm64": "4.52.5", - "@rollup/rollup-win32-arm64-msvc": "4.52.5", - "@rollup/rollup-win32-ia32-msvc": "4.52.5", - "@rollup/rollup-win32-x64-gnu": "4.52.5", - "@rollup/rollup-win32-x64-msvc": "4.52.5", + "@rollup/rollup-android-arm-eabi": "4.53.2", + "@rollup/rollup-android-arm64": "4.53.2", + "@rollup/rollup-darwin-arm64": "4.53.2", + "@rollup/rollup-darwin-x64": "4.53.2", + "@rollup/rollup-freebsd-arm64": "4.53.2", + "@rollup/rollup-freebsd-x64": "4.53.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.53.2", + "@rollup/rollup-linux-arm-musleabihf": "4.53.2", + "@rollup/rollup-linux-arm64-gnu": "4.53.2", + "@rollup/rollup-linux-arm64-musl": "4.53.2", + "@rollup/rollup-linux-loong64-gnu": "4.53.2", + "@rollup/rollup-linux-ppc64-gnu": "4.53.2", + "@rollup/rollup-linux-riscv64-gnu": "4.53.2", + "@rollup/rollup-linux-riscv64-musl": "4.53.2", + "@rollup/rollup-linux-s390x-gnu": "4.53.2", + "@rollup/rollup-linux-x64-gnu": "4.53.2", + "@rollup/rollup-linux-x64-musl": "4.53.2", + "@rollup/rollup-openharmony-arm64": "4.53.2", + "@rollup/rollup-win32-arm64-msvc": "4.53.2", + "@rollup/rollup-win32-ia32-msvc": "4.53.2", + "@rollup/rollup-win32-x64-gnu": "4.53.2", + "@rollup/rollup-win32-x64-msvc": "4.53.2", "fsevents": "~2.3.2" } }, @@ -29656,6 +31377,13 @@ "optional": true, "peer": true }, + "node_modules/web-worker": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz", + "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -29745,9 +31473,9 @@ } }, "node_modules/webpack-dev-middleware/node_modules/memfs": { - "version": "4.50.0", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.50.0.tgz", - "integrity": "sha512-N0LUYQMUA1yS5tJKmMtU9yprPm6ZIg24yr/OVv/7t6q0kKDIho4cBbXRi1XKttUmNYDYgF/q45qrKE/UhGO0CA==", + "version": "4.51.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.51.0.tgz", + "integrity": "sha512-4zngfkVM/GpIhC8YazOsM6E8hoB33NP0BCESPOA6z7qaL6umPJNqkO8CNYaLV2FB2MV6H1O3x2luHHOSqppv+A==", "dev": true, "license": "Apache-2.0", "peer": true, From 8b3ac72a5b1f1c6bbb553f9a4eeeff9c04888e11 Mon Sep 17 00:00:00 2001 From: Airike Jaska <95303654+airikej@users.noreply.github.com> Date: Mon, 24 Nov 2025 14:34:04 +0200 Subject: [PATCH 5/8] fix: fix package-lock #191 --- package-lock.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 469042424..053b0d8e9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,7 @@ "name": "@tedi-design-system/angular", "version": "0.0.0-semantic-version", "dependencies": { - "@tedi-design-system/core": "^2.0.0" + "@tedi-design-system/core": "^2.4.0" }, "devDependencies": { "@angular-devkit/core": "19.2.15", @@ -9412,9 +9412,9 @@ } }, "node_modules/@tedi-design-system/core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tedi-design-system/core/-/core-2.0.0.tgz", - "integrity": "sha512-ODuJgRoQYxyvs702iphOuRd68vTBpmIEe/ol4rFssSVDAZ+pZOCbfd87qvoEHW+iDWDlsxHJIOrzMTl3qsTHAQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@tedi-design-system/core/-/core-2.4.0.tgz", + "integrity": "sha512-tLr2Yf/LwGDCBnaqO/Ar2XEYPpZkcBC/K42hxHReN+EY4BbQyzcbU1W8egQJlgfvHjaKSxXSsnZ8SNC0PMe3vA==", "engines": { "node": ">=18.0.0", "npm": ">=8.0.0" From 84266ccffcd428d8628c8f94526655c5e882f5bd Mon Sep 17 00:00:00 2001 From: Airike Jaska <95303654+airikej@users.noreply.github.com> Date: Mon, 24 Nov 2025 14:54:39 +0200 Subject: [PATCH 6/8] feat(theme-provider): update getting-started with guides #191 --- src/docs/get-started.mdx | 135 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 128 insertions(+), 7 deletions(-) diff --git a/src/docs/get-started.mdx b/src/docs/get-started.mdx index b6c601b25..516ed22c3 100644 --- a/src/docs/get-started.mdx +++ b/src/docs/get-started.mdx @@ -4,13 +4,15 @@ import { Meta } from "@storybook/blocks"; # Get started with @tehik-design-system/angular +--- + ### 1. Installation ```bash npm install @tedi-design-system/angular ``` -### 2. Add angular animations provider. +### 2. Add Angular animations provider ```ts import { provideAnimations } from "@angular/platform-browser/animations"; @@ -20,24 +22,143 @@ export const appConfig: ApplicationConfig = { }; ``` -### 3. Add our styles to your angular.json file. +### 3. Add Tedi Provider (Theme + Language) + +Tedi provides theming and language resolution out of the box using cookies and server/browser detection. + +Add the provider to your app.config.ts: + +```ts +import { provideTedi } from "@tedi-design-system/angular"; + +export const appConfig: ApplicationConfig = { + providers: [...yourOtherProviders, provideAnimations(), provideTedi()], +}; +``` + +Optional: Configure default theme or language + +```ts +provideTedi({ + theme: "dark", + language: "en", +}); +``` + +This will: + +- Resolve theme and language from cookies +- Fall back to provided defaults +- Apply correct values during SSR and browser hydration + +### 4. Add styles to angular.json ```json -"styles": ["node_modules/@tedi-design-system/angular/index.css"] +"styles": [ + "node_modules/@tedi-design-system/angular/index.css" +] ``` -### 4. Import component from "tedi" or "community" folder. +### 5. Import components from the design system + +Components come from the tedi or community folders: ```ts import { SomeComponent } from "@tedi-design-system/angular/tedi"; - import { SomeComponent } from "@tedi-design-system/angular/community"; ``` -### 5. Add import to your component and start using it. +### 6. Use the imported components in your standalone components + +```ts +@Component({ + selector: "app-example", + imports: [SomeComponent], + template: <SomeComponent /> +}) + +export class ExampleComponent {} +``` + +--- + +# Theming + +The Tedi Design System uses a theme class applied directly to the `<html>` element. + +Available themes: + +- `default` +- `dark` +- `rit` + +Classes applied: + +- `tedi-theme--default` +- `tedi-theme--dark` +- `tedi-theme--rit` + +Theme switching with ThemeService ```ts +import { Component } from "@angular/core"; +import { ThemeService, Theme } from "@tedi-design-system/angular"; + @Component({ - imports: [SomeComponent] +selector: "app-theme-toggle", +template: <button (click)="setTheme('default')">Default</button> + <button (click)="setTheme('dark')">Dark</button> + <button (click)="setTheme('rit')">Rit</button>, }) +export class ThemeToggleComponent { + constructor(private themeService: ThemeService) {} + + setTheme(theme: Theme) { + this.themeService.setTheme(theme); + } +} +``` + +This will automatically: + +- Update the `<html>` theme class +- Save theme to cookie (tedi-theme) +- Persist across refreshes +- Work during SSR + +--- + +# Language + +Language resolution works just like theming. +Available languages are defined in your translation service, e.g.: + +- `en` +- `et` + +A cookie stores the value (tedi-language by default). +If you want to customize the default: + +```ts +provideTedi({ + language: "en", +}); +``` + +Example: Full ApplicationConfig + +```ts +import { ApplicationConfig } from "@angular/core"; +import { provideAnimations } from "@angular/platform-browser/animations"; +import { provideTedi } from "@tedi-design-system/angular"; + +export const appConfig: ApplicationConfig = { + providers: [ + provideAnimations(), + provideTedi({ + theme: "dark", + language: "en", + }), + ], +}; ``` From 8d7219cb700866843f3fcd907963194c9b2a4fe4 Mon Sep 17 00:00:00 2001 From: Airike Jaska <95303654+airikej@users.noreply.github.com> Date: Mon, 24 Nov 2025 14:56:36 +0200 Subject: [PATCH 7/8] feat(theme-provider): update guide #191 --- src/docs/get-started.mdx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/docs/get-started.mdx b/src/docs/get-started.mdx index 516ed22c3..48ec76151 100644 --- a/src/docs/get-started.mdx +++ b/src/docs/get-started.mdx @@ -133,15 +133,16 @@ This will automatically: Language resolution works just like theming. Available languages are defined in your translation service, e.g.: -- `en` - `et` +- `en` +- `ru` A cookie stores the value (tedi-language by default). If you want to customize the default: ```ts provideTedi({ - language: "en", + language: "et", }); ``` From 517e444ca19ca7d7524e735298983431bcef795e Mon Sep 17 00:00:00 2001 From: Romet Pastak <mart.sessman@bitweb.ee> Date: Tue, 25 Nov 2025 12:32:17 +0200 Subject: [PATCH 8/8] feat(theme-provider): finalize tedi-provider, update tests #191 --- src/docs/get-started.mdx | 40 +- .../closing-button/closing-button.spec.ts | 2 + .../collapse/collapse.component.spec.ts | 2 + .../number-field.component.spec.ts | 346 +++++++++--------- .../layout/sidenav/sidenav.component.spec.ts | 104 +++--- .../alert/alert.component.spec.ts | 2 + .../modal-header.component.spec.ts | 6 +- .../popover-content.component.spec.ts | 6 +- tedi/providers/tedi.provider.ts | 71 +--- tedi/services/theme/theme.service.ts | 62 +--- .../translation/translation.service.ts | 56 +-- tedi/tokens/theme.token.ts | 4 - tedi/tokens/translation.token.ts | 4 - tedi/utils/cookies.util.ts | 96 +++++ 14 files changed, 397 insertions(+), 404 deletions(-) create mode 100644 tedi/utils/cookies.util.ts diff --git a/src/docs/get-started.mdx b/src/docs/get-started.mdx index 48ec76151..d1f23958c 100644 --- a/src/docs/get-started.mdx +++ b/src/docs/get-started.mdx @@ -22,21 +22,21 @@ export const appConfig: ApplicationConfig = { }; ``` -### 3. Add Tedi Provider (Theme + Language) +### 3. Add TEDI Provider (Theme + Language) -Tedi provides theming and language resolution out of the box using cookies and server/browser detection. +TEDI provides theming and language resolution out of the box using cookies and server/browser detection. Add the provider to your app.config.ts: ```ts -import { provideTedi } from "@tedi-design-system/angular"; +import { provideTedi } from "@tedi-design-system/angular/tedi"; export const appConfig: ApplicationConfig = { providers: [...yourOtherProviders, provideAnimations(), provideTedi()], }; ``` -Optional: Configure default theme or language +Optional: Configure default theme or language. By default TEDI uses **"default"** theme and **"et"** language. ```ts provideTedi({ @@ -84,7 +84,7 @@ export class ExampleComponent {} # Theming -The Tedi Design System uses a theme class applied directly to the `<html>` element. +TEDI uses a theme class applied directly to the `<html>` element. Theme value is stored in **"tedi-theme"** cookie. Available themes: @@ -102,19 +102,21 @@ Theme switching with ThemeService ```ts import { Component } from "@angular/core"; -import { ThemeService, Theme } from "@tedi-design-system/angular"; +import { ThemeService, Theme } from "@tedi-design-system/angular/tedi"; @Component({ -selector: "app-theme-toggle", -template: <button (click)="setTheme('default')">Default</button> + selector: "app-theme-toggle", + template: ` + <button (click)="setTheme('default')">Default</button> <button (click)="setTheme('dark')">Dark</button> - <button (click)="setTheme('rit')">Rit</button>, + <button (click)="setTheme('rit')">Rit</button> + `, }) export class ThemeToggleComponent { - constructor(private themeService: ThemeService) {} + readonly themeService = inject(ThemeService); setTheme(theme: Theme) { - this.themeService.setTheme(theme); + this.themeService.theme.set(theme); } } ``` @@ -122,7 +124,7 @@ export class ThemeToggleComponent { This will automatically: - Update the `<html>` theme class -- Save theme to cookie (tedi-theme) +- Save theme to cookie - Persist across refreshes - Work during SSR @@ -130,23 +132,17 @@ This will automatically: # Language -Language resolution works just like theming. +Language resolution works just like theming. Language value is stored in **"tedi-lang"** cookie. + Available languages are defined in your translation service, e.g.: - `et` - `en` - `ru` -A cookie stores the value (tedi-language by default). -If you want to customize the default: - -```ts -provideTedi({ - language: "et", -}); -``` +--- -Example: Full ApplicationConfig +# Example of full ApplicationConfig ```ts import { ApplicationConfig } from "@angular/core"; diff --git a/tedi/components/buttons/closing-button/closing-button.spec.ts b/tedi/components/buttons/closing-button/closing-button.spec.ts index f26d247b6..b710337ab 100644 --- a/tedi/components/buttons/closing-button/closing-button.spec.ts +++ b/tedi/components/buttons/closing-button/closing-button.spec.ts @@ -1,5 +1,6 @@ import { ComponentFixture, TestBed } from "@angular/core/testing"; import { ClosingButtonComponent } from "./closing-button.component"; +import { TEDI_TRANSLATION_DEFAULT_TOKEN } from "../../../tokens/translation.token"; describe("ClosingButtonComponent", () => { let fixture: ComponentFixture<ClosingButtonComponent>; @@ -9,6 +10,7 @@ describe("ClosingButtonComponent", () => { beforeEach(() => { TestBed.configureTestingModule({ imports: [ClosingButtonComponent], + providers: [{ provide: TEDI_TRANSLATION_DEFAULT_TOKEN, useValue: "et" }], }); fixture = TestBed.createComponent(ClosingButtonComponent); diff --git a/tedi/components/buttons/collapse/collapse.component.spec.ts b/tedi/components/buttons/collapse/collapse.component.spec.ts index 2ab273d6a..3a9c7c08f 100644 --- a/tedi/components/buttons/collapse/collapse.component.spec.ts +++ b/tedi/components/buttons/collapse/collapse.component.spec.ts @@ -1,5 +1,6 @@ import { ComponentFixture, TestBed } from "@angular/core/testing"; import { CollapseComponent } from "./collapse.component"; +import { TEDI_TRANSLATION_DEFAULT_TOKEN } from "../../../tokens/translation.token"; jest.mock("../../../helpers/generate-uuid", () => ({ generateUUID: () => "mocked-random-uuid", @@ -12,6 +13,7 @@ describe("CollapseComponent", () => { beforeEach(async () => { await TestBed.configureTestingModule({ imports: [CollapseComponent], + providers: [{ provide: TEDI_TRANSLATION_DEFAULT_TOKEN, useValue: "et" }], }).compileComponents(); fixture = TestBed.createComponent(CollapseComponent); diff --git a/tedi/components/form/number-field/number-field.component.spec.ts b/tedi/components/form/number-field/number-field.component.spec.ts index b0ddcfd46..2d04cf750 100644 --- a/tedi/components/form/number-field/number-field.component.spec.ts +++ b/tedi/components/form/number-field/number-field.component.spec.ts @@ -5,180 +5,186 @@ import { ButtonComponent } from "../../buttons/button/button.component"; import { IconComponent } from "../../base/icon/icon.component"; import { TextComponent } from "../../base/text/text.component"; import { FeedbackTextComponent } from "../feedback-text/feedback-text.component"; +import { TEDI_TRANSLATION_DEFAULT_TOKEN } from "../../../tokens/translation.token"; describe("NumberFieldComponent", () => { - let fixture: ComponentFixture<NumberFieldComponent>; - let component: NumberFieldComponent; - let el: HTMLElement; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - NumberFieldComponent, - LabelComponent, - ButtonComponent, - IconComponent, - TextComponent, - FeedbackTextComponent, - ], - }); - - fixture = TestBed.createComponent(NumberFieldComponent); - fixture.componentRef.setInput("id", "test-id"); - component = fixture.componentInstance; - el = fixture.nativeElement; - fixture.detectChanges(); + let fixture: ComponentFixture<NumberFieldComponent>; + let component: NumberFieldComponent; + let el: HTMLElement; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [ + NumberFieldComponent, + LabelComponent, + ButtonComponent, + IconComponent, + TextComponent, + FeedbackTextComponent, + ], + providers: [{ provide: TEDI_TRANSLATION_DEFAULT_TOKEN, useValue: "et" }], }); - it("should create component", () => { - expect(component).toBeTruthy(); - }); - - it("should initialize with default value (0)", () => { - expect(component.value()).toBe(0); - }); - - it("should increment the value on increment button click", () => { - const onChange = jest.fn<number, [number]>(); - const onTouched = jest.fn(); - component.registerOnChange(onChange); - component.registerOnTouched(onTouched); - - const buttons = el.querySelectorAll("button"); - const incrementBtn = buttons[1] as HTMLButtonElement; - - incrementBtn.click(); - fixture.detectChanges(); - - expect(component.value()).toBe(1); - expect(onChange).toHaveBeenCalledWith(1); - expect(onTouched).toHaveBeenCalled(); - }); - - it("should decrement the value on decrement button click", () => { - component.writeValue(5); - fixture.detectChanges(); - - const onChange = jest.fn<number, [number]>(); - component.registerOnChange(onChange); - - const buttons = el.querySelectorAll("button"); - const decrementBtn = buttons[0] as HTMLButtonElement; - - decrementBtn.click(); - fixture.detectChanges(); - - expect(component.value()).toBe(4); - expect(onChange).toHaveBeenCalledWith(4); - }); - - it("should disable decrement button when value === min", () => { - component.writeValue(3); - fixture.componentRef.setInput("min", 3); - fixture.detectChanges(); - - const decrementBtn = el.querySelector("button") as HTMLButtonElement; - expect(decrementBtn.disabled).toBeTruthy(); - }); - - it("should disable increment button when value === max", () => { - component.writeValue(2); - fixture.componentRef.setInput("max", 2); - fixture.detectChanges(); - - const buttons = el.querySelectorAll("button"); - const incrementBtn = buttons[1] as HTMLButtonElement; - expect(incrementBtn.disabled).toBeTruthy(); - }); - - it("should call onChange when input is changed", () => { - const onChange = jest.fn<number, [number]>(); - component.registerOnChange(onChange); - - const inputEl = el.querySelector("input") as HTMLInputElement; - inputEl.value = "10"; - inputEl.dispatchEvent(new Event("input")); - fixture.detectChanges(); - - expect(component.value()).toBe(10); - expect(onChange).toHaveBeenCalledWith(10); - }); - - it("should call onTouched when input is blurred", () => { - const onTouched = jest.fn(); - component.registerOnTouched(onTouched); + fixture = TestBed.createComponent(NumberFieldComponent); + fixture.componentRef.setInput("id", "test-id"); + component = fixture.componentInstance; + el = fixture.nativeElement; + fixture.detectChanges(); + }); + + it("should create component", () => { + expect(component).toBeTruthy(); + }); + + it("should initialize with default value (0)", () => { + expect(component.value()).toBe(0); + }); + + it("should increment the value on increment button click", () => { + const onChange = jest.fn<number, [number]>(); + const onTouched = jest.fn(); + component.registerOnChange(onChange); + component.registerOnTouched(onTouched); + + const buttons = el.querySelectorAll("button"); + const incrementBtn = buttons[1] as HTMLButtonElement; + + incrementBtn.click(); + fixture.detectChanges(); + + expect(component.value()).toBe(1); + expect(onChange).toHaveBeenCalledWith(1); + expect(onTouched).toHaveBeenCalled(); + }); + + it("should decrement the value on decrement button click", () => { + component.writeValue(5); + fixture.detectChanges(); + + const onChange = jest.fn<number, [number]>(); + component.registerOnChange(onChange); + + const buttons = el.querySelectorAll("button"); + const decrementBtn = buttons[0] as HTMLButtonElement; + + decrementBtn.click(); + fixture.detectChanges(); + + expect(component.value()).toBe(4); + expect(onChange).toHaveBeenCalledWith(4); + }); + + it("should disable decrement button when value === min", () => { + component.writeValue(3); + fixture.componentRef.setInput("min", 3); + fixture.detectChanges(); + + const decrementBtn = el.querySelector("button") as HTMLButtonElement; + expect(decrementBtn.disabled).toBeTruthy(); + }); + + it("should disable increment button when value === max", () => { + component.writeValue(2); + fixture.componentRef.setInput("max", 2); + fixture.detectChanges(); + + const buttons = el.querySelectorAll("button"); + const incrementBtn = buttons[1] as HTMLButtonElement; + expect(incrementBtn.disabled).toBeTruthy(); + }); + + it("should call onChange when input is changed", () => { + const onChange = jest.fn<number, [number]>(); + component.registerOnChange(onChange); + + const inputEl = el.querySelector("input") as HTMLInputElement; + inputEl.value = "10"; + inputEl.dispatchEvent(new Event("input")); + fixture.detectChanges(); + + expect(component.value()).toBe(10); + expect(onChange).toHaveBeenCalledWith(10); + }); + + it("should call onTouched when input is blurred", () => { + const onTouched = jest.fn(); + component.registerOnTouched(onTouched); + + const inputEl = el.querySelector("input") as HTMLInputElement; + inputEl.dispatchEvent(new Event("blur")); + fixture.detectChanges(); + + expect(onTouched).toHaveBeenCalled(); + }); + + it("should respect disabled input and disable all controls", () => { + fixture.componentRef.setInput("disabled", true); + fixture.detectChanges(); + + const inputEl = el.querySelector("input") as HTMLInputElement; + const buttons = Array.from( + el.querySelectorAll("button"), + ) as HTMLButtonElement[]; + + expect(component.isDisabled()).toBeTruthy(); + expect(inputEl.disabled).toBeTruthy(); + buttons.forEach((btn) => expect(btn.disabled).toBeTruthy()); + }); + + it("writeValue() should default to 0 when given null or undefined", () => { + component.writeValue(undefined); + expect(component.value()).toBe(0); + }); + + it("writeValue() should set the passed-in value", () => { + component.writeValue(42); + expect(component.value()).toBe(42); + }); + + it("setDisabledState() should toggle formDisabled and disable input & buttons", () => { + component.setDisabledState(false); + fixture.detectChanges(); - const inputEl = el.querySelector("input") as HTMLInputElement; - inputEl.dispatchEvent(new Event("blur")); - fixture.detectChanges(); + let inputEl = el.querySelector("input") as HTMLInputElement; + let buttons = Array.from( + el.querySelectorAll("button"), + ) as HTMLButtonElement[]; + + expect(component.isDisabled()).toBeFalsy(); + expect(inputEl.disabled).toBeFalsy(); + buttons.forEach((btn) => expect(btn.disabled).toBeFalsy()); + + component.setDisabledState(true); + fixture.detectChanges(); - expect(onTouched).toHaveBeenCalled(); - }); - - it("should respect disabled input and disable all controls", () => { - fixture.componentRef.setInput("disabled", true); - fixture.detectChanges(); - - const inputEl = el.querySelector("input") as HTMLInputElement; - const buttons = Array.from(el.querySelectorAll("button")) as HTMLButtonElement[]; - - expect(component.isDisabled()).toBeTruthy(); - expect(inputEl.disabled).toBeTruthy(); - buttons.forEach(btn => expect(btn.disabled).toBeTruthy()); - }); - - it("writeValue() should default to 0 when given null or undefined", () => { - component.writeValue(undefined); - expect(component.value()).toBe(0); - }); - - it("writeValue() should set the passed-in value", () => { - component.writeValue(42); - expect(component.value()).toBe(42); - }); - - it("setDisabledState() should toggle formDisabled and disable input & buttons", () => { - component.setDisabledState(false); - fixture.detectChanges(); - - let inputEl = el.querySelector("input") as HTMLInputElement; - let buttons = Array.from(el.querySelectorAll("button")) as HTMLButtonElement[]; - - expect(component.isDisabled()).toBeFalsy(); - expect(inputEl.disabled).toBeFalsy(); - buttons.forEach(btn => expect(btn.disabled).toBeFalsy()); - - component.setDisabledState(true); - fixture.detectChanges(); - - inputEl = el.querySelector("input") as HTMLInputElement; - buttons = Array.from(el.querySelectorAll("button")) as HTMLButtonElement[]; - - expect(component.isDisabled()).toBeTruthy(); - expect(inputEl.disabled).toBeTruthy(); - buttons.forEach(btn => expect(btn.disabled).toBeTruthy()); - }); - - it("focus() should call focus() on the native input element", () => { - fixture.detectChanges(); - const inputEl = component.inputRef.nativeElement; - const spy = jest.spyOn(inputEl, "focus"); - - component.focus(); - - expect(spy).toHaveBeenCalled(); - }); - - it("blur() should call blur() on the native input element and mark touched", () => { - fixture.detectChanges(); - const inputEl = component.inputRef.nativeElement; - const blurSpy = jest.spyOn(inputEl, "blur"); - const onTouched = jest.fn(); - component.registerOnTouched(onTouched); - - component.blur(); - - expect(blurSpy).toHaveBeenCalled(); - expect(onTouched).toHaveBeenCalled(); - }); + inputEl = el.querySelector("input") as HTMLInputElement; + buttons = Array.from(el.querySelectorAll("button")) as HTMLButtonElement[]; + + expect(component.isDisabled()).toBeTruthy(); + expect(inputEl.disabled).toBeTruthy(); + buttons.forEach((btn) => expect(btn.disabled).toBeTruthy()); + }); + + it("focus() should call focus() on the native input element", () => { + fixture.detectChanges(); + const inputEl = component.inputRef.nativeElement; + const spy = jest.spyOn(inputEl, "focus"); + + component.focus(); + + expect(spy).toHaveBeenCalled(); + }); + + it("blur() should call blur() on the native input element and mark touched", () => { + fixture.detectChanges(); + const inputEl = component.inputRef.nativeElement; + const blurSpy = jest.spyOn(inputEl, "blur"); + const onTouched = jest.fn(); + component.registerOnTouched(onTouched); + + component.blur(); + + expect(blurSpy).toHaveBeenCalled(); + expect(onTouched).toHaveBeenCalled(); + }); }); diff --git a/tedi/components/layout/sidenav/sidenav.component.spec.ts b/tedi/components/layout/sidenav/sidenav.component.spec.ts index 80697d2fa..e3605ad1c 100644 --- a/tedi/components/layout/sidenav/sidenav.component.spec.ts +++ b/tedi/components/layout/sidenav/sidenav.component.spec.ts @@ -1,44 +1,46 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { SideNavComponent, SideNavItemSize } from './sidenav.component'; -import { SideNavService } from '../../../services/sidenav/sidenav.service'; -import { signal } from '@angular/core'; +import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { SideNavComponent, SideNavItemSize } from "./sidenav.component"; +import { SideNavService } from "../../../services/sidenav/sidenav.service"; +import { signal } from "@angular/core"; +import { TEDI_TRANSLATION_DEFAULT_TOKEN } from "../../../tokens/translation.token"; describe("SideNavComponent", () => { let fixture: ComponentFixture<SideNavComponent>; let sidenavElement: HTMLElement; let sidenavService: { - items: ReturnType<typeof signal>, - isCollapsed: ReturnType<typeof signal>, - desktopBreakpoint: ReturnType<typeof signal>, - isMobile: ReturnType<typeof signal>, - isMobileItemOpen: ReturnType<typeof signal>, - isMobileOpen: ReturnType<typeof signal>, - tooltipEnabled: ReturnType<typeof signal>, - registerItem: jest.Mock, - unregisterItem: jest.Mock, - handleGoToMainMenu: jest.Mock, - handleCollapse: jest.Mock - } + items: ReturnType<typeof signal>; + isCollapsed: ReturnType<typeof signal>; + desktopBreakpoint: ReturnType<typeof signal>; + isMobile: ReturnType<typeof signal>; + isMobileItemOpen: ReturnType<typeof signal>; + isMobileOpen: ReturnType<typeof signal>; + tooltipEnabled: ReturnType<typeof signal>; + registerItem: jest.Mock; + unregisterItem: jest.Mock; + handleGoToMainMenu: jest.Mock; + handleCollapse: jest.Mock; + }; beforeEach(() => { sidenavService = { - items: signal([]), - isCollapsed: signal(false), - desktopBreakpoint: signal("lg"), - isMobile: signal(false), - isMobileItemOpen: signal(false), - isMobileOpen: signal(false), - tooltipEnabled: signal(false), - registerItem: jest.fn(), - unregisterItem: jest.fn(), - handleGoToMainMenu: jest.fn(), - handleCollapse: jest.fn() + items: signal([]), + isCollapsed: signal(false), + desktopBreakpoint: signal("lg"), + isMobile: signal(false), + isMobileItemOpen: signal(false), + isMobileOpen: signal(false), + tooltipEnabled: signal(false), + registerItem: jest.fn(), + unregisterItem: jest.fn(), + handleGoToMainMenu: jest.fn(), + handleCollapse: jest.fn(), }; - + TestBed.configureTestingModule({ imports: [SideNavComponent], providers: [ { provide: SideNavService, useValue: sidenavService }, + { provide: TEDI_TRANSLATION_DEFAULT_TOKEN, useValue: "et" }, ], }); @@ -48,54 +50,66 @@ describe("SideNavComponent", () => { fixture.detectChanges(); }); - it('should create component', () => { + it("should create component", () => { expect(fixture.componentInstance).toBeTruthy(); }); - it('should have default classes (large + dividers)', () => { + it("should have default classes (large + dividers)", () => { expect(sidenavElement.classList.contains("tedi-sidenav")).toBe(true); expect(sidenavElement.classList.contains("tedi-sidenav--large")).toBe(true); - expect(sidenavElement.classList.contains("tedi-sidenav--dividers")).toBe(true); + expect(sidenavElement.classList.contains("tedi-sidenav--dividers")).toBe( + true, + ); }); - it('should omit divider class when `dividers` input is false', () => { + it("should omit divider class when `dividers` input is false", () => { fixture.componentRef.setInput("dividers", false); fixture.detectChanges(); expect(sidenavElement.classList).not.toContain("tedi-sidenav--dividers"); }); - it('should reflect `size` input', () => { + it("should reflect `size` input", () => { const sizes: SideNavItemSize[] = ["large", "medium", "small"]; - + for (const size of sizes) { - fixture.componentRef.setInput("size", size); - fixture.detectChanges(); - expect(sidenavElement.classList.contains(`tedi-sidenav--${size}`)).toBe(true); + fixture.componentRef.setInput("size", size); + fixture.detectChanges(); + expect(sidenavElement.classList.contains(`tedi-sidenav--${size}`)).toBe( + true, + ); } }); - it('should include collapsed class when service.isCollapsed is true', () => { + it("should include collapsed class when service.isCollapsed is true", () => { sidenavService.isCollapsed.set(true); fixture.detectChanges(); - expect(sidenavElement.classList.contains(`tedi-sidenav--collapsed`)).toBe(true); + expect(sidenavElement.classList.contains(`tedi-sidenav--collapsed`)).toBe( + true, + ); }); - it('should include mobile class when service.isMobile is true', () => { + it("should include mobile class when service.isMobile is true", () => { sidenavService.isMobile.set(true); fixture.detectChanges(); - expect(sidenavElement.classList.contains(`tedi-sidenav--mobile`)).toBe(true); + expect(sidenavElement.classList.contains(`tedi-sidenav--mobile`)).toBe( + true, + ); }); - it('should include mobile item open class when service.isMobileItemOpen is true', () => { + it("should include mobile item open class when service.isMobileItemOpen is true", () => { sidenavService.isMobileItemOpen.set(true); fixture.detectChanges(); - expect(sidenavElement.classList.contains(`tedi-sidenav--mobile-item-open`)).toBe(true); + expect( + sidenavElement.classList.contains(`tedi-sidenav--mobile-item-open`), + ).toBe(true); }); - it('should include hidden class when service.isMobile is true and isMobileOpen is false', () => { + it("should include hidden class when service.isMobile is true and isMobileOpen is false", () => { sidenavService.isMobile.set(true); sidenavService.isMobileOpen.set(false); fixture.detectChanges(); - expect(sidenavElement.classList.contains(`tedi-sidenav--hidden`)).toBe(true); + expect(sidenavElement.classList.contains(`tedi-sidenav--hidden`)).toBe( + true, + ); }); }); diff --git a/tedi/components/notifications/alert/alert.component.spec.ts b/tedi/components/notifications/alert/alert.component.spec.ts index 63102d174..abb54051a 100644 --- a/tedi/components/notifications/alert/alert.component.spec.ts +++ b/tedi/components/notifications/alert/alert.component.spec.ts @@ -1,6 +1,7 @@ import { ComponentFixture, TestBed } from "@angular/core/testing"; import { By } from "@angular/platform-browser"; import { AlertComponent, AlertRole, AlertType } from "./alert.component"; +import { TEDI_TRANSLATION_DEFAULT_TOKEN } from "../../../tokens/translation.token"; describe("AlertComponent", () => { let component: AlertComponent; @@ -10,6 +11,7 @@ describe("AlertComponent", () => { beforeEach(() => { TestBed.configureTestingModule({ imports: [AlertComponent], + providers: [{ provide: TEDI_TRANSLATION_DEFAULT_TOKEN, useValue: "et" }], }).compileComponents(); fixture = TestBed.createComponent(AlertComponent); diff --git a/tedi/components/overlay/modal/modal-header/modal-header.component.spec.ts b/tedi/components/overlay/modal/modal-header/modal-header.component.spec.ts index 06072a375..289903890 100644 --- a/tedi/components/overlay/modal/modal-header/modal-header.component.spec.ts +++ b/tedi/components/overlay/modal/modal-header/modal-header.component.spec.ts @@ -3,6 +3,7 @@ import { Component } from "@angular/core"; import { ModalHeaderComponent } from "./modal-header.component"; import { ModalComponent } from "../modal.component"; import { viewChild } from "@angular/core"; +import { TEDI_TRANSLATION_DEFAULT_TOKEN } from "../../../../tokens/translation.token"; class MockModalComponent { open = { @@ -36,7 +37,10 @@ describe("ModalHeaderComponent", () => { beforeEach(() => { TestBed.configureTestingModule({ imports: [TestHostComponent], - providers: [{ provide: ModalComponent, useClass: MockModalComponent }], + providers: [ + { provide: ModalComponent, useClass: MockModalComponent }, + { provide: TEDI_TRANSLATION_DEFAULT_TOKEN, useValue: "et" }, + ], }); fixture = TestBed.createComponent(TestHostComponent); diff --git a/tedi/components/overlay/popover/popover-content/popover-content.component.spec.ts b/tedi/components/overlay/popover/popover-content/popover-content.component.spec.ts index b9c66c193..d7984e665 100644 --- a/tedi/components/overlay/popover/popover-content/popover-content.component.spec.ts +++ b/tedi/components/overlay/popover/popover-content/popover-content.component.spec.ts @@ -7,6 +7,7 @@ import { } from "./popover-content.component"; import { PopoverComponent } from "../popover.component"; import { NgxFloatUiContentComponent } from "ngx-float-ui"; +import { TEDI_TRANSLATION_DEFAULT_TOKEN } from "../../../../tokens/translation.token"; @Component({ template: ` @@ -45,7 +46,10 @@ describe("PopoverContentComponent", () => { }; TestBed.configureTestingModule({ - providers: [{ provide: PopoverComponent, useValue: popoverMock }], + providers: [ + { provide: PopoverComponent, useValue: popoverMock }, + { provide: TEDI_TRANSLATION_DEFAULT_TOKEN, useValue: "et" }, + ], imports: [TestHostComponent], }); diff --git a/tedi/providers/tedi.provider.ts b/tedi/providers/tedi.provider.ts index 9de773d50..04bad167d 100644 --- a/tedi/providers/tedi.provider.ts +++ b/tedi/providers/tedi.provider.ts @@ -2,79 +2,48 @@ import { EnvironmentProviders, inject, makeEnvironmentProviders, - PLATFORM_ID, - REQUEST, + provideAppInitializer, } from "@angular/core"; import { TEDI_THEME_DEFAULT_TOKEN } from "../tokens/theme.token"; import { AVAILABLE_THEMES, Theme, - THEME_COOKIE_NAME, + THEME_CLASS_PREFIX, + THEME_FALLBACK_VALUE, } from "../services/theme/theme.service"; import { TEDI_TRANSLATION_DEFAULT_TOKEN } from "../tokens/translation.token"; -import { - AVAILABLE_LANGUAGES, - Language, - LANGUAGE_COOKIE_NAME, -} from "../services/translation/translation.service"; -import { DOCUMENT, isPlatformServer } from "@angular/common"; +import { Language } from "../services/translation/translation.service"; +import { DOCUMENT } from "@angular/common"; export interface TediConfig { - theme?: Theme | (() => Theme); - language?: Language | (() => Language); -} - -function readCookie(name: string) { - const platformId = inject(PLATFORM_ID); - - if (isPlatformServer(platformId)) { - const req = inject(REQUEST, { optional: true }); - const cookieHeader = req?.headers.get("cookie") || ""; - return cookieHeader - .split("; ") - .find((c) => c.startsWith(name + "=")) - ?.split("=")[1]; - } - - const document = inject(DOCUMENT); - return document.cookie - ?.split("; ") - .find((c) => c.startsWith(name + "=")) - ?.split("=")[1]; + theme?: Theme; + language?: Language; } -function resolveValue<T extends string>( - value: T | (() => T) | undefined, - cookie: T | undefined, - allowed: readonly T[], - fallback: T, -): T { - if (value !== undefined) { - return typeof value === "function" ? value() : value; - } +function applyInitialTheme() { + return () => { + const document = inject(DOCUMENT); + const defaultTheme = inject(TEDI_THEME_DEFAULT_TOKEN); + const html = document.documentElement; - if (cookie && allowed.includes(cookie)) { - return cookie; - } + for (const t of AVAILABLE_THEMES) { + html.classList.remove(`${THEME_CLASS_PREFIX}${t}`); + } - return fallback; + html.classList.add(`${THEME_CLASS_PREFIX}${defaultTheme}`); + }; } export function provideTedi(config: TediConfig = {}): EnvironmentProviders { return makeEnvironmentProviders([ { provide: TEDI_THEME_DEFAULT_TOKEN, - useFactory: () => { - const cookie = readCookie(THEME_COOKIE_NAME) as Theme | undefined; - return resolveValue(config.theme, cookie, AVAILABLE_THEMES, "default"); - }, + useValue: config.theme ?? THEME_FALLBACK_VALUE, }, { provide: TEDI_TRANSLATION_DEFAULT_TOKEN, - useFactory: () => { - const cookie = readCookie(LANGUAGE_COOKIE_NAME) as Language | undefined; - return resolveValue(config.language, cookie, AVAILABLE_LANGUAGES, "et"); - }, + useValue: config.language ?? "et", }, + provideAppInitializer(applyInitialTheme()), ]); } diff --git a/tedi/services/theme/theme.service.ts b/tedi/services/theme/theme.service.ts index 12e5f78fa..02a32fef5 100644 --- a/tedi/services/theme/theme.service.ts +++ b/tedi/services/theme/theme.service.ts @@ -1,62 +1,20 @@ -import { - Injectable, - signal, - inject, - effect, - PLATFORM_ID, - REQUEST, -} from "@angular/core"; -import { DOCUMENT, isPlatformBrowser, isPlatformServer } from "@angular/common"; +import { Injectable, inject, effect } from "@angular/core"; +import { DOCUMENT } from "@angular/common"; import { TEDI_THEME_DEFAULT_TOKEN } from "../../tokens/theme.token"; +import { cookieSignal } from "../../utils/cookies.util"; export type Theme = "default" | "dark" | "rit"; export const AVAILABLE_THEMES: Theme[] = ["default", "dark", "rit"]; export const THEME_CLASS_PREFIX = "tedi-theme--"; -export const THEME_STORAGE_KEY = "tedi-theme"; export const THEME_COOKIE_NAME = "tedi-theme"; +export const THEME_FALLBACK_VALUE: Theme = "default"; @Injectable({ providedIn: "root" }) export class ThemeService { private readonly document = inject(DOCUMENT); - private readonly platformId = inject(PLATFORM_ID); private readonly defaultTheme = inject(TEDI_THEME_DEFAULT_TOKEN); - private readonly req = isPlatformServer(this.platformId) - ? inject(REQUEST) - : null; - - private getInitialTheme(): Theme { - if (isPlatformServer(this.platformId) && this.req) { - const cookieHeader = this.req.headers.get("cookie") || ""; - const cookie = cookieHeader - .split("; ") - .find((c) => c.startsWith(THEME_COOKIE_NAME + "=")) - ?.split("=")[1] as Theme | undefined; - - if (cookie && AVAILABLE_THEMES.includes(cookie)) { - return cookie; - } - - return this.defaultTheme; - } - - if (isPlatformBrowser(this.platformId)) { - const cookie = this.document.cookie - ?.split("; ") - .find((c) => c.startsWith(THEME_COOKIE_NAME + "=")) - ?.split("=")[1] as Theme | undefined; - - if (cookie && AVAILABLE_THEMES.includes(cookie)) { - return cookie; - } - - return this.defaultTheme; - } - - return this.defaultTheme; - } - - readonly theme = signal<Theme>(this.getInitialTheme()); + readonly theme = cookieSignal<Theme>(THEME_COOKIE_NAME, this.defaultTheme); constructor() { effect(() => { @@ -66,15 +24,7 @@ export class ThemeService { html.classList.remove(`${THEME_CLASS_PREFIX}${t}`); } - html.classList.add(`tedi-theme--${this.theme()}`); - - if (isPlatformBrowser(this.platformId)) { - document.cookie = `${THEME_COOKIE_NAME}=${this.theme()};path=/;max-age=31536000`; - } + html.classList.add(`${THEME_CLASS_PREFIX}${this.theme()}`); }); } - - setTheme(theme: Theme): void { - this.theme.set(theme); - } } diff --git a/tedi/services/translation/translation.service.ts b/tedi/services/translation/translation.service.ts index 61992bbfc..a3df641fc 100644 --- a/tedi/services/translation/translation.service.ts +++ b/tedi/services/translation/translation.service.ts @@ -1,11 +1,8 @@ import { computed, - effect, inject, Injectable, isSignal, - PLATFORM_ID, - REQUEST, signal, Signal, } from "@angular/core"; @@ -15,62 +12,21 @@ import { TediTranslationsMap, } from "./translations"; import { TEDI_TRANSLATION_DEFAULT_TOKEN } from "../../tokens/translation.token"; -import { DOCUMENT, isPlatformBrowser, isPlatformServer } from "@angular/common"; +import { cookieSignal } from "../../utils/cookies.util"; export type Language = "en" | "et" | "ru"; export const LANGUAGE_COOKIE_NAME = "tedi-lang"; export const AVAILABLE_LANGUAGES: Language[] = ["et", "en", "ru"]; +export const LANGUAGE_FALLBACK_VALUE: Language = "et"; @Injectable({ providedIn: "root" }) export class TediTranslationService { - private readonly document = inject(DOCUMENT); - private readonly platformId = inject(PLATFORM_ID); private readonly defaultLang = inject(TEDI_TRANSLATION_DEFAULT_TOKEN); - private readonly req = isPlatformServer(this.platformId) - ? inject(REQUEST) - : null; - - private getInitialLang(): Language { - if (isPlatformServer(this.platformId) && this.req) { - const cookieHeader = this.req.headers.get("cookie") || ""; - const cookie = cookieHeader - .split("; ") - .find((c) => c.startsWith(LANGUAGE_COOKIE_NAME + "=")) - ?.split("=")[1] as Language | undefined; - - if (cookie && AVAILABLE_LANGUAGES.includes(cookie)) { - return cookie; - } - - return this.defaultLang; - } - - if (isPlatformBrowser(this.platformId)) { - const cookie = this.document.cookie - ?.split("; ") - .find((c) => c.startsWith(LANGUAGE_COOKIE_NAME + "=")) - ?.split("=")[1] as Language | undefined; - - if (cookie && AVAILABLE_LANGUAGES.includes(cookie)) { - return cookie; - } - - return this.defaultLang; - } - - return this.defaultLang; - } - - constructor() { - effect(() => { - if (isPlatformBrowser(this.platformId)) { - document.cookie = `${LANGUAGE_COOKIE_NAME}=${this.currentLang()};path=/;max-age=31536000`; - } - }); - } - - private readonly currentLang = signal<Language>(this.getInitialLang()); + private readonly currentLang = cookieSignal( + LANGUAGE_COOKIE_NAME, + this.defaultLang, + ); private translations = signal<TranslationMap>(translationsMap); getLanguage = this.currentLang.asReadonly(); diff --git a/tedi/tokens/theme.token.ts b/tedi/tokens/theme.token.ts index 9a7b41ba0..d2cbfcee9 100644 --- a/tedi/tokens/theme.token.ts +++ b/tedi/tokens/theme.token.ts @@ -3,8 +3,4 @@ import type { Theme } from "../services/theme/theme.service"; export const TEDI_THEME_DEFAULT_TOKEN = new InjectionToken<Theme>( "TEDI_THEME_DEFAULT_TOKEN", - { - providedIn: "root", - factory: () => "default", - }, ); diff --git a/tedi/tokens/translation.token.ts b/tedi/tokens/translation.token.ts index 92d3ece3a..d51690e92 100644 --- a/tedi/tokens/translation.token.ts +++ b/tedi/tokens/translation.token.ts @@ -3,8 +3,4 @@ import { Language } from "../services/translation/translation.service"; export const TEDI_TRANSLATION_DEFAULT_TOKEN = new InjectionToken<Language>( "TEDI_TRANSLATION_DEFAULT_TOKEN", - { - providedIn: "root", - factory: () => "et", - }, ); diff --git a/tedi/utils/cookies.util.ts b/tedi/utils/cookies.util.ts new file mode 100644 index 000000000..1f09720d8 --- /dev/null +++ b/tedi/utils/cookies.util.ts @@ -0,0 +1,96 @@ +import { DOCUMENT, isPlatformBrowser, isPlatformServer } from "@angular/common"; +import { effect, inject, PLATFORM_ID, REQUEST, signal } from "@angular/core"; + +function parseCookies(header: string): Record<string, string> { + const result: Record<string, string> = {}; + + if (!header) return result; + + for (const c of header.split(";")) { + const [rawKey, ...rest] = c.split("="); + const key = (rawKey ?? "").trim(); + const rawVal = rest.join("="); + + try { + result[key] = decodeURIComponent(rawVal).trim(); + } catch { + result[key] = rawVal.trim(); + } + } + + return result; +} + +function readServerCookie(key: string): string | undefined { + try { + const req = inject(REQUEST, { optional: true }); + const cookieHeader = req?.headers.get("cookie"); + + if (!cookieHeader) return undefined; + + return parseCookies(cookieHeader)[key]; + } catch { + return undefined; + } +} + +function readBrowserCookie(key: string): string | undefined { + const document = inject(DOCUMENT); + const cookies = parseCookies(document.cookie); + return cookies[key]; +} + +function parseCookieValue<T>(raw: string | undefined, initialValue: T): T { + if (!raw) return initialValue; + + try { + const parsed = + typeof initialValue === "string" ? raw : (JSON.parse(raw) as T); + return parsed as T; + } catch { + return initialValue; + } +} + +export function cookieSignal<T>(key: string, initialValue: T) { + const platformId = inject(PLATFORM_ID); + const document = inject(DOCUMENT); + const isBrowser = isPlatformBrowser(platformId); + const isServer = isPlatformServer(platformId); + + let startValue = initialValue; + + if (isServer) { + const raw = readServerCookie(key); + startValue = parseCookieValue(raw, initialValue); + } + + if (isBrowser) { + const raw = readBrowserCookie(key); + startValue = parseCookieValue(raw, initialValue); + } + + const state = signal<T>(startValue); + const options = { + path: "/", + sameSite: "Lax", + secure: false, + maxAge: 60 * 60 * 24 * 30, + }; + + if (isBrowser) { + effect(() => { + const value = state(); + + if (value === null || value === undefined || value === "") { + document.cookie = `${key}=; path=${options.path}; max-age=0`; + return; + } + + const stored = typeof value === "string" ? value : JSON.stringify(value); + document.cookie = `${key}=${encodeURIComponent(stored)}; path=${options.path}; max-age=${options.maxAge}; samesite=${options.sameSite};`; + }); + } + + return state; +}