From f05691045c1617f7c60a100f01fd1341f2ec1063 Mon Sep 17 00:00:00 2001 From: markitosha Date: Mon, 11 May 2026 15:16:56 +0200 Subject: [PATCH 01/50] refactor: divide dictation controller to a common logic controller and endpoint-specific logic --- src/components/recording-button.ts | 26 +- src/controllers/dictation-controller.ts | 396 ++--------------------- src/controllers/socket-controller.ts | 404 ++++++++++++++++++++++++ 3 files changed, 438 insertions(+), 388 deletions(-) create mode 100644 src/controllers/socket-controller.ts diff --git a/src/components/recording-button.ts b/src/components/recording-button.ts index 4f5f96e..2756e2a 100644 --- a/src/components/recording-button.ts +++ b/src/components/recording-button.ts @@ -7,7 +7,10 @@ import { type PropertyValues, } from "lit"; import { customElement, property, state } from "lit/decorators.js"; -import { AUDIO_CHUNK_INTERVAL_MS } from "../constants.js"; +import { + AUDIO_CHUNK_INTERVAL_MS, + DEFAULT_DICTATION_CONFIG, +} from "../constants.js"; import { accessTokenContext, authConfigContext, @@ -225,7 +228,7 @@ export class DictationRecordingButton extends LitElement { this.#dispatchRecordingStateChanged("recording"); const isNewConnection = await this.#dictationController.connect( - this._dictationConfig, + this._dictationConfig ?? DEFAULT_DICTATION_CONFIG, { onClose: this.#handleWebSocketClose, onError: this.#handleWebSocketError, @@ -255,10 +258,10 @@ export class DictationRecordingButton extends LitElement { try { this.#mediaController.stopAudioLevelMonitoring(); await this.#mediaController.stopRecording(); + await this.#dictationController.stopRecording(); this.#dispatchRecordingStateChanged("stopped"); - await this.#dictationController.pause(); await this.#mediaController.cleanup(); } catch (error) { this.dispatchEvent(errorEvent(error)); @@ -310,14 +313,17 @@ export class DictationRecordingButton extends LitElement { this.#connection = "CONNECTING"; this.#dispatchRecordingStateChanged(this._recordingState); - await this.#dictationController.connect(this._dictationConfig, { - onClose: this.#handleWebSocketClose, - onError: this.#handleWebSocketError, - onMessage: this.#handleWebSocketMessage, - onNetworkActivity: (direction, data) => { - this.dispatchEvent(networkActivityEvent(direction, data)); + await this.#dictationController.connect( + this._dictationConfig ?? DEFAULT_DICTATION_CONFIG, + { + onClose: this.#handleWebSocketClose, + onError: this.#handleWebSocketError, + onMessage: this.#handleWebSocketMessage, + onNetworkActivity: (direction, data) => { + this.dispatchEvent(networkActivityEvent(direction, data)); + }, }, - }); + ); this.#connection = "OPEN"; this.#dispatchRecordingStateChanged(this._recordingState); diff --git a/src/controllers/dictation-controller.ts b/src/controllers/dictation-controller.ts index 43be862..1a9d354 100644 --- a/src/controllers/dictation-controller.ts +++ b/src/controllers/dictation-controller.ts @@ -1,29 +1,15 @@ import { type Corti, - type CortiAuth, - CortiClient, + type CortiClient, CortiWebSocketProxyClient, } from "@corti/sdk"; -import type { ReactiveController, ReactiveControllerHost } from "lit"; -import { DEFAULT_DICTATION_CONFIG } from "../constants.js"; import type { ProxyOptions } from "../types.js"; -import { errorEvent } from "../utils/events.js"; +import { SocketController } from "./socket-controller.js"; type TranscribeSocket = Awaited< ReturnType >; -interface DictationControllerHost extends ReactiveControllerHost { - dispatchEvent: (event: Event) => void; - _accessToken?: string; - _authConfig?: CortiAuth.AuthTokenDerivable; - _region?: string; - _tenantName?: string; - _socketUrl?: string; - _socketProxy?: ProxyOptions; - _dictationConfig?: Corti.TranscribeConfig; -} - export type TranscribeMessage = | Corti.TranscribeConfigStatusMessage | Corti.TranscribeUsageMessage @@ -39,382 +25,36 @@ type OutboundItem = | Corti.TranscribeFlushMessage | Corti.TranscribeEndMessage; -interface WebSocketCallbacks { - onMessage?: (message: TranscribeMessage) => void; - onError?: (error: Error) => void; - onClose?: (event: unknown) => void; - onNetworkActivity?: (direction: "sent" | "received", data: unknown) => void; -} - -export class DictationController implements ReactiveController { - host: DictationControllerHost; - - #cortiClient: CortiClient | null = null; - #webSocket: TranscribeSocket | null = null; - #closeTimeout?: number; - #callbacks?: WebSocketCallbacks; - #lastDictationConfig: Corti.TranscribeConfig | null = null; - #lastSocketUrl?: string; - #lastSocketProxy?: ProxyOptions; - #outboundQueue: OutboundItem[] = []; - #socketReady = false; - #connectingPromise: Promise | null = null; - #connectionGeneration = 0; - #isConnecting = false; - - constructor(host: DictationControllerHost) { - this.host = host; - host.addController(this); - } - - hostDisconnected(): void { - this.cleanup(); - } - - #configHasChanged(): boolean { - return ( - JSON.stringify(this.host._dictationConfig) !== - JSON.stringify(this.#lastDictationConfig) || - this.host._socketUrl !== this.#lastSocketUrl || - JSON.stringify(this.host._socketProxy) !== - JSON.stringify(this.#lastSocketProxy) - ); - } - - async connect( - dictationConfig: Corti.TranscribeConfig = DEFAULT_DICTATION_CONFIG, - callbacks: WebSocketCallbacks = {}, - ): Promise { - // If a connection attempt is already in progress with the same config, reuse it - // to avoid opening multiple sockets when connect() is called concurrently. - if (this.#connectingPromise && !this.#configHasChanged()) { - return this.#connectingPromise; - } - - // #isConnecting must be set synchronously before #doConnect runs, because - // #doConnect calls cleanup() which closes the old socket, firing its "close" - // event synchronously. Handlers that check isConnecting() need to see true - // at that point — before #connectingPromise is even assigned. - this.#isConnecting = true; - this.#connectingPromise = this.#doConnect( - dictationConfig, - callbacks, - ).finally(() => { - this.#isConnecting = false; - this.#connectingPromise = null; - }); - - return this.#connectingPromise; +export class DictationController extends SocketController< + OutboundItem, + TranscribeMessage, + Corti.TranscribeConfig, + TranscribeSocket +> { + async stopRecording(): Promise { + await this.pause(); } - async #doConnect( - dictationConfig: Corti.TranscribeConfig, - callbacks: WebSocketCallbacks, - ): Promise { - const newConnection = this.#configHasChanged() || !this.isConnectionOpen(); - - if (newConnection) { - this.cleanup(); - - this.#lastDictationConfig = this.host._dictationConfig || null; - this.#lastSocketUrl = this.host._socketUrl; - this.#lastSocketProxy = this.host._socketProxy; - - const generation = this.#connectionGeneration; - - const socket = - this.host._socketUrl || this.host._socketProxy - ? await this.#connectProxy(dictationConfig) - : await this.#connectAuth(dictationConfig); - - // If cleanup() was called while we were awaiting (e.g. config changed), - // the generation counter will have advanced — discard this stale socket. - if (this.#connectionGeneration !== generation) { - socket.close(); - return "superseded"; - } - - this.#webSocket = socket; - - this.#callbacks?.onNetworkActivity?.("sent", { - configuration: dictationConfig, - type: "config", - }); - } - - this.#callbacks = callbacks; - this.#setupWebSocketHandlers(callbacks); - - if (!newConnection && this.isConnectionOpen()) { - this.#socketReady = true; - this.#drain(); - } - - return newConnection; - } - - async #connectProxy( + protected async _connectThroughProxy( dictationConfig: Corti.TranscribeConfig, + proxy: ProxyOptions, ): Promise { - const proxyOptions = this.host._socketProxy || { - url: this.host._socketUrl || "", - }; - - if (!proxyOptions.url) { - throw new Error("Proxy URL is required when using proxy client"); - } - return await CortiWebSocketProxyClient.transcribe.connect({ - // setting to "false" to have CONFIG_* message in network activity events + // awaitConfiguration: false — CONFIG_* appears in network activity before the socket is configured server-side awaitConfiguration: false, configuration: dictationConfig, - proxy: proxyOptions, + proxy, }); } - async #connectAuth( + protected async _connectThroughAuth( + client: CortiClient, dictationConfig: Corti.TranscribeConfig, ): Promise { - if (!this.host._authConfig && !this.host._accessToken) { - throw new Error( - "Auth configuration or access token is required to connect", - ); - } - - // Use authConfig if available, otherwise create one from accessToken - const auth: CortiAuth.AuthTokenDerivable = this.host._authConfig || { - accessToken: this.host._accessToken || "", - refreshAccessToken: () => ({ - accessToken: this.host._accessToken || "", - }), - }; - - this.#cortiClient = new CortiClient({ - auth, - environment: this.host._region, - tenantName: this.host._tenantName, - }); - - return await this.#cortiClient.transcribe.connect({ - // setting to "false" to have CONFIG_* message in network activity events + return await client.transcribe.connect({ + // awaitConfiguration: false — CONFIG_* appears in network activity before the socket is configured server-side awaitConfiguration: false, configuration: dictationConfig, }); } - - #setupWebSocketHandlers(callbacks: WebSocketCallbacks): void { - if (!this.#webSocket) { - throw new Error("WebSocket not initialized"); - } - - this.#webSocket.on("message", (message: TranscribeMessage) => { - if (message.type === "CONFIG_ACCEPTED") { - this.#socketReady = true; - this.#drain(); - } - - callbacks.onNetworkActivity?.("received", message); - - if (callbacks.onMessage) { - callbacks.onMessage(message); - } - }); - - this.#webSocket.on("error", (event: Error) => { - this.#socketReady = false; - if (callbacks.onError) { - callbacks.onError(event); - } - }); - - this.#webSocket.on("close", (event: unknown) => { - this.#socketReady = false; - if (callbacks.onClose) { - callbacks.onClose(event); - } - }); - } - - #isSocketOpen(): boolean { - return ( - this.#webSocket !== null && this.#webSocket.readyState === WebSocket.OPEN - ); - } - - #drain(): void { - if ( - !this.#socketReady || - !this.#isSocketOpen() || - this.#outboundQueue.length === 0 - ) { - return; - } - - while (this.#outboundQueue.length > 0 && this.#isSocketOpen()) { - const item = this.#outboundQueue.shift(); - - if (item === undefined) { - break; - } - - if (item instanceof Blob) { - this.#webSocket!.send(item); - this.#callbacks?.onNetworkActivity?.("sent", { - size: item.size, - type: "audio", - }); - continue; - } - - this.#webSocket!.send(JSON.stringify(item)); - this.#callbacks?.onNetworkActivity?.("sent", { - type: item.type, - }); - } - } - - mediaRecorderHandler = (data: Blob): void => { - if (this.#socketReady && this.#isSocketOpen()) { - this.#webSocket?.send(data); - this.#callbacks?.onNetworkActivity?.("sent", { - size: data.size, - type: "audio", - }); - return; - } - - this.#outboundQueue.push(data); - }; - - async pause(): Promise { - if (this.#socketReady && this.#isSocketOpen()) { - this.#webSocket?.send(JSON.stringify({ type: "flush" })); - this.#callbacks?.onNetworkActivity?.("sent", { type: "flush" }); - return; - } - - this.#outboundQueue.push({ type: "flush" }); - } - - isConnectionOpen(): boolean { - return ( - this.#webSocket !== null && - (this.#webSocket.readyState === WebSocket.OPEN || - this.#webSocket.readyState === WebSocket.CONNECTING) - ); - } - - isConnecting(): boolean { - return this.#isConnecting; - } - - async waitForConnection(): Promise { - await this.#connectingPromise; - } - - async closeConnection(onClose?: (event: unknown) => void): Promise { - await new Promise((resolve, reject) => { - const oldSocket = this.#webSocket; - this.#webSocket = null; - - if ( - !oldSocket || - (oldSocket.readyState !== WebSocket.OPEN && - oldSocket.readyState !== WebSocket.CONNECTING) - ) { - this.#socketReady = false; - resolve(); - return; - } - - oldSocket.on("close", (event) => { - if (this.#closeTimeout) { - clearTimeout(this.#closeTimeout); - this.#closeTimeout = undefined; - } - - if (onClose) { - onClose(event); - } - - resolve(); - }); - - const wasReady = this.#socketReady; - this.#socketReady = false; - - oldSocket.on("message", (message) => { - this.#callbacks?.onNetworkActivity?.("received", message); - - if (this.#callbacks?.onMessage) { - this.#callbacks?.onMessage(message); - } - - // closeConnection() may be called before CONFIG_ACCEPTED arrives (e.g. - // openConnection() followed immediately by closeConnection()). We can't - // use the outbound queue here because #webSocket is already null, so we - // send "end" directly on oldSocket as soon as config is accepted. - if (!wasReady && message.type === "CONFIG_ACCEPTED") { - oldSocket.sendEnd({ type: "end" }); - this.#callbacks?.onNetworkActivity?.("sent", { type: "end" }); - return; - } - - if (message.type === "ended") { - if (this.#closeTimeout) { - clearTimeout(this.#closeTimeout); - this.#closeTimeout = undefined; - } - - resolve(); - return; - } - }); - - if (wasReady) { - oldSocket.sendEnd({ type: "end" }); - this.#callbacks?.onNetworkActivity?.("sent", { type: "end" }); - } - - this.#closeTimeout = window.setTimeout(() => { - reject(new Error("Connection close timeout")); - - if (oldSocket?.readyState === WebSocket.OPEN) { - oldSocket.close(); - } - }, 10000); - }); - } - - cleanup(): void { - // Incrementing generation invalidates any in-flight #doConnect awaits, - // causing them to discard their socket and return "superseded". - this.#connectionGeneration++; - this.#socketReady = false; - - if (this.#closeTimeout) { - clearTimeout(this.#closeTimeout); - this.#closeTimeout = undefined; - } - - if (this.isConnectionOpen()) { - this.#webSocket?.close(); - } - - this.#webSocket = null; - this.#cortiClient = null; - this.#lastDictationConfig = null; - this.#lastSocketUrl = undefined; - this.#lastSocketProxy = undefined; - - if (this.#outboundQueue.length > 0) { - this.host.dispatchEvent( - errorEvent( - `${this.#outboundQueue.length} unsent message(s) were discarded because the configuration changed before the connection was closed`, - ), - ); - } - - this.#outboundQueue = []; - } } diff --git a/src/controllers/socket-controller.ts b/src/controllers/socket-controller.ts new file mode 100644 index 0000000..2ddb2f1 --- /dev/null +++ b/src/controllers/socket-controller.ts @@ -0,0 +1,404 @@ +import { type CortiAuth, CortiClient } from "@corti/sdk"; +import type { ReactiveController, ReactiveControllerHost } from "lit"; +import type { ProxyOptions } from "../types.js"; +import { errorEvent } from "../utils/events.js"; + +export interface SocketControllerHost extends ReactiveControllerHost { + dispatchEvent: (event: Event) => void; + _accessToken?: string; + _authConfig?: CortiAuth.AuthTokenDerivable; + _region?: string; + _tenantName?: string; + _socketUrl?: string; + _socketProxy?: ProxyOptions; +} + +export type SocketControllerWebSocket = { + readyState: number; + close(): void; + on(event: "message", handler: (message: { type: string }) => void): void; + on(event: "error", handler: (error: Error) => void): void; + on(event: "close", handler: (event: unknown) => void): void; + send(data: Blob | ArrayBufferLike | string): void; + sendEnd(message: { type: "end" }): void; +}; + +export type SocketControllerCallbacks = { + onMessage?: (message: TMessage) => void; + onError?: (error: Error) => void; + onClose?: (event: unknown) => void; + onNetworkActivity?: (direction: "sent" | "received", data: unknown) => void; +}; + +export type SocketControllerOutboundItem = Blob | { type: string }; + +export abstract class SocketController< + TOutbound extends SocketControllerOutboundItem, + TMessage = unknown, + TConfig = unknown, + TSocket extends SocketControllerWebSocket = SocketControllerWebSocket, +> implements ReactiveController +{ + readonly host: SocketControllerHost; + + #webSocket: TSocket | null = null; + #cortiClient: CortiClient | null = null; + #connectionGeneration = 0; + #socketReady = false; + #closeTimeout?: number; + #outboundQueue: TOutbound[] = []; + #callbacks?: SocketControllerCallbacks; + #lastConfig: TConfig | null = null; + #lastSocketUrl?: string; + #lastSocketProxy?: ProxyOptions; + #connectingPromise: Promise | null = null; + #isConnecting = false; + + protected abstract _connectThroughProxy( + config: TConfig, + proxy: ProxyOptions, + ): Promise; + protected abstract _connectThroughAuth( + client: CortiClient, + config: TConfig, + ): Promise; + + constructor(host: SocketControllerHost) { + this.host = host; + host.addController(this); + } + + async #openViaProxy(config: TConfig): Promise { + const proxyOptions = this.host._socketProxy || { + url: this.host._socketUrl || "", + }; + + if (!proxyOptions.url) { + throw new Error("Proxy URL is required when using proxy client"); + } + + return this._connectThroughProxy(config, proxyOptions); + } + + async #openViaAuth(config: TConfig): Promise { + if (!this.host._authConfig && !this.host._accessToken) { + throw new Error( + "Auth configuration or access token is required to connect", + ); + } + + const auth: CortiAuth.AuthTokenDerivable = this.host._authConfig || { + accessToken: this.host._accessToken || "", + refreshAccessToken: () => ({ + accessToken: this.host._accessToken || "", + }), + }; + + this.#cortiClient = new CortiClient({ + auth, + environment: this.host._region, + tenantName: this.host._tenantName, + }); + + return this._connectThroughAuth(this.#cortiClient, config); + } + + async connect( + config: TConfig, + callbacks: SocketControllerCallbacks, + ): Promise { + // If a connection attempt is already in progress with the same config, reuse it + // to avoid opening multiple sockets when connect() is called concurrently. + if (this.#connectingPromise && !this.#configHasChanged(config)) { + return this.#connectingPromise; + } + + // #isConnecting must be set synchronously before #doConnect runs, because + // #doConnect calls cleanup() which closes the old socket, firing its "close" + // event synchronously. Handlers that check isConnecting() need to see true + // at that point — before #connectingPromise is even assigned. + this.#isConnecting = true; + this.#connectingPromise = this.#doConnect(config, callbacks).finally(() => { + this.#isConnecting = false; + this.#connectingPromise = null; + }); + + return this.#connectingPromise; + } + + async #doConnect( + config: TConfig, + callbacks: SocketControllerCallbacks, + ): Promise { + const newConnection = + this.#configHasChanged(config) || !this.isConnectionOpen(); + + if (newConnection) { + this.cleanup(); + + this.#lastConfig = config; + this.#lastSocketUrl = this.host._socketUrl; + this.#lastSocketProxy = this.host._socketProxy; + + const generation = this.#connectionGeneration; + + const socket = + this.host._socketUrl || this.host._socketProxy + ? await this.#openViaProxy(config) + : await this.#openViaAuth(config); + + // If cleanup() was called while we were awaiting (e.g. config changed), + // the generation counter will have advanced — discard this stale socket. + if (this.#connectionGeneration !== generation) { + socket.close(); + return "superseded"; + } + + this.#webSocket = socket; + + this.#callbacks?.onNetworkActivity?.("sent", { + configuration: config, + type: "config", + }); + } + + this.#callbacks = callbacks; + this.#setupWebSocketHandlers(callbacks); + + if (!newConnection && this.isConnectionOpen()) { + this.#socketReady = true; + this.#drain(); + } + + return newConnection; + } + + hostDisconnected(): void { + this.cleanup(); + } + + isConnectionOpen(): boolean { + return ( + this.#webSocket !== null && + (this.#webSocket.readyState === WebSocket.OPEN || + this.#webSocket.readyState === WebSocket.CONNECTING) + ); + } + + isConnecting(): boolean { + return this.#isConnecting; + } + + async waitForConnection(): Promise { + await this.#connectingPromise; + } + + #isSocketOpen(): boolean { + return ( + this.#webSocket !== null && this.#webSocket.readyState === WebSocket.OPEN + ); + } + + #configHasChanged(nextConfig: TConfig): boolean { + return ( + JSON.stringify(nextConfig) !== JSON.stringify(this.#lastConfig) || + this.host._socketUrl !== this.#lastSocketUrl || + JSON.stringify(this.host._socketProxy) !== + JSON.stringify(this.#lastSocketProxy) + ); + } + + #drain(): void { + if ( + !this.#socketReady || + !this.#isSocketOpen() || + this.#outboundQueue.length === 0 + ) { + return; + } + + while (this.#outboundQueue.length > 0 && this.#isSocketOpen()) { + const item = this.#outboundQueue.shift(); + + if (item === undefined) { + break; + } + + if (item instanceof Blob) { + this.#webSocket!.send(item); + this.#callbacks?.onNetworkActivity?.("sent", { + size: item.size, + type: "audio", + }); + continue; + } + + this.#webSocket!.send(JSON.stringify(item)); + this.#callbacks?.onNetworkActivity?.("sent", { + type: item.type, + }); + } + } + + mediaRecorderHandler = (data: Blob): void => { + if (this.#socketReady && this.#isSocketOpen()) { + this.#webSocket?.send(data); + this.#callbacks?.onNetworkActivity?.("sent", { + size: data.size, + type: "audio", + }); + return; + } + + this.#outboundQueue.push(data as TOutbound); + }; + + async pause(): Promise { + if (this.#socketReady && this.#isSocketOpen()) { + this.#webSocket?.send(JSON.stringify({ type: "flush" })); + this.#callbacks?.onNetworkActivity?.("sent", { type: "flush" }); + return; + } + + this.#outboundQueue.push({ type: "flush" } as TOutbound); + } + + async closeConnection(onClose?: (event: unknown) => void): Promise { + await new Promise((resolve, reject) => { + const oldSocket = this.#webSocket; + this.#webSocket = null; + + if ( + !oldSocket || + (oldSocket.readyState !== WebSocket.OPEN && + oldSocket.readyState !== WebSocket.CONNECTING) + ) { + this.#socketReady = false; + resolve(); + return; + } + + oldSocket.on("close", (event) => { + if (this.#closeTimeout) { + clearTimeout(this.#closeTimeout); + this.#closeTimeout = undefined; + } + + if (onClose) { + onClose(event); + } + + resolve(); + }); + + const wasReady = this.#socketReady; + this.#socketReady = false; + + oldSocket.on("message", (message) => { + this.#callbacks?.onNetworkActivity?.("received", message); + + if (this.#callbacks?.onMessage) { + this.#callbacks.onMessage(message as TMessage); + } + + // closeConnection() may be called before CONFIG_ACCEPTED arrives (e.g. + // openConnection() followed immediately by closeConnection()). We can't + // use the outbound queue here because #webSocket is already null, so we + // send "end" directly on oldSocket as soon as config is accepted. + if (!wasReady && message.type === "CONFIG_ACCEPTED") { + oldSocket.sendEnd({ type: "end" }); + this.#callbacks?.onNetworkActivity?.("sent", { type: "end" }); + return; + } + + if (message.type === "ended") { + if (this.#closeTimeout) { + clearTimeout(this.#closeTimeout); + this.#closeTimeout = undefined; + } + + resolve(); + return; + } + }); + + if (wasReady) { + oldSocket.sendEnd({ type: "end" }); + this.#callbacks?.onNetworkActivity?.("sent", { type: "end" }); + } + + this.#closeTimeout = window.setTimeout(() => { + reject(new Error("Connection close timeout")); + + if (oldSocket?.readyState === WebSocket.OPEN) { + oldSocket.close(); + } + }, 10000); + }); + } + + cleanup(): void { + this.#connectionGeneration++; + this.#socketReady = false; + + if (this.#closeTimeout) { + clearTimeout(this.#closeTimeout); + this.#closeTimeout = undefined; + } + + if (this.isConnectionOpen()) { + this.#webSocket?.close(); + } + + this.#webSocket = null; + this.#cortiClient = null; + this.#lastConfig = null; + this.#lastSocketUrl = undefined; + this.#lastSocketProxy = undefined; + + if (this.#outboundQueue.length > 0) { + this.host.dispatchEvent( + errorEvent( + `${this.#outboundQueue.length} unsent message(s) were discarded because the configuration changed before the connection was closed`, + ), + ); + } + + this.#outboundQueue = []; + } + + #setupWebSocketHandlers( + callbacks: SocketControllerCallbacks, + ): void { + if (!this.#webSocket) { + throw new Error("WebSocket not initialized"); + } + + this.#webSocket.on("message", (message) => { + if (message.type === "CONFIG_ACCEPTED") { + this.#socketReady = true; + this.#drain(); + } + + callbacks.onNetworkActivity?.("received", message); + + if (callbacks.onMessage) { + callbacks.onMessage(message as TMessage); + } + }); + + this.#webSocket.on("error", (event: Error) => { + this.#socketReady = false; + if (callbacks.onError) { + callbacks.onError(event); + } + }); + + this.#webSocket.on("close", (event: unknown) => { + this.#socketReady = false; + if (callbacks.onClose) { + callbacks.onClose(event); + } + }); + } +} From 1726cef52856e46945f1fb0987c59db40032e354 Mon Sep 17 00:00:00 2001 From: markitosha Date: Mon, 11 May 2026 15:36:58 +0200 Subject: [PATCH 02/50] fix: handle both lowercase and uppercase 'ended' message types in socket controller feat: added separate ambient controller --- src/controllers/ambient-controller.ts | 63 +++++++++++++++++++++++++++ src/controllers/socket-controller.ts | 2 +- 2 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 src/controllers/ambient-controller.ts diff --git a/src/controllers/ambient-controller.ts b/src/controllers/ambient-controller.ts new file mode 100644 index 0000000..a2087f5 --- /dev/null +++ b/src/controllers/ambient-controller.ts @@ -0,0 +1,63 @@ +import { + type Corti, + type CortiClient, + CortiWebSocketProxyClient, +} from "@corti/sdk"; +import type { ProxyOptions } from "../types.js"; +import { SocketController } from "./socket-controller.js"; + +export type AmbientStreamSessionConfig = { + interactionId: string; + configuration?: Corti.StreamConfig; +}; + +type AmbientStreamSocket = Awaited< + ReturnType +>; + +export type StreamAmbientMessage = + | Corti.StreamTranscriptMessage + | Corti.StreamFactsMessage + | Corti.StreamFlushedMessage + | Corti.StreamDeltaUsageMessage + | Corti.StreamEndedMessage + | Corti.StreamUsageMessage + | Corti.StreamErrorMessage + | Corti.StreamConfigStatusMessage; + +type OutboundItem = Blob | Corti.StreamEndMessage; + +export class AmbientController extends SocketController< + OutboundItem, + StreamAmbientMessage, + AmbientStreamSessionConfig, + AmbientStreamSocket +> { + async stopRecording(): Promise { + await this.closeConnection(); + } + + protected async _connectThroughProxy( + session: AmbientStreamSessionConfig, + proxy: ProxyOptions, + ): Promise { + return await CortiWebSocketProxyClient.stream.connect({ + // awaitConfiguration: false — CONFIG_* appears in network activity before the socket is configured server-side + awaitConfiguration: false, + configuration: session.configuration, + proxy, + }); + } + + protected async _connectThroughAuth( + client: CortiClient, + session: AmbientStreamSessionConfig, + ): Promise { + return await client.stream.connect({ + // awaitConfiguration: false — CONFIG_* appears in network activity before the socket is configured server-side + awaitConfiguration: false, + configuration: session.configuration, + id: session.interactionId, + }); + } +} diff --git a/src/controllers/socket-controller.ts b/src/controllers/socket-controller.ts index 2ddb2f1..8260cab 100644 --- a/src/controllers/socket-controller.ts +++ b/src/controllers/socket-controller.ts @@ -311,7 +311,7 @@ export abstract class SocketController< return; } - if (message.type === "ended") { + if (message.type === "ended" || message.type === "ENDED") { if (this.#closeTimeout) { clearTimeout(this.#closeTimeout); this.#closeTimeout = undefined; From f4b7bfc2b03d1eb4e9ff361decedac35a9d016dc Mon Sep 17 00:00:00 2001 From: markitosha Date: Tue, 12 May 2026 09:57:51 +0200 Subject: [PATCH 03/50] feat: implement ambient web component and enhance socket controller functionality --- src/components/ambient-recording-button.ts | 32 +++++ src/components/corti-dictation.ts | 4 +- src/components/dictation-recording-button.ts | 32 +++++ ...ing-button.ts => recording-button-base.ts} | 111 +++++++++--------- src/constants.ts | 10 ++ src/controllers/ambient-controller.ts | 2 +- src/controllers/socket-controller.ts | 6 + src/index.ts | 12 +- src/types.ts | 7 ++ src/utils/events.ts | 27 ++++- 10 files changed, 182 insertions(+), 61 deletions(-) create mode 100644 src/components/ambient-recording-button.ts create mode 100644 src/components/dictation-recording-button.ts rename src/components/{recording-button.ts => recording-button-base.ts} (80%) diff --git a/src/components/ambient-recording-button.ts b/src/components/ambient-recording-button.ts new file mode 100644 index 0000000..fc7f2e0 --- /dev/null +++ b/src/components/ambient-recording-button.ts @@ -0,0 +1,32 @@ +import { customElement, property } from "lit/decorators.js"; +import { DEFAULT_STREAM_CONFIG } from "../constants.js"; +import { + AmbientController, + type AmbientStreamSessionConfig, + type StreamAmbientMessage, +} from "../controllers/ambient-controller.js"; +import { RecordingButtonBase } from "./recording-button-base.js"; + +@customElement("ambient-recording-button") +export class AmbientRecordingButton extends RecordingButtonBase< + AmbientStreamSessionConfig, + StreamAmbientMessage +> { + @property({ attribute: "interaction-id", type: String }) + interactionId: string = "9254ec9b-70e6-45d1-bacb-63d6cce19e86"; + + protected _socketController = new AmbientController(this); + + protected _getConnectConfig(): AmbientStreamSessionConfig { + return { + configuration: DEFAULT_STREAM_CONFIG, + interactionId: this.interactionId, + }; + } +} + +declare global { + interface HTMLElementTagNameMap { + "ambient-recording-button": AmbientRecordingButton; + } +} diff --git a/src/components/corti-dictation.ts b/src/components/corti-dictation.ts index 2288219..f5bc43e 100644 --- a/src/components/corti-dictation.ts +++ b/src/components/corti-dictation.ts @@ -11,10 +11,10 @@ import type { RecordingState, } from "../types.js"; import { commaSeparatedConverter } from "../utils/converters.js"; -import type { DictationRecordingButton } from "./recording-button.js"; +import type { DictationRecordingButton } from "./dictation-recording-button.js"; import "../contexts/dictation-context.js"; -import "./recording-button.js"; +import "./dictation-recording-button.js"; import "./settings-menu.js"; @customElement("corti-dictation") diff --git a/src/components/dictation-recording-button.ts b/src/components/dictation-recording-button.ts new file mode 100644 index 0000000..4770238 --- /dev/null +++ b/src/components/dictation-recording-button.ts @@ -0,0 +1,32 @@ +import type { Corti } from "@corti/sdk"; +import { consume } from "@lit/context"; +import { customElement, state } from "lit/decorators.js"; +import { DEFAULT_DICTATION_CONFIG } from "../constants.js"; +import { dictationConfigContext } from "../contexts/dictation-context.js"; +import { + DictationController, + type TranscribeMessage, +} from "../controllers/dictation-controller.js"; +import { RecordingButtonBase } from "./recording-button-base.js"; + +@customElement("dictation-recording-button") +export class DictationRecordingButton extends RecordingButtonBase< + Corti.TranscribeConfig, + TranscribeMessage +> { + @consume({ context: dictationConfigContext, subscribe: true }) + @state() + protected _dictationConfig?: Corti.TranscribeConfig; + + protected _socketController = new DictationController(this); + + protected _getConnectConfig(): Corti.TranscribeConfig { + return this._dictationConfig ?? DEFAULT_DICTATION_CONFIG; + } +} + +declare global { + interface HTMLElementTagNameMap { + "dictation-recording-button": DictationRecordingButton; + } +} diff --git a/src/components/recording-button.ts b/src/components/recording-button-base.ts similarity index 80% rename from src/components/recording-button.ts rename to src/components/recording-button-base.ts index 2756e2a..434c66b 100644 --- a/src/components/recording-button.ts +++ b/src/components/recording-button-base.ts @@ -1,4 +1,4 @@ -import type { Corti, CortiAuth } from "@corti/sdk"; +import type { CortiAuth } from "@corti/sdk"; import { consume } from "@lit/context"; import { type CSSResultGroup, @@ -6,16 +6,12 @@ import { LitElement, type PropertyValues, } from "lit"; -import { customElement, property, state } from "lit/decorators.js"; -import { - AUDIO_CHUNK_INTERVAL_MS, - DEFAULT_DICTATION_CONFIG, -} from "../constants.js"; +import { property, state } from "lit/decorators.js"; +import { AUDIO_CHUNK_INTERVAL_MS } from "../constants.js"; import { accessTokenContext, authConfigContext, debugDisplayAudioContext, - dictationConfigContext, pushToTalkKeybindingContext, recordingStateContext, regionContext, @@ -25,20 +21,27 @@ import { tenantNameContext, toggleToTalkKeybindingContext, } from "../contexts/dictation-context.js"; -import { - DictationController, - type TranscribeMessage, -} from "../controllers/dictation-controller.js"; +import type { TranscribeMessage } from "../controllers/dictation-controller.js"; import { KeybindingController } from "../controllers/keybinding-controller.js"; import { MediaController } from "../controllers/media-controller.js"; +import type { + SocketController, + SocketControllerOutboundItem, + SocketControllerWebSocket, +} from "../controllers/socket-controller.js"; import ButtonStyles from "../styles/buttons.js"; import RecordingButtonStyles from "../styles/recording-button.js"; -import type { ProxyOptions, RecordingState } from "../types.js"; +import type { + ProxyOptions, + RecordingSocketInboundMessage, + RecordingState, +} from "../types.js"; import { audioLevelChangedEvent, commandEvent, deltaUsageEvent, errorEvent, + factsEvent, networkActivityEvent, type RecordingStateChangedEventDetail, recordingStateChangedEvent, @@ -50,8 +53,10 @@ import { import "./audio-visualiser.js"; import "../icons/icons.js"; -@customElement("dictation-recording-button") -export class DictationRecordingButton extends LitElement { +export abstract class RecordingButtonBase< + TConfig, + TMessage extends RecordingSocketInboundMessage = TranscribeMessage, +> extends LitElement { @consume({ context: recordingStateContext, subscribe: true }) @state() _recordingState: RecordingState = "stopped"; @@ -76,10 +81,6 @@ export class DictationRecordingButton extends LitElement { @state() _tenantName?: string; - @consume({ context: dictationConfigContext, subscribe: true }) - @state() - _dictationConfig?: Corti.TranscribeConfig; - @consume({ context: socketUrlContext, subscribe: true }) @state() _socketUrl?: string; @@ -103,8 +104,16 @@ export class DictationRecordingButton extends LitElement { @property({ type: Boolean }) allowButtonFocus: boolean = false; + protected abstract _socketController: SocketController< + SocketControllerOutboundItem, + TMessage, + TConfig, + SocketControllerWebSocket + >; + + protected abstract _getConnectConfig(): TConfig; + #mediaController = new MediaController(this); - #dictationController = new DictationController(this); #keybindingController = new KeybindingController(this); #closeConnectionOnInit = false; #processing = false; @@ -133,7 +142,7 @@ export class DictationRecordingButton extends LitElement { this.toggleRecording(); } - #handleWebSocketMessage = (message: TranscribeMessage): void => { + #handleWebSocketMessage = (message: TMessage): void => { switch (message.type) { case "CONFIG_DENIED": this.dispatchEvent( @@ -151,6 +160,9 @@ export class DictationRecordingButton extends LitElement { case "command": this.dispatchEvent(commandEvent(message)); break; + case "facts": + this.dispatchEvent(factsEvent(message)); + break; case "usage": this.dispatchEvent(usageEvent(message)); break; @@ -161,6 +173,11 @@ export class DictationRecordingButton extends LitElement { this.dispatchEvent(errorEvent(message.error)); this.#handleStop(); break; + case "ended": + case "ENDED": + this.#processing = false; + this.#dispatchRecordingStateChanged(this._recordingState); + break; case "flushed": if ( this._recordingState === "stopped" || @@ -174,17 +191,16 @@ export class DictationRecordingButton extends LitElement { }; #handleWebSocketError = (error: Error): void => { - this.dispatchEvent(errorEvent("Socket error: " + error.message)); + this.dispatchEvent(errorEvent(`Socket error: ${error.message}`)); this.#processing = false; this.#connection = "CLOSED"; this.#handleStop(); }; #handleWebSocketClose = (event: unknown): void => { - // When we already have new socket opened if ( - this.#dictationController.isConnectionOpen() || - this.#dictationController.isConnecting() + this._socketController.isConnectionOpen() || + this._socketController.isConnecting() ) { return; } @@ -213,7 +229,7 @@ export class DictationRecordingButton extends LitElement { this.dispatchEvent(errorEvent("Recording device access was lost.")); this.#handleStop(); } - }, this.#dictationController.mediaRecorderHandler); + }, this._socketController.mediaRecorderHandler); this.#mediaController.mediaRecorder?.start(AUDIO_CHUNK_INTERVAL_MS); this.#mediaController.startAudioLevelMonitoring((level) => { this.dispatchEvent(audioLevelChangedEvent(level)); @@ -227,8 +243,8 @@ export class DictationRecordingButton extends LitElement { this.#dispatchRecordingStateChanged("recording"); - const isNewConnection = await this.#dictationController.connect( - this._dictationConfig ?? DEFAULT_DICTATION_CONFIG, + const isNewConnection = await this._socketController.connect( + this._getConnectConfig(), { onClose: this.#handleWebSocketClose, onError: this.#handleWebSocketError, @@ -258,14 +274,14 @@ export class DictationRecordingButton extends LitElement { try { this.#mediaController.stopAudioLevelMonitoring(); await this.#mediaController.stopRecording(); - await this.#dictationController.stopRecording(); - - this.#dispatchRecordingStateChanged("stopped"); + await this._socketController.stopRecording(); await this.#mediaController.cleanup(); } catch (error) { this.dispatchEvent(errorEvent(error)); } + + this.#dispatchRecordingStateChanged("stopped"); } public startRecording(): void { @@ -305,7 +321,7 @@ export class DictationRecordingButton extends LitElement { return; } - if (this.#dictationController.isConnectionOpen()) { + if (this._socketController.isConnectionOpen()) { return; } @@ -313,17 +329,14 @@ export class DictationRecordingButton extends LitElement { this.#connection = "CONNECTING"; this.#dispatchRecordingStateChanged(this._recordingState); - await this.#dictationController.connect( - this._dictationConfig ?? DEFAULT_DICTATION_CONFIG, - { - onClose: this.#handleWebSocketClose, - onError: this.#handleWebSocketError, - onMessage: this.#handleWebSocketMessage, - onNetworkActivity: (direction, data) => { - this.dispatchEvent(networkActivityEvent(direction, data)); - }, + await this._socketController.connect(this._getConnectConfig(), { + onClose: this.#handleWebSocketClose, + onError: this.#handleWebSocketError, + onMessage: this.#handleWebSocketMessage, + onNetworkActivity: (direction, data) => { + this.dispatchEvent(networkActivityEvent(direction, data)); }, - ); + }); this.#connection = "OPEN"; this.#dispatchRecordingStateChanged(this._recordingState); @@ -338,11 +351,11 @@ export class DictationRecordingButton extends LitElement { return; } - if (this.#dictationController.isConnecting()) { - await this.#dictationController.waitForConnection(); + if (this._socketController.isConnecting()) { + await this._socketController.waitForConnection(); } - if (!this.#dictationController.isConnectionOpen()) { + if (!this._socketController.isConnectionOpen()) { this.#connection = "CLOSED"; this.#dispatchRecordingStateChanged("stopped"); return; @@ -351,9 +364,7 @@ export class DictationRecordingButton extends LitElement { try { this.#connection = "CLOSING"; this.#dispatchRecordingStateChanged("stopped"); - await this.#dictationController.closeConnection( - this.#handleWebSocketClose, - ); + await this._socketController.closeConnection(this.#handleWebSocketClose); } catch (error) { this.dispatchEvent(errorEvent(error)); } @@ -388,9 +399,3 @@ export class DictationRecordingButton extends LitElement { `; } } - -declare global { - interface HTMLElementTagNameMap { - "dictation-recording-button": DictationRecordingButton; - } -} diff --git a/src/constants.ts b/src/constants.ts index ec5bea9..c3842d0 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -37,6 +37,16 @@ export const DEFAULT_DICTATION_CONFIG: Corti.TranscribeConfig = { spokenPunctuation: true, }; +export const DEFAULT_STREAM_CONFIG: Corti.StreamConfig = { + mode: { outputLocale: "en", type: "facts" }, + transcription: { + isDiarization: true, + isMultichannel: false, + participants: [], + primaryLanguage: "en", + }, +}; + /** * Interval in milliseconds at which MediaRecorder fires dataavailable events. * This controls how often audio chunks are sent to the WebSocket. diff --git a/src/controllers/ambient-controller.ts b/src/controllers/ambient-controller.ts index a2087f5..bbe9c7d 100644 --- a/src/controllers/ambient-controller.ts +++ b/src/controllers/ambient-controller.ts @@ -8,7 +8,7 @@ import { SocketController } from "./socket-controller.js"; export type AmbientStreamSessionConfig = { interactionId: string; - configuration?: Corti.StreamConfig; + configuration: Corti.StreamConfig; }; type AmbientStreamSocket = Awaited< diff --git a/src/controllers/socket-controller.ts b/src/controllers/socket-controller.ts index 8260cab..6018882 100644 --- a/src/controllers/socket-controller.ts +++ b/src/controllers/socket-controller.ts @@ -263,6 +263,10 @@ export abstract class SocketController< this.#outboundQueue.push({ type: "flush" } as TOutbound); } + async stopRecording(): Promise { + await this.pause(); + } + async closeConnection(onClose?: (event: unknown) => void): Promise { await new Promise((resolve, reject) => { const oldSocket = this.#webSocket; @@ -286,6 +290,8 @@ export abstract class SocketController< if (onClose) { onClose(event); + } else if (this.#callbacks?.onClose) { + this.#callbacks.onClose(event); } resolve(); diff --git a/src/index.ts b/src/index.ts index dcfda12..8526af0 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,11 +1,16 @@ +import { AmbientRecordingButton } from "./components/ambient-recording-button.js"; import { CortiDictation } from "./components/corti-dictation.js"; import { DictationDeviceSelector } from "./components/device-selector.js"; +import { DictationRecordingButton } from "./components/dictation-recording-button.js"; import { DictationKeybindingSelector } from "./components/keybinding-selector.js"; import { DictationLanguageSelector } from "./components/language-selector.js"; -import { DictationRecordingButton } from "./components/recording-button.js"; import { DictationSettingsMenu } from "./components/settings-menu.js"; import { DictationRoot } from "./contexts/dictation-context.js"; +if (!customElements.get("ambient-recording-button")) { + customElements.define("ambient-recording-button", AmbientRecordingButton); +} + if (!customElements.get("corti-dictation")) { customElements.define("corti-dictation", CortiDictation); } @@ -40,14 +45,16 @@ if (!customElements.get("dictation-root")) { customElements.define("dictation-root", DictationRoot); } +export { AmbientRecordingButton } from "./components/ambient-recording-button.js"; export { CortiDictation } from "./components/corti-dictation.js"; export { DictationDeviceSelector } from "./components/device-selector.js"; +export { DictationRecordingButton } from "./components/dictation-recording-button.js"; export { DictationKeybindingSelector } from "./components/keybinding-selector.js"; export { DictationLanguageSelector } from "./components/language-selector.js"; -export { DictationRecordingButton } from "./components/recording-button.js"; export { DictationSettingsMenu } from "./components/settings-menu.js"; export { DictationRoot } from "./contexts/dictation-context.js"; +export type { AmbientStreamSessionConfig } from "./controllers/ambient-controller.js"; export type { ConfigurableSettings, Keybinding, @@ -58,6 +65,7 @@ export type { CommandEventDetail, DeltaUsageEventDetail, ErrorEventDetail, + FactsEventDetail, KeybindingActivatedEventDetail, KeybindingChangedEventDetail, LanguageChangedEventDetail, diff --git a/src/types.ts b/src/types.ts index 68d36f5..fa4f48f 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,3 +1,10 @@ +import type { StreamAmbientMessage } from "./controllers/ambient-controller.js"; +import type { TranscribeMessage } from "./controllers/dictation-controller.js"; + +export type RecordingSocketInboundMessage = + | TranscribeMessage + | StreamAmbientMessage; + export type RecordingState = | "initializing" | "recording" diff --git a/src/utils/events.ts b/src/utils/events.ts index 0a711fa..2204f4a 100644 --- a/src/utils/events.ts +++ b/src/utils/events.ts @@ -25,10 +25,21 @@ export type AudioLevelChangedEventDetail = { audioLevel: number; }; -export type TranscriptEventDetail = Corti.TranscribeTranscriptMessage; +export type TranscriptEventDetail = + | Corti.TranscribeTranscriptMessage + | Corti.StreamTranscriptMessage; + export type CommandEventDetail = Corti.TranscribeCommandMessage; -export type UsageEventDetail = Corti.TranscribeUsageMessage; -export type DeltaUsageEventDetail = Corti.TranscribeDeltaUsageMessage; + +export type UsageEventDetail = + | Corti.TranscribeUsageMessage + | Corti.StreamUsageMessage; + +export type DeltaUsageEventDetail = + | Corti.TranscribeDeltaUsageMessage + | Corti.StreamDeltaUsageMessage; + +export type FactsEventDetail = Corti.StreamFactsMessage; export type ErrorEventDetail = { message: string; @@ -127,6 +138,16 @@ export function deltaUsageEvent( }); } +export function factsEvent( + detail: FactsEventDetail, +): CustomEvent { + return new CustomEvent("facts", { + bubbles: true, + composed: true, + detail, + }); +} + function errorToMessage(error: unknown): string { if (error instanceof Error) { return error.message; From 068376d0c65ec5e3a0050cd11fe6a3a5182c2d38 Mon Sep 17 00:00:00 2001 From: markitosha Date: Tue, 12 May 2026 11:40:58 +0200 Subject: [PATCH 04/50] refactor: update context imports to use mixins for devices, keybindings, and recording state --- biome.json | 13 + src/components/device-selector.ts | 2 +- src/components/keybinding-input.ts | 2 +- src/components/keybinding-selector.ts | 2 +- src/components/language-selector.ts | 6 +- src/components/recording-button-base.ts | 19 +- src/components/settings-menu.ts | 2 +- src/contexts/dictation-context.ts | 334 +----------------- src/contexts/mixins/auth-context.ts | 159 +++++++++ src/contexts/mixins/devices-context.ts | 66 ++++ src/contexts/mixins/keybindings-context.ts | 87 +++++ src/contexts/mixins/languages-context.ts | 60 ++++ src/contexts/mixins/proxy-context.ts | 37 ++ .../mixins/recording-state-context.ts | 40 +++ src/contexts/mixins/types.ts | 5 + src/contexts/root-context.ts | 32 ++ src/controllers/languages-controller.ts | 5 - 17 files changed, 528 insertions(+), 343 deletions(-) create mode 100644 src/contexts/mixins/auth-context.ts create mode 100644 src/contexts/mixins/devices-context.ts create mode 100644 src/contexts/mixins/keybindings-context.ts create mode 100644 src/contexts/mixins/languages-context.ts create mode 100644 src/contexts/mixins/proxy-context.ts create mode 100644 src/contexts/mixins/recording-state-context.ts create mode 100644 src/contexts/mixins/types.ts create mode 100644 src/contexts/root-context.ts diff --git a/biome.json b/biome.json index b26482a..1dcf729 100644 --- a/biome.json +++ b/biome.json @@ -70,6 +70,19 @@ } } } + }, + { + "includes": ["src/contexts/mixins/**/*.ts"], + "linter": { + "rules": { + "correctness": { + "noUnusedPrivateClassMembers": "off" + }, + "suspicious": { + "noExplicitAny": "off" + } + } + } } ], "vcs": { diff --git a/src/components/device-selector.ts b/src/components/device-selector.ts index a7ee8ec..d9eac30 100644 --- a/src/components/device-selector.ts +++ b/src/components/device-selector.ts @@ -4,7 +4,7 @@ import { customElement, property, state } from "lit/decorators.js"; import { devicesContext, selectedDeviceContext, -} from "../contexts/dictation-context.js"; +} from "../contexts/mixins/devices-context.js"; import SelectStyles from "../styles/select.js"; import { recordingDevicesChangedEvent } from "../utils/events.js"; diff --git a/src/components/keybinding-input.ts b/src/components/keybinding-input.ts index d6185b1..0fe0a60 100644 --- a/src/components/keybinding-input.ts +++ b/src/components/keybinding-input.ts @@ -4,7 +4,7 @@ import { customElement, property, state } from "lit/decorators.js"; import { pushToTalkKeybindingContext, toggleToTalkKeybindingContext, -} from "../contexts/dictation-context.js"; +} from "../contexts/mixins/keybindings-context.js"; import KeybindingSelectorStyles from "../styles/keybinding-selector.js"; import { keybindingChangedEvent } from "../utils/events.js"; import { normalizeKeybinding } from "../utils/keybinding.js"; diff --git a/src/components/keybinding-selector.ts b/src/components/keybinding-selector.ts index 327346e..2514ab9 100644 --- a/src/components/keybinding-selector.ts +++ b/src/components/keybinding-selector.ts @@ -4,7 +4,7 @@ import { customElement, property, state } from "lit/decorators.js"; import { pushToTalkKeybindingContext, toggleToTalkKeybindingContext, -} from "../contexts/dictation-context.js"; +} from "../contexts/mixins/keybindings-context.js"; import KeybindingSelectorStyles from "../styles/keybinding-selector.js"; import "./keybinding-input.js"; diff --git a/src/components/language-selector.ts b/src/components/language-selector.ts index 72eb49c..348cc76 100644 --- a/src/components/language-selector.ts +++ b/src/components/language-selector.ts @@ -2,10 +2,8 @@ import type { Corti } from "@corti/sdk"; import { consume } from "@lit/context"; import { html, LitElement } from "lit"; import { customElement, property, state } from "lit/decorators.js"; -import { - dictationConfigContext, - languagesContext, -} from "../contexts/dictation-context.js"; +import { dictationConfigContext } from "../contexts/dictation-context.js"; +import { languagesContext } from "../contexts/mixins/languages-context.js"; import SelectStyles from "../styles/select.js"; import { languageChangedEvent, diff --git a/src/components/recording-button-base.ts b/src/components/recording-button-base.ts index 434c66b..1630862 100644 --- a/src/components/recording-button-base.ts +++ b/src/components/recording-button-base.ts @@ -8,19 +8,23 @@ import { } from "lit"; import { property, state } from "lit/decorators.js"; import { AUDIO_CHUNK_INTERVAL_MS } from "../constants.js"; +import { debugDisplayAudioContext } from "../contexts/dictation-context.js"; import { accessTokenContext, authConfigContext, - debugDisplayAudioContext, - pushToTalkKeybindingContext, - recordingStateContext, regionContext, - selectedDeviceContext, - socketProxyContext, - socketUrlContext, tenantNameContext, +} from "../contexts/mixins/auth-context.js"; +import { selectedDeviceContext } from "../contexts/mixins/devices-context.js"; +import { + pushToTalkKeybindingContext, toggleToTalkKeybindingContext, -} from "../contexts/dictation-context.js"; +} from "../contexts/mixins/keybindings-context.js"; +import { + socketProxyContext, + socketUrlContext, +} from "../contexts/mixins/proxy-context.js"; +import { recordingStateContext } from "../contexts/mixins/recording-state-context.js"; import type { TranscribeMessage } from "../controllers/dictation-controller.js"; import { KeybindingController } from "../controllers/keybinding-controller.js"; import { MediaController } from "../controllers/media-controller.js"; @@ -114,6 +118,7 @@ export abstract class RecordingButtonBase< protected abstract _getConnectConfig(): TConfig; #mediaController = new MediaController(this); + // biome-ignore lint/correctness/noUnusedPrivateClassMembers: Controller self-registers in constructor (addController). #keybindingController = new KeybindingController(this); #closeConnectionOnInit = false; #processing = false; diff --git a/src/components/settings-menu.ts b/src/components/settings-menu.ts index 0d105aa..a168b7f 100644 --- a/src/components/settings-menu.ts +++ b/src/components/settings-menu.ts @@ -1,7 +1,7 @@ import { consume } from "@lit/context"; import { type CSSResultGroup, html, LitElement, nothing } from "lit"; import { customElement, property, state } from "lit/decorators.js"; -import { recordingStateContext } from "../contexts/dictation-context.js"; +import { recordingStateContext } from "../contexts/mixins/recording-state-context.js"; import ButtonStyles from "../styles/buttons.js"; import CalloutStyles from "../styles/callout.js"; import SettingsMenuStyles from "../styles/settings-menu.js"; diff --git a/src/contexts/dictation-context.ts b/src/contexts/dictation-context.ts index a64b09e..9c5045c 100644 --- a/src/contexts/dictation-context.ts +++ b/src/contexts/dictation-context.ts @@ -1,355 +1,43 @@ -import type { Corti, CortiAuth } from "@corti/sdk"; -import { type ContextEvent, createContext, provide } from "@lit/context"; -import { type CSSResultGroup, html, LitElement } from "lit"; -import { customElement, property, state } from "lit/decorators.js"; -import { DevicesController } from "../controllers/devices-controller.js"; -import { LanguagesController } from "../controllers/languages-controller.js"; -import ComponentStyles from "../styles/component-styles.js"; -import type { ProxyOptions, RecordingState } from "../types.js"; -import { getInitialToken } from "../utils/auth.js"; -import { commaSeparatedConverter } from "../utils/converters.js"; -import { - errorEvent, - type KeybindingChangedEventDetail, - keybindingChangedEvent, -} from "../utils/events.js"; -import { decodeToken } from "../utils/token.js"; +import type { Corti } from "@corti/sdk"; +import { createContext, provide } from "@lit/context"; +import { customElement, property } from "lit/decorators.js"; +import { RootContext } from "./root-context.js"; -export const regionContext = createContext( - Symbol("region"), -); -export const tenantNameContext = createContext( - Symbol("tenantName"), -); -export const languagesContext = createContext< - Corti.TranscribeSupportedLanguage[] | undefined ->(Symbol("languages")); -export const devicesContext = createContext( - Symbol("devices"), -); -export const selectedDeviceContext = createContext( - Symbol("selectedDevice"), -); -export const recordingStateContext = createContext( - Symbol("recordingState"), -); -export const accessTokenContext = createContext( - Symbol("accessToken"), -); export const dictationConfigContext = createContext< Corti.TranscribeConfig | undefined >(Symbol("dictationConfig")); -export const authConfigContext = createContext< - CortiAuth.AuthTokenDerivable | undefined ->(Symbol("authConfig")); -export const socketUrlContext = createContext( - Symbol("socketUrl"), -); -export const socketProxyContext = createContext( - Symbol("socketProxy"), -); export const debugDisplayAudioContext = createContext( Symbol("debugDisplayAudio"), ); -export const pushToTalkKeybindingContext = createContext< - string | null | undefined ->(Symbol("pushToTalkKeybinding")); -export const toggleToTalkKeybindingContext = createContext< - string | null | undefined ->(Symbol("toggleToTalkKeybinding")); - @customElement("dictation-root") -export class DictationRoot extends LitElement { - // ───────────────────────────────────────────────────────────────────────────── - // Context state - // ───────────────────────────────────────────────────────────────────────────── - - @provide({ context: regionContext }) - @state() - region?: string; - - @provide({ context: tenantNameContext }) - @state() - tenantName?: string; - - @provide({ context: recordingStateContext }) - @state() - recordingState: RecordingState = "stopped"; - +export class DictationRoot extends RootContext { // ───────────────────────────────────────────────────────────────────────────── // Properties // ───────────────────────────────────────────────────────────────────────────── - @provide({ context: accessTokenContext }) - @state() - _accessToken?: string; - - @property({ type: String }) - set accessToken(token: string | undefined) { - this.setAccessToken(token); - } - - get accessToken(): string | undefined { - return this._accessToken; - } - - @provide({ context: authConfigContext }) - @state() - _authConfig?: CortiAuth.AuthTokenDerivable; - - @property({ attribute: false, type: Object }) - set authConfig(config: CortiAuth.AuthTokenDerivable | undefined) { - this.setAuthConfig(config); - } - - get authConfig(): CortiAuth.AuthTokenDerivable | undefined { - return this._authConfig; - } - - @provide({ context: socketUrlContext }) - @property({ type: String }) - socketUrl?: string; - - @provide({ context: socketProxyContext }) - @property({ attribute: false, type: Object }) - socketProxy?: ProxyOptions; - @provide({ context: dictationConfigContext }) @property({ attribute: false, type: Object }) dictationConfig?: Corti.TranscribeConfig; - #languagesController = new LanguagesController(this); - #devicesController = new DevicesController(this); - - @provide({ context: languagesContext }) - @state() - _languages?: Corti.TranscribeSupportedLanguage[]; - - @property({ - converter: commaSeparatedConverter, - type: Array, - }) - set languages(value: Corti.TranscribeSupportedLanguage[] | undefined) { - this._languages = value; - - // Clear auto-loaded flag when languages are set via property - if (value !== undefined) { - this.#languagesController.clearAutoLoadedFlag(); - } - } - - get languages(): Corti.TranscribeSupportedLanguage[] | undefined { - return this._languages; - } - - @provide({ context: devicesContext }) - @state() - _devices?: MediaDeviceInfo[]; - - @property({ attribute: false, type: Array }) - set devices(value: MediaDeviceInfo[] | undefined) { - this._devices = value; - - // Clear auto-loaded flag when devices are set via property - if (value !== undefined) { - this.#devicesController.clearAutoLoadedFlag(); - } - } - - get devices(): MediaDeviceInfo[] | undefined { - return this._devices; - } - - @provide({ context: selectedDeviceContext }) - @property({ attribute: false, type: Object }) - selectedDevice?: MediaDeviceInfo; - @provide({ context: debugDisplayAudioContext }) @property({ attribute: "debug-display-audio", type: Boolean }) debug_displayAudio?: boolean; - @provide({ context: pushToTalkKeybindingContext }) - @property({ type: String }) - pushToTalkKeybinding?: string | null; - - @provide({ context: toggleToTalkKeybindingContext }) - @property({ type: String }) - toggleToTalkKeybinding?: string | null; - - @property({ type: Boolean }) - noWrapper: boolean = false; - - // ───────────────────────────────────────────────────────────────────────────── - // Static - // ───────────────────────────────────────────────────────────────────────────── - - static styles: CSSResultGroup = [ComponentStyles]; - // ───────────────────────────────────────────────────────────────────────────── // Lifecycle // ───────────────────────────────────────────────────────────────────────────── constructor() { super(); - this.addEventListener("languages-changed", this.#handleLanguageChanged); - this.addEventListener( - "recording-devices-changed", - this.#handleDeviceChanged, - ); - this.addEventListener( - "recording-state-changed", - this.#handleRecordingStateChanged, - ); - this.addEventListener("context-request", this.#handleContextRequest); - this.addEventListener("keybinding-changed", this.#handleKeybindingChanged); - } - - // ───────────────────────────────────────────────────────────────────────────── - // Public methods - // ───────────────────────────────────────────────────────────────────────────── - - /** - * Sets the access token and parses region/tenant from it. - * @returns ServerConfig with environment, tenant, and accessToken - * @deprecated Use 'accessToken' property instead. - */ - public setAccessToken(token: string | undefined) { - this._accessToken = token; - this.region = undefined; - this.tenantName = undefined; - - if (!token) { - return { accessToken: token, environment: undefined, tenant: undefined }; - } - try { - const decoded = decodeToken(token); + this.addEventListener("languages-changed", (e: Event) => { + const event = e as CustomEvent; - this.region = decoded?.environment; - this.tenantName = decoded?.tenant; - - return { - accessToken: token, - environment: decoded?.environment, - tenant: decoded?.tenant, + this.dictationConfig = { + ...this.dictationConfig, + primaryLanguage: event.detail.selectedLanguage ?? "en", }; - } catch (error) { - this.dispatchEvent(errorEvent(error)); - } - - return { accessToken: token, environment: undefined, tenant: undefined }; - } - - /** - * Sets the auth config and parses region/tenant from the initial token. - * @returns Promise with ServerConfig containing environment, tenant, and accessToken - * @deprecated Use 'authConfig' property instead. - */ - public async setAuthConfig(config?: CortiAuth.AuthTokenDerivable) { - this._authConfig = config; - - if (!config) { - return { - accessToken: undefined, - environment: undefined, - tenant: undefined, - }; - } - - try { - const { accessToken } = await getInitialToken(config); - - return this.setAccessToken(accessToken); - } catch (error) { - this.dispatchEvent(errorEvent(error)); - } - - return { - accessToken: undefined, - environment: undefined, - tenant: undefined, - }; - } - - // ───────────────────────────────────────────────────────────────────────────── - // Private event handlers - // ───────────────────────────────────────────────────────────────────────────── - - #handleLanguageChanged = (e: Event) => { - const event = e as CustomEvent; - - this.dictationConfig = { - ...this.dictationConfig, - primaryLanguage: event.detail.selectedLanguage, - }; - }; - - #handleDeviceChanged = (e: Event) => { - const event = e as CustomEvent; - - this.selectedDevice = event.detail.selectedDevice; - }; - - #handleRecordingStateChanged = (e: Event) => { - const event = e as CustomEvent; - - this.recordingState = event.detail.state; - }; - - #handleContextRequest = (e: ContextEvent) => { - if (e.context === languagesContext) { - this.#languagesController.initialize(); - } else if (e.context === devicesContext) { - this.#devicesController.initialize(); - } else if ( - e.contextTarget.tagName.toLowerCase() === "dictation-keybinding-selector" - ) { - if ( - e.context === pushToTalkKeybindingContext && - this.pushToTalkKeybinding === undefined - ) { - this.pushToTalkKeybinding = "Space"; - this.dispatchEvent( - keybindingChangedEvent(" ", "Space", "Space", "push-to-talk"), - ); - } - - if ( - e.context === toggleToTalkKeybindingContext && - this.toggleToTalkKeybinding === undefined - ) { - this.toggleToTalkKeybinding = "Enter"; - this.dispatchEvent( - keybindingChangedEvent("Enter", "Enter", "Enter", "toggle-to-talk"), - ); - } - } - }; - - #handleKeybindingChanged = (e: Event) => { - const event = e as CustomEvent; - - const keybinding = event.detail.keybinding; - - if (event.detail.type === "push-to-talk") { - this.pushToTalkKeybinding = keybinding; - } else if (event.detail.type === "toggle-to-talk") { - this.toggleToTalkKeybinding = keybinding; - } - }; - - // ───────────────────────────────────────────────────────────────────────────── - // Render - // ───────────────────────────────────────────────────────────────────────────── - - render() { - if (this.noWrapper) { - return html``; - } - - return html`
- -
`; + }); } } diff --git a/src/contexts/mixins/auth-context.ts b/src/contexts/mixins/auth-context.ts new file mode 100644 index 0000000..2586819 --- /dev/null +++ b/src/contexts/mixins/auth-context.ts @@ -0,0 +1,159 @@ +import type { CortiAuth } from "@corti/sdk"; +import { createContext, provide } from "@lit/context"; +import type { LitElement } from "lit"; +import { property, state } from "lit/decorators.js"; +import { getInitialToken } from "../../utils/auth.js"; +import { errorEvent } from "../../utils/events.js"; +import { decodeToken } from "../../utils/token.js"; +import type { Constructor } from "./types.js"; + +export const regionContext = createContext( + Symbol("region"), +); +export const tenantNameContext = createContext( + Symbol("tenantName"), +); +export const accessTokenContext = createContext( + Symbol("accessToken"), +); +export const authConfigContext = createContext< + CortiAuth.AuthTokenDerivable | undefined +>(Symbol("authConfig")); + +export declare class AuthContextInterface { + region?: string; + tenantName?: string; + accessToken?: string; + authConfig?: CortiAuth.AuthTokenDerivable | undefined; + setAccessToken(token: string | undefined): { + accessToken: string | undefined; + environment: string | undefined; + tenant: string | undefined; + }; + setAuthConfig(config?: CortiAuth.AuthTokenDerivable): Promise<{ + accessToken: string | undefined; + environment: string | undefined; + tenant: string | undefined; + }>; +} + +export function AuthContextMixin>( + superclass: T, +): Constructor & T { + class AuthContextMixinClass extends superclass { + // ───────────────────────────────────────────────────────────────────────────── + // Context state + // ───────────────────────────────────────────────────────────────────────────── + + @provide({ context: regionContext }) + @state() + region?: string; + + @provide({ context: tenantNameContext }) + @state() + tenantName?: string; + + // ───────────────────────────────────────────────────────────────────────────── + // Properties + // ───────────────────────────────────────────────────────────────────────────── + + @provide({ context: accessTokenContext }) + @state() + _accessToken?: string; + + @property({ type: String }) + set accessToken(token: string | undefined) { + this.setAccessToken(token); + } + + get accessToken(): string | undefined { + return this._accessToken; + } + + @provide({ context: authConfigContext }) + @state() + _authConfig?: CortiAuth.AuthTokenDerivable; + + @property({ attribute: false, type: Object }) + set authConfig(config: CortiAuth.AuthTokenDerivable | undefined) { + this.setAuthConfig(config); + } + + get authConfig(): CortiAuth.AuthTokenDerivable | undefined { + return this._authConfig; + } + + // ───────────────────────────────────────────────────────────────────────────── + // Public methods + // ───────────────────────────────────────────────────────────────────────────── + + /** + * Sets the access token and parses region/tenant from it. + * @returns ServerConfig with environment, tenant, and accessToken + * @deprecated Use 'accessToken' property instead. + */ + public setAccessToken(token: string | undefined) { + this._accessToken = token; + this.region = undefined; + this.tenantName = undefined; + + if (!token) { + return { + accessToken: token, + environment: undefined, + tenant: undefined, + }; + } + + try { + const decoded = decodeToken(token); + + this.region = decoded?.environment; + this.tenantName = decoded?.tenant; + + return { + accessToken: token, + environment: decoded?.environment, + tenant: decoded?.tenant, + }; + } catch (error) { + this.dispatchEvent(errorEvent(error)); + } + + return { accessToken: token, environment: undefined, tenant: undefined }; + } + + /** + * Sets the auth config and parses region/tenant from the initial token. + * @returns Promise with ServerConfig containing environment, tenant, and accessToken + * @deprecated Use 'authConfig' property instead. + */ + public async setAuthConfig(config?: CortiAuth.AuthTokenDerivable) { + this._authConfig = config; + + if (!config) { + return { + accessToken: undefined, + environment: undefined, + tenant: undefined, + }; + } + + try { + const { accessToken } = await getInitialToken(config); + + return this.setAccessToken(accessToken); + } catch (error) { + this.dispatchEvent(errorEvent(error)); + } + + return { + accessToken: undefined, + environment: undefined, + tenant: undefined, + }; + } + } + + return AuthContextMixinClass as Constructor & T; +} diff --git a/src/contexts/mixins/devices-context.ts b/src/contexts/mixins/devices-context.ts new file mode 100644 index 0000000..5c2fe79 --- /dev/null +++ b/src/contexts/mixins/devices-context.ts @@ -0,0 +1,66 @@ +import { type ContextEvent, createContext, provide } from "@lit/context"; +import type { LitElement } from "lit"; +import { property, state } from "lit/decorators.js"; +import { DevicesController } from "../../controllers/devices-controller.js"; +import type { Constructor } from "./types.js"; + +export const devicesContext = createContext( + Symbol("devices"), +); + +export const selectedDeviceContext = createContext( + Symbol("selectedDevice"), +); + +export declare class DevicesContextInterface { + _devices?: MediaDeviceInfo[]; + devices?: MediaDeviceInfo[]; + selectedDevice?: MediaDeviceInfo; +} + +export function DevicesContextMixin>( + superclass: T, +): Constructor & T { + class DevicesContextMixinClass extends superclass { + #devicesController = new DevicesController(this); + + @provide({ context: devicesContext }) + @state() + _devices?: MediaDeviceInfo[]; + + @property({ attribute: false, type: Array }) + set devices(value: MediaDeviceInfo[] | undefined) { + this._devices = value; + + // Clear auto-loaded flag when devices are set via property + if (value !== undefined) { + this.#devicesController.clearAutoLoadedFlag(); + } + } + + get devices(): MediaDeviceInfo[] | undefined { + return this._devices; + } + + @provide({ context: selectedDeviceContext }) + @property({ attribute: false, type: Object }) + selectedDevice?: MediaDeviceInfo; + + constructor(...args: any[]) { + super(...args); + + this.addEventListener("recording-devices-changed", (e: Event) => { + const event = e as CustomEvent; + + this.selectedDevice = event.detail.selectedDevice; + }); + this.addEventListener("context-request", (ev: ContextEvent) => { + if (ev.context === devicesContext) { + this.#devicesController.initialize(); + } + }); + } + } + + return DevicesContextMixinClass as Constructor & T; +} diff --git a/src/contexts/mixins/keybindings-context.ts b/src/contexts/mixins/keybindings-context.ts new file mode 100644 index 0000000..9097aa5 --- /dev/null +++ b/src/contexts/mixins/keybindings-context.ts @@ -0,0 +1,87 @@ +import { type ContextEvent, createContext, provide } from "@lit/context"; +import type { LitElement } from "lit"; +import { property } from "lit/decorators.js"; +import { + type KeybindingChangedEventDetail, + keybindingChangedEvent, +} from "../../utils/events.js"; +import type { Constructor } from "./types.js"; + +export const pushToTalkKeybindingContext = createContext< + string | null | undefined +>(Symbol("pushToTalkKeybinding")); + +export const toggleToTalkKeybindingContext = createContext< + string | null | undefined +>(Symbol("toggleToTalkKeybinding")); + +export declare class KeybindingsContextInterface { + pushToTalkKeybinding?: string | null; + toggleToTalkKeybinding?: string | null; +} + +export function KeybindingsContextMixin>( + superclass: T, +): Constructor & T { + class KeybindingsContextMixinClass extends superclass { + @provide({ context: pushToTalkKeybindingContext }) + @property({ type: String }) + pushToTalkKeybinding?: string | null; + + @provide({ context: toggleToTalkKeybindingContext }) + @property({ type: String }) + toggleToTalkKeybinding?: string | null; + + constructor(...args: any[]) { + super(...args); + + this.addEventListener( + "keybinding-changed", + this.#handleKeybindingChanged, + ); + this.addEventListener("context-request", this.#handleContextRequest); + } + + #handleContextRequest = (e: ContextEvent) => { + if ( + e.contextTarget.tagName.toLowerCase() === + "dictation-keybinding-selector" + ) { + if ( + e.context === pushToTalkKeybindingContext && + this.pushToTalkKeybinding === undefined + ) { + this.pushToTalkKeybinding = "Space"; + this.dispatchEvent( + keybindingChangedEvent(" ", "Space", "Space", "push-to-talk"), + ); + } + + if ( + e.context === toggleToTalkKeybindingContext && + this.toggleToTalkKeybinding === undefined + ) { + this.toggleToTalkKeybinding = "Enter"; + this.dispatchEvent( + keybindingChangedEvent("Enter", "Enter", "Enter", "toggle-to-talk"), + ); + } + } + }; + + #handleKeybindingChanged = (e: Event) => { + const event = e as CustomEvent; + + const keybinding = event.detail.keybinding; + + if (event.detail.type === "push-to-talk") { + this.pushToTalkKeybinding = keybinding; + } else if (event.detail.type === "toggle-to-talk") { + this.toggleToTalkKeybinding = keybinding; + } + }; + } + + return KeybindingsContextMixinClass as Constructor & + T; +} diff --git a/src/contexts/mixins/languages-context.ts b/src/contexts/mixins/languages-context.ts new file mode 100644 index 0000000..8293ab9 --- /dev/null +++ b/src/contexts/mixins/languages-context.ts @@ -0,0 +1,60 @@ +import type { Corti } from "@corti/sdk"; +import { type ContextEvent, createContext, provide } from "@lit/context"; +import type { LitElement } from "lit"; +import { property, state } from "lit/decorators.js"; +import { LanguagesController } from "../../controllers/languages-controller.js"; +import { commaSeparatedConverter } from "../../utils/converters.js"; +import type { Constructor } from "./types.js"; + +export const languagesContext = createContext< + Corti.TranscribeSupportedLanguage[] | undefined +>(Symbol("languages")); + +export declare class LanguagesContextInterface { + _languages?: Corti.TranscribeSupportedLanguage[]; + languages?: Corti.TranscribeSupportedLanguage[]; +} + +export function LanguagesContextMixin>( + superclass: T, +): Constructor & T { + class LanguagesContextMixinClass extends superclass { + #languagesController = new LanguagesController(this); + + @provide({ context: languagesContext }) + @state() + _languages?: Corti.TranscribeSupportedLanguage[]; + + @property({ + converter: commaSeparatedConverter, + type: Array, + }) + set languages(value: Corti.TranscribeSupportedLanguage[] | undefined) { + this._languages = value; + + // Clear auto-loaded flag when languages are set via property + if (value !== undefined) { + this.#languagesController.clearAutoLoadedFlag(); + } + } + + get languages(): Corti.TranscribeSupportedLanguage[] | undefined { + return this._languages; + } + + constructor(...args: any[]) { + super(...args); + + this.addEventListener("context-request", (e: Event) => { + const ev = e as ContextEvent; + + if (ev.context === languagesContext) { + this.#languagesController.initialize(); + } + }); + } + } + + return LanguagesContextMixinClass as Constructor & + T; +} diff --git a/src/contexts/mixins/proxy-context.ts b/src/contexts/mixins/proxy-context.ts new file mode 100644 index 0000000..1ba8dd4 --- /dev/null +++ b/src/contexts/mixins/proxy-context.ts @@ -0,0 +1,37 @@ +import { createContext, provide } from "@lit/context"; +import type { LitElement } from "lit"; +import { property } from "lit/decorators.js"; +import type { ProxyOptions } from "../../types.js"; +import type { Constructor } from "./types.js"; + +export const socketUrlContext = createContext( + Symbol("socketUrl"), +); +export const socketProxyContext = createContext( + Symbol("socketProxy"), +); + +export declare class ProxyContextInterface { + socketUrl?: string; + socketProxy?: ProxyOptions; +} + +export function ProxyContextMixin>( + superclass: T, +): Constructor & T { + class ProxyContextMixinClass extends superclass { + // ───────────────────────────────────────────────────────────────────────────── + // Properties + // ───────────────────────────────────────────────────────────────────────────── + + @provide({ context: socketUrlContext }) + @property({ type: String }) + socketUrl?: string; + + @provide({ context: socketProxyContext }) + @property({ attribute: false, type: Object }) + socketProxy?: ProxyOptions; + } + + return ProxyContextMixinClass as Constructor & T; +} diff --git a/src/contexts/mixins/recording-state-context.ts b/src/contexts/mixins/recording-state-context.ts new file mode 100644 index 0000000..3f42b5b --- /dev/null +++ b/src/contexts/mixins/recording-state-context.ts @@ -0,0 +1,40 @@ +import { createContext, provide } from "@lit/context"; +import type { LitElement } from "lit"; +import { state } from "lit/decorators.js"; +import type { RecordingState } from "../../types.js"; +import type { Constructor } from "./types.js"; + +/** + * Lit context and mixin for recording UI state (`stopped`, `recording`, …). + */ + +export const recordingStateContext = createContext( + Symbol("recordingState"), +); + +export declare class RecordingStateContextInterface { + recordingState: RecordingState; +} + +export function RecordingStateContextMixin>( + superclass: T, +): Constructor & T { + class RecordingStateContextMixinClass extends superclass { + @provide({ context: recordingStateContext }) + @state() + recordingState: RecordingState = "stopped"; + + constructor(...args: any[]) { + super(...args); + + this.addEventListener("recording-state-changed", (e: Event) => { + const event = e as CustomEvent<{ state: RecordingState }>; + + this.recordingState = event.detail.state; + }); + } + } + + return RecordingStateContextMixinClass as Constructor & + T; +} diff --git a/src/contexts/mixins/types.ts b/src/contexts/mixins/types.ts new file mode 100644 index 0000000..752d4e9 --- /dev/null +++ b/src/contexts/mixins/types.ts @@ -0,0 +1,5 @@ +/** + * Constructor signature for Lit class mixins + * (https://lit.dev/docs/composition/mixins/). + */ +export type Constructor = new (...args: any[]) => T; diff --git a/src/contexts/root-context.ts b/src/contexts/root-context.ts new file mode 100644 index 0000000..a98c5c4 --- /dev/null +++ b/src/contexts/root-context.ts @@ -0,0 +1,32 @@ +import { type CSSResultGroup, html, LitElement } from "lit"; +import { property } from "lit/decorators.js"; +import ComponentStyles from "../styles/component-styles.js"; +import { AuthContextMixin } from "./mixins/auth-context.js"; +import { DevicesContextMixin } from "./mixins/devices-context.js"; +import { KeybindingsContextMixin } from "./mixins/keybindings-context.js"; +import { LanguagesContextMixin } from "./mixins/languages-context.js"; +import { ProxyContextMixin } from "./mixins/proxy-context.js"; +import { RecordingStateContextMixin } from "./mixins/recording-state-context.js"; + +export class RootContext extends DevicesContextMixin( + RecordingStateContextMixin( + KeybindingsContextMixin( + LanguagesContextMixin(AuthContextMixin(ProxyContextMixin(LitElement))), + ), + ), +) { + @property({ type: Boolean }) + noWrapper: boolean = false; + + static styles: CSSResultGroup = [ComponentStyles]; + + render() { + if (this.noWrapper) { + return html``; + } + + return html`
+ +
`; + } +} diff --git a/src/controllers/languages-controller.ts b/src/controllers/languages-controller.ts index 85aa93a..e28e5c2 100644 --- a/src/controllers/languages-controller.ts +++ b/src/controllers/languages-controller.ts @@ -75,11 +75,6 @@ export class LanguagesController implements ReactiveController { ? previousLanguage : defaultLanguage; - this.host.dictationConfig = { - ...this.host.dictationConfig, - primaryLanguage: selectedLanguage || "en", - }; - this.host.requestUpdate(); this.host.dispatchEvent( languagesChangedEvent(languages, selectedLanguage), From a82092ebc039046fb11e58a6eef59a3f991b6a04 Mon Sep 17 00:00:00 2001 From: markitosha Date: Tue, 12 May 2026 13:30:34 +0200 Subject: [PATCH 05/50] feat: enhance ambient recording button with interaction ID handling and error management --- src/components/ambient-recording-button.ts | 53 ++++++++- src/contexts/ambient-context.ts | 54 +++++++++ stories/ambient-root.stories.ts | 121 +++++++++++++++++++++ 3 files changed, 223 insertions(+), 5 deletions(-) create mode 100644 src/contexts/ambient-context.ts create mode 100644 stories/ambient-root.stories.ts diff --git a/src/components/ambient-recording-button.ts b/src/components/ambient-recording-button.ts index fc7f2e0..f56bb68 100644 --- a/src/components/ambient-recording-button.ts +++ b/src/components/ambient-recording-button.ts @@ -1,28 +1,71 @@ -import { customElement, property } from "lit/decorators.js"; +import type { Corti } from "@corti/sdk"; +import { consume } from "@lit/context"; +import { customElement, state } from "lit/decorators.js"; import { DEFAULT_STREAM_CONFIG } from "../constants.js"; +import { + ambientConfigContext, + interactionIdContext, +} from "../contexts/ambient-context.js"; import { AmbientController, type AmbientStreamSessionConfig, type StreamAmbientMessage, } from "../controllers/ambient-controller.js"; +import { errorEvent } from "../utils/events.js"; import { RecordingButtonBase } from "./recording-button-base.js"; +const interactionIdRequiredError = () => + new Error("interactionId is required. Set interactionId on ambient-root."); + @customElement("ambient-recording-button") export class AmbientRecordingButton extends RecordingButtonBase< AmbientStreamSessionConfig, StreamAmbientMessage > { - @property({ attribute: "interaction-id", type: String }) - interactionId: string = "9254ec9b-70e6-45d1-bacb-63d6cce19e86"; + @consume({ context: ambientConfigContext, subscribe: true }) + @state() + private _ambientConfig?: Corti.StreamConfig; + + @consume({ context: interactionIdContext, subscribe: true }) + @state() + private _interactionId?: string; protected _socketController = new AmbientController(this); + public override startRecording(): void { + if (!this.#trimmedInteractionId()) { + this.dispatchEvent(errorEvent(interactionIdRequiredError())); + return; + } + + super.startRecording(); + } + + public override async openConnection(): Promise { + if (!this.#trimmedInteractionId()) { + this.dispatchEvent(errorEvent(interactionIdRequiredError())); + return; + } + + await super.openConnection(); + } + protected _getConnectConfig(): AmbientStreamSessionConfig { + const interactionId = this.#trimmedInteractionId(); + + if (!interactionId) { + throw interactionIdRequiredError(); + } + return { - configuration: DEFAULT_STREAM_CONFIG, - interactionId: this.interactionId, + configuration: this._ambientConfig ?? DEFAULT_STREAM_CONFIG, + interactionId, }; } + + #trimmedInteractionId(): string | undefined { + return this._interactionId?.trim(); + } } declare global { diff --git a/src/contexts/ambient-context.ts b/src/contexts/ambient-context.ts new file mode 100644 index 0000000..e8ef544 --- /dev/null +++ b/src/contexts/ambient-context.ts @@ -0,0 +1,54 @@ +import type { Corti } from "@corti/sdk"; +import { createContext, provide } from "@lit/context"; +import { customElement, property } from "lit/decorators.js"; +import { DEFAULT_STREAM_CONFIG } from "../constants.js"; +import { RootContext } from "./root-context.js"; + +export const ambientConfigContext = createContext< + Corti.StreamConfig | undefined +>(Symbol("ambientConfig")); + +export const interactionIdContext = createContext( + Symbol("interactionId"), +); + +@customElement("ambient-root") +export class AmbientRoot extends RootContext { + @provide({ context: ambientConfigContext }) + @property({ attribute: false, type: Object }) + ambientConfig: Corti.StreamConfig = DEFAULT_STREAM_CONFIG; + + @provide({ context: interactionIdContext }) + @property({ type: String }) + interactionId?: string; + + constructor() { + super(); + + this.addEventListener("languages-changed", (e: Event) => { + const event = e as CustomEvent; + + const lang = (event.detail.selectedLanguage ?? + "en") as Corti.TranscribeSupportedLanguage; + const base = this.ambientConfig ?? DEFAULT_STREAM_CONFIG; + + this.ambientConfig = { + ...base, + mode: { + ...base.mode, + outputLocale: lang, + }, + transcription: { + ...base.transcription, + primaryLanguage: lang, + }, + }; + }); + } +} + +declare global { + interface HTMLElementTagNameMap { + "ambient-root": AmbientRoot; + } +} diff --git a/stories/ambient-root.stories.ts b/stories/ambient-root.stories.ts new file mode 100644 index 0000000..470460f --- /dev/null +++ b/stories/ambient-root.stories.ts @@ -0,0 +1,121 @@ +import type { Meta, StoryObj } from "@storybook/web-components-vite"; +import { html } from "lit"; +import { action } from "storybook/actions"; +import type { AmbientRecordingButton } from "../src/components/ambient-recording-button.js"; + +import "../src/components/ambient-recording-button.js"; +import "../src/components/audio-visualiser.js"; +import "../src/components/settings-menu.js"; +import type { DictationSettingsMenu } from "../src/components/settings-menu.js"; +import type { AmbientRoot } from "../src/contexts/ambient-context.js"; +import "../src/contexts/ambient-context.js"; + +type AmbientRootStory = DictationSettingsMenu & + Pick< + AmbientRoot, + | "accessToken" + | "interactionId" + | "recordingState" + | "pushToTalkKeybinding" + | "toggleToTalkKeybinding" + > & + Pick & { + noWrapper?: boolean; + }; + +const meta = { + args: { + accessToken: "dummy_token", + allowButtonFocus: false, + interactionId: "9254ec9b-70e6-45d1-bacb-63d6cce19e86", + noWrapper: false, + pushToTalkKeybinding: "Space", + recordingState: "stopped", + settingsEnabled: ["device", "language", "keybinding"], + toggleToTalkKeybinding: "`", + }, + argTypes: { + accessToken: { + control: "text", + description: + "JWT or bearer token for Corti API (decoded for region/tenant on the root)", + }, + allowButtonFocus: { + control: "boolean", + description: + "Whether the ambient recording button can receive focus when clicked", + }, + interactionId: { + control: "text", + description: + "Stream interaction id passed to Corti stream.connect for this session", + }, + noWrapper: { + control: "boolean", + description: + "When true, ambient-root renders only a slot (no padded wrapper div)", + }, + }, + component: "ambient-root", + parameters: { + docs: { + codePanel: true, + }, + }, + render: ({ + accessToken, + interactionId, + settingsEnabled, + recordingState, + pushToTalkKeybinding, + toggleToTalkKeybinding, + allowButtonFocus, + noWrapper, + }) => { + const token = accessToken?.trim() || undefined; + const interaction = interactionId?.trim() || undefined; + + return html` + + + + + `; + }, + title: "AmbientRoot", +} satisfies Meta; + +export default meta; + +export const Default = {} satisfies StoryObj; From e1ef9115eda4c30ab59afab13a6b042ec5bc34ef Mon Sep 17 00:00:00 2001 From: markitosha Date: Tue, 12 May 2026 14:34:54 +0200 Subject: [PATCH 06/50] refactor: simplify CortiDictation component by extending CortiRoot and removing unused properties --- src/components/corti-dictation.ts | 224 ++------------------------- src/components/corti-root.ts | 247 ++++++++++++++++++++++++++++++ 2 files changed, 259 insertions(+), 212 deletions(-) create mode 100644 src/components/corti-root.ts diff --git a/src/components/corti-dictation.ts b/src/components/corti-dictation.ts index f5bc43e..60edd6f 100644 --- a/src/components/corti-dictation.ts +++ b/src/components/corti-dictation.ts @@ -1,16 +1,11 @@ import type { Corti, CortiAuth } from "@corti/sdk"; -import { css, html, LitElement, nothing } from "lit"; +import { html, nothing } from "lit"; import { customElement, property, state } from "lit/decorators.js"; import { classMap } from "lit/directives/class-map.js"; -import { createRef, type Ref, ref } from "lit/directives/ref.js"; +import { ref } from "lit/directives/ref.js"; import { DEFAULT_DICTATION_CONFIG } from "../constants.js"; import type { DictationRoot } from "../contexts/dictation-context.js"; -import type { - ConfigurableSettings, - ProxyOptions, - RecordingState, -} from "../types.js"; -import { commaSeparatedConverter } from "../utils/converters.js"; +import { CortiRoot } from "./corti-root.js"; import type { DictationRecordingButton } from "./dictation-recording-button.js"; import "../contexts/dictation-context.js"; @@ -18,91 +13,14 @@ import "./dictation-recording-button.js"; import "./settings-menu.js"; @customElement("corti-dictation") -export class CortiDictation extends LitElement { - static styles = css` - .hidden { - display: none; - } - `; - // ───────────────────────────────────────────────────────────────────────────── - // Private refs - // ───────────────────────────────────────────────────────────────────────────── - - #recordingButtonRef: Ref = createRef(); - #contextProviderRef: Ref = createRef(); - +export class CortiDictation extends CortiRoot< + DictationRoot, + DictationRecordingButton +> { // ───────────────────────────────────────────────────────────────────────────── // Properties // ───────────────────────────────────────────────────────────────────────────── - /** - * Latest access token - */ - @property({ type: String }) - accessToken?: string; - - /** - * Authentication configuration with optional refresh mechanism. - */ - @property({ attribute: false, type: Object }) - authConfig?: CortiAuth.AuthTokenDerivable; - - /** - * WebSocket URL for proxy connection. When provided, uses CortiWebSocketProxyClient instead of CortiClient. - */ - @property({ type: String }) - socketUrl?: string; - - /** - * Socket proxy configuration object. When provided, uses CortiWebSocketProxyClient instead of CortiClient. - */ - @property({ attribute: false, type: Object }) - socketProxy?: ProxyOptions; - - /** - * List of all language codes available for use with the Web Component. - * Default list depends on the accessToken - */ - @property({ - converter: commaSeparatedConverter, - type: Array, - }) - set languagesSupported(value: - | Corti.TranscribeSupportedLanguage[] - | undefined) { - this._languagesSupported = value; - } - - get languagesSupported(): Corti.TranscribeSupportedLanguage[] { - return ( - this.#contextProviderRef.value?.languages || - this._languagesSupported || - [] - ); - } - - @state() - _languagesSupported?: Corti.TranscribeSupportedLanguage[]; - - /** - * Which settings should be available in the UI. - * If an empty array is passed, the settings will be disabled entirely. - * Options are language and devices - */ - @property({ - converter: commaSeparatedConverter, - type: Array, - }) - settingsEnabled: ConfigurableSettings[] = ["device", "language"]; - - /** - * When false (default), allows the start/stop button from taking focus when clicked, - * disabling textareas or other input elements to maintain focus. - * Set to "true" to allow the button to receive focus on click. - */ - @property({ type: Boolean }) - allowButtonFocus: boolean = false; - /** * Overrides any device selection and instead uses getDisplayMedia to stream system audio. * Should only be used for debugging. @@ -120,94 +38,13 @@ export class CortiDictation extends LitElement { get dictationConfig(): Corti.TranscribeConfig { return ( - this.#contextProviderRef.value?.dictationConfig || this._dictationConfig + this._contextProviderRef.value?.dictationConfig || this._dictationConfig ); } @state() _dictationConfig: Corti.TranscribeConfig = DEFAULT_DICTATION_CONFIG; - /** - * List of available recording devices - */ - @property({ attribute: false, type: Array }) - set devices(value: MediaDeviceInfo[] | undefined) { - this._devices = value; - } - - get devices(): MediaDeviceInfo[] { - return this.#contextProviderRef.value?.devices || this._devices || []; - } - - @state() - _devices?: MediaDeviceInfo[]; - - /** - * The selected device used for recording (MediaDeviceInfo). - */ - @property({ attribute: false, type: Object }) - set selectedDevice(value: MediaDeviceInfo | undefined) { - this._selectedDevice = value; - } - - get selectedDevice(): MediaDeviceInfo | undefined { - return ( - this.#contextProviderRef.value?.selectedDevice || this._selectedDevice - ); - } - - @state() - _selectedDevice?: MediaDeviceInfo; - - /** - * Current state of recording (stopped, recording, initializing and stopping, ). - */ - get recordingState(): RecordingState { - return this.#contextProviderRef.value?.recordingState || "stopped"; - } - - /** - * Push-to-talk keybinding for keyboard shortcut. Single key only (e.g., "Space", "k", "meta", "ctrl"). - * Combinations with "+" are not supported. - * Keydown starts recording, keyup stops recording. - * Defaults to "Space" if keybinding is in settingsEnabled, otherwise undefined - */ - @property({ type: String }) - set pushToTalkKeybinding(value: string | null | undefined) { - this._pushToTalkKeybinding = value; - } - - get pushToTalkKeybinding(): string | null | undefined { - return ( - this.#contextProviderRef.value?.pushToTalkKeybinding || - this._pushToTalkKeybinding - ); - } - - @state() - _pushToTalkKeybinding?: string | null; - - /** - * Toggle-to-talk keybinding for keyboard shortcut. Single key only (e.g., "`", "k", "meta", "ctrl"). - * Combinations with "+" are not supported. - * Pressing the key toggles recording on/off. - * Defaults to "`" if keybinding is in settingsEnabled, otherwise undefined - */ - @property({ type: String }) - set toggleToTalkKeybinding(value: string | null | undefined) { - this._toggleToTalkKeybinding = value; - } - - get toggleToTalkKeybinding(): string | null | undefined { - return ( - this.#contextProviderRef.value?.toggleToTalkKeybinding || - this._toggleToTalkKeybinding - ); - } - - @state() - _toggleToTalkKeybinding?: string | null; - // ───────────────────────────────────────────────────────────────────────────── // Public methods // ───────────────────────────────────────────────────────────────────────────── @@ -221,7 +58,7 @@ export class CortiDictation extends LitElement { this.accessToken = token; return ( - this.#contextProviderRef.value?.setAccessToken(token) ?? { + this._contextProviderRef.value?.setAccessToken(token) ?? { accessToken: token, environment: undefined, tenant: undefined, @@ -238,7 +75,7 @@ export class CortiDictation extends LitElement { this.authConfig = config; return ( - this.#contextProviderRef.value?.setAuthConfig(config) ?? { + this._contextProviderRef.value?.setAuthConfig(config) ?? { accessToken: undefined, environment: undefined, tenant: undefined, @@ -246,43 +83,6 @@ export class CortiDictation extends LitElement { ); } - /** - * Starts a recording. - */ - public startRecording(): void { - this.#recordingButtonRef.value?.startRecording(); - } - - /** - * Stops a recording. - */ - public stopRecording(): void { - this.#recordingButtonRef.value?.stopRecording(); - } - - /** - * Starts or stops recording. Convenience layer on top of the start/stop methods. - */ - public toggleRecording(): void { - this.#recordingButtonRef.value?.toggleRecording(); - } - - /** - * Opens the WebSocket connection without starting recording. - * Use this to pre-establish the connection before recording starts. - */ - public async openConnection(): Promise { - await this.#recordingButtonRef.value?.openConnection(); - } - - /** - * Closes the WebSocket connection by sending "end" and waiting for "ended". - * Call this to receive "usage" statistics or when done with the connection. - */ - public async closeConnection(): Promise { - await this.#recordingButtonRef.value?.closeConnection(); - } - // ───────────────────────────────────────────────────────────────────────────── // Render // ───────────────────────────────────────────────────────────────────────────── @@ -296,7 +96,7 @@ export class CortiDictation extends LitElement { return html` ${ diff --git a/src/components/corti-root.ts b/src/components/corti-root.ts new file mode 100644 index 0000000..2e2ed85 --- /dev/null +++ b/src/components/corti-root.ts @@ -0,0 +1,247 @@ +import type { Corti, CortiAuth } from "@corti/sdk"; +import { css, html, LitElement } from "lit"; +import { property, state } from "lit/decorators.js"; +import { createRef, type Ref } from "lit/directives/ref.js"; +import type { + ConfigurableSettings, + ProxyOptions, + RecordingState, +} from "../types.js"; +import { commaSeparatedConverter } from "../utils/converters.js"; + +type CortiProviderRoot = LitElement & { + recordingState?: RecordingState; + languages?: Corti.TranscribeSupportedLanguage[]; + devices?: MediaDeviceInfo[]; + selectedDevice?: MediaDeviceInfo | undefined; + pushToTalkKeybinding?: string | null | undefined; + toggleToTalkKeybinding?: string | null | undefined; +}; + +type CortiRecordingButtonHost = LitElement & { + startRecording(): void; + stopRecording(): void; + toggleRecording(): void; + openConnection(): Promise; + closeConnection(): Promise; +}; + +/** + * Shared base for all-in-one Corti host elements (e.g. corti-dictation). + * Intentionally minimal; shared behavior will move here incrementally. + */ +export class CortiRoot< + TRoot extends CortiProviderRoot = CortiProviderRoot, + TRecordingButton extends CortiRecordingButtonHost = CortiRecordingButtonHost, +> extends LitElement { + static styles = css` + .hidden { + display: none; + } + `; + + // ───────────────────────────────────────────────────────────────────────────── + // Properties + // ───────────────────────────────────────────────────────────────────────────── + + /** + * Latest access token + */ + @property({ type: String }) + accessToken?: string; + + /** + * Authentication configuration with optional refresh mechanism. + */ + @property({ attribute: false, type: Object }) + authConfig?: CortiAuth.AuthTokenDerivable; + + /** + * WebSocket URL for proxy connection. When provided, uses CortiWebSocketProxyClient instead of CortiClient. + */ + @property({ type: String }) + socketUrl?: string; + + /** + * Socket proxy configuration object. When provided, uses CortiWebSocketProxyClient instead of CortiClient. + */ + @property({ attribute: false, type: Object }) + socketProxy?: ProxyOptions; + + /** + * Which settings should be available in the UI. + * If an empty array is passed, the settings will be disabled entirely. + * Options are language and devices + */ + @property({ + converter: commaSeparatedConverter, + type: Array, + }) + settingsEnabled: ConfigurableSettings[] = ["device", "language"]; + + /** + * When false (default), allows the start/stop button from taking focus when clicked, + * disabling textareas or other input elements to maintain focus. + * Set to "true" to allow the button to receive focus on click. + */ + @property({ type: Boolean }) + allowButtonFocus: boolean = false; + + /** + * List of all language codes available for use with the Web Component. + * Default list depends on the accessToken + */ + @property({ + converter: commaSeparatedConverter, + type: Array, + }) + set languagesSupported(value: + | Corti.TranscribeSupportedLanguage[] + | undefined) { + this._languagesSupported = value; + } + + get languagesSupported(): Corti.TranscribeSupportedLanguage[] { + return ( + this._contextProviderRef.value?.languages || + this._languagesSupported || + [] + ); + } + + @state() + protected _languagesSupported?: Corti.TranscribeSupportedLanguage[]; + + /** + * List of available recording devices + */ + @property({ attribute: false, type: Array }) + set devices(value: MediaDeviceInfo[] | undefined) { + this._devices = value; + } + + get devices(): MediaDeviceInfo[] { + return this._contextProviderRef.value?.devices || this._devices || []; + } + + @state() + protected _devices?: MediaDeviceInfo[]; + + /** + * The selected device used for recording (MediaDeviceInfo). + */ + @property({ attribute: false, type: Object }) + set selectedDevice(value: MediaDeviceInfo | undefined) { + this._selectedDevice = value; + } + + get selectedDevice(): MediaDeviceInfo | undefined { + return ( + this._contextProviderRef.value?.selectedDevice || this._selectedDevice + ); + } + + @state() + protected _selectedDevice?: MediaDeviceInfo; + + /** + * Push-to-talk keybinding for keyboard shortcut. Single key only (e.g., "Space", "k", "meta", "ctrl"). + * Combinations with "+" are not supported. + * Keydown starts recording, keyup stops recording. + * Defaults to "Space" if keybinding is in settingsEnabled, otherwise undefined + */ + @property({ type: String }) + set pushToTalkKeybinding(value: string | null | undefined) { + this._pushToTalkKeybinding = value; + } + + get pushToTalkKeybinding(): string | null | undefined { + return ( + this._contextProviderRef.value?.pushToTalkKeybinding || + this._pushToTalkKeybinding + ); + } + + @state() + protected _pushToTalkKeybinding?: string | null; + + /** + * Toggle-to-talk keybinding for keyboard shortcut. Single key only (e.g., "`", "k", "meta", "ctrl"). + * Combinations with "+" are not supported. + * Pressing the key toggles recording on/off. + * Defaults to "`" if keybinding is in settingsEnabled, otherwise undefined + */ + @property({ type: String }) + set toggleToTalkKeybinding(value: string | null | undefined) { + this._toggleToTalkKeybinding = value; + } + + get toggleToTalkKeybinding(): string | null | undefined { + return ( + this._contextProviderRef.value?.toggleToTalkKeybinding || + this._toggleToTalkKeybinding + ); + } + + @state() + protected _toggleToTalkKeybinding?: string | null; + + protected _contextProviderRef: Ref = createRef(); + protected _recordingButtonRef: Ref = createRef(); + + // ───────────────────────────────────────────────────────────────────────────── + // Public methods + // ───────────────────────────────────────────────────────────────────────────── + + /** + * Current state of recording (stopped, recording, initializing and stopping, ). + */ + get recordingState(): RecordingState { + return this._contextProviderRef.value?.recordingState ?? "stopped"; + } + + /** + * Starts a recording. + */ + public startRecording(): void { + this._recordingButtonRef.value?.startRecording(); + } + + /** + * Stops a recording. + */ + public stopRecording(): void { + this._recordingButtonRef.value?.stopRecording(); + } + + /** + * Starts or stops recording. Convenience layer on top of the start/stop methods. + */ + public toggleRecording(): void { + this._recordingButtonRef.value?.toggleRecording(); + } + + /** + * Opens the WebSocket connection without starting recording. + * Use this to pre-establish the connection before recording starts. + */ + public async openConnection(): Promise { + await this._recordingButtonRef.value?.openConnection(); + } + + /** + * Closes the WebSocket connection by sending "end" and waiting for "ended". + * Call this to receive "usage" statistics or when done with the connection. + */ + public async closeConnection(): Promise { + await this._recordingButtonRef.value?.closeConnection(); + } + + // ───────────────────────────────────────────────────────────────────────────── + // Render + // ───────────────────────────────────────────────────────────────────────────── + + render() { + return html``; + } +} From ff358930d9777a3fb8327d2a9b828f397b7ddd1a Mon Sep 17 00:00:00 2001 From: markitosha Date: Tue, 12 May 2026 15:10:44 +0200 Subject: [PATCH 07/50] feat: add CortiAmbient web component and update imports in index and story files --- src/components/corti-ambient.ts | 105 +++++++++++++++++++++++ src/components/corti-root.ts | 2 +- src/index.ts | 6 ++ stories/corti-ambient.stories.ts | 127 ++++++++++++++++++++++++++++ stories/recording-button.stories.ts | 4 +- 5 files changed, 241 insertions(+), 3 deletions(-) create mode 100644 src/components/corti-ambient.ts create mode 100644 stories/corti-ambient.stories.ts diff --git a/src/components/corti-ambient.ts b/src/components/corti-ambient.ts new file mode 100644 index 0000000..a246389 --- /dev/null +++ b/src/components/corti-ambient.ts @@ -0,0 +1,105 @@ +import type { Corti } from "@corti/sdk"; +import { html, nothing } from "lit"; +import { customElement, property, state } from "lit/decorators.js"; +import { classMap } from "lit/directives/class-map.js"; +import { ref } from "lit/directives/ref.js"; +import { DEFAULT_STREAM_CONFIG } from "../constants.js"; +import type { AmbientRoot } from "../contexts/ambient-context.js"; +import type { AmbientRecordingButton } from "./ambient-recording-button.js"; +import { CortiRoot } from "./corti-root.js"; + +import "../contexts/ambient-context.js"; +import "./ambient-recording-button.js"; +import "./settings-menu.js"; + +@customElement("corti-ambient") +export class CortiAmbient extends CortiRoot< + AmbientRoot, + AmbientRecordingButton +> { + // ───────────────────────────────────────────────────────────────────────────── + // Properties + // ───────────────────────────────────────────────────────────────────────────── + + /** + * Stream configuration for ambient capture (modes, transcription, etc.). + */ + @property({ attribute: false, type: Object }) + set ambientConfig(value: Corti.StreamConfig) { + this._ambientConfig = value; + } + + get ambientConfig(): Corti.StreamConfig { + return ( + this._contextProviderRef.value?.ambientConfig ?? + this._ambientConfig ?? + DEFAULT_STREAM_CONFIG + ); + } + + @state() + _ambientConfig: Corti.StreamConfig = DEFAULT_STREAM_CONFIG; + + /** + * Stream interaction id passed to `stream.connect` for this session. + */ + @property({ type: String }) + set interactionId(value: string | undefined) { + this._interactionId = value; + } + + get interactionId(): string | undefined { + return this._contextProviderRef.value?.interactionId ?? this._interactionId; + } + + @state() + _interactionId?: string; + + // ───────────────────────────────────────────────────────────────────────────── + // Render + // ───────────────────────────────────────────────────────────────────────────── + + render() { + const isHidden = + !this.accessToken && + !this.authConfig && + !this.socketUrl && + !this.socketProxy; + + return html` + + + ${ + this.settingsEnabled?.length > 0 + ? html`` + : nothing + } + + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + "corti-ambient": CortiAmbient; + } +} diff --git a/src/components/corti-root.ts b/src/components/corti-root.ts index 2e2ed85..d66a114 100644 --- a/src/components/corti-root.ts +++ b/src/components/corti-root.ts @@ -27,7 +27,7 @@ type CortiRecordingButtonHost = LitElement & { }; /** - * Shared base for all-in-one Corti host elements (e.g. corti-dictation). + * Shared base for all-in-one Corti host elements (e.g. corti-dictation, corti-ambient). * Intentionally minimal; shared behavior will move here incrementally. */ export class CortiRoot< diff --git a/src/index.ts b/src/index.ts index 8526af0..b5fe9ad 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,5 @@ import { AmbientRecordingButton } from "./components/ambient-recording-button.js"; +import { CortiAmbient } from "./components/corti-ambient.js"; import { CortiDictation } from "./components/corti-dictation.js"; import { DictationDeviceSelector } from "./components/device-selector.js"; import { DictationRecordingButton } from "./components/dictation-recording-button.js"; @@ -11,6 +12,10 @@ if (!customElements.get("ambient-recording-button")) { customElements.define("ambient-recording-button", AmbientRecordingButton); } +if (!customElements.get("corti-ambient")) { + customElements.define("corti-ambient", CortiAmbient); +} + if (!customElements.get("corti-dictation")) { customElements.define("corti-dictation", CortiDictation); } @@ -46,6 +51,7 @@ if (!customElements.get("dictation-root")) { } export { AmbientRecordingButton } from "./components/ambient-recording-button.js"; +export { CortiAmbient } from "./components/corti-ambient.js"; export { CortiDictation } from "./components/corti-dictation.js"; export { DictationDeviceSelector } from "./components/device-selector.js"; export { DictationRecordingButton } from "./components/dictation-recording-button.js"; diff --git a/stories/corti-ambient.stories.ts b/stories/corti-ambient.stories.ts new file mode 100644 index 0000000..14f0f3b --- /dev/null +++ b/stories/corti-ambient.stories.ts @@ -0,0 +1,127 @@ +import type { Meta, StoryObj } from "@storybook/web-components-vite"; +import { html, nothing } from "lit"; +import { action } from "storybook/actions"; + +import "../src/components/audio-visualiser.js"; +import type { CortiAmbient } from "../src/components/corti-ambient.js"; + +import DeviceSelectorStoryMeta from "./device-selector.stories.js"; +import LanguageSelectorStoryMeta from "./language-selector.stories.js"; +import SettingsMeunStoryMeta from "./settings-menu.stories.js"; + +import "../src/components/corti-ambient.js"; +import { disableControls, languages, mockDevices } from "./helpers.js"; + +type CortiAmbientStory = Omit & { + selectedDevice?: string; +}; + +const meta = { + args: { + accessToken: "dummy_token", + allowButtonFocus: false, + interactionId: "9254ec9b-70e6-45d1-bacb-63d6cce19e86", + languagesSupported: languages, + pushToTalkKeybinding: "Space", + settingsEnabled: ["device", "language", "keybinding"], + toggleToTalkKeybinding: "`", + }, + argTypes: { + accessToken: { + control: "text", + description: "Access token for authentication (required to render)", + }, + allowButtonFocus: { + control: "boolean", + description: + "Whether the recording button inside corti-ambient can take focus on click", + }, + devices: DeviceSelectorStoryMeta.argTypes.devices, + interactionId: { + control: "text", + description: + "Stream interaction id passed to Corti stream.connect for this session", + }, + languagesSupported: LanguageSelectorStoryMeta.argTypes.languages, + pushToTalkKeybinding: { + control: "text", + description: + "Push-to-talk keyboard shortcut (keydown starts, keyup stops). Single key only (e.g., 'Space', 'k', 'KeyK')", + }, + settingsEnabled: SettingsMeunStoryMeta.argTypes.settingsEnabled, + toggleToTalkKeybinding: { + control: "text", + description: + "Toggle-to-talk keyboard shortcut (press toggles). Single key only (e.g., '`', 'k', 'KeyK', 'Backquote')", + }, + }, + component: "corti-ambient", + parameters: { + docs: { + codePanel: true, + }, + }, + render: ({ + accessToken, + settingsEnabled, + languagesSupported, + allowButtonFocus, + devices, + selectedDevice, + pushToTalkKeybinding, + toggleToTalkKeybinding, + interactionId, + }) => { + const selectedDeviceValue = selectedDevice + ? mockDevices.find((device) => device.deviceId === selectedDevice) + : nothing; + + const interaction = interactionId?.trim() || undefined; + + return html` + + `; + }, + title: "CortiAmbient", +} satisfies Meta; + +export default meta; + +export const Default = {} satisfies StoryObj; + +export const NoSettings = { + args: { + accessToken: "dummy_token", + interactionId: "9254ec9b-70e6-45d1-bacb-63d6cce19e86", + settingsEnabled: [], + }, + argTypes: disableControls([ + "settingsEnabled", + "devices", + "languagesSupported", + ]), +} satisfies StoryObj; diff --git a/stories/recording-button.stories.ts b/stories/recording-button.stories.ts index 108fbb5..ea1637e 100644 --- a/stories/recording-button.stories.ts +++ b/stories/recording-button.stories.ts @@ -1,9 +1,9 @@ import type { Meta, StoryObj } from "@storybook/web-components-vite"; import { html } from "lit"; import { action } from "storybook/actions"; -import type { DictationRecordingButton } from "../src/components/recording-button.js"; +import type { DictationRecordingButton } from "../src/components/dictation-recording-button.js"; -import "../src/components/recording-button.js"; +import "../src/components/dictation-recording-button.js"; import "../src/contexts/dictation-context.js"; import type { DictationRoot } from "../src/contexts/dictation-context.js"; import { disableControls } from "./helpers.js"; From ed5b7be86959da059ca894b2b841c2a4f22ebf96 Mon Sep 17 00:00:00 2001 From: markitosha Date: Fri, 15 May 2026 14:58:17 +0200 Subject: [PATCH 08/50] feat: update language selection context and enhance language handling in components --- src/components/language-selector.ts | 12 ++-- src/contexts/ambient-context.ts | 20 ++++++ src/contexts/dictation-context.ts | 23 ++++++- src/contexts/mixins/languages-context.ts | 28 ++++++++ src/controllers/languages-controller.ts | 6 +- stories/corti-ambient.stories.ts | 83 +++++++++++++++++++----- stories/corti-dictation.stories.ts | 73 ++++++++++++++++----- stories/helpers.ts | 21 ++++++ 8 files changed, 227 insertions(+), 39 deletions(-) diff --git a/src/components/language-selector.ts b/src/components/language-selector.ts index 348cc76..4621561 100644 --- a/src/components/language-selector.ts +++ b/src/components/language-selector.ts @@ -2,8 +2,10 @@ import type { Corti } from "@corti/sdk"; import { consume } from "@lit/context"; import { html, LitElement } from "lit"; import { customElement, property, state } from "lit/decorators.js"; -import { dictationConfigContext } from "../contexts/dictation-context.js"; -import { languagesContext } from "../contexts/mixins/languages-context.js"; +import { + languagesContext, + selectedLanguageContext, +} from "../contexts/mixins/languages-context.js"; import SelectStyles from "../styles/select.js"; import { languageChangedEvent, @@ -17,9 +19,9 @@ export class DictationLanguageSelector extends LitElement { @state() _languages?: Corti.TranscribeSupportedLanguage[]; - @consume({ context: dictationConfigContext, subscribe: true }) + @consume({ context: selectedLanguageContext, subscribe: true }) @state() - _dictationConfig?: Corti.TranscribeConfig; + _selectedLanguage?: Corti.TranscribeSupportedLanguage; @property({ type: Boolean }) disabled: boolean = false; @@ -51,7 +53,7 @@ export class DictationLanguageSelector extends LitElement { (language) => html` diff --git a/src/contexts/ambient-context.ts b/src/contexts/ambient-context.ts index e8ef544..9199827 100644 --- a/src/contexts/ambient-context.ts +++ b/src/contexts/ambient-context.ts @@ -1,5 +1,6 @@ import type { Corti } from "@corti/sdk"; import { createContext, provide } from "@lit/context"; +import type { PropertyValues } from "lit"; import { customElement, property } from "lit/decorators.js"; import { DEFAULT_STREAM_CONFIG } from "../constants.js"; import { RootContext } from "./root-context.js"; @@ -45,6 +46,25 @@ export class AmbientRoot extends RootContext { }; }); } + + protected override willUpdate(changedProperties: PropertyValues): void { + super.willUpdate(changedProperties); + + if (!changedProperties.has("ambientConfig")) { + return; + } + + const configuredLanguage = + this.ambientConfig?.transcription?.primaryLanguage ?? "en"; + + if ( + configuredLanguage !== undefined && + configuredLanguage !== this.selectedLanguage + ) { + this.selectedLanguage = + configuredLanguage as Corti.TranscribeSupportedLanguage; + } + } } declare global { diff --git a/src/contexts/dictation-context.ts b/src/contexts/dictation-context.ts index 9c5045c..53fd770 100644 --- a/src/contexts/dictation-context.ts +++ b/src/contexts/dictation-context.ts @@ -1,5 +1,6 @@ import type { Corti } from "@corti/sdk"; import { createContext, provide } from "@lit/context"; +import type { PropertyValues } from "lit"; import { customElement, property } from "lit/decorators.js"; import { RootContext } from "./root-context.js"; @@ -32,13 +33,33 @@ export class DictationRoot extends RootContext { this.addEventListener("languages-changed", (e: Event) => { const event = e as CustomEvent; + const selectedLanguage = event.detail.selectedLanguage as + | Corti.TranscribeSupportedLanguage + | undefined; this.dictationConfig = { ...this.dictationConfig, - primaryLanguage: event.detail.selectedLanguage ?? "en", + primaryLanguage: selectedLanguage ?? "en", }; }); } + + protected override willUpdate(changedProperties: PropertyValues): void { + super.willUpdate(changedProperties); + + if (!changedProperties.has("dictationConfig")) { + return; + } + + const configuredLanguage = this.dictationConfig?.primaryLanguage; + + if ( + configuredLanguage !== undefined && + configuredLanguage !== this.selectedLanguage + ) { + this.selectedLanguage = configuredLanguage; + } + } } declare global { diff --git a/src/contexts/mixins/languages-context.ts b/src/contexts/mixins/languages-context.ts index 8293ab9..da1fcad 100644 --- a/src/contexts/mixins/languages-context.ts +++ b/src/contexts/mixins/languages-context.ts @@ -4,15 +4,21 @@ import type { LitElement } from "lit"; import { property, state } from "lit/decorators.js"; import { LanguagesController } from "../../controllers/languages-controller.js"; import { commaSeparatedConverter } from "../../utils/converters.js"; +import type { LanguagesChangedEventDetail } from "../../utils/events.js"; import type { Constructor } from "./types.js"; export const languagesContext = createContext< Corti.TranscribeSupportedLanguage[] | undefined >(Symbol("languages")); +export const selectedLanguageContext = createContext< + Corti.TranscribeSupportedLanguage | undefined +>(Symbol("selectedLanguage")); export declare class LanguagesContextInterface { _languages?: Corti.TranscribeSupportedLanguage[]; + _selectedLanguage?: Corti.TranscribeSupportedLanguage; languages?: Corti.TranscribeSupportedLanguage[]; + selectedLanguage?: Corti.TranscribeSupportedLanguage; } export function LanguagesContextMixin>( @@ -25,6 +31,10 @@ export function LanguagesContextMixin>( @state() _languages?: Corti.TranscribeSupportedLanguage[]; + @provide({ context: selectedLanguageContext }) + @state() + _selectedLanguage?: Corti.TranscribeSupportedLanguage; + @property({ converter: commaSeparatedConverter, type: Array, @@ -42,6 +52,15 @@ export function LanguagesContextMixin>( return this._languages; } + @property({ type: String }) + set selectedLanguage(value: Corti.TranscribeSupportedLanguage | undefined) { + this._selectedLanguage = value; + } + + get selectedLanguage(): Corti.TranscribeSupportedLanguage | undefined { + return this._selectedLanguage; + } + constructor(...args: any[]) { super(...args); @@ -52,6 +71,15 @@ export function LanguagesContextMixin>( this.#languagesController.initialize(); } }); + + this.addEventListener("languages-changed", (e: Event) => { + const event = e as CustomEvent; + const selectedLanguage = event.detail.selectedLanguage as + | Corti.TranscribeSupportedLanguage + | undefined; + + this.selectedLanguage = selectedLanguage ?? event.detail.languages[0]; + }); } } diff --git a/src/controllers/languages-controller.ts b/src/controllers/languages-controller.ts index e28e5c2..cb7db3e 100644 --- a/src/controllers/languages-controller.ts +++ b/src/controllers/languages-controller.ts @@ -5,10 +5,11 @@ import { getLanguagesByRegion } from "../utils/languages.js"; interface LanguagesControllerHost extends ReactiveControllerHost { region?: string; - dictationConfig?: Corti.TranscribeConfig; dispatchEvent(event: CustomEvent): boolean; requestUpdate(): void; _languages?: Corti.TranscribeSupportedLanguage[]; + _selectedLanguage?: Corti.TranscribeSupportedLanguage; + selectedLanguage?: Corti.TranscribeSupportedLanguage; } /** @@ -69,12 +70,13 @@ export class LanguagesController implements ReactiveController { this.#autoLoadedLanguages = true; this.host._languages = languages; - const previousLanguage = this.host.dictationConfig?.primaryLanguage; + const previousLanguage = this.host.selectedLanguage; const selectedLanguage = previousLanguage && languages.includes(previousLanguage) ? previousLanguage : defaultLanguage; + this.host._selectedLanguage = selectedLanguage; this.host.requestUpdate(); this.host.dispatchEvent( languagesChangedEvent(languages, selectedLanguage), diff --git a/stories/corti-ambient.stories.ts b/stories/corti-ambient.stories.ts index 14f0f3b..e654e8f 100644 --- a/stories/corti-ambient.stories.ts +++ b/stories/corti-ambient.stories.ts @@ -1,6 +1,5 @@ import type { Meta, StoryObj } from "@storybook/web-components-vite"; import { html, nothing } from "lit"; -import { action } from "storybook/actions"; import "../src/components/audio-visualiser.js"; import type { CortiAmbient } from "../src/components/corti-ambient.js"; @@ -10,7 +9,7 @@ import LanguageSelectorStoryMeta from "./language-selector.stories.js"; import SettingsMeunStoryMeta from "./settings-menu.stories.js"; import "../src/components/corti-ambient.js"; -import { disableControls, languages, mockDevices } from "./helpers.js"; +import { disableControls, eventAction, languages, mockDevices } from "./helpers.js"; type CortiAmbientStory = Omit & { selectedDevice?: string; @@ -89,20 +88,20 @@ const meta = { .selectedDevice=${selectedDeviceValue} pushToTalkKeybinding=${pushToTalkKeybinding} toggleToTalkKeybinding=${toggleToTalkKeybinding} - @command=${action("command")} - @delta-usage=${action("delta-usage")} - @error=${action("error")} - @facts=${action("facts")} - @keybinding-changed=${action("keybinding-changed")} - @languages-changed=${action("languages-changed")} - @network-activity=${action("network-activity")} - @ready=${action("ready")} - @recording-devices-changed=${action("recording-devices-changed")} - @recording-state-changed=${action("recording-state-changed")} - @stream-closed=${action("stream-closed")} - @transcript=${action("transcript")} - @usage=${action("usage")} - @audio-level-changed=${action("audio-level-changed")} + @command=${eventAction("command")} + @delta-usage=${eventAction("delta-usage")} + @error=${eventAction("error")} + @facts=${eventAction("facts")} + @keybinding-changed=${eventAction("keybinding-changed")} + @languages-changed=${eventAction("languages-changed")} + @network-activity=${eventAction("network-activity")} + @ready=${eventAction("ready")} + @recording-devices-changed=${eventAction("recording-devices-changed")} + @recording-state-changed=${eventAction("recording-state-changed")} + @stream-closed=${eventAction("stream-closed")} + @transcript=${eventAction("transcript")} + @usage=${eventAction("usage")} + @audio-level-changed=${eventAction("audio-level-changed")} /> `; }, @@ -125,3 +124,55 @@ export const NoSettings = { "languagesSupported", ]), } satisfies StoryObj; + +export const AutoLoadLanguagesAndDevices = { + args: { + accessToken: "dummy_token", + allowButtonFocus: false, + interactionId: "9254ec9b-70e6-45d1-bacb-63d6cce19e86", + pushToTalkKeybinding: "Space", + settingsEnabled: ["device", "language"], + toggleToTalkKeybinding: "`", + }, + render: ({ + accessToken, + interactionId, + settingsEnabled, + allowButtonFocus, + pushToTalkKeybinding, + toggleToTalkKeybinding, + }) => { + const interaction = interactionId?.trim() || undefined; + + return html` + + `; + }, + argTypes: disableControls([ + "devices", + "languagesSupported", + "selectedDevice", + "settingsEnabled", + ]), +} satisfies StoryObj; diff --git a/stories/corti-dictation.stories.ts b/stories/corti-dictation.stories.ts index d76386e..dd1e575 100644 --- a/stories/corti-dictation.stories.ts +++ b/stories/corti-dictation.stories.ts @@ -1,6 +1,5 @@ import type { Meta, StoryObj } from "@storybook/web-components-vite"; import { html, nothing } from "lit"; -import { action } from "storybook/actions"; import "../src/components/audio-visualiser.js"; import type { CortiDictation } from "../src/components/corti-dictation.js"; @@ -10,7 +9,7 @@ import LanguageSelectorStoryMeta from "./language-selector.stories.js"; import SettingsMeunStoryMeta from "./settings-menu.stories.js"; import "../src/components/corti-dictation.js"; -import { disableControls, languages, mockDevices } from "./helpers.js"; +import { disableControls, eventAction, languages, mockDevices } from "./helpers.js"; type CortiDictationStory = Omit & { selectedDevice?: string; @@ -79,19 +78,19 @@ const meta = { .selectedDevice=${selectedDeviceValue} pushToTalkKeybinding=${pushToTalkKeybinding} toggleToTalkKeybinding=${toggleToTalkKeybinding} - @keybinding-changed=${action("keybinding-changed")} - @languages-changed=${action("languages-changed")} - @recording-devices-changed=${action("recording-devices-changed")} - @stream-closed=${action("stream-closed")} - @usage=${action("usage")} - @delta-usage=${action("delta-usage")} - @transcript=${action("transcript")} - @command=${action("command")} - @ready=${action("ready")} - @audio-level-changed=${action("audio-level-changed")} - @recording-state-changed=${action("recording-state-changed")} - @network-activity=${action("network-activity")} - @error=${action("error")} + @keybinding-changed=${eventAction("keybinding-changed")} + @languages-changed=${eventAction("languages-changed")} + @recording-devices-changed=${eventAction("recording-devices-changed")} + @stream-closed=${eventAction("stream-closed")} + @usage=${eventAction("usage")} + @delta-usage=${eventAction("delta-usage")} + @transcript=${eventAction("transcript")} + @command=${eventAction("command")} + @ready=${eventAction("ready")} + @audio-level-changed=${eventAction("audio-level-changed")} + @recording-state-changed=${eventAction("recording-state-changed")} + @network-activity=${eventAction("network-activity")} + @error=${eventAction("error")} /> `; }, @@ -173,3 +172,47 @@ export const WithKeybindings = { }, argTypes: disableControls(["settingsEnabled"]), }; + +export const AutoLoadLanguagesAndDevices = { + args: { + accessToken: "dummy_token", + allowButtonFocus: false, + pushToTalkKeybinding: "Space", + settingsEnabled: ["device", "language"], + toggleToTalkKeybinding: "`", + }, + render: ({ + accessToken, + settingsEnabled, + allowButtonFocus, + pushToTalkKeybinding, + toggleToTalkKeybinding, + }) => html` + + `, + argTypes: disableControls([ + "devices", + "languagesSupported", + "selectedDevice", + "settingsEnabled", + ]), +}; diff --git a/stories/helpers.ts b/stories/helpers.ts index 88dad8c..f99f484 100644 --- a/stories/helpers.ts +++ b/stories/helpers.ts @@ -2,6 +2,7 @@ import { LANGUAGES_SUPPORTED_EU, LANGUAGES_SUPPORTED_US, } from "../src/constants"; +import { action } from "storybook/actions"; export function disableControls(controls: string[]) { const argTypes: Record = {}; @@ -38,3 +39,23 @@ export const mockDevices: MediaDeviceInfo[] = [ export const languages = Array.from( new Set([...LANGUAGES_SUPPORTED_EU, ...LANGUAGES_SUPPORTED_US]), ); + +export function eventAction(name: string) { + const log = action(name); + + return (event: Event) => { + const customEvent = event as CustomEvent; + + log({ + bubbles: event.bubbles, + cancelable: event.cancelable, + composed: event.composed, + defaultPrevented: event.defaultPrevented, + detail: customEvent.detail, + eventPhase: event.eventPhase, + isTrusted: event.isTrusted, + timeStamp: event.timeStamp, + type: event.type, + }); + }; +} From 966044b39a3ccaf49b74da0240b8f002cdab12a3 Mon Sep 17 00:00:00 2001 From: markitosha Date: Fri, 15 May 2026 15:01:40 +0200 Subject: [PATCH 09/50] fix: update labels for device and language selectors for clarity --- src/components/device-selector.ts | 2 +- src/components/language-selector.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/device-selector.ts b/src/components/device-selector.ts index d9eac30..5ddc075 100644 --- a/src/components/device-selector.ts +++ b/src/components/device-selector.ts @@ -40,7 +40,7 @@ export class DictationDeviceSelector extends LitElement { return html`
Date: Fri, 15 May 2026 15:03:01 +0200 Subject: [PATCH 10/50] fix: linter --- stories/corti-ambient.stories.ts | 19 ++++++++++++------- stories/corti-dictation.stories.ts | 19 ++++++++++++------- stories/helpers.ts | 2 +- 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/stories/corti-ambient.stories.ts b/stories/corti-ambient.stories.ts index e654e8f..8789d98 100644 --- a/stories/corti-ambient.stories.ts +++ b/stories/corti-ambient.stories.ts @@ -9,7 +9,12 @@ import LanguageSelectorStoryMeta from "./language-selector.stories.js"; import SettingsMeunStoryMeta from "./settings-menu.stories.js"; import "../src/components/corti-ambient.js"; -import { disableControls, eventAction, languages, mockDevices } from "./helpers.js"; +import { + disableControls, + eventAction, + languages, + mockDevices, +} from "./helpers.js"; type CortiAmbientStory = Omit & { selectedDevice?: string; @@ -134,6 +139,12 @@ export const AutoLoadLanguagesAndDevices = { settingsEnabled: ["device", "language"], toggleToTalkKeybinding: "`", }, + argTypes: disableControls([ + "devices", + "languagesSupported", + "selectedDevice", + "settingsEnabled", + ]), render: ({ accessToken, interactionId, @@ -169,10 +180,4 @@ export const AutoLoadLanguagesAndDevices = { /> `; }, - argTypes: disableControls([ - "devices", - "languagesSupported", - "selectedDevice", - "settingsEnabled", - ]), } satisfies StoryObj; diff --git a/stories/corti-dictation.stories.ts b/stories/corti-dictation.stories.ts index dd1e575..7109f83 100644 --- a/stories/corti-dictation.stories.ts +++ b/stories/corti-dictation.stories.ts @@ -9,7 +9,12 @@ import LanguageSelectorStoryMeta from "./language-selector.stories.js"; import SettingsMeunStoryMeta from "./settings-menu.stories.js"; import "../src/components/corti-dictation.js"; -import { disableControls, eventAction, languages, mockDevices } from "./helpers.js"; +import { + disableControls, + eventAction, + languages, + mockDevices, +} from "./helpers.js"; type CortiDictationStory = Omit & { selectedDevice?: string; @@ -181,6 +186,12 @@ export const AutoLoadLanguagesAndDevices = { settingsEnabled: ["device", "language"], toggleToTalkKeybinding: "`", }, + argTypes: disableControls([ + "devices", + "languagesSupported", + "selectedDevice", + "settingsEnabled", + ]), render: ({ accessToken, settingsEnabled, @@ -209,10 +220,4 @@ export const AutoLoadLanguagesAndDevices = { @error=${eventAction("error")} /> `, - argTypes: disableControls([ - "devices", - "languagesSupported", - "selectedDevice", - "settingsEnabled", - ]), }; diff --git a/stories/helpers.ts b/stories/helpers.ts index f99f484..39a027d 100644 --- a/stories/helpers.ts +++ b/stories/helpers.ts @@ -1,8 +1,8 @@ +import { action } from "storybook/actions"; import { LANGUAGES_SUPPORTED_EU, LANGUAGES_SUPPORTED_US, } from "../src/constants"; -import { action } from "storybook/actions"; export function disableControls(controls: string[]) { const argTypes: Record = {}; From 779875b52a349d510f8e08828e880ba955787fcf Mon Sep 17 00:00:00 2001 From: markitosha Date: Fri, 15 May 2026 15:07:12 +0200 Subject: [PATCH 11/50] fix: dependency update --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 87ef9c6..92feb08 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.0.0-dev", "license": "MIT", "dependencies": { - "@corti/sdk": "1.0.0", + "@corti/sdk": "2.0.0", "@lit/context": "^1.1.6", "lit": "^3.3.1" }, @@ -282,9 +282,9 @@ } }, "node_modules/@corti/sdk": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@corti/sdk/-/sdk-1.0.0.tgz", - "integrity": "sha512-JRaU3kFlKxdIafayR0EUTbR++uw8VkF4HtRVpcotS7GnsPOefPQ1wgR8RgbGCCwbcnfIlxqCa5FDWxNEvQyTsA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@corti/sdk/-/sdk-2.0.0.tgz", + "integrity": "sha512-dF3S5i9w42s3FhJgmi7r9/6Zi5q75BlRswMnJcY/GQ79lljXjQyyXUL1xxrBFhm/XLGfZTo8TLEhBjxDo7FlDg==", "license": "MIT", "dependencies": { "ws": "^8.16.0" diff --git a/package.json b/package.json index 05f629e..03b5e2c 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "storybook:build": "tsc && tsc -p tsconfig.stories.json && npm run analyze -- --exclude dist && storybook build" }, "dependencies": { - "@corti/sdk": "1.0.0", + "@corti/sdk": "2.0.0", "@lit/context": "^1.1.6", "lit": "^3.3.1" }, From c8041c03f52cf09ad8872ffb078f93244ca90dc0 Mon Sep 17 00:00:00 2001 From: markitosha Date: Fri, 15 May 2026 15:42:37 +0200 Subject: [PATCH 12/50] feat: enhance language selection logic and add preferred default language handling --- src/contexts/mixins/languages-context.ts | 17 ++++++++++++++++- src/utils/languages.ts | 20 +++++++++++++++++--- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/contexts/mixins/languages-context.ts b/src/contexts/mixins/languages-context.ts index da1fcad..ca83c62 100644 --- a/src/contexts/mixins/languages-context.ts +++ b/src/contexts/mixins/languages-context.ts @@ -5,6 +5,7 @@ import { property, state } from "lit/decorators.js"; import { LanguagesController } from "../../controllers/languages-controller.js"; import { commaSeparatedConverter } from "../../utils/converters.js"; import type { LanguagesChangedEventDetail } from "../../utils/events.js"; +import { getPreferredDefaultLanguage } from "../../utils/languages.js"; import type { Constructor } from "./types.js"; export const languagesContext = createContext< @@ -46,6 +47,18 @@ export function LanguagesContextMixin>( if (value !== undefined) { this.#languagesController.clearAutoLoadedFlag(); } + + if (value === undefined || value.length === 0) { + this.selectedLanguage = undefined; + return; + } + + if ( + this.selectedLanguage === undefined || + !value.includes(this.selectedLanguage) + ) { + this.selectedLanguage = getPreferredDefaultLanguage(value); + } } get languages(): Corti.TranscribeSupportedLanguage[] | undefined { @@ -78,7 +91,9 @@ export function LanguagesContextMixin>( | Corti.TranscribeSupportedLanguage | undefined; - this.selectedLanguage = selectedLanguage ?? event.detail.languages[0]; + this.selectedLanguage = + selectedLanguage ?? + getPreferredDefaultLanguage(event.detail.languages); }); } } diff --git a/src/utils/languages.ts b/src/utils/languages.ts index 5711ac3..cb13e00 100644 --- a/src/utils/languages.ts +++ b/src/utils/languages.ts @@ -35,14 +35,28 @@ export function checkIfDefaultLanguagesList( ); } +export function getPreferredDefaultLanguage( + languages: Corti.TranscribeSupportedLanguage[] = [], +): Corti.TranscribeSupportedLanguage | undefined { + if (languages.includes("en")) { + return "en"; + } + + if (languages.includes("en-GB")) { + return "en-GB"; + } + + return languages[0]; +} + export function getLanguagesByRegion(region?: string): { languages: Corti.TranscribeSupportedLanguage[]; defaultLanguage: string | undefined; } { const languages = - DEFAULT_LANGUAGES_BY_REGION[region || "default"] || - DEFAULT_LANGUAGES_BY_REGION["default"]; - const defaultLanguage = languages?.[0]; + DEFAULT_LANGUAGES_BY_REGION[region || "default"] ?? + DEFAULT_LANGUAGES_BY_REGION.default; + const defaultLanguage = getPreferredDefaultLanguage(languages); return { defaultLanguage, languages }; } From 5cdfa83db9d4b336ff30655051640f6f1c3d1cf1 Mon Sep 17 00:00:00 2001 From: markitosha Date: Fri, 15 May 2026 16:45:32 +0200 Subject: [PATCH 13/50] refactor: update language selection handling to use private property and improve clarity --- src/components/language-selector.ts | 1 + src/contexts/ambient-context.ts | 10 +-------- src/contexts/dictation-context.ts | 9 +------- src/contexts/mixins/languages-context.ts | 26 +++++++++--------------- src/controllers/languages-controller.ts | 3 +-- 5 files changed, 14 insertions(+), 35 deletions(-) diff --git a/src/components/language-selector.ts b/src/components/language-selector.ts index 972cc54..3ee8135 100644 --- a/src/components/language-selector.ts +++ b/src/components/language-selector.ts @@ -47,6 +47,7 @@ export class DictationLanguageSelector extends LitElement { id="language-select" aria-labelledby="language-select-label" @change=${this.#handleSelectLanguage} + .value=${this._selectedLanguage ?? ""} ?disabled=${this.disabled || !this._languages || this._languages.length === 0} > ${this._languages?.map( diff --git a/src/contexts/ambient-context.ts b/src/contexts/ambient-context.ts index 9199827..5bcc6a8 100644 --- a/src/contexts/ambient-context.ts +++ b/src/contexts/ambient-context.ts @@ -54,16 +54,8 @@ export class AmbientRoot extends RootContext { return; } - const configuredLanguage = + this._selectedLanguage = this.ambientConfig?.transcription?.primaryLanguage ?? "en"; - - if ( - configuredLanguage !== undefined && - configuredLanguage !== this.selectedLanguage - ) { - this.selectedLanguage = - configuredLanguage as Corti.TranscribeSupportedLanguage; - } } } diff --git a/src/contexts/dictation-context.ts b/src/contexts/dictation-context.ts index 53fd770..3bc1083 100644 --- a/src/contexts/dictation-context.ts +++ b/src/contexts/dictation-context.ts @@ -51,14 +51,7 @@ export class DictationRoot extends RootContext { return; } - const configuredLanguage = this.dictationConfig?.primaryLanguage; - - if ( - configuredLanguage !== undefined && - configuredLanguage !== this.selectedLanguage - ) { - this.selectedLanguage = configuredLanguage; - } + this._selectedLanguage = this.dictationConfig?.primaryLanguage; } } diff --git a/src/contexts/mixins/languages-context.ts b/src/contexts/mixins/languages-context.ts index ca83c62..bcb319b 100644 --- a/src/contexts/mixins/languages-context.ts +++ b/src/contexts/mixins/languages-context.ts @@ -19,7 +19,6 @@ export declare class LanguagesContextInterface { _languages?: Corti.TranscribeSupportedLanguage[]; _selectedLanguage?: Corti.TranscribeSupportedLanguage; languages?: Corti.TranscribeSupportedLanguage[]; - selectedLanguage?: Corti.TranscribeSupportedLanguage; } export function LanguagesContextMixin>( @@ -48,16 +47,20 @@ export function LanguagesContextMixin>( this.#languagesController.clearAutoLoadedFlag(); } - if (value === undefined || value.length === 0) { - this.selectedLanguage = undefined; + if (value === undefined) { + return; + } + + if (value.length === 0) { + this._selectedLanguage = undefined; return; } if ( - this.selectedLanguage === undefined || - !value.includes(this.selectedLanguage) + this._selectedLanguage === undefined || + !value.includes(this._selectedLanguage) ) { - this.selectedLanguage = getPreferredDefaultLanguage(value); + this._selectedLanguage = getPreferredDefaultLanguage(value); } } @@ -65,15 +68,6 @@ export function LanguagesContextMixin>( return this._languages; } - @property({ type: String }) - set selectedLanguage(value: Corti.TranscribeSupportedLanguage | undefined) { - this._selectedLanguage = value; - } - - get selectedLanguage(): Corti.TranscribeSupportedLanguage | undefined { - return this._selectedLanguage; - } - constructor(...args: any[]) { super(...args); @@ -91,7 +85,7 @@ export function LanguagesContextMixin>( | Corti.TranscribeSupportedLanguage | undefined; - this.selectedLanguage = + this._selectedLanguage = selectedLanguage ?? getPreferredDefaultLanguage(event.detail.languages); }); diff --git a/src/controllers/languages-controller.ts b/src/controllers/languages-controller.ts index cb7db3e..357c923 100644 --- a/src/controllers/languages-controller.ts +++ b/src/controllers/languages-controller.ts @@ -9,7 +9,6 @@ interface LanguagesControllerHost extends ReactiveControllerHost { requestUpdate(): void; _languages?: Corti.TranscribeSupportedLanguage[]; _selectedLanguage?: Corti.TranscribeSupportedLanguage; - selectedLanguage?: Corti.TranscribeSupportedLanguage; } /** @@ -70,7 +69,7 @@ export class LanguagesController implements ReactiveController { this.#autoLoadedLanguages = true; this.host._languages = languages; - const previousLanguage = this.host.selectedLanguage; + const previousLanguage = this.host._selectedLanguage; const selectedLanguage = previousLanguage && languages.includes(previousLanguage) ? previousLanguage From a3321ede71e329683cf7b6fb269323c6b8803732 Mon Sep 17 00:00:00 2001 From: markitosha Date: Mon, 18 May 2026 10:53:02 +0200 Subject: [PATCH 14/50] fix: improve error message clarity and correct variable names in ambient components --- src/components/ambient-recording-button.ts | 4 +++- src/components/corti-root.ts | 9 ++++----- src/controllers/socket-controller.ts | 2 +- src/index.ts | 6 ++++++ stories/corti-ambient.stories.ts | 4 ++-- stories/corti-dictation.stories.ts | 4 ++-- 6 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/components/ambient-recording-button.ts b/src/components/ambient-recording-button.ts index f56bb68..d612cc1 100644 --- a/src/components/ambient-recording-button.ts +++ b/src/components/ambient-recording-button.ts @@ -15,7 +15,9 @@ import { errorEvent } from "../utils/events.js"; import { RecordingButtonBase } from "./recording-button-base.js"; const interactionIdRequiredError = () => - new Error("interactionId is required. Set interactionId on ambient-root."); + new Error( + "interactionId is required. Set interactionId on corti-ambient or ambient-root.", + ); @customElement("ambient-recording-button") export class AmbientRecordingButton extends RecordingButtonBase< diff --git a/src/components/corti-root.ts b/src/components/corti-root.ts index d66a114..f3df1d4 100644 --- a/src/components/corti-root.ts +++ b/src/components/corti-root.ts @@ -71,7 +71,6 @@ export class CortiRoot< /** * Which settings should be available in the UI. * If an empty array is passed, the settings will be disabled entirely. - * Options are language and devices */ @property({ converter: commaSeparatedConverter, @@ -80,9 +79,9 @@ export class CortiRoot< settingsEnabled: ConfigurableSettings[] = ["device", "language"]; /** - * When false (default), allows the start/stop button from taking focus when clicked, - * disabling textareas or other input elements to maintain focus. - * Set to "true" to allow the button to receive focus on click. + * When false (default), clicking the start/stop button does not move focus + * to the button, allowing textareas or other input elements to keep focus. + * Set to true to allow the button to receive focus on click. */ @property({ type: Boolean }) allowButtonFocus: boolean = false; @@ -169,7 +168,7 @@ export class CortiRoot< * Toggle-to-talk keybinding for keyboard shortcut. Single key only (e.g., "`", "k", "meta", "ctrl"). * Combinations with "+" are not supported. * Pressing the key toggles recording on/off. - * Defaults to "`" if keybinding is in settingsEnabled, otherwise undefined + * Defaults to "Enter" if keybinding is in settingsEnabled, otherwise undefined */ @property({ type: String }) set toggleToTalkKeybinding(value: string | null | undefined) { diff --git a/src/controllers/socket-controller.ts b/src/controllers/socket-controller.ts index 6018882..640f540 100644 --- a/src/controllers/socket-controller.ts +++ b/src/controllers/socket-controller.ts @@ -156,7 +156,7 @@ export abstract class SocketController< this.#webSocket = socket; - this.#callbacks?.onNetworkActivity?.("sent", { + callbacks?.onNetworkActivity?.("sent", { configuration: config, type: "config", }); diff --git a/src/index.ts b/src/index.ts index b5fe9ad..ee045ff 100644 --- a/src/index.ts +++ b/src/index.ts @@ -6,6 +6,7 @@ import { DictationRecordingButton } from "./components/dictation-recording-butto import { DictationKeybindingSelector } from "./components/keybinding-selector.js"; import { DictationLanguageSelector } from "./components/language-selector.js"; import { DictationSettingsMenu } from "./components/settings-menu.js"; +import { AmbientRoot } from "./contexts/ambient-context.js"; import { DictationRoot } from "./contexts/dictation-context.js"; if (!customElements.get("ambient-recording-button")) { @@ -46,6 +47,10 @@ if (!customElements.get("dictation-settings-menu")) { customElements.define("dictation-settings-menu", DictationSettingsMenu); } +if (!customElements.get("ambient-root")) { + customElements.define("ambient-root", AmbientRoot); +} + if (!customElements.get("dictation-root")) { customElements.define("dictation-root", DictationRoot); } @@ -58,6 +63,7 @@ export { DictationRecordingButton } from "./components/dictation-recording-butto export { DictationKeybindingSelector } from "./components/keybinding-selector.js"; export { DictationLanguageSelector } from "./components/language-selector.js"; export { DictationSettingsMenu } from "./components/settings-menu.js"; +export { AmbientRoot } from "./contexts/ambient-context.js"; export { DictationRoot } from "./contexts/dictation-context.js"; export type { AmbientStreamSessionConfig } from "./controllers/ambient-controller.js"; diff --git a/stories/corti-ambient.stories.ts b/stories/corti-ambient.stories.ts index 8789d98..0cbe3c0 100644 --- a/stories/corti-ambient.stories.ts +++ b/stories/corti-ambient.stories.ts @@ -6,7 +6,7 @@ import type { CortiAmbient } from "../src/components/corti-ambient.js"; import DeviceSelectorStoryMeta from "./device-selector.stories.js"; import LanguageSelectorStoryMeta from "./language-selector.stories.js"; -import SettingsMeunStoryMeta from "./settings-menu.stories.js"; +import SettingsMenuStoryMeta from "./settings-menu.stories.js"; import "../src/components/corti-ambient.js"; import { @@ -52,7 +52,7 @@ const meta = { description: "Push-to-talk keyboard shortcut (keydown starts, keyup stops). Single key only (e.g., 'Space', 'k', 'KeyK')", }, - settingsEnabled: SettingsMeunStoryMeta.argTypes.settingsEnabled, + settingsEnabled: SettingsMenuStoryMeta.argTypes.settingsEnabled, toggleToTalkKeybinding: { control: "text", description: diff --git a/stories/corti-dictation.stories.ts b/stories/corti-dictation.stories.ts index 7109f83..8c78ad6 100644 --- a/stories/corti-dictation.stories.ts +++ b/stories/corti-dictation.stories.ts @@ -6,7 +6,7 @@ import type { CortiDictation } from "../src/components/corti-dictation.js"; import DeviceSelectorStoryMeta from "./device-selector.stories.js"; import LanguageSelectorStoryMeta from "./language-selector.stories.js"; -import SettingsMeunStoryMeta from "./settings-menu.stories.js"; +import SettingsMenuStoryMeta from "./settings-menu.stories.js"; import "../src/components/corti-dictation.js"; import { @@ -46,7 +46,7 @@ const meta = { description: "Push-to-talk keyboard shortcut (keydown starts, keyup stops). Single key only (e.g., 'Space', 'k', 'KeyK')", }, - settingsEnabled: SettingsMeunStoryMeta.argTypes.settingsEnabled, + settingsEnabled: SettingsMenuStoryMeta.argTypes.settingsEnabled, toggleToTalkKeybinding: { control: "text", description: From 6d79a08f6a594ae512b4ae1242458422534d65ab Mon Sep 17 00:00:00 2001 From: markitosha Date: Mon, 18 May 2026 14:53:11 +0200 Subject: [PATCH 15/50] feat: add virtual mode support for ambient components and update settings handling --- README.md | 19 +++ .../ambient-virtual-mode-selector.ts | 57 +++++++++ src/components/corti-ambient.ts | 12 ++ src/components/recording-button-base.ts | 5 + src/components/settings-menu.ts | 9 ++ src/contexts/ambient-context.ts | 11 ++ src/controllers/media-controller.ts | 36 +++++- src/icons/icons.ts | 35 ++++++ src/index.ts | 10 ++ src/styles/ambient-virtual-mode-selector.ts | 102 ++++++++++++++++ src/types.ts | 6 +- src/utils/events.ts | 14 +++ src/utils/media.ts | 110 +++++++++++++++--- stories/ambient-root.stories.ts | 4 +- stories/corti-ambient.stories.ts | 6 +- stories/settings-menu.stories.ts | 20 +++- 16 files changed, 426 insertions(+), 30 deletions(-) create mode 100644 src/components/ambient-virtual-mode-selector.ts create mode 100644 src/styles/ambient-virtual-mode-selector.ts diff --git a/README.md b/README.md index 52fa91f..849825a 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,13 @@ For more control and flexibility, you can use individual components: - **``** - Language selection dropdown - **``** - Keybinding configuration component for keyboard shortcuts (supports both push-to-talk and toggle-to-talk) +Ambient stream components: + +- **``** - All-in-one ambient capture component (includes virtual mode by default in settings) +- **``** - Context provider for ambient stream sessions +- **``** - Recording button for ambient capture +- **``** - Toggles virtual mode: captures the selected microphone plus audio from a shared browser tab, window, or application (mixed as separate channels in one stream) + These components share state through a context system, allowing you to build custom UIs while leveraging the same underlying functionality. ## Installation @@ -159,6 +166,18 @@ For more control, use individual components to build a custom UI: ``` +### Ambient Example (with Virtual Mode) + +```html + +``` + +Include `virtualMode` in `settingsEnabled` to show the Virtual mode toggle in the settings menu. When the user turns it on and starts recording, the browser prompts to share a tab/window/application; that audio is mixed with the selected microphone into one stream (microphone on the left channel, shared audio on the right). + ### Keyboard Shortcuts (Keybindings) The component supports both push-to-talk and toggle-to-talk keybindings simultaneously. You can configure separate keybindings for each behavior: diff --git a/src/components/ambient-virtual-mode-selector.ts b/src/components/ambient-virtual-mode-selector.ts new file mode 100644 index 0000000..9adfdb8 --- /dev/null +++ b/src/components/ambient-virtual-mode-selector.ts @@ -0,0 +1,57 @@ +import { consume } from "@lit/context"; +import { html, LitElement } from "lit"; +import { customElement, property, state } from "lit/decorators.js"; +import { virtualModeContext } from "../contexts/ambient-context.js"; +import AmbientVirtualModeSelectorStyles from "../styles/ambient-virtual-mode-selector.js"; +import { virtualModeChangedEvent } from "../utils/events.js"; + +import "../icons/icons.js"; + +@customElement("ambient-virtual-mode-selector") +export class AmbientVirtualModeSelector extends LitElement { + @consume({ context: virtualModeContext, subscribe: true }) + @state() + _virtualMode: boolean = false; + + @property({ type: Boolean }) + disabled: boolean = false; + + static styles = AmbientVirtualModeSelectorStyles; + + #handleToggle = (e: Event): void => { + const checked = (e.target as HTMLInputElement).checked; + this.dispatchEvent(virtualModeChangedEvent(checked)); + }; + + render() { + return html` +
+
+
+ + Virtual mode +
+ + Share audio from another window or tab + +
+ +
+ `; + } +} + +declare global { + interface HTMLElementTagNameMap { + "ambient-virtual-mode-selector": AmbientVirtualModeSelector; + } +} diff --git a/src/components/corti-ambient.ts b/src/components/corti-ambient.ts index a246389..6dbab05 100644 --- a/src/components/corti-ambient.ts +++ b/src/components/corti-ambient.ts @@ -5,6 +5,8 @@ import { classMap } from "lit/directives/class-map.js"; import { ref } from "lit/directives/ref.js"; import { DEFAULT_STREAM_CONFIG } from "../constants.js"; import type { AmbientRoot } from "../contexts/ambient-context.js"; +import type { ConfigurableSettings } from "../types.js"; +import { commaSeparatedConverter } from "../utils/converters.js"; import type { AmbientRecordingButton } from "./ambient-recording-button.js"; import { CortiRoot } from "./corti-root.js"; @@ -21,6 +23,16 @@ export class CortiAmbient extends CortiRoot< // Properties // ───────────────────────────────────────────────────────────────────────────── + @property({ + converter: commaSeparatedConverter, + type: Array, + }) + override settingsEnabled: ConfigurableSettings[] = [ + "device", + "language", + "virtualMode", + ]; + /** * Stream configuration for ambient capture (modes, transcription, etc.). */ diff --git a/src/components/recording-button-base.ts b/src/components/recording-button-base.ts index 1630862..b6a51ac 100644 --- a/src/components/recording-button-base.ts +++ b/src/components/recording-button-base.ts @@ -8,6 +8,7 @@ import { } from "lit"; import { property, state } from "lit/decorators.js"; import { AUDIO_CHUNK_INTERVAL_MS } from "../constants.js"; +import { virtualModeContext } from "../contexts/ambient-context.js"; import { debugDisplayAudioContext } from "../contexts/dictation-context.js"; import { accessTokenContext, @@ -97,6 +98,10 @@ export abstract class RecordingButtonBase< @state() _debug_displayAudio?: boolean; + @consume({ context: virtualModeContext, subscribe: true }) + @state() + _virtualMode?: boolean; + @consume({ context: pushToTalkKeybindingContext, subscribe: true }) @state() _pushToTalkKeybinding?: string | null; diff --git a/src/components/settings-menu.ts b/src/components/settings-menu.ts index a168b7f..d75f624 100644 --- a/src/components/settings-menu.ts +++ b/src/components/settings-menu.ts @@ -8,6 +8,7 @@ import SettingsMenuStyles from "../styles/settings-menu.js"; import type { ConfigurableSettings, RecordingState } from "../types.js"; import { commaSeparatedConverter } from "../utils/converters.js"; +import "./ambient-virtual-mode-selector.js"; import "./device-selector.js"; import "./keybinding-selector.js"; import "./language-selector.js"; @@ -40,6 +41,7 @@ export class DictationSettingsMenu extends LitElement { const showDeviceSelector = this.settingsEnabled.includes("device"); const showLanguageSelector = this.settingsEnabled.includes("language"); const showKeybinding = this.settingsEnabled.includes("keybinding"); + const showVirtualMode = this.settingsEnabled.includes("virtualMode"); return html`
@@ -78,6 +80,13 @@ export class DictationSettingsMenu extends LitElement { />` : nothing } + ${ + showVirtualMode + ? html`` + : nothing + }
diff --git a/src/contexts/ambient-context.ts b/src/contexts/ambient-context.ts index 5bcc6a8..c053a3f 100644 --- a/src/contexts/ambient-context.ts +++ b/src/contexts/ambient-context.ts @@ -13,6 +13,8 @@ export const interactionIdContext = createContext( Symbol("interactionId"), ); +export const virtualModeContext = createContext(Symbol("virtualMode")); + @customElement("ambient-root") export class AmbientRoot extends RootContext { @provide({ context: ambientConfigContext }) @@ -23,9 +25,18 @@ export class AmbientRoot extends RootContext { @property({ type: String }) interactionId?: string; + @provide({ context: virtualModeContext }) + @property({ attribute: "virtual-mode", type: Boolean }) + virtualMode: boolean = false; + constructor() { super(); + this.addEventListener("virtual-mode-changed", (e: Event) => { + const event = e as CustomEvent<{ enabled: boolean }>; + this.virtualMode = event.detail.enabled; + }); + this.addEventListener("languages-changed", (e: Event) => { const event = e as CustomEvent; diff --git a/src/controllers/media-controller.ts b/src/controllers/media-controller.ts index 49b3be5..8d98cd8 100644 --- a/src/controllers/media-controller.ts +++ b/src/controllers/media-controller.ts @@ -7,6 +7,7 @@ import { interface MediaControllerHost extends ReactiveControllerHost { _selectedDevice?: MediaDeviceInfo; + _virtualMode?: boolean; _debug_displayAudio?: boolean; dispatchEvent(event: Event): boolean; } @@ -15,6 +16,8 @@ export class MediaController implements ReactiveController { host: MediaControllerHost; #mediaStream: MediaStream | null = null; + #sourceStreams: MediaStream[] = []; + #mixContext: AudioContext | null = null; #audioContext: AudioContext | null = null; #analyser: AnalyserNode | null = null; #mediaRecorder: MediaRecorder | null = null; @@ -41,16 +44,24 @@ export class MediaController implements ReactiveController { this.#onTrackEnded = onTrackEnded; this.#dataHandler = dataHandler; - this.#mediaStream = await getMediaStream( + + const capture = await getMediaStream( this.host._selectedDevice?.deviceId, + this.host._virtualMode, this.host._debug_displayAudio, ); - this.#mediaStream.getTracks().forEach((track: MediaStreamTrack) => { - track.addEventListener("ended", () => { - if (this.#onTrackEnded) { - this.#onTrackEnded(); - } + this.#mediaStream = capture.stream; + this.#sourceStreams = capture.sourceStreams; + this.#mixContext = capture.cleanupContext ?? null; + + this.#sourceStreams.forEach((stream) => { + stream.getTracks().forEach((track: MediaStreamTrack) => { + track.addEventListener("ended", () => { + if (this.#onTrackEnded) { + this.#onTrackEnded(); + } + }); }); }); @@ -120,6 +131,19 @@ export class MediaController implements ReactiveController { this.#mediaStream = null; } + this.#sourceStreams.forEach((stream) => { + stream.getTracks().forEach((track) => { + track.stop(); + }); + }); + this.#sourceStreams = []; + + if (this.#mixContext && this.#mixContext.state !== "closed") { + await this.#mixContext.close(); + } + + this.#mixContext = null; + if (this.#audioContext && this.#audioContext.state !== "closed") { await this.#audioContext.close(); } diff --git a/src/icons/icons.ts b/src/icons/icons.ts index fd6c1f5..5618cbd 100644 --- a/src/icons/icons.ts +++ b/src/icons/icons.ts @@ -104,6 +104,41 @@ export class IconSettings extends LitElement { } } +@customElement("icon-headset") +export class IconHeadset extends LitElement { + static styles = css` + :host { + display: inline-flex; + align-items: center; + justify-content: center; + } + svg { + width: 100%; + height: 100%; + display: block; + } + `; + + render() { + return html` + + + + `; + } +} + @customElement("icon-loading-spinner") export class IconLoadingSpinner extends LitElement { static styles = css` diff --git a/src/index.ts b/src/index.ts index ee045ff..2801e11 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,5 @@ import { AmbientRecordingButton } from "./components/ambient-recording-button.js"; +import { AmbientVirtualModeSelector } from "./components/ambient-virtual-mode-selector.js"; import { CortiAmbient } from "./components/corti-ambient.js"; import { CortiDictation } from "./components/corti-dictation.js"; import { DictationDeviceSelector } from "./components/device-selector.js"; @@ -13,6 +14,13 @@ if (!customElements.get("ambient-recording-button")) { customElements.define("ambient-recording-button", AmbientRecordingButton); } +if (!customElements.get("ambient-virtual-mode-selector")) { + customElements.define( + "ambient-virtual-mode-selector", + AmbientVirtualModeSelector, + ); +} + if (!customElements.get("corti-ambient")) { customElements.define("corti-ambient", CortiAmbient); } @@ -56,6 +64,7 @@ if (!customElements.get("dictation-root")) { } export { AmbientRecordingButton } from "./components/ambient-recording-button.js"; +export { AmbientVirtualModeSelector } from "./components/ambient-virtual-mode-selector.js"; export { CortiAmbient } from "./components/corti-ambient.js"; export { CortiDictation } from "./components/corti-dictation.js"; export { DictationDeviceSelector } from "./components/device-selector.js"; @@ -87,6 +96,7 @@ export type { RecordingStateChangedEventDetail, TranscriptEventDetail, UsageEventDetail, + VirtualModeChangedEventDetail, } from "./utils/events.js"; export default CortiDictation; diff --git a/src/styles/ambient-virtual-mode-selector.ts b/src/styles/ambient-virtual-mode-selector.ts new file mode 100644 index 0000000..ffdde68 --- /dev/null +++ b/src/styles/ambient-virtual-mode-selector.ts @@ -0,0 +1,102 @@ +import { css } from "lit"; + +const AmbientVirtualModeSelectorStyles = css` + :host { + display: block; + } + + .virtual-mode-row { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 12px; + width: 100%; + } + + .virtual-mode-content { + display: flex; + flex-direction: column; + gap: 4px; + flex: 1 1 auto; + min-width: 0; + } + + .virtual-mode-header { + display: flex; + align-items: center; + gap: 8px; + line-height: 1; + color: var(--component-text-color, light-dark(#333, #eee)); + } + + .virtual-mode-header icon-headset { + display: inline-flex; + flex-shrink: 0; + width: 14px; + height: 14px; + transform: translateY(-1px); + } + + .virtual-mode-title { + font-size: 0.8rem; + font-weight: 500; + line-height: 1; + color: var(--component-text-color, light-dark(#333, #eee)); + } + + .virtual-mode-description { + font-size: 12px; + line-height: 1.45; + color: var(--component-text-color, light-dark(#333, #eee)); + opacity: 0.6; + } + + .switch { + appearance: none; + -webkit-appearance: none; + position: relative; + width: 36px; + height: 20px; + flex-shrink: 0; + border-radius: 9999px; + background: var(--card-border-color, light-dark(#ddd, #555)); + border: none; + cursor: pointer; + padding: 2px; + transition: background-color 0.15s ease; + margin: 0; + } + + .switch:checked { + background: var(--action-accent-background, light-dark(#007bff, #0056b3)); + } + + .switch::before { + content: ""; + position: absolute; + top: 2px; + left: 2px; + width: 16px; + height: 16px; + border-radius: 9999px; + background: var(--card-background, light-dark(#fff, #fff)); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.15); + transition: transform 0.15s ease; + } + + .switch:checked::before { + transform: translateX(16px); + } + + .switch:disabled { + cursor: not-allowed; + opacity: 0.5; + } + + .switch:focus-visible { + outline: 2px solid var(--action-accent-background, light-dark(#007bff, #0056b3)); + outline-offset: 2px; + } +`; + +export default AmbientVirtualModeSelectorStyles; diff --git a/src/types.ts b/src/types.ts index fa4f48f..d275a47 100644 --- a/src/types.ts +++ b/src/types.ts @@ -13,7 +13,11 @@ export type RecordingState = export type Keybinding = string; -export type ConfigurableSettings = "device" | "language" | "keybinding"; +export type ConfigurableSettings = + | "device" + | "language" + | "keybinding" + | "virtualMode"; export type ProxyOptions = { url: string; diff --git a/src/utils/events.ts b/src/utils/events.ts index 2204f4a..e4252ad 100644 --- a/src/utils/events.ts +++ b/src/utils/events.ts @@ -252,3 +252,17 @@ export function keybindingActivatedEvent( detail: { keyboardEvent }, }); } + +export type VirtualModeChangedEventDetail = { + enabled: boolean; +}; + +export function virtualModeChangedEvent( + enabled: boolean, +): CustomEvent { + return new CustomEvent("virtual-mode-changed", { + bubbles: true, + composed: true, + detail: { enabled }, + }); +} diff --git a/src/utils/media.ts b/src/utils/media.ts index 9552769..49e42e4 100644 --- a/src/utils/media.ts +++ b/src/utils/media.ts @@ -1,22 +1,10 @@ -export async function getMediaStream( - deviceId?: string, - debug_displayAudio?: boolean, -): Promise { - if (debug_displayAudio) { - const stream = await navigator.mediaDevices.getDisplayMedia({ - audio: true, - video: true, - }); - - stream.getTracks().forEach((track) => { - if (track.kind === "video") { - stream.removeTrack(track); - } - }); - - return stream; - } +export type MediaCaptureResult = { + stream: MediaStream; + sourceStreams: MediaStream[]; + cleanupContext?: AudioContext; +}; +async function getMicStream(deviceId?: string): Promise { if (!deviceId) { throw new Error("No device ID provided"); } @@ -29,6 +17,92 @@ export async function getMediaStream( return await navigator.mediaDevices.getUserMedia(constraints); } +async function getDisplayAudioStream(): Promise { + const stream = await navigator.mediaDevices.getDisplayMedia({ + audio: true, + video: true, + }); + + if (stream.getAudioTracks().length === 0) { + stream.getTracks().forEach((track) => { + track.stop(); + }); + throw new Error( + "Virtual mode requires sharing audio. The selected source did not include audio.", + ); + } + + stream.getVideoTracks().forEach((track) => { + stream.removeTrack(track); + track.stop(); + }); + + return stream; +} + +function mixAudioStreams( + micStream: MediaStream, + displayStream: MediaStream, +): { + stream: MediaStream; + cleanupContext: AudioContext; +} { + const audioContext = new AudioContext(); + const destination = audioContext.createMediaStreamDestination(); + const merger = audioContext.createChannelMerger(2); + + merger.connect(destination); + + const microphoneSource = audioContext.createMediaStreamSource(micStream); + microphoneSource.connect(merger, 0, 0); + + const systemSource = audioContext.createMediaStreamSource(displayStream); + systemSource.connect(merger, 0, 1); + + return { + cleanupContext: audioContext, + stream: destination.stream, + }; +} + +export async function getMediaStream( + deviceId?: string, + virtualMode?: boolean, + debug_displayAudio?: boolean, +): Promise { + if (virtualMode) { + const micStream = await getMicStream(deviceId); + try { + const displayStream = await getDisplayAudioStream(); + const mixed = mixAudioStreams(micStream, displayStream); + return { + cleanupContext: mixed.cleanupContext, + sourceStreams: [micStream, displayStream], + stream: mixed.stream, + }; + } catch (error) { + micStream.getTracks().forEach((track) => { + track.stop(); + }); + throw error; + } + } + + if (debug_displayAudio) { + const displayStream = await getDisplayAudioStream(); + return { + sourceStreams: [displayStream], + stream: displayStream, + }; + } + + const micStream = await getMicStream(deviceId); + return { + sourceStreams: [micStream], + stream: micStream, + }; +} + export function createAudioAnalyzer(mediaStream: MediaStream): { audioContext: AudioContext; analyser: AnalyserNode; diff --git a/stories/ambient-root.stories.ts b/stories/ambient-root.stories.ts index 470460f..ea674b8 100644 --- a/stories/ambient-root.stories.ts +++ b/stories/ambient-root.stories.ts @@ -31,7 +31,7 @@ const meta = { noWrapper: false, pushToTalkKeybinding: "Space", recordingState: "stopped", - settingsEnabled: ["device", "language", "keybinding"], + settingsEnabled: ["device", "language", "keybinding", "virtualMode"], toggleToTalkKeybinding: "`", }, argTypes: { @@ -92,6 +92,7 @@ const meta = { @network-activity=${action("network-activity")} @ready=${action("ready")} @recording-devices-changed=${action("recording-devices-changed")} + @virtual-mode-changed=${action("virtual-mode-changed")} @recording-state-changed=${action("recording-state-changed")} @stream-closed=${action("stream-closed")} @transcript=${action("transcript")} @@ -108,6 +109,7 @@ const meta = { @keybinding-changed=${action("keybinding-changed")} @languages-changed=${action("languages-changed")} @recording-devices-changed=${action("recording-devices-changed")} + @virtual-mode-changed=${action("virtual-mode-changed")} @ready=${action("ready")} > diff --git a/stories/corti-ambient.stories.ts b/stories/corti-ambient.stories.ts index 0cbe3c0..8f26b0f 100644 --- a/stories/corti-ambient.stories.ts +++ b/stories/corti-ambient.stories.ts @@ -27,7 +27,7 @@ const meta = { interactionId: "9254ec9b-70e6-45d1-bacb-63d6cce19e86", languagesSupported: languages, pushToTalkKeybinding: "Space", - settingsEnabled: ["device", "language", "keybinding"], + settingsEnabled: ["device", "language", "keybinding", "virtualMode"], toggleToTalkKeybinding: "`", }, argTypes: { @@ -102,6 +102,7 @@ const meta = { @network-activity=${eventAction("network-activity")} @ready=${eventAction("ready")} @recording-devices-changed=${eventAction("recording-devices-changed")} + @virtual-mode-changed=${eventAction("virtual-mode-changed")} @recording-state-changed=${eventAction("recording-state-changed")} @stream-closed=${eventAction("stream-closed")} @transcript=${eventAction("transcript")} @@ -148,7 +149,6 @@ export const AutoLoadLanguagesAndDevices = { render: ({ accessToken, interactionId, - settingsEnabled, allowButtonFocus, pushToTalkKeybinding, toggleToTalkKeybinding, @@ -159,7 +159,6 @@ export const AutoLoadLanguagesAndDevices = { `; }, diff --git a/stories/settings-menu.stories.ts b/stories/settings-menu.stories.ts index 6b3763a..3ca5480 100644 --- a/stories/settings-menu.stories.ts +++ b/stories/settings-menu.stories.ts @@ -4,6 +4,7 @@ import { action } from "storybook/actions"; import type { DictationSettingsMenu } from "../src/components/settings-menu.js"; import "../src/components/settings-menu.js"; +import "../src/contexts/ambient-context.js"; import "../src/contexts/dictation-context.js"; import type { DictationRoot } from "../src/contexts/dictation-context.js"; import DeviceSelectorStoryMeta, { @@ -58,7 +59,7 @@ const meta = { settingsEnabled: { control: "check", description: "Which settings to enable in the settings menu", - options: ["device", "language", "keybinding"], + options: ["device", "language", "keybinding", "virtualMode"], }, }, component: "dictation-settings-menu", @@ -89,6 +90,7 @@ const meta = { @keybinding-changed=${action("keybinding-changed")} @languages-changed=${action("languages-changed")} @recording-devices-changed=${action("recording-devices-changed")} + @virtual-mode-changed=${action("virtual-mode-changed")} @ready=${action("ready")} @error=${action("error")} /> @@ -169,3 +171,19 @@ export const OnlyKeybindingSelector = { }, argTypes: disableControls(["settingsEnabled", "devices", "languages"]), } as StoryObj; + +export const OnlyVirtualMode = { + args: { + settingsEnabled: ["virtualMode"], + }, + argTypes: disableControls(["settingsEnabled", "devices", "languages"]), + render: ({ settingsEnabled, recordingState }) => html` + + + + `, +} as StoryObj; From 37aa802b339e6543453d97fa30eb4e6b85211157 Mon Sep 17 00:00:00 2001 From: markitosha Date: Mon, 18 May 2026 15:28:27 +0200 Subject: [PATCH 16/50] feat: implement virtual mode support for ambient recording and update context handling --- src/components/corti-ambient.ts | 16 ++++++++++++++++ src/components/recording-button-base.ts | 4 ++++ src/contexts/ambient-context.ts | 18 +++++++++++++++++- 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/components/corti-ambient.ts b/src/components/corti-ambient.ts index 6dbab05..1b7a9ca 100644 --- a/src/components/corti-ambient.ts +++ b/src/components/corti-ambient.ts @@ -67,6 +67,21 @@ export class CortiAmbient extends CortiRoot< @state() _interactionId?: string; + /** + * Enables virtual mode behavior for ambient recording. + */ + @property({ attribute: "virtualMode", type: Boolean }) + set virtualMode(value: boolean) { + this._virtualMode = value; + } + + get virtualMode(): boolean { + return this._contextProviderRef.value?.virtualMode ?? this._virtualMode; + } + + @state() + _virtualMode: boolean = false; + // ───────────────────────────────────────────────────────────────────────────── // Render // ───────────────────────────────────────────────────────────────────────────── @@ -88,6 +103,7 @@ export class CortiAmbient extends CortiRoot< .socketProxy=${this.socketProxy} .ambientConfig=${this._ambientConfig} .interactionId=${this._interactionId} + ?virtualMode=${this.virtualMode} .languages=${this._languagesSupported} .devices=${this._devices} .selectedDevice=${this._selectedDevice} diff --git a/src/components/recording-button-base.ts b/src/components/recording-button-base.ts index b6a51ac..3f790df 100644 --- a/src/components/recording-button-base.ts +++ b/src/components/recording-button-base.ts @@ -285,7 +285,11 @@ export abstract class RecordingButtonBase< this.#mediaController.stopAudioLevelMonitoring(); await this.#mediaController.stopRecording(); await this._socketController.stopRecording(); + } catch (error) { + this.dispatchEvent(errorEvent(error)); + } + try { await this.#mediaController.cleanup(); } catch (error) { this.dispatchEvent(errorEvent(error)); diff --git a/src/contexts/ambient-context.ts b/src/contexts/ambient-context.ts index c053a3f..a140650 100644 --- a/src/contexts/ambient-context.ts +++ b/src/contexts/ambient-context.ts @@ -26,7 +26,7 @@ export class AmbientRoot extends RootContext { interactionId?: string; @provide({ context: virtualModeContext }) - @property({ attribute: "virtual-mode", type: Boolean }) + @property({ attribute: "virtualMode", type: Boolean }) virtualMode: boolean = false; constructor() { @@ -35,6 +35,22 @@ export class AmbientRoot extends RootContext { this.addEventListener("virtual-mode-changed", (e: Event) => { const event = e as CustomEvent<{ enabled: boolean }>; this.virtualMode = event.detail.enabled; + + if (!event.detail.enabled) { + return; + } + + // Set multichannel transcription for virtual mode + const base = this.ambientConfig ?? DEFAULT_STREAM_CONFIG; + + this.ambientConfig = { + ...base, + transcription: { + ...base.transcription, + isDiarization: false, + isMultichannel: true, + }, + }; }); this.addEventListener("languages-changed", (e: Event) => { From 1443fe36ae91560c0d46c43d9b30e107f28dd51b Mon Sep 17 00:00:00 2001 From: Juozas Peleckas Date: Tue, 19 May 2026 19:16:55 +0300 Subject: [PATCH 17/50] fix: pass partcipants to the WS configuration if virtual mode enebled --- src/contexts/ambient-context.ts | 37 +++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/src/contexts/ambient-context.ts b/src/contexts/ambient-context.ts index a140650..c49efc1 100644 --- a/src/contexts/ambient-context.ts +++ b/src/contexts/ambient-context.ts @@ -35,22 +35,33 @@ export class AmbientRoot extends RootContext { this.addEventListener("virtual-mode-changed", (e: Event) => { const event = e as CustomEvent<{ enabled: boolean }>; this.virtualMode = event.detail.enabled; - - if (!event.detail.enabled) { - return; - } - // Set multichannel transcription for virtual mode const base = this.ambientConfig ?? DEFAULT_STREAM_CONFIG; - this.ambientConfig = { - ...base, - transcription: { - ...base.transcription, - isDiarization: false, - isMultichannel: true, - }, - }; + if (event.detail.enabled) { + this.ambientConfig = { + ...base, + transcription: { + ...base.transcription, + isDiarization: false, + isMultichannel: true, + participants: [ + { channel: 0, role: "doctor" }, + { channel: 1, role: "patient" }, + ], + }, + }; + } else { + this.ambientConfig = { + ...base, + transcription: { + ...base.transcription, + isDiarization: true, + isMultichannel: false, + participants: [], + }, + }; + } }); this.addEventListener("languages-changed", (e: Event) => { From 8e8426c059a682eeb042f8d01b5018056bc68367 Mon Sep 17 00:00:00 2001 From: markitosha Date: Mon, 1 Jun 2026 12:01:48 +0200 Subject: [PATCH 18/50] chore: update @corti/sdk dependency to version 3.0.0 --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 92feb08..34612a3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "0.0.0-dev", "license": "MIT", "dependencies": { - "@corti/sdk": "2.0.0", + "@corti/sdk": "3.0.0", "@lit/context": "^1.1.6", "lit": "^3.3.1" }, @@ -282,9 +282,9 @@ } }, "node_modules/@corti/sdk": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@corti/sdk/-/sdk-2.0.0.tgz", - "integrity": "sha512-dF3S5i9w42s3FhJgmi7r9/6Zi5q75BlRswMnJcY/GQ79lljXjQyyXUL1xxrBFhm/XLGfZTo8TLEhBjxDo7FlDg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@corti/sdk/-/sdk-3.0.0.tgz", + "integrity": "sha512-MWuhqsU/G8DGARrq8eMfm9GjwsrKvvvKKymeP+WxaV3wGNogWWPBidrtScIabjo64Okv7+79gxArelwUc2X8VQ==", "license": "MIT", "dependencies": { "ws": "^8.16.0" diff --git a/package.json b/package.json index 03b5e2c..5605992 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "storybook:build": "tsc && tsc -p tsconfig.stories.json && npm run analyze -- --exclude dist && storybook build" }, "dependencies": { - "@corti/sdk": "2.0.0", + "@corti/sdk": "3.0.0", "@lit/context": "^1.1.6", "lit": "^3.3.1" }, From 3d7eb84f5a8412cd07a7c6ce2519a5f9633977de Mon Sep 17 00:00:00 2001 From: markitosha Date: Mon, 1 Jun 2026 13:01:59 +0200 Subject: [PATCH 19/50] feat: add audio event handling to ambient components and update event types --- src/components/recording-button-base.ts | 4 ++++ src/controllers/ambient-controller.ts | 3 ++- src/controllers/dictation-controller.ts | 3 ++- src/index.ts | 1 + src/utils/events.ts | 14 ++++++++++++++ 5 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/components/recording-button-base.ts b/src/components/recording-button-base.ts index 3f790df..5a0d23a 100644 --- a/src/components/recording-button-base.ts +++ b/src/components/recording-button-base.ts @@ -42,6 +42,7 @@ import type { RecordingState, } from "../types.js"; import { + audioEventEvent, audioLevelChangedEvent, commandEvent, deltaUsageEvent, @@ -179,6 +180,9 @@ export abstract class RecordingButtonBase< case "delta_usage": this.dispatchEvent(deltaUsageEvent(message)); break; + case "audioEvent": + this.dispatchEvent(audioEventEvent(message)); + break; case "error": this.dispatchEvent(errorEvent(message.error)); this.#handleStop(); diff --git a/src/controllers/ambient-controller.ts b/src/controllers/ambient-controller.ts index bbe9c7d..9ee2d2d 100644 --- a/src/controllers/ambient-controller.ts +++ b/src/controllers/ambient-controller.ts @@ -23,7 +23,8 @@ export type StreamAmbientMessage = | Corti.StreamEndedMessage | Corti.StreamUsageMessage | Corti.StreamErrorMessage - | Corti.StreamConfigStatusMessage; + | Corti.StreamConfigStatusMessage + | Corti.StreamAudioEventMessage; type OutboundItem = Blob | Corti.StreamEndMessage; diff --git a/src/controllers/dictation-controller.ts b/src/controllers/dictation-controller.ts index 1a9d354..1a7515c 100644 --- a/src/controllers/dictation-controller.ts +++ b/src/controllers/dictation-controller.ts @@ -18,7 +18,8 @@ export type TranscribeMessage = | Corti.TranscribeErrorMessage | Corti.TranscribeTranscriptMessage | Corti.TranscribeCommandMessage - | Corti.TranscribeFlushedMessage; + | Corti.TranscribeFlushedMessage + | Corti.TranscribeAudioEventMessage; type OutboundItem = | Blob diff --git a/src/index.ts b/src/index.ts index 2801e11..0dd941f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -82,6 +82,7 @@ export type { RecordingState, } from "./types.js"; export type { + AudioEventEventDetail, AudioLevelChangedEventDetail, CommandEventDetail, DeltaUsageEventDetail, diff --git a/src/utils/events.ts b/src/utils/events.ts index e4252ad..4d3d4ef 100644 --- a/src/utils/events.ts +++ b/src/utils/events.ts @@ -41,6 +41,10 @@ export type DeltaUsageEventDetail = export type FactsEventDetail = Corti.StreamFactsMessage; +export type AudioEventEventDetail = + | Corti.TranscribeAudioEventMessage + | Corti.StreamAudioEventMessage; + export type ErrorEventDetail = { message: string; }; @@ -148,6 +152,16 @@ export function factsEvent( }); } +export function audioEventEvent( + detail: AudioEventEventDetail, +): CustomEvent { + return new CustomEvent("audio-event", { + bubbles: true, + composed: true, + detail, + }); +} + function errorToMessage(error: unknown): string { if (error instanceof Error) { return error.message; From e36c7502b8ca6d831259418ee58b7343e1251afd Mon Sep 17 00:00:00 2001 From: markitosha Date: Mon, 1 Jun 2026 16:30:23 +0200 Subject: [PATCH 20/50] feat: implement dual custom elements for ambient components and update README --- README.md | 12 +++- src/components/audio-visualiser.ts | 6 +- src/components/corti-ambient.ts | 4 +- src/components/device-selector.ts | 6 +- src/components/keybinding-input.ts | 6 +- src/components/keybinding-selector.ts | 10 ++- src/components/language-selector.ts | 6 +- src/components/settings-menu.ts | 6 +- src/index.ts | 87 ++++----------------------- 9 files changed, 52 insertions(+), 91 deletions(-) diff --git a/README.md b/README.md index 849825a..e96e268 100644 --- a/README.md +++ b/README.md @@ -40,12 +40,18 @@ For more control and flexibility, you can use individual components: - **``** - Language selection dropdown - **``** - Keybinding configuration component for keyboard shortcuts (supports both push-to-talk and toggle-to-talk) -Ambient stream components: +Ambient stream components (parallel modular set; shared selectors use the same implementation with `ambient-*` tags): - **``** - All-in-one ambient capture component (includes virtual mode by default in settings) - **``** - Context provider for ambient stream sessions -- **``** - Recording button for ambient capture -- **``** - Toggles virtual mode: captures the selected microphone plus audio from a shared browser tab, window, or application (mixed as separate channels in one stream) +- **``** - Standalone recording button with audio visualization +- **``** - Settings menu with device, language, keybinding, and optional virtual mode +- **``** - Device selection dropdown +- **``** - Language selection dropdown +- **``** - Keybinding configuration (push-to-talk and toggle-to-talk) +- **``** - Virtual mode toggle (ambient only; tab/window/app audio mixed with microphone) + +Device, language, keybinding selectors, and settings menu are registered under both `dictation-*` and `ambient-*` tag names. TypeScript exports mirror that: `DictationDeviceSelector` / `AmbientDeviceSelector`, and so on. These components share state through a context system, allowing you to build custom UIs while leveraging the same underlying functionality. diff --git a/src/components/audio-visualiser.ts b/src/components/audio-visualiser.ts index 30402bd..215efc1 100644 --- a/src/components/audio-visualiser.ts +++ b/src/components/audio-visualiser.ts @@ -1,12 +1,13 @@ import { html, LitElement, type PropertyValues } from "lit"; -import { customElement, property } from "lit/decorators.js"; +import { property } from "lit/decorators.js"; import { classMap } from "lit/directives/class-map.js"; import { map } from "lit/directives/map.js"; import { range } from "lit/directives/range.js"; import AudioVisualiserStyles from "../styles/audio-visualiser.js"; +import { dualCustomElement } from "../utils/custom-elements.js"; import { normalizeToRange } from "../utils/validation.js"; -@customElement("dictation-audio-visualiser") +@dualCustomElement("dictation-audio-visualiser", "ambient-audio-visualiser") export class DictationAudioVisualiser extends LitElement { @property({ type: Number }) level: number = 0; @@ -50,6 +51,7 @@ export class DictationAudioVisualiser extends LitElement { declare global { interface HTMLElementTagNameMap { + "ambient-audio-visualiser": DictationAudioVisualiser; "dictation-audio-visualiser": DictationAudioVisualiser; } } diff --git a/src/components/corti-ambient.ts b/src/components/corti-ambient.ts index 1b7a9ca..de5349b 100644 --- a/src/components/corti-ambient.ts +++ b/src/components/corti-ambient.ts @@ -116,9 +116,9 @@ export class CortiAmbient extends CortiRoot< > ${ this.settingsEnabled?.length > 0 - ? html`` + >` : nothing } diff --git a/src/components/device-selector.ts b/src/components/device-selector.ts index 5ddc075..1c1e360 100644 --- a/src/components/device-selector.ts +++ b/src/components/device-selector.ts @@ -1,14 +1,15 @@ import { consume } from "@lit/context"; import { html, LitElement } from "lit"; -import { customElement, property, state } from "lit/decorators.js"; +import { property, state } from "lit/decorators.js"; import { devicesContext, selectedDeviceContext, } from "../contexts/mixins/devices-context.js"; import SelectStyles from "../styles/select.js"; +import { dualCustomElement } from "../utils/custom-elements.js"; import { recordingDevicesChangedEvent } from "../utils/events.js"; -@customElement("dictation-device-selector") +@dualCustomElement("dictation-device-selector", "ambient-device-selector") export class DictationDeviceSelector extends LitElement { @consume({ context: devicesContext, subscribe: true }) @state() @@ -66,6 +67,7 @@ export class DictationDeviceSelector extends LitElement { declare global { interface HTMLElementTagNameMap { + "ambient-device-selector": DictationDeviceSelector; "dictation-device-selector": DictationDeviceSelector; } } diff --git a/src/components/keybinding-input.ts b/src/components/keybinding-input.ts index 0fe0a60..c8dc8d6 100644 --- a/src/components/keybinding-input.ts +++ b/src/components/keybinding-input.ts @@ -1,15 +1,16 @@ import { consume } from "@lit/context"; import { html, LitElement } from "lit"; -import { customElement, property, state } from "lit/decorators.js"; +import { property, state } from "lit/decorators.js"; import { pushToTalkKeybindingContext, toggleToTalkKeybindingContext, } from "../contexts/mixins/keybindings-context.js"; import KeybindingSelectorStyles from "../styles/keybinding-selector.js"; import { keybindingChangedEvent } from "../utils/events.js"; +import { dualCustomElement } from "../utils/custom-elements.js"; import { normalizeKeybinding } from "../utils/keybinding.js"; -@customElement("dictation-keybinding-input") +@dualCustomElement("dictation-keybinding-input", "ambient-keybinding-input") export class DictationKeybindingInput extends LitElement { @property({ type: String }) keybindingType: "push-to-talk" | "toggle-to-talk" = "toggle-to-talk"; @@ -92,6 +93,7 @@ export class DictationKeybindingInput extends LitElement { declare global { interface HTMLElementTagNameMap { + "ambient-keybinding-input": DictationKeybindingInput; "dictation-keybinding-input": DictationKeybindingInput; } } diff --git a/src/components/keybinding-selector.ts b/src/components/keybinding-selector.ts index 2514ab9..925ca8b 100644 --- a/src/components/keybinding-selector.ts +++ b/src/components/keybinding-selector.ts @@ -1,15 +1,20 @@ import { consume } from "@lit/context"; import { html, LitElement } from "lit"; -import { customElement, property, state } from "lit/decorators.js"; +import { property, state } from "lit/decorators.js"; import { pushToTalkKeybindingContext, toggleToTalkKeybindingContext, } from "../contexts/mixins/keybindings-context.js"; import KeybindingSelectorStyles from "../styles/keybinding-selector.js"; +import { dualCustomElement } from "../utils/custom-elements.js"; + import "./keybinding-input.js"; -@customElement("dictation-keybinding-selector") +@dualCustomElement( + "dictation-keybinding-selector", + "ambient-keybinding-selector", +) export class DictationKeybindingSelector extends LitElement { @consume({ context: pushToTalkKeybindingContext, subscribe: true }) @state() @@ -48,6 +53,7 @@ export class DictationKeybindingSelector extends LitElement { declare global { interface HTMLElementTagNameMap { + "ambient-keybinding-selector": DictationKeybindingSelector; "dictation-keybinding-selector": DictationKeybindingSelector; } } diff --git a/src/components/language-selector.ts b/src/components/language-selector.ts index 3ee8135..0439f10 100644 --- a/src/components/language-selector.ts +++ b/src/components/language-selector.ts @@ -1,7 +1,7 @@ import type { Corti } from "@corti/sdk"; import { consume } from "@lit/context"; import { html, LitElement } from "lit"; -import { customElement, property, state } from "lit/decorators.js"; +import { property, state } from "lit/decorators.js"; import { languagesContext, selectedLanguageContext, @@ -11,9 +11,10 @@ import { languageChangedEvent, languagesChangedEvent, } from "../utils/events.js"; +import { dualCustomElement } from "../utils/custom-elements.js"; import { getLanguageName } from "../utils/languages.js"; -@customElement("dictation-language-selector") +@dualCustomElement("dictation-language-selector", "ambient-language-selector") export class DictationLanguageSelector extends LitElement { @consume({ context: languagesContext, subscribe: true }) @state() @@ -68,6 +69,7 @@ export class DictationLanguageSelector extends LitElement { declare global { interface HTMLElementTagNameMap { + "ambient-language-selector": DictationLanguageSelector; "dictation-language-selector": DictationLanguageSelector; } } diff --git a/src/components/settings-menu.ts b/src/components/settings-menu.ts index d75f624..0ac92f5 100644 --- a/src/components/settings-menu.ts +++ b/src/components/settings-menu.ts @@ -1,12 +1,13 @@ import { consume } from "@lit/context"; import { type CSSResultGroup, html, LitElement, nothing } from "lit"; -import { customElement, property, state } from "lit/decorators.js"; +import { property, state } from "lit/decorators.js"; import { recordingStateContext } from "../contexts/mixins/recording-state-context.js"; import ButtonStyles from "../styles/buttons.js"; import CalloutStyles from "../styles/callout.js"; import SettingsMenuStyles from "../styles/settings-menu.js"; import type { ConfigurableSettings, RecordingState } from "../types.js"; import { commaSeparatedConverter } from "../utils/converters.js"; +import { dualCustomElement } from "../utils/custom-elements.js"; import "./ambient-virtual-mode-selector.js"; import "./device-selector.js"; @@ -14,7 +15,7 @@ import "./keybinding-selector.js"; import "./language-selector.js"; import "../icons/icons.js"; -@customElement("dictation-settings-menu") +@dualCustomElement("dictation-settings-menu", "ambient-settings-menu") export class DictationSettingsMenu extends LitElement { @consume({ context: recordingStateContext, subscribe: true }) @state() @@ -96,6 +97,7 @@ export class DictationSettingsMenu extends LitElement { declare global { interface HTMLElementTagNameMap { + "ambient-settings-menu": DictationSettingsMenu; "dictation-settings-menu": DictationSettingsMenu; } } diff --git a/src/index.ts b/src/index.ts index 0dd941f..3581301 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,79 +1,20 @@ -import { AmbientRecordingButton } from "./components/ambient-recording-button.js"; -import { AmbientVirtualModeSelector } from "./components/ambient-virtual-mode-selector.js"; -import { CortiAmbient } from "./components/corti-ambient.js"; -import { CortiDictation } from "./components/corti-dictation.js"; -import { DictationDeviceSelector } from "./components/device-selector.js"; -import { DictationRecordingButton } from "./components/dictation-recording-button.js"; -import { DictationKeybindingSelector } from "./components/keybinding-selector.js"; -import { DictationLanguageSelector } from "./components/language-selector.js"; -import { DictationSettingsMenu } from "./components/settings-menu.js"; -import { AmbientRoot } from "./contexts/ambient-context.js"; -import { DictationRoot } from "./contexts/dictation-context.js"; - -if (!customElements.get("ambient-recording-button")) { - customElements.define("ambient-recording-button", AmbientRecordingButton); -} - -if (!customElements.get("ambient-virtual-mode-selector")) { - customElements.define( - "ambient-virtual-mode-selector", - AmbientVirtualModeSelector, - ); -} - -if (!customElements.get("corti-ambient")) { - customElements.define("corti-ambient", CortiAmbient); -} - -if (!customElements.get("corti-dictation")) { - customElements.define("corti-dictation", CortiDictation); -} - -if (!customElements.get("dictation-recording-button")) { - customElements.define("dictation-recording-button", DictationRecordingButton); -} - -if (!customElements.get("dictation-device-selector")) { - customElements.define("dictation-device-selector", DictationDeviceSelector); -} - -if (!customElements.get("dictation-language-selector")) { - customElements.define( - "dictation-language-selector", - DictationLanguageSelector, - ); -} - -if (!customElements.get("dictation-keybinding-selector")) { - customElements.define( - "dictation-keybinding-selector", - DictationKeybindingSelector, - ); -} - -if (!customElements.get("dictation-settings-menu")) { - customElements.define("dictation-settings-menu", DictationSettingsMenu); -} - -if (!customElements.get("ambient-root")) { - customElements.define("ambient-root", AmbientRoot); -} - -if (!customElements.get("dictation-root")) { - customElements.define("dictation-root", DictationRoot); -} - -export { AmbientRecordingButton } from "./components/ambient-recording-button.js"; -export { AmbientVirtualModeSelector } from "./components/ambient-virtual-mode-selector.js"; -export { CortiAmbient } from "./components/corti-ambient.js"; +export { CortiDictation as default } from "./components/corti-dictation.js"; export { CortiDictation } from "./components/corti-dictation.js"; -export { DictationDeviceSelector } from "./components/device-selector.js"; +export { DictationRoot } from "./contexts/dictation-context.js"; export { DictationRecordingButton } from "./components/dictation-recording-button.js"; -export { DictationKeybindingSelector } from "./components/keybinding-selector.js"; -export { DictationLanguageSelector } from "./components/language-selector.js"; export { DictationSettingsMenu } from "./components/settings-menu.js"; +export { DictationDeviceSelector } from "./components/device-selector.js"; +export { DictationLanguageSelector } from "./components/language-selector.js"; +export { DictationKeybindingSelector } from "./components/keybinding-selector.js"; + +export { CortiAmbient } from "./components/corti-ambient.js"; export { AmbientRoot } from "./contexts/ambient-context.js"; -export { DictationRoot } from "./contexts/dictation-context.js"; +export { AmbientRecordingButton } from "./components/ambient-recording-button.js"; +export { DictationSettingsMenu as AmbientSettingsMenu } from "./components/settings-menu.js"; +export { DictationDeviceSelector as AmbientDeviceSelector } from "./components/device-selector.js"; +export { DictationLanguageSelector as AmbientLanguageSelector } from "./components/language-selector.js"; +export { DictationKeybindingSelector as AmbientKeybindingSelector } from "./components/keybinding-selector.js"; +export { AmbientVirtualModeSelector } from "./components/ambient-virtual-mode-selector.js"; export type { AmbientStreamSessionConfig } from "./controllers/ambient-controller.js"; export type { @@ -99,5 +40,3 @@ export type { UsageEventDetail, VirtualModeChangedEventDetail, } from "./utils/events.js"; - -export default CortiDictation; From 6b7986add47e992459a1947a49e51716b221b7bd Mon Sep 17 00:00:00 2001 From: markitosha Date: Tue, 2 Jun 2026 15:26:12 +0200 Subject: [PATCH 21/50] feat: update CI configuration for ambient web component and adjust package structure --- .github/workflows/ci.yml | 40 +++++++++++++++++++++++++---- package.ambient.json | 45 +++++++++++++++++++++++++++++++++ package.dictation.json | 44 ++++++++++++++++++++++++++++++++ package.json | 49 +++++------------------------------- src/ambient-index.ts | 33 ++++++++++++++++++++++++ src/index.ts | 12 --------- src/utils/custom-elements.ts | 18 +++++++++++++ tsconfig.ambient.json | 9 +++++++ tsconfig.dictation.json | 9 +++++++ 9 files changed, 199 insertions(+), 60 deletions(-) create mode 100644 package.ambient.json create mode 100644 package.dictation.json create mode 100644 src/ambient-index.ts create mode 100644 src/utils/custom-elements.ts create mode 100644 tsconfig.ambient.json create mode 100644 tsconfig.dictation.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 804fe3d..1f26b0f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,7 +23,7 @@ jobs: run: npm ci - name: Build - run: npm run build && npm run build:bundle + run: npm run build lint: runs-on: ubuntu-latest @@ -100,18 +100,48 @@ jobs: - name: Set version run: | - npm version ${{ steps.version.outputs.version }} --no-git-tag-version - echo "package.json version set to $(node -p "require('./package.json').version")" + VERSION="${{ steps.version.outputs.version }}" + for f in package.dictation.json package.ambient.json; do + node -e " + const fs = require('fs'); + const pkg = JSON.parse(fs.readFileSync('${f}', 'utf8')); + pkg.version = '${VERSION}'; + fs.writeFileSync('${f}', JSON.stringify(pkg, null, 2) + '\n'); + " + done + echo "Publish manifests version set to ${VERSION}" - name: Build - run: npm run build && npm run build:bundle + run: npm run build - - name: Publish to npm + - name: Publish @corti/dictation-web run: | publish() { # use latest npm to ensure OIDC support npx -y npm@latest publish "$@" } SUFFIX="${{ steps.version.outputs.suffix }}" + cd dist/dictation + if [[ -n "$SUFFIX" ]]; then + publish --access public --tag "$SUFFIX" + else + PKG_NAME=$(node -p "require('./package.json').name") + PKG_VERSION=$(node -p "require('./package.json').version") + CURRENT_LATEST=$(npm view "${PKG_NAME}" dist-tags.latest 2>/dev/null || echo "0.0.0") + if npx -y semver "${PKG_VERSION}" -r "<${CURRENT_LATEST}" > /dev/null 2>&1; then + echo "Publishing ${PKG_VERSION} with --tag backport (current latest is ${CURRENT_LATEST})" + publish --access public --tag backport + else + publish --access public + fi + fi + + - name: Publish @corti/ambient-web + run: | + publish() { # use latest npm to ensure OIDC support + npx -y npm@latest publish "$@" + } + SUFFIX="${{ steps.version.outputs.suffix }}" + cd dist/ambient if [[ -n "$SUFFIX" ]]; then publish --access public --tag "$SUFFIX" else diff --git a/package.ambient.json b/package.ambient.json new file mode 100644 index 0000000..6ea96ac --- /dev/null +++ b/package.ambient.json @@ -0,0 +1,45 @@ +{ + "name": "@corti/ambient-web", + "description": "Web component for Corti Ambient", + "author": "Corti ApS", + "version": "0.0.0", + "license": "MIT", + "type": "module", + "main": "index.js", + "module": "index.js", + "types": "index.d.ts", + "exports": { + ".": { + "types": "./index.d.ts", + "import": "./index.js", + "browser": "./bundle.js", + "default": "./bundle.js" + } + }, + "jsdelivr": "./bundle.js", + "browser": "./bundle.js", + "bugs": { + "url": "https://docs.corti.ai", + "email": "help@corti.ai" + }, + "repository": "github:corticph/dictation-web", + "homepage": "https://docs.corti.ai/sdk/ambient/overview", + "keywords": [ + "corti", + "ambient", + "web", + "sdk", + "speech", + "recognition", + "transcription", + "audio", + "medical", + "healthcare", + "real-time" + ], + "dependencies": { + "@corti/sdk": "3.0.0", + "@lit/context": "^1.1.6", + "lit": "^3.3.1" + } +} diff --git a/package.dictation.json b/package.dictation.json new file mode 100644 index 0000000..63e9d09 --- /dev/null +++ b/package.dictation.json @@ -0,0 +1,44 @@ +{ + "name": "@corti/dictation-web", + "description": "Web component for Corti Dictation", + "author": "Corti ApS", + "version": "0.0.0", + "license": "MIT", + "type": "module", + "main": "index.js", + "module": "index.js", + "types": "index.d.ts", + "exports": { + ".": { + "types": "./index.d.ts", + "import": "./index.js", + "browser": "./bundle.js", + "default": "./bundle.js" + } + }, + "jsdelivr": "./bundle.js", + "browser": "./bundle.js", + "bugs": { + "url": "https://docs.corti.ai", + "email": "help@corti.ai" + }, + "repository": "github:corticph/dictation-web", + "homepage": "https://docs.corti.ai/sdk/dictation/overview", + "keywords": [ + "corti", + "dictation", + "web", + "sdk", + "speech", + "recognition", + "transcription", + "audio", + "medical", + "healthcare" + ], + "dependencies": { + "@corti/sdk": "3.0.0", + "@lit/context": "^1.1.6", + "lit": "^3.3.1" + } +} diff --git a/package.json b/package.json index 5605992..40cc905 100644 --- a/package.json +++ b/package.json @@ -1,50 +1,13 @@ { - "name": "@corti/dictation-web", - "description": "Web component for Corti Dictation", - "author": "Corti ApS", - "version": "0.0.0-dev", - "license": "MIT", + "private": true, + "description": "Web components for Corti Speech (dictation + ambient)", "type": "module", - "main": "dist/index.js", - "module": "dist/index.js", - "types": "dist/index.d.ts", - "exports": { - ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.js", - "browser": "./dist/bundle.js", - "default": "./dist/bundle.js" - } - }, - "jsdelivr": "./dist/bundle.js", - "browser": "./dist/bundle.js", - "files": [ - "dist" - ], - "bugs": { - "url": "https://docs.corti.ai", - "email": "help@corti.ai" - }, - "repository": "github:corticph/dictation-web", - "homepage": "https://docs.corti.ai/stt/dictation-web", - "keywords": [ - "corti", - "dictation", - "web", - "sdk", - "speech", - "recognition", - "transcription", - "audio", - "medical", - "healthcare" - ], "scripts": { "analyze": "cem analyze --litelement", - "build": "tsc && npm run analyze -- --exclude dist", - "build:bundle": "esbuild dist/index.js --bundle --outfile=dist/bundle.js --format=esm --platform=browser", - "release": "npm run build && npm run build:bundle && npm publish --access public", - "prepublish": "tsc && npm run analyze -- --exclude dist", + "build:dictation": "tsc -p tsconfig.dictation.json && esbuild dist/dictation/index.js --bundle --outfile=dist/dictation/bundle.js --format=esm --platform=browser && cp package.dictation.json dist/dictation/package.json", + "build:ambient": "tsc -p tsconfig.ambient.json && mv dist/ambient/ambient-index.js dist/ambient/index.js && mv dist/ambient/ambient-index.d.ts dist/ambient/index.d.ts && (mv dist/ambient/ambient-index.js.map dist/ambient/index.js.map 2>/dev/null || true) && esbuild dist/ambient/index.js --bundle --outfile=dist/ambient/bundle.js --format=esm --platform=browser && cp package.ambient.json dist/ambient/package.json", + "build": "npm run build:dictation && npm run build:ambient && npm run analyze -- --exclude dist", + "prepublish": "tsc -p tsconfig.dictation.json && tsc -p tsconfig.ambient.json && npm run analyze -- --exclude dist", "lint": "biome check .", "format": "biome format --write .", "biome:check": "biome check .", diff --git a/src/ambient-index.ts b/src/ambient-index.ts new file mode 100644 index 0000000..27ed5f3 --- /dev/null +++ b/src/ambient-index.ts @@ -0,0 +1,33 @@ +export { CortiAmbient as default } from "./components/corti-ambient.js"; +export { CortiAmbient } from "./components/corti-ambient.js"; +export { AmbientRoot } from "./contexts/ambient-context.js"; +export { AmbientRecordingButton } from "./components/ambient-recording-button.js"; +export { DictationSettingsMenu as AmbientSettingsMenu } from "./components/settings-menu.js"; +export { DictationDeviceSelector as AmbientDeviceSelector } from "./components/device-selector.js"; +export { DictationLanguageSelector as AmbientLanguageSelector } from "./components/language-selector.js"; +export { DictationKeybindingSelector as AmbientKeybindingSelector } from "./components/keybinding-selector.js"; +export { AmbientVirtualModeSelector } from "./components/ambient-virtual-mode-selector.js"; + +export type { AmbientStreamSessionConfig } from "./controllers/ambient-controller.js"; +export type { + ConfigurableSettings, + Keybinding, + RecordingState, +} from "./types.js"; +export type { + AudioEventEventDetail, + AudioLevelChangedEventDetail, + DeltaUsageEventDetail, + ErrorEventDetail, + FactsEventDetail, + KeybindingActivatedEventDetail, + KeybindingChangedEventDetail, + LanguageChangedEventDetail, + LanguagesChangedEventDetail, + NetworkActivityEventDetail, + RecordingDevicesChangedEventDetail, + RecordingStateChangedEventDetail, + TranscriptEventDetail, + UsageEventDetail, + VirtualModeChangedEventDetail, +} from "./utils/events.js"; diff --git a/src/index.ts b/src/index.ts index 3581301..1b30f6a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -7,16 +7,6 @@ export { DictationDeviceSelector } from "./components/device-selector.js"; export { DictationLanguageSelector } from "./components/language-selector.js"; export { DictationKeybindingSelector } from "./components/keybinding-selector.js"; -export { CortiAmbient } from "./components/corti-ambient.js"; -export { AmbientRoot } from "./contexts/ambient-context.js"; -export { AmbientRecordingButton } from "./components/ambient-recording-button.js"; -export { DictationSettingsMenu as AmbientSettingsMenu } from "./components/settings-menu.js"; -export { DictationDeviceSelector as AmbientDeviceSelector } from "./components/device-selector.js"; -export { DictationLanguageSelector as AmbientLanguageSelector } from "./components/language-selector.js"; -export { DictationKeybindingSelector as AmbientKeybindingSelector } from "./components/keybinding-selector.js"; -export { AmbientVirtualModeSelector } from "./components/ambient-virtual-mode-selector.js"; - -export type { AmbientStreamSessionConfig } from "./controllers/ambient-controller.js"; export type { ConfigurableSettings, Keybinding, @@ -28,7 +18,6 @@ export type { CommandEventDetail, DeltaUsageEventDetail, ErrorEventDetail, - FactsEventDetail, KeybindingActivatedEventDetail, KeybindingChangedEventDetail, LanguageChangedEventDetail, @@ -38,5 +27,4 @@ export type { RecordingStateChangedEventDetail, TranscriptEventDetail, UsageEventDetail, - VirtualModeChangedEventDetail, } from "./utils/events.js"; diff --git a/src/utils/custom-elements.ts b/src/utils/custom-elements.ts new file mode 100644 index 0000000..1653f9f --- /dev/null +++ b/src/utils/custom-elements.ts @@ -0,0 +1,18 @@ +type CustomElementClass = CustomElementConstructor & { + new (...args: unknown[]): HTMLElement; +}; + +/** Registers the class under both `dictation-*` and `ambient-*` tag names. */ +export const dualCustomElement = + (dictationTag: string, ambientTag: string) => + (target: T): T => { + if (!customElements.get(dictationTag)) { + customElements.define(dictationTag, target); + } + + if (!customElements.get(ambientTag)) { + customElements.define(ambientTag, target); + } + + return target; + }; diff --git a/tsconfig.ambient.json b/tsconfig.ambient.json new file mode 100644 index 0000000..c27fbbc --- /dev/null +++ b/tsconfig.ambient.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "dist/ambient", + "tsBuildInfoFile": "dist/ambient/.tsbuildinfo" + }, + "include": ["src/**/*.ts"], + "exclude": ["src/index.ts"] +} diff --git a/tsconfig.dictation.json b/tsconfig.dictation.json new file mode 100644 index 0000000..bcc4eab --- /dev/null +++ b/tsconfig.dictation.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "dist/dictation", + "tsBuildInfoFile": "dist/dictation/.tsbuildinfo" + }, + "include": ["src/**/*.ts"], + "exclude": ["src/ambient-index.ts"] +} From 19197f217117069bfd4e0bf9deab7523fc82141d Mon Sep 17 00:00:00 2001 From: markitosha Date: Tue, 2 Jun 2026 15:30:02 +0200 Subject: [PATCH 22/50] feat: reorganize exports and import statements for ambient components --- src/ambient-index.ts | 14 ++++++++------ src/components/keybinding-input.ts | 2 +- src/components/language-selector.ts | 2 +- src/index.ts | 14 ++++++++------ 4 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/ambient-index.ts b/src/ambient-index.ts index 27ed5f3..220888d 100644 --- a/src/ambient-index.ts +++ b/src/ambient-index.ts @@ -1,12 +1,14 @@ -export { CortiAmbient as default } from "./components/corti-ambient.js"; -export { CortiAmbient } from "./components/corti-ambient.js"; -export { AmbientRoot } from "./contexts/ambient-context.js"; export { AmbientRecordingButton } from "./components/ambient-recording-button.js"; -export { DictationSettingsMenu as AmbientSettingsMenu } from "./components/settings-menu.js"; +export { AmbientVirtualModeSelector } from "./components/ambient-virtual-mode-selector.js"; +export { + CortiAmbient as default, + CortiAmbient, +} from "./components/corti-ambient.js"; export { DictationDeviceSelector as AmbientDeviceSelector } from "./components/device-selector.js"; -export { DictationLanguageSelector as AmbientLanguageSelector } from "./components/language-selector.js"; export { DictationKeybindingSelector as AmbientKeybindingSelector } from "./components/keybinding-selector.js"; -export { AmbientVirtualModeSelector } from "./components/ambient-virtual-mode-selector.js"; +export { DictationLanguageSelector as AmbientLanguageSelector } from "./components/language-selector.js"; +export { DictationSettingsMenu as AmbientSettingsMenu } from "./components/settings-menu.js"; +export { AmbientRoot } from "./contexts/ambient-context.js"; export type { AmbientStreamSessionConfig } from "./controllers/ambient-controller.js"; export type { diff --git a/src/components/keybinding-input.ts b/src/components/keybinding-input.ts index c8dc8d6..67bd3d5 100644 --- a/src/components/keybinding-input.ts +++ b/src/components/keybinding-input.ts @@ -6,8 +6,8 @@ import { toggleToTalkKeybindingContext, } from "../contexts/mixins/keybindings-context.js"; import KeybindingSelectorStyles from "../styles/keybinding-selector.js"; -import { keybindingChangedEvent } from "../utils/events.js"; import { dualCustomElement } from "../utils/custom-elements.js"; +import { keybindingChangedEvent } from "../utils/events.js"; import { normalizeKeybinding } from "../utils/keybinding.js"; @dualCustomElement("dictation-keybinding-input", "ambient-keybinding-input") diff --git a/src/components/language-selector.ts b/src/components/language-selector.ts index 0439f10..58ea030 100644 --- a/src/components/language-selector.ts +++ b/src/components/language-selector.ts @@ -7,11 +7,11 @@ import { selectedLanguageContext, } from "../contexts/mixins/languages-context.js"; import SelectStyles from "../styles/select.js"; +import { dualCustomElement } from "../utils/custom-elements.js"; import { languageChangedEvent, languagesChangedEvent, } from "../utils/events.js"; -import { dualCustomElement } from "../utils/custom-elements.js"; import { getLanguageName } from "../utils/languages.js"; @dualCustomElement("dictation-language-selector", "ambient-language-selector") diff --git a/src/index.ts b/src/index.ts index 1b30f6a..e8d3545 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,11 +1,13 @@ -export { CortiDictation as default } from "./components/corti-dictation.js"; -export { CortiDictation } from "./components/corti-dictation.js"; -export { DictationRoot } from "./contexts/dictation-context.js"; -export { DictationRecordingButton } from "./components/dictation-recording-button.js"; -export { DictationSettingsMenu } from "./components/settings-menu.js"; +export { + CortiDictation as default, + CortiDictation, +} from "./components/corti-dictation.js"; export { DictationDeviceSelector } from "./components/device-selector.js"; -export { DictationLanguageSelector } from "./components/language-selector.js"; +export { DictationRecordingButton } from "./components/dictation-recording-button.js"; export { DictationKeybindingSelector } from "./components/keybinding-selector.js"; +export { DictationLanguageSelector } from "./components/language-selector.js"; +export { DictationSettingsMenu } from "./components/settings-menu.js"; +export { DictationRoot } from "./contexts/dictation-context.js"; export type { ConfigurableSettings, From b3cd113a91792c0c535246dfe6687dccdb3674f7 Mon Sep 17 00:00:00 2001 From: markitosha Date: Wed, 3 Jun 2026 10:14:58 +0200 Subject: [PATCH 23/50] feat: update ambient component structure and keybinding handling --- package.ambient.json | 2 +- src/ambient-index.ts | 14 +-- .../ambient/ambient-audio-visualiser.ts | 11 ++ .../ambient/ambient-device-selector.ts | 11 ++ .../ambient/ambient-keybinding-input.ts | 11 ++ .../ambient/ambient-keybinding-selector.ts | 28 +++++ .../ambient/ambient-language-selector.ts | 11 ++ .../{ => ambient}/ambient-recording-button.ts | 21 +++- .../ambient/ambient-settings-menu.ts | 44 ++++++++ .../ambient-virtual-mode-selector.ts | 8 +- src/components/{ => ambient}/corti-ambient.ts | 14 +-- .../audio-visualiser-base.ts} | 16 +-- src/components/{ => base}/corti-root.ts | 4 +- .../device-selector-base.ts} | 17 +-- .../keybinding-input-base.ts} | 19 +--- .../base/keybinding-selector-base.ts | 39 +++++++ .../language-selector-base.ts} | 20 +--- .../{ => base}/recording-button-base.ts | 49 +++++---- src/components/base/settings-menu-base.ts | 90 +++++++++++++++ .../{ => dictation}/corti-dictation.ts | 10 +- .../dictation/dictation-audio-visualiser.ts | 11 ++ .../dictation/dictation-device-selector.ts | 11 ++ .../dictation/dictation-keybinding-input.ts | 11 ++ .../dictation-keybinding-selector.ts | 28 +++++ .../dictation/dictation-language-selector.ts | 11 ++ .../dictation-recording-button.ts | 19 +++- .../dictation/dictation-settings-menu.ts | 35 ++++++ src/components/keybinding-selector.ts | 59 ---------- src/components/settings-menu.ts | 103 ------------------ src/contexts/mixins/keybindings-context.ts | 5 +- src/index.ts | 12 +- src/utils/custom-elements.ts | 18 --- stories/ambient-root.stories.ts | 12 +- stories/audio-visualiser.stories.ts | 4 +- stories/corti-ambient.stories.ts | 6 +- stories/corti-dictation.stories.ts | 6 +- stories/device-selector.stories.ts | 4 +- stories/keybinding-selector.stories.ts | 4 +- stories/language-selector.stories.ts | 4 +- stories/recording-button.stories.ts | 4 +- stories/settings-menu.stories.ts | 4 +- tsconfig.ambient.json | 7 +- tsconfig.dictation.json | 7 +- 43 files changed, 498 insertions(+), 326 deletions(-) create mode 100644 src/components/ambient/ambient-audio-visualiser.ts create mode 100644 src/components/ambient/ambient-device-selector.ts create mode 100644 src/components/ambient/ambient-keybinding-input.ts create mode 100644 src/components/ambient/ambient-keybinding-selector.ts create mode 100644 src/components/ambient/ambient-language-selector.ts rename src/components/{ => ambient}/ambient-recording-button.ts (75%) create mode 100644 src/components/ambient/ambient-settings-menu.ts rename src/components/{ => ambient}/ambient-virtual-mode-selector.ts (85%) rename src/components/{ => ambient}/corti-ambient.ts (91%) rename src/components/{audio-visualiser.ts => base/audio-visualiser-base.ts} (65%) rename src/components/{ => base}/corti-root.ts (98%) rename src/components/{device-selector.ts => base/device-selector-base.ts} (74%) rename src/components/{keybinding-input.ts => base/keybinding-input-base.ts} (77%) create mode 100644 src/components/base/keybinding-selector-base.ts rename src/components/{language-selector.ts => base/language-selector-base.ts} (73%) rename src/components/{ => base}/recording-button-base.ts (89%) create mode 100644 src/components/base/settings-menu-base.ts rename src/components/{ => dictation}/corti-dictation.ts (94%) create mode 100644 src/components/dictation/dictation-audio-visualiser.ts create mode 100644 src/components/dictation/dictation-device-selector.ts create mode 100644 src/components/dictation/dictation-keybinding-input.ts create mode 100644 src/components/dictation/dictation-keybinding-selector.ts create mode 100644 src/components/dictation/dictation-language-selector.ts rename src/components/{ => dictation}/dictation-recording-button.ts (57%) create mode 100644 src/components/dictation/dictation-settings-menu.ts delete mode 100644 src/components/keybinding-selector.ts delete mode 100644 src/components/settings-menu.ts delete mode 100644 src/utils/custom-elements.ts diff --git a/package.ambient.json b/package.ambient.json index 6ea96ac..54292fa 100644 --- a/package.ambient.json +++ b/package.ambient.json @@ -2,7 +2,7 @@ "name": "@corti/ambient-web", "description": "Web component for Corti Ambient", "author": "Corti ApS", - "version": "0.0.0", + "version": "0.7.0-ambient.7", "license": "MIT", "type": "module", "main": "index.js", diff --git a/src/ambient-index.ts b/src/ambient-index.ts index 220888d..6133541 100644 --- a/src/ambient-index.ts +++ b/src/ambient-index.ts @@ -1,13 +1,13 @@ -export { AmbientRecordingButton } from "./components/ambient-recording-button.js"; -export { AmbientVirtualModeSelector } from "./components/ambient-virtual-mode-selector.js"; +export { AmbientDeviceSelector } from "./components/ambient/ambient-device-selector.js"; +export { AmbientKeybindingSelector } from "./components/ambient/ambient-keybinding-selector.js"; +export { AmbientLanguageSelector } from "./components/ambient/ambient-language-selector.js"; +export { AmbientRecordingButton } from "./components/ambient/ambient-recording-button.js"; +export { AmbientSettingsMenu } from "./components/ambient/ambient-settings-menu.js"; +export { AmbientVirtualModeSelector } from "./components/ambient/ambient-virtual-mode-selector.js"; export { CortiAmbient as default, CortiAmbient, -} from "./components/corti-ambient.js"; -export { DictationDeviceSelector as AmbientDeviceSelector } from "./components/device-selector.js"; -export { DictationKeybindingSelector as AmbientKeybindingSelector } from "./components/keybinding-selector.js"; -export { DictationLanguageSelector as AmbientLanguageSelector } from "./components/language-selector.js"; -export { DictationSettingsMenu as AmbientSettingsMenu } from "./components/settings-menu.js"; +} from "./components/ambient/corti-ambient.js"; export { AmbientRoot } from "./contexts/ambient-context.js"; export type { AmbientStreamSessionConfig } from "./controllers/ambient-controller.js"; diff --git a/src/components/ambient/ambient-audio-visualiser.ts b/src/components/ambient/ambient-audio-visualiser.ts new file mode 100644 index 0000000..d880cbe --- /dev/null +++ b/src/components/ambient/ambient-audio-visualiser.ts @@ -0,0 +1,11 @@ +import { customElement } from "lit/decorators.js"; +import { AudioVisualiserBase } from "../base/audio-visualiser-base.js"; + +@customElement("ambient-audio-visualiser") +export class AmbientAudioVisualiser extends AudioVisualiserBase {} + +declare global { + interface HTMLElementTagNameMap { + "ambient-audio-visualiser": AmbientAudioVisualiser; + } +} diff --git a/src/components/ambient/ambient-device-selector.ts b/src/components/ambient/ambient-device-selector.ts new file mode 100644 index 0000000..8f405a9 --- /dev/null +++ b/src/components/ambient/ambient-device-selector.ts @@ -0,0 +1,11 @@ +import { customElement } from "lit/decorators.js"; +import { DeviceSelectorBase } from "../base/device-selector-base.js"; + +@customElement("ambient-device-selector") +export class AmbientDeviceSelector extends DeviceSelectorBase {} + +declare global { + interface HTMLElementTagNameMap { + "ambient-device-selector": AmbientDeviceSelector; + } +} diff --git a/src/components/ambient/ambient-keybinding-input.ts b/src/components/ambient/ambient-keybinding-input.ts new file mode 100644 index 0000000..8e8bf61 --- /dev/null +++ b/src/components/ambient/ambient-keybinding-input.ts @@ -0,0 +1,11 @@ +import { customElement } from "lit/decorators.js"; +import { KeybindingInputBase } from "../base/keybinding-input-base.js"; + +@customElement("ambient-keybinding-input") +export class AmbientKeybindingInput extends KeybindingInputBase {} + +declare global { + interface HTMLElementTagNameMap { + "ambient-keybinding-input": AmbientKeybindingInput; + } +} diff --git a/src/components/ambient/ambient-keybinding-selector.ts b/src/components/ambient/ambient-keybinding-selector.ts new file mode 100644 index 0000000..19e7f50 --- /dev/null +++ b/src/components/ambient/ambient-keybinding-selector.ts @@ -0,0 +1,28 @@ +import type { TemplateResult } from "lit"; +import { html } from "lit"; +import { customElement } from "lit/decorators.js"; +import { KeybindingSelectorBase } from "../base/keybinding-selector-base.js"; + +import "./ambient-keybinding-input.js"; + +@customElement("ambient-keybinding-selector") +export class AmbientKeybindingSelector extends KeybindingSelectorBase { + protected _renderKeybindingInputs(): TemplateResult { + return html` + + + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + "ambient-keybinding-selector": AmbientKeybindingSelector; + } +} diff --git a/src/components/ambient/ambient-language-selector.ts b/src/components/ambient/ambient-language-selector.ts new file mode 100644 index 0000000..c634d05 --- /dev/null +++ b/src/components/ambient/ambient-language-selector.ts @@ -0,0 +1,11 @@ +import { customElement } from "lit/decorators.js"; +import { LanguageSelectorBase } from "../base/language-selector-base.js"; + +@customElement("ambient-language-selector") +export class AmbientLanguageSelector extends LanguageSelectorBase {} + +declare global { + interface HTMLElementTagNameMap { + "ambient-language-selector": AmbientLanguageSelector; + } +} diff --git a/src/components/ambient-recording-button.ts b/src/components/ambient/ambient-recording-button.ts similarity index 75% rename from src/components/ambient-recording-button.ts rename to src/components/ambient/ambient-recording-button.ts index d612cc1..7648684 100644 --- a/src/components/ambient-recording-button.ts +++ b/src/components/ambient/ambient-recording-button.ts @@ -1,18 +1,22 @@ import type { Corti } from "@corti/sdk"; import { consume } from "@lit/context"; +import type { TemplateResult } from "lit"; +import { html } from "lit"; import { customElement, state } from "lit/decorators.js"; -import { DEFAULT_STREAM_CONFIG } from "../constants.js"; +import { DEFAULT_STREAM_CONFIG } from "../../constants.js"; import { ambientConfigContext, interactionIdContext, -} from "../contexts/ambient-context.js"; +} from "../../contexts/ambient-context.js"; import { AmbientController, type AmbientStreamSessionConfig, type StreamAmbientMessage, -} from "../controllers/ambient-controller.js"; -import { errorEvent } from "../utils/events.js"; -import { RecordingButtonBase } from "./recording-button-base.js"; +} from "../../controllers/ambient-controller.js"; +import { errorEvent } from "../../utils/events.js"; +import { RecordingButtonBase } from "../base/recording-button-base.js"; + +import "./ambient-audio-visualiser.js"; const interactionIdRequiredError = () => new Error( @@ -24,6 +28,13 @@ export class AmbientRecordingButton extends RecordingButtonBase< AmbientStreamSessionConfig, StreamAmbientMessage > { + protected _renderAudioVisualiser(isRecording: boolean): TemplateResult { + return html``; + } + @consume({ context: ambientConfigContext, subscribe: true }) @state() private _ambientConfig?: Corti.StreamConfig; diff --git a/src/components/ambient/ambient-settings-menu.ts b/src/components/ambient/ambient-settings-menu.ts new file mode 100644 index 0000000..ac9e209 --- /dev/null +++ b/src/components/ambient/ambient-settings-menu.ts @@ -0,0 +1,44 @@ +import type { TemplateResult } from "lit"; +import { html } from "lit"; +import { customElement } from "lit/decorators.js"; +import { SettingsMenuBase } from "../base/settings-menu-base.js"; + +import "./ambient-device-selector.js"; +import "./ambient-keybinding-selector.js"; +import "./ambient-language-selector.js"; +import "./ambient-virtual-mode-selector.js"; + +@customElement("ambient-settings-menu") +export class AmbientSettingsMenu extends SettingsMenuBase { + protected _renderDeviceSelector(isRecording: boolean): TemplateResult { + return html``; + } + + protected _renderLanguageSelector(isRecording: boolean): TemplateResult { + return html``; + } + + protected _renderKeybindingSelector(isRecording: boolean): TemplateResult { + return html``; + } + + protected override _renderVirtualModeSelector( + isRecording: boolean, + ): TemplateResult { + return html``; + } +} + +declare global { + interface HTMLElementTagNameMap { + "ambient-settings-menu": AmbientSettingsMenu; + } +} diff --git a/src/components/ambient-virtual-mode-selector.ts b/src/components/ambient/ambient-virtual-mode-selector.ts similarity index 85% rename from src/components/ambient-virtual-mode-selector.ts rename to src/components/ambient/ambient-virtual-mode-selector.ts index 9adfdb8..1b7a13f 100644 --- a/src/components/ambient-virtual-mode-selector.ts +++ b/src/components/ambient/ambient-virtual-mode-selector.ts @@ -1,11 +1,11 @@ import { consume } from "@lit/context"; import { html, LitElement } from "lit"; import { customElement, property, state } from "lit/decorators.js"; -import { virtualModeContext } from "../contexts/ambient-context.js"; -import AmbientVirtualModeSelectorStyles from "../styles/ambient-virtual-mode-selector.js"; -import { virtualModeChangedEvent } from "../utils/events.js"; +import { virtualModeContext } from "../../contexts/ambient-context.js"; +import AmbientVirtualModeSelectorStyles from "../../styles/ambient-virtual-mode-selector.js"; +import { virtualModeChangedEvent } from "../../utils/events.js"; -import "../icons/icons.js"; +import "../../icons/icons.js"; @customElement("ambient-virtual-mode-selector") export class AmbientVirtualModeSelector extends LitElement { diff --git a/src/components/corti-ambient.ts b/src/components/ambient/corti-ambient.ts similarity index 91% rename from src/components/corti-ambient.ts rename to src/components/ambient/corti-ambient.ts index de5349b..e506d4a 100644 --- a/src/components/corti-ambient.ts +++ b/src/components/ambient/corti-ambient.ts @@ -3,16 +3,16 @@ import { html, nothing } from "lit"; import { customElement, property, state } from "lit/decorators.js"; import { classMap } from "lit/directives/class-map.js"; import { ref } from "lit/directives/ref.js"; -import { DEFAULT_STREAM_CONFIG } from "../constants.js"; -import type { AmbientRoot } from "../contexts/ambient-context.js"; -import type { ConfigurableSettings } from "../types.js"; -import { commaSeparatedConverter } from "../utils/converters.js"; +import { DEFAULT_STREAM_CONFIG } from "../../constants.js"; +import type { AmbientRoot } from "../../contexts/ambient-context.js"; +import type { ConfigurableSettings } from "../../types.js"; +import { commaSeparatedConverter } from "../../utils/converters.js"; +import { CortiRoot } from "../base/corti-root.js"; import type { AmbientRecordingButton } from "./ambient-recording-button.js"; -import { CortiRoot } from "./corti-root.js"; -import "../contexts/ambient-context.js"; +import "../../contexts/ambient-context.js"; import "./ambient-recording-button.js"; -import "./settings-menu.js"; +import "./ambient-settings-menu.js"; @customElement("corti-ambient") export class CortiAmbient extends CortiRoot< diff --git a/src/components/audio-visualiser.ts b/src/components/base/audio-visualiser-base.ts similarity index 65% rename from src/components/audio-visualiser.ts rename to src/components/base/audio-visualiser-base.ts index 215efc1..60f4784 100644 --- a/src/components/audio-visualiser.ts +++ b/src/components/base/audio-visualiser-base.ts @@ -3,12 +3,10 @@ import { property } from "lit/decorators.js"; import { classMap } from "lit/directives/class-map.js"; import { map } from "lit/directives/map.js"; import { range } from "lit/directives/range.js"; -import AudioVisualiserStyles from "../styles/audio-visualiser.js"; -import { dualCustomElement } from "../utils/custom-elements.js"; -import { normalizeToRange } from "../utils/validation.js"; +import AudioVisualiserStyles from "../../styles/audio-visualiser.js"; +import { normalizeToRange } from "../../utils/validation.js"; -@dualCustomElement("dictation-audio-visualiser", "ambient-audio-visualiser") -export class DictationAudioVisualiser extends LitElement { +export class AudioVisualiserBase extends LitElement { @property({ type: Number }) level: number = 0; @@ -27,7 +25,6 @@ export class DictationAudioVisualiser extends LitElement { } render() { - // Each segment represents 20%. Using Math.round to fill segments. const activeSegments = Math.round(this.level * this.segmentCount); const segments = map( range(this.segmentCount), @@ -48,10 +45,3 @@ export class DictationAudioVisualiser extends LitElement { `; } } - -declare global { - interface HTMLElementTagNameMap { - "ambient-audio-visualiser": DictationAudioVisualiser; - "dictation-audio-visualiser": DictationAudioVisualiser; - } -} diff --git a/src/components/corti-root.ts b/src/components/base/corti-root.ts similarity index 98% rename from src/components/corti-root.ts rename to src/components/base/corti-root.ts index f3df1d4..4d5fe06 100644 --- a/src/components/corti-root.ts +++ b/src/components/base/corti-root.ts @@ -6,8 +6,8 @@ import type { ConfigurableSettings, ProxyOptions, RecordingState, -} from "../types.js"; -import { commaSeparatedConverter } from "../utils/converters.js"; +} from "../../types.js"; +import { commaSeparatedConverter } from "../../utils/converters.js"; type CortiProviderRoot = LitElement & { recordingState?: RecordingState; diff --git a/src/components/device-selector.ts b/src/components/base/device-selector-base.ts similarity index 74% rename from src/components/device-selector.ts rename to src/components/base/device-selector-base.ts index 1c1e360..f6ab094 100644 --- a/src/components/device-selector.ts +++ b/src/components/base/device-selector-base.ts @@ -4,13 +4,11 @@ import { property, state } from "lit/decorators.js"; import { devicesContext, selectedDeviceContext, -} from "../contexts/mixins/devices-context.js"; -import SelectStyles from "../styles/select.js"; -import { dualCustomElement } from "../utils/custom-elements.js"; -import { recordingDevicesChangedEvent } from "../utils/events.js"; +} from "../../contexts/mixins/devices-context.js"; +import SelectStyles from "../../styles/select.js"; +import { recordingDevicesChangedEvent } from "../../utils/events.js"; -@dualCustomElement("dictation-device-selector", "ambient-device-selector") -export class DictationDeviceSelector extends LitElement { +export class DeviceSelectorBase extends LitElement { @consume({ context: devicesContext, subscribe: true }) @state() _devices?: MediaDeviceInfo[]; @@ -64,10 +62,3 @@ export class DictationDeviceSelector extends LitElement { `; } } - -declare global { - interface HTMLElementTagNameMap { - "ambient-device-selector": DictationDeviceSelector; - "dictation-device-selector": DictationDeviceSelector; - } -} diff --git a/src/components/keybinding-input.ts b/src/components/base/keybinding-input-base.ts similarity index 77% rename from src/components/keybinding-input.ts rename to src/components/base/keybinding-input-base.ts index 67bd3d5..0bdb1db 100644 --- a/src/components/keybinding-input.ts +++ b/src/components/base/keybinding-input-base.ts @@ -4,14 +4,12 @@ import { property, state } from "lit/decorators.js"; import { pushToTalkKeybindingContext, toggleToTalkKeybindingContext, -} from "../contexts/mixins/keybindings-context.js"; -import KeybindingSelectorStyles from "../styles/keybinding-selector.js"; -import { dualCustomElement } from "../utils/custom-elements.js"; -import { keybindingChangedEvent } from "../utils/events.js"; -import { normalizeKeybinding } from "../utils/keybinding.js"; +} from "../../contexts/mixins/keybindings-context.js"; +import KeybindingSelectorStyles from "../../styles/keybinding-selector.js"; +import { keybindingChangedEvent } from "../../utils/events.js"; +import { normalizeKeybinding } from "../../utils/keybinding.js"; -@dualCustomElement("dictation-keybinding-input", "ambient-keybinding-input") -export class DictationKeybindingInput extends LitElement { +export class KeybindingInputBase extends LitElement { @property({ type: String }) keybindingType: "push-to-talk" | "toggle-to-talk" = "toggle-to-talk"; @@ -90,10 +88,3 @@ export class DictationKeybindingInput extends LitElement { `; } } - -declare global { - interface HTMLElementTagNameMap { - "ambient-keybinding-input": DictationKeybindingInput; - "dictation-keybinding-input": DictationKeybindingInput; - } -} diff --git a/src/components/base/keybinding-selector-base.ts b/src/components/base/keybinding-selector-base.ts new file mode 100644 index 0000000..416aaa6 --- /dev/null +++ b/src/components/base/keybinding-selector-base.ts @@ -0,0 +1,39 @@ +import { consume } from "@lit/context"; +import { html, LitElement, type TemplateResult } from "lit"; +import { property, state } from "lit/decorators.js"; +import { + pushToTalkKeybindingContext, + toggleToTalkKeybindingContext, +} from "../../contexts/mixins/keybindings-context.js"; +import KeybindingSelectorStyles from "../../styles/keybinding-selector.js"; + +export abstract class KeybindingSelectorBase extends LitElement { + protected abstract _renderKeybindingInputs(): TemplateResult; + + @consume({ context: pushToTalkKeybindingContext, subscribe: true }) + @state() + _pushToTalkKeybinding?: string | null; + + @consume({ context: toggleToTalkKeybindingContext, subscribe: true }) + @state() + _toggleToTalkKeybinding?: string | null; + + @property({ type: Boolean }) + disabled: boolean = false; + + static styles = KeybindingSelectorStyles; + + render() { + return html` +
+ ${this._renderKeybindingInputs()} + ${ + (this._toggleToTalkKeybinding || this._pushToTalkKeybinding) && + html`

+ ${html`Press ${[this._toggleToTalkKeybinding, this._pushToTalkKeybinding].join(" or ")} to start/stop recording`} +

` + } +
+ `; + } +} diff --git a/src/components/language-selector.ts b/src/components/base/language-selector-base.ts similarity index 73% rename from src/components/language-selector.ts rename to src/components/base/language-selector-base.ts index 58ea030..e1ae5bb 100644 --- a/src/components/language-selector.ts +++ b/src/components/base/language-selector-base.ts @@ -5,17 +5,15 @@ import { property, state } from "lit/decorators.js"; import { languagesContext, selectedLanguageContext, -} from "../contexts/mixins/languages-context.js"; -import SelectStyles from "../styles/select.js"; -import { dualCustomElement } from "../utils/custom-elements.js"; +} from "../../contexts/mixins/languages-context.js"; +import SelectStyles from "../../styles/select.js"; import { languageChangedEvent, languagesChangedEvent, -} from "../utils/events.js"; -import { getLanguageName } from "../utils/languages.js"; +} from "../../utils/events.js"; +import { getLanguageName } from "../../utils/languages.js"; -@dualCustomElement("dictation-language-selector", "ambient-language-selector") -export class DictationLanguageSelector extends LitElement { +export class LanguageSelectorBase extends LitElement { @consume({ context: languagesContext, subscribe: true }) @state() _languages?: Corti.TranscribeSupportedLanguage[]; @@ -34,7 +32,6 @@ export class DictationLanguageSelector extends LitElement { this.dispatchEvent(languagesChangedEvent(this._languages || [], language)); - // Dispatch backward compatible event this.dispatchEvent(languageChangedEvent(language)); } @@ -66,10 +63,3 @@ export class DictationLanguageSelector extends LitElement { `; } } - -declare global { - interface HTMLElementTagNameMap { - "ambient-language-selector": DictationLanguageSelector; - "dictation-language-selector": DictationLanguageSelector; - } -} diff --git a/src/components/recording-button-base.ts b/src/components/base/recording-button-base.ts similarity index 89% rename from src/components/recording-button-base.ts rename to src/components/base/recording-button-base.ts index 5a0d23a..7901ff0 100644 --- a/src/components/recording-button-base.ts +++ b/src/components/base/recording-button-base.ts @@ -1,5 +1,6 @@ import type { CortiAuth } from "@corti/sdk"; import { consume } from "@lit/context"; +import type { TemplateResult } from "lit"; import { type CSSResultGroup, html, @@ -7,40 +8,40 @@ import { type PropertyValues, } from "lit"; import { property, state } from "lit/decorators.js"; -import { AUDIO_CHUNK_INTERVAL_MS } from "../constants.js"; -import { virtualModeContext } from "../contexts/ambient-context.js"; -import { debugDisplayAudioContext } from "../contexts/dictation-context.js"; +import { AUDIO_CHUNK_INTERVAL_MS } from "../../constants.js"; +import { virtualModeContext } from "../../contexts/ambient-context.js"; +import { debugDisplayAudioContext } from "../../contexts/dictation-context.js"; import { accessTokenContext, authConfigContext, regionContext, tenantNameContext, -} from "../contexts/mixins/auth-context.js"; -import { selectedDeviceContext } from "../contexts/mixins/devices-context.js"; +} from "../../contexts/mixins/auth-context.js"; +import { selectedDeviceContext } from "../../contexts/mixins/devices-context.js"; import { pushToTalkKeybindingContext, toggleToTalkKeybindingContext, -} from "../contexts/mixins/keybindings-context.js"; +} from "../../contexts/mixins/keybindings-context.js"; import { socketProxyContext, socketUrlContext, -} from "../contexts/mixins/proxy-context.js"; -import { recordingStateContext } from "../contexts/mixins/recording-state-context.js"; -import type { TranscribeMessage } from "../controllers/dictation-controller.js"; -import { KeybindingController } from "../controllers/keybinding-controller.js"; -import { MediaController } from "../controllers/media-controller.js"; +} from "../../contexts/mixins/proxy-context.js"; +import { recordingStateContext } from "../../contexts/mixins/recording-state-context.js"; +import type { TranscribeMessage } from "../../controllers/dictation-controller.js"; +import { KeybindingController } from "../../controllers/keybinding-controller.js"; +import { MediaController } from "../../controllers/media-controller.js"; import type { SocketController, SocketControllerOutboundItem, SocketControllerWebSocket, -} from "../controllers/socket-controller.js"; -import ButtonStyles from "../styles/buttons.js"; -import RecordingButtonStyles from "../styles/recording-button.js"; +} from "../../controllers/socket-controller.js"; +import ButtonStyles from "../../styles/buttons.js"; +import RecordingButtonStyles from "../../styles/recording-button.js"; import type { ProxyOptions, RecordingSocketInboundMessage, RecordingState, -} from "../types.js"; +} from "../../types.js"; import { audioEventEvent, audioLevelChangedEvent, @@ -54,15 +55,22 @@ import { streamClosedEvent, transcriptEvent, usageEvent, -} from "../utils/events.js"; +} from "../../utils/events.js"; -import "./audio-visualiser.js"; -import "../icons/icons.js"; +import "../../icons/icons.js"; export abstract class RecordingButtonBase< TConfig, TMessage extends RecordingSocketInboundMessage = TranscribeMessage, > extends LitElement { + protected abstract _renderAudioVisualiser( + isRecording: boolean, + ): TemplateResult; + + protected get _audioLevel(): number { + return this.#mediaController.audioLevel; + } + @consume({ context: recordingStateContext, subscribe: true }) @state() _recordingState: RecordingState = "stopped"; @@ -409,10 +417,7 @@ export abstract class RecordingButtonBase< ? html`` : html`` } - + ${this._renderAudioVisualiser(isRecording)} `; } diff --git a/src/components/base/settings-menu-base.ts b/src/components/base/settings-menu-base.ts new file mode 100644 index 0000000..0986922 --- /dev/null +++ b/src/components/base/settings-menu-base.ts @@ -0,0 +1,90 @@ +import { consume } from "@lit/context"; +import { + type CSSResultGroup, + html, + LitElement, + nothing, + type TemplateResult, +} from "lit"; +import { property, state } from "lit/decorators.js"; +import { recordingStateContext } from "../../contexts/mixins/recording-state-context.js"; +import ButtonStyles from "../../styles/buttons.js"; +import CalloutStyles from "../../styles/callout.js"; +import SettingsMenuStyles from "../../styles/settings-menu.js"; +import type { ConfigurableSettings, RecordingState } from "../../types.js"; +import { commaSeparatedConverter } from "../../utils/converters.js"; + +import "../../icons/icons.js"; + +export abstract class SettingsMenuBase extends LitElement { + protected abstract _renderDeviceSelector( + isRecording: boolean, + ): TemplateResult | typeof nothing; + + protected abstract _renderLanguageSelector( + isRecording: boolean, + ): TemplateResult | typeof nothing; + + protected abstract _renderKeybindingSelector( + isRecording: boolean, + ): TemplateResult | typeof nothing; + + protected _renderVirtualModeSelector( + _isRecording: boolean, + ): TemplateResult | typeof nothing { + return nothing; + } + + @consume({ context: recordingStateContext, subscribe: true }) + @state() + _recordingState: RecordingState = "stopped"; + + @property({ + converter: commaSeparatedConverter, + type: Array, + }) + settingsEnabled: ConfigurableSettings[] = ["device", "language"]; + + static styles: CSSResultGroup = [ + SettingsMenuStyles, + ButtonStyles, + CalloutStyles, + ]; + + render() { + if (this.settingsEnabled?.length === 0) { + return nothing; + } + + const isRecording = this._recordingState === "recording"; + const showDeviceSelector = this.settingsEnabled.includes("device"); + const showLanguageSelector = this.settingsEnabled.includes("language"); + const showKeybinding = this.settingsEnabled.includes("keybinding"); + const showVirtualMode = this.settingsEnabled.includes("virtualMode"); + + return html` +
+ +
+
+ ${ + isRecording + ? html` +
+ Recording is in progress. Stop recording to change settings. +
+ ` + : nothing + } + ${showDeviceSelector ? this._renderDeviceSelector(isRecording) : nothing} + ${showLanguageSelector ? this._renderLanguageSelector(isRecording) : nothing} + ${showKeybinding ? this._renderKeybindingSelector(isRecording) : nothing} + ${showVirtualMode ? this._renderVirtualModeSelector(isRecording) : nothing} +
+
+
+ `; + } +} diff --git a/src/components/corti-dictation.ts b/src/components/dictation/corti-dictation.ts similarity index 94% rename from src/components/corti-dictation.ts rename to src/components/dictation/corti-dictation.ts index 60edd6f..4a609e4 100644 --- a/src/components/corti-dictation.ts +++ b/src/components/dictation/corti-dictation.ts @@ -3,14 +3,14 @@ import { html, nothing } from "lit"; import { customElement, property, state } from "lit/decorators.js"; import { classMap } from "lit/directives/class-map.js"; import { ref } from "lit/directives/ref.js"; -import { DEFAULT_DICTATION_CONFIG } from "../constants.js"; -import type { DictationRoot } from "../contexts/dictation-context.js"; -import { CortiRoot } from "./corti-root.js"; +import { DEFAULT_DICTATION_CONFIG } from "../../constants.js"; +import type { DictationRoot } from "../../contexts/dictation-context.js"; +import { CortiRoot } from "../base/corti-root.js"; import type { DictationRecordingButton } from "./dictation-recording-button.js"; -import "../contexts/dictation-context.js"; +import "../../contexts/dictation-context.js"; import "./dictation-recording-button.js"; -import "./settings-menu.js"; +import "./dictation-settings-menu.js"; @customElement("corti-dictation") export class CortiDictation extends CortiRoot< diff --git a/src/components/dictation/dictation-audio-visualiser.ts b/src/components/dictation/dictation-audio-visualiser.ts new file mode 100644 index 0000000..ee22303 --- /dev/null +++ b/src/components/dictation/dictation-audio-visualiser.ts @@ -0,0 +1,11 @@ +import { customElement } from "lit/decorators.js"; +import { AudioVisualiserBase } from "../base/audio-visualiser-base.js"; + +@customElement("dictation-audio-visualiser") +export class DictationAudioVisualiser extends AudioVisualiserBase {} + +declare global { + interface HTMLElementTagNameMap { + "dictation-audio-visualiser": DictationAudioVisualiser; + } +} diff --git a/src/components/dictation/dictation-device-selector.ts b/src/components/dictation/dictation-device-selector.ts new file mode 100644 index 0000000..a3aaae6 --- /dev/null +++ b/src/components/dictation/dictation-device-selector.ts @@ -0,0 +1,11 @@ +import { customElement } from "lit/decorators.js"; +import { DeviceSelectorBase } from "../base/device-selector-base.js"; + +@customElement("dictation-device-selector") +export class DictationDeviceSelector extends DeviceSelectorBase {} + +declare global { + interface HTMLElementTagNameMap { + "dictation-device-selector": DictationDeviceSelector; + } +} diff --git a/src/components/dictation/dictation-keybinding-input.ts b/src/components/dictation/dictation-keybinding-input.ts new file mode 100644 index 0000000..bf41077 --- /dev/null +++ b/src/components/dictation/dictation-keybinding-input.ts @@ -0,0 +1,11 @@ +import { customElement } from "lit/decorators.js"; +import { KeybindingInputBase } from "../base/keybinding-input-base.js"; + +@customElement("dictation-keybinding-input") +export class DictationKeybindingInput extends KeybindingInputBase {} + +declare global { + interface HTMLElementTagNameMap { + "dictation-keybinding-input": DictationKeybindingInput; + } +} diff --git a/src/components/dictation/dictation-keybinding-selector.ts b/src/components/dictation/dictation-keybinding-selector.ts new file mode 100644 index 0000000..6a644e9 --- /dev/null +++ b/src/components/dictation/dictation-keybinding-selector.ts @@ -0,0 +1,28 @@ +import type { TemplateResult } from "lit"; +import { html } from "lit"; +import { customElement } from "lit/decorators.js"; +import { KeybindingSelectorBase } from "../base/keybinding-selector-base.js"; + +import "./dictation-keybinding-input.js"; + +@customElement("dictation-keybinding-selector") +export class DictationKeybindingSelector extends KeybindingSelectorBase { + protected _renderKeybindingInputs(): TemplateResult { + return html` + + + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + "dictation-keybinding-selector": DictationKeybindingSelector; + } +} diff --git a/src/components/dictation/dictation-language-selector.ts b/src/components/dictation/dictation-language-selector.ts new file mode 100644 index 0000000..3de8707 --- /dev/null +++ b/src/components/dictation/dictation-language-selector.ts @@ -0,0 +1,11 @@ +import { customElement } from "lit/decorators.js"; +import { LanguageSelectorBase } from "../base/language-selector-base.js"; + +@customElement("dictation-language-selector") +export class DictationLanguageSelector extends LanguageSelectorBase {} + +declare global { + interface HTMLElementTagNameMap { + "dictation-language-selector": DictationLanguageSelector; + } +} diff --git a/src/components/dictation-recording-button.ts b/src/components/dictation/dictation-recording-button.ts similarity index 57% rename from src/components/dictation-recording-button.ts rename to src/components/dictation/dictation-recording-button.ts index 4770238..1383653 100644 --- a/src/components/dictation-recording-button.ts +++ b/src/components/dictation/dictation-recording-button.ts @@ -1,19 +1,30 @@ import type { Corti } from "@corti/sdk"; import { consume } from "@lit/context"; +import type { TemplateResult } from "lit"; +import { html } from "lit"; import { customElement, state } from "lit/decorators.js"; -import { DEFAULT_DICTATION_CONFIG } from "../constants.js"; -import { dictationConfigContext } from "../contexts/dictation-context.js"; +import { DEFAULT_DICTATION_CONFIG } from "../../constants.js"; +import { dictationConfigContext } from "../../contexts/dictation-context.js"; import { DictationController, type TranscribeMessage, -} from "../controllers/dictation-controller.js"; -import { RecordingButtonBase } from "./recording-button-base.js"; +} from "../../controllers/dictation-controller.js"; +import { RecordingButtonBase } from "../base/recording-button-base.js"; + +import "./dictation-audio-visualiser.js"; @customElement("dictation-recording-button") export class DictationRecordingButton extends RecordingButtonBase< Corti.TranscribeConfig, TranscribeMessage > { + protected _renderAudioVisualiser(isRecording: boolean): TemplateResult { + return html``; + } + @consume({ context: dictationConfigContext, subscribe: true }) @state() protected _dictationConfig?: Corti.TranscribeConfig; diff --git a/src/components/dictation/dictation-settings-menu.ts b/src/components/dictation/dictation-settings-menu.ts new file mode 100644 index 0000000..3082cdb --- /dev/null +++ b/src/components/dictation/dictation-settings-menu.ts @@ -0,0 +1,35 @@ +import type { TemplateResult } from "lit"; +import { html } from "lit"; +import { customElement } from "lit/decorators.js"; +import { SettingsMenuBase } from "../base/settings-menu-base.js"; + +import "./dictation-device-selector.js"; +import "./dictation-keybinding-selector.js"; +import "./dictation-language-selector.js"; + +@customElement("dictation-settings-menu") +export class DictationSettingsMenu extends SettingsMenuBase { + protected _renderDeviceSelector(isRecording: boolean): TemplateResult { + return html``; + } + + protected _renderLanguageSelector(isRecording: boolean): TemplateResult { + return html``; + } + + protected _renderKeybindingSelector(isRecording: boolean): TemplateResult { + return html``; + } +} + +declare global { + interface HTMLElementTagNameMap { + "dictation-settings-menu": DictationSettingsMenu; + } +} diff --git a/src/components/keybinding-selector.ts b/src/components/keybinding-selector.ts deleted file mode 100644 index 925ca8b..0000000 --- a/src/components/keybinding-selector.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { consume } from "@lit/context"; -import { html, LitElement } from "lit"; -import { property, state } from "lit/decorators.js"; -import { - pushToTalkKeybindingContext, - toggleToTalkKeybindingContext, -} from "../contexts/mixins/keybindings-context.js"; -import KeybindingSelectorStyles from "../styles/keybinding-selector.js"; - -import { dualCustomElement } from "../utils/custom-elements.js"; - -import "./keybinding-input.js"; - -@dualCustomElement( - "dictation-keybinding-selector", - "ambient-keybinding-selector", -) -export class DictationKeybindingSelector extends LitElement { - @consume({ context: pushToTalkKeybindingContext, subscribe: true }) - @state() - _pushToTalkKeybinding?: string | null; - - @consume({ context: toggleToTalkKeybindingContext, subscribe: true }) - @state() - _toggleToTalkKeybinding?: string | null; - - @property({ type: Boolean }) - disabled: boolean = false; - - static styles = KeybindingSelectorStyles; - - render() { - return html` -
- - - ${ - (this._toggleToTalkKeybinding || this._pushToTalkKeybinding) && - html`

- ${html`Press ${[this._toggleToTalkKeybinding, this._pushToTalkKeybinding].join(" or ")} to start/stop recording`} -

` - } -
- `; - } -} - -declare global { - interface HTMLElementTagNameMap { - "ambient-keybinding-selector": DictationKeybindingSelector; - "dictation-keybinding-selector": DictationKeybindingSelector; - } -} diff --git a/src/components/settings-menu.ts b/src/components/settings-menu.ts deleted file mode 100644 index 0ac92f5..0000000 --- a/src/components/settings-menu.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { consume } from "@lit/context"; -import { type CSSResultGroup, html, LitElement, nothing } from "lit"; -import { property, state } from "lit/decorators.js"; -import { recordingStateContext } from "../contexts/mixins/recording-state-context.js"; -import ButtonStyles from "../styles/buttons.js"; -import CalloutStyles from "../styles/callout.js"; -import SettingsMenuStyles from "../styles/settings-menu.js"; -import type { ConfigurableSettings, RecordingState } from "../types.js"; -import { commaSeparatedConverter } from "../utils/converters.js"; -import { dualCustomElement } from "../utils/custom-elements.js"; - -import "./ambient-virtual-mode-selector.js"; -import "./device-selector.js"; -import "./keybinding-selector.js"; -import "./language-selector.js"; -import "../icons/icons.js"; - -@dualCustomElement("dictation-settings-menu", "ambient-settings-menu") -export class DictationSettingsMenu extends LitElement { - @consume({ context: recordingStateContext, subscribe: true }) - @state() - _recordingState: RecordingState = "stopped"; - - @property({ - converter: commaSeparatedConverter, - type: Array, - }) - settingsEnabled: ConfigurableSettings[] = ["device", "language"]; - - static styles: CSSResultGroup = [ - SettingsMenuStyles, - ButtonStyles, - CalloutStyles, - ]; - - render() { - if (this.settingsEnabled?.length === 0) { - return nothing; - } - - const isRecording = this._recordingState === "recording"; - const showDeviceSelector = this.settingsEnabled.includes("device"); - const showLanguageSelector = this.settingsEnabled.includes("language"); - const showKeybinding = this.settingsEnabled.includes("keybinding"); - const showVirtualMode = this.settingsEnabled.includes("virtualMode"); - - return html` -
- -
-
- ${ - isRecording - ? html` -
- Recording is in progress. Stop recording to change settings. -
- ` - : nothing - } - ${ - showDeviceSelector - ? html`` - : nothing - } - ${ - showLanguageSelector - ? html`` - : nothing - } - ${ - showKeybinding - ? html`` - : nothing - } - ${ - showVirtualMode - ? html`` - : nothing - } -
-
-
- `; - } -} - -declare global { - interface HTMLElementTagNameMap { - "ambient-settings-menu": DictationSettingsMenu; - "dictation-settings-menu": DictationSettingsMenu; - } -} diff --git a/src/contexts/mixins/keybindings-context.ts b/src/contexts/mixins/keybindings-context.ts index 9097aa5..cdd4631 100644 --- a/src/contexts/mixins/keybindings-context.ts +++ b/src/contexts/mixins/keybindings-context.ts @@ -43,9 +43,10 @@ export function KeybindingsContextMixin>( } #handleContextRequest = (e: ContextEvent) => { + const contextTargetTag = e.contextTarget.tagName.toLowerCase(); if ( - e.contextTarget.tagName.toLowerCase() === - "dictation-keybinding-selector" + contextTargetTag === "dictation-keybinding-selector" || + contextTargetTag === "ambient-keybinding-selector" ) { if ( e.context === pushToTalkKeybindingContext && diff --git a/src/index.ts b/src/index.ts index e8d3545..bcc8a9e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,12 +1,12 @@ export { CortiDictation as default, CortiDictation, -} from "./components/corti-dictation.js"; -export { DictationDeviceSelector } from "./components/device-selector.js"; -export { DictationRecordingButton } from "./components/dictation-recording-button.js"; -export { DictationKeybindingSelector } from "./components/keybinding-selector.js"; -export { DictationLanguageSelector } from "./components/language-selector.js"; -export { DictationSettingsMenu } from "./components/settings-menu.js"; +} from "./components/dictation/corti-dictation.js"; +export { DictationDeviceSelector } from "./components/dictation/dictation-device-selector.js"; +export { DictationKeybindingSelector } from "./components/dictation/dictation-keybinding-selector.js"; +export { DictationLanguageSelector } from "./components/dictation/dictation-language-selector.js"; +export { DictationRecordingButton } from "./components/dictation/dictation-recording-button.js"; +export { DictationSettingsMenu } from "./components/dictation/dictation-settings-menu.js"; export { DictationRoot } from "./contexts/dictation-context.js"; export type { diff --git a/src/utils/custom-elements.ts b/src/utils/custom-elements.ts deleted file mode 100644 index 1653f9f..0000000 --- a/src/utils/custom-elements.ts +++ /dev/null @@ -1,18 +0,0 @@ -type CustomElementClass = CustomElementConstructor & { - new (...args: unknown[]): HTMLElement; -}; - -/** Registers the class under both `dictation-*` and `ambient-*` tag names. */ -export const dualCustomElement = - (dictationTag: string, ambientTag: string) => - (target: T): T => { - if (!customElements.get(dictationTag)) { - customElements.define(dictationTag, target); - } - - if (!customElements.get(ambientTag)) { - customElements.define(ambientTag, target); - } - - return target; - }; diff --git a/stories/ambient-root.stories.ts b/stories/ambient-root.stories.ts index ea674b8..99896d9 100644 --- a/stories/ambient-root.stories.ts +++ b/stories/ambient-root.stories.ts @@ -1,16 +1,16 @@ import type { Meta, StoryObj } from "@storybook/web-components-vite"; import { html } from "lit"; import { action } from "storybook/actions"; -import type { AmbientRecordingButton } from "../src/components/ambient-recording-button.js"; +import type { AmbientRecordingButton } from "../src/components/ambient/ambient-recording-button.js"; -import "../src/components/ambient-recording-button.js"; -import "../src/components/audio-visualiser.js"; -import "../src/components/settings-menu.js"; -import type { DictationSettingsMenu } from "../src/components/settings-menu.js"; +import "../src/components/ambient/ambient-recording-button.js"; +import "../src/components/ambient/ambient-audio-visualiser.js"; +import "../src/components/ambient/ambient-settings-menu.js"; +import type { AmbientSettingsMenu } from "../src/components/ambient/ambient-settings-menu.js"; import type { AmbientRoot } from "../src/contexts/ambient-context.js"; import "../src/contexts/ambient-context.js"; -type AmbientRootStory = DictationSettingsMenu & +type AmbientRootStory = AmbientSettingsMenu & Pick< AmbientRoot, | "accessToken" diff --git a/stories/audio-visualiser.stories.ts b/stories/audio-visualiser.stories.ts index e70a284..ca9f261 100644 --- a/stories/audio-visualiser.stories.ts +++ b/stories/audio-visualiser.stories.ts @@ -1,9 +1,9 @@ import type { Meta, StoryObj } from "@storybook/web-components-vite"; import { html } from "lit"; -import "../src/components/audio-visualiser.js"; +import "../src/components/dictation/dictation-audio-visualiser.js"; -import type { DictationAudioVisualiser } from "../src/components/audio-visualiser.js"; +import type { DictationAudioVisualiser } from "../src/components/dictation/dictation-audio-visualiser.js"; import { disableControls } from "./helpers.js"; const meta = { diff --git a/stories/corti-ambient.stories.ts b/stories/corti-ambient.stories.ts index 8f26b0f..e5792e9 100644 --- a/stories/corti-ambient.stories.ts +++ b/stories/corti-ambient.stories.ts @@ -1,14 +1,14 @@ import type { Meta, StoryObj } from "@storybook/web-components-vite"; import { html, nothing } from "lit"; -import "../src/components/audio-visualiser.js"; -import type { CortiAmbient } from "../src/components/corti-ambient.js"; +import "../src/components/ambient/ambient-audio-visualiser.js"; +import type { CortiAmbient } from "../src/components/ambient/corti-ambient.js"; import DeviceSelectorStoryMeta from "./device-selector.stories.js"; import LanguageSelectorStoryMeta from "./language-selector.stories.js"; import SettingsMenuStoryMeta from "./settings-menu.stories.js"; -import "../src/components/corti-ambient.js"; +import "../src/components/ambient/corti-ambient.js"; import { disableControls, eventAction, diff --git a/stories/corti-dictation.stories.ts b/stories/corti-dictation.stories.ts index 8c78ad6..7460572 100644 --- a/stories/corti-dictation.stories.ts +++ b/stories/corti-dictation.stories.ts @@ -1,14 +1,14 @@ import type { Meta, StoryObj } from "@storybook/web-components-vite"; import { html, nothing } from "lit"; -import "../src/components/audio-visualiser.js"; -import type { CortiDictation } from "../src/components/corti-dictation.js"; +import "../src/components/dictation/dictation-audio-visualiser.js"; +import type { CortiDictation } from "../src/components/dictation/corti-dictation.js"; import DeviceSelectorStoryMeta from "./device-selector.stories.js"; import LanguageSelectorStoryMeta from "./language-selector.stories.js"; import SettingsMenuStoryMeta from "./settings-menu.stories.js"; -import "../src/components/corti-dictation.js"; +import "../src/components/dictation/corti-dictation.js"; import { disableControls, eventAction, diff --git a/stories/device-selector.stories.ts b/stories/device-selector.stories.ts index 159e6aa..33a6bef 100644 --- a/stories/device-selector.stories.ts +++ b/stories/device-selector.stories.ts @@ -1,9 +1,9 @@ import type { Meta, StoryObj } from "@storybook/web-components-vite"; import { html, nothing } from "lit"; import { action } from "storybook/actions"; -import type { DictationDeviceSelector } from "../src/components/device-selector.js"; +import type { DictationDeviceSelector } from "../src/components/dictation/dictation-device-selector.js"; -import "../src/components/device-selector.js"; +import "../src/components/dictation/dictation-device-selector.js"; import "../src/contexts/dictation-context.js"; import type { DictationRoot } from "../src/contexts/dictation-context.js"; import { disableControls, mockDevices } from "./helpers.js"; diff --git a/stories/keybinding-selector.stories.ts b/stories/keybinding-selector.stories.ts index 205fb63..3875bc8 100644 --- a/stories/keybinding-selector.stories.ts +++ b/stories/keybinding-selector.stories.ts @@ -1,9 +1,9 @@ import type { Meta, StoryObj } from "@storybook/web-components-vite"; import { html } from "lit"; import { action } from "storybook/actions"; -import type { DictationKeybindingSelector } from "../src/components/keybinding-selector.js"; +import type { DictationKeybindingSelector } from "../src/components/dictation/dictation-keybinding-selector.js"; -import "../src/components/keybinding-selector.js"; +import "../src/components/dictation/dictation-keybinding-selector.js"; import "../src/contexts/dictation-context.js"; import type { DictationRoot } from "../src/contexts/dictation-context.js"; import { disableControls } from "./helpers.js"; diff --git a/stories/language-selector.stories.ts b/stories/language-selector.stories.ts index d13489e..a0e83c4 100644 --- a/stories/language-selector.stories.ts +++ b/stories/language-selector.stories.ts @@ -1,9 +1,9 @@ import type { Meta, StoryObj } from "@storybook/web-components-vite"; import { html, nothing } from "lit"; import { action } from "storybook/actions"; -import type { DictationLanguageSelector } from "../src/components/language-selector.js"; +import type { DictationLanguageSelector } from "../src/components/dictation/dictation-language-selector.js"; -import "../src/components/language-selector.js"; +import "../src/components/dictation/dictation-language-selector.js"; import "../src/contexts/dictation-context.js"; import type { DictationRoot } from "../src/contexts/dictation-context.js"; diff --git a/stories/recording-button.stories.ts b/stories/recording-button.stories.ts index ea1637e..7724d9b 100644 --- a/stories/recording-button.stories.ts +++ b/stories/recording-button.stories.ts @@ -1,9 +1,9 @@ import type { Meta, StoryObj } from "@storybook/web-components-vite"; import { html } from "lit"; import { action } from "storybook/actions"; -import type { DictationRecordingButton } from "../src/components/dictation-recording-button.js"; +import type { DictationRecordingButton } from "../src/components/dictation/dictation-recording-button.js"; -import "../src/components/dictation-recording-button.js"; +import "../src/components/dictation/dictation-recording-button.js"; import "../src/contexts/dictation-context.js"; import type { DictationRoot } from "../src/contexts/dictation-context.js"; import { disableControls } from "./helpers.js"; diff --git a/stories/settings-menu.stories.ts b/stories/settings-menu.stories.ts index 3ca5480..8cbd057 100644 --- a/stories/settings-menu.stories.ts +++ b/stories/settings-menu.stories.ts @@ -1,9 +1,9 @@ import type { Meta, StoryObj } from "@storybook/web-components-vite"; import { html, nothing } from "lit"; import { action } from "storybook/actions"; -import type { DictationSettingsMenu } from "../src/components/settings-menu.js"; +import type { DictationSettingsMenu } from "../src/components/dictation/dictation-settings-menu.js"; -import "../src/components/settings-menu.js"; +import "../src/components/dictation/dictation-settings-menu.js"; import "../src/contexts/ambient-context.js"; import "../src/contexts/dictation-context.js"; import type { DictationRoot } from "../src/contexts/dictation-context.js"; diff --git a/tsconfig.ambient.json b/tsconfig.ambient.json index c27fbbc..1e8ff7c 100644 --- a/tsconfig.ambient.json +++ b/tsconfig.ambient.json @@ -5,5 +5,10 @@ "tsBuildInfoFile": "dist/ambient/.tsbuildinfo" }, "include": ["src/**/*.ts"], - "exclude": ["src/index.ts"] + "exclude": [ + "src/index.ts", + "src/components/dictation/**", + "src/contexts/dictation-context.ts", + "src/controllers/dictation-controller.ts" + ] } diff --git a/tsconfig.dictation.json b/tsconfig.dictation.json index bcc4eab..e854a61 100644 --- a/tsconfig.dictation.json +++ b/tsconfig.dictation.json @@ -5,5 +5,10 @@ "tsBuildInfoFile": "dist/dictation/.tsbuildinfo" }, "include": ["src/**/*.ts"], - "exclude": ["src/ambient-index.ts"] + "exclude": [ + "src/ambient-index.ts", + "src/components/ambient/**", + "src/contexts/ambient-context.ts", + "src/controllers/ambient-controller.ts" + ] } From 2c43a4e7271ccb62fcbdad48868523e0d2ffd341 Mon Sep 17 00:00:00 2001 From: markitosha Date: Wed, 3 Jun 2026 10:23:06 +0200 Subject: [PATCH 24/50] refactor: consolidate internal UI as shared speech-* elements Replace duplicated dictation/ambient keybinding-input and audio-visualiser wrappers with single speech-keybinding-input and speech-audio-visualiser components under components/internal/, wired from shared bases. --- .../ambient/ambient-audio-visualiser.ts | 11 ------- .../ambient/ambient-keybinding-input.ts | 11 ------- .../ambient/ambient-keybinding-selector.ts | 19 +----------- .../ambient/ambient-recording-button.ts | 11 ------- .../base/keybinding-selector-base.ts | 18 +++++++++-- src/components/base/recording-button-base.ts | 12 +++++--- .../dictation/dictation-audio-visualiser.ts | 11 ------- .../dictation/dictation-keybinding-input.ts | 11 ------- .../dictation-keybinding-selector.ts | 19 +----------- .../dictation/dictation-recording-button.ts | 11 ------- .../speech-audio-visualiser.ts} | 11 +++++-- .../speech-keybinding-input.ts} | 11 +++++-- stories/ambient-root.stories.ts | 2 +- stories/audio-visualiser.stories.ts | 30 +++++++++---------- stories/corti-ambient.stories.ts | 2 +- stories/corti-dictation.stories.ts | 2 +- 16 files changed, 61 insertions(+), 131 deletions(-) delete mode 100644 src/components/ambient/ambient-audio-visualiser.ts delete mode 100644 src/components/ambient/ambient-keybinding-input.ts delete mode 100644 src/components/dictation/dictation-audio-visualiser.ts delete mode 100644 src/components/dictation/dictation-keybinding-input.ts rename src/components/{base/audio-visualiser-base.ts => internal/speech-audio-visualiser.ts} (80%) rename src/components/{base/keybinding-input-base.ts => internal/speech-keybinding-input.ts} (89%) diff --git a/src/components/ambient/ambient-audio-visualiser.ts b/src/components/ambient/ambient-audio-visualiser.ts deleted file mode 100644 index d880cbe..0000000 --- a/src/components/ambient/ambient-audio-visualiser.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { customElement } from "lit/decorators.js"; -import { AudioVisualiserBase } from "../base/audio-visualiser-base.js"; - -@customElement("ambient-audio-visualiser") -export class AmbientAudioVisualiser extends AudioVisualiserBase {} - -declare global { - interface HTMLElementTagNameMap { - "ambient-audio-visualiser": AmbientAudioVisualiser; - } -} diff --git a/src/components/ambient/ambient-keybinding-input.ts b/src/components/ambient/ambient-keybinding-input.ts deleted file mode 100644 index 8e8bf61..0000000 --- a/src/components/ambient/ambient-keybinding-input.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { customElement } from "lit/decorators.js"; -import { KeybindingInputBase } from "../base/keybinding-input-base.js"; - -@customElement("ambient-keybinding-input") -export class AmbientKeybindingInput extends KeybindingInputBase {} - -declare global { - interface HTMLElementTagNameMap { - "ambient-keybinding-input": AmbientKeybindingInput; - } -} diff --git a/src/components/ambient/ambient-keybinding-selector.ts b/src/components/ambient/ambient-keybinding-selector.ts index 19e7f50..92205e2 100644 --- a/src/components/ambient/ambient-keybinding-selector.ts +++ b/src/components/ambient/ambient-keybinding-selector.ts @@ -1,25 +1,8 @@ -import type { TemplateResult } from "lit"; -import { html } from "lit"; import { customElement } from "lit/decorators.js"; import { KeybindingSelectorBase } from "../base/keybinding-selector-base.js"; -import "./ambient-keybinding-input.js"; - @customElement("ambient-keybinding-selector") -export class AmbientKeybindingSelector extends KeybindingSelectorBase { - protected _renderKeybindingInputs(): TemplateResult { - return html` - - - `; - } -} +export class AmbientKeybindingSelector extends KeybindingSelectorBase {} declare global { interface HTMLElementTagNameMap { diff --git a/src/components/ambient/ambient-recording-button.ts b/src/components/ambient/ambient-recording-button.ts index 7648684..38e85ee 100644 --- a/src/components/ambient/ambient-recording-button.ts +++ b/src/components/ambient/ambient-recording-button.ts @@ -1,7 +1,5 @@ import type { Corti } from "@corti/sdk"; import { consume } from "@lit/context"; -import type { TemplateResult } from "lit"; -import { html } from "lit"; import { customElement, state } from "lit/decorators.js"; import { DEFAULT_STREAM_CONFIG } from "../../constants.js"; import { @@ -16,8 +14,6 @@ import { import { errorEvent } from "../../utils/events.js"; import { RecordingButtonBase } from "../base/recording-button-base.js"; -import "./ambient-audio-visualiser.js"; - const interactionIdRequiredError = () => new Error( "interactionId is required. Set interactionId on corti-ambient or ambient-root.", @@ -28,13 +24,6 @@ export class AmbientRecordingButton extends RecordingButtonBase< AmbientStreamSessionConfig, StreamAmbientMessage > { - protected _renderAudioVisualiser(isRecording: boolean): TemplateResult { - return html``; - } - @consume({ context: ambientConfigContext, subscribe: true }) @state() private _ambientConfig?: Corti.StreamConfig; diff --git a/src/components/base/keybinding-selector-base.ts b/src/components/base/keybinding-selector-base.ts index 416aaa6..9324191 100644 --- a/src/components/base/keybinding-selector-base.ts +++ b/src/components/base/keybinding-selector-base.ts @@ -6,10 +6,9 @@ import { toggleToTalkKeybindingContext, } from "../../contexts/mixins/keybindings-context.js"; import KeybindingSelectorStyles from "../../styles/keybinding-selector.js"; +import "../internal/speech-keybinding-input.js"; -export abstract class KeybindingSelectorBase extends LitElement { - protected abstract _renderKeybindingInputs(): TemplateResult; - +export class KeybindingSelectorBase extends LitElement { @consume({ context: pushToTalkKeybindingContext, subscribe: true }) @state() _pushToTalkKeybinding?: string | null; @@ -23,6 +22,19 @@ export abstract class KeybindingSelectorBase extends LitElement { static styles = KeybindingSelectorStyles; + protected _renderKeybindingInputs(): TemplateResult { + return html` + + + `; + } + render() { return html`
diff --git a/src/components/base/recording-button-base.ts b/src/components/base/recording-button-base.ts index 7901ff0..c2206e8 100644 --- a/src/components/base/recording-button-base.ts +++ b/src/components/base/recording-button-base.ts @@ -58,19 +58,23 @@ import { } from "../../utils/events.js"; import "../../icons/icons.js"; +import "../internal/speech-audio-visualiser.js"; export abstract class RecordingButtonBase< TConfig, TMessage extends RecordingSocketInboundMessage = TranscribeMessage, > extends LitElement { - protected abstract _renderAudioVisualiser( - isRecording: boolean, - ): TemplateResult; - protected get _audioLevel(): number { return this.#mediaController.audioLevel; } + protected _renderAudioVisualiser(isRecording: boolean): TemplateResult { + return html``; + } + @consume({ context: recordingStateContext, subscribe: true }) @state() _recordingState: RecordingState = "stopped"; diff --git a/src/components/dictation/dictation-audio-visualiser.ts b/src/components/dictation/dictation-audio-visualiser.ts deleted file mode 100644 index ee22303..0000000 --- a/src/components/dictation/dictation-audio-visualiser.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { customElement } from "lit/decorators.js"; -import { AudioVisualiserBase } from "../base/audio-visualiser-base.js"; - -@customElement("dictation-audio-visualiser") -export class DictationAudioVisualiser extends AudioVisualiserBase {} - -declare global { - interface HTMLElementTagNameMap { - "dictation-audio-visualiser": DictationAudioVisualiser; - } -} diff --git a/src/components/dictation/dictation-keybinding-input.ts b/src/components/dictation/dictation-keybinding-input.ts deleted file mode 100644 index bf41077..0000000 --- a/src/components/dictation/dictation-keybinding-input.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { customElement } from "lit/decorators.js"; -import { KeybindingInputBase } from "../base/keybinding-input-base.js"; - -@customElement("dictation-keybinding-input") -export class DictationKeybindingInput extends KeybindingInputBase {} - -declare global { - interface HTMLElementTagNameMap { - "dictation-keybinding-input": DictationKeybindingInput; - } -} diff --git a/src/components/dictation/dictation-keybinding-selector.ts b/src/components/dictation/dictation-keybinding-selector.ts index 6a644e9..f743db2 100644 --- a/src/components/dictation/dictation-keybinding-selector.ts +++ b/src/components/dictation/dictation-keybinding-selector.ts @@ -1,25 +1,8 @@ -import type { TemplateResult } from "lit"; -import { html } from "lit"; import { customElement } from "lit/decorators.js"; import { KeybindingSelectorBase } from "../base/keybinding-selector-base.js"; -import "./dictation-keybinding-input.js"; - @customElement("dictation-keybinding-selector") -export class DictationKeybindingSelector extends KeybindingSelectorBase { - protected _renderKeybindingInputs(): TemplateResult { - return html` - - - `; - } -} +export class DictationKeybindingSelector extends KeybindingSelectorBase {} declare global { interface HTMLElementTagNameMap { diff --git a/src/components/dictation/dictation-recording-button.ts b/src/components/dictation/dictation-recording-button.ts index 1383653..15bf0ea 100644 --- a/src/components/dictation/dictation-recording-button.ts +++ b/src/components/dictation/dictation-recording-button.ts @@ -1,7 +1,5 @@ import type { Corti } from "@corti/sdk"; import { consume } from "@lit/context"; -import type { TemplateResult } from "lit"; -import { html } from "lit"; import { customElement, state } from "lit/decorators.js"; import { DEFAULT_DICTATION_CONFIG } from "../../constants.js"; import { dictationConfigContext } from "../../contexts/dictation-context.js"; @@ -11,20 +9,11 @@ import { } from "../../controllers/dictation-controller.js"; import { RecordingButtonBase } from "../base/recording-button-base.js"; -import "./dictation-audio-visualiser.js"; - @customElement("dictation-recording-button") export class DictationRecordingButton extends RecordingButtonBase< Corti.TranscribeConfig, TranscribeMessage > { - protected _renderAudioVisualiser(isRecording: boolean): TemplateResult { - return html``; - } - @consume({ context: dictationConfigContext, subscribe: true }) @state() protected _dictationConfig?: Corti.TranscribeConfig; diff --git a/src/components/base/audio-visualiser-base.ts b/src/components/internal/speech-audio-visualiser.ts similarity index 80% rename from src/components/base/audio-visualiser-base.ts rename to src/components/internal/speech-audio-visualiser.ts index 60f4784..0f50a8e 100644 --- a/src/components/base/audio-visualiser-base.ts +++ b/src/components/internal/speech-audio-visualiser.ts @@ -1,12 +1,13 @@ import { html, LitElement, type PropertyValues } from "lit"; -import { property } from "lit/decorators.js"; +import { customElement, property } from "lit/decorators.js"; import { classMap } from "lit/directives/class-map.js"; import { map } from "lit/directives/map.js"; import { range } from "lit/directives/range.js"; import AudioVisualiserStyles from "../../styles/audio-visualiser.js"; import { normalizeToRange } from "../../utils/validation.js"; -export class AudioVisualiserBase extends LitElement { +@customElement("speech-audio-visualiser") +export class SpeechAudioVisualiser extends LitElement { @property({ type: Number }) level: number = 0; @@ -45,3 +46,9 @@ export class AudioVisualiserBase extends LitElement { `; } } + +declare global { + interface HTMLElementTagNameMap { + "speech-audio-visualiser": SpeechAudioVisualiser; + } +} diff --git a/src/components/base/keybinding-input-base.ts b/src/components/internal/speech-keybinding-input.ts similarity index 89% rename from src/components/base/keybinding-input-base.ts rename to src/components/internal/speech-keybinding-input.ts index 0bdb1db..80c1e28 100644 --- a/src/components/base/keybinding-input-base.ts +++ b/src/components/internal/speech-keybinding-input.ts @@ -1,6 +1,6 @@ import { consume } from "@lit/context"; import { html, LitElement } from "lit"; -import { property, state } from "lit/decorators.js"; +import { customElement, property, state } from "lit/decorators.js"; import { pushToTalkKeybindingContext, toggleToTalkKeybindingContext, @@ -9,7 +9,8 @@ import KeybindingSelectorStyles from "../../styles/keybinding-selector.js"; import { keybindingChangedEvent } from "../../utils/events.js"; import { normalizeKeybinding } from "../../utils/keybinding.js"; -export class KeybindingInputBase extends LitElement { +@customElement("speech-keybinding-input") +export class SpeechKeybindingInput extends LitElement { @property({ type: String }) keybindingType: "push-to-talk" | "toggle-to-talk" = "toggle-to-talk"; @@ -88,3 +89,9 @@ export class KeybindingInputBase extends LitElement { `; } } + +declare global { + interface HTMLElementTagNameMap { + "speech-keybinding-input": SpeechKeybindingInput; + } +} diff --git a/stories/ambient-root.stories.ts b/stories/ambient-root.stories.ts index 99896d9..2673d25 100644 --- a/stories/ambient-root.stories.ts +++ b/stories/ambient-root.stories.ts @@ -4,7 +4,7 @@ import { action } from "storybook/actions"; import type { AmbientRecordingButton } from "../src/components/ambient/ambient-recording-button.js"; import "../src/components/ambient/ambient-recording-button.js"; -import "../src/components/ambient/ambient-audio-visualiser.js"; +import "../src/components/internal/speech-audio-visualiser.js"; import "../src/components/ambient/ambient-settings-menu.js"; import type { AmbientSettingsMenu } from "../src/components/ambient/ambient-settings-menu.js"; import type { AmbientRoot } from "../src/contexts/ambient-context.js"; diff --git a/stories/audio-visualiser.stories.ts b/stories/audio-visualiser.stories.ts index ca9f261..e2bf25c 100644 --- a/stories/audio-visualiser.stories.ts +++ b/stories/audio-visualiser.stories.ts @@ -1,9 +1,9 @@ import type { Meta, StoryObj } from "@storybook/web-components-vite"; import { html } from "lit"; -import "../src/components/dictation/dictation-audio-visualiser.js"; +import "../src/components/internal/speech-audio-visualiser.js"; -import type { DictationAudioVisualiser } from "../src/components/dictation/dictation-audio-visualiser.js"; +import type { SpeechAudioVisualiser } from "../src/components/internal/speech-audio-visualiser.js"; import { disableControls } from "./helpers.js"; const meta = { @@ -21,64 +21,64 @@ const meta = { description: "Audio level from 0 to 1", }, }, - component: "dictation-audio-visualiser", - render: ({ level = 0, active = true }: DictationAudioVisualiserArgTypes) => { + component: "speech-audio-visualiser", + render: ({ level = 0, active = true }: SpeechAudioVisualiserArgTypes) => { return html`
- +
`; }, - title: "DictationAudioVisualiser", -} satisfies Meta; + title: "SpeechAudioVisualiser", +} satisfies Meta; export default meta; -interface DictationAudioVisualiserArgTypes { +interface SpeechAudioVisualiserArgTypes { level?: number; active?: boolean; } -export const Default = {} as StoryObj; +export const Default = {} as StoryObj; export const Inactive = { args: { active: false, }, argTypes: disableControls(["active"]), -} as StoryObj; +} as StoryObj; export const Low = { args: { level: 0.2, }, argTypes: disableControls(["active"]), -} as StoryObj; +} as StoryObj; export const Medium = { args: { level: 0.5, }, argTypes: disableControls(["active"]), -} as StoryObj; +} as StoryObj; export const High = { args: { level: 0.8, }, argTypes: disableControls(["active"]), -} as StoryObj; +} as StoryObj; export const Full = { args: { level: 1, }, argTypes: disableControls(["active"]), -} as StoryObj; +} as StoryObj; export const Silent = { args: { level: 0, }, argTypes: disableControls(["active"]), -} as StoryObj; +} as StoryObj; diff --git a/stories/corti-ambient.stories.ts b/stories/corti-ambient.stories.ts index e5792e9..50ac2a8 100644 --- a/stories/corti-ambient.stories.ts +++ b/stories/corti-ambient.stories.ts @@ -1,7 +1,7 @@ import type { Meta, StoryObj } from "@storybook/web-components-vite"; import { html, nothing } from "lit"; -import "../src/components/ambient/ambient-audio-visualiser.js"; +import "../src/components/internal/speech-audio-visualiser.js"; import type { CortiAmbient } from "../src/components/ambient/corti-ambient.js"; import DeviceSelectorStoryMeta from "./device-selector.stories.js"; diff --git a/stories/corti-dictation.stories.ts b/stories/corti-dictation.stories.ts index 7460572..f2949cb 100644 --- a/stories/corti-dictation.stories.ts +++ b/stories/corti-dictation.stories.ts @@ -1,7 +1,7 @@ import type { Meta, StoryObj } from "@storybook/web-components-vite"; import { html, nothing } from "lit"; -import "../src/components/dictation/dictation-audio-visualiser.js"; +import "../src/components/internal/speech-audio-visualiser.js"; import type { CortiDictation } from "../src/components/dictation/corti-dictation.js"; import DeviceSelectorStoryMeta from "./device-selector.stories.js"; From 3427a6d2dd578f8caf7edacb22e1a5a5a300b3b1 Mon Sep 17 00:00:00 2001 From: markitosha Date: Wed, 3 Jun 2026 11:15:31 +0200 Subject: [PATCH 25/50] refactor: split monorepo into core, dictation, and ambient packages Move shared source under core/ (build-only, not published), publish from dictation/ and ambient/ via pnpm workspaces, and ignore package dist/ and node_modules in git. --- .github/workflows/ci.yml | 38 +- .gitignore | 9 +- .storybook/main.js | 14 + package.ambient.json => ambient/package.json | 3 + .../components}/ambient-device-selector.ts | 2 +- .../ambient-keybinding-selector.ts | 2 +- .../components}/ambient-language-selector.ts | 2 +- .../components}/ambient-recording-button.ts | 17 +- .../src/components}/ambient-settings-menu.ts | 2 +- .../ambient-virtual-mode-selector.ts | 8 +- .../src/components}/corti-ambient.ts | 16 +- ambient/src/constants.ts | 11 + .../src}/contexts/ambient-context.ts | 10 +- .../src}/controllers/ambient-controller.ts | 4 +- src/ambient-index.ts => ambient/src/index.ts | 29 +- .../styles/ambient-virtual-mode-selector.ts | 0 ambient/tsconfig.json | 14 + biome.json | 10 +- .../src/components}/corti-root.ts | 4 +- .../src/components}/device-selector-base.ts | 6 +- .../components}/keybinding-selector-base.ts | 6 +- .../src/components}/language-selector-base.ts | 8 +- .../src/components}/recording-button-base.ts | 71 +- .../src/components}/settings-menu-base.ts | 14 +- .../components}/speech-audio-visualiser.ts | 4 +- .../components}/speech-keybinding-input.ts | 8 +- {src => core/src}/constants.ts | 15 - .../src}/contexts/mixins/auth-context.ts | 0 .../src}/contexts/mixins/devices-context.ts | 0 .../contexts/mixins/keybindings-context.ts | 0 .../src}/contexts/mixins/languages-context.ts | 0 .../src}/contexts/mixins/proxy-context.ts | 0 .../mixins/recording-state-context.ts | 0 {src => core/src}/contexts/mixins/types.ts | 0 {src => core/src}/contexts/root-context.ts | 0 .../src}/controllers/devices-controller.ts | 0 .../src}/controllers/keybinding-controller.ts | 0 .../src}/controllers/languages-controller.ts | 0 .../src}/controllers/media-controller.ts | 0 .../src}/controllers/socket-controller.ts | 0 {src => core/src}/icons/icons.ts | 0 {src => core/src}/icons/index.ts | 0 {src => core/src}/styles/audio-visualiser.ts | 0 {src => core/src}/styles/buttons.ts | 0 {src => core/src}/styles/callout.ts | 0 {src => core/src}/styles/component-styles.ts | 0 .../src}/styles/keybinding-selector.ts | 0 {src => core/src}/styles/recording-button.ts | 0 {src => core/src}/styles/select.ts | 0 {src => core/src}/styles/settings-menu.ts | 0 {src => core/src}/types.ts | 7 +- {src => core/src}/utils/auth.ts | 0 {src => core/src}/utils/converters.ts | 0 {src => core/src}/utils/devices.ts | 0 {src => core/src}/utils/events.ts | 0 {src => core/src}/utils/keybinding.ts | 0 {src => core/src}/utils/languages.ts | 0 {src => core/src}/utils/media.ts | 0 {src => core/src}/utils/token.ts | 0 {src => core/src}/utils/validation.ts | 0 core/tsconfig.json | 10 + .../package.json | 3 + .../src/components}/corti-dictation.ts | 8 +- .../components}/dictation-device-selector.ts | 2 +- .../dictation-keybinding-selector.ts | 2 +- .../dictation-language-selector.ts | 2 +- .../components}/dictation-recording-button.ts | 15 +- .../components}/dictation-settings-menu.ts | 2 +- dictation/src/constants.ts | 7 + .../src}/contexts/dictation-context.ts | 2 +- .../src}/controllers/dictation-controller.ts | 4 +- {src => dictation/src}/index.ts | 25 +- dictation/tsconfig.json | 14 + package-lock.json | 11745 ---------------- package.json | 23 +- pnpm-lock.yaml | 7663 ++++++++++ pnpm-workspace.yaml | 3 + scripts/build-ambient.mjs | 20 + scripts/build-dictation.mjs | 20 + stories/ambient-root.stories.ts | 10 +- stories/audio-visualiser.stories.ts | 4 +- stories/corti-ambient.stories.ts | 6 +- stories/corti-dictation.stories.ts | 6 +- stories/device-selector.stories.ts | 4 +- stories/keybinding-selector.stories.ts | 4 +- stories/language-selector.stories.ts | 4 +- stories/recording-button.stories.ts | 4 +- stories/settings-menu.stories.ts | 4 +- test/devices.test.ts | 2 +- tsconfig.ambient.json | 14 - tsconfig.base.json | 19 + tsconfig.dictation.json | 14 - tsconfig.json | 25 +- tsconfig.stories.json | 22 +- tsconfig.test.json | 10 +- web-test-runner.config.js | 39 +- 96 files changed, 8061 insertions(+), 12034 deletions(-) rename package.ambient.json => ambient/package.json (92%) rename {src/components/ambient => ambient/src/components}/ambient-device-selector.ts (77%) rename {src/components/ambient => ambient/src/components}/ambient-keybinding-selector.ts (77%) rename {src/components/ambient => ambient/src/components}/ambient-language-selector.ts (77%) rename {src/components/ambient => ambient/src/components}/ambient-recording-button.ts (78%) rename {src/components/ambient => ambient/src/components}/ambient-settings-menu.ts (94%) rename {src/components/ambient => ambient/src/components}/ambient-virtual-mode-selector.ts (85%) rename {src/components/ambient => ambient/src/components}/corti-ambient.ts (90%) create mode 100644 ambient/src/constants.ts rename {src => ambient/src}/contexts/ambient-context.ts (89%) rename {src => ambient/src}/controllers/ambient-controller.ts (93%) rename src/ambient-index.ts => ambient/src/index.ts (56%) rename {src => ambient/src}/styles/ambient-virtual-mode-selector.ts (100%) create mode 100644 ambient/tsconfig.json rename {src/components/base => core/src/components}/corti-root.ts (98%) rename {src/components/base => core/src/components}/device-selector-base.ts (90%) rename {src/components/base => core/src/components}/keybinding-selector-base.ts (88%) rename {src/components/base => core/src/components}/language-selector-base.ts (89%) rename {src/components/base => core/src/components}/recording-button-base.ts (85%) rename {src/components/base => core/src/components}/settings-menu-base.ts (85%) rename {src/components/internal => core/src/components}/speech-audio-visualiser.ts (90%) rename {src/components/internal => core/src/components}/speech-keybinding-input.ts (90%) rename {src => core/src}/constants.ts (62%) rename {src => core/src}/contexts/mixins/auth-context.ts (100%) rename {src => core/src}/contexts/mixins/devices-context.ts (100%) rename {src => core/src}/contexts/mixins/keybindings-context.ts (100%) rename {src => core/src}/contexts/mixins/languages-context.ts (100%) rename {src => core/src}/contexts/mixins/proxy-context.ts (100%) rename {src => core/src}/contexts/mixins/recording-state-context.ts (100%) rename {src => core/src}/contexts/mixins/types.ts (100%) rename {src => core/src}/contexts/root-context.ts (100%) rename {src => core/src}/controllers/devices-controller.ts (100%) rename {src => core/src}/controllers/keybinding-controller.ts (100%) rename {src => core/src}/controllers/languages-controller.ts (100%) rename {src => core/src}/controllers/media-controller.ts (100%) rename {src => core/src}/controllers/socket-controller.ts (100%) rename {src => core/src}/icons/icons.ts (100%) rename {src => core/src}/icons/index.ts (100%) rename {src => core/src}/styles/audio-visualiser.ts (100%) rename {src => core/src}/styles/buttons.ts (100%) rename {src => core/src}/styles/callout.ts (100%) rename {src => core/src}/styles/component-styles.ts (100%) rename {src => core/src}/styles/keybinding-selector.ts (100%) rename {src => core/src}/styles/recording-button.ts (100%) rename {src => core/src}/styles/select.ts (100%) rename {src => core/src}/styles/settings-menu.ts (100%) rename {src => core/src}/types.ts (57%) rename {src => core/src}/utils/auth.ts (100%) rename {src => core/src}/utils/converters.ts (100%) rename {src => core/src}/utils/devices.ts (100%) rename {src => core/src}/utils/events.ts (100%) rename {src => core/src}/utils/keybinding.ts (100%) rename {src => core/src}/utils/languages.ts (100%) rename {src => core/src}/utils/media.ts (100%) rename {src => core/src}/utils/token.ts (100%) rename {src => core/src}/utils/validation.ts (100%) create mode 100644 core/tsconfig.json rename package.dictation.json => dictation/package.json (92%) rename {src/components/dictation => dictation/src/components}/corti-dictation.ts (95%) rename {src/components/dictation => dictation/src/components}/dictation-device-selector.ts (78%) rename {src/components/dictation => dictation/src/components}/dictation-keybinding-selector.ts (77%) rename {src/components/dictation => dictation/src/components}/dictation-language-selector.ts (77%) rename {src/components/dictation => dictation/src/components}/dictation-recording-button.ts (65%) rename {src/components/dictation => dictation/src/components}/dictation-settings-menu.ts (93%) create mode 100644 dictation/src/constants.ts rename {src => dictation/src}/contexts/dictation-context.ts (97%) rename {src => dictation/src}/controllers/dictation-controller.ts (92%) rename {src => dictation/src}/index.ts (66%) create mode 100644 dictation/tsconfig.json delete mode 100644 package-lock.json create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml create mode 100644 scripts/build-ambient.mjs create mode 100644 scripts/build-dictation.mjs delete mode 100644 tsconfig.ambient.json create mode 100644 tsconfig.base.json delete mode 100644 tsconfig.dictation.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1f26b0f..5adcaa2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,16 +14,20 @@ jobs: - name: Checkout repo uses: actions/checkout@v4 + - name: Install pnpm + uses: pnpm/action-setup@v4 + - name: Set up node uses: actions/setup-node@v4 with: node-version: lts/* + cache: pnpm - name: Install dependencies - run: npm ci + run: pnpm install --frozen-lockfile - name: Build - run: npm run build + run: pnpm run build lint: runs-on: ubuntu-latest @@ -32,16 +36,20 @@ jobs: - name: Checkout repo uses: actions/checkout@v4 + - name: Install pnpm + uses: pnpm/action-setup@v4 + - name: Set up node uses: actions/setup-node@v4 with: node-version: lts/* + cache: pnpm - name: Install dependencies - run: npm ci + run: pnpm install --frozen-lockfile - name: Lint - run: npm run lint + run: pnpm run lint test: runs-on: ubuntu-latest @@ -50,16 +58,20 @@ jobs: - name: Checkout repo uses: actions/checkout@v4 + - name: Install pnpm + uses: pnpm/action-setup@v4 + - name: Set up node uses: actions/setup-node@v4 with: node-version: lts/* + cache: pnpm - name: Install dependencies - run: npm ci + run: pnpm install --frozen-lockfile - name: Test - run: npm test + run: pnpm test publish: needs: [compile, lint, test] @@ -90,18 +102,22 @@ jobs: echo "version=$VERSION" >> $GITHUB_OUTPUT echo "suffix=$SUFFIX" >> $GITHUB_OUTPUT + - name: Install pnpm + uses: pnpm/action-setup@v4 + - name: Set up node uses: actions/setup-node@v4 with: node-version: lts/* + cache: pnpm - name: Install dependencies - run: npm ci + run: pnpm install --frozen-lockfile - name: Set version run: | VERSION="${{ steps.version.outputs.version }}" - for f in package.dictation.json package.ambient.json; do + for f in dictation/package.json ambient/package.json; do node -e " const fs = require('fs'); const pkg = JSON.parse(fs.readFileSync('${f}', 'utf8')); @@ -112,7 +128,7 @@ jobs: echo "Publish manifests version set to ${VERSION}" - name: Build - run: npm run build + run: pnpm run build - name: Publish @corti/dictation-web run: | @@ -120,7 +136,7 @@ jobs: npx -y npm@latest publish "$@" } SUFFIX="${{ steps.version.outputs.suffix }}" - cd dist/dictation + cd dictation/dist if [[ -n "$SUFFIX" ]]; then publish --access public --tag "$SUFFIX" else @@ -141,7 +157,7 @@ jobs: npx -y npm@latest publish "$@" } SUFFIX="${{ steps.version.outputs.suffix }}" - cd dist/ambient + cd ambient/dist if [[ -n "$SUFFIX" ]]; then publish --access public --tag "$SUFFIX" else diff --git a/.gitignore b/.gitignore index e4e5a15..08a6e62 100644 --- a/.gitignore +++ b/.gitignore @@ -7,7 +7,7 @@ tsconfig.tsbuildinfo .DS_Store ## npm -/node_modules/ +**/node_modules/ /npm-debug.log ## testing @@ -18,10 +18,11 @@ tsconfig.tsbuildinfo # build /_site/ -/dist/ +**/dist/ /out-tsc/ +**/.tsbuildinfo storybook-static custom-elements.json - -.security-scan/ + +.security-scan/ diff --git a/.storybook/main.js b/.storybook/main.js index 4c918d7..6d6793c 100644 --- a/.storybook/main.js +++ b/.storybook/main.js @@ -1,3 +1,8 @@ +import { dirname, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; + +const root = resolve(dirname(fileURLToPath(import.meta.url)), ".."); + export default { stories: ['../stories/**/*.stories.ts'], addons: [ @@ -7,6 +12,15 @@ export default { ], framework: '@storybook/web-components-vite', + viteFinal: async (config) => { + config.resolve ??= {}; + config.resolve.alias = { + ...config.resolve.alias, + "@core": resolve(root, "core/src"), + }; + return config; + }, + wdsFinal: async (config) => { return { ...config, diff --git a/package.ambient.json b/ambient/package.json similarity index 92% rename from package.ambient.json rename to ambient/package.json index 54292fa..0eebb44 100644 --- a/package.ambient.json +++ b/ambient/package.json @@ -41,5 +41,8 @@ "@corti/sdk": "3.0.0", "@lit/context": "^1.1.6", "lit": "^3.3.1" + }, + "scripts": { + "build": "tsc -b && node ../scripts/build-ambient.mjs" } } diff --git a/src/components/ambient/ambient-device-selector.ts b/ambient/src/components/ambient-device-selector.ts similarity index 77% rename from src/components/ambient/ambient-device-selector.ts rename to ambient/src/components/ambient-device-selector.ts index 8f405a9..78dca7e 100644 --- a/src/components/ambient/ambient-device-selector.ts +++ b/ambient/src/components/ambient-device-selector.ts @@ -1,5 +1,5 @@ +import { DeviceSelectorBase } from "@core/components/device-selector-base.js"; import { customElement } from "lit/decorators.js"; -import { DeviceSelectorBase } from "../base/device-selector-base.js"; @customElement("ambient-device-selector") export class AmbientDeviceSelector extends DeviceSelectorBase {} diff --git a/src/components/ambient/ambient-keybinding-selector.ts b/ambient/src/components/ambient-keybinding-selector.ts similarity index 77% rename from src/components/ambient/ambient-keybinding-selector.ts rename to ambient/src/components/ambient-keybinding-selector.ts index 92205e2..0b073b0 100644 --- a/src/components/ambient/ambient-keybinding-selector.ts +++ b/ambient/src/components/ambient-keybinding-selector.ts @@ -1,5 +1,5 @@ +import { KeybindingSelectorBase } from "@core/components/keybinding-selector-base.js"; import { customElement } from "lit/decorators.js"; -import { KeybindingSelectorBase } from "../base/keybinding-selector-base.js"; @customElement("ambient-keybinding-selector") export class AmbientKeybindingSelector extends KeybindingSelectorBase {} diff --git a/src/components/ambient/ambient-language-selector.ts b/ambient/src/components/ambient-language-selector.ts similarity index 77% rename from src/components/ambient/ambient-language-selector.ts rename to ambient/src/components/ambient-language-selector.ts index c634d05..99f483f 100644 --- a/src/components/ambient/ambient-language-selector.ts +++ b/ambient/src/components/ambient-language-selector.ts @@ -1,5 +1,5 @@ +import { LanguageSelectorBase } from "@core/components/language-selector-base.js"; import { customElement } from "lit/decorators.js"; -import { LanguageSelectorBase } from "../base/language-selector-base.js"; @customElement("ambient-language-selector") export class AmbientLanguageSelector extends LanguageSelectorBase {} diff --git a/src/components/ambient/ambient-recording-button.ts b/ambient/src/components/ambient-recording-button.ts similarity index 78% rename from src/components/ambient/ambient-recording-button.ts rename to ambient/src/components/ambient-recording-button.ts index 38e85ee..b91d9c5 100644 --- a/src/components/ambient/ambient-recording-button.ts +++ b/ambient/src/components/ambient-recording-button.ts @@ -1,18 +1,19 @@ +import { RecordingButtonBase } from "@core/components/recording-button-base.js"; +import { errorEvent } from "@core/utils/events.js"; import type { Corti } from "@corti/sdk"; import { consume } from "@lit/context"; import { customElement, state } from "lit/decorators.js"; -import { DEFAULT_STREAM_CONFIG } from "../../constants.js"; +import { DEFAULT_AMBIENT_CONFIG } from "../constants.js"; import { ambientConfigContext, interactionIdContext, -} from "../../contexts/ambient-context.js"; + virtualModeContext, +} from "../contexts/ambient-context.js"; import { AmbientController, type AmbientStreamSessionConfig, type StreamAmbientMessage, -} from "../../controllers/ambient-controller.js"; -import { errorEvent } from "../../utils/events.js"; -import { RecordingButtonBase } from "../base/recording-button-base.js"; +} from "../controllers/ambient-controller.js"; const interactionIdRequiredError = () => new Error( @@ -24,6 +25,10 @@ export class AmbientRecordingButton extends RecordingButtonBase< AmbientStreamSessionConfig, StreamAmbientMessage > { + @consume({ context: virtualModeContext, subscribe: true }) + @state() + override _virtualMode?: boolean; + @consume({ context: ambientConfigContext, subscribe: true }) @state() private _ambientConfig?: Corti.StreamConfig; @@ -60,7 +65,7 @@ export class AmbientRecordingButton extends RecordingButtonBase< } return { - configuration: this._ambientConfig ?? DEFAULT_STREAM_CONFIG, + configuration: this._ambientConfig ?? DEFAULT_AMBIENT_CONFIG, interactionId, }; } diff --git a/src/components/ambient/ambient-settings-menu.ts b/ambient/src/components/ambient-settings-menu.ts similarity index 94% rename from src/components/ambient/ambient-settings-menu.ts rename to ambient/src/components/ambient-settings-menu.ts index ac9e209..4f1a8ed 100644 --- a/src/components/ambient/ambient-settings-menu.ts +++ b/ambient/src/components/ambient-settings-menu.ts @@ -1,7 +1,7 @@ +import { SettingsMenuBase } from "@core/components/settings-menu-base.js"; import type { TemplateResult } from "lit"; import { html } from "lit"; import { customElement } from "lit/decorators.js"; -import { SettingsMenuBase } from "../base/settings-menu-base.js"; import "./ambient-device-selector.js"; import "./ambient-keybinding-selector.js"; diff --git a/src/components/ambient/ambient-virtual-mode-selector.ts b/ambient/src/components/ambient-virtual-mode-selector.ts similarity index 85% rename from src/components/ambient/ambient-virtual-mode-selector.ts rename to ambient/src/components/ambient-virtual-mode-selector.ts index 1b7a13f..5e483a6 100644 --- a/src/components/ambient/ambient-virtual-mode-selector.ts +++ b/ambient/src/components/ambient-virtual-mode-selector.ts @@ -1,11 +1,11 @@ +import { virtualModeChangedEvent } from "@core/utils/events.js"; import { consume } from "@lit/context"; import { html, LitElement } from "lit"; import { customElement, property, state } from "lit/decorators.js"; -import { virtualModeContext } from "../../contexts/ambient-context.js"; -import AmbientVirtualModeSelectorStyles from "../../styles/ambient-virtual-mode-selector.js"; -import { virtualModeChangedEvent } from "../../utils/events.js"; +import { virtualModeContext } from "../contexts/ambient-context.js"; +import AmbientVirtualModeSelectorStyles from "../styles/ambient-virtual-mode-selector.js"; -import "../../icons/icons.js"; +import "@core/icons/icons.js"; @customElement("ambient-virtual-mode-selector") export class AmbientVirtualModeSelector extends LitElement { diff --git a/src/components/ambient/corti-ambient.ts b/ambient/src/components/corti-ambient.ts similarity index 90% rename from src/components/ambient/corti-ambient.ts rename to ambient/src/components/corti-ambient.ts index e506d4a..fae3f48 100644 --- a/src/components/ambient/corti-ambient.ts +++ b/ambient/src/components/corti-ambient.ts @@ -1,16 +1,16 @@ +import { CortiRoot } from "@core/components/corti-root.js"; +import type { ConfigurableSettings } from "@core/types.js"; +import { commaSeparatedConverter } from "@core/utils/converters.js"; import type { Corti } from "@corti/sdk"; import { html, nothing } from "lit"; import { customElement, property, state } from "lit/decorators.js"; import { classMap } from "lit/directives/class-map.js"; import { ref } from "lit/directives/ref.js"; -import { DEFAULT_STREAM_CONFIG } from "../../constants.js"; -import type { AmbientRoot } from "../../contexts/ambient-context.js"; -import type { ConfigurableSettings } from "../../types.js"; -import { commaSeparatedConverter } from "../../utils/converters.js"; -import { CortiRoot } from "../base/corti-root.js"; +import { DEFAULT_AMBIENT_CONFIG } from "../constants.js"; +import type { AmbientRoot } from "../contexts/ambient-context.js"; import type { AmbientRecordingButton } from "./ambient-recording-button.js"; -import "../../contexts/ambient-context.js"; +import "../contexts/ambient-context.js"; import "./ambient-recording-button.js"; import "./ambient-settings-menu.js"; @@ -45,12 +45,12 @@ export class CortiAmbient extends CortiRoot< return ( this._contextProviderRef.value?.ambientConfig ?? this._ambientConfig ?? - DEFAULT_STREAM_CONFIG + DEFAULT_AMBIENT_CONFIG ); } @state() - _ambientConfig: Corti.StreamConfig = DEFAULT_STREAM_CONFIG; + _ambientConfig: Corti.StreamConfig = DEFAULT_AMBIENT_CONFIG; /** * Stream interaction id passed to `stream.connect` for this session. diff --git a/ambient/src/constants.ts b/ambient/src/constants.ts new file mode 100644 index 0000000..3730963 --- /dev/null +++ b/ambient/src/constants.ts @@ -0,0 +1,11 @@ +import type { Corti } from "@corti/sdk"; + +export const DEFAULT_AMBIENT_CONFIG: Corti.StreamConfig = { + mode: { outputLocale: "en", type: "facts" }, + transcription: { + isDiarization: true, + isMultichannel: false, + participants: [], + primaryLanguage: "en", + }, +}; diff --git a/src/contexts/ambient-context.ts b/ambient/src/contexts/ambient-context.ts similarity index 89% rename from src/contexts/ambient-context.ts rename to ambient/src/contexts/ambient-context.ts index c49efc1..88ac1de 100644 --- a/src/contexts/ambient-context.ts +++ b/ambient/src/contexts/ambient-context.ts @@ -1,9 +1,9 @@ +import { RootContext } from "@core/contexts/root-context.js"; import type { Corti } from "@corti/sdk"; import { createContext, provide } from "@lit/context"; import type { PropertyValues } from "lit"; import { customElement, property } from "lit/decorators.js"; -import { DEFAULT_STREAM_CONFIG } from "../constants.js"; -import { RootContext } from "./root-context.js"; +import { DEFAULT_AMBIENT_CONFIG } from "../constants.js"; export const ambientConfigContext = createContext< Corti.StreamConfig | undefined @@ -19,7 +19,7 @@ export const virtualModeContext = createContext(Symbol("virtualMode")); export class AmbientRoot extends RootContext { @provide({ context: ambientConfigContext }) @property({ attribute: false, type: Object }) - ambientConfig: Corti.StreamConfig = DEFAULT_STREAM_CONFIG; + ambientConfig: Corti.StreamConfig = DEFAULT_AMBIENT_CONFIG; @provide({ context: interactionIdContext }) @property({ type: String }) @@ -36,7 +36,7 @@ export class AmbientRoot extends RootContext { const event = e as CustomEvent<{ enabled: boolean }>; this.virtualMode = event.detail.enabled; // Set multichannel transcription for virtual mode - const base = this.ambientConfig ?? DEFAULT_STREAM_CONFIG; + const base = this.ambientConfig ?? DEFAULT_AMBIENT_CONFIG; if (event.detail.enabled) { this.ambientConfig = { @@ -69,7 +69,7 @@ export class AmbientRoot extends RootContext { const lang = (event.detail.selectedLanguage ?? "en") as Corti.TranscribeSupportedLanguage; - const base = this.ambientConfig ?? DEFAULT_STREAM_CONFIG; + const base = this.ambientConfig ?? DEFAULT_AMBIENT_CONFIG; this.ambientConfig = { ...base, diff --git a/src/controllers/ambient-controller.ts b/ambient/src/controllers/ambient-controller.ts similarity index 93% rename from src/controllers/ambient-controller.ts rename to ambient/src/controllers/ambient-controller.ts index 9ee2d2d..24e69c8 100644 --- a/src/controllers/ambient-controller.ts +++ b/ambient/src/controllers/ambient-controller.ts @@ -1,10 +1,10 @@ +import { SocketController } from "@core/controllers/socket-controller.js"; +import type { ProxyOptions } from "@core/types.js"; import { type Corti, type CortiClient, CortiWebSocketProxyClient, } from "@corti/sdk"; -import type { ProxyOptions } from "../types.js"; -import { SocketController } from "./socket-controller.js"; export type AmbientStreamSessionConfig = { interactionId: string; diff --git a/src/ambient-index.ts b/ambient/src/index.ts similarity index 56% rename from src/ambient-index.ts rename to ambient/src/index.ts index 6133541..5d3ee3f 100644 --- a/src/ambient-index.ts +++ b/ambient/src/index.ts @@ -1,21 +1,8 @@ -export { AmbientDeviceSelector } from "./components/ambient/ambient-device-selector.js"; -export { AmbientKeybindingSelector } from "./components/ambient/ambient-keybinding-selector.js"; -export { AmbientLanguageSelector } from "./components/ambient/ambient-language-selector.js"; -export { AmbientRecordingButton } from "./components/ambient/ambient-recording-button.js"; -export { AmbientSettingsMenu } from "./components/ambient/ambient-settings-menu.js"; -export { AmbientVirtualModeSelector } from "./components/ambient/ambient-virtual-mode-selector.js"; -export { - CortiAmbient as default, - CortiAmbient, -} from "./components/ambient/corti-ambient.js"; -export { AmbientRoot } from "./contexts/ambient-context.js"; - -export type { AmbientStreamSessionConfig } from "./controllers/ambient-controller.js"; export type { ConfigurableSettings, Keybinding, RecordingState, -} from "./types.js"; +} from "@core/types.js"; export type { AudioEventEventDetail, AudioLevelChangedEventDetail, @@ -32,4 +19,16 @@ export type { TranscriptEventDetail, UsageEventDetail, VirtualModeChangedEventDetail, -} from "./utils/events.js"; +} from "@core/utils/events.js"; +export { AmbientDeviceSelector } from "./components/ambient-device-selector.js"; +export { AmbientKeybindingSelector } from "./components/ambient-keybinding-selector.js"; +export { AmbientLanguageSelector } from "./components/ambient-language-selector.js"; +export { AmbientRecordingButton } from "./components/ambient-recording-button.js"; +export { AmbientSettingsMenu } from "./components/ambient-settings-menu.js"; +export { AmbientVirtualModeSelector } from "./components/ambient-virtual-mode-selector.js"; +export { + CortiAmbient as default, + CortiAmbient, +} from "./components/corti-ambient.js"; +export { AmbientRoot } from "./contexts/ambient-context.js"; +export type { AmbientStreamSessionConfig } from "./controllers/ambient-controller.js"; diff --git a/src/styles/ambient-virtual-mode-selector.ts b/ambient/src/styles/ambient-virtual-mode-selector.ts similarity index 100% rename from src/styles/ambient-virtual-mode-selector.ts rename to ambient/src/styles/ambient-virtual-mode-selector.ts diff --git a/ambient/tsconfig.json b/ambient/tsconfig.json new file mode 100644 index 0000000..1cbe28d --- /dev/null +++ b/ambient/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "../tsconfig.base.json", + "compilerOptions": { + "composite": true, + "rootDir": "src", + "outDir": "dist", + "tsBuildInfoFile": "dist/.tsbuildinfo", + "paths": { + "@core/*": ["../core/src/*"] + } + }, + "include": ["src/**/*.ts"], + "references": [{ "path": "../core" }] +} diff --git a/biome.json b/biome.json index 1dcf729..3b390d7 100644 --- a/biome.json +++ b/biome.json @@ -21,11 +21,15 @@ }, "files": { "includes": [ - "src/**", + "core/src/**", + "dictation/src/**", + "ambient/src/**", + "scripts/**", "stories/**", "test/**", "!**/*.gen.ts", - "!**/*.d.ts" + "!**/*.d.ts", + "!**/dist" ] }, "formatter": { @@ -72,7 +76,7 @@ } }, { - "includes": ["src/contexts/mixins/**/*.ts"], + "includes": ["core/src/contexts/mixins/**/*.ts"], "linter": { "rules": { "correctness": { diff --git a/src/components/base/corti-root.ts b/core/src/components/corti-root.ts similarity index 98% rename from src/components/base/corti-root.ts rename to core/src/components/corti-root.ts index 4d5fe06..f3df1d4 100644 --- a/src/components/base/corti-root.ts +++ b/core/src/components/corti-root.ts @@ -6,8 +6,8 @@ import type { ConfigurableSettings, ProxyOptions, RecordingState, -} from "../../types.js"; -import { commaSeparatedConverter } from "../../utils/converters.js"; +} from "../types.js"; +import { commaSeparatedConverter } from "../utils/converters.js"; type CortiProviderRoot = LitElement & { recordingState?: RecordingState; diff --git a/src/components/base/device-selector-base.ts b/core/src/components/device-selector-base.ts similarity index 90% rename from src/components/base/device-selector-base.ts rename to core/src/components/device-selector-base.ts index f6ab094..b77c68e 100644 --- a/src/components/base/device-selector-base.ts +++ b/core/src/components/device-selector-base.ts @@ -4,9 +4,9 @@ import { property, state } from "lit/decorators.js"; import { devicesContext, selectedDeviceContext, -} from "../../contexts/mixins/devices-context.js"; -import SelectStyles from "../../styles/select.js"; -import { recordingDevicesChangedEvent } from "../../utils/events.js"; +} from "../contexts/mixins/devices-context.js"; +import SelectStyles from "../styles/select.js"; +import { recordingDevicesChangedEvent } from "../utils/events.js"; export class DeviceSelectorBase extends LitElement { @consume({ context: devicesContext, subscribe: true }) diff --git a/src/components/base/keybinding-selector-base.ts b/core/src/components/keybinding-selector-base.ts similarity index 88% rename from src/components/base/keybinding-selector-base.ts rename to core/src/components/keybinding-selector-base.ts index 9324191..98030ff 100644 --- a/src/components/base/keybinding-selector-base.ts +++ b/core/src/components/keybinding-selector-base.ts @@ -4,9 +4,9 @@ import { property, state } from "lit/decorators.js"; import { pushToTalkKeybindingContext, toggleToTalkKeybindingContext, -} from "../../contexts/mixins/keybindings-context.js"; -import KeybindingSelectorStyles from "../../styles/keybinding-selector.js"; -import "../internal/speech-keybinding-input.js"; +} from "../contexts/mixins/keybindings-context.js"; +import KeybindingSelectorStyles from "../styles/keybinding-selector.js"; +import "./speech-keybinding-input.js"; export class KeybindingSelectorBase extends LitElement { @consume({ context: pushToTalkKeybindingContext, subscribe: true }) diff --git a/src/components/base/language-selector-base.ts b/core/src/components/language-selector-base.ts similarity index 89% rename from src/components/base/language-selector-base.ts rename to core/src/components/language-selector-base.ts index e1ae5bb..892ac45 100644 --- a/src/components/base/language-selector-base.ts +++ b/core/src/components/language-selector-base.ts @@ -5,13 +5,13 @@ import { property, state } from "lit/decorators.js"; import { languagesContext, selectedLanguageContext, -} from "../../contexts/mixins/languages-context.js"; -import SelectStyles from "../../styles/select.js"; +} from "../contexts/mixins/languages-context.js"; +import SelectStyles from "../styles/select.js"; import { languageChangedEvent, languagesChangedEvent, -} from "../../utils/events.js"; -import { getLanguageName } from "../../utils/languages.js"; +} from "../utils/events.js"; +import { getLanguageName } from "../utils/languages.js"; export class LanguageSelectorBase extends LitElement { @consume({ context: languagesContext, subscribe: true }) diff --git a/src/components/base/recording-button-base.ts b/core/src/components/recording-button-base.ts similarity index 85% rename from src/components/base/recording-button-base.ts rename to core/src/components/recording-button-base.ts index c2206e8..68e8ef9 100644 --- a/src/components/base/recording-button-base.ts +++ b/core/src/components/recording-button-base.ts @@ -8,40 +8,37 @@ import { type PropertyValues, } from "lit"; import { property, state } from "lit/decorators.js"; -import { AUDIO_CHUNK_INTERVAL_MS } from "../../constants.js"; -import { virtualModeContext } from "../../contexts/ambient-context.js"; -import { debugDisplayAudioContext } from "../../contexts/dictation-context.js"; +import { AUDIO_CHUNK_INTERVAL_MS } from "../constants.js"; import { accessTokenContext, authConfigContext, regionContext, tenantNameContext, -} from "../../contexts/mixins/auth-context.js"; -import { selectedDeviceContext } from "../../contexts/mixins/devices-context.js"; +} from "../contexts/mixins/auth-context.js"; +import { selectedDeviceContext } from "../contexts/mixins/devices-context.js"; import { pushToTalkKeybindingContext, toggleToTalkKeybindingContext, -} from "../../contexts/mixins/keybindings-context.js"; +} from "../contexts/mixins/keybindings-context.js"; import { socketProxyContext, socketUrlContext, -} from "../../contexts/mixins/proxy-context.js"; -import { recordingStateContext } from "../../contexts/mixins/recording-state-context.js"; -import type { TranscribeMessage } from "../../controllers/dictation-controller.js"; -import { KeybindingController } from "../../controllers/keybinding-controller.js"; -import { MediaController } from "../../controllers/media-controller.js"; +} from "../contexts/mixins/proxy-context.js"; +import { recordingStateContext } from "../contexts/mixins/recording-state-context.js"; +import { KeybindingController } from "../controllers/keybinding-controller.js"; +import { MediaController } from "../controllers/media-controller.js"; import type { SocketController, SocketControllerOutboundItem, SocketControllerWebSocket, -} from "../../controllers/socket-controller.js"; -import ButtonStyles from "../../styles/buttons.js"; -import RecordingButtonStyles from "../../styles/recording-button.js"; +} from "../controllers/socket-controller.js"; +import ButtonStyles from "../styles/buttons.js"; +import RecordingButtonStyles from "../styles/recording-button.js"; import type { ProxyOptions, RecordingSocketInboundMessage, RecordingState, -} from "../../types.js"; +} from "../types.js"; import { audioEventEvent, audioLevelChangedEvent, @@ -55,15 +52,21 @@ import { streamClosedEvent, transcriptEvent, usageEvent, -} from "../../utils/events.js"; +} from "../utils/events.js"; -import "../../icons/icons.js"; -import "../internal/speech-audio-visualiser.js"; +import "../icons/icons.js"; +import "./speech-audio-visualiser.js"; export abstract class RecordingButtonBase< TConfig, - TMessage extends RecordingSocketInboundMessage = TranscribeMessage, + TMessage extends + RecordingSocketInboundMessage = RecordingSocketInboundMessage, > extends LitElement { + @state() + _debug_displayAudio?: boolean; + + @state() + _virtualMode?: boolean; protected get _audioLevel(): number { return this.#mediaController.audioLevel; } @@ -107,14 +110,6 @@ export abstract class RecordingButtonBase< @state() _socketProxy?: ProxyOptions; - @consume({ context: debugDisplayAudioContext, subscribe: true }) - @state() - _debug_displayAudio?: boolean; - - @consume({ context: virtualModeContext, subscribe: true }) - @state() - _virtualMode?: boolean; - @consume({ context: pushToTalkKeybindingContext, subscribe: true }) @state() _pushToTalkKeybinding?: string | null; @@ -166,10 +161,14 @@ export abstract class RecordingButtonBase< } #handleWebSocketMessage = (message: TMessage): void => { - switch (message.type) { + const inbound = message as TMessage & Record; + + switch (inbound.type) { case "CONFIG_DENIED": this.dispatchEvent( - errorEvent(`Config denied: ${message.reason ?? "Unknown reason"}`), + errorEvent( + `Config denied: ${String(inbound.reason ?? "Unknown reason")}`, + ), ); this.#handleStop(); break; @@ -178,25 +177,25 @@ export abstract class RecordingButtonBase< this.#handleStop(); break; case "transcript": - this.dispatchEvent(transcriptEvent(message)); + this.dispatchEvent(transcriptEvent(inbound as never)); break; case "command": - this.dispatchEvent(commandEvent(message)); + this.dispatchEvent(commandEvent(inbound as never)); break; case "facts": - this.dispatchEvent(factsEvent(message)); + this.dispatchEvent(factsEvent(inbound as never)); break; case "usage": - this.dispatchEvent(usageEvent(message)); + this.dispatchEvent(usageEvent(inbound as never)); break; case "delta_usage": - this.dispatchEvent(deltaUsageEvent(message)); + this.dispatchEvent(deltaUsageEvent(inbound as never)); break; case "audioEvent": - this.dispatchEvent(audioEventEvent(message)); + this.dispatchEvent(audioEventEvent(inbound as never)); break; case "error": - this.dispatchEvent(errorEvent(message.error)); + this.dispatchEvent(errorEvent(String(inbound.error))); this.#handleStop(); break; case "ended": diff --git a/src/components/base/settings-menu-base.ts b/core/src/components/settings-menu-base.ts similarity index 85% rename from src/components/base/settings-menu-base.ts rename to core/src/components/settings-menu-base.ts index 0986922..8757579 100644 --- a/src/components/base/settings-menu-base.ts +++ b/core/src/components/settings-menu-base.ts @@ -7,14 +7,14 @@ import { type TemplateResult, } from "lit"; import { property, state } from "lit/decorators.js"; -import { recordingStateContext } from "../../contexts/mixins/recording-state-context.js"; -import ButtonStyles from "../../styles/buttons.js"; -import CalloutStyles from "../../styles/callout.js"; -import SettingsMenuStyles from "../../styles/settings-menu.js"; -import type { ConfigurableSettings, RecordingState } from "../../types.js"; -import { commaSeparatedConverter } from "../../utils/converters.js"; +import { recordingStateContext } from "../contexts/mixins/recording-state-context.js"; +import ButtonStyles from "../styles/buttons.js"; +import CalloutStyles from "../styles/callout.js"; +import SettingsMenuStyles from "../styles/settings-menu.js"; +import type { ConfigurableSettings, RecordingState } from "../types.js"; +import { commaSeparatedConverter } from "../utils/converters.js"; -import "../../icons/icons.js"; +import "../icons/icons.js"; export abstract class SettingsMenuBase extends LitElement { protected abstract _renderDeviceSelector( diff --git a/src/components/internal/speech-audio-visualiser.ts b/core/src/components/speech-audio-visualiser.ts similarity index 90% rename from src/components/internal/speech-audio-visualiser.ts rename to core/src/components/speech-audio-visualiser.ts index 0f50a8e..fcb1511 100644 --- a/src/components/internal/speech-audio-visualiser.ts +++ b/core/src/components/speech-audio-visualiser.ts @@ -3,8 +3,8 @@ import { customElement, property } from "lit/decorators.js"; import { classMap } from "lit/directives/class-map.js"; import { map } from "lit/directives/map.js"; import { range } from "lit/directives/range.js"; -import AudioVisualiserStyles from "../../styles/audio-visualiser.js"; -import { normalizeToRange } from "../../utils/validation.js"; +import AudioVisualiserStyles from "../styles/audio-visualiser.js"; +import { normalizeToRange } from "../utils/validation.js"; @customElement("speech-audio-visualiser") export class SpeechAudioVisualiser extends LitElement { diff --git a/src/components/internal/speech-keybinding-input.ts b/core/src/components/speech-keybinding-input.ts similarity index 90% rename from src/components/internal/speech-keybinding-input.ts rename to core/src/components/speech-keybinding-input.ts index 80c1e28..8d7d676 100644 --- a/src/components/internal/speech-keybinding-input.ts +++ b/core/src/components/speech-keybinding-input.ts @@ -4,10 +4,10 @@ import { customElement, property, state } from "lit/decorators.js"; import { pushToTalkKeybindingContext, toggleToTalkKeybindingContext, -} from "../../contexts/mixins/keybindings-context.js"; -import KeybindingSelectorStyles from "../../styles/keybinding-selector.js"; -import { keybindingChangedEvent } from "../../utils/events.js"; -import { normalizeKeybinding } from "../../utils/keybinding.js"; +} from "../contexts/mixins/keybindings-context.js"; +import KeybindingSelectorStyles from "../styles/keybinding-selector.js"; +import { keybindingChangedEvent } from "../utils/events.js"; +import { normalizeKeybinding } from "../utils/keybinding.js"; @customElement("speech-keybinding-input") export class SpeechKeybindingInput extends LitElement { diff --git a/src/constants.ts b/core/src/constants.ts similarity index 62% rename from src/constants.ts rename to core/src/constants.ts index c3842d0..622afe2 100644 --- a/src/constants.ts +++ b/core/src/constants.ts @@ -31,21 +31,6 @@ export const LANGUAGES_SUPPORTED_US: Corti.TranscribeSupportedLanguage[] = [ "pt", "sv", ].sort(); -export const DEFAULT_DICTATION_CONFIG: Corti.TranscribeConfig = { - automaticPunctuation: false, - primaryLanguage: "en", - spokenPunctuation: true, -}; - -export const DEFAULT_STREAM_CONFIG: Corti.StreamConfig = { - mode: { outputLocale: "en", type: "facts" }, - transcription: { - isDiarization: true, - isMultichannel: false, - participants: [], - primaryLanguage: "en", - }, -}; /** * Interval in milliseconds at which MediaRecorder fires dataavailable events. diff --git a/src/contexts/mixins/auth-context.ts b/core/src/contexts/mixins/auth-context.ts similarity index 100% rename from src/contexts/mixins/auth-context.ts rename to core/src/contexts/mixins/auth-context.ts diff --git a/src/contexts/mixins/devices-context.ts b/core/src/contexts/mixins/devices-context.ts similarity index 100% rename from src/contexts/mixins/devices-context.ts rename to core/src/contexts/mixins/devices-context.ts diff --git a/src/contexts/mixins/keybindings-context.ts b/core/src/contexts/mixins/keybindings-context.ts similarity index 100% rename from src/contexts/mixins/keybindings-context.ts rename to core/src/contexts/mixins/keybindings-context.ts diff --git a/src/contexts/mixins/languages-context.ts b/core/src/contexts/mixins/languages-context.ts similarity index 100% rename from src/contexts/mixins/languages-context.ts rename to core/src/contexts/mixins/languages-context.ts diff --git a/src/contexts/mixins/proxy-context.ts b/core/src/contexts/mixins/proxy-context.ts similarity index 100% rename from src/contexts/mixins/proxy-context.ts rename to core/src/contexts/mixins/proxy-context.ts diff --git a/src/contexts/mixins/recording-state-context.ts b/core/src/contexts/mixins/recording-state-context.ts similarity index 100% rename from src/contexts/mixins/recording-state-context.ts rename to core/src/contexts/mixins/recording-state-context.ts diff --git a/src/contexts/mixins/types.ts b/core/src/contexts/mixins/types.ts similarity index 100% rename from src/contexts/mixins/types.ts rename to core/src/contexts/mixins/types.ts diff --git a/src/contexts/root-context.ts b/core/src/contexts/root-context.ts similarity index 100% rename from src/contexts/root-context.ts rename to core/src/contexts/root-context.ts diff --git a/src/controllers/devices-controller.ts b/core/src/controllers/devices-controller.ts similarity index 100% rename from src/controllers/devices-controller.ts rename to core/src/controllers/devices-controller.ts diff --git a/src/controllers/keybinding-controller.ts b/core/src/controllers/keybinding-controller.ts similarity index 100% rename from src/controllers/keybinding-controller.ts rename to core/src/controllers/keybinding-controller.ts diff --git a/src/controllers/languages-controller.ts b/core/src/controllers/languages-controller.ts similarity index 100% rename from src/controllers/languages-controller.ts rename to core/src/controllers/languages-controller.ts diff --git a/src/controllers/media-controller.ts b/core/src/controllers/media-controller.ts similarity index 100% rename from src/controllers/media-controller.ts rename to core/src/controllers/media-controller.ts diff --git a/src/controllers/socket-controller.ts b/core/src/controllers/socket-controller.ts similarity index 100% rename from src/controllers/socket-controller.ts rename to core/src/controllers/socket-controller.ts diff --git a/src/icons/icons.ts b/core/src/icons/icons.ts similarity index 100% rename from src/icons/icons.ts rename to core/src/icons/icons.ts diff --git a/src/icons/index.ts b/core/src/icons/index.ts similarity index 100% rename from src/icons/index.ts rename to core/src/icons/index.ts diff --git a/src/styles/audio-visualiser.ts b/core/src/styles/audio-visualiser.ts similarity index 100% rename from src/styles/audio-visualiser.ts rename to core/src/styles/audio-visualiser.ts diff --git a/src/styles/buttons.ts b/core/src/styles/buttons.ts similarity index 100% rename from src/styles/buttons.ts rename to core/src/styles/buttons.ts diff --git a/src/styles/callout.ts b/core/src/styles/callout.ts similarity index 100% rename from src/styles/callout.ts rename to core/src/styles/callout.ts diff --git a/src/styles/component-styles.ts b/core/src/styles/component-styles.ts similarity index 100% rename from src/styles/component-styles.ts rename to core/src/styles/component-styles.ts diff --git a/src/styles/keybinding-selector.ts b/core/src/styles/keybinding-selector.ts similarity index 100% rename from src/styles/keybinding-selector.ts rename to core/src/styles/keybinding-selector.ts diff --git a/src/styles/recording-button.ts b/core/src/styles/recording-button.ts similarity index 100% rename from src/styles/recording-button.ts rename to core/src/styles/recording-button.ts diff --git a/src/styles/select.ts b/core/src/styles/select.ts similarity index 100% rename from src/styles/select.ts rename to core/src/styles/select.ts diff --git a/src/styles/settings-menu.ts b/core/src/styles/settings-menu.ts similarity index 100% rename from src/styles/settings-menu.ts rename to core/src/styles/settings-menu.ts diff --git a/src/types.ts b/core/src/types.ts similarity index 57% rename from src/types.ts rename to core/src/types.ts index d275a47..7cdc78c 100644 --- a/src/types.ts +++ b/core/src/types.ts @@ -1,9 +1,4 @@ -import type { StreamAmbientMessage } from "./controllers/ambient-controller.js"; -import type { TranscribeMessage } from "./controllers/dictation-controller.js"; - -export type RecordingSocketInboundMessage = - | TranscribeMessage - | StreamAmbientMessage; +export type RecordingSocketInboundMessage = { type: string }; export type RecordingState = | "initializing" diff --git a/src/utils/auth.ts b/core/src/utils/auth.ts similarity index 100% rename from src/utils/auth.ts rename to core/src/utils/auth.ts diff --git a/src/utils/converters.ts b/core/src/utils/converters.ts similarity index 100% rename from src/utils/converters.ts rename to core/src/utils/converters.ts diff --git a/src/utils/devices.ts b/core/src/utils/devices.ts similarity index 100% rename from src/utils/devices.ts rename to core/src/utils/devices.ts diff --git a/src/utils/events.ts b/core/src/utils/events.ts similarity index 100% rename from src/utils/events.ts rename to core/src/utils/events.ts diff --git a/src/utils/keybinding.ts b/core/src/utils/keybinding.ts similarity index 100% rename from src/utils/keybinding.ts rename to core/src/utils/keybinding.ts diff --git a/src/utils/languages.ts b/core/src/utils/languages.ts similarity index 100% rename from src/utils/languages.ts rename to core/src/utils/languages.ts diff --git a/src/utils/media.ts b/core/src/utils/media.ts similarity index 100% rename from src/utils/media.ts rename to core/src/utils/media.ts diff --git a/src/utils/token.ts b/core/src/utils/token.ts similarity index 100% rename from src/utils/token.ts rename to core/src/utils/token.ts diff --git a/src/utils/validation.ts b/core/src/utils/validation.ts similarity index 100% rename from src/utils/validation.ts rename to core/src/utils/validation.ts diff --git a/core/tsconfig.json b/core/tsconfig.json new file mode 100644 index 0000000..6f10e63 --- /dev/null +++ b/core/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../tsconfig.base.json", + "compilerOptions": { + "composite": true, + "rootDir": "src", + "outDir": "dist", + "tsBuildInfoFile": "dist/.tsbuildinfo" + }, + "include": ["src/**/*.ts"] +} diff --git a/package.dictation.json b/dictation/package.json similarity index 92% rename from package.dictation.json rename to dictation/package.json index 63e9d09..2141152 100644 --- a/package.dictation.json +++ b/dictation/package.json @@ -40,5 +40,8 @@ "@corti/sdk": "3.0.0", "@lit/context": "^1.1.6", "lit": "^3.3.1" + }, + "scripts": { + "build": "tsc -b && node ../scripts/build-dictation.mjs" } } diff --git a/src/components/dictation/corti-dictation.ts b/dictation/src/components/corti-dictation.ts similarity index 95% rename from src/components/dictation/corti-dictation.ts rename to dictation/src/components/corti-dictation.ts index 4a609e4..d745439 100644 --- a/src/components/dictation/corti-dictation.ts +++ b/dictation/src/components/corti-dictation.ts @@ -1,14 +1,14 @@ +import { CortiRoot } from "@core/components/corti-root.js"; import type { Corti, CortiAuth } from "@corti/sdk"; import { html, nothing } from "lit"; import { customElement, property, state } from "lit/decorators.js"; import { classMap } from "lit/directives/class-map.js"; import { ref } from "lit/directives/ref.js"; -import { DEFAULT_DICTATION_CONFIG } from "../../constants.js"; -import type { DictationRoot } from "../../contexts/dictation-context.js"; -import { CortiRoot } from "../base/corti-root.js"; +import { DEFAULT_DICTATION_CONFIG } from "../constants.js"; +import type { DictationRoot } from "../contexts/dictation-context.js"; import type { DictationRecordingButton } from "./dictation-recording-button.js"; -import "../../contexts/dictation-context.js"; +import "../contexts/dictation-context.js"; import "./dictation-recording-button.js"; import "./dictation-settings-menu.js"; diff --git a/src/components/dictation/dictation-device-selector.ts b/dictation/src/components/dictation-device-selector.ts similarity index 78% rename from src/components/dictation/dictation-device-selector.ts rename to dictation/src/components/dictation-device-selector.ts index a3aaae6..9cf21f1 100644 --- a/src/components/dictation/dictation-device-selector.ts +++ b/dictation/src/components/dictation-device-selector.ts @@ -1,5 +1,5 @@ +import { DeviceSelectorBase } from "@core/components/device-selector-base.js"; import { customElement } from "lit/decorators.js"; -import { DeviceSelectorBase } from "../base/device-selector-base.js"; @customElement("dictation-device-selector") export class DictationDeviceSelector extends DeviceSelectorBase {} diff --git a/src/components/dictation/dictation-keybinding-selector.ts b/dictation/src/components/dictation-keybinding-selector.ts similarity index 77% rename from src/components/dictation/dictation-keybinding-selector.ts rename to dictation/src/components/dictation-keybinding-selector.ts index f743db2..b57b657 100644 --- a/src/components/dictation/dictation-keybinding-selector.ts +++ b/dictation/src/components/dictation-keybinding-selector.ts @@ -1,5 +1,5 @@ +import { KeybindingSelectorBase } from "@core/components/keybinding-selector-base.js"; import { customElement } from "lit/decorators.js"; -import { KeybindingSelectorBase } from "../base/keybinding-selector-base.js"; @customElement("dictation-keybinding-selector") export class DictationKeybindingSelector extends KeybindingSelectorBase {} diff --git a/src/components/dictation/dictation-language-selector.ts b/dictation/src/components/dictation-language-selector.ts similarity index 77% rename from src/components/dictation/dictation-language-selector.ts rename to dictation/src/components/dictation-language-selector.ts index 3de8707..36de3c5 100644 --- a/src/components/dictation/dictation-language-selector.ts +++ b/dictation/src/components/dictation-language-selector.ts @@ -1,5 +1,5 @@ +import { LanguageSelectorBase } from "@core/components/language-selector-base.js"; import { customElement } from "lit/decorators.js"; -import { LanguageSelectorBase } from "../base/language-selector-base.js"; @customElement("dictation-language-selector") export class DictationLanguageSelector extends LanguageSelectorBase {} diff --git a/src/components/dictation/dictation-recording-button.ts b/dictation/src/components/dictation-recording-button.ts similarity index 65% rename from src/components/dictation/dictation-recording-button.ts rename to dictation/src/components/dictation-recording-button.ts index 15bf0ea..6367a4a 100644 --- a/src/components/dictation/dictation-recording-button.ts +++ b/dictation/src/components/dictation-recording-button.ts @@ -1,19 +1,26 @@ +import { RecordingButtonBase } from "@core/components/recording-button-base.js"; import type { Corti } from "@corti/sdk"; import { consume } from "@lit/context"; import { customElement, state } from "lit/decorators.js"; -import { DEFAULT_DICTATION_CONFIG } from "../../constants.js"; -import { dictationConfigContext } from "../../contexts/dictation-context.js"; +import { DEFAULT_DICTATION_CONFIG } from "../constants.js"; +import { + debugDisplayAudioContext, + dictationConfigContext, +} from "../contexts/dictation-context.js"; import { DictationController, type TranscribeMessage, -} from "../../controllers/dictation-controller.js"; -import { RecordingButtonBase } from "../base/recording-button-base.js"; +} from "../controllers/dictation-controller.js"; @customElement("dictation-recording-button") export class DictationRecordingButton extends RecordingButtonBase< Corti.TranscribeConfig, TranscribeMessage > { + @consume({ context: debugDisplayAudioContext, subscribe: true }) + @state() + override _debug_displayAudio?: boolean; + @consume({ context: dictationConfigContext, subscribe: true }) @state() protected _dictationConfig?: Corti.TranscribeConfig; diff --git a/src/components/dictation/dictation-settings-menu.ts b/dictation/src/components/dictation-settings-menu.ts similarity index 93% rename from src/components/dictation/dictation-settings-menu.ts rename to dictation/src/components/dictation-settings-menu.ts index 3082cdb..0f5ef6c 100644 --- a/src/components/dictation/dictation-settings-menu.ts +++ b/dictation/src/components/dictation-settings-menu.ts @@ -1,7 +1,7 @@ +import { SettingsMenuBase } from "@core/components/settings-menu-base.js"; import type { TemplateResult } from "lit"; import { html } from "lit"; import { customElement } from "lit/decorators.js"; -import { SettingsMenuBase } from "../base/settings-menu-base.js"; import "./dictation-device-selector.js"; import "./dictation-keybinding-selector.js"; diff --git a/dictation/src/constants.ts b/dictation/src/constants.ts new file mode 100644 index 0000000..1a50a49 --- /dev/null +++ b/dictation/src/constants.ts @@ -0,0 +1,7 @@ +import type { Corti } from "@corti/sdk"; + +export const DEFAULT_DICTATION_CONFIG: Corti.TranscribeConfig = { + automaticPunctuation: false, + primaryLanguage: "en", + spokenPunctuation: true, +}; diff --git a/src/contexts/dictation-context.ts b/dictation/src/contexts/dictation-context.ts similarity index 97% rename from src/contexts/dictation-context.ts rename to dictation/src/contexts/dictation-context.ts index 3bc1083..8b40bb9 100644 --- a/src/contexts/dictation-context.ts +++ b/dictation/src/contexts/dictation-context.ts @@ -1,8 +1,8 @@ +import { RootContext } from "@core/contexts/root-context.js"; import type { Corti } from "@corti/sdk"; import { createContext, provide } from "@lit/context"; import type { PropertyValues } from "lit"; import { customElement, property } from "lit/decorators.js"; -import { RootContext } from "./root-context.js"; export const dictationConfigContext = createContext< Corti.TranscribeConfig | undefined diff --git a/src/controllers/dictation-controller.ts b/dictation/src/controllers/dictation-controller.ts similarity index 92% rename from src/controllers/dictation-controller.ts rename to dictation/src/controllers/dictation-controller.ts index 1a7515c..a764480 100644 --- a/src/controllers/dictation-controller.ts +++ b/dictation/src/controllers/dictation-controller.ts @@ -1,10 +1,10 @@ +import { SocketController } from "@core/controllers/socket-controller.js"; +import type { ProxyOptions } from "@core/types.js"; import { type Corti, type CortiClient, CortiWebSocketProxyClient, } from "@corti/sdk"; -import type { ProxyOptions } from "../types.js"; -import { SocketController } from "./socket-controller.js"; type TranscribeSocket = Awaited< ReturnType diff --git a/src/index.ts b/dictation/src/index.ts similarity index 66% rename from src/index.ts rename to dictation/src/index.ts index bcc8a9e..a2d4bae 100644 --- a/src/index.ts +++ b/dictation/src/index.ts @@ -1,19 +1,8 @@ -export { - CortiDictation as default, - CortiDictation, -} from "./components/dictation/corti-dictation.js"; -export { DictationDeviceSelector } from "./components/dictation/dictation-device-selector.js"; -export { DictationKeybindingSelector } from "./components/dictation/dictation-keybinding-selector.js"; -export { DictationLanguageSelector } from "./components/dictation/dictation-language-selector.js"; -export { DictationRecordingButton } from "./components/dictation/dictation-recording-button.js"; -export { DictationSettingsMenu } from "./components/dictation/dictation-settings-menu.js"; -export { DictationRoot } from "./contexts/dictation-context.js"; - export type { ConfigurableSettings, Keybinding, RecordingState, -} from "./types.js"; +} from "@core/types.js"; export type { AudioEventEventDetail, AudioLevelChangedEventDetail, @@ -29,4 +18,14 @@ export type { RecordingStateChangedEventDetail, TranscriptEventDetail, UsageEventDetail, -} from "./utils/events.js"; +} from "@core/utils/events.js"; +export { + CortiDictation as default, + CortiDictation, +} from "./components/corti-dictation.js"; +export { DictationDeviceSelector } from "./components/dictation-device-selector.js"; +export { DictationKeybindingSelector } from "./components/dictation-keybinding-selector.js"; +export { DictationLanguageSelector } from "./components/dictation-language-selector.js"; +export { DictationRecordingButton } from "./components/dictation-recording-button.js"; +export { DictationSettingsMenu } from "./components/dictation-settings-menu.js"; +export { DictationRoot } from "./contexts/dictation-context.js"; diff --git a/dictation/tsconfig.json b/dictation/tsconfig.json new file mode 100644 index 0000000..1cbe28d --- /dev/null +++ b/dictation/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "../tsconfig.base.json", + "compilerOptions": { + "composite": true, + "rootDir": "src", + "outDir": "dist", + "tsBuildInfoFile": "dist/.tsbuildinfo", + "paths": { + "@core/*": ["../core/src/*"] + } + }, + "include": ["src/**/*.ts"], + "references": [{ "path": "../core" }] +} diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 34612a3..0000000 --- a/package-lock.json +++ /dev/null @@ -1,11745 +0,0 @@ -{ - "name": "@corti/dictation-web", - "version": "0.0.0-dev", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@corti/dictation-web", - "version": "0.0.0-dev", - "license": "MIT", - "dependencies": { - "@corti/sdk": "3.0.0", - "@lit/context": "^1.1.6", - "lit": "^3.3.1" - }, - "devDependencies": { - "@biomejs/biome": "^2.3.6", - "@custom-elements-manifest/analyzer": "^0.10.3", - "@open-wc/testing": "^4.0.0", - "@storybook/addon-a11y": "10.1.5", - "@storybook/addon-docs": "^10.1.5", - "@storybook/addon-links": "10.1.5", - "@storybook/web-components": "10.1.5", - "@storybook/web-components-vite": "^10.1.5", - "@types/mocha": "^10.0.7", - "@web/storybook-builder": "^0.1.16", - "@web/storybook-framework-web-components": "^0.1.2", - "@web/test-runner": "^0.18.2", - "concurrently": "^8.2.2", - "esbuild": "^0.25.0", - "husky": "^8.0.0", - "lint-staged": "^15.2.7", - "sinon": "^19.0.2", - "storybook": "10.1.5", - "tslib": "^2.6.3", - "typescript": "^5.5.3" - } - }, - "node_modules/@adobe/css-tools": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz", - "integrity": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", - "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.0" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.2.tgz", - "integrity": "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", - "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@biomejs/biome": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.3.6.tgz", - "integrity": "sha512-oqUhWyU6tae0MFsr/7iLe++QWRg+6jtUhlx9/0GmCWDYFFrK366sBLamNM7D9Y+c7YSynUFKr8lpEp1r6Sk7eA==", - "dev": true, - "license": "MIT OR Apache-2.0", - "bin": { - "biome": "bin/biome" - }, - "engines": { - "node": ">=14.21.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/biome" - }, - "optionalDependencies": { - "@biomejs/cli-darwin-arm64": "2.3.6", - "@biomejs/cli-darwin-x64": "2.3.6", - "@biomejs/cli-linux-arm64": "2.3.6", - "@biomejs/cli-linux-arm64-musl": "2.3.6", - "@biomejs/cli-linux-x64": "2.3.6", - "@biomejs/cli-linux-x64-musl": "2.3.6", - "@biomejs/cli-win32-arm64": "2.3.6", - "@biomejs/cli-win32-x64": "2.3.6" - } - }, - "node_modules/@biomejs/cli-darwin-arm64": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.3.6.tgz", - "integrity": "sha512-P4JWE5d8UayBxYe197QJwyW4ZHp0B+zvRIGCusOm1WbxmlhpAQA1zEqQuunHgSIzvyEEp4TVxiKGXNFZPg7r9Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-darwin-x64": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.3.6.tgz", - "integrity": "sha512-I4rTebj+F/L9K93IU7yTFs8nQ6EhaCOivxduRha4w4WEZK80yoZ8OAdR1F33m4yJ/NfUuTUbP/Wjs+vKjlCoWA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-linux-arm64": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.3.6.tgz", - "integrity": "sha512-JjYy83eVBnvuINZiqyFO7xx72v8Srh4hsgaacSBCjC22DwM6+ZvnX1/fj8/SBiLuUOfZ8YhU2pfq2Dzakeyg1A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-linux-arm64-musl": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.3.6.tgz", - "integrity": "sha512-oK1NpIXIixbJ/4Tcx40cwiieqah6rRUtMGOHDeK2ToT7yUFVEvXUGRKqH0O4hqZ9tW8TcXNZKfgRH6xrsjVtGg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-linux-x64": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.3.6.tgz", - "integrity": "sha512-ZjPXzy5yN9wusIoX+8Zp4p6cL8r0NzJCXg/4r1KLVveIPXd2jKVlqZ6ZyzEq385WwU3OX5KOwQYLQsOc788waQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-linux-x64-musl": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.3.6.tgz", - "integrity": "sha512-QvxB8GHQeaO4FCtwJpJjCgJkbHBbWxRHUxQlod+xeaYE6gtJdSkYkuxdKAQUZEOIsec+PeaDAhW9xjzYbwmOFA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-win32-arm64": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.3.6.tgz", - "integrity": "sha512-YM7hLHpwjdt8R7+O2zS1Vo2cKgqEeptiXB1tWW1rgjN5LlpZovBVKtg7zfwfRrFx3i08aNZThYpTcowpTlczug==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@biomejs/cli-win32-x64": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.3.6.tgz", - "integrity": "sha512-psgNEYgMAobY5h+QHRBVR9xvg2KocFuBKm6axZWB/aD12NWhQjiVFQUjV6wMXhlH4iT0Q9c3yK5JFRiDC/rzHA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.21.3" - } - }, - "node_modules/@corti/sdk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@corti/sdk/-/sdk-3.0.0.tgz", - "integrity": "sha512-MWuhqsU/G8DGARrq8eMfm9GjwsrKvvvKKymeP+WxaV3wGNogWWPBidrtScIabjo64Okv7+79gxArelwUc2X8VQ==", - "license": "MIT", - "dependencies": { - "ws": "^8.16.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@custom-elements-manifest/analyzer": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@custom-elements-manifest/analyzer/-/analyzer-0.10.4.tgz", - "integrity": "sha512-hse8o20Jd82BwWank29/J9OC4PmSTwUoEmll3LEjDF3WLY/Lc8g3TUYSib/3GARCS8Q5myT2RPqEWfRa+6bkIg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@custom-elements-manifest/find-dependencies": "^0.0.5", - "@github/catalyst": "^1.6.0", - "@web/config-loader": "0.1.3", - "chokidar": "3.5.2", - "command-line-args": "5.1.2", - "comment-parser": "1.2.4", - "custom-elements-manifest": "1.0.0", - "debounce": "1.2.1", - "globby": "11.0.4", - "typescript": "~5.4.2" - }, - "bin": { - "cem": "cem.js", - "custom-elements-manifest": "cem.js" - } - }, - "node_modules/@custom-elements-manifest/analyzer/node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/@custom-elements-manifest/find-dependencies": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/@custom-elements-manifest/find-dependencies/-/find-dependencies-0.0.5.tgz", - "integrity": "sha512-fKIMMZCDFSoL2ySUoz8knWgpV4jpb0lUXgLOvdZQMQFHxgxz1PqOJpUIypwvEVyKk3nEHRY4f10gNol02HjeCg==", - "dev": true, - "license": "ISC", - "dependencies": { - "es-module-lexer": "^0.9.3" - } - }, - "node_modules/@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", - "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.8.tgz", - "integrity": "sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.8.tgz", - "integrity": "sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.8.tgz", - "integrity": "sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.8.tgz", - "integrity": "sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.8.tgz", - "integrity": "sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.8.tgz", - "integrity": "sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.8.tgz", - "integrity": "sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.8.tgz", - "integrity": "sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.8.tgz", - "integrity": "sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.8.tgz", - "integrity": "sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.8.tgz", - "integrity": "sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.8.tgz", - "integrity": "sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.8.tgz", - "integrity": "sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.8.tgz", - "integrity": "sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.8.tgz", - "integrity": "sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.8.tgz", - "integrity": "sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.8.tgz", - "integrity": "sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.8.tgz", - "integrity": "sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.8.tgz", - "integrity": "sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.8.tgz", - "integrity": "sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.8.tgz", - "integrity": "sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.8.tgz", - "integrity": "sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.8.tgz", - "integrity": "sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.8.tgz", - "integrity": "sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.8.tgz", - "integrity": "sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.8.tgz", - "integrity": "sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esm-bundle/chai": { - "version": "4.3.4-fix.0", - "resolved": "https://registry.npmjs.org/@esm-bundle/chai/-/chai-4.3.4-fix.0.tgz", - "integrity": "sha512-26SKdM4uvDWlY8/OOOxSB1AqQWeBosCX3wRYUZO7enTAj03CtVxIiCimYVG2WpULcyV51qapK4qTovwkUr5Mlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/chai": "^4.2.12" - } - }, - "node_modules/@github/catalyst": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@github/catalyst/-/catalyst-1.7.0.tgz", - "integrity": "sha512-qOAxrDdRZz9+v4y2WoAfh11rpRY/x4FRofPNmJyZFzAjubtzE3sCa/tAycWWufmQGoYiwwzL/qJBBgyg7avxPw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@hapi/bourne": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-3.0.0.tgz", - "integrity": "sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", - "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.10.tgz", - "integrity": "sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", - "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.29", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", - "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@lit-labs/ssr-dom-shim": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.4.0.tgz", - "integrity": "sha512-ficsEARKnmmW5njugNYKipTm4SFnbik7CXtoencDZzmzo/dQ+2Q0bgkzJuoJP20Aj0F+izzJjOqsnkd6F/o1bw==", - "license": "BSD-3-Clause" - }, - "node_modules/@lit/context": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@lit/context/-/context-1.1.6.tgz", - "integrity": "sha512-M26qDE6UkQbZA2mQ3RjJ3Gzd8TxP+/0obMgE5HfkfLhEEyYE3Bui4A5XHiGPjy0MUGAyxB3QgVuw2ciS0kHn6A==", - "license": "BSD-3-Clause", - "dependencies": { - "@lit/reactive-element": "^1.6.2 || ^2.1.0" - } - }, - "node_modules/@lit/reactive-element": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.1.1.tgz", - "integrity": "sha512-N+dm5PAYdQ8e6UlywyyrgI2t++wFGXfHx+dSJ1oBrg6FAxUj40jId++EaRm80MKX5JnlH1sBsyZ5h0bcZKemCg==", - "license": "BSD-3-Clause", - "dependencies": { - "@lit-labs/ssr-dom-shim": "^1.4.0" - } - }, - "node_modules/@mdx-js/react": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", - "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdx": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@types/react": ">=16", - "react": ">=16" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@open-wc/dedupe-mixin": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@open-wc/dedupe-mixin/-/dedupe-mixin-2.0.1.tgz", - "integrity": "sha512-+R4VxvceUxHAUJXJQipkkoV9fy10vNo+OnUnGKZnVmcwxMl460KLzytnUM4S35SI073R0yZQp9ra0MbPUwVcEA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@open-wc/scoped-elements": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@open-wc/scoped-elements/-/scoped-elements-3.0.6.tgz", - "integrity": "sha512-w1ayJaUUmBw8tALtqQ6cBueld+op+bufujzbrOdH0uCTXnSQkONYZzOH+9jyQ8auVgKLqcxZ8oU6SzfqQhQkPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@open-wc/dedupe-mixin": "^2.0.0", - "lit": "^3.0.0" - } - }, - "node_modules/@open-wc/semantic-dom-diff": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@open-wc/semantic-dom-diff/-/semantic-dom-diff-0.20.1.tgz", - "integrity": "sha512-mPF/RPT2TU7Dw41LEDdaeP6eyTOWBD4z0+AHP4/d0SbgcfJZVRymlIB6DQmtz0fd2CImIS9kszaMmwMt92HBPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/chai": "^4.3.1", - "@web/test-runner-commands": "^0.9.0" - } - }, - "node_modules/@open-wc/testing": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@open-wc/testing/-/testing-4.0.0.tgz", - "integrity": "sha512-KI70O0CJEpBWs3jrTju4BFCy7V/d4tFfYWkg8pMzncsDhD7TYNHLw5cy+s1FHXIgVFetnMDhPpwlKIPvtTQW7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@esm-bundle/chai": "^4.3.4-fix.0", - "@open-wc/semantic-dom-diff": "^0.20.0", - "@open-wc/testing-helpers": "^3.0.0", - "@types/chai-dom": "^1.11.0", - "@types/sinon-chai": "^3.2.3", - "chai-a11y-axe": "^1.5.0" - } - }, - "node_modules/@open-wc/testing-helpers": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@open-wc/testing-helpers/-/testing-helpers-3.0.1.tgz", - "integrity": "sha512-hyNysSatbgT2FNxHJsS3rGKcLEo6+HwDFu1UQL6jcSQUabp/tj3PyX7UnXL3H5YGv0lJArdYLSnvjLnjn3O2fw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@open-wc/scoped-elements": "^3.0.2", - "lit": "^2.0.0 || ^3.0.0", - "lit-html": "^2.0.0 || ^3.0.0" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@puppeteer/browsers": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.3.0.tgz", - "integrity": "sha512-ioXoq9gPxkss4MYhD+SFaU9p1IHFUX0ILAWFPyjGaBdjLsYAlZw6j1iLA0N/m12uVHLFDfSYNF7EQccjinIMDA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "debug": "^4.3.5", - "extract-zip": "^2.0.1", - "progress": "^2.0.3", - "proxy-agent": "^6.4.0", - "semver": "^7.6.3", - "tar-fs": "^3.0.6", - "unbzip2-stream": "^1.4.3", - "yargs": "^17.7.2" - }, - "bin": { - "browsers": "lib/cjs/main-cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@puppeteer/browsers/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "15.3.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz", - "integrity": "sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "@types/resolve": "1.20.2", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.22.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.78.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.2.0.tgz", - "integrity": "sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==", - "dev": true, - "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/pluginutils/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.45.1.tgz", - "integrity": "sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.45.1.tgz", - "integrity": "sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.45.1.tgz", - "integrity": "sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.45.1.tgz", - "integrity": "sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.45.1.tgz", - "integrity": "sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.45.1.tgz", - "integrity": "sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.45.1.tgz", - "integrity": "sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.45.1.tgz", - "integrity": "sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.45.1.tgz", - "integrity": "sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.45.1.tgz", - "integrity": "sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.45.1.tgz", - "integrity": "sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.45.1.tgz", - "integrity": "sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.45.1.tgz", - "integrity": "sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.45.1.tgz", - "integrity": "sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.45.1.tgz", - "integrity": "sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.45.1.tgz", - "integrity": "sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.45.1.tgz", - "integrity": "sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.45.1.tgz", - "integrity": "sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.45.1.tgz", - "integrity": "sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.45.1.tgz", - "integrity": "sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "13.0.5", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", - "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.1" - } - }, - "node_modules/@sinonjs/samsam": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.2.tgz", - "integrity": "sha512-v46t/fwnhejRSFTGqbpn9u+LQ9xJDse10gNnPgAcxgdoCDMXj/G2asWAC/8Qs+BAZDicX+MNZouXT1A7c83kVw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.1", - "lodash.get": "^4.4.2", - "type-detect": "^4.1.0" - } - }, - "node_modules/@sinonjs/samsam/node_modules/type-detect": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", - "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz", - "integrity": "sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==", - "dev": true, - "license": "(Unlicense OR Apache-2.0)" - }, - "node_modules/@storybook/addon-a11y": { - "version": "10.1.5", - "resolved": "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-10.1.5.tgz", - "integrity": "sha512-dMUrkuQyvDfD6SdvV7F7cbjRrhHN0kqCNhRfg1i1IJuLuck6kiALpx8176KhWBcAkN/0J/1V75n7+F9YU/JlPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/global": "^5.0.0", - "axe-core": "^4.2.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^10.1.5" - } - }, - "node_modules/@storybook/addon-docs": { - "version": "10.1.5", - "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-10.1.5.tgz", - "integrity": "sha512-2FfqFrfEeaKv8OerZCWt1b+dm7N/nizv1G2CnTZfWJ0TKxbPDH6kffAqC9lMnT3xAZjDWiBLdnVx2oouKdmSvw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@mdx-js/react": "^3.0.0", - "@storybook/csf-plugin": "10.1.5", - "@storybook/icons": "^2.0.0", - "@storybook/react-dom-shim": "10.1.5", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^10.1.5" - } - }, - "node_modules/@storybook/addon-links": { - "version": "10.1.5", - "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-10.1.5.tgz", - "integrity": "sha512-a1uXpNgIZg6U2v3+431RNFCLvcuNPT2kQjFEKNAVLyNe4Krig/yR3HabGoxKHINLrtBzn/rE9yNeDhMKYfvVnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/global": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "storybook": "^10.1.5" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - } - } - }, - "node_modules/@storybook/builder-vite": { - "version": "10.1.5", - "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-10.1.5.tgz", - "integrity": "sha512-5alpNa+TQXK1zp9MeovUK/yIUkZqpIFUScUer6cYgidI96Boovn7OXt5oXQ8CqqpzuEtgCvz44TzCmgZoGv41g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/csf-plugin": "10.1.5", - "@vitest/mocker": "3.2.4", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^10.1.5", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0" - } - }, - "node_modules/@storybook/channels": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.20.tgz", - "integrity": "sha512-4hkgPSH6bJclB2OvLnkZOGZW1WptJs09mhQ6j6qLjgBZzL/ZdD6priWSd7iXrmPiN5TzUobkG4P4Dp7FjkiO7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/client-logger": "7.6.20", - "@storybook/core-events": "7.6.20", - "@storybook/global": "^5.0.0", - "qs": "^6.10.0", - "telejson": "^7.2.0", - "tiny-invariant": "^1.3.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/client-logger": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.20.tgz", - "integrity": "sha512-NwG0VIJQCmKrSaN5GBDFyQgTAHLNishUPLW1NrzqTDNAhfZUoef64rPQlinbopa0H4OXmlB+QxbQIb3ubeXmSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/global": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/core-client": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-7.6.20.tgz", - "integrity": "sha512-upQuQQinLmlOPKcT8yqXNtwIucZ4E4qegYZXH5HXRWoLAL6GQtW7sUVSIuFogdki8OXRncr/dz8OA+5yQyYS4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/client-logger": "7.6.20", - "@storybook/preview-api": "7.6.20" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/core-client/node_modules/@storybook/preview-api": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.20.tgz", - "integrity": "sha512-3ic2m9LDZEPwZk02wIhNc3n3rNvbi7VDKn52hDXfAxnL5EYm7yDICAkaWcVaTfblru2zn0EDJt7ROpthscTW5w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/channels": "7.6.20", - "@storybook/client-logger": "7.6.20", - "@storybook/core-events": "7.6.20", - "@storybook/csf": "^0.1.2", - "@storybook/global": "^5.0.0", - "@storybook/types": "7.6.20", - "@types/qs": "^6.9.5", - "dequal": "^2.0.2", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3", - "qs": "^6.10.0", - "synchronous-promise": "^2.0.15", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/core-common": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.6.20.tgz", - "integrity": "sha512-8H1zPWPjcmeD4HbDm4FDD0WLsfAKGVr566IZ4hG+h3iWVW57II9JW9MLBtiR2LPSd8u7o0kw64lwRGmtCO1qAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/core-events": "7.6.20", - "@storybook/node-logger": "7.6.20", - "@storybook/types": "7.6.20", - "@types/find-cache-dir": "^3.2.1", - "@types/node": "^18.0.0", - "@types/node-fetch": "^2.6.4", - "@types/pretty-hrtime": "^1.0.0", - "chalk": "^4.1.0", - "esbuild": "^0.18.0", - "esbuild-register": "^3.5.0", - "file-system-cache": "2.3.0", - "find-cache-dir": "^3.0.0", - "find-up": "^5.0.0", - "fs-extra": "^11.1.0", - "glob": "^10.0.0", - "handlebars": "^4.7.7", - "lazy-universal-dotenv": "^4.0.0", - "node-fetch": "^2.0.0", - "picomatch": "^2.3.0", - "pkg-dir": "^5.0.0", - "pretty-hrtime": "^1.0.3", - "resolve-from": "^5.0.0", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@types/node": { - "version": "18.19.120", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.120.tgz", - "integrity": "sha512-WtCGHFXnVI8WHLxDAt5TbnCM4eSE+nI0QN2NJtwzcgMhht2eNz6V9evJrk+lwC8bCY8OWV5Ym8Jz7ZEyGnKnMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@storybook/core-common/node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, - "node_modules/@storybook/core-common/node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@storybook/core-events": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.20.tgz", - "integrity": "sha512-tlVDuVbDiNkvPDFAu+0ou3xBBYbx9zUURQz4G9fAq0ScgBOs/bpzcRrFb4mLpemUViBAd47tfZKdH4MAX45KVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/csf": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.13.tgz", - "integrity": "sha512-7xOOwCLGB3ebM87eemep89MYRFTko+D8qE7EdAAq74lgdqRR5cOUtYWJLjO2dLtP94nqoOdHJo6MdLLKzg412Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^2.19.0" - } - }, - "node_modules/@storybook/csf-plugin": { - "version": "10.1.5", - "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-10.1.5.tgz", - "integrity": "sha512-v+D7PVRkNUHznfoQg8yqpLWZIIbPddqHDSi1oBGdegF0Kv/lVsGqTZGRLroApsMu7BLwLhpcMID6ofxlfftWKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "unplugin": "^2.3.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "esbuild": "*", - "rollup": "*", - "storybook": "^10.1.5", - "vite": "*", - "webpack": "*" - }, - "peerDependenciesMeta": { - "esbuild": { - "optional": true - }, - "rollup": { - "optional": true - }, - "vite": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/@storybook/docs-tools": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-7.6.20.tgz", - "integrity": "sha512-Bw2CcCKQ5xGLQgtexQsI1EGT6y5epoFzOINi0FSTGJ9Wm738nRp5LH3dLk1GZLlywIXcYwOEThb2pM+pZeRQxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/core-common": "7.6.20", - "@storybook/preview-api": "7.6.20", - "@storybook/types": "7.6.20", - "@types/doctrine": "^0.0.3", - "assert": "^2.1.0", - "doctrine": "^3.0.0", - "lodash": "^4.17.21" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/docs-tools/node_modules/@storybook/preview-api": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.20.tgz", - "integrity": "sha512-3ic2m9LDZEPwZk02wIhNc3n3rNvbi7VDKn52hDXfAxnL5EYm7yDICAkaWcVaTfblru2zn0EDJt7ROpthscTW5w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/channels": "7.6.20", - "@storybook/client-logger": "7.6.20", - "@storybook/core-events": "7.6.20", - "@storybook/csf": "^0.1.2", - "@storybook/global": "^5.0.0", - "@storybook/types": "7.6.20", - "@types/qs": "^6.9.5", - "dequal": "^2.0.2", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3", - "qs": "^6.10.0", - "synchronous-promise": "^2.0.15", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/global": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@storybook/global/-/global-5.0.0.tgz", - "integrity": "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@storybook/icons": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-2.0.1.tgz", - "integrity": "sha512-/smVjw88yK3CKsiuR71vNgWQ9+NuY2L+e8X7IMrFjexjm6ZR8ULrV2DRkTA61aV6ryefslzHEGDInGpnNeIocg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/@storybook/mdx2-csf": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@storybook/mdx2-csf/-/mdx2-csf-1.1.0.tgz", - "integrity": "sha512-TXJJd5RAKakWx4BtpwvSNdgTDkKM6RkXU8GK34S/LhidQ5Pjz3wcnqb0TxEkfhK/ztbP8nKHqXFwLfa2CYkvQw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@storybook/node-logger": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.6.20.tgz", - "integrity": "sha512-l2i4qF1bscJkOplNffcRTsgQWYR7J51ewmizj5YrTM8BK6rslWT1RntgVJWB1RgPqvx6VsCz1gyP3yW1oKxvYw==", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/preview": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/preview/-/preview-7.6.20.tgz", - "integrity": "sha512-cxYlZ5uKbCYMHoFpgleZqqGWEnqHrk5m5fT8bYSsDsdQ+X5wPcwI/V+v8dxYAdQcMphZVIlTjo6Dno9WG8qmVA==", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/react-dom-shim": { - "version": "10.1.5", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-10.1.5.tgz", - "integrity": "sha512-CsXcq26wINUgYP8KnfSuS60B10/Ag34YdcnWIEl9hM5UtTQ65WYJ9fVFqpzfnQrkpgRMd7iQjtmUhCe+4umnHg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "storybook": "^10.1.5" - } - }, - "node_modules/@storybook/router": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.6.20.tgz", - "integrity": "sha512-mCzsWe6GrH47Xb1++foL98Zdek7uM5GhaSlrI7blWVohGa0qIUYbfJngqR4ZsrXmJeeEvqowobh+jlxg3IJh+w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/client-logger": "7.6.20", - "memoizerific": "^1.11.3", - "qs": "^6.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/types": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.6.20.tgz", - "integrity": "sha512-GncdY3x0LpbhmUAAJwXYtJDUQEwfF175gsjH0/fxPkxPoV7Sef9TM41jQLJW/5+6TnZoCZP/+aJZTJtq3ni23Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/channels": "7.6.20", - "@types/babel__core": "^7.0.0", - "@types/express": "^4.7.0", - "file-system-cache": "2.3.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/web-components": { - "version": "10.1.5", - "resolved": "https://registry.npmjs.org/@storybook/web-components/-/web-components-10.1.5.tgz", - "integrity": "sha512-Lw+dYaNHx4zx7I1XeiwVDXIv2fu10VKBb2Bny2lRUMf7WOowFMiGKozIgZ678a6v/MTh4VWCd1r48fNfNkC0oA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/global": "^5.0.0", - "tiny-invariant": "^1.3.1", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "lit": "^2.0.0 || ^3.0.0", - "storybook": "^10.1.5" - } - }, - "node_modules/@storybook/web-components-vite": { - "version": "10.1.5", - "resolved": "https://registry.npmjs.org/@storybook/web-components-vite/-/web-components-vite-10.1.5.tgz", - "integrity": "sha512-d7UXuKoRsusd4pZ5gQGE4qnoPw6SrWOz1G9QelD7f1MjRhmWrlZ/FnCvzcXIEKI5VJ2nPXqcJkTkqrqa0CTSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/builder-vite": "10.1.5", - "@storybook/web-components": "10.1.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^10.1.5" - } - }, - "node_modules/@testing-library/dom": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", - "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.3.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "picocolors": "1.1.1", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@testing-library/jest-dom": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", - "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@adobe/css-tools": "^4.4.0", - "aria-query": "^5.0.0", - "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.6.3", - "picocolors": "^1.1.1", - "redent": "^3.0.0" - }, - "engines": { - "node": ">=14", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", - "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@testing-library/user-event": { - "version": "14.6.1", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", - "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12", - "npm": ">=6" - }, - "peerDependencies": { - "@testing-library/dom": ">=7.21.4" - } - }, - "node_modules/@tootallnate/quickjs-emscripten": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/aria-query": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@types/babel__code-frame": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@types/babel__code-frame/-/babel__code-frame-7.0.6.tgz", - "integrity": "sha512-Anitqkl3+KrzcW2k77lRlg/GfLZLWXBuNgbEcIOU6M92yw42vsd3xV/Z/yAHEj8m+KUjL6bWOVOFqX8PFPJ4LA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", - "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", - "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/chai": { - "version": "4.3.20", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.20.tgz", - "integrity": "sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/chai-dom": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/@types/chai-dom/-/chai-dom-1.11.3.tgz", - "integrity": "sha512-EUEZI7uID4ewzxnU7DJXtyvykhQuwe+etJ1wwOiJyQRTH/ifMWKX+ghiXkxCUvNJ6IQDodf0JXhuP6zZcy2qXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/chai": "*" - } - }, - "node_modules/@types/co-body": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@types/co-body/-/co-body-6.1.3.tgz", - "integrity": "sha512-UhuhrQ5hclX6UJctv5m4Rfp52AfG9o9+d9/HwjxhVB5NjXxr5t9oKgJxN8xRHgr35oo8meUEHUPFWiKg6y71aA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*" - } - }, - "node_modules/@types/command-line-args": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/command-line-args/-/command-line-args-5.2.3.tgz", - "integrity": "sha512-uv0aG6R0Y8WHZLTamZwtfsDLVRnOa+n+n5rEvFWL5Na5gZ8V2Teab/duDPFzIIIhs9qizDpcavCusCLJZu62Kw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/content-disposition": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.9.tgz", - "integrity": "sha512-8uYXI3Gw35MhiVYhG3s295oihrxRyytcRHjSjqnqZVDDy/xcGBRny7+Xj1Wgfhv5QzRtN2hB2dVRBUX9XW3UcQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/convert-source-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/convert-source-map/-/convert-source-map-2.0.3.tgz", - "integrity": "sha512-ag0BfJLZf6CQz8VIuRIEYQ5Ggwk/82uvTQf27RcpyDNbY0Vw49LIPqAxk5tqYfrCs9xDaIMvl4aj7ZopnYL8bA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/cookies": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.9.1.tgz", - "integrity": "sha512-E/DPgzifH4sM1UMadJMWd6mO2jOd4g1Ejwzx8/uRCDpJis1IrlyQEcGAYEomtAqRYmD5ORbNXMeI9U0RiVGZbg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/express": "*", - "@types/keygrip": "*", - "@types/node": "*" - } - }, - "node_modules/@types/debounce": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/debounce/-/debounce-1.2.4.tgz", - "integrity": "sha512-jBqiORIzKDOToaF63Fm//haOCHuwQuLa2202RK4MozpA6lh93eCBc+/8+wZn5OzjJt3ySdc+74SXWXB55Ewtyw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/deep-eql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/doctrine": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz", - "integrity": "sha512-w5jZ0ee+HaPOaX25X2/2oGR/7rgAQSYII7X7pp0m9KgBfMP7uKfMfTvcpl5Dj+eDBbpxKGiqE+flqDr6XTd2RA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/express": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz", - "integrity": "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.19.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", - "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/find-cache-dir": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@types/find-cache-dir/-/find-cache-dir-3.2.1.tgz", - "integrity": "sha512-frsJrz2t/CeGifcu/6uRo4b+SzAwT4NYCVPu1GN8IB9XTzrpPkGuV0tmh9mN+/L0PklAlsC3u5Fxt0ju00LXIw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/http-assert": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.6.tgz", - "integrity": "sha512-TTEwmtjgVbYAzZYWyeHPrrtWnfVkm8tQkP8P21uQifPgMRgjrow3XDEYqucuC8SKZJT7pUnhU/JymvjggxO9vw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/http-errors": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", - "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/keygrip": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.6.tgz", - "integrity": "sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/koa": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.15.0.tgz", - "integrity": "sha512-7QFsywoE5URbuVnG3loe03QXuGajrnotr3gQkXcEBShORai23MePfFYdhz90FEtBBpkyIYQbVD+evKtloCgX3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/accepts": "*", - "@types/content-disposition": "*", - "@types/cookies": "*", - "@types/http-assert": "*", - "@types/http-errors": "*", - "@types/keygrip": "*", - "@types/koa-compose": "*", - "@types/node": "*" - } - }, - "node_modules/@types/koa-compose": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.8.tgz", - "integrity": "sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/koa": "*" - } - }, - "node_modules/@types/mdx": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", - "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/mocha": { - "version": "10.0.10", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz", - "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "24.1.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.1.0.tgz", - "integrity": "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~7.8.0" - } - }, - "node_modules/@types/node-fetch": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz", - "integrity": "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "form-data": "^4.0.0" - } - }, - "node_modules/@types/parse5": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", - "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha512-nj39q0wAIdhwn7DGUyT9irmsKK1tV0bd5WFEhgpqNTMFZ8cE+jieuTphCW0tfdm47S2zVT5mr09B28b1chmQMA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz", - "integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "csstype": "^3.2.2" - } - }, - "node_modules/@types/resolve": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", - "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/send": { - "version": "0.17.5", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", - "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.8", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz", - "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" - } - }, - "node_modules/@types/sinon": { - "version": "17.0.4", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-17.0.4.tgz", - "integrity": "sha512-RHnIrhfPO3+tJT0s7cFaXGZvsL4bbR3/k7z3P312qMS4JaS2Tk+KiwiLx1S0rQ56ERj00u1/BtdyVd0FY+Pdew==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/sinonjs__fake-timers": "*" - } - }, - "node_modules/@types/sinon-chai": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-3.2.12.tgz", - "integrity": "sha512-9y0Gflk3b0+NhQZ/oxGtaAJDvRywCa5sIyaVnounqLvmf93yBF4EgIRspePtkMs3Tr844nCclYMlcCNmLCvjuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/chai": "*", - "@types/sinon": "*" - } - }, - "node_modules/@types/sinonjs__fake-timers": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.5.tgz", - "integrity": "sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "license": "MIT" - }, - "node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/ws": { - "version": "7.4.7", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", - "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yauzl": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@vitest/expect": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", - "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/chai": "^5.2.2", - "@vitest/spy": "3.2.4", - "@vitest/utils": "3.2.4", - "chai": "^5.2.0", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/expect/node_modules/@types/chai": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/deep-eql": "*", - "assertion-error": "^2.0.1" - } - }, - "node_modules/@vitest/mocker": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", - "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "3.2.4", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.17" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@vitest/mocker/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/@vitest/pretty-format": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", - "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", - "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyspy": "^4.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", - "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "3.2.4", - "loupe": "^3.1.4", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@web/browser-logs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@web/browser-logs/-/browser-logs-0.4.1.tgz", - "integrity": "sha512-ypmMG+72ERm+LvP+loj9A64MTXvWMXHUOu773cPO4L1SV/VWg6xA9Pv7vkvkXQX+ItJtCJt+KQ+U6ui2HhSFUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "errorstacks": "^2.4.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web/config-loader": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@web/config-loader/-/config-loader-0.1.3.tgz", - "integrity": "sha512-XVKH79pk4d3EHRhofete8eAnqto1e8mCRAqPV00KLNFzCWSe8sWmLnqKCqkPNARC6nksMaGrATnA5sPDRllMpQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.3.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@web/config-loader/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@web/dev-server": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/@web/dev-server/-/dev-server-0.4.6.tgz", - "integrity": "sha512-jj/1bcElAy5EZet8m2CcUdzxT+CRvUjIXGh8Lt7vxtthkN9PzY9wlhWx/9WOs5iwlnG1oj0VGo6f/zvbPO0s9w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.12.11", - "@types/command-line-args": "^5.0.0", - "@web/config-loader": "^0.3.0", - "@web/dev-server-core": "^0.7.2", - "@web/dev-server-rollup": "^0.6.1", - "camelcase": "^6.2.0", - "command-line-args": "^5.1.1", - "command-line-usage": "^7.0.1", - "debounce": "^1.2.0", - "deepmerge": "^4.2.2", - "internal-ip": "^6.2.0", - "nanocolors": "^0.2.1", - "open": "^8.0.2", - "portfinder": "^1.0.32" - }, - "bin": { - "wds": "dist/bin.js", - "web-dev-server": "dist/bin.js" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web/dev-server-core": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@web/dev-server-core/-/dev-server-core-0.7.5.tgz", - "integrity": "sha512-Da65zsiN6iZPMRuj4Oa6YPwvsmZmo5gtPWhW2lx3GTUf5CAEapjVpZVlUXnKPL7M7zRuk72jSsIl8lo+XpTCtw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/koa": "^2.11.6", - "@types/ws": "^7.4.0", - "@web/parse5-utils": "^2.1.0", - "chokidar": "^4.0.1", - "clone": "^2.1.2", - "es-module-lexer": "^1.0.0", - "get-stream": "^6.0.0", - "is-stream": "^2.0.0", - "isbinaryfile": "^5.0.0", - "koa": "^2.13.0", - "koa-etag": "^4.0.0", - "koa-send": "^5.0.1", - "koa-static": "^5.0.0", - "lru-cache": "^8.0.4", - "mime-types": "^2.1.27", - "parse5": "^6.0.1", - "picomatch": "^2.2.2", - "ws": "^7.5.10" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web/dev-server-core/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@web/dev-server-core/node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@web/dev-server-core/node_modules/lru-cache": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz", - "integrity": "sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16.14" - } - }, - "node_modules/@web/dev-server-core/node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@web/dev-server-core/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@web/dev-server-rollup": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@web/dev-server-rollup/-/dev-server-rollup-0.6.4.tgz", - "integrity": "sha512-sJZfTGCCrdku5xYnQQG51odGI092hKY9YFM0X3Z0tRY3iXKXcYRaLZrErw5KfCxr6g0JRuhe4BBhqXTA5Q2I3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/plugin-node-resolve": "^15.0.1", - "@web/dev-server-core": "^0.7.2", - "nanocolors": "^0.2.1", - "parse5": "^6.0.1", - "rollup": "^4.4.0", - "whatwg-url": "^14.0.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web/dev-server/node_modules/@web/config-loader": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@web/config-loader/-/config-loader-0.3.3.tgz", - "integrity": "sha512-ilzeQzrPpPLWZhzFCV+4doxKDGm7oKVfdKpW9wiUNVgive34NSzCw+WzXTvjE4Jgr5CkyTDIObEmMrqQEjhT0g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web/parse5-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@web/parse5-utils/-/parse5-utils-2.1.0.tgz", - "integrity": "sha512-GzfK5disEJ6wEjoPwx8AVNwUe9gYIiwc+x//QYxYDAFKUp4Xb1OJAGLc2l2gVrSQmtPGLKrTRcW90Hv4pEq1qA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/parse5": "^6.0.1", - "parse5": "^6.0.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web/rollup-plugin-html": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@web/rollup-plugin-html/-/rollup-plugin-html-2.3.0.tgz", - "integrity": "sha512-ap4AisBacK6WwrTnVlPErupxlywWU1ELsjGIMZ4VpofvhbVTBIGErJo5VEj2mSJyEH3I1EbzUcWuhDCePrnWEw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@web/parse5-utils": "^2.1.0", - "glob": "^10.0.0", - "html-minifier-terser": "^7.1.0", - "lightningcss": "^1.24.0", - "parse5": "^6.0.1", - "picomatch": "^2.2.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web/storybook-builder": { - "version": "0.1.21", - "resolved": "https://registry.npmjs.org/@web/storybook-builder/-/storybook-builder-0.1.21.tgz", - "integrity": "sha512-MtS588/rAoJX21koTXAT9YHX+9rffUmdGc6iZlRudO7h7jx9r4T6zcdRNO6Vs7C6HicMqW+O7qynLBmD7XtSYw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/plugin-node-resolve": "^15.1.0", - "@rollup/pluginutils": "^5.0.2", - "@storybook/core-common": "^7.0.0", - "@storybook/mdx2-csf": "^1.0.0", - "@storybook/node-logger": "^7.0.0", - "@storybook/preview": "^7.0.0", - "@web/config-loader": "^0.3.2", - "@web/dev-server": "^0.4.0", - "@web/dev-server-core": "^0.7.5", - "@web/dev-server-rollup": "^0.6.1", - "@web/rollup-plugin-html": "^2.3.0", - "browser-assert": "^1.2.1", - "cjs-module-lexer": "^1.2.3", - "es-module-lexer": "^1.2.1", - "esbuild": "^0.24.0", - "express": "^4.21.2", - "fs-extra": "^11.1.1", - "glob-promise": "^6.0.3", - "lodash-es": "^4.17.21", - "path-browserify": "^1.0.1", - "remark-external-links": "^8.0.0", - "remark-slug": "^6.0.0", - "rollup": "^4.4.1", - "rollup-plugin-external-globals": "^0.9.0", - "slash": "^5.1.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@web/storybook-builder/node_modules/@esbuild/aix-ppc64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", - "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@web/storybook-builder/node_modules/@esbuild/android-arm": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", - "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@web/storybook-builder/node_modules/@esbuild/android-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", - "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@web/storybook-builder/node_modules/@esbuild/android-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", - "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@web/storybook-builder/node_modules/@esbuild/darwin-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", - "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@web/storybook-builder/node_modules/@esbuild/darwin-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", - "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@web/storybook-builder/node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", - "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@web/storybook-builder/node_modules/@esbuild/freebsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", - "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@web/storybook-builder/node_modules/@esbuild/linux-arm": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", - "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@web/storybook-builder/node_modules/@esbuild/linux-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", - "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@web/storybook-builder/node_modules/@esbuild/linux-ia32": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", - "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@web/storybook-builder/node_modules/@esbuild/linux-loong64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", - "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@web/storybook-builder/node_modules/@esbuild/linux-mips64el": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", - "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@web/storybook-builder/node_modules/@esbuild/linux-ppc64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", - "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@web/storybook-builder/node_modules/@esbuild/linux-riscv64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", - "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@web/storybook-builder/node_modules/@esbuild/linux-s390x": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", - "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@web/storybook-builder/node_modules/@esbuild/linux-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", - "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@web/storybook-builder/node_modules/@esbuild/netbsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", - "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@web/storybook-builder/node_modules/@esbuild/netbsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", - "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@web/storybook-builder/node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", - "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@web/storybook-builder/node_modules/@esbuild/openbsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", - "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@web/storybook-builder/node_modules/@esbuild/sunos-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", - "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@web/storybook-builder/node_modules/@esbuild/win32-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", - "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@web/storybook-builder/node_modules/@esbuild/win32-ia32": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", - "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@web/storybook-builder/node_modules/@esbuild/win32-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", - "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@web/storybook-builder/node_modules/@web/config-loader": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@web/config-loader/-/config-loader-0.3.3.tgz", - "integrity": "sha512-ilzeQzrPpPLWZhzFCV+4doxKDGm7oKVfdKpW9wiUNVgive34NSzCw+WzXTvjE4Jgr5CkyTDIObEmMrqQEjhT0g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web/storybook-builder/node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@web/storybook-builder/node_modules/esbuild": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", - "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.2", - "@esbuild/android-arm": "0.24.2", - "@esbuild/android-arm64": "0.24.2", - "@esbuild/android-x64": "0.24.2", - "@esbuild/darwin-arm64": "0.24.2", - "@esbuild/darwin-x64": "0.24.2", - "@esbuild/freebsd-arm64": "0.24.2", - "@esbuild/freebsd-x64": "0.24.2", - "@esbuild/linux-arm": "0.24.2", - "@esbuild/linux-arm64": "0.24.2", - "@esbuild/linux-ia32": "0.24.2", - "@esbuild/linux-loong64": "0.24.2", - "@esbuild/linux-mips64el": "0.24.2", - "@esbuild/linux-ppc64": "0.24.2", - "@esbuild/linux-riscv64": "0.24.2", - "@esbuild/linux-s390x": "0.24.2", - "@esbuild/linux-x64": "0.24.2", - "@esbuild/netbsd-arm64": "0.24.2", - "@esbuild/netbsd-x64": "0.24.2", - "@esbuild/openbsd-arm64": "0.24.2", - "@esbuild/openbsd-x64": "0.24.2", - "@esbuild/sunos-x64": "0.24.2", - "@esbuild/win32-arm64": "0.24.2", - "@esbuild/win32-ia32": "0.24.2", - "@esbuild/win32-x64": "0.24.2" - } - }, - "node_modules/@web/storybook-builder/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@web/storybook-builder/node_modules/glob-promise": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-6.0.7.tgz", - "integrity": "sha512-DEAe6br1w8ZF+y6KM2pzgdfhpreladtNvyNNVgSkxxkFWzXTJFXxQrJQQbAnc7kL0EUd7w5cR8u4K0P4+/q+Gw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "type": "individual", - "url": "https://github.com/sponsors/ahmadnassri" - }, - "peerDependencies": { - "glob": "^8.0.3" - } - }, - "node_modules/@web/storybook-builder/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@web/storybook-builder/node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@web/storybook-framework-web-components": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@web/storybook-framework-web-components/-/storybook-framework-web-components-0.1.3.tgz", - "integrity": "sha512-+00SM6eq90v4hFs4AEE+6VuSZzj6/EduOzb4N+IL1KyvyhyMf8c8StDM0YzyGmixO11vlL3puy686pfKy4MuLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/web-components": "^7.0.0", - "@web/storybook-builder": "^0.1.17" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@web/storybook-framework-web-components/node_modules/@storybook/manager-api": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.6.20.tgz", - "integrity": "sha512-gOB3m8hO3gBs9cBoN57T7jU0wNKDh+hi06gLcyd2awARQlAlywnLnr3s1WH5knih6Aq+OpvGBRVKkGLOkaouCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/channels": "7.6.20", - "@storybook/client-logger": "7.6.20", - "@storybook/core-events": "7.6.20", - "@storybook/csf": "^0.1.2", - "@storybook/global": "^5.0.0", - "@storybook/router": "7.6.20", - "@storybook/theming": "7.6.20", - "@storybook/types": "7.6.20", - "dequal": "^2.0.2", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3", - "store2": "^2.14.2", - "telejson": "^7.2.0", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@web/storybook-framework-web-components/node_modules/@storybook/preview-api": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.20.tgz", - "integrity": "sha512-3ic2m9LDZEPwZk02wIhNc3n3rNvbi7VDKn52hDXfAxnL5EYm7yDICAkaWcVaTfblru2zn0EDJt7ROpthscTW5w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/channels": "7.6.20", - "@storybook/client-logger": "7.6.20", - "@storybook/core-events": "7.6.20", - "@storybook/csf": "^0.1.2", - "@storybook/global": "^5.0.0", - "@storybook/types": "7.6.20", - "@types/qs": "^6.9.5", - "dequal": "^2.0.2", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3", - "qs": "^6.10.0", - "synchronous-promise": "^2.0.15", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@web/storybook-framework-web-components/node_modules/@storybook/theming": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.6.20.tgz", - "integrity": "sha512-iT1pXHkSkd35JsCte6Qbanmprx5flkqtSHC6Gi6Umqoxlg9IjiLPmpHbaIXzoC06DSW93hPj5Zbi1lPlTvRC7Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@storybook/client-logger": "7.6.20", - "@storybook/global": "^5.0.0", - "memoizerific": "^1.11.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@web/storybook-framework-web-components/node_modules/@storybook/web-components": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/web-components/-/web-components-7.6.20.tgz", - "integrity": "sha512-NPA2yWI246qJQOV1SoSlmUsl+VnUMD7inxWQP1NbgXnq4JT31xIvf61fgN61odCaAoP39nVkEKGETs10vCV2OA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/client-logger": "7.6.20", - "@storybook/core-client": "7.6.20", - "@storybook/docs-tools": "7.6.20", - "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.6.20", - "@storybook/preview-api": "7.6.20", - "@storybook/types": "7.6.20", - "tiny-invariant": "^1.3.1", - "ts-dedent": "^2.0.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "lit": "^2.0.0 || ^3.0.0" - } - }, - "node_modules/@web/storybook-framework-web-components/node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@web/storybook-framework-web-components/node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/@web/storybook-framework-web-components/node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/@web/test-runner": { - "version": "0.18.3", - "resolved": "https://registry.npmjs.org/@web/test-runner/-/test-runner-0.18.3.tgz", - "integrity": "sha512-QkVK8Qguw3Zhyu8SYR7F4VdcjyXBeJNr8W8L++s4zO/Ok7DR/Wu7+rLswn3H7OH3xYoCHRmwteehcFejefz6ew==", - "dev": true, - "license": "MIT", - "dependencies": { - "@web/browser-logs": "^0.4.0", - "@web/config-loader": "^0.3.0", - "@web/dev-server": "^0.4.0", - "@web/test-runner-chrome": "^0.16.0", - "@web/test-runner-commands": "^0.9.0", - "@web/test-runner-core": "^0.13.0", - "@web/test-runner-mocha": "^0.9.0", - "camelcase": "^6.2.0", - "command-line-args": "^5.1.1", - "command-line-usage": "^7.0.1", - "convert-source-map": "^2.0.0", - "diff": "^5.0.0", - "globby": "^11.0.1", - "nanocolors": "^0.2.1", - "portfinder": "^1.0.32", - "source-map": "^0.7.3" - }, - "bin": { - "web-test-runner": "dist/bin.js", - "wtr": "dist/bin.js" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web/test-runner-chrome": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@web/test-runner-chrome/-/test-runner-chrome-0.16.0.tgz", - "integrity": "sha512-Edc6Y49aVB6k18S5IOj9OCX3rEf8F3jptIu0p95+imqxmcutFEh1GNmlAk2bQGnXS0U6uVY7Xbf61fiaXUQqhg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@web/test-runner-core": "^0.13.0", - "@web/test-runner-coverage-v8": "^0.8.0", - "async-mutex": "0.4.0", - "chrome-launcher": "^0.15.0", - "puppeteer-core": "^22.0.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web/test-runner-commands": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@web/test-runner-commands/-/test-runner-commands-0.9.0.tgz", - "integrity": "sha512-zeLI6QdH0jzzJMDV5O42Pd8WLJtYqovgdt0JdytgHc0d1EpzXDsc7NTCJSImboc2NcayIsWAvvGGeRF69SMMYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@web/test-runner-core": "^0.13.0", - "mkdirp": "^1.0.4" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web/test-runner-core": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/@web/test-runner-core/-/test-runner-core-0.13.4.tgz", - "integrity": "sha512-84E1025aUSjvZU1j17eCTwV7m5Zg3cZHErV3+CaJM9JPCesZwLraIa0ONIQ9w4KLgcDgJFw9UnJ0LbFf42h6tg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.12.11", - "@types/babel__code-frame": "^7.0.2", - "@types/co-body": "^6.1.0", - "@types/convert-source-map": "^2.0.0", - "@types/debounce": "^1.2.0", - "@types/istanbul-lib-coverage": "^2.0.3", - "@types/istanbul-reports": "^3.0.0", - "@web/browser-logs": "^0.4.0", - "@web/dev-server-core": "^0.7.3", - "chokidar": "^4.0.1", - "cli-cursor": "^3.1.0", - "co-body": "^6.1.0", - "convert-source-map": "^2.0.0", - "debounce": "^1.2.0", - "dependency-graph": "^0.11.0", - "globby": "^11.0.1", - "internal-ip": "^6.2.0", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-report": "^3.0.1", - "istanbul-reports": "^3.0.2", - "log-update": "^4.0.0", - "nanocolors": "^0.2.1", - "nanoid": "^3.1.25", - "open": "^8.0.2", - "picomatch": "^2.2.2", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web/test-runner-core/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@web/test-runner-core/node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@web/test-runner-coverage-v8": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@web/test-runner-coverage-v8/-/test-runner-coverage-v8-0.8.0.tgz", - "integrity": "sha512-PskiucYpjUtgNfR2zF2AWqWwjXL7H3WW/SnCAYmzUrtob7X9o/+BjdyZ4wKbOxWWSbJO4lEdGIDLu+8X2Xw+lA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@web/test-runner-core": "^0.13.0", - "istanbul-lib-coverage": "^3.0.0", - "lru-cache": "^8.0.4", - "picomatch": "^2.2.2", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web/test-runner-coverage-v8/node_modules/lru-cache": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz", - "integrity": "sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16.14" - } - }, - "node_modules/@web/test-runner-mocha": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@web/test-runner-mocha/-/test-runner-mocha-0.9.0.tgz", - "integrity": "sha512-ZL9F6FXd0DBQvo/h/+mSfzFTSRVxzV9st/AHhpgABtUtV/AIpVE9to6+xdkpu6827kwjezdpuadPfg+PlrBWqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@web/test-runner-core": "^0.13.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web/test-runner/node_modules/@web/config-loader": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@web/config-loader/-/config-loader-0.3.3.tgz", - "integrity": "sha512-ilzeQzrPpPLWZhzFCV+4doxKDGm7oKVfdKpW9wiUNVgive34NSzCw+WzXTvjE4Jgr5CkyTDIObEmMrqQEjhT0g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/app-root-dir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/app-root-dir/-/app-root-dir-1.0.2.tgz", - "integrity": "sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==", - "dev": true, - "license": "MIT" - }, - "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/array-back": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", - "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.17" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/assert": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", - "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "is-nan": "^1.3.2", - "object-is": "^1.1.5", - "object.assign": "^4.1.4", - "util": "^0.12.5" - } - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true, - "license": "MIT" - }, - "node_modules/async-mutex": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.4.0.tgz", - "integrity": "sha512-eJFZ1YhRR8UN8eBLoNzcDPcy/jqjsg6I1AP+KvWQX80BqOSW1oJPJXDylPUEeMr2ZQvHgnQ//Lp6f3RQ1zI7HA==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axe-core": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.3.tgz", - "integrity": "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==", - "dev": true, - "license": "MPL-2.0", - "engines": { - "node": ">=4" - } - }, - "node_modules/b4a": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/bare-events": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.6.0.tgz", - "integrity": "sha512-EKZ5BTXYExaNqi3I3f9RtEsaI/xBSGjE0XZCZilPzFAV/goswFHuPd9jEZlPIZ/iNZJwDSao9qRiScySz7MbQg==", - "dev": true, - "license": "Apache-2.0", - "optional": true - }, - "node_modules/bare-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.6.tgz", - "integrity": "sha512-25RsLF33BqooOEFNdMcEhMpJy8EoR88zSMrnOQOaM3USnOK2VmaJ1uaQEwPA6AQjrv1lXChScosN6CzbwbO9OQ==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-events": "^2.5.4", - "bare-path": "^3.0.0", - "bare-stream": "^2.6.4" - }, - "engines": { - "bare": ">=1.16.0" - }, - "peerDependencies": { - "bare-buffer": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - } - } - }, - "node_modules/bare-os": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz", - "integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "engines": { - "bare": ">=1.14.0" - } - }, - "node_modules/bare-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", - "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-os": "^3.0.1" - } - }, - "node_modules/bare-stream": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.5.tgz", - "integrity": "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "streamx": "^2.21.0" - }, - "peerDependencies": { - "bare-buffer": "*", - "bare-events": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - }, - "bare-events": { - "optional": true - } - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/basic-ftp": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", - "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-assert": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/browser-assert/-/browser-assert-1.2.1.tgz", - "integrity": "sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==", - "dev": true - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cache-content-type": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", - "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "^2.1.18", - "ylru": "^1.2.0" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/chai": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", - "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/chai-a11y-axe": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/chai-a11y-axe/-/chai-a11y-axe-1.5.0.tgz", - "integrity": "sha512-V/Vg/zJDr9aIkaHJ2KQu7lGTQQm5ZOH4u1k5iTMvIXuSVlSuUo0jcSpSqf9wUn9zl6oQXa4e4E0cqH18KOgKlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "axe-core": "^4.3.3" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk-template": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", - "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/chalk-template?sponsor=1" - } - }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" - } - }, - "node_modules/chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chrome-launcher": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", - "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/node": "*", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0" - }, - "bin": { - "print-chrome-path": "bin/print-chrome-path.js" - }, - "engines": { - "node": ">=12.13.0" - } - }, - "node_modules/chromium-bidi": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.6.3.tgz", - "integrity": "sha512-qXlsCmpCZJAnoTYI83Iu6EdYQpMYdVkCfq08KDh2pmlVqK5t5IA9mGs4/LwCwp4fqisSOMXZxP3HIh8w8aRn0A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "mitt": "3.0.1", - "urlpattern-polyfill": "10.0.0", - "zod": "3.23.8" - }, - "peerDependencies": { - "devtools-protocol": "*" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", - "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/clean-css": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", - "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "node_modules/clean-css/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-truncate": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", - "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", - "dev": true, - "license": "MIT", - "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/cli-truncate/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/co-body": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.2.0.tgz", - "integrity": "sha512-Kbpv2Yd1NdL1V/V4cwLVxraHDV6K8ayohr2rmH0J87Er8+zJjcTa6dAn9QMPC9CRgU8+aNajKbSf1TzDB1yKPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@hapi/bourne": "^3.0.0", - "inflation": "^2.0.0", - "qs": "^6.5.2", - "raw-body": "^2.3.3", - "type-is": "^1.6.16" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/command-line-args": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.1.2.tgz", - "integrity": "sha512-fytTsbndLbl+pPWtS0CxLV3BEWw9wJayB8NnU2cbQqVPsNdYezQeT+uIQv009m+GShnMNyuoBrRo8DTmuTfSCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-back": "^6.1.2", - "find-replace": "^3.0.0", - "lodash.camelcase": "^4.3.0", - "typical": "^4.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/command-line-usage": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-7.0.3.tgz", - "integrity": "sha512-PqMLy5+YGwhMh1wS04mVG44oqDsgyLRSKJBdOo1bnYhMKBW65gZF1dRp2OZRhiTjgUHljy99qkO7bsctLaw35Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-back": "^6.2.2", - "chalk-template": "^0.4.0", - "table-layout": "^4.1.0", - "typical": "^7.1.1" - }, - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/command-line-usage/node_modules/typical": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-7.3.0.tgz", - "integrity": "sha512-ya4mg/30vm+DOWfBg4YK3j2WD6TWtRkCbasOJr40CseYENzCUby/7rIvXA99JGsQHeNxLbnXdyLLxKSv3tauFw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.17" - } - }, - "node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/comment-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.2.4.tgz", - "integrity": "sha512-pm0b+qv+CkWNriSTMsfnjChF9kH0kxz55y44Wo5le9qLxMj5xDQAaEd9ZN1ovSuk9CsrncWaFwgpOMg7ClJwkw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true, - "license": "MIT" - }, - "node_modules/concurrently": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", - "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.2", - "date-fns": "^2.30.0", - "lodash": "^4.17.21", - "rxjs": "^7.8.1", - "shell-quote": "^1.8.1", - "spawn-command": "0.0.2", - "supports-color": "^8.1.1", - "tree-kill": "^1.2.2", - "yargs": "^17.7.2" - }, - "bin": { - "conc": "dist/bin/concurrently.js", - "concurrently": "dist/bin/concurrently.js" - }, - "engines": { - "node": "^14.13.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" - } - }, - "node_modules/concurrently/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/cookies": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.9.1.tgz", - "integrity": "sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "keygrip": "~1.1.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", - "dev": true, - "license": "MIT" - }, - "node_modules/csstype": { - "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", - "peer": true - }, - "node_modules/custom-elements-manifest": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/custom-elements-manifest/-/custom-elements-manifest-1.0.0.tgz", - "integrity": "sha512-j59k0ExGCKA8T6Mzaq+7axc+KVHwpEphEERU7VZ99260npu/p/9kd+Db+I3cGKxHkM5y6q5gnlXn00mzRQkX2A==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/data-uri-to-buffer": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", - "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/date-fns": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", - "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.21.0" - }, - "engines": { - "node": ">=0.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" - } - }, - "node_modules/debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", - "dev": true, - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/degenerator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/dependency-graph": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", - "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-libc": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", - "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/devtools-protocol": { - "version": "0.0.1312386", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1312386.tgz", - "integrity": "sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-accessibility-api": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/dotenv": { - "version": "16.6.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", - "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dotenv-expand": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", - "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true, - "license": "MIT" - }, - "node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", - "dev": true, - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/environment": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/errorstacks": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/errorstacks/-/errorstacks-2.4.1.tgz", - "integrity": "sha512-jE4i0SMYevwu/xxAuzhly/KTwtj0xDhbzB6m1xPImxTkw8wcCbgarOQPfCVMi5JKVyW7in29pNJCCJrry3Ynnw==", - "dev": true, - "license": "MIT" - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/esbuild": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.8.tgz", - "integrity": "sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.8", - "@esbuild/android-arm": "0.25.8", - "@esbuild/android-arm64": "0.25.8", - "@esbuild/android-x64": "0.25.8", - "@esbuild/darwin-arm64": "0.25.8", - "@esbuild/darwin-x64": "0.25.8", - "@esbuild/freebsd-arm64": "0.25.8", - "@esbuild/freebsd-x64": "0.25.8", - "@esbuild/linux-arm": "0.25.8", - "@esbuild/linux-arm64": "0.25.8", - "@esbuild/linux-ia32": "0.25.8", - "@esbuild/linux-loong64": "0.25.8", - "@esbuild/linux-mips64el": "0.25.8", - "@esbuild/linux-ppc64": "0.25.8", - "@esbuild/linux-riscv64": "0.25.8", - "@esbuild/linux-s390x": "0.25.8", - "@esbuild/linux-x64": "0.25.8", - "@esbuild/netbsd-arm64": "0.25.8", - "@esbuild/netbsd-x64": "0.25.8", - "@esbuild/openbsd-arm64": "0.25.8", - "@esbuild/openbsd-x64": "0.25.8", - "@esbuild/openharmony-arm64": "0.25.8", - "@esbuild/sunos-x64": "0.25.8", - "@esbuild/win32-arm64": "0.25.8", - "@esbuild/win32-ia32": "0.25.8", - "@esbuild/win32-x64": "0.25.8" - } - }, - "node_modules/esbuild-register": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz", - "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "peerDependencies": { - "esbuild": ">=0.12 <1" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true, - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "dev": true, - "license": "MIT" - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/express/node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true, - "license": "MIT" - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/extract-zip/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/file-system-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/file-system-cache/-/file-system-cache-2.3.0.tgz", - "integrity": "sha512-l4DMNdsIPsVnKrgEXbJwDJsA5mB8rGwHYERMgqQx/xAUtChPJMre1bXBzDEqqVbWv9AIbFezXMxeEkZDSrXUOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fs-extra": "11.1.1", - "ramda": "0.29.0" - } - }, - "node_modules/file-system-cache/node_modules/fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "license": "MIT", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/find-cache-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-cache-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-cache-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-cache-dir/node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-replace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", - "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-back": "^3.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/find-replace/node_modules/array-back": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-extra": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", - "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC", - "peer": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-east-asian-width": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", - "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-uri": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", - "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", - "dev": true, - "license": "MIT", - "dependencies": { - "basic-ftp": "^5.0.2", - "data-uri-to-buffer": "^6.0.2", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/github-slugger": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", - "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==", - "dev": true, - "license": "ISC" - }, - "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==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/handlebars/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" - }, - "node_modules/html-minifier-terser": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", - "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", - "dev": true, - "license": "MIT", - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "~5.3.2", - "commander": "^10.0.0", - "entities": "^4.4.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.15.1" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": "^14.13.1 || >=16.0.0" - } - }, - "node_modules/http-assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", - "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-equal": "~1.0.1", - "http-errors": "~1.8.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-assert/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-assert/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-assert/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/husky": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", - "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", - "dev": true, - "license": "MIT", - "bin": { - "husky": "lib/bin.js" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/typicode" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "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", - "engines": { - "node": ">= 4" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/inflation": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.1.0.tgz", - "integrity": "sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/internal-ip": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-6.2.0.tgz", - "integrity": "sha512-D8WGsR6yDt8uq7vDMu7mjcR+yRMm3dW8yufyChmszWRjcSHuxLBkR3GdS2HZAjodsaGuCvXeEJpueisXJULghg==", - "dev": true, - "license": "MIT", - "dependencies": { - "default-gateway": "^6.0.0", - "ipaddr.js": "^1.9.1", - "is-ip": "^3.1.0", - "p-event": "^4.2.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/internal-ip?sponsor=1" - } - }, - "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/ip-address/node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/ip-regex": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", - "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-absolute-url": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", - "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-arguments": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", - "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-generator-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-ip": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-3.1.0.tgz", - "integrity": "sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ip-regex": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-nan": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", - "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-reference": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", - "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.6" - } - }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isbinaryfile": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.4.tgz", - "integrity": "sha512-YKBKVkKhty7s8rxddb40oOkuP0NbaeXrQvLin6QMHL7Ypiy2RW9LwOVrVgZRyOrhQlayMd9t+D8yDy8MKFTSDQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 18.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report/node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/istanbul-lib-report/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "dev": true, - "license": "MIT" - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/just-extend": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz", - "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==", - "dev": true, - "license": "MIT" - }, - "node_modules/keygrip": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", - "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tsscmp": "1.0.6" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/koa": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.16.1.tgz", - "integrity": "sha512-umfX9d3iuSxTQP4pnzLOz0HKnPg0FaUUIKcye2lOiz3KPu1Y3M3xlz76dISdFPQs37P9eJz1wUpcTS6KDPn9fA==", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "^1.3.5", - "cache-content-type": "^1.0.0", - "content-disposition": "~0.5.2", - "content-type": "^1.0.4", - "cookies": "~0.9.0", - "debug": "^4.3.2", - "delegates": "^1.0.0", - "depd": "^2.0.0", - "destroy": "^1.0.4", - "encodeurl": "^1.0.2", - "escape-html": "^1.0.3", - "fresh": "~0.5.2", - "http-assert": "^1.3.0", - "http-errors": "^1.6.3", - "is-generator-function": "^1.0.7", - "koa-compose": "^4.1.0", - "koa-convert": "^2.0.0", - "on-finished": "^2.3.0", - "only": "~0.0.2", - "parseurl": "^1.3.2", - "statuses": "^1.5.0", - "type-is": "^1.6.16", - "vary": "^1.1.2" - }, - "engines": { - "node": "^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4" - } - }, - "node_modules/koa-compose": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", - "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==", - "dev": true, - "license": "MIT" - }, - "node_modules/koa-convert": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-2.0.0.tgz", - "integrity": "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==", - "dev": true, - "license": "MIT", - "dependencies": { - "co": "^4.6.0", - "koa-compose": "^4.1.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/koa-etag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/koa-etag/-/koa-etag-4.0.0.tgz", - "integrity": "sha512-1cSdezCkBWlyuB9l6c/IFoe1ANCDdPBxkDkRiaIup40xpUub6U/wwRXoKBZw/O5BifX9OlqAjYnDyzM6+l+TAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "etag": "^1.8.1" - } - }, - "node_modules/koa-send": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/koa-send/-/koa-send-5.0.1.tgz", - "integrity": "sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "http-errors": "^1.7.3", - "resolve-path": "^1.4.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/koa-send/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/koa-send/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/koa-send/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/koa-static": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/koa-static/-/koa-static-5.0.0.tgz", - "integrity": "sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.1.0", - "koa-send": "^5.0.0" - }, - "engines": { - "node": ">= 7.6.0" - } - }, - "node_modules/koa-static/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/koa/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/koa/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/koa/node_modules/http-errors/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/koa/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/lazy-universal-dotenv": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/lazy-universal-dotenv/-/lazy-universal-dotenv-4.0.0.tgz", - "integrity": "sha512-aXpZJRnTkpK6gQ/z4nk+ZBLd/Qdp118cvPruLSIQzQNRhKwEcdXCOzXuF55VDqIiuAaY3UGZ10DJtvZzDcvsxg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "app-root-dir": "^1.0.2", - "dotenv": "^16.0.0", - "dotenv-expand": "^10.0.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/lighthouse-logger": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", - "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "debug": "^2.6.9", - "marky": "^1.2.2" - } - }, - "node_modules/lighthouse-logger/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/lighthouse-logger/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/lightningcss": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", - "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-darwin-arm64": "1.30.1", - "lightningcss-darwin-x64": "1.30.1", - "lightningcss-freebsd-x64": "1.30.1", - "lightningcss-linux-arm-gnueabihf": "1.30.1", - "lightningcss-linux-arm64-gnu": "1.30.1", - "lightningcss-linux-arm64-musl": "1.30.1", - "lightningcss-linux-x64-gnu": "1.30.1", - "lightningcss-linux-x64-musl": "1.30.1", - "lightningcss-win32-arm64-msvc": "1.30.1", - "lightningcss-win32-x64-msvc": "1.30.1" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", - "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", - "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", - "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", - "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", - "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", - "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", - "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", - "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", - "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", - "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/lint-staged": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.5.2.tgz", - "integrity": "sha512-YUSOLq9VeRNAo/CTaVmhGDKG+LBtA8KF1X4K5+ykMSwWST1vDxJRB2kv2COgLb1fvpCo+A/y9A0G0znNVmdx4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^5.4.1", - "commander": "^13.1.0", - "debug": "^4.4.0", - "execa": "^8.0.1", - "lilconfig": "^3.1.3", - "listr2": "^8.2.5", - "micromatch": "^4.0.8", - "pidtree": "^0.6.0", - "string-argv": "^0.3.2", - "yaml": "^2.7.0" - }, - "bin": { - "lint-staged": "bin/lint-staged.js" - }, - "engines": { - "node": ">=18.12.0" - }, - "funding": { - "url": "https://opencollective.com/lint-staged" - } - }, - "node_modules/lint-staged/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/lint-staged/node_modules/commander": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", - "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/lint-staged/node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/lint-staged/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=16.17.0" - } - }, - "node_modules/lint-staged/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/listr2": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.3.3.tgz", - "integrity": "sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "cli-truncate": "^4.0.0", - "colorette": "^2.0.20", - "eventemitter3": "^5.0.1", - "log-update": "^6.1.0", - "rfdc": "^1.4.1", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/listr2/node_modules/ansi-escapes": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", - "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "environment": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/listr2/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/listr2/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/listr2/node_modules/cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/listr2/node_modules/is-fullwidth-code-point": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", - "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-east-asian-width": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/listr2/node_modules/log-update": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", - "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^7.0.0", - "cli-cursor": "^5.0.0", - "slice-ansi": "^7.1.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/listr2/node_modules/onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-function": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/listr2/node_modules/restore-cursor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^7.0.0", - "signal-exit": "^4.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/listr2/node_modules/slice-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", - "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "is-fullwidth-code-point": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/listr2/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/listr2/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/listr2/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/lit": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/lit/-/lit-3.3.1.tgz", - "integrity": "sha512-Ksr/8L3PTapbdXJCk+EJVB78jDodUMaP54gD24W186zGRARvwrsPfS60wae/SSCTCNZVPd1chXqio1qHQmu4NA==", - "license": "BSD-3-Clause", - "dependencies": { - "@lit/reactive-element": "^2.1.0", - "lit-element": "^4.2.0", - "lit-html": "^3.3.0" - } - }, - "node_modules/lit-element": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.2.1.tgz", - "integrity": "sha512-WGAWRGzirAgyphK2urmYOV72tlvnxw7YfyLDgQ+OZnM9vQQBQnumQ7jUJe6unEzwGU3ahFOjuz1iz1jjrpCPuw==", - "license": "BSD-3-Clause", - "dependencies": { - "@lit-labs/ssr-dom-shim": "^1.4.0", - "@lit/reactive-element": "^2.1.0", - "lit-html": "^3.3.0" - } - }, - "node_modules/lit-html": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.3.1.tgz", - "integrity": "sha512-S9hbyDu/vs1qNrithiNyeyv64c9yqiW9l+DBgI18fL+MTvOtWoFR0FWiyq1TxaYef5wNlpEmzlXoBlZEO+WjoA==", - "license": "BSD-3-Clause", - "dependencies": { - "@types/trusted-types": "^2.0.2" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.", - "dev": true, - "license": "MIT" - }, - "node_modules/log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/log-update/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/log-update/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-update/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/loupe": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", - "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lz-string": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", - "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", - "dev": true, - "license": "MIT", - "peer": true, - "bin": { - "lz-string": "bin/bin.js" - } - }, - "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/map-or-similar": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz", - "integrity": "sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==", - "dev": true, - "license": "MIT" - }, - "node_modules/marky": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", - "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mdast-util-definitions": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", - "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "unist-util-visit": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz", - "integrity": "sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memoizerific": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz", - "integrity": "sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==", - "dev": true, - "license": "MIT", - "dependencies": { - "map-or-similar": "^1.5.0" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-function": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", - "dev": true, - "license": "MIT" - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/nanocolors": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/nanocolors/-/nanocolors-0.2.13.tgz", - "integrity": "sha512-0n3mSAQLPpGLV9ORXT5+C/D4mwew7Ebws69Hx4E2sgz2ZA5+32Q80B9tL8PbL7XHnRDiAxH/pnrUJ9a4fkTNTA==", - "dev": true, - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true, - "license": "MIT" - }, - "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/nise": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/nise/-/nise-6.1.1.tgz", - "integrity": "sha512-aMSAzLVY7LyeM60gvBS423nBmIPP+Wy7St7hsb+8/fc1HmeoHJfLO8CKse4u3BtOZvQLJghYPI2i/1WZrEj5/g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.1", - "@sinonjs/fake-timers": "^13.0.1", - "@sinonjs/text-encoding": "^0.7.3", - "just-extend": "^6.2.0", - "path-to-regexp": "^8.1.0" - } - }, - "node_modules/nise/node_modules/path-to-regexp": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", - "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - } - }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/only": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", - "integrity": "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==", - "dev": true - }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-event": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", - "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-timeout": "^3.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-finally": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pac-proxy-agent": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", - "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "get-uri": "^6.0.1", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.6", - "pac-resolver": "^7.0.1", - "socks-proxy-agent": "^8.0.5" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-resolver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", - "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", - "dev": true, - "license": "MIT", - "dependencies": { - "degenerator": "^5.0.0", - "netmask": "^2.0.2" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true, - "license": "MIT" - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/pathval": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", - "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.16" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pidtree": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", - "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", - "dev": true, - "license": "MIT", - "bin": { - "pidtree": "bin/pidtree.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/pkg-dir": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", - "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^5.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/portfinder": { - "version": "1.0.37", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.37.tgz", - "integrity": "sha512-yuGIEjDAYnnOex9ddMnKZEMFE0CcGo6zbfzDklkmT1m5z734ss6JMzN9rNB3+RR7iS+F10D4/BVIaXOyh8PQKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "async": "^3.2.6", - "debug": "^4.3.6" - }, - "engines": { - "node": ">= 10.12" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "peer": true, - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-agent": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", - "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.1", - "https-proxy-agent": "^7.0.6", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.1.0", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.5" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true, - "license": "MIT" - }, - "node_modules/pump": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", - "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/puppeteer-core": { - "version": "22.15.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-22.15.0.tgz", - "integrity": "sha512-cHArnywCiAAVXa3t4GGL2vttNxh7GqXtIYGym99egkNJ3oG//wL9LkvO4WE8W1TJe95t1F1ocu9X4xWaGsOKOA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@puppeteer/browsers": "2.3.0", - "chromium-bidi": "0.6.3", - "debug": "^4.3.6", - "devtools-protocol": "0.0.1312386", - "ws": "^8.18.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/ramda": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.29.0.tgz", - "integrity": "sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA==", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ramda" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/react": { - "version": "19.2.1", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.1.tgz", - "integrity": "sha512-DGrYcCWK7tvYMnWh79yrPHt+vdx9tY+1gPZa7nJQtO/p8bLTDaHp4dzwEhQB7pZ4Xe3ok4XKuEPrVuc+wlpkmw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "19.2.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.1.tgz", - "integrity": "sha512-ibrK8llX2a4eOskq1mXKu/TGZj9qzomO+sNfO98M6d9zIPOEhlBkMkBUBLd1vgS0gQsLDBzA+8jJBVXDnfHmJg==", - "dev": true, - "license": "MIT", - "dependencies": { - "scheduler": "^0.27.0" - }, - "peerDependencies": { - "react": "^19.2.1" - } - }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/recast": { - "version": "0.23.11", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.11.tgz", - "integrity": "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ast-types": "^0.16.1", - "esprima": "~4.0.0", - "source-map": "~0.6.1", - "tiny-invariant": "^1.3.3", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/recast/node_modules/ast-types": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", - "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/recast/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/remark-external-links": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/remark-external-links/-/remark-external-links-8.0.0.tgz", - "integrity": "sha512-5vPSX0kHoSsqtdftSHhIYofVINC8qmp0nctkeU9YoJwV3YfiBRiI6cbFRJ0oI/1F9xS+bopXG0m2KS8VFscuKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "extend": "^3.0.0", - "is-absolute-url": "^3.0.0", - "mdast-util-definitions": "^4.0.0", - "space-separated-tokens": "^1.0.0", - "unist-util-visit": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-slug": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/remark-slug/-/remark-slug-6.1.0.tgz", - "integrity": "sha512-oGCxDF9deA8phWvxFuyr3oSJsdyUAxMFbA0mZ7Y1Sas+emILtO+e5WutF9564gDsEN4IXaQXm5pFo6MLH+YmwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "github-slugger": "^1.0.0", - "mdast-util-to-string": "^1.0.0", - "unist-util-visit": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-path": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/resolve-path/-/resolve-path-1.4.0.tgz", - "integrity": "sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "http-errors": "~1.6.2", - "path-is-absolute": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/resolve-path/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/resolve-path/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/resolve-path/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true, - "license": "ISC" - }, - "node_modules/resolve-path/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/resolve-path/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true, - "license": "MIT" - }, - "node_modules/rollup": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.45.1.tgz", - "integrity": "sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.45.1", - "@rollup/rollup-android-arm64": "4.45.1", - "@rollup/rollup-darwin-arm64": "4.45.1", - "@rollup/rollup-darwin-x64": "4.45.1", - "@rollup/rollup-freebsd-arm64": "4.45.1", - "@rollup/rollup-freebsd-x64": "4.45.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.45.1", - "@rollup/rollup-linux-arm-musleabihf": "4.45.1", - "@rollup/rollup-linux-arm64-gnu": "4.45.1", - "@rollup/rollup-linux-arm64-musl": "4.45.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.45.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.45.1", - "@rollup/rollup-linux-riscv64-gnu": "4.45.1", - "@rollup/rollup-linux-riscv64-musl": "4.45.1", - "@rollup/rollup-linux-s390x-gnu": "4.45.1", - "@rollup/rollup-linux-x64-gnu": "4.45.1", - "@rollup/rollup-linux-x64-musl": "4.45.1", - "@rollup/rollup-win32-arm64-msvc": "4.45.1", - "@rollup/rollup-win32-ia32-msvc": "4.45.1", - "@rollup/rollup-win32-x64-msvc": "4.45.1", - "fsevents": "~2.3.2" - } - }, - "node_modules/rollup-plugin-external-globals": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-external-globals/-/rollup-plugin-external-globals-0.9.2.tgz", - "integrity": "sha512-BUzbNhcN20irgWFNOL9XYSAN8pVRL7BfyZJce7oJMxjgPuxMOlQo3oTp3LRH1ehddXQEnp0/XxglMisl/GhnJQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.1.0", - "estree-walker": "^3.0.3", - "is-reference": "^3.0.2", - "magic-string": "^0.30.5" - }, - "peerDependencies": { - "rollup": "^2.25.0 || ^3.3.0 || ^4.1.4" - } - }, - "node_modules/rollup-plugin-external-globals/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true, - "license": "ISC" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sinon": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-19.0.5.tgz", - "integrity": "sha512-r15s9/s+ub/d4bxNXqIUmwp6imVSdTorIRaxoecYjqTVLZ8RuoXr/4EDGwIBo6Waxn7f2gnURX9zuhAfCwaF6Q==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.1", - "@sinonjs/fake-timers": "^13.0.5", - "@sinonjs/samsam": "^8.0.1", - "diff": "^7.0.0", - "nise": "^6.1.1", - "supports-color": "^7.2.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/sinon" - } - }, - "node_modules/sinon/node_modules/diff": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", - "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.8.6", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.6.tgz", - "integrity": "sha512-pe4Y2yzru68lXCb38aAqRf5gvN8YdjP1lok5o0J7BOHljkyCGKVz7H3vpVIXKD27rj2giOJ7DwVyk/GWrPHDWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", - "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "socks": "^2.8.3" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/source-map": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 12" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/space-separated-tokens": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", - "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/spawn-command": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", - "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", - "dev": true - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/store2": { - "version": "2.14.4", - "resolved": "https://registry.npmjs.org/store2/-/store2-2.14.4.tgz", - "integrity": "sha512-srTItn1GOvyvOycgxjAnPA63FZNwy0PTyUBFMHRM+hVFltAeoh0LmNBz9SZqUS9mMqGk8rfyWyXn3GH5ReJ8Zw==", - "dev": true, - "license": "MIT" - }, - "node_modules/storybook": { - "version": "10.1.5", - "resolved": "https://registry.npmjs.org/storybook/-/storybook-10.1.5.tgz", - "integrity": "sha512-q3xB1pOcmmHUH9LfQNY/BWMGxp3fc1OALJf+F5BXIxHGQUEIizz6V1AbDOngWN9oWzuA8Gdz5rOCe7yelOMWVg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/global": "^5.0.0", - "@storybook/icons": "^2.0.0", - "@testing-library/jest-dom": "^6.6.3", - "@testing-library/user-event": "^14.6.1", - "@vitest/expect": "3.2.4", - "@vitest/spy": "3.2.4", - "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0", - "recast": "^0.23.5", - "semver": "^7.6.2", - "use-sync-external-store": "^1.5.0", - "ws": "^8.18.0" - }, - "bin": { - "storybook": "dist/bin/dispatcher.js" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "prettier": "^2 || ^3" - }, - "peerDependenciesMeta": { - "prettier": { - "optional": true - } - } - }, - "node_modules/storybook/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/streamx": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.1.tgz", - "integrity": "sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-fifo": "^1.3.2", - "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" - } - }, - "node_modules/string-argv": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", - "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6.19" - } - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/synchronous-promise": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.17.tgz", - "integrity": "sha512-AsS729u2RHUfEra9xJrE39peJcc2stq2+poBXX8bcM08Y6g9j/i/PUzwNQqkaJde7Ntg1TO7bSREbR5sdosQ+g==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/table-layout": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-4.1.1.tgz", - "integrity": "sha512-iK5/YhZxq5GO5z8wb0bY1317uDF3Zjpha0QFFLA8/trAoiLbQD0HUbMesEaxyzUgDxi2QlcbM8IvqOlEjgoXBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-back": "^6.2.2", - "wordwrapjs": "^5.1.0" - }, - "engines": { - "node": ">=12.17" - } - }, - "node_modules/tar-fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.0.tgz", - "integrity": "sha512-5Mty5y/sOF1YWj1J6GiBodjlDc05CUR8PKXrsnFAiSG0xA+GHeWLovaZPYUDXkH/1iKRf2+M5+OrRgzC7O9b7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - }, - "optionalDependencies": { - "bare-fs": "^4.0.1", - "bare-path": "^3.0.0" - } - }, - "node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/telejson": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/telejson/-/telejson-7.2.0.tgz", - "integrity": "sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "memoizerific": "^1.11.3" - } - }, - "node_modules/terser": { - "version": "5.43.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", - "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.14.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/text-decoder": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", - "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "b4a": "^1.6.4" - } - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tiny-invariant": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/tinyrainbow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", - "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.4.tgz", - "integrity": "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tr46": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", - "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "license": "MIT", - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/ts-dedent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", - "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.10" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/tsscmp": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", - "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6.x" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/typical": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", - "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/uglify-js": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", - "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", - "dev": true, - "license": "BSD-2-Clause", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/unbzip2-stream": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", - "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, - "node_modules/undici-types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", - "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", - "dev": true, - "license": "MIT" - }, - "node_modules/unist-util-is": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", - "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", - "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", - "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/unplugin": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz", - "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/remapping": "^2.3.5", - "acorn": "^8.15.0", - "picomatch": "^4.0.3", - "webpack-virtual-modules": "^0.6.2" - }, - "engines": { - "node": ">=18.12.0" - } - }, - "node_modules/unplugin/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/urlpattern-polyfill": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", - "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", - "dev": true, - "license": "MIT" - }, - "node_modules/use-sync-external-store": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", - "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, - "license": "MIT" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/v8-to-istanbul": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", - "dev": true, - "license": "ISC", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vite": { - "version": "7.2.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.7.tgz", - "integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "lightningcss": "^1.21.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/webpack-virtual-modules": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", - "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/whatwg-url": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", - "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tr46": "^5.1.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/wordwrapjs": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-5.1.0.tgz", - "integrity": "sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.17" - } - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yaml": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", - "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", - "dev": true, - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/ylru": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.4.0.tgz", - "integrity": "sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "3.23.8", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", - "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - } - } -} diff --git a/package.json b/package.json index 40cc905..286ad1c 100644 --- a/package.json +++ b/package.json @@ -2,27 +2,21 @@ "private": true, "description": "Web components for Corti Speech (dictation + ambient)", "type": "module", + "packageManager": "pnpm@10.12.1", "scripts": { - "analyze": "cem analyze --litelement", - "build:dictation": "tsc -p tsconfig.dictation.json && esbuild dist/dictation/index.js --bundle --outfile=dist/dictation/bundle.js --format=esm --platform=browser && cp package.dictation.json dist/dictation/package.json", - "build:ambient": "tsc -p tsconfig.ambient.json && mv dist/ambient/ambient-index.js dist/ambient/index.js && mv dist/ambient/ambient-index.d.ts dist/ambient/index.d.ts && (mv dist/ambient/ambient-index.js.map dist/ambient/index.js.map 2>/dev/null || true) && esbuild dist/ambient/index.js --bundle --outfile=dist/ambient/bundle.js --format=esm --platform=browser && cp package.ambient.json dist/ambient/package.json", - "build": "npm run build:dictation && npm run build:ambient && npm run analyze -- --exclude dist", - "prepublish": "tsc -p tsconfig.dictation.json && tsc -p tsconfig.ambient.json && npm run analyze -- --exclude dist", + "analyze": "cem analyze --litelement --exclude dist", + "build": "tsc -p core && pnpm -r run build && pnpm run analyze", + "prepublish": "tsc -p core && pnpm -r exec tsc -b && pnpm run analyze", "lint": "biome check .", "format": "biome format --write .", "biome:check": "biome check .", "biome:format": "biome format --write .", "biome:fix": "biome check --write .", "prepare": "husky && husky install", - "test": "tsc -p tsconfig.test.json && wtr --coverage", - "test:watch": "tsc && concurrently -k -r \"tsc --watch --preserveWatchOutput\" \"wtr --watch\"", - "storybook": "npm run analyze -- --exclude dist && storybook dev -p 8080", - "storybook:build": "tsc && tsc -p tsconfig.stories.json && npm run analyze -- --exclude dist && storybook build" - }, - "dependencies": { - "@corti/sdk": "3.0.0", - "@lit/context": "^1.1.6", - "lit": "^3.3.1" + "test": "tsc -p core && wtr --coverage", + "test:watch": "concurrently -k -r \"tsc -p core --watch --preserveWatchOutput\" \"wtr --watch\"", + "storybook": "pnpm run analyze && storybook dev -p 8080", + "storybook:build": "tsc -p core && tsc -p tsconfig.stories.json && pnpm run analyze && storybook build" }, "devDependencies": { "@biomejs/biome": "^2.3.6", @@ -34,6 +28,7 @@ "@storybook/web-components": "10.1.5", "@storybook/web-components-vite": "^10.1.5", "@types/mocha": "^10.0.7", + "@web/dev-server-esbuild": "0.4.4", "@web/storybook-builder": "^0.1.16", "@web/storybook-framework-web-components": "^0.1.2", "@web/test-runner": "^0.18.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..4f646c2 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,7663 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + '@biomejs/biome': + specifier: ^2.3.6 + version: 2.4.16 + '@custom-elements-manifest/analyzer': + specifier: ^0.10.3 + version: 0.10.10 + '@open-wc/testing': + specifier: ^4.0.0 + version: 4.0.0 + '@storybook/addon-a11y': + specifier: 10.1.5 + version: 10.1.5(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)) + '@storybook/addon-docs': + specifier: ^10.1.5 + version: 10.4.2(@types/react@19.2.16)(esbuild@0.25.12)(rollup@4.61.0)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.1)(esbuild@0.25.12)(terser@5.48.0)(yaml@2.9.0)) + '@storybook/addon-links': + specifier: 10.1.5 + version: 10.1.5(react@19.2.7)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)) + '@storybook/web-components': + specifier: 10.1.5 + version: 10.1.5(lit@3.3.3)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)) + '@storybook/web-components-vite': + specifier: ^10.1.5 + version: 10.4.2(esbuild@0.25.12)(lit@3.3.3)(rollup@4.61.0)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.1)(esbuild@0.25.12)(terser@5.48.0)(yaml@2.9.0)) + '@types/mocha': + specifier: ^10.0.7 + version: 10.0.10 + '@web/dev-server-esbuild': + specifier: 0.4.4 + version: 0.4.4 + '@web/storybook-builder': + specifier: ^0.1.16 + version: 0.1.21(glob@10.5.0) + '@web/storybook-framework-web-components': + specifier: ^0.1.2 + version: 0.1.3(glob@10.5.0)(lit@3.3.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@web/test-runner': + specifier: ^0.18.2 + version: 0.18.3 + concurrently: + specifier: ^8.2.2 + version: 8.2.2 + esbuild: + specifier: ^0.25.0 + version: 0.25.12 + husky: + specifier: ^8.0.0 + version: 8.0.3 + lint-staged: + specifier: ^15.2.7 + version: 15.5.2 + sinon: + specifier: ^19.0.2 + version: 19.0.5 + storybook: + specifier: 10.1.5 + version: 10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + tslib: + specifier: ^2.6.3 + version: 2.8.1 + typescript: + specifier: ^5.5.3 + version: 5.9.3 + + ambient: + dependencies: + '@corti/sdk': + specifier: 3.0.0 + version: 3.0.0 + '@lit/context': + specifier: ^1.1.6 + version: 1.1.6 + lit: + specifier: ^3.3.1 + version: 3.3.3 + + dictation: + dependencies: + '@corti/sdk': + specifier: 3.0.0 + version: 3.0.0 + '@lit/context': + specifier: ^1.1.6 + version: 1.1.6 + lit: + specifier: ^3.3.1 + version: 3.3.3 + +packages: + + '@adobe/css-tools@4.5.0': + resolution: {integrity: sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q==} + + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/runtime@7.29.7': + resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} + engines: {node: '>=6.9.0'} + + '@biomejs/biome@2.4.16': + resolution: {integrity: sha512-x9ajFh1zChVybCiM3TN6OD4phAqLgtPZjFrZF+aTMYCPjwBO+k529TX7PPsAqtGNLeV4UgzwQnowEgS7bGmzcA==} + engines: {node: '>=14.21.3'} + hasBin: true + + '@biomejs/cli-darwin-arm64@2.4.16': + resolution: {integrity: sha512-wxPvu4XOA85YJk9ixSWUmq/QBHbid85BISbOAqqBM/5xQpPk9ayjk5375tOlSC0BeCwNSbPFafQBm+vBumXq0A==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + + '@biomejs/cli-darwin-x64@2.4.16': + resolution: {integrity: sha512-xFCqGPwYusQJp4N4NJLi1XJiZqjwFdjhT+KqtNy+Ug3qgfczqnTa6MSDvxJF6TkuDLoYJItMapz6tAf7kCekFw==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + + '@biomejs/cli-linux-arm64-musl@2.4.16': + resolution: {integrity: sha512-oYxnW0ARfJkr72ezzF2OR8N/rtkgLUQeYtF8cFhVswbknHxtTcmzSsanVJP8yQKnGpGpc2ck6c5zLvHahL6Cbg==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-arm64@2.4.16': + resolution: {integrity: sha512-2kFb4//jxfZaP6D+Rj5VkHkxgyD9EoRAVBEQb8PKRv+s4NO2zYNJKXFaJmK1CmhufJOWEfpHKaRbOja7qjmdhQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-x64-musl@2.4.16': + resolution: {integrity: sha512-iHDS+MCM65DPqWGu+ECC3uoALyj2H7F4nVUPxIPjz/PIl94EUu+EDfGZDzFP+NY1EOPVt9NQvwFqq7HdMmowdg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-linux-x64@2.4.16': + resolution: {integrity: sha512-NbcBbi/nJqn5baae6wqRXdS7Gadf2uRpehSh6vMSYpG8OhkXl/Xg8aorWrJ+9VWqAT5ml90alLvorkpMW0nBwQ==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-win32-arm64@2.4.16': + resolution: {integrity: sha512-0rgImMsNb5v/chhkIFe3wu7PEFClS6RBAYUijGL9UsYN3PanSaoK24HSSuSJb1pYbYYVjzAyZTl3gtjJ84BM8A==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + + '@biomejs/cli-win32-x64@2.4.16': + resolution: {integrity: sha512-Kp85jgoBHa05gix6UIRjfCDiUV3w/8VIdZ247VyyO2gEjaw12WEVhdIjlxp/AMzXxqxQwbxNTDVZ3Mwd2RG5rw==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + + '@corti/sdk@3.0.0': + resolution: {integrity: sha512-MWuhqsU/G8DGARrq8eMfm9GjwsrKvvvKKymeP+WxaV3wGNogWWPBidrtScIabjo64Okv7+79gxArelwUc2X8VQ==} + engines: {node: '>=18.0.0'} + + '@custom-elements-manifest/analyzer@0.10.10': + resolution: {integrity: sha512-R1pbKssP3Psb2OiGfheiUbXtBgTGQ0Vu5cn2CHSdZoJV66oZPSSw/TdCf8WlnQ6dfKSy5L8hNneClnmD80GEwA==} + hasBin: true + + '@custom-elements-manifest/find-dependencies@0.0.6': + resolution: {integrity: sha512-2iVksJ156XuaeeC6jB6oMG6k9ROHS3W1delwJLL804yQMri9NnQW78JDCYMtFfW8b4locUG+3+hrtAHxk+fNGg==} + + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + + '@emotion/use-insertion-effect-with-fallbacks@1.2.0': + resolution: {integrity: sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==} + peerDependencies: + react: '>=16.8.0' + + '@esbuild/aix-ppc64@0.24.2': + resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.17.19': + resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.18.20': + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.24.2': + resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.17.19': + resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.18.20': + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.24.2': + resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.17.19': + resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.18.20': + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.24.2': + resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.17.19': + resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.18.20': + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.24.2': + resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.17.19': + resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.18.20': + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.24.2': + resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.17.19': + resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.18.20': + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.24.2': + resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.17.19': + resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.18.20': + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.24.2': + resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.17.19': + resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.18.20': + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.24.2': + resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.17.19': + resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.18.20': + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.24.2': + resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.17.19': + resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.18.20': + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.24.2': + resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.17.19': + resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.18.20': + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.24.2': + resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.17.19': + resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.18.20': + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.24.2': + resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.17.19': + resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.18.20': + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.24.2': + resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.17.19': + resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.18.20': + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.24.2': + resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.17.19': + resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.18.20': + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.24.2': + resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.17.19': + resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.18.20': + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.24.2': + resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.24.2': + resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.17.19': + resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.18.20': + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.24.2': + resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.24.2': + resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.17.19': + resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.18.20': + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.24.2': + resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.17.19': + resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.18.20': + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.24.2': + resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.17.19': + resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.18.20': + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.24.2': + resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.17.19': + resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.18.20': + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.24.2': + resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.17.19': + resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.18.20': + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.24.2': + resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@esm-bundle/chai@4.3.4-fix.0': + resolution: {integrity: sha512-26SKdM4uvDWlY8/OOOxSB1AqQWeBosCX3wRYUZO7enTAj03CtVxIiCimYVG2WpULcyV51qapK4qTovwkUr5Mlw==} + + '@github/catalyst@1.8.1': + resolution: {integrity: sha512-dnN4WWpbeuQvA17LvsGdlXEueJdBk9y+I+WO5pdNpoHNOXPsFcz3hJrq1iRmdsNgQOf4S8e83axtwIxvG62eWA==} + + '@hapi/bourne@3.0.0': + resolution: {integrity: sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.11': + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@lit-labs/ssr-dom-shim@1.6.0': + resolution: {integrity: sha512-VHb0ALPMTlgKjM6yIxxoQNnpKyUKLD04VzeQdsiXkMqkvYlAHxq9glGLmgbb889/1GsohSOAjvQYoiBppXFqrQ==} + + '@lit/context@1.1.6': + resolution: {integrity: sha512-M26qDE6UkQbZA2mQ3RjJ3Gzd8TxP+/0obMgE5HfkfLhEEyYE3Bui4A5XHiGPjy0MUGAyxB3QgVuw2ciS0kHn6A==} + + '@lit/reactive-element@2.1.2': + resolution: {integrity: sha512-pbCDiVMnne1lYUIaYNN5wrwQXDtHaYtg7YEFPeW+hws6U47WeFvISGUWekPGKWOP1ygrs0ef0o1VJMk1exos5A==} + + '@mdn/browser-compat-data@4.2.1': + resolution: {integrity: sha512-EWUguj2kd7ldmrF9F+vI5hUOralPd+sdsUnYbRy33vZTuZkduC1shE9TtEMEjAQwyfyMb4ole5KtjF8MsnQOlA==} + + '@mdx-js/react@3.1.1': + resolution: {integrity: sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==} + peerDependencies: + '@types/react': '>=16' + react: '>=16' + + '@napi-rs/wasm-runtime@1.1.4': + resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@open-wc/dedupe-mixin@2.0.1': + resolution: {integrity: sha512-+R4VxvceUxHAUJXJQipkkoV9fy10vNo+OnUnGKZnVmcwxMl460KLzytnUM4S35SI073R0yZQp9ra0MbPUwVcEA==} + + '@open-wc/scoped-elements@3.0.10': + resolution: {integrity: sha512-esE95vxq6Y7w9/8H/oPvqN9QVR+ys3F9J2/ITyuTWnlSYaJueQmcS5CR5OybJMjjm9R5pmSoOe6Vau/O7J6d2g==} + + '@open-wc/semantic-dom-diff@0.20.1': + resolution: {integrity: sha512-mPF/RPT2TU7Dw41LEDdaeP6eyTOWBD4z0+AHP4/d0SbgcfJZVRymlIB6DQmtz0fd2CImIS9kszaMmwMt92HBPA==} + + '@open-wc/testing-helpers@3.0.1': + resolution: {integrity: sha512-hyNysSatbgT2FNxHJsS3rGKcLEo6+HwDFu1UQL6jcSQUabp/tj3PyX7UnXL3H5YGv0lJArdYLSnvjLnjn3O2fw==} + + '@open-wc/testing@4.0.0': + resolution: {integrity: sha512-KI70O0CJEpBWs3jrTju4BFCy7V/d4tFfYWkg8pMzncsDhD7TYNHLw5cy+s1FHXIgVFetnMDhPpwlKIPvtTQW7w==} + + '@oxc-project/types@0.133.0': + resolution: {integrity: sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@puppeteer/browsers@2.3.0': + resolution: {integrity: sha512-ioXoq9gPxkss4MYhD+SFaU9p1IHFUX0ILAWFPyjGaBdjLsYAlZw6j1iLA0N/m12uVHLFDfSYNF7EQccjinIMDA==} + engines: {node: '>=18'} + hasBin: true + + '@rolldown/binding-android-arm64@1.0.3': + resolution: {integrity: sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.3': + resolution: {integrity: sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.3': + resolution: {integrity: sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.3': + resolution: {integrity: sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.3': + resolution: {integrity: sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.3': + resolution: {integrity: sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.0.3': + resolution: {integrity: sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-ppc64-gnu@1.0.3': + resolution: {integrity: sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@rolldown/binding-linux-s390x-gnu@1.0.3': + resolution: {integrity: sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@rolldown/binding-linux-x64-gnu@1.0.3': + resolution: {integrity: sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.0.3': + resolution: {integrity: sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-openharmony-arm64@1.0.3': + resolution: {integrity: sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.3': + resolution: {integrity: sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.3': + resolution: {integrity: sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.3': + resolution: {integrity: sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.1': + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + + '@rollup/plugin-node-resolve@15.3.1': + resolution: {integrity: sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/pluginutils@5.4.0': + resolution: {integrity: sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.61.0': + resolution: {integrity: sha512-dnxczajOqt0gesZlN5pGQ1s1imQVrsmCw5G2Ci4oM+0WvNz3pyRnlWrT7McoZIb8VlFwCawdmbWRmxRn7HI+VQ==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.61.0': + resolution: {integrity: sha512-Bp3JpGP00Vu3f238ivRrjf7z3xSzVPXqCmaJYA9t2c+c8vKYvOzmXF7LkkeUalTEGd6cZcSWe+PFIP3Vy48fRg==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.61.0': + resolution: {integrity: sha512-zaYIpr670mUmmZ1tVzUFplbQbG7h3Gugx3L5FoqhsC2m/YnLlR1a7zVLmXNPy+iY1tFPEbNG+HHBXZGyId0G5w==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.61.0': + resolution: {integrity: sha512-+P49fvkv2dSoeevUW+lgZ/I2JHSsJCK1Lyjj7Cu6E4UHG4tS9XIefzIjo5qhgELjAclnen1rLzK2PMKJdo+Dyg==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.61.0': + resolution: {integrity: sha512-l3FAAOyKJXH2ea6KNFN+MMgC/rnE94YGLXs2ehYqDcCoHt1DpvgWX75BhUJxN38XojP7Ul+4H8PRn7EdyqSDrw==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.61.0': + resolution: {integrity: sha512-VokPN3TSctKj65cyCNPaUh4vMFA8awxOot/0sp+4J7ZlNRKQEhXhawqPwajoi8H5ZFt61i0ugZJuTKXBjGJ17Q==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.61.0': + resolution: {integrity: sha512-DxH0P3wxm+Yzs/p3zrk9dw1rURu8p0Nv5+MRK/L7OtnLNg5rLZraSBFZ8iUXOd9f2BlhJyEpIZUH/emjq4UJ4g==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.61.0': + resolution: {integrity: sha512-T6ZvMNe84kAz6TBWHC7hGAoEtzP1LWYw/AqayGWEF6uISt3Abk/st06LqRD9THd7Xz3NxzurUpzAuEAUbZf+nw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.61.0': + resolution: {integrity: sha512-q/4hzvQkDs8b4jIBab1pnLiiM0ayTZsN2amBFPDzuyZxjEd4wDwx0UJFYM3cOZzSf5Kw8fnWSprJzIBMkcR44Q==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.61.0': + resolution: {integrity: sha512-vvYWX3akdEAY6km+9wAqFDnk6pQsbJKVnj7xawcvs/+fdlYBGp+U+Qq/lLfpIxYIZvZLHMAKD9HLdacSx/r3dw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.61.0': + resolution: {integrity: sha512-DePa5cqOxDP/Zp0VOXpeWaGew5iIv5DXp9NYbzkX5PFQyWVX9184WCTh3hvr/7lhXo8ZVlbFLkz8+o/q1dU6gA==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loong64-musl@4.61.0': + resolution: {integrity: sha512-LV8aWMB8UChglMCEzs7RkN0GsH29RJaLLqwm9fCIjlqwxQTiWAqNcc7wjBkH31hV0PU/yVxGYvrYsgfea2qw6g==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.61.0': + resolution: {integrity: sha512-QoNSnwQtaeNu5grdBbsL0tt1uyl5EnS8DA8Mr3nluMXbhdQNyhN+G4tBax7VCdxLKj8YJ0/4OO9Ho84jMnJtKA==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-musl@4.61.0': + resolution: {integrity: sha512-/zZp5MKapIIApE8trN8qLGNSiRN9TUoaUZ1cmVu4XnVdd5LQLOXTtyi+vtfUbNnT3iyjzpPqYeKXmvJ+gJGYWw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.61.0': + resolution: {integrity: sha512-RbrzcD3aJ1k3UbtMRRBNwojdVVyXjuVAFTfn/xPa6EEl6GE9Sm/akPgFTb9aAC9pMKGJ6CtWxaGrqWcabH+ySg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.61.0': + resolution: {integrity: sha512-ZF+onDsBso8PJf1XaG9lB+O9RnBpKGnY6OrzC4CSHrtC1jb6jWLTKK4bRqdoCXHd22gyr2hiYmEAm8Wns/BOCw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.61.0': + resolution: {integrity: sha512-Atk0aSIk5Zx2Wuh9dgRQgLP0Koc8hOeYpbWryMXyk8G8/HmPkwPPkMqIIDhrXHHYqfUzSJA/I7IWSBv8xSmRBA==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.61.0': + resolution: {integrity: sha512-0uMOcf3eZ5K+K4cYHkdxShFMPlPXCOdfDFEFn9dNYAEEd2cVvmOfH7zFgRVoDgmtQ1m9k5q7qfrHzyMAubKYUA==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.61.0': + resolution: {integrity: sha512-mvFtE4A/t/7hRJ7X8Ozmu8FsIkAUat2nzl12pgU337BRmq87AQUJztwHz2Zv5/tjo9/C95E66CK03SI/ToEDJw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openbsd-x64@4.61.0': + resolution: {integrity: sha512-z9b9+aTxvt8n2rNltMPvyaUfB8NJ+CVyOrGK/MdIKHx7B+lXmZpm/XbRsU7Rpf3fRqJ2uS6mBJiJveCtq8LHDg==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.61.0': + resolution: {integrity: sha512-jXaXFqKMehsOc+g8R6oo33RRC6w07G9jDBxAE5eAKX7mOcCbZloYIPNhfG9Wl+P9O9IWHFO4OJgPi1Ml2qkt7w==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.61.0': + resolution: {integrity: sha512-OXNWVFocS2IA4+QplhTZZ2a+8hPZR7T8KuozsNmJKK8y7cp83StHvGksfHzPG3wczWTczyWHVQuqeiTUbjiyBg==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.61.0': + resolution: {integrity: sha512-AlAbNtBO637LxSldqV43z0FfXoGfl2TW1DgAg/bs7aQswFbDewz2SJm3BUhiGfbOVtW571xbc9p+REdxhyN/Eg==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.61.0': + resolution: {integrity: sha512-QRSrQXyJ1M4tjNXdR0/G/IgV6lzfQQJYBjlWIEYkY2Xs86DRl/iEpQ4blMDjJxSl7n19eDKKXMg0AmuBVYy8pQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.61.0': + resolution: {integrity: sha512-tkuFxhvKO/HlGd0VsINF6vHSYH8AF8W0TcNxKDK6JZmrehngFj78pToc8iemtnvwilDjs2G/qSzYFhe9U8q+fw==} + cpu: [x64] + os: [win32] + + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + + '@sinonjs/fake-timers@13.0.5': + resolution: {integrity: sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==} + + '@sinonjs/fake-timers@15.4.0': + resolution: {integrity: sha512-DsG+8/LscQIQg68J6Ef3dv10u6nVyetYn923s3/sus5eaGfTo1of5WMZSLf0UJc9KDuKPilPH0UDJCjvNbDNCA==} + + '@sinonjs/samsam@8.0.3': + resolution: {integrity: sha512-hw6HbX+GyVZzmaYNh82Ecj1vdGZrqVIn/keDTg63IgAwiQPO+xCz99uG6Woqgb4tM0mUiFENKZ4cqd7IX94AXQ==} + + '@storybook/addon-a11y@10.1.5': + resolution: {integrity: sha512-dMUrkuQyvDfD6SdvV7F7cbjRrhHN0kqCNhRfg1i1IJuLuck6kiALpx8176KhWBcAkN/0J/1V75n7+F9YU/JlPA==} + peerDependencies: + storybook: ^10.1.5 + + '@storybook/addon-docs@10.4.2': + resolution: {integrity: sha512-CtW1O4xSKZPNtpWgpfp4yB/x4pj/of+3MvlEDfErSlr3Hp3QmEa2pCLaecR08H5LJqJFlt1PtG0UrIynTvgW9w==} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + storybook: ^10.4.2 + peerDependenciesMeta: + '@types/react': + optional: true + + '@storybook/addon-links@10.1.5': + resolution: {integrity: sha512-a1uXpNgIZg6U2v3+431RNFCLvcuNPT2kQjFEKNAVLyNe4Krig/yR3HabGoxKHINLrtBzn/rE9yNeDhMKYfvVnA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + storybook: ^10.1.5 + peerDependenciesMeta: + react: + optional: true + + '@storybook/builder-vite@10.4.2': + resolution: {integrity: sha512-d3+i9vbbUfV6hvT90qabmy1WmC4bEJ7iAYDm0217doeA+S6awF25GF0qOy9gN9waU4NMntHoVpdB1YQO2wUj/w==} + peerDependencies: + storybook: ^10.4.2 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + + '@storybook/channels@7.6.24': + resolution: {integrity: sha512-rNSifUbCjUPWQMZPptY5VTY4c4iOrCzDKmmDeBeurPH0ZiDvnJjW7v9dlXzlDNoXFUv+jBE+RjrEfNWsnJhvsQ==} + + '@storybook/client-logger@7.6.24': + resolution: {integrity: sha512-Xgn62FLhTzGJFl/uAMukJrfqAhiInkJ91ZwZMqEl8bdgeGO6ISkijDqQebqI0KyqB4ZpD11jVvEOQ/TowLebZw==} + + '@storybook/core-client@7.6.24': + resolution: {integrity: sha512-1UHiA+h//U0iIm7GAhGG5hN8GaD4rhoqm4ZjUQaCPUemBtEOPMWJk1sQLyGrhlLYDEAp69Sbi4BP/J0LD0nrjQ==} + + '@storybook/core-common@7.6.24': + resolution: {integrity: sha512-wgCarEWFodQaJ76uLxwHoxtGwQPymzoZHFLE2fJm04y6sdotUgattUUY5FxbhSveImj6VTLDDzstkzxxz166UQ==} + + '@storybook/core-events@7.6.24': + resolution: {integrity: sha512-9mhV2grn+IYljRJSqoTec3XhoMs1Va0aYWe937siX3Fj77F6zuXmEugrJstgVYsPAgcqH9eBSCM7rwdmbo7LVg==} + + '@storybook/csf-plugin@10.4.2': + resolution: {integrity: sha512-GqX/2DeF3/jKs5D7gpDiuT9gd0c/f2TKcnQ5av4/s3YqeN+0nhm7btkCrDfgF16uzE1Zj3OrkxvB3AOkfxWgDg==} + peerDependencies: + esbuild: '*' + rollup: '*' + storybook: ^10.4.2 + vite: '*' + webpack: '*' + peerDependenciesMeta: + esbuild: + optional: true + rollup: + optional: true + vite: + optional: true + webpack: + optional: true + + '@storybook/csf@0.1.13': + resolution: {integrity: sha512-7xOOwCLGB3ebM87eemep89MYRFTko+D8qE7EdAAq74lgdqRR5cOUtYWJLjO2dLtP94nqoOdHJo6MdLLKzg412Q==} + + '@storybook/docs-tools@7.6.24': + resolution: {integrity: sha512-uvUfBZ11LuKENR1s3eRWQXiAt3F7pcCzv6mFgwWFIgxdCf6jgLnvIDclFHOZxOuazACK2DCY9cXdQsOs5R33dw==} + + '@storybook/global@5.0.0': + resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} + + '@storybook/icons@2.0.2': + resolution: {integrity: sha512-KZBCpXsshAIjczYNXR/rlxEtCUX/eAbpFNwKi8bcOomrLA4t/SyPz5RF+lVPO2oZBUE4sAkt43mfJUevQDSEEw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@storybook/manager-api@7.6.24': + resolution: {integrity: sha512-afscdt9zc8wx+s0VzIlvU+pc5X6KTGHOUj6sLlJDCzzrRG2MBNdSfwOuivlC93jV+yPdgdgW46jaK4meC9jLdg==} + + '@storybook/mdx2-csf@1.1.0': + resolution: {integrity: sha512-TXJJd5RAKakWx4BtpwvSNdgTDkKM6RkXU8GK34S/LhidQ5Pjz3wcnqb0TxEkfhK/ztbP8nKHqXFwLfa2CYkvQw==} + + '@storybook/node-logger@7.6.24': + resolution: {integrity: sha512-6+kuX0q4VH1Orf0Yda+dj6svMIjtN5FbXU9lgKWbO5OY2xeyEtr/+3phxfTnfd6N89kYxDx8JGeP5ldzx2alxg==} + + '@storybook/preview-api@7.6.24': + resolution: {integrity: sha512-dBoHQeZk4ZdfeIZzc798Bl2wF0tjiY6fhl7QllBUIFqxvHTCM3YFa2vAIifr2bnxeTpvheKFhqNnOivJbSwTXQ==} + + '@storybook/preview@7.6.24': + resolution: {integrity: sha512-8qa9OFD1XKrX0Ts7vZFSd0ugIHoQt4rBGZNG7gE17laFxMTMiNAaTEqBF44f6vslx0z8VjIPtQ8qKeurU0IQdg==} + + '@storybook/react-dom-shim@10.4.2': + resolution: {integrity: sha512-Eng3Yt2NCjPX94QcfyLeUFhrMj0hec2yU9J/qafBVbfj9XrFI8o+0ZwYJ7uXb9ECbvPN4y06dgt/2W/LiR417w==} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + '@types/react-dom': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + storybook: ^10.4.2 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@storybook/router@7.6.24': + resolution: {integrity: sha512-298nfeJrcw/5o30obLxnu8YA5Mp566GIQTR1bvjglh9b2w4hJXwhGcZD8/rxrMbi7yDemGgLyyicMNvWr+cpQA==} + + '@storybook/theming@7.6.24': + resolution: {integrity: sha512-HuH7fkscjq5+qJTTWEY0xRZ9CMaBFpk+NdevA0eHCcBlo4yhMWb1PTUw9PHch4EIU7ng7l9tEPEaxLQT4vFUPg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + '@storybook/types@7.6.24': + resolution: {integrity: sha512-XOhLmXnQprLRIs4dT9kmWHgETEiGdOjbJ9ULQGoKR72wia47Buzrjwg5Ym3BTQEzrtLpo/8FD3NS+Migldp+XA==} + + '@storybook/web-components-vite@10.4.2': + resolution: {integrity: sha512-XD0vUnfJVu0aeUlwhiU3mzhdAnWSLPuljcxvWJOk/AvYQ3kKIeiM1OFFbCMUBjs6DTyomyW+t4HrSe20QoHNJg==} + peerDependencies: + storybook: ^10.4.2 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + + '@storybook/web-components@10.1.5': + resolution: {integrity: sha512-Lw+dYaNHx4zx7I1XeiwVDXIv2fu10VKBb2Bny2lRUMf7WOowFMiGKozIgZ678a6v/MTh4VWCd1r48fNfNkC0oA==} + peerDependencies: + lit: ^2.0.0 || ^3.0.0 + storybook: ^10.1.5 + + '@storybook/web-components@10.4.2': + resolution: {integrity: sha512-dzZhJ1G/kQ3+19ureRsV1s3Sy5krcyf5mGdUa3vdt9SFP1KiAbzUnD8ur/jiUmOKcdn6lrEKMs4NY4rSzU4mPA==} + peerDependencies: + lit: ^2.0.0 || ^3.0.0 + storybook: ^10.4.2 + + '@storybook/web-components@7.6.24': + resolution: {integrity: sha512-Qn+3gFUXDFEAB67rkf2rmt2C+vRD1KbQAUt+nMJv58ZxQ8z0wRjrY412eW4LAciKcZEzTPlNs1q76QKe9kLekw==} + engines: {node: '>=16.0.0'} + peerDependencies: + lit: ^2.0.0 || ^3.0.0 + + '@testing-library/dom@10.4.1': + resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} + engines: {node: '>=18'} + + '@testing-library/jest-dom@6.9.1': + resolution: {integrity: sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==} + engines: {node: '>=14', npm: '>=6', yarn: '>=1'} + + '@testing-library/user-event@14.6.1': + resolution: {integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@testing-library/dom': '>=7.21.4' + + '@tootallnate/quickjs-emscripten@0.23.0': + resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + + '@tybys/wasm-util@0.10.2': + resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} + + '@types/accepts@1.3.7': + resolution: {integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==} + + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + + '@types/babel__code-frame@7.27.0': + resolution: {integrity: sha512-Dwlo+LrxDx/0SpfmJ/BKveHf7QXWvLBLc+x03l5sbzykj3oB9nHygCpSECF1a+s+QIxbghe+KHqC90vGtxLRAA==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + + '@types/body-parser@1.19.6': + resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} + + '@types/chai-dom@1.11.3': + resolution: {integrity: sha512-EUEZI7uID4ewzxnU7DJXtyvykhQuwe+etJ1wwOiJyQRTH/ifMWKX+ghiXkxCUvNJ6IQDodf0JXhuP6zZcy2qXQ==} + + '@types/chai@4.3.20': + resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} + + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + + '@types/co-body@6.1.3': + resolution: {integrity: sha512-UhuhrQ5hclX6UJctv5m4Rfp52AfG9o9+d9/HwjxhVB5NjXxr5t9oKgJxN8xRHgr35oo8meUEHUPFWiKg6y71aA==} + + '@types/command-line-args@5.2.3': + resolution: {integrity: sha512-uv0aG6R0Y8WHZLTamZwtfsDLVRnOa+n+n5rEvFWL5Na5gZ8V2Teab/duDPFzIIIhs9qizDpcavCusCLJZu62Kw==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/content-disposition@0.5.9': + resolution: {integrity: sha512-8uYXI3Gw35MhiVYhG3s295oihrxRyytcRHjSjqnqZVDDy/xcGBRny7+Xj1Wgfhv5QzRtN2hB2dVRBUX9XW3UcQ==} + + '@types/convert-source-map@2.0.3': + resolution: {integrity: sha512-ag0BfJLZf6CQz8VIuRIEYQ5Ggwk/82uvTQf27RcpyDNbY0Vw49LIPqAxk5tqYfrCs9xDaIMvl4aj7ZopnYL8bA==} + + '@types/cookies@0.9.2': + resolution: {integrity: sha512-1AvkDdZM2dbyFybL4fxpuNCaWyv//0AwsuUk2DWeXyM1/5ZKm6W3z6mQi24RZ4l2ucY+bkSHzbDVpySqPGuV8A==} + + '@types/debounce@1.2.4': + resolution: {integrity: sha512-jBqiORIzKDOToaF63Fm//haOCHuwQuLa2202RK4MozpA6lh93eCBc+/8+wZn5OzjJt3ySdc+74SXWXB55Ewtyw==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/doctrine@0.0.3': + resolution: {integrity: sha512-w5jZ0ee+HaPOaX25X2/2oGR/7rgAQSYII7X7pp0m9KgBfMP7uKfMfTvcpl5Dj+eDBbpxKGiqE+flqDr6XTd2RA==} + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@types/express-serve-static-core@4.19.8': + resolution: {integrity: sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==} + + '@types/express-serve-static-core@5.1.1': + resolution: {integrity: sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==} + + '@types/express@4.17.25': + resolution: {integrity: sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==} + + '@types/express@5.0.6': + resolution: {integrity: sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==} + + '@types/find-cache-dir@3.2.1': + resolution: {integrity: sha512-frsJrz2t/CeGifcu/6uRo4b+SzAwT4NYCVPu1GN8IB9XTzrpPkGuV0tmh9mN+/L0PklAlsC3u5Fxt0ju00LXIw==} + + '@types/http-assert@1.5.6': + resolution: {integrity: sha512-TTEwmtjgVbYAzZYWyeHPrrtWnfVkm8tQkP8P21uQifPgMRgjrow3XDEYqucuC8SKZJT7pUnhU/JymvjggxO9vw==} + + '@types/http-errors@2.0.5': + resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + + '@types/keygrip@1.0.6': + resolution: {integrity: sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==} + + '@types/koa-compose@3.2.9': + resolution: {integrity: sha512-BroAZ9FTvPiCy0Pi8tjD1OfJ7bgU1gQf0eR6e1Vm+JJATy9eKOG3hQMFtMciMawiSOVnLMdmUOC46s7HBhSTsA==} + + '@types/koa@2.15.2': + resolution: {integrity: sha512-CB+iyjjh1uS5N6/CKwXvw0qA7USMS2WVc4Tjf660yCjhdvqzNr8gdFcIawB41zGGptOQ+d1fnpaQWIIUXYxR3w==} + + '@types/mdx@2.0.13': + resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + '@types/mocha@10.0.10': + resolution: {integrity: sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==} + + '@types/node-fetch@2.6.13': + resolution: {integrity: sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==} + + '@types/node@18.19.130': + resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} + + '@types/node@25.9.1': + resolution: {integrity: sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==} + + '@types/parse5@6.0.3': + resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} + + '@types/pretty-hrtime@1.0.3': + resolution: {integrity: sha512-nj39q0wAIdhwn7DGUyT9irmsKK1tV0bd5WFEhgpqNTMFZ8cE+jieuTphCW0tfdm47S2zVT5mr09B28b1chmQMA==} + + '@types/qs@6.15.1': + resolution: {integrity: sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/react@19.2.16': + resolution: {integrity: sha512-esJiCAnl0kfpNdE69f3So4WJUXy95dLZydX0KwK46riIHDzHM7O9Vtf9xCHW0PXIqvgqNrswl522kA/5yx+F4w==} + + '@types/resolve@1.20.2': + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + + '@types/send@0.17.6': + resolution: {integrity: sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==} + + '@types/send@1.2.1': + resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==} + + '@types/serve-static@1.15.10': + resolution: {integrity: sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==} + + '@types/serve-static@2.2.0': + resolution: {integrity: sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==} + + '@types/sinon-chai@3.2.12': + resolution: {integrity: sha512-9y0Gflk3b0+NhQZ/oxGtaAJDvRywCa5sIyaVnounqLvmf93yBF4EgIRspePtkMs3Tr844nCclYMlcCNmLCvjuQ==} + + '@types/sinon@21.0.1': + resolution: {integrity: sha512-5yoJSqLbjH8T9V2bksgRayuhpZy+723/z6wBOR+Soe4ZlXC0eW8Na71TeaZPUWDQvM7LYKa9UGFc6LRqxiR5fQ==} + + '@types/sinonjs__fake-timers@15.0.1': + resolution: {integrity: sha512-Ko2tjWJq8oozHzHV+reuvS5KYIRAokHnGbDwGh/J64LntgpbuylF74ipEL24HCyRjf9FOlBiBHWBR1RlVKsI1w==} + + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/ws@7.4.7': + resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} + + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + + '@web/browser-logs@0.4.1': + resolution: {integrity: sha512-ypmMG+72ERm+LvP+loj9A64MTXvWMXHUOu773cPO4L1SV/VWg6xA9Pv7vkvkXQX+ItJtCJt+KQ+U6ui2HhSFUw==} + engines: {node: '>=18.0.0'} + + '@web/config-loader@0.1.3': + resolution: {integrity: sha512-XVKH79pk4d3EHRhofete8eAnqto1e8mCRAqPV00KLNFzCWSe8sWmLnqKCqkPNARC6nksMaGrATnA5sPDRllMpQ==} + engines: {node: '>=10.0.0'} + + '@web/config-loader@0.3.3': + resolution: {integrity: sha512-ilzeQzrPpPLWZhzFCV+4doxKDGm7oKVfdKpW9wiUNVgive34NSzCw+WzXTvjE4Jgr5CkyTDIObEmMrqQEjhT0g==} + engines: {node: '>=18.0.0'} + + '@web/dev-server-core@0.6.3': + resolution: {integrity: sha512-BWlgxIXQbg3RqUdz9Cfeh3XqFv0KcjQi4DLaZy9s63IlXgNZTzesTfDzliP/mIdWd5r8KZYh/P3n6LMi7CLPjQ==} + engines: {node: '>=16.0.0'} + + '@web/dev-server-core@0.7.5': + resolution: {integrity: sha512-Da65zsiN6iZPMRuj4Oa6YPwvsmZmo5gtPWhW2lx3GTUf5CAEapjVpZVlUXnKPL7M7zRuk72jSsIl8lo+XpTCtw==} + engines: {node: '>=18.0.0'} + + '@web/dev-server-esbuild@0.4.4': + resolution: {integrity: sha512-gxXvj1mw0/b8HP2ARaXgQEmWH/nyPWvRuzSyEvybMm9oThe//z6K0ksj2qyffT/X7yblhEReKqWK7djCaB0M0Q==} + engines: {node: '>=16.0.0'} + + '@web/dev-server-rollup@0.6.4': + resolution: {integrity: sha512-sJZfTGCCrdku5xYnQQG51odGI092hKY9YFM0X3Z0tRY3iXKXcYRaLZrErw5KfCxr6g0JRuhe4BBhqXTA5Q2I3Q==} + engines: {node: '>=18.0.0'} + + '@web/dev-server@0.4.6': + resolution: {integrity: sha512-jj/1bcElAy5EZet8m2CcUdzxT+CRvUjIXGh8Lt7vxtthkN9PzY9wlhWx/9WOs5iwlnG1oj0VGo6f/zvbPO0s9w==} + engines: {node: '>=18.0.0'} + hasBin: true + + '@web/parse5-utils@2.1.1': + resolution: {integrity: sha512-7rBVZEMGfrq2iPcAEwJ0KSNSvmA2a6jT2CK8/gyIOHgn4reg7bSSRbzyWIEYWyIkeRoYEukX/aW+nAeCgSSqhQ==} + engines: {node: '>=18.0.0'} + + '@web/rollup-plugin-html@2.4.1': + resolution: {integrity: sha512-28n3S4FFlafkuk4bhaWNdgT8mDCoVBtSFeN829zrkWAzISZlHutkGJVD6xS35nUYGx+J/wfk635Fc+TX4mCm9g==} + engines: {node: '>=18.0.0'} + + '@web/storybook-builder@0.1.21': + resolution: {integrity: sha512-MtS588/rAoJX21koTXAT9YHX+9rffUmdGc6iZlRudO7h7jx9r4T6zcdRNO6Vs7C6HicMqW+O7qynLBmD7XtSYw==} + engines: {node: '>=16.0.0'} + + '@web/storybook-framework-web-components@0.1.3': + resolution: {integrity: sha512-+00SM6eq90v4hFs4AEE+6VuSZzj6/EduOzb4N+IL1KyvyhyMf8c8StDM0YzyGmixO11vlL3puy686pfKy4MuLQ==} + engines: {node: '>=16.0.0'} + + '@web/test-runner-chrome@0.16.0': + resolution: {integrity: sha512-Edc6Y49aVB6k18S5IOj9OCX3rEf8F3jptIu0p95+imqxmcutFEh1GNmlAk2bQGnXS0U6uVY7Xbf61fiaXUQqhg==} + engines: {node: '>=18.0.0'} + + '@web/test-runner-commands@0.9.0': + resolution: {integrity: sha512-zeLI6QdH0jzzJMDV5O42Pd8WLJtYqovgdt0JdytgHc0d1EpzXDsc7NTCJSImboc2NcayIsWAvvGGeRF69SMMYg==} + engines: {node: '>=18.0.0'} + + '@web/test-runner-core@0.13.4': + resolution: {integrity: sha512-84E1025aUSjvZU1j17eCTwV7m5Zg3cZHErV3+CaJM9JPCesZwLraIa0ONIQ9w4KLgcDgJFw9UnJ0LbFf42h6tg==} + engines: {node: '>=18.0.0'} + + '@web/test-runner-coverage-v8@0.8.0': + resolution: {integrity: sha512-PskiucYpjUtgNfR2zF2AWqWwjXL7H3WW/SnCAYmzUrtob7X9o/+BjdyZ4wKbOxWWSbJO4lEdGIDLu+8X2Xw+lA==} + engines: {node: '>=18.0.0'} + + '@web/test-runner-mocha@0.9.0': + resolution: {integrity: sha512-ZL9F6FXd0DBQvo/h/+mSfzFTSRVxzV9st/AHhpgABtUtV/AIpVE9to6+xdkpu6827kwjezdpuadPfg+PlrBWqQ==} + engines: {node: '>=18.0.0'} + + '@web/test-runner@0.18.3': + resolution: {integrity: sha512-QkVK8Qguw3Zhyu8SYR7F4VdcjyXBeJNr8W8L++s4zO/Ok7DR/Wu7+rLswn3H7OH3xYoCHRmwteehcFejefz6ew==} + engines: {node: '>=18.0.0'} + hasBin: true + + '@xn-sakina/rml-darwin-arm64@2.8.0': + resolution: {integrity: sha512-B8XpWn/t3vALCePi8DnbHQWVQnmKybwPIKbfzL1L75w2V/ELXn0OguFayujf2eZdmCIBPC+Drqxztn6fDV08Ww==} + engines: {node: '>=14'} + cpu: [arm64] + os: [darwin] + + '@xn-sakina/rml-darwin-x64@2.8.0': + resolution: {integrity: sha512-02UG6vhkzoTgQwkPJH8cnz7Pmqs0BChv4dq13pYqUtSSJr9BgPkSA5U8lXXmD76HpUOdN1ZH4K1jr2NOhwbPCw==} + engines: {node: '>=14'} + cpu: [x64] + os: [darwin] + + '@xn-sakina/rml-linux-arm-gnueabihf@2.8.0': + resolution: {integrity: sha512-T2S2aGm7mcyIUxkMAni+ClgWp4G8zDe6eApQRNK77G6D/6m25YDrMn+YmVs3TJOA9Qi4RoNaztihni6+B+IOHQ==} + engines: {node: '>=14'} + cpu: [arm] + os: [linux] + + '@xn-sakina/rml-linux-arm64-gnu@2.8.0': + resolution: {integrity: sha512-Vr9lz9vCXXDHaOzAChoxgPeCFn2vTLsZjmxJFBXXcUyN2ixoZacreHE2aro/XdOuX5yNClsIWsTrkZoBY3kAEw==} + engines: {node: '>=14'} + cpu: [arm64] + os: [linux] + + '@xn-sakina/rml-linux-arm64-musl@2.8.0': + resolution: {integrity: sha512-GFDdj1+bzMwoyPhybM83f4aDrLLROYHVcC1+xHNa/zaRp/CI4j66fQwvw1YrTgs+Vk6ZLCm+HtKlA/BO8B9NjQ==} + engines: {node: '>=14'} + cpu: [arm64] + os: [linux] + + '@xn-sakina/rml-linux-x64-gnu@2.8.0': + resolution: {integrity: sha512-2Lha6vIfI5pdIE2Odqovs9KHuJT8S7ql313pYXhUjsxi+da965kLfK1xk0dWs9eo6aEFp4+9Ny+XIIjG2agDZw==} + engines: {node: '>=14'} + cpu: [x64] + os: [linux] + + '@xn-sakina/rml-linux-x64-musl@2.8.0': + resolution: {integrity: sha512-F2/JCzyqOEfFe62WbSf+4/rcK7pyjYpABGmopUJon5GSUVGXRVQOfkkqg6ceufw1ipQUCWsU3Cj0vmd0yvzkmg==} + engines: {node: '>=14'} + cpu: [x64] + os: [linux] + + '@xn-sakina/rml-win32-arm64-msvc@2.8.0': + resolution: {integrity: sha512-ikmzMj9OwRMMtFmE7D4aSi1K1G8C350orJz9ngLTj39p7l0NQeXQfQ0SOah5RQSNWV00XJriJBzVHkWS701xeA==} + engines: {node: '>=14'} + cpu: [arm64] + os: [win32] + + '@xn-sakina/rml-win32-x64-msvc@2.8.0': + resolution: {integrity: sha512-xeyoBIfccb7prfiUVLv0K+1HlLT4vnDfXHSkLpsp4wI0LtYR7sYbiGaMVgNdgR2nDHC+W+65inUHvhY5m7pbnw==} + engines: {node: '>=14'} + cpu: [x64] + os: [win32] + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-escapes@7.3.0: + resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} + engines: {node: '>=18'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + app-root-dir@1.0.2: + resolution: {integrity: sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==} + + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + array-back@3.1.0: + resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} + engines: {node: '>=6'} + + array-back@6.2.3: + resolution: {integrity: sha512-SGDvmg6QTYiTxCBkYVmThcoa67uLl35pyzRHdpCGBOcqFy6BtwnphoFPk7LhJshD+Yk1Kt35WGWeZPTgwR4Fhw==} + engines: {node: '>=12.17'} + + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + assert@2.1.0: + resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + ast-types@0.13.4: + resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} + engines: {node: '>=4'} + + ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} + + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + + async-mutex@0.4.0: + resolution: {integrity: sha512-eJFZ1YhRR8UN8eBLoNzcDPcy/jqjsg6I1AP+KvWQX80BqOSW1oJPJXDylPUEeMr2ZQvHgnQ//Lp6f3RQ1zI7HA==} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axe-core@4.12.0: + resolution: {integrity: sha512-FTavr/7Ba0IptwGOPxnQvdyW2tAsdLBMTBXz7rKH6xJ2skpyxpBxyHkDdBs4lf69yRqYpkqCdfhnwS8YULGOmg==} + engines: {node: '>=4'} + + b4a@1.8.1: + resolution: {integrity: sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==} + peerDependencies: + react-native-b4a: '*' + peerDependenciesMeta: + react-native-b4a: + optional: true + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + bare-events@2.9.1: + resolution: {integrity: sha512-Z0oHEHAFDZkffN8Qc39zNZjQlMDkPJRyyyZieU1VH7u8c5S+qHZ2S8ixdKIAxEjfHO7FJxXmJWgteOghVanIsg==} + peerDependencies: + bare-abort-controller: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true + + bare-fs@4.7.2: + resolution: {integrity: sha512-aTvMFUWkBmjzKtEQMDGGDNF8bkfpD5N1b/FCwt7A3wrU4t1o/e/85Wzkluh6JlODCjqVESYCkQCdTXqZ9G7VFg==} + engines: {bare: '>=1.16.0'} + peerDependencies: + bare-buffer: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + + bare-os@3.9.1: + resolution: {integrity: sha512-6M5XjcnsygQNPMCMPXSK379xrJFiZ/AEMNBmFEmQW8d/789VQATvriyi5r0HYTL9TkQ26rn3kgdTG3aisbrXkQ==} + engines: {bare: '>=1.14.0'} + + bare-path@3.0.1: + resolution: {integrity: sha512-ghj2DSK/2e99a1anTVPCV4m4YIYtrbXhfM7V3D7XZLOTsybnYyaJloymGqssQc8l/or0UoDyRtNQkmkEF/ysgQ==} + + bare-stream@2.13.1: + resolution: {integrity: sha512-Vp0cnjYyrEC4whYTymQ+YZi6pBpfiICZO3cfRG8sy67ZNWe951urv1x4eW1BKNngw3U+3fPYb5JQvHbCtxH7Ow==} + peerDependencies: + bare-abort-controller: '*' + bare-buffer: '*' + bare-events: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true + bare-buffer: + optional: true + bare-events: + optional: true + + bare-url@2.4.3: + resolution: {integrity: sha512-Kccpc7ACfXaxfeInfqKcZtW4pT5YBn1mesc4sCsun6sRwtbJ4h+sNOaksUpYEJUKfN65YWC6Bw2OJEFiKxq8nQ==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + basic-ftp@5.3.1: + resolution: {integrity: sha512-bopVNp6ugyA150DDuZfPFdt1KZ5a94ZDiwX4hMgZDzF+GttD80lEy8kj98kbyhLXnPvhtIo93mdnLIjpCAeeOw==} + engines: {node: '>=10.0.0'} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + body-parser@1.20.5: + resolution: {integrity: sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + brace-expansion@2.1.1: + resolution: {integrity: sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browser-assert@1.2.1: + resolution: {integrity: sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==} + + buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + cache-content-type@1.0.1: + resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} + engines: {node: '>= 6.0.0'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.9: + resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + chai-a11y-axe@1.5.0: + resolution: {integrity: sha512-V/Vg/zJDr9aIkaHJ2KQu7lGTQQm5ZOH4u1k5iTMvIXuSVlSuUo0jcSpSqf9wUn9zl6oQXa4e4E0cqH18KOgKlQ==} + + chai@5.3.3: + resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} + engines: {node: '>=18'} + + chalk-template@0.4.0: + resolution: {integrity: sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==} + engines: {node: '>=12'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + check-error@2.1.3: + resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} + engines: {node: '>= 16'} + + chokidar@3.5.2: + resolution: {integrity: sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==} + engines: {node: '>= 8.10.0'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + chrome-launcher@0.15.2: + resolution: {integrity: sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==} + engines: {node: '>=12.13.0'} + hasBin: true + + chromium-bidi@0.6.3: + resolution: {integrity: sha512-qXlsCmpCZJAnoTYI83Iu6EdYQpMYdVkCfq08KDh2pmlVqK5t5IA9mGs4/LwCwp4fqisSOMXZxP3HIh8w8aRn0A==} + peerDependencies: + devtools-protocol: '*' + + cjs-module-lexer@1.4.3: + resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} + + clean-css@5.3.3: + resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} + engines: {node: '>= 10.0'} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + + cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + + co-body@6.2.0: + resolution: {integrity: sha512-Kbpv2Yd1NdL1V/V4cwLVxraHDV6K8ayohr2rmH0J87Er8+zJjcTa6dAn9QMPC9CRgU8+aNajKbSf1TzDB1yKPA==} + engines: {node: '>=8.0.0'} + + co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + command-line-args@5.1.2: + resolution: {integrity: sha512-fytTsbndLbl+pPWtS0CxLV3BEWw9wJayB8NnU2cbQqVPsNdYezQeT+uIQv009m+GShnMNyuoBrRo8DTmuTfSCA==} + engines: {node: '>=4.0.0'} + + command-line-args@5.2.1: + resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} + engines: {node: '>=4.0.0'} + + command-line-usage@7.0.4: + resolution: {integrity: sha512-85UdvzTNx/+s5CkSgBm/0hzP80RFHAa7PsfeADE5ezZF3uHz3/Tqj9gIKGT9PTtpycc3Ua64T0oVulGfKxzfqg==} + engines: {node: '>=12.20.0'} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + commander@13.1.0: + resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} + engines: {node: '>=18'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + comment-parser@1.2.4: + resolution: {integrity: sha512-pm0b+qv+CkWNriSTMsfnjChF9kH0kxz55y44Wo5le9qLxMj5xDQAaEd9ZN1ovSuk9CsrncWaFwgpOMg7ClJwkw==} + engines: {node: '>= 12.0.0'} + + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + concurrently@8.2.2: + resolution: {integrity: sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==} + engines: {node: ^14.13.0 || >=16.0.0} + hasBin: true + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-signature@1.0.7: + resolution: {integrity: sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + cookies@0.9.1: + resolution: {integrity: sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==} + engines: {node: '>= 0.8'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + css.escape@1.5.1: + resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + custom-elements-manifest@1.0.0: + resolution: {integrity: sha512-j59k0ExGCKA8T6Mzaq+7axc+KVHwpEphEERU7VZ99260npu/p/9kd+Db+I3cGKxHkM5y6q5gnlXn00mzRQkX2A==} + + data-uri-to-buffer@6.0.2: + resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} + engines: {node: '>= 14'} + + date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + + debounce@1.2.1: + resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + + deep-equal@1.0.1: + resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + default-gateway@6.0.3: + resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} + engines: {node: '>= 10'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + degenerator@5.0.1: + resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} + engines: {node: '>= 14'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + + depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + dependency-graph@0.11.0: + resolution: {integrity: sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==} + engines: {node: '>= 0.6.0'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + devtools-protocol@0.0.1312386: + resolution: {integrity: sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA==} + + diff@5.2.2: + resolution: {integrity: sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==} + engines: {node: '>=0.3.1'} + + diff@7.0.0: + resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} + engines: {node: '>=0.3.1'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + + dom-accessibility-api@0.6.3: + resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + + dotenv-expand@10.0.0: + resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} + engines: {node: '>=12'} + + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + + errorstacks@2.4.2: + resolution: {integrity: sha512-aQAkABfX+AsCxWtvh1KGIDkTiYyABsTtZkBb8cd9FWxNnEdrcFEsTxUfi9sc0Jc1mgHC2kW3UtJVadqSuMm/uQ==} + engines: {node: '>=24'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + esbuild-register@3.6.0: + resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} + peerDependencies: + esbuild: '>=0.12 <1' + + esbuild@0.17.19: + resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.24.2: + resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} + engines: {node: '>=18'} + hasBin: true + + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + + events-universal@1.0.1: + resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + express@4.22.2: + resolution: {integrity: sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==} + engines: {node: '>= 0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + + fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-system-cache@2.3.0: + resolution: {integrity: sha512-l4DMNdsIPsVnKrgEXbJwDJsA5mB8rGwHYERMgqQx/xAUtChPJMre1bXBzDEqqVbWv9AIbFezXMxeEkZDSrXUOQ==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + finalhandler@1.3.2: + resolution: {integrity: sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==} + engines: {node: '>= 0.8'} + + find-cache-dir@3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + + find-replace@3.0.0: + resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} + engines: {node: '>=4.0.0'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fs-extra@11.1.1: + resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} + engines: {node: '>=14.14'} + + fs-extra@11.3.5: + resolution: {integrity: sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==} + engines: {node: '>=14.14'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.6.0: + resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} + engines: {node: '>=18'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + get-uri@6.0.5: + resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} + engines: {node: '>= 14'} + + github-slugger@1.5.0: + resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-promise@6.0.7: + resolution: {integrity: sha512-DEAe6br1w8ZF+y6KM2pzgdfhpreladtNvyNNVgSkxxkFWzXTJFXxQrJQQbAnc7kL0EUd7w5cR8u4K0P4+/q+Gw==} + engines: {node: '>=16'} + peerDependencies: + glob: ^8.0.3 + + glob@10.5.0: + resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + hasBin: true + + globby@11.0.4: + resolution: {integrity: sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==} + engines: {node: '>=10'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + handlebars@4.7.9: + resolution: {integrity: sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==} + engines: {node: '>=0.4.7'} + hasBin: true + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + html-minifier-terser@7.2.0: + resolution: {integrity: sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==} + engines: {node: ^14.13.1 || >=16.0.0} + hasBin: true + + http-assert@1.5.0: + resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} + engines: {node: '>= 0.8'} + + http-errors@1.6.3: + resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} + engines: {node: '>= 0.6'} + + http-errors@1.8.1: + resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} + engines: {node: '>= 0.6'} + + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + husky@8.0.3: + resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} + engines: {node: '>=14'} + hasBin: true + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + inflation@2.1.0: + resolution: {integrity: sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==} + engines: {node: '>= 0.8.0'} + + inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + internal-ip@6.2.0: + resolution: {integrity: sha512-D8WGsR6yDt8uq7vDMu7mjcR+yRMm3dW8yufyChmszWRjcSHuxLBkR3GdS2HZAjodsaGuCvXeEJpueisXJULghg==} + engines: {node: '>=10'} + + ip-address@10.2.0: + resolution: {integrity: sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==} + engines: {node: '>= 12'} + + ip-regex@4.3.0: + resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} + engines: {node: '>=8'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-absolute-url@3.0.3: + resolution: {integrity: sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==} + engines: {node: '>=8'} + + is-arguments@1.2.0: + resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} + engines: {node: '>= 0.4'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.2: + resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} + engines: {node: '>= 0.4'} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + + is-fullwidth-code-point@5.1.0: + resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} + engines: {node: '>=18'} + + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-ip@3.1.0: + resolution: {integrity: sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==} + engines: {node: '>=8'} + + is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + + is-nan@1.3.2: + resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-reference@3.0.3: + resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + isbinaryfile@5.0.7: + resolution: {integrity: sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==} + engines: {node: '>= 18.0.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} + engines: {node: '>=8'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + jsonfile@6.2.1: + resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} + + just-extend@6.2.0: + resolution: {integrity: sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==} + + keygrip@1.1.0: + resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} + engines: {node: '>= 0.6'} + + koa-compose@4.1.0: + resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} + + koa-convert@2.0.0: + resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} + engines: {node: '>= 10'} + + koa-etag@4.0.0: + resolution: {integrity: sha512-1cSdezCkBWlyuB9l6c/IFoe1ANCDdPBxkDkRiaIup40xpUub6U/wwRXoKBZw/O5BifX9OlqAjYnDyzM6+l+TAg==} + + koa-send@5.0.1: + resolution: {integrity: sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==} + engines: {node: '>= 8'} + + koa-static@5.0.0: + resolution: {integrity: sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==} + engines: {node: '>= 7.6.0'} + + koa@2.16.4: + resolution: {integrity: sha512-3An0GCLDSR34tsCO4H8Tef8Pp2ngtaZDAZnsWJYelqXUK5wyiHvGItgK/xcSkmHLSTn1Jcho1mRQs2ehRzvKKw==} + engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} + + lazy-universal-dotenv@4.0.0: + resolution: {integrity: sha512-aXpZJRnTkpK6gQ/z4nk+ZBLd/Qdp118cvPruLSIQzQNRhKwEcdXCOzXuF55VDqIiuAaY3UGZ10DJtvZzDcvsxg==} + engines: {node: '>=14.0.0'} + + lighthouse-logger@1.4.2: + resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==} + + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lint-staged@15.5.2: + resolution: {integrity: sha512-YUSOLq9VeRNAo/CTaVmhGDKG+LBtA8KF1X4K5+ykMSwWST1vDxJRB2kv2COgLb1fvpCo+A/y9A0G0znNVmdx4w==} + engines: {node: '>=18.12.0'} + hasBin: true + + listr2@8.3.3: + resolution: {integrity: sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==} + engines: {node: '>=18.0.0'} + + lit-element@4.2.2: + resolution: {integrity: sha512-aFKhNToWxoyhkNDmWZwEva2SlQia+jfG0fjIWV//YeTaWrVnOxD89dPKfigCUspXFmjzOEUQpOkejH5Ly6sG0w==} + + lit-html@3.3.3: + resolution: {integrity: sha512-el8M6jK2o3RXBnrSHX3ZKrsN8zEV63pSExTO1wYJz7QndGYZ8353e2a5PPX+qHe2aGayfnchQmkAojaWAREOIA==} + + lit@3.3.3: + resolution: {integrity: sha512-fycuvZg/hkpozL00lm1pEJH5nN/lr9ZXd6mJI2HSN4+Bzc+LDNdEApJ6HFbPkdFNHLvOplIIuJvxkS4XUxqirw==} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash-es@4.18.1: + resolution: {integrity: sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash@4.18.1: + resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} + + log-update@4.0.0: + resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} + engines: {node: '>=10'} + + log-update@6.1.0: + resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} + engines: {node: '>=18'} + + loupe@3.2.1: + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + + lru-cache@8.0.5: + resolution: {integrity: sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==} + engines: {node: '>=16.14'} + + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + map-or-similar@1.5.0: + resolution: {integrity: sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==} + + marky@1.3.0: + resolution: {integrity: sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mdast-util-definitions@4.0.0: + resolution: {integrity: sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==} + + mdast-util-to-string@1.1.0: + resolution: {integrity: sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + memoizerific@1.11.3: + resolution: {integrity: sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==} + + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimatch@9.0.9: + resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} + + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanocolors@0.2.13: + resolution: {integrity: sha512-0n3mSAQLPpGLV9ORXT5+C/D4mwew7Ebws69Hx4E2sgz2ZA5+32Q80B9tL8PbL7XHnRDiAxH/pnrUJ9a4fkTNTA==} + + nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + netmask@2.1.1: + resolution: {integrity: sha512-eonl3sLUha+S1GzTPxychyhnUzKyeQkZ7jLjKrBagJgPla13F+uQ71HgpFefyHgqrjEbCPkDArxYsjY8/+gLKA==} + engines: {node: '>= 0.4.0'} + + nise@6.1.5: + resolution: {integrity: sha512-SnRDPDBjxZZoU2n0+gzzLtSvo1OZo7j6jnbXsoh3AFxEGhaFU7ZF0TmefuKERq79wxR2U+MPn7ArW+Tl+clC3A==} + + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + + only@0.0.2: + resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + + p-event@4.2.0: + resolution: {integrity: sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==} + engines: {node: '>=8'} + + p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-timeout@3.2.0: + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + pac-proxy-agent@7.2.0: + resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==} + engines: {node: '>= 14'} + + pac-resolver@7.0.1: + resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} + engines: {node: '>= 14'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + + parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-to-regexp@0.1.13: + resolution: {integrity: sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==} + + path-to-regexp@8.4.2: + resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} + engines: {node: '>= 14.16'} + + pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} + + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + + pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pkg-dir@5.0.0: + resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} + engines: {node: '>=10'} + + portfinder@1.0.38: + resolution: {integrity: sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg==} + engines: {node: '>= 10.12'} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + postcss@8.5.15: + resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} + engines: {node: ^10 || ^12 || >=14} + + pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + pretty-hrtime@1.0.3: + resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} + engines: {node: '>= 0.8'} + + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + proxy-agent@6.5.0: + resolution: {integrity: sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==} + engines: {node: '>= 14'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + pump@3.0.4: + resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + puppeteer-core@22.15.0: + resolution: {integrity: sha512-cHArnywCiAAVXa3t4GGL2vttNxh7GqXtIYGym99egkNJ3oG//wL9LkvO4WE8W1TJe95t1F1ocu9X4xWaGsOKOA==} + engines: {node: '>=18'} + + qs@6.15.2: + resolution: {integrity: sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==} + engines: {node: '>=0.6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + ramda@0.29.0: + resolution: {integrity: sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.3: + resolution: {integrity: sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==} + engines: {node: '>= 0.8'} + + react-dom@19.2.7: + resolution: {integrity: sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==} + peerDependencies: + react: ^19.2.7 + + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + + react@19.2.7: + resolution: {integrity: sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==} + engines: {node: '>=0.10.0'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + recast@0.23.11: + resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} + engines: {node: '>= 4'} + + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + + relateurl@0.2.7: + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} + engines: {node: '>= 0.10'} + + remark-external-links@8.0.0: + resolution: {integrity: sha512-5vPSX0kHoSsqtdftSHhIYofVINC8qmp0nctkeU9YoJwV3YfiBRiI6cbFRJ0oI/1F9xS+bopXG0m2KS8VFscuKA==} + + remark-slug@6.1.0: + resolution: {integrity: sha512-oGCxDF9deA8phWvxFuyr3oSJsdyUAxMFbA0mZ7Y1Sas+emILtO+e5WutF9564gDsEN4IXaQXm5pFo6MLH+YmwQ==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-path@1.4.0: + resolution: {integrity: sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==} + engines: {node: '>= 0.8'} + + resolve@1.22.12: + resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} + engines: {node: '>= 0.4'} + hasBin: true + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rolldown@1.0.3: + resolution: {integrity: sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + rollup-plugin-external-globals@0.9.2: + resolution: {integrity: sha512-BUzbNhcN20irgWFNOL9XYSAN8pVRL7BfyZJce7oJMxjgPuxMOlQo3oTp3LRH1ehddXQEnp0/XxglMisl/GhnJQ==} + peerDependencies: + rollup: ^2.25.0 || ^3.3.0 || ^4.1.4 + + rollup@4.61.0: + resolution: {integrity: sha512-T9mWdbWfQtp0B5lv/HX+wrhYsmXRlcWnXXmJbXqKJhlRaoS6KMhq0gpyzW4UJfclcxrEdLnTgjT2NjruLONu0g==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + rs-module-lexer@2.8.0: + resolution: {integrity: sha512-/KvawAdE1TpykHA2mJwKcqqcgPj0Rqn0Dj7qqClHOTat17yZSmWFtE0eLmpzMnHQrQbPk0hY1e9ppK+3o3M0Uw==} + engines: {node: '>=14'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.8.1: + resolution: {integrity: sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==} + engines: {node: '>=10'} + hasBin: true + + send@0.19.2: + resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} + engines: {node: '>= 0.8.0'} + + serve-static@1.16.3: + resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==} + engines: {node: '>= 0.8.0'} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + setprototypeof@1.1.0: + resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.8.4: + resolution: {integrity: sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ==} + engines: {node: '>= 0.4'} + + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sinon@19.0.5: + resolution: {integrity: sha512-r15s9/s+ub/d4bxNXqIUmwp6imVSdTorIRaxoecYjqTVLZ8RuoXr/4EDGwIBo6Waxn7f2gnURX9zuhAfCwaF6Q==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + + slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + + slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + + slice-ansi@7.1.2: + resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} + engines: {node: '>=18'} + + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + socks-proxy-agent@8.0.5: + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} + engines: {node: '>= 14'} + + socks@2.8.9: + resolution: {integrity: sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + + space-separated-tokens@1.1.5: + resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} + + spawn-command@0.0.2: + resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} + + statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + + store2@2.14.4: + resolution: {integrity: sha512-srTItn1GOvyvOycgxjAnPA63FZNwy0PTyUBFMHRM+hVFltAeoh0LmNBz9SZqUS9mMqGk8rfyWyXn3GH5ReJ8Zw==} + + storybook@10.1.5: + resolution: {integrity: sha512-q3xB1pOcmmHUH9LfQNY/BWMGxp3fc1OALJf+F5BXIxHGQUEIizz6V1AbDOngWN9oWzuA8Gdz5rOCe7yelOMWVg==} + hasBin: true + peerDependencies: + prettier: ^2 || ^3 + peerDependenciesMeta: + prettier: + optional: true + + streamx@2.26.0: + resolution: {integrity: sha512-VvNG1K72Po/xwJzxZFnZ++Tbrv4lwSptsbkFuzXCJAYZvCK5nnxsvXU6ajqkv7chyiI1Y0YXq2Jh8Iy8Y7NF/A==} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + synchronous-promise@2.0.17: + resolution: {integrity: sha512-AsS729u2RHUfEra9xJrE39peJcc2stq2+poBXX8bcM08Y6g9j/i/PUzwNQqkaJde7Ntg1TO7bSREbR5sdosQ+g==} + + table-layout@4.1.1: + resolution: {integrity: sha512-iK5/YhZxq5GO5z8wb0bY1317uDF3Zjpha0QFFLA8/trAoiLbQD0HUbMesEaxyzUgDxi2QlcbM8IvqOlEjgoXBA==} + engines: {node: '>=12.17'} + + tar-fs@3.1.2: + resolution: {integrity: sha512-QGxxTxxyleAdyM3kpFs14ymbYmNFrfY+pHj7Z8FgtbZ7w2//VAgLMac7sT6nRpIHjppXO2AwwEOg0bPFVRcmXw==} + + tar-stream@3.2.0: + resolution: {integrity: sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==} + + teex@1.0.1: + resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} + + telejson@7.2.0: + resolution: {integrity: sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ==} + + terser@5.48.0: + resolution: {integrity: sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==} + engines: {node: '>=10'} + hasBin: true + + text-decoder@1.2.7: + resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + + tinyspy@4.0.4: + resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} + engines: {node: '>=14.0.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tr46@5.1.1: + resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} + engines: {node: '>=18'} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsscmp@1.0.6: + resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} + engines: {node: '>=0.6.x'} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + engines: {node: '>=4'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + engines: {node: '>=14.17'} + hasBin: true + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + typical@4.0.0: + resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} + engines: {node: '>=8'} + + typical@7.3.0: + resolution: {integrity: sha512-ya4mg/30vm+DOWfBg4YK3j2WD6TWtRkCbasOJr40CseYENzCUby/7rIvXA99JGsQHeNxLbnXdyLLxKSv3tauFw==} + engines: {node: '>=12.17'} + + ua-parser-js@1.0.41: + resolution: {integrity: sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug==} + hasBin: true + + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + + unbzip2-stream@1.4.3: + resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + undici-types@7.24.6: + resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} + + unist-util-is@4.1.0: + resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} + + unist-util-visit-parents@3.1.1: + resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} + + unist-util-visit@2.0.3: + resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + unplugin@2.3.11: + resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} + engines: {node: '>=18.12.0'} + + urlpattern-polyfill@10.0.0: + resolution: {integrity: sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==} + + use-sync-external-store@1.6.0: + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + v8-to-istanbul@9.3.0: + resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} + engines: {node: '>=10.12.0'} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vite@8.0.16: + resolution: {integrity: sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.1.18 + esbuild: ^0.27.0 || ^0.28.0 + jiti: '>=1.21.0' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + + whatwg-url@14.2.0: + resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} + engines: {node: '>=18'} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-typed-array@1.1.21: + resolution: {integrity: sha512-zbRA8cVm6io/d5W8uIe2hblzN76/Wm3v/yiythQvr+dpBWeqhPSWIDNj4zOyHi4zKbMK6DN34Xsr9jPHJERAEw==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + + wordwrapjs@5.1.1: + resolution: {integrity: sha512-0yweIbkINJodk27gX9LBGMzyQdBDan3s/dEAiwBOj+Mf0PPyWL6/rikalkv8EeD0E8jm4o5RXEOrFTP3NXbhJg==} + engines: {node: '>=12.17'} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@7.5.11: + resolution: {integrity: sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.21.0: + resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + + ylru@1.4.0: + resolution: {integrity: sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==} + engines: {node: '>= 4.0.0'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zod@3.23.8: + resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + +snapshots: + + '@adobe/css-tools@4.5.0': {} + + '@babel/code-frame@7.29.7': + dependencies: + '@babel/helper-validator-identifier': 7.29.7 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/helper-string-parser@7.29.7': {} + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/parser@7.29.7': + dependencies: + '@babel/types': 7.29.7 + + '@babel/runtime@7.29.7': {} + + '@babel/types@7.29.7': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + + '@biomejs/biome@2.4.16': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 2.4.16 + '@biomejs/cli-darwin-x64': 2.4.16 + '@biomejs/cli-linux-arm64': 2.4.16 + '@biomejs/cli-linux-arm64-musl': 2.4.16 + '@biomejs/cli-linux-x64': 2.4.16 + '@biomejs/cli-linux-x64-musl': 2.4.16 + '@biomejs/cli-win32-arm64': 2.4.16 + '@biomejs/cli-win32-x64': 2.4.16 + + '@biomejs/cli-darwin-arm64@2.4.16': + optional: true + + '@biomejs/cli-darwin-x64@2.4.16': + optional: true + + '@biomejs/cli-linux-arm64-musl@2.4.16': + optional: true + + '@biomejs/cli-linux-arm64@2.4.16': + optional: true + + '@biomejs/cli-linux-x64-musl@2.4.16': + optional: true + + '@biomejs/cli-linux-x64@2.4.16': + optional: true + + '@biomejs/cli-win32-arm64@2.4.16': + optional: true + + '@biomejs/cli-win32-x64@2.4.16': + optional: true + + '@corti/sdk@3.0.0': + dependencies: + ws: 8.21.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@custom-elements-manifest/analyzer@0.10.10': + dependencies: + '@custom-elements-manifest/find-dependencies': 0.0.6 + '@github/catalyst': 1.8.1 + '@web/config-loader': 0.1.3 + chokidar: 3.5.2 + command-line-args: 5.1.2 + comment-parser: 1.2.4 + custom-elements-manifest: 1.0.0 + debounce: 1.2.1 + globby: 11.0.4 + typescript: 5.4.5 + + '@custom-elements-manifest/find-dependencies@0.0.6': + dependencies: + rs-module-lexer: 2.8.0 + + '@emnapi/core@1.10.0': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.10.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@19.2.7)': + dependencies: + react: 19.2.7 + + '@esbuild/aix-ppc64@0.24.2': + optional: true + + '@esbuild/aix-ppc64@0.25.12': + optional: true + + '@esbuild/android-arm64@0.17.19': + optional: true + + '@esbuild/android-arm64@0.18.20': + optional: true + + '@esbuild/android-arm64@0.24.2': + optional: true + + '@esbuild/android-arm64@0.25.12': + optional: true + + '@esbuild/android-arm@0.17.19': + optional: true + + '@esbuild/android-arm@0.18.20': + optional: true + + '@esbuild/android-arm@0.24.2': + optional: true + + '@esbuild/android-arm@0.25.12': + optional: true + + '@esbuild/android-x64@0.17.19': + optional: true + + '@esbuild/android-x64@0.18.20': + optional: true + + '@esbuild/android-x64@0.24.2': + optional: true + + '@esbuild/android-x64@0.25.12': + optional: true + + '@esbuild/darwin-arm64@0.17.19': + optional: true + + '@esbuild/darwin-arm64@0.18.20': + optional: true + + '@esbuild/darwin-arm64@0.24.2': + optional: true + + '@esbuild/darwin-arm64@0.25.12': + optional: true + + '@esbuild/darwin-x64@0.17.19': + optional: true + + '@esbuild/darwin-x64@0.18.20': + optional: true + + '@esbuild/darwin-x64@0.24.2': + optional: true + + '@esbuild/darwin-x64@0.25.12': + optional: true + + '@esbuild/freebsd-arm64@0.17.19': + optional: true + + '@esbuild/freebsd-arm64@0.18.20': + optional: true + + '@esbuild/freebsd-arm64@0.24.2': + optional: true + + '@esbuild/freebsd-arm64@0.25.12': + optional: true + + '@esbuild/freebsd-x64@0.17.19': + optional: true + + '@esbuild/freebsd-x64@0.18.20': + optional: true + + '@esbuild/freebsd-x64@0.24.2': + optional: true + + '@esbuild/freebsd-x64@0.25.12': + optional: true + + '@esbuild/linux-arm64@0.17.19': + optional: true + + '@esbuild/linux-arm64@0.18.20': + optional: true + + '@esbuild/linux-arm64@0.24.2': + optional: true + + '@esbuild/linux-arm64@0.25.12': + optional: true + + '@esbuild/linux-arm@0.17.19': + optional: true + + '@esbuild/linux-arm@0.18.20': + optional: true + + '@esbuild/linux-arm@0.24.2': + optional: true + + '@esbuild/linux-arm@0.25.12': + optional: true + + '@esbuild/linux-ia32@0.17.19': + optional: true + + '@esbuild/linux-ia32@0.18.20': + optional: true + + '@esbuild/linux-ia32@0.24.2': + optional: true + + '@esbuild/linux-ia32@0.25.12': + optional: true + + '@esbuild/linux-loong64@0.17.19': + optional: true + + '@esbuild/linux-loong64@0.18.20': + optional: true + + '@esbuild/linux-loong64@0.24.2': + optional: true + + '@esbuild/linux-loong64@0.25.12': + optional: true + + '@esbuild/linux-mips64el@0.17.19': + optional: true + + '@esbuild/linux-mips64el@0.18.20': + optional: true + + '@esbuild/linux-mips64el@0.24.2': + optional: true + + '@esbuild/linux-mips64el@0.25.12': + optional: true + + '@esbuild/linux-ppc64@0.17.19': + optional: true + + '@esbuild/linux-ppc64@0.18.20': + optional: true + + '@esbuild/linux-ppc64@0.24.2': + optional: true + + '@esbuild/linux-ppc64@0.25.12': + optional: true + + '@esbuild/linux-riscv64@0.17.19': + optional: true + + '@esbuild/linux-riscv64@0.18.20': + optional: true + + '@esbuild/linux-riscv64@0.24.2': + optional: true + + '@esbuild/linux-riscv64@0.25.12': + optional: true + + '@esbuild/linux-s390x@0.17.19': + optional: true + + '@esbuild/linux-s390x@0.18.20': + optional: true + + '@esbuild/linux-s390x@0.24.2': + optional: true + + '@esbuild/linux-s390x@0.25.12': + optional: true + + '@esbuild/linux-x64@0.17.19': + optional: true + + '@esbuild/linux-x64@0.18.20': + optional: true + + '@esbuild/linux-x64@0.24.2': + optional: true + + '@esbuild/linux-x64@0.25.12': + optional: true + + '@esbuild/netbsd-arm64@0.24.2': + optional: true + + '@esbuild/netbsd-arm64@0.25.12': + optional: true + + '@esbuild/netbsd-x64@0.17.19': + optional: true + + '@esbuild/netbsd-x64@0.18.20': + optional: true + + '@esbuild/netbsd-x64@0.24.2': + optional: true + + '@esbuild/netbsd-x64@0.25.12': + optional: true + + '@esbuild/openbsd-arm64@0.24.2': + optional: true + + '@esbuild/openbsd-arm64@0.25.12': + optional: true + + '@esbuild/openbsd-x64@0.17.19': + optional: true + + '@esbuild/openbsd-x64@0.18.20': + optional: true + + '@esbuild/openbsd-x64@0.24.2': + optional: true + + '@esbuild/openbsd-x64@0.25.12': + optional: true + + '@esbuild/openharmony-arm64@0.25.12': + optional: true + + '@esbuild/sunos-x64@0.17.19': + optional: true + + '@esbuild/sunos-x64@0.18.20': + optional: true + + '@esbuild/sunos-x64@0.24.2': + optional: true + + '@esbuild/sunos-x64@0.25.12': + optional: true + + '@esbuild/win32-arm64@0.17.19': + optional: true + + '@esbuild/win32-arm64@0.18.20': + optional: true + + '@esbuild/win32-arm64@0.24.2': + optional: true + + '@esbuild/win32-arm64@0.25.12': + optional: true + + '@esbuild/win32-ia32@0.17.19': + optional: true + + '@esbuild/win32-ia32@0.18.20': + optional: true + + '@esbuild/win32-ia32@0.24.2': + optional: true + + '@esbuild/win32-ia32@0.25.12': + optional: true + + '@esbuild/win32-x64@0.17.19': + optional: true + + '@esbuild/win32-x64@0.18.20': + optional: true + + '@esbuild/win32-x64@0.24.2': + optional: true + + '@esbuild/win32-x64@0.25.12': + optional: true + + '@esm-bundle/chai@4.3.4-fix.0': + dependencies: + '@types/chai': 4.3.20 + + '@github/catalyst@1.8.1': {} + + '@hapi/bourne@3.0.0': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.2.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/source-map@0.3.11': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@lit-labs/ssr-dom-shim@1.6.0': {} + + '@lit/context@1.1.6': + dependencies: + '@lit/reactive-element': 2.1.2 + + '@lit/reactive-element@2.1.2': + dependencies: + '@lit-labs/ssr-dom-shim': 1.6.0 + + '@mdn/browser-compat-data@4.2.1': {} + + '@mdx-js/react@3.1.1(@types/react@19.2.16)(react@19.2.7)': + dependencies: + '@types/mdx': 2.0.13 + '@types/react': 19.2.16 + react: 19.2.7 + + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.2 + optional: true + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + + '@open-wc/dedupe-mixin@2.0.1': {} + + '@open-wc/scoped-elements@3.0.10': + dependencies: + '@open-wc/dedupe-mixin': 2.0.1 + lit: 3.3.3 + + '@open-wc/semantic-dom-diff@0.20.1': + dependencies: + '@types/chai': 4.3.20 + '@web/test-runner-commands': 0.9.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@open-wc/testing-helpers@3.0.1': + dependencies: + '@open-wc/scoped-elements': 3.0.10 + lit: 3.3.3 + lit-html: 3.3.3 + + '@open-wc/testing@4.0.0': + dependencies: + '@esm-bundle/chai': 4.3.4-fix.0 + '@open-wc/semantic-dom-diff': 0.20.1 + '@open-wc/testing-helpers': 3.0.1 + '@types/chai-dom': 1.11.3 + '@types/sinon-chai': 3.2.12 + chai-a11y-axe: 1.5.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@oxc-project/types@0.133.0': {} + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@puppeteer/browsers@2.3.0': + dependencies: + debug: 4.4.3 + extract-zip: 2.0.1 + progress: 2.0.3 + proxy-agent: 6.5.0 + semver: 7.8.1 + tar-fs: 3.1.2 + unbzip2-stream: 1.4.3 + yargs: 17.7.2 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + - supports-color + + '@rolldown/binding-android-arm64@1.0.3': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.3': + optional: true + + '@rolldown/binding-darwin-x64@1.0.3': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.3': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.3': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.3': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.3': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.0.3': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.0.3': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.3': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.3': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.3': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.3': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.3': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.3': + optional: true + + '@rolldown/pluginutils@1.0.1': {} + + '@rollup/plugin-node-resolve@15.3.1(rollup@4.61.0)': + dependencies: + '@rollup/pluginutils': 5.4.0(rollup@4.61.0) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.12 + optionalDependencies: + rollup: 4.61.0 + + '@rollup/pluginutils@5.4.0(rollup@4.61.0)': + dependencies: + '@types/estree': 1.0.9 + estree-walker: 2.0.2 + picomatch: 4.0.4 + optionalDependencies: + rollup: 4.61.0 + + '@rollup/rollup-android-arm-eabi@4.61.0': + optional: true + + '@rollup/rollup-android-arm64@4.61.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.61.0': + optional: true + + '@rollup/rollup-darwin-x64@4.61.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.61.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.61.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.61.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.61.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.61.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.61.0': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.61.0': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.61.0': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.61.0': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.61.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.61.0': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.61.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.61.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.61.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.61.0': + optional: true + + '@rollup/rollup-openbsd-x64@4.61.0': + optional: true + + '@rollup/rollup-openharmony-arm64@4.61.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.61.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.61.0': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.61.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.61.0': + optional: true + + '@sinonjs/commons@3.0.1': + dependencies: + type-detect: 4.0.8 + + '@sinonjs/fake-timers@13.0.5': + dependencies: + '@sinonjs/commons': 3.0.1 + + '@sinonjs/fake-timers@15.4.0': + dependencies: + '@sinonjs/commons': 3.0.1 + + '@sinonjs/samsam@8.0.3': + dependencies: + '@sinonjs/commons': 3.0.1 + type-detect: 4.1.0 + + '@storybook/addon-a11y@10.1.5(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))': + dependencies: + '@storybook/global': 5.0.0 + axe-core: 4.12.0 + storybook: 10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + + '@storybook/addon-docs@10.4.2(@types/react@19.2.16)(esbuild@0.25.12)(rollup@4.61.0)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.1)(esbuild@0.25.12)(terser@5.48.0)(yaml@2.9.0))': + dependencies: + '@mdx-js/react': 3.1.1(@types/react@19.2.16)(react@19.2.7) + '@storybook/csf-plugin': 10.4.2(esbuild@0.25.12)(rollup@4.61.0)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.1)(esbuild@0.25.12)(terser@5.48.0)(yaml@2.9.0)) + '@storybook/icons': 2.0.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@storybook/react-dom-shim': 10.4.2(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + storybook: 10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + ts-dedent: 2.2.0 + optionalDependencies: + '@types/react': 19.2.16 + transitivePeerDependencies: + - '@types/react-dom' + - esbuild + - rollup + - vite + - webpack + + '@storybook/addon-links@10.1.5(react@19.2.7)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))': + dependencies: + '@storybook/global': 5.0.0 + storybook: 10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + optionalDependencies: + react: 19.2.7 + + '@storybook/builder-vite@10.4.2(esbuild@0.25.12)(rollup@4.61.0)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.1)(esbuild@0.25.12)(terser@5.48.0)(yaml@2.9.0))': + dependencies: + '@storybook/csf-plugin': 10.4.2(esbuild@0.25.12)(rollup@4.61.0)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.1)(esbuild@0.25.12)(terser@5.48.0)(yaml@2.9.0)) + storybook: 10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + ts-dedent: 2.2.0 + vite: 8.0.16(@types/node@25.9.1)(esbuild@0.25.12)(terser@5.48.0)(yaml@2.9.0) + transitivePeerDependencies: + - esbuild + - rollup + - webpack + + '@storybook/channels@7.6.24': + dependencies: + '@storybook/client-logger': 7.6.24 + '@storybook/core-events': 7.6.24 + '@storybook/global': 5.0.0 + qs: 6.15.2 + telejson: 7.2.0 + tiny-invariant: 1.3.3 + + '@storybook/client-logger@7.6.24': + dependencies: + '@storybook/global': 5.0.0 + + '@storybook/core-client@7.6.24': + dependencies: + '@storybook/client-logger': 7.6.24 + '@storybook/preview-api': 7.6.24 + + '@storybook/core-common@7.6.24': + dependencies: + '@storybook/core-events': 7.6.24 + '@storybook/node-logger': 7.6.24 + '@storybook/types': 7.6.24 + '@types/find-cache-dir': 3.2.1 + '@types/node': 18.19.130 + '@types/node-fetch': 2.6.13 + '@types/pretty-hrtime': 1.0.3 + chalk: 4.1.2 + esbuild: 0.18.20 + esbuild-register: 3.6.0(esbuild@0.18.20) + file-system-cache: 2.3.0 + find-cache-dir: 3.3.2 + find-up: 5.0.0 + fs-extra: 11.3.5 + glob: 10.5.0 + handlebars: 4.7.9 + lazy-universal-dotenv: 4.0.0 + node-fetch: 2.7.0 + picomatch: 2.3.2 + pkg-dir: 5.0.0 + pretty-hrtime: 1.0.3 + resolve-from: 5.0.0 + ts-dedent: 2.2.0 + transitivePeerDependencies: + - encoding + - supports-color + + '@storybook/core-events@7.6.24': + dependencies: + ts-dedent: 2.2.0 + + '@storybook/csf-plugin@10.4.2(esbuild@0.25.12)(rollup@4.61.0)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.1)(esbuild@0.25.12)(terser@5.48.0)(yaml@2.9.0))': + dependencies: + storybook: 10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + unplugin: 2.3.11 + optionalDependencies: + esbuild: 0.25.12 + rollup: 4.61.0 + vite: 8.0.16(@types/node@25.9.1)(esbuild@0.25.12)(terser@5.48.0)(yaml@2.9.0) + + '@storybook/csf@0.1.13': + dependencies: + type-fest: 2.19.0 + + '@storybook/docs-tools@7.6.24': + dependencies: + '@storybook/core-common': 7.6.24 + '@storybook/preview-api': 7.6.24 + '@storybook/types': 7.6.24 + '@types/doctrine': 0.0.3 + assert: 2.1.0 + doctrine: 3.0.0 + lodash: 4.18.1 + transitivePeerDependencies: + - encoding + - supports-color + + '@storybook/global@5.0.0': {} + + '@storybook/icons@2.0.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + + '@storybook/manager-api@7.6.24(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@storybook/channels': 7.6.24 + '@storybook/client-logger': 7.6.24 + '@storybook/core-events': 7.6.24 + '@storybook/csf': 0.1.13 + '@storybook/global': 5.0.0 + '@storybook/router': 7.6.24 + '@storybook/theming': 7.6.24(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@storybook/types': 7.6.24 + dequal: 2.0.3 + lodash: 4.18.1 + memoizerific: 1.11.3 + store2: 2.14.4 + telejson: 7.2.0 + ts-dedent: 2.2.0 + transitivePeerDependencies: + - react + - react-dom + + '@storybook/mdx2-csf@1.1.0': {} + + '@storybook/node-logger@7.6.24': {} + + '@storybook/preview-api@7.6.24': + dependencies: + '@storybook/channels': 7.6.24 + '@storybook/client-logger': 7.6.24 + '@storybook/core-events': 7.6.24 + '@storybook/csf': 0.1.13 + '@storybook/global': 5.0.0 + '@storybook/types': 7.6.24 + '@types/qs': 6.15.1 + dequal: 2.0.3 + lodash: 4.18.1 + memoizerific: 1.11.3 + qs: 6.15.2 + synchronous-promise: 2.0.17 + ts-dedent: 2.2.0 + util-deprecate: 1.0.2 + + '@storybook/preview@7.6.24': {} + + '@storybook/react-dom-shim@10.4.2(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))': + dependencies: + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + storybook: 10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.16 + + '@storybook/router@7.6.24': + dependencies: + '@storybook/client-logger': 7.6.24 + memoizerific: 1.11.3 + qs: 6.15.2 + + '@storybook/theming@7.6.24(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.2.7) + '@storybook/client-logger': 7.6.24 + '@storybook/global': 5.0.0 + memoizerific: 1.11.3 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + + '@storybook/types@7.6.24': + dependencies: + '@storybook/channels': 7.6.24 + '@types/babel__core': 7.20.5 + '@types/express': 4.17.25 + file-system-cache: 2.3.0 + + '@storybook/web-components-vite@10.4.2(esbuild@0.25.12)(lit@3.3.3)(rollup@4.61.0)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.1)(esbuild@0.25.12)(terser@5.48.0)(yaml@2.9.0))': + dependencies: + '@storybook/builder-vite': 10.4.2(esbuild@0.25.12)(rollup@4.61.0)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.1)(esbuild@0.25.12)(terser@5.48.0)(yaml@2.9.0)) + '@storybook/web-components': 10.4.2(lit@3.3.3)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)) + storybook: 10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + vite: 8.0.16(@types/node@25.9.1)(esbuild@0.25.12)(terser@5.48.0)(yaml@2.9.0) + transitivePeerDependencies: + - esbuild + - lit + - rollup + - webpack + + '@storybook/web-components@10.1.5(lit@3.3.3)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))': + dependencies: + '@storybook/global': 5.0.0 + lit: 3.3.3 + storybook: 10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + tiny-invariant: 1.3.3 + ts-dedent: 2.2.0 + + '@storybook/web-components@10.4.2(lit@3.3.3)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))': + dependencies: + '@storybook/global': 5.0.0 + lit: 3.3.3 + storybook: 10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + tiny-invariant: 1.3.3 + ts-dedent: 2.2.0 + + '@storybook/web-components@7.6.24(lit@3.3.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@storybook/client-logger': 7.6.24 + '@storybook/core-client': 7.6.24 + '@storybook/docs-tools': 7.6.24 + '@storybook/global': 5.0.0 + '@storybook/manager-api': 7.6.24(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@storybook/preview-api': 7.6.24 + '@storybook/types': 7.6.24 + lit: 3.3.3 + tiny-invariant: 1.3.3 + ts-dedent: 2.2.0 + transitivePeerDependencies: + - encoding + - react + - react-dom + - supports-color + + '@testing-library/dom@10.4.1': + dependencies: + '@babel/code-frame': 7.29.7 + '@babel/runtime': 7.29.7 + '@types/aria-query': 5.0.4 + aria-query: 5.3.0 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + picocolors: 1.1.1 + pretty-format: 27.5.1 + + '@testing-library/jest-dom@6.9.1': + dependencies: + '@adobe/css-tools': 4.5.0 + aria-query: 5.3.2 + css.escape: 1.5.1 + dom-accessibility-api: 0.6.3 + picocolors: 1.1.1 + redent: 3.0.0 + + '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.1)': + dependencies: + '@testing-library/dom': 10.4.1 + + '@tootallnate/quickjs-emscripten@0.23.0': {} + + '@tybys/wasm-util@0.10.2': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/accepts@1.3.7': + dependencies: + '@types/node': 25.9.1 + + '@types/aria-query@5.0.4': {} + + '@types/babel__code-frame@7.27.0': {} + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.28.0 + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.29.7 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + + '@types/babel__traverse@7.28.0': + dependencies: + '@babel/types': 7.29.7 + + '@types/body-parser@1.19.6': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 25.9.1 + + '@types/chai-dom@1.11.3': + dependencies: + '@types/chai': 5.2.3 + + '@types/chai@4.3.20': {} + + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + + '@types/co-body@6.1.3': + dependencies: + '@types/node': 25.9.1 + '@types/qs': 6.15.1 + + '@types/command-line-args@5.2.3': {} + + '@types/connect@3.4.38': + dependencies: + '@types/node': 25.9.1 + + '@types/content-disposition@0.5.9': {} + + '@types/convert-source-map@2.0.3': {} + + '@types/cookies@0.9.2': + dependencies: + '@types/connect': 3.4.38 + '@types/express': 5.0.6 + '@types/keygrip': 1.0.6 + '@types/node': 25.9.1 + + '@types/debounce@1.2.4': {} + + '@types/deep-eql@4.0.2': {} + + '@types/doctrine@0.0.3': {} + + '@types/estree@1.0.9': {} + + '@types/express-serve-static-core@4.19.8': + dependencies: + '@types/node': 25.9.1 + '@types/qs': 6.15.1 + '@types/range-parser': 1.2.7 + '@types/send': 1.2.1 + + '@types/express-serve-static-core@5.1.1': + dependencies: + '@types/node': 25.9.1 + '@types/qs': 6.15.1 + '@types/range-parser': 1.2.7 + '@types/send': 1.2.1 + + '@types/express@4.17.25': + dependencies: + '@types/body-parser': 1.19.6 + '@types/express-serve-static-core': 4.19.8 + '@types/qs': 6.15.1 + '@types/serve-static': 1.15.10 + + '@types/express@5.0.6': + dependencies: + '@types/body-parser': 1.19.6 + '@types/express-serve-static-core': 5.1.1 + '@types/serve-static': 2.2.0 + + '@types/find-cache-dir@3.2.1': {} + + '@types/http-assert@1.5.6': {} + + '@types/http-errors@2.0.5': {} + + '@types/istanbul-lib-coverage@2.0.6': {} + + '@types/istanbul-lib-report@3.0.3': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + + '@types/istanbul-reports@3.0.4': + dependencies: + '@types/istanbul-lib-report': 3.0.3 + + '@types/keygrip@1.0.6': {} + + '@types/koa-compose@3.2.9': + dependencies: + '@types/koa': 2.15.2 + + '@types/koa@2.15.2': + dependencies: + '@types/accepts': 1.3.7 + '@types/content-disposition': 0.5.9 + '@types/cookies': 0.9.2 + '@types/http-assert': 1.5.6 + '@types/http-errors': 2.0.5 + '@types/keygrip': 1.0.6 + '@types/koa-compose': 3.2.9 + '@types/node': 25.9.1 + + '@types/mdx@2.0.13': {} + + '@types/mime@1.3.5': {} + + '@types/mocha@10.0.10': {} + + '@types/node-fetch@2.6.13': + dependencies: + '@types/node': 18.19.130 + form-data: 4.0.5 + + '@types/node@18.19.130': + dependencies: + undici-types: 5.26.5 + + '@types/node@25.9.1': + dependencies: + undici-types: 7.24.6 + + '@types/parse5@6.0.3': {} + + '@types/pretty-hrtime@1.0.3': {} + + '@types/qs@6.15.1': {} + + '@types/range-parser@1.2.7': {} + + '@types/react@19.2.16': + dependencies: + csstype: 3.2.3 + + '@types/resolve@1.20.2': {} + + '@types/send@0.17.6': + dependencies: + '@types/mime': 1.3.5 + '@types/node': 25.9.1 + + '@types/send@1.2.1': + dependencies: + '@types/node': 25.9.1 + + '@types/serve-static@1.15.10': + dependencies: + '@types/http-errors': 2.0.5 + '@types/node': 25.9.1 + '@types/send': 0.17.6 + + '@types/serve-static@2.2.0': + dependencies: + '@types/http-errors': 2.0.5 + '@types/node': 25.9.1 + + '@types/sinon-chai@3.2.12': + dependencies: + '@types/chai': 5.2.3 + '@types/sinon': 21.0.1 + + '@types/sinon@21.0.1': + dependencies: + '@types/sinonjs__fake-timers': 15.0.1 + + '@types/sinonjs__fake-timers@15.0.1': {} + + '@types/trusted-types@2.0.7': {} + + '@types/unist@2.0.11': {} + + '@types/ws@7.4.7': + dependencies: + '@types/node': 25.9.1 + + '@types/yauzl@2.10.3': + dependencies: + '@types/node': 25.9.1 + optional: true + + '@vitest/expect@3.2.4': + dependencies: + '@types/chai': 5.2.3 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.3.3 + tinyrainbow: 2.0.0 + + '@vitest/pretty-format@3.2.4': + dependencies: + tinyrainbow: 2.0.0 + + '@vitest/spy@3.2.4': + dependencies: + tinyspy: 4.0.4 + + '@vitest/utils@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + loupe: 3.2.1 + tinyrainbow: 2.0.0 + + '@web/browser-logs@0.4.1': + dependencies: + errorstacks: 2.4.2 + + '@web/config-loader@0.1.3': + dependencies: + semver: 7.8.1 + + '@web/config-loader@0.3.3': {} + + '@web/dev-server-core@0.6.3': + dependencies: + '@types/koa': 2.15.2 + '@types/ws': 7.4.7 + '@web/parse5-utils': 2.1.1 + chokidar: 3.5.2 + clone: 2.1.2 + es-module-lexer: 1.7.0 + get-stream: 6.0.1 + is-stream: 2.0.1 + isbinaryfile: 5.0.7 + koa: 2.16.4 + koa-etag: 4.0.0 + koa-send: 5.0.1 + koa-static: 5.0.0 + lru-cache: 8.0.5 + mime-types: 2.1.35 + parse5: 6.0.1 + picomatch: 2.3.2 + ws: 7.5.11 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@web/dev-server-core@0.7.5': + dependencies: + '@types/koa': 2.15.2 + '@types/ws': 7.4.7 + '@web/parse5-utils': 2.1.1 + chokidar: 4.0.3 + clone: 2.1.2 + es-module-lexer: 1.7.0 + get-stream: 6.0.1 + is-stream: 2.0.1 + isbinaryfile: 5.0.7 + koa: 2.16.4 + koa-etag: 4.0.0 + koa-send: 5.0.1 + koa-static: 5.0.0 + lru-cache: 8.0.5 + mime-types: 2.1.35 + parse5: 6.0.1 + picomatch: 2.3.2 + ws: 7.5.11 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@web/dev-server-esbuild@0.4.4': + dependencies: + '@mdn/browser-compat-data': 4.2.1 + '@web/dev-server-core': 0.6.3 + esbuild: 0.17.19 + parse5: 6.0.1 + ua-parser-js: 1.0.41 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@web/dev-server-rollup@0.6.4': + dependencies: + '@rollup/plugin-node-resolve': 15.3.1(rollup@4.61.0) + '@web/dev-server-core': 0.7.5 + nanocolors: 0.2.13 + parse5: 6.0.1 + rollup: 4.61.0 + whatwg-url: 14.2.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@web/dev-server@0.4.6': + dependencies: + '@babel/code-frame': 7.29.7 + '@types/command-line-args': 5.2.3 + '@web/config-loader': 0.3.3 + '@web/dev-server-core': 0.7.5 + '@web/dev-server-rollup': 0.6.4 + camelcase: 6.3.0 + command-line-args: 5.2.1 + command-line-usage: 7.0.4 + debounce: 1.2.1 + deepmerge: 4.3.1 + internal-ip: 6.2.0 + nanocolors: 0.2.13 + open: 8.4.2 + portfinder: 1.0.38 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@web/parse5-utils@2.1.1': + dependencies: + '@types/parse5': 6.0.3 + parse5: 6.0.1 + + '@web/rollup-plugin-html@2.4.1': + dependencies: + '@web/parse5-utils': 2.1.1 + glob: 10.5.0 + html-minifier-terser: 7.2.0 + lightningcss: 1.32.0 + parse5: 6.0.1 + picomatch: 2.3.2 + + '@web/storybook-builder@0.1.21(glob@10.5.0)': + dependencies: + '@rollup/plugin-node-resolve': 15.3.1(rollup@4.61.0) + '@rollup/pluginutils': 5.4.0(rollup@4.61.0) + '@storybook/core-common': 7.6.24 + '@storybook/mdx2-csf': 1.1.0 + '@storybook/node-logger': 7.6.24 + '@storybook/preview': 7.6.24 + '@web/config-loader': 0.3.3 + '@web/dev-server': 0.4.6 + '@web/dev-server-core': 0.7.5 + '@web/dev-server-rollup': 0.6.4 + '@web/rollup-plugin-html': 2.4.1 + browser-assert: 1.2.1 + cjs-module-lexer: 1.4.3 + es-module-lexer: 1.7.0 + esbuild: 0.24.2 + express: 4.22.2 + fs-extra: 11.3.5 + glob-promise: 6.0.7(glob@10.5.0) + lodash-es: 4.18.1 + path-browserify: 1.0.1 + remark-external-links: 8.0.0 + remark-slug: 6.1.0 + rollup: 4.61.0 + rollup-plugin-external-globals: 0.9.2(rollup@4.61.0) + slash: 5.1.0 + transitivePeerDependencies: + - bufferutil + - encoding + - glob + - supports-color + - utf-8-validate + + '@web/storybook-framework-web-components@0.1.3(glob@10.5.0)(lit@3.3.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@storybook/web-components': 7.6.24(lit@3.3.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@web/storybook-builder': 0.1.21(glob@10.5.0) + transitivePeerDependencies: + - bufferutil + - encoding + - glob + - lit + - react + - react-dom + - supports-color + - utf-8-validate + + '@web/test-runner-chrome@0.16.0': + dependencies: + '@web/test-runner-core': 0.13.4 + '@web/test-runner-coverage-v8': 0.8.0 + async-mutex: 0.4.0 + chrome-launcher: 0.15.2 + puppeteer-core: 22.15.0 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - bufferutil + - react-native-b4a + - supports-color + - utf-8-validate + + '@web/test-runner-commands@0.9.0': + dependencies: + '@web/test-runner-core': 0.13.4 + mkdirp: 1.0.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@web/test-runner-core@0.13.4': + dependencies: + '@babel/code-frame': 7.29.7 + '@types/babel__code-frame': 7.27.0 + '@types/co-body': 6.1.3 + '@types/convert-source-map': 2.0.3 + '@types/debounce': 1.2.4 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@web/browser-logs': 0.4.1 + '@web/dev-server-core': 0.7.5 + chokidar: 4.0.3 + cli-cursor: 3.1.0 + co-body: 6.2.0 + convert-source-map: 2.0.0 + debounce: 1.2.1 + dependency-graph: 0.11.0 + globby: 11.1.0 + internal-ip: 6.2.0 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-reports: 3.2.0 + log-update: 4.0.0 + nanocolors: 0.2.13 + nanoid: 3.3.12 + open: 8.4.2 + picomatch: 2.3.2 + source-map: 0.7.6 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@web/test-runner-coverage-v8@0.8.0': + dependencies: + '@web/test-runner-core': 0.13.4 + istanbul-lib-coverage: 3.2.2 + lru-cache: 8.0.5 + picomatch: 2.3.2 + v8-to-istanbul: 9.3.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@web/test-runner-mocha@0.9.0': + dependencies: + '@web/test-runner-core': 0.13.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@web/test-runner@0.18.3': + dependencies: + '@web/browser-logs': 0.4.1 + '@web/config-loader': 0.3.3 + '@web/dev-server': 0.4.6 + '@web/test-runner-chrome': 0.16.0 + '@web/test-runner-commands': 0.9.0 + '@web/test-runner-core': 0.13.4 + '@web/test-runner-mocha': 0.9.0 + camelcase: 6.3.0 + command-line-args: 5.2.1 + command-line-usage: 7.0.4 + convert-source-map: 2.0.0 + diff: 5.2.2 + globby: 11.1.0 + nanocolors: 0.2.13 + portfinder: 1.0.38 + source-map: 0.7.6 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - bufferutil + - react-native-b4a + - supports-color + - utf-8-validate + + '@xn-sakina/rml-darwin-arm64@2.8.0': + optional: true + + '@xn-sakina/rml-darwin-x64@2.8.0': + optional: true + + '@xn-sakina/rml-linux-arm-gnueabihf@2.8.0': + optional: true + + '@xn-sakina/rml-linux-arm64-gnu@2.8.0': + optional: true + + '@xn-sakina/rml-linux-arm64-musl@2.8.0': + optional: true + + '@xn-sakina/rml-linux-x64-gnu@2.8.0': + optional: true + + '@xn-sakina/rml-linux-x64-musl@2.8.0': + optional: true + + '@xn-sakina/rml-win32-arm64-msvc@2.8.0': + optional: true + + '@xn-sakina/rml-win32-x64-msvc@2.8.0': + optional: true + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + acorn@8.16.0: {} + + agent-base@7.1.4: {} + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-escapes@7.3.0: + dependencies: + environment: 1.1.0 + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + + ansi-styles@6.2.3: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.2 + + app-root-dir@1.0.2: {} + + aria-query@5.3.0: + dependencies: + dequal: 2.0.3 + + aria-query@5.3.2: {} + + array-back@3.1.0: {} + + array-back@6.2.3: {} + + array-flatten@1.1.1: {} + + array-union@2.1.0: {} + + assert@2.1.0: + dependencies: + call-bind: 1.0.9 + is-nan: 1.3.2 + object-is: 1.1.6 + object.assign: 4.1.7 + util: 0.12.5 + + assertion-error@2.0.1: {} + + ast-types@0.13.4: + dependencies: + tslib: 2.8.1 + + ast-types@0.16.1: + dependencies: + tslib: 2.8.1 + + astral-regex@2.0.0: {} + + async-mutex@0.4.0: + dependencies: + tslib: 2.8.1 + + async@3.2.6: {} + + asynckit@0.4.0: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + axe-core@4.12.0: {} + + b4a@1.8.1: {} + + balanced-match@1.0.2: {} + + bare-events@2.9.1: {} + + bare-fs@4.7.2: + dependencies: + bare-events: 2.9.1 + bare-path: 3.0.1 + bare-stream: 2.13.1(bare-events@2.9.1) + bare-url: 2.4.3 + fast-fifo: 1.3.2 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + + bare-os@3.9.1: {} + + bare-path@3.0.1: + dependencies: + bare-os: 3.9.1 + + bare-stream@2.13.1(bare-events@2.9.1): + dependencies: + streamx: 2.26.0 + teex: 1.0.1 + optionalDependencies: + bare-events: 2.9.1 + transitivePeerDependencies: + - react-native-b4a + + bare-url@2.4.3: + dependencies: + bare-path: 3.0.1 + + base64-js@1.5.1: {} + + basic-ftp@5.3.1: {} + + binary-extensions@2.3.0: {} + + body-parser@1.20.5: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.1 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.15.2 + raw-body: 2.5.3 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + brace-expansion@2.1.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browser-assert@1.2.1: {} + + buffer-crc32@0.2.13: {} + + buffer-from@1.1.2: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + bytes@3.1.2: {} + + cache-content-type@1.0.1: + dependencies: + mime-types: 2.1.35 + ylru: 1.4.0 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.9: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + camel-case@4.1.2: + dependencies: + pascal-case: 3.1.2 + tslib: 2.8.1 + + camelcase@6.3.0: {} + + chai-a11y-axe@1.5.0: + dependencies: + axe-core: 4.12.0 + + chai@5.3.3: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.3 + deep-eql: 5.0.2 + loupe: 3.2.1 + pathval: 2.0.1 + + chalk-template@0.4.0: + dependencies: + chalk: 4.1.2 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.6.2: {} + + check-error@2.1.3: {} + + chokidar@3.5.2: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + chrome-launcher@0.15.2: + dependencies: + '@types/node': 25.9.1 + escape-string-regexp: 4.0.0 + is-wsl: 2.2.0 + lighthouse-logger: 1.4.2 + transitivePeerDependencies: + - supports-color + + chromium-bidi@0.6.3(devtools-protocol@0.0.1312386): + dependencies: + devtools-protocol: 0.0.1312386 + mitt: 3.0.1 + urlpattern-polyfill: 10.0.0 + zod: 3.23.8 + + cjs-module-lexer@1.4.3: {} + + clean-css@5.3.3: + dependencies: + source-map: 0.6.1 + + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + + cli-truncate@4.0.0: + dependencies: + slice-ansi: 5.0.0 + string-width: 7.2.0 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone@2.1.2: {} + + co-body@6.2.0: + dependencies: + '@hapi/bourne': 3.0.0 + inflation: 2.1.0 + qs: 6.15.2 + raw-body: 2.5.3 + type-is: 1.6.18 + + co@4.6.0: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + colorette@2.0.20: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + command-line-args@5.1.2: + dependencies: + array-back: 6.2.3 + find-replace: 3.0.0 + lodash.camelcase: 4.3.0 + typical: 4.0.0 + + command-line-args@5.2.1: + dependencies: + array-back: 3.1.0 + find-replace: 3.0.0 + lodash.camelcase: 4.3.0 + typical: 4.0.0 + + command-line-usage@7.0.4: + dependencies: + array-back: 6.2.3 + chalk-template: 0.4.0 + table-layout: 4.1.1 + typical: 7.3.0 + + commander@10.0.1: {} + + commander@13.1.0: {} + + commander@2.20.3: {} + + comment-parser@1.2.4: {} + + commondir@1.0.1: {} + + concurrently@8.2.2: + dependencies: + chalk: 4.1.2 + date-fns: 2.30.0 + lodash: 4.18.1 + rxjs: 7.8.2 + shell-quote: 1.8.4 + spawn-command: 0.0.2 + supports-color: 8.1.1 + tree-kill: 1.2.2 + yargs: 17.7.2 + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + convert-source-map@2.0.0: {} + + cookie-signature@1.0.7: {} + + cookie@0.7.2: {} + + cookies@0.9.1: + dependencies: + depd: 2.0.0 + keygrip: 1.1.0 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css.escape@1.5.1: {} + + csstype@3.2.3: {} + + custom-elements-manifest@1.0.0: {} + + data-uri-to-buffer@6.0.2: {} + + date-fns@2.30.0: + dependencies: + '@babel/runtime': 7.29.7 + + debounce@1.2.1: {} + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@3.2.7: + dependencies: + ms: 2.1.3 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + deep-eql@5.0.2: {} + + deep-equal@1.0.1: {} + + deepmerge@4.3.1: {} + + default-gateway@6.0.3: + dependencies: + execa: 5.1.1 + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-lazy-prop@2.0.0: {} + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + degenerator@5.0.1: + dependencies: + ast-types: 0.13.4 + escodegen: 2.1.0 + esprima: 4.0.1 + + delayed-stream@1.0.0: {} + + delegates@1.0.0: {} + + depd@1.1.2: {} + + depd@2.0.0: {} + + dependency-graph@0.11.0: {} + + dequal@2.0.3: {} + + destroy@1.2.0: {} + + detect-libc@2.1.2: {} + + devtools-protocol@0.0.1312386: {} + + diff@5.2.2: {} + + diff@7.0.0: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dom-accessibility-api@0.5.16: {} + + dom-accessibility-api@0.6.3: {} + + dot-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + + dotenv-expand@10.0.0: {} + + dotenv@16.6.1: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + eastasianwidth@0.2.0: {} + + ee-first@1.1.1: {} + + emoji-regex@10.6.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + encodeurl@1.0.2: {} + + encodeurl@2.0.0: {} + + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + + entities@4.5.0: {} + + environment@1.1.0: {} + + errorstacks@2.4.2: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@1.7.0: {} + + es-object-atoms@1.1.2: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 + + esbuild-register@3.6.0(esbuild@0.18.20): + dependencies: + debug: 4.4.3 + esbuild: 0.18.20 + transitivePeerDependencies: + - supports-color + + esbuild@0.17.19: + optionalDependencies: + '@esbuild/android-arm': 0.17.19 + '@esbuild/android-arm64': 0.17.19 + '@esbuild/android-x64': 0.17.19 + '@esbuild/darwin-arm64': 0.17.19 + '@esbuild/darwin-x64': 0.17.19 + '@esbuild/freebsd-arm64': 0.17.19 + '@esbuild/freebsd-x64': 0.17.19 + '@esbuild/linux-arm': 0.17.19 + '@esbuild/linux-arm64': 0.17.19 + '@esbuild/linux-ia32': 0.17.19 + '@esbuild/linux-loong64': 0.17.19 + '@esbuild/linux-mips64el': 0.17.19 + '@esbuild/linux-ppc64': 0.17.19 + '@esbuild/linux-riscv64': 0.17.19 + '@esbuild/linux-s390x': 0.17.19 + '@esbuild/linux-x64': 0.17.19 + '@esbuild/netbsd-x64': 0.17.19 + '@esbuild/openbsd-x64': 0.17.19 + '@esbuild/sunos-x64': 0.17.19 + '@esbuild/win32-arm64': 0.17.19 + '@esbuild/win32-ia32': 0.17.19 + '@esbuild/win32-x64': 0.17.19 + + esbuild@0.18.20: + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + + esbuild@0.24.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.24.2 + '@esbuild/android-arm': 0.24.2 + '@esbuild/android-arm64': 0.24.2 + '@esbuild/android-x64': 0.24.2 + '@esbuild/darwin-arm64': 0.24.2 + '@esbuild/darwin-x64': 0.24.2 + '@esbuild/freebsd-arm64': 0.24.2 + '@esbuild/freebsd-x64': 0.24.2 + '@esbuild/linux-arm': 0.24.2 + '@esbuild/linux-arm64': 0.24.2 + '@esbuild/linux-ia32': 0.24.2 + '@esbuild/linux-loong64': 0.24.2 + '@esbuild/linux-mips64el': 0.24.2 + '@esbuild/linux-ppc64': 0.24.2 + '@esbuild/linux-riscv64': 0.24.2 + '@esbuild/linux-s390x': 0.24.2 + '@esbuild/linux-x64': 0.24.2 + '@esbuild/netbsd-arm64': 0.24.2 + '@esbuild/netbsd-x64': 0.24.2 + '@esbuild/openbsd-arm64': 0.24.2 + '@esbuild/openbsd-x64': 0.24.2 + '@esbuild/sunos-x64': 0.24.2 + '@esbuild/win32-arm64': 0.24.2 + '@esbuild/win32-ia32': 0.24.2 + '@esbuild/win32-x64': 0.24.2 + + esbuild@0.25.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@4.0.0: {} + + escodegen@2.1.0: + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + + esprima@4.0.1: {} + + estraverse@5.3.0: {} + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.9 + + esutils@2.0.3: {} + + etag@1.8.1: {} + + eventemitter3@5.0.4: {} + + events-universal@1.0.1: + dependencies: + bare-events: 2.9.1 + transitivePeerDependencies: + - bare-abort-controller + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + express@4.22.2: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.5 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.0.7 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.3.2 + fresh: 0.5.2 + http-errors: 2.0.1 + merge-descriptors: 1.0.3 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.13 + proxy-addr: 2.0.7 + qs: 6.15.2 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.19.2 + serve-static: 1.16.3 + setprototypeof: 1.2.0 + statuses: 2.0.2 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + extend@3.0.2: {} + + extract-zip@2.0.1: + dependencies: + debug: 4.4.3 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + + fast-fifo@1.3.2: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fastq@1.20.1: + dependencies: + reusify: 1.1.0 + + fd-slicer@1.1.0: + dependencies: + pend: 1.2.0 + + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + + file-system-cache@2.3.0: + dependencies: + fs-extra: 11.1.1 + ramda: 0.29.0 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@1.3.2: + dependencies: + debug: 2.6.9 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.2 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + find-cache-dir@3.3.2: + dependencies: + commondir: 1.0.1 + make-dir: 3.1.0 + pkg-dir: 4.2.0 + + find-replace@3.0.0: + dependencies: + array-back: 3.1.0 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data@4.0.5: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.4 + mime-types: 2.1.35 + + forwarded@0.2.0: {} + + fresh@0.5.2: {} + + fs-extra@11.1.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.1 + universalify: 2.0.1 + + fs-extra@11.3.5: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.1 + universalify: 2.0.1 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + generator-function@2.0.1: {} + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.6.0: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.2 + + get-stream@5.2.0: + dependencies: + pump: 3.0.4 + + get-stream@6.0.1: {} + + get-stream@8.0.1: {} + + get-uri@6.0.5: + dependencies: + basic-ftp: 5.3.1 + data-uri-to-buffer: 6.0.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + github-slugger@1.5.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-promise@6.0.7(glob@10.5.0): + dependencies: + glob: 10.5.0 + + glob@10.5.0: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.9 + minipass: 7.1.3 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + globby@11.0.4: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + handlebars@4.7.9: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 + + html-escaper@2.0.2: {} + + html-minifier-terser@7.2.0: + dependencies: + camel-case: 4.1.2 + clean-css: 5.3.3 + commander: 10.0.1 + entities: 4.5.0 + param-case: 3.0.4 + relateurl: 0.2.7 + terser: 5.48.0 + + http-assert@1.5.0: + dependencies: + deep-equal: 1.0.1 + http-errors: 1.8.1 + + http-errors@1.6.3: + dependencies: + depd: 1.1.2 + inherits: 2.0.3 + setprototypeof: 1.1.0 + statuses: 1.5.0 + + http-errors@1.8.1: + dependencies: + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 1.5.0 + toidentifier: 1.0.1 + + http-errors@2.0.1: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + human-signals@2.1.0: {} + + human-signals@5.0.0: {} + + husky@8.0.3: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + ignore@5.3.2: {} + + indent-string@4.0.0: {} + + inflation@2.1.0: {} + + inherits@2.0.3: {} + + inherits@2.0.4: {} + + internal-ip@6.2.0: + dependencies: + default-gateway: 6.0.3 + ipaddr.js: 1.9.1 + is-ip: 3.1.0 + p-event: 4.2.0 + + ip-address@10.2.0: {} + + ip-regex@4.3.0: {} + + ipaddr.js@1.9.1: {} + + is-absolute-url@3.0.3: {} + + is-arguments@1.2.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-callable@1.2.7: {} + + is-core-module@2.16.2: + dependencies: + hasown: 2.0.4 + + is-docker@2.2.1: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-fullwidth-code-point@4.0.0: {} + + is-fullwidth-code-point@5.1.0: + dependencies: + get-east-asian-width: 1.6.0 + + is-generator-function@1.1.2: + dependencies: + call-bound: 1.0.4 + generator-function: 2.0.1 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-ip@3.1.0: + dependencies: + ip-regex: 4.3.0 + + is-module@1.0.0: {} + + is-nan@1.3.2: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + + is-number@7.0.0: {} + + is-reference@3.0.3: + dependencies: + '@types/estree': 1.0.9 + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 + + is-stream@2.0.1: {} + + is-stream@3.0.0: {} + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.21 + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + isbinaryfile@5.0.7: {} + + isexe@2.0.0: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-reports@3.2.0: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + js-tokens@4.0.0: {} + + jsonfile@6.2.1: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + just-extend@6.2.0: {} + + keygrip@1.1.0: + dependencies: + tsscmp: 1.0.6 + + koa-compose@4.1.0: {} + + koa-convert@2.0.0: + dependencies: + co: 4.6.0 + koa-compose: 4.1.0 + + koa-etag@4.0.0: + dependencies: + etag: 1.8.1 + + koa-send@5.0.1: + dependencies: + debug: 4.4.3 + http-errors: 1.8.1 + resolve-path: 1.4.0 + transitivePeerDependencies: + - supports-color + + koa-static@5.0.0: + dependencies: + debug: 3.2.7 + koa-send: 5.0.1 + transitivePeerDependencies: + - supports-color + + koa@2.16.4: + dependencies: + accepts: 1.3.8 + cache-content-type: 1.0.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookies: 0.9.1 + debug: 4.4.3 + delegates: 1.0.0 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + fresh: 0.5.2 + http-assert: 1.5.0 + http-errors: 1.8.1 + is-generator-function: 1.1.2 + koa-compose: 4.1.0 + koa-convert: 2.0.0 + on-finished: 2.4.1 + only: 0.0.2 + parseurl: 1.3.3 + statuses: 1.5.0 + type-is: 1.6.18 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + lazy-universal-dotenv@4.0.0: + dependencies: + app-root-dir: 1.0.2 + dotenv: 16.6.1 + dotenv-expand: 10.0.0 + + lighthouse-logger@1.4.2: + dependencies: + debug: 2.6.9 + marky: 1.3.0 + transitivePeerDependencies: + - supports-color + + lightningcss-android-arm64@1.32.0: + optional: true + + lightningcss-darwin-arm64@1.32.0: + optional: true + + lightningcss-darwin-x64@1.32.0: + optional: true + + lightningcss-freebsd-x64@1.32.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + + lightningcss-linux-arm64-gnu@1.32.0: + optional: true + + lightningcss-linux-arm64-musl@1.32.0: + optional: true + + lightningcss-linux-x64-gnu@1.32.0: + optional: true + + lightningcss-linux-x64-musl@1.32.0: + optional: true + + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + + lightningcss-win32-x64-msvc@1.32.0: + optional: true + + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 + + lilconfig@3.1.3: {} + + lint-staged@15.5.2: + dependencies: + chalk: 5.6.2 + commander: 13.1.0 + debug: 4.4.3 + execa: 8.0.1 + lilconfig: 3.1.3 + listr2: 8.3.3 + micromatch: 4.0.8 + pidtree: 0.6.0 + string-argv: 0.3.2 + yaml: 2.9.0 + transitivePeerDependencies: + - supports-color + + listr2@8.3.3: + dependencies: + cli-truncate: 4.0.0 + colorette: 2.0.20 + eventemitter3: 5.0.4 + log-update: 6.1.0 + rfdc: 1.4.1 + wrap-ansi: 9.0.2 + + lit-element@4.2.2: + dependencies: + '@lit-labs/ssr-dom-shim': 1.6.0 + '@lit/reactive-element': 2.1.2 + lit-html: 3.3.3 + + lit-html@3.3.3: + dependencies: + '@types/trusted-types': 2.0.7 + + lit@3.3.3: + dependencies: + '@lit/reactive-element': 2.1.2 + lit-element: 4.2.2 + lit-html: 3.3.3 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash-es@4.18.1: {} + + lodash.camelcase@4.3.0: {} + + lodash@4.18.1: {} + + log-update@4.0.0: + dependencies: + ansi-escapes: 4.3.2 + cli-cursor: 3.1.0 + slice-ansi: 4.0.0 + wrap-ansi: 6.2.0 + + log-update@6.1.0: + dependencies: + ansi-escapes: 7.3.0 + cli-cursor: 5.0.0 + slice-ansi: 7.1.2 + strip-ansi: 7.2.0 + wrap-ansi: 9.0.2 + + loupe@3.2.1: {} + + lower-case@2.0.2: + dependencies: + tslib: 2.8.1 + + lru-cache@10.4.3: {} + + lru-cache@7.18.3: {} + + lru-cache@8.0.5: {} + + lz-string@1.5.0: {} + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + make-dir@3.1.0: + dependencies: + semver: 6.3.1 + + make-dir@4.0.0: + dependencies: + semver: 7.8.1 + + map-or-similar@1.5.0: {} + + marky@1.3.0: {} + + math-intrinsics@1.1.0: {} + + mdast-util-definitions@4.0.0: + dependencies: + unist-util-visit: 2.0.3 + + mdast-util-to-string@1.1.0: {} + + media-typer@0.3.0: {} + + memoizerific@1.11.3: + dependencies: + map-or-similar: 1.5.0 + + merge-descriptors@1.0.3: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + methods@1.1.2: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.2 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@1.6.0: {} + + mimic-fn@2.1.0: {} + + mimic-fn@4.0.0: {} + + mimic-function@5.0.1: {} + + min-indent@1.0.1: {} + + minimatch@9.0.9: + dependencies: + brace-expansion: 2.1.1 + + minimist@1.2.8: {} + + minipass@7.1.3: {} + + mitt@3.0.1: {} + + mkdirp@1.0.4: {} + + ms@2.0.0: {} + + ms@2.1.3: {} + + nanocolors@0.2.13: {} + + nanoid@3.3.12: {} + + negotiator@0.6.3: {} + + neo-async@2.6.2: {} + + netmask@2.1.1: {} + + nise@6.1.5: + dependencies: + '@sinonjs/commons': 3.0.1 + '@sinonjs/fake-timers': 15.4.0 + just-extend: 6.2.0 + path-to-regexp: 8.4.2 + + no-case@3.0.4: + dependencies: + lower-case: 2.0.2 + tslib: 2.8.1 + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + normalize-path@3.0.0: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + object-inspect@1.13.4: {} + + object-is@1.1.6: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + + only@0.0.2: {} + + open@8.4.2: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + + p-event@4.2.0: + dependencies: + p-timeout: 3.2.0 + + p-finally@1.0.0: {} + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-timeout@3.2.0: + dependencies: + p-finally: 1.0.0 + + p-try@2.2.0: {} + + pac-proxy-agent@7.2.0: + dependencies: + '@tootallnate/quickjs-emscripten': 0.23.0 + agent-base: 7.1.4 + debug: 4.4.3 + get-uri: 6.0.5 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + pac-resolver: 7.0.1 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + + pac-resolver@7.0.1: + dependencies: + degenerator: 5.0.1 + netmask: 2.1.1 + + package-json-from-dist@1.0.1: {} + + param-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.8.1 + + parse5@6.0.1: {} + + parseurl@1.3.3: {} + + pascal-case@3.1.2: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + + path-browserify@1.0.1: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.3 + + path-to-regexp@0.1.13: {} + + path-to-regexp@8.4.2: {} + + path-type@4.0.0: {} + + pathval@2.0.1: {} + + pend@1.2.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.2: {} + + picomatch@4.0.4: {} + + pidtree@0.6.0: {} + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + pkg-dir@5.0.0: + dependencies: + find-up: 5.0.0 + + portfinder@1.0.38: + dependencies: + async: 3.2.6 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + possible-typed-array-names@1.1.0: {} + + postcss@8.5.15: + dependencies: + nanoid: 3.3.12 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + pretty-format@27.5.1: + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + + pretty-hrtime@1.0.3: {} + + progress@2.0.3: {} + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + proxy-agent@6.5.0: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + lru-cache: 7.18.3 + pac-proxy-agent: 7.2.0 + proxy-from-env: 1.1.0 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + + proxy-from-env@1.1.0: {} + + pump@3.0.4: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + + punycode@2.3.1: {} + + puppeteer-core@22.15.0: + dependencies: + '@puppeteer/browsers': 2.3.0 + chromium-bidi: 0.6.3(devtools-protocol@0.0.1312386) + debug: 4.4.3 + devtools-protocol: 0.0.1312386 + ws: 8.21.0 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - bufferutil + - react-native-b4a + - supports-color + - utf-8-validate + + qs@6.15.2: + dependencies: + side-channel: 1.1.0 + + queue-microtask@1.2.3: {} + + ramda@0.29.0: {} + + range-parser@1.2.1: {} + + raw-body@2.5.3: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.1 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + react-dom@19.2.7(react@19.2.7): + dependencies: + react: 19.2.7 + scheduler: 0.27.0 + + react-is@17.0.2: {} + + react@19.2.7: {} + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.2 + + readdirp@4.1.2: {} + + recast@0.23.11: + dependencies: + ast-types: 0.16.1 + esprima: 4.0.1 + source-map: 0.6.1 + tiny-invariant: 1.3.3 + tslib: 2.8.1 + + redent@3.0.0: + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + + relateurl@0.2.7: {} + + remark-external-links@8.0.0: + dependencies: + extend: 3.0.2 + is-absolute-url: 3.0.3 + mdast-util-definitions: 4.0.0 + space-separated-tokens: 1.1.5 + unist-util-visit: 2.0.3 + + remark-slug@6.1.0: + dependencies: + github-slugger: 1.5.0 + mdast-util-to-string: 1.1.0 + unist-util-visit: 2.0.3 + + require-directory@2.1.1: {} + + resolve-from@5.0.0: {} + + resolve-path@1.4.0: + dependencies: + http-errors: 1.6.3 + path-is-absolute: 1.0.1 + + resolve@1.22.12: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.16.2 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + restore-cursor@3.1.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + + reusify@1.1.0: {} + + rfdc@1.4.1: {} + + rolldown@1.0.3: + dependencies: + '@oxc-project/types': 0.133.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.3 + '@rolldown/binding-darwin-arm64': 1.0.3 + '@rolldown/binding-darwin-x64': 1.0.3 + '@rolldown/binding-freebsd-x64': 1.0.3 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.3 + '@rolldown/binding-linux-arm64-gnu': 1.0.3 + '@rolldown/binding-linux-arm64-musl': 1.0.3 + '@rolldown/binding-linux-ppc64-gnu': 1.0.3 + '@rolldown/binding-linux-s390x-gnu': 1.0.3 + '@rolldown/binding-linux-x64-gnu': 1.0.3 + '@rolldown/binding-linux-x64-musl': 1.0.3 + '@rolldown/binding-openharmony-arm64': 1.0.3 + '@rolldown/binding-wasm32-wasi': 1.0.3 + '@rolldown/binding-win32-arm64-msvc': 1.0.3 + '@rolldown/binding-win32-x64-msvc': 1.0.3 + + rollup-plugin-external-globals@0.9.2(rollup@4.61.0): + dependencies: + '@rollup/pluginutils': 5.4.0(rollup@4.61.0) + estree-walker: 3.0.3 + is-reference: 3.0.3 + magic-string: 0.30.21 + rollup: 4.61.0 + + rollup@4.61.0: + dependencies: + '@types/estree': 1.0.9 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.61.0 + '@rollup/rollup-android-arm64': 4.61.0 + '@rollup/rollup-darwin-arm64': 4.61.0 + '@rollup/rollup-darwin-x64': 4.61.0 + '@rollup/rollup-freebsd-arm64': 4.61.0 + '@rollup/rollup-freebsd-x64': 4.61.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.61.0 + '@rollup/rollup-linux-arm-musleabihf': 4.61.0 + '@rollup/rollup-linux-arm64-gnu': 4.61.0 + '@rollup/rollup-linux-arm64-musl': 4.61.0 + '@rollup/rollup-linux-loong64-gnu': 4.61.0 + '@rollup/rollup-linux-loong64-musl': 4.61.0 + '@rollup/rollup-linux-ppc64-gnu': 4.61.0 + '@rollup/rollup-linux-ppc64-musl': 4.61.0 + '@rollup/rollup-linux-riscv64-gnu': 4.61.0 + '@rollup/rollup-linux-riscv64-musl': 4.61.0 + '@rollup/rollup-linux-s390x-gnu': 4.61.0 + '@rollup/rollup-linux-x64-gnu': 4.61.0 + '@rollup/rollup-linux-x64-musl': 4.61.0 + '@rollup/rollup-openbsd-x64': 4.61.0 + '@rollup/rollup-openharmony-arm64': 4.61.0 + '@rollup/rollup-win32-arm64-msvc': 4.61.0 + '@rollup/rollup-win32-ia32-msvc': 4.61.0 + '@rollup/rollup-win32-x64-gnu': 4.61.0 + '@rollup/rollup-win32-x64-msvc': 4.61.0 + fsevents: 2.3.3 + + rs-module-lexer@2.8.0: + optionalDependencies: + '@xn-sakina/rml-darwin-arm64': 2.8.0 + '@xn-sakina/rml-darwin-x64': 2.8.0 + '@xn-sakina/rml-linux-arm-gnueabihf': 2.8.0 + '@xn-sakina/rml-linux-arm64-gnu': 2.8.0 + '@xn-sakina/rml-linux-arm64-musl': 2.8.0 + '@xn-sakina/rml-linux-x64-gnu': 2.8.0 + '@xn-sakina/rml-linux-x64-musl': 2.8.0 + '@xn-sakina/rml-win32-arm64-msvc': 2.8.0 + '@xn-sakina/rml-win32-x64-msvc': 2.8.0 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + + safe-buffer@5.2.1: {} + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + safer-buffer@2.1.2: {} + + scheduler@0.27.0: {} + + semver@6.3.1: {} + + semver@7.8.1: {} + + send@0.19.2: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.1 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + serve-static@1.16.3: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.2 + transitivePeerDependencies: + - supports-color + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + setprototypeof@1.1.0: {} + + setprototypeof@1.2.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shell-quote@1.8.4: {} + + side-channel-list@1.0.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.1 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + sinon@19.0.5: + dependencies: + '@sinonjs/commons': 3.0.1 + '@sinonjs/fake-timers': 13.0.5 + '@sinonjs/samsam': 8.0.3 + diff: 7.0.0 + nise: 6.1.5 + supports-color: 7.2.0 + + slash@3.0.0: {} + + slash@5.1.0: {} + + slice-ansi@4.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + + slice-ansi@5.0.0: + dependencies: + ansi-styles: 6.2.3 + is-fullwidth-code-point: 4.0.0 + + slice-ansi@7.1.2: + dependencies: + ansi-styles: 6.2.3 + is-fullwidth-code-point: 5.1.0 + + smart-buffer@4.2.0: {} + + socks-proxy-agent@8.0.5: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + socks: 2.8.9 + transitivePeerDependencies: + - supports-color + + socks@2.8.9: + dependencies: + ip-address: 10.2.0 + smart-buffer: 4.2.0 + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + source-map@0.7.6: {} + + space-separated-tokens@1.1.5: {} + + spawn-command@0.0.2: {} + + statuses@1.5.0: {} + + statuses@2.0.2: {} + + store2@2.14.4: {} + + storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7): + dependencies: + '@storybook/global': 5.0.0 + '@storybook/icons': 2.0.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@testing-library/jest-dom': 6.9.1 + '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) + '@vitest/expect': 3.2.4 + '@vitest/spy': 3.2.4 + esbuild: 0.25.12 + recast: 0.23.11 + semver: 7.8.1 + use-sync-external-store: 1.6.0(react@19.2.7) + ws: 8.21.0 + transitivePeerDependencies: + - '@testing-library/dom' + - bufferutil + - react + - react-dom + - utf-8-validate + + streamx@2.26.0: + dependencies: + events-universal: 1.0.1 + fast-fifo: 1.3.2 + text-decoder: 1.2.7 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + + string-argv@0.3.2: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.2.0 + + string-width@7.2.0: + dependencies: + emoji-regex: 10.6.0 + get-east-asian-width: 1.6.0 + strip-ansi: 7.2.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.2.0: + dependencies: + ansi-regex: 6.2.2 + + strip-final-newline@2.0.0: {} + + strip-final-newline@3.0.0: {} + + strip-indent@3.0.0: + dependencies: + min-indent: 1.0.1 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + synchronous-promise@2.0.17: {} + + table-layout@4.1.1: + dependencies: + array-back: 6.2.3 + wordwrapjs: 5.1.1 + + tar-fs@3.1.2: + dependencies: + pump: 3.0.4 + tar-stream: 3.2.0 + optionalDependencies: + bare-fs: 4.7.2 + bare-path: 3.0.1 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + + tar-stream@3.2.0: + dependencies: + b4a: 1.8.1 + bare-fs: 4.7.2 + fast-fifo: 1.3.2 + streamx: 2.26.0 + transitivePeerDependencies: + - bare-abort-controller + - bare-buffer + - react-native-b4a + + teex@1.0.1: + dependencies: + streamx: 2.26.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + + telejson@7.2.0: + dependencies: + memoizerific: 1.11.3 + + terser@5.48.0: + dependencies: + '@jridgewell/source-map': 0.3.11 + acorn: 8.16.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + text-decoder@1.2.7: + dependencies: + b4a: 1.8.1 + transitivePeerDependencies: + - react-native-b4a + + through@2.3.8: {} + + tiny-invariant@1.3.3: {} + + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + + tinyrainbow@2.0.0: {} + + tinyspy@4.0.4: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + tr46@0.0.3: {} + + tr46@5.1.1: + dependencies: + punycode: 2.3.1 + + tree-kill@1.2.2: {} + + ts-dedent@2.2.0: {} + + tslib@2.8.1: {} + + tsscmp@1.0.6: {} + + type-detect@4.0.8: {} + + type-detect@4.1.0: {} + + type-fest@0.21.3: {} + + type-fest@2.19.0: {} + + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + typescript@5.4.5: {} + + typescript@5.9.3: {} + + typical@4.0.0: {} + + typical@7.3.0: {} + + ua-parser-js@1.0.41: {} + + uglify-js@3.19.3: + optional: true + + unbzip2-stream@1.4.3: + dependencies: + buffer: 5.7.1 + through: 2.3.8 + + undici-types@5.26.5: {} + + undici-types@7.24.6: {} + + unist-util-is@4.1.0: {} + + unist-util-visit-parents@3.1.1: + dependencies: + '@types/unist': 2.0.11 + unist-util-is: 4.1.0 + + unist-util-visit@2.0.3: + dependencies: + '@types/unist': 2.0.11 + unist-util-is: 4.1.0 + unist-util-visit-parents: 3.1.1 + + universalify@2.0.1: {} + + unpipe@1.0.0: {} + + unplugin@2.3.11: + dependencies: + '@jridgewell/remapping': 2.3.5 + acorn: 8.16.0 + picomatch: 4.0.4 + webpack-virtual-modules: 0.6.2 + + urlpattern-polyfill@10.0.0: {} + + use-sync-external-store@1.6.0(react@19.2.7): + dependencies: + react: 19.2.7 + + util-deprecate@1.0.2: {} + + util@0.12.5: + dependencies: + inherits: 2.0.4 + is-arguments: 1.2.0 + is-generator-function: 1.1.2 + is-typed-array: 1.1.15 + which-typed-array: 1.1.21 + + utils-merge@1.0.1: {} + + v8-to-istanbul@9.3.0: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + + vary@1.1.2: {} + + vite@8.0.16(@types/node@25.9.1)(esbuild@0.25.12)(terser@5.48.0)(yaml@2.9.0): + dependencies: + lightningcss: 1.32.0 + picomatch: 4.0.4 + postcss: 8.5.15 + rolldown: 1.0.3 + tinyglobby: 0.2.17 + optionalDependencies: + '@types/node': 25.9.1 + esbuild: 0.25.12 + fsevents: 2.3.3 + terser: 5.48.0 + yaml: 2.9.0 + + webidl-conversions@3.0.1: {} + + webidl-conversions@7.0.0: {} + + webpack-virtual-modules@0.6.2: {} + + whatwg-url@14.2.0: + dependencies: + tr46: 5.1.1 + webidl-conversions: 7.0.0 + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which-typed-array@1.1.21: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wordwrap@1.0.0: {} + + wordwrapjs@5.1.1: {} + + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.2.0 + + wrap-ansi@9.0.2: + dependencies: + ansi-styles: 6.2.3 + string-width: 7.2.0 + strip-ansi: 7.2.0 + + wrappy@1.0.2: {} + + ws@7.5.11: {} + + ws@8.21.0: {} + + y18n@5.0.8: {} + + yaml@2.9.0: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yauzl@2.10.0: + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + + ylru@1.4.0: {} + + yocto-queue@0.1.0: {} + + zod@3.23.8: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..ed1e926 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,3 @@ +packages: + - dictation + - ambient diff --git a/scripts/build-ambient.mjs b/scripts/build-ambient.mjs new file mode 100644 index 0000000..8904106 --- /dev/null +++ b/scripts/build-ambient.mjs @@ -0,0 +1,20 @@ +import { cpSync } from "node:fs"; +import { dirname, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; +import * as esbuild from "esbuild"; + +const root = resolve(dirname(fileURLToPath(import.meta.url)), ".."); +const pkgDir = resolve(root, "ambient"); + +await esbuild.build({ + alias: { + "@core": resolve(root, "core/src"), + }, + bundle: true, + entryPoints: [resolve(pkgDir, "dist/index.js")], + format: "esm", + outfile: resolve(pkgDir, "dist/bundle.js"), + platform: "browser", +}); + +cpSync(resolve(pkgDir, "package.json"), resolve(pkgDir, "dist/package.json")); diff --git a/scripts/build-dictation.mjs b/scripts/build-dictation.mjs new file mode 100644 index 0000000..36bf521 --- /dev/null +++ b/scripts/build-dictation.mjs @@ -0,0 +1,20 @@ +import { cpSync } from "node:fs"; +import { dirname, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; +import * as esbuild from "esbuild"; + +const root = resolve(dirname(fileURLToPath(import.meta.url)), ".."); +const pkgDir = resolve(root, "dictation"); + +await esbuild.build({ + alias: { + "@core": resolve(root, "core/src"), + }, + bundle: true, + entryPoints: [resolve(pkgDir, "dist/index.js")], + format: "esm", + outfile: resolve(pkgDir, "dist/bundle.js"), + platform: "browser", +}); + +cpSync(resolve(pkgDir, "package.json"), resolve(pkgDir, "dist/package.json")); diff --git a/stories/ambient-root.stories.ts b/stories/ambient-root.stories.ts index 2673d25..ba5e3d2 100644 --- a/stories/ambient-root.stories.ts +++ b/stories/ambient-root.stories.ts @@ -1,12 +1,12 @@ import type { Meta, StoryObj } from "@storybook/web-components-vite"; import { html } from "lit"; import { action } from "storybook/actions"; -import type { AmbientRecordingButton } from "../src/components/ambient/ambient-recording-button.js"; +import type { AmbientRecordingButton } from "../ambient/src/components/ambient-recording-button.js"; -import "../src/components/ambient/ambient-recording-button.js"; -import "../src/components/internal/speech-audio-visualiser.js"; -import "../src/components/ambient/ambient-settings-menu.js"; -import type { AmbientSettingsMenu } from "../src/components/ambient/ambient-settings-menu.js"; +import "../ambient/src/components/ambient-recording-button.js"; +import "../core/src/components/speech-audio-visualiser.js"; +import "../ambient/src/components/ambient-settings-menu.js"; +import type { AmbientSettingsMenu } from "../ambient/src/components/ambient-settings-menu.js"; import type { AmbientRoot } from "../src/contexts/ambient-context.js"; import "../src/contexts/ambient-context.js"; diff --git a/stories/audio-visualiser.stories.ts b/stories/audio-visualiser.stories.ts index e2bf25c..bb4d8da 100644 --- a/stories/audio-visualiser.stories.ts +++ b/stories/audio-visualiser.stories.ts @@ -1,9 +1,9 @@ import type { Meta, StoryObj } from "@storybook/web-components-vite"; import { html } from "lit"; -import "../src/components/internal/speech-audio-visualiser.js"; +import "../core/src/components/speech-audio-visualiser.js"; -import type { SpeechAudioVisualiser } from "../src/components/internal/speech-audio-visualiser.js"; +import type { SpeechAudioVisualiser } from "../core/src/components/speech-audio-visualiser.js"; import { disableControls } from "./helpers.js"; const meta = { diff --git a/stories/corti-ambient.stories.ts b/stories/corti-ambient.stories.ts index 50ac2a8..8782f56 100644 --- a/stories/corti-ambient.stories.ts +++ b/stories/corti-ambient.stories.ts @@ -1,14 +1,14 @@ import type { Meta, StoryObj } from "@storybook/web-components-vite"; import { html, nothing } from "lit"; -import "../src/components/internal/speech-audio-visualiser.js"; -import type { CortiAmbient } from "../src/components/ambient/corti-ambient.js"; +import "../core/src/components/speech-audio-visualiser.js"; +import type { CortiAmbient } from "../ambient/src/components/corti-ambient.js"; import DeviceSelectorStoryMeta from "./device-selector.stories.js"; import LanguageSelectorStoryMeta from "./language-selector.stories.js"; import SettingsMenuStoryMeta from "./settings-menu.stories.js"; -import "../src/components/ambient/corti-ambient.js"; +import "../ambient/src/components/corti-ambient.js"; import { disableControls, eventAction, diff --git a/stories/corti-dictation.stories.ts b/stories/corti-dictation.stories.ts index f2949cb..4ce7b83 100644 --- a/stories/corti-dictation.stories.ts +++ b/stories/corti-dictation.stories.ts @@ -1,14 +1,14 @@ import type { Meta, StoryObj } from "@storybook/web-components-vite"; import { html, nothing } from "lit"; -import "../src/components/internal/speech-audio-visualiser.js"; -import type { CortiDictation } from "../src/components/dictation/corti-dictation.js"; +import "../core/src/components/speech-audio-visualiser.js"; +import type { CortiDictation } from "../dictation/src/components/corti-dictation.js"; import DeviceSelectorStoryMeta from "./device-selector.stories.js"; import LanguageSelectorStoryMeta from "./language-selector.stories.js"; import SettingsMenuStoryMeta from "./settings-menu.stories.js"; -import "../src/components/dictation/corti-dictation.js"; +import "../dictation/src/components/corti-dictation.js"; import { disableControls, eventAction, diff --git a/stories/device-selector.stories.ts b/stories/device-selector.stories.ts index 33a6bef..529c79f 100644 --- a/stories/device-selector.stories.ts +++ b/stories/device-selector.stories.ts @@ -1,9 +1,9 @@ import type { Meta, StoryObj } from "@storybook/web-components-vite"; import { html, nothing } from "lit"; import { action } from "storybook/actions"; -import type { DictationDeviceSelector } from "../src/components/dictation/dictation-device-selector.js"; +import type { DictationDeviceSelector } from "../dictation/src/components/dictation-device-selector.js"; -import "../src/components/dictation/dictation-device-selector.js"; +import "../dictation/src/components/dictation-device-selector.js"; import "../src/contexts/dictation-context.js"; import type { DictationRoot } from "../src/contexts/dictation-context.js"; import { disableControls, mockDevices } from "./helpers.js"; diff --git a/stories/keybinding-selector.stories.ts b/stories/keybinding-selector.stories.ts index 3875bc8..439882d 100644 --- a/stories/keybinding-selector.stories.ts +++ b/stories/keybinding-selector.stories.ts @@ -1,9 +1,9 @@ import type { Meta, StoryObj } from "@storybook/web-components-vite"; import { html } from "lit"; import { action } from "storybook/actions"; -import type { DictationKeybindingSelector } from "../src/components/dictation/dictation-keybinding-selector.js"; +import type { DictationKeybindingSelector } from "../dictation/src/components/dictation-keybinding-selector.js"; -import "../src/components/dictation/dictation-keybinding-selector.js"; +import "../dictation/src/components/dictation-keybinding-selector.js"; import "../src/contexts/dictation-context.js"; import type { DictationRoot } from "../src/contexts/dictation-context.js"; import { disableControls } from "./helpers.js"; diff --git a/stories/language-selector.stories.ts b/stories/language-selector.stories.ts index a0e83c4..ac8a35e 100644 --- a/stories/language-selector.stories.ts +++ b/stories/language-selector.stories.ts @@ -1,9 +1,9 @@ import type { Meta, StoryObj } from "@storybook/web-components-vite"; import { html, nothing } from "lit"; import { action } from "storybook/actions"; -import type { DictationLanguageSelector } from "../src/components/dictation/dictation-language-selector.js"; +import type { DictationLanguageSelector } from "../dictation/src/components/dictation-language-selector.js"; -import "../src/components/dictation/dictation-language-selector.js"; +import "../dictation/src/components/dictation-language-selector.js"; import "../src/contexts/dictation-context.js"; import type { DictationRoot } from "../src/contexts/dictation-context.js"; diff --git a/stories/recording-button.stories.ts b/stories/recording-button.stories.ts index 7724d9b..ccde7db 100644 --- a/stories/recording-button.stories.ts +++ b/stories/recording-button.stories.ts @@ -1,9 +1,9 @@ import type { Meta, StoryObj } from "@storybook/web-components-vite"; import { html } from "lit"; import { action } from "storybook/actions"; -import type { DictationRecordingButton } from "../src/components/dictation/dictation-recording-button.js"; +import type { DictationRecordingButton } from "../dictation/src/components/dictation-recording-button.js"; -import "../src/components/dictation/dictation-recording-button.js"; +import "../dictation/src/components/dictation-recording-button.js"; import "../src/contexts/dictation-context.js"; import type { DictationRoot } from "../src/contexts/dictation-context.js"; import { disableControls } from "./helpers.js"; diff --git a/stories/settings-menu.stories.ts b/stories/settings-menu.stories.ts index 8cbd057..d4d8981 100644 --- a/stories/settings-menu.stories.ts +++ b/stories/settings-menu.stories.ts @@ -1,9 +1,9 @@ import type { Meta, StoryObj } from "@storybook/web-components-vite"; import { html, nothing } from "lit"; import { action } from "storybook/actions"; -import type { DictationSettingsMenu } from "../src/components/dictation/dictation-settings-menu.js"; +import type { DictationSettingsMenu } from "../dictation/src/components/dictation-settings-menu.js"; -import "../src/components/dictation/dictation-settings-menu.js"; +import "../dictation/src/components/dictation-settings-menu.js"; import "../src/contexts/ambient-context.js"; import "../src/contexts/dictation-context.js"; import type { DictationRoot } from "../src/contexts/dictation-context.js"; diff --git a/test/devices.test.ts b/test/devices.test.ts index a96e96a..408da7a 100644 --- a/test/devices.test.ts +++ b/test/devices.test.ts @@ -1,6 +1,6 @@ import { expect } from "@open-wc/testing"; import * as sinon from "sinon"; -import { getAudioDevices, primeMicStream } from "../src/utils/devices.js"; +import { getAudioDevices, primeMicStream } from "../core/src/utils/devices.js"; interface FakeMediaDevices { getUserMedia: sinon.SinonStub; diff --git a/tsconfig.ambient.json b/tsconfig.ambient.json deleted file mode 100644 index 1e8ff7c..0000000 --- a/tsconfig.ambient.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "dist/ambient", - "tsBuildInfoFile": "dist/ambient/.tsbuildinfo" - }, - "include": ["src/**/*.ts"], - "exclude": [ - "src/index.ts", - "src/components/dictation/**", - "src/contexts/dictation-context.ts", - "src/controllers/dictation-controller.ts" - ] -} diff --git a/tsconfig.base.json b/tsconfig.base.json new file mode 100644 index 0000000..9f2f5a9 --- /dev/null +++ b/tsconfig.base.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "es2021", + "module": "Node16", + "moduleResolution": "node16", + "noEmitOnError": true, + "lib": ["es2021", "dom", "DOM.Iterable"], + "strict": true, + "esModuleInterop": false, + "allowSyntheticDefaultImports": true, + "experimentalDecorators": true, + "importHelpers": false, + "sourceMap": true, + "inlineSources": true, + "declaration": true, + "incremental": true, + "skipLibCheck": true + } +} diff --git a/tsconfig.dictation.json b/tsconfig.dictation.json deleted file mode 100644 index e854a61..0000000 --- a/tsconfig.dictation.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "dist/dictation", - "tsBuildInfoFile": "dist/dictation/.tsbuildinfo" - }, - "include": ["src/**/*.ts"], - "exclude": [ - "src/ambient-index.ts", - "src/components/ambient/**", - "src/contexts/ambient-context.ts", - "src/controllers/ambient-controller.ts" - ] -} diff --git a/tsconfig.json b/tsconfig.json index 6a421ba..b8c7fac 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,21 +1,8 @@ { - "compilerOptions": { - "target": "es2021", - "module": "Node16", - "moduleResolution": "node16", - "noEmitOnError": true, - "lib": ["es2021", "dom", "DOM.Iterable"], - "strict": true, - "esModuleInterop": false, - "allowSyntheticDefaultImports": true, - "experimentalDecorators": true, - "importHelpers": false, - "outDir": "dist", - "sourceMap": true, - "inlineSources": true, - "declaration": true, - "incremental": true, - "skipLibCheck": true - }, - "include": ["src/**/*.ts"] + "files": [], + "references": [ + { "path": "./core" }, + { "path": "./dictation" }, + { "path": "./ambient" } + ] } diff --git a/tsconfig.stories.json b/tsconfig.stories.json index b709a36..9b18253 100644 --- a/tsconfig.stories.json +++ b/tsconfig.stories.json @@ -1,9 +1,23 @@ { - "extends": "./tsconfig.json", + "extends": "./tsconfig.base.json", "compilerOptions": { "rootDir": ".", - "outDir": "dist" + "outDir": "dist/stories", + "paths": { + "@core/*": ["./core/src/*"], + "@dictation/*": ["./dictation/src/*"], + "@ambient/*": ["./ambient/src/*"] + } }, - "include": ["stories/**/*.ts"] + "include": [ + "core/src/**/*.ts", + "dictation/src/**/*.ts", + "ambient/src/**/*.ts", + "stories/**/*.ts" + ], + "references": [ + { "path": "./core" }, + { "path": "./dictation" }, + { "path": "./ambient" } + ] } - diff --git a/tsconfig.test.json b/tsconfig.test.json index fb1f254..cedfb8f 100644 --- a/tsconfig.test.json +++ b/tsconfig.test.json @@ -1,4 +1,10 @@ { - "extends": "./tsconfig.json", - "include": ["src/**/*.ts", "test/**/*.ts"] + "extends": "./tsconfig.base.json", + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@core/*": ["core/src/*"] + } + }, + "include": ["test/**/*.ts"] } diff --git a/web-test-runner.config.js b/web-test-runner.config.js index a5f9f8b..cf08d21 100644 --- a/web-test-runner.config.js +++ b/web-test-runner.config.js @@ -1,41 +1,28 @@ -// import { playwrightLauncher } from '@web/test-runner-playwright'; +import { resolve } from "node:path"; +import { esbuildPlugin } from "@web/dev-server-esbuild"; -const filteredLogs = ['Running in dev mode', 'Lit is in dev mode']; +const filteredLogs = ["Running in dev mode", "Lit is in dev mode"]; export default /** @type {import("@web/test-runner").TestRunnerConfig} */ ({ - /** Test files to run */ - files: 'dist/test/**/*.test.js', + files: "test/**/*.ts", - /** Resolve bare module imports */ nodeResolve: { - exportConditions: ['browser', 'development'], + exportConditions: ["browser", "development"], }, - /** Filter out lit dev mode logs */ + plugins: [ + esbuildPlugin({ + ts: true, + tsconfig: resolve(process.cwd(), "tsconfig.test.json"), + }), + ], + filterBrowserLogs(log) { for (const arg of log.args) { - if (typeof arg === 'string' && filteredLogs.some(l => arg.includes(l))) { + if (typeof arg === "string" && filteredLogs.some((l) => arg.includes(l))) { return false; } } return true; }, - - /** Compile JS for older browsers. Requires @web/dev-server-esbuild plugin */ - // esbuildTarget: 'auto', - - /** Amount of browsers to run concurrently */ - // concurrentBrowsers: 2, - - /** Amount of test files per browser to test concurrently */ - // concurrency: 1, - - /** Browsers to run tests on */ - // browsers: [ - // playwrightLauncher({ product: 'chromium' }), - // playwrightLauncher({ product: 'firefox' }), - // playwrightLauncher({ product: 'webkit' }), - // ], - - // See documentation for all available options }); From 91f4b3fce55dc13d5195cb2908e5bf50e8369395 Mon Sep 17 00:00:00 2001 From: markitosha Date: Wed, 3 Jun 2026 11:18:19 +0200 Subject: [PATCH 26/50] ci: run workflow jobs on self-hosted ci runners --- .github/workflows/ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5adcaa2..3cb672a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,7 +8,7 @@ concurrency: jobs: compile: - runs-on: ubuntu-latest + runs-on: ci steps: - name: Checkout repo @@ -30,7 +30,7 @@ jobs: run: pnpm run build lint: - runs-on: ubuntu-latest + runs-on: ci steps: - name: Checkout repo @@ -52,7 +52,7 @@ jobs: run: pnpm run lint test: - runs-on: ubuntu-latest + runs-on: ci steps: - name: Checkout repo @@ -76,7 +76,7 @@ jobs: publish: needs: [compile, lint, test] if: startsWith(github.ref, 'refs/tags/v') - runs-on: ubuntu-latest + runs-on: ci permissions: contents: read id-token: write From 94827e8a36286f35bb975dd187ee472f0626d591 Mon Sep 17 00:00:00 2001 From: markitosha Date: Wed, 3 Jun 2026 11:22:13 +0200 Subject: [PATCH 27/50] chore: use 0.0.0-dev baseline and pnpm version in publish CI Set dictation and ambient package versions to 0.0.0-dev locally and apply release versions with pnpm version on tag builds. --- .github/workflows/ci.yml | 13 ++++--------- ambient/package.json | 2 +- dictation/package.json | 2 +- 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3cb672a..8184124 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -117,15 +117,10 @@ jobs: - name: Set version run: | VERSION="${{ steps.version.outputs.version }}" - for f in dictation/package.json ambient/package.json; do - node -e " - const fs = require('fs'); - const pkg = JSON.parse(fs.readFileSync('${f}', 'utf8')); - pkg.version = '${VERSION}'; - fs.writeFileSync('${f}', JSON.stringify(pkg, null, 2) + '\n'); - " - done - echo "Publish manifests version set to ${VERSION}" + pnpm --dir dictation version "$VERSION" --no-git-tag-version + pnpm --dir ambient version "$VERSION" --no-git-tag-version + echo "dictation: $(node -p "require('./dictation/package.json').version")" + echo "ambient: $(node -p "require('./ambient/package.json').version")" - name: Build run: pnpm run build diff --git a/ambient/package.json b/ambient/package.json index 0eebb44..7a4daed 100644 --- a/ambient/package.json +++ b/ambient/package.json @@ -2,7 +2,7 @@ "name": "@corti/ambient-web", "description": "Web component for Corti Ambient", "author": "Corti ApS", - "version": "0.7.0-ambient.7", + "version": "0.0.0-dev", "license": "MIT", "type": "module", "main": "index.js", diff --git a/dictation/package.json b/dictation/package.json index 2141152..1223db9 100644 --- a/dictation/package.json +++ b/dictation/package.json @@ -2,7 +2,7 @@ "name": "@corti/dictation-web", "description": "Web component for Corti Dictation", "author": "Corti ApS", - "version": "0.0.0", + "version": "0.0.0-dev", "license": "MIT", "type": "module", "main": "index.js", From cadd2028da27c983f84aa357366f579862cd599b Mon Sep 17 00:00:00 2001 From: markitosha Date: Wed, 3 Jun 2026 11:25:10 +0200 Subject: [PATCH 28/50] docs: point npm homepage and documentation to Corti SDK guides --- ambient/package.json | 3 ++- dictation/package.json | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/ambient/package.json b/ambient/package.json index 7a4daed..7f43cc3 100644 --- a/ambient/package.json +++ b/ambient/package.json @@ -23,7 +23,8 @@ "email": "help@corti.ai" }, "repository": "github:corticph/dictation-web", - "homepage": "https://docs.corti.ai/sdk/ambient/overview", + "documentation": "https://docs.corti.ai/sdk/ambient", + "homepage": "https://docs.corti.ai/sdk/ambient", "keywords": [ "corti", "ambient", diff --git a/dictation/package.json b/dictation/package.json index 1223db9..cc56ff1 100644 --- a/dictation/package.json +++ b/dictation/package.json @@ -23,7 +23,8 @@ "email": "help@corti.ai" }, "repository": "github:corticph/dictation-web", - "homepage": "https://docs.corti.ai/sdk/dictation/overview", + "documentation": "https://docs.corti.ai/sdk/dictation", + "homepage": "https://docs.corti.ai/sdk/dictation", "keywords": [ "corti", "dictation", From 87f6b368674e974a653a9f9ca98a7e0352f47d18 Mon Sep 17 00:00:00 2001 From: markitosha Date: Wed, 3 Jun 2026 11:38:22 +0200 Subject: [PATCH 29/50] refactor: inline socket message bound on RecordingButtonBase Drop RecordingSocketInboundMessage placeholder type; constrain TMessage with { type: string } at the generic declaration instead. --- core/src/components/recording-button-base.ts | 9 ++------- core/src/types.ts | 2 -- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/core/src/components/recording-button-base.ts b/core/src/components/recording-button-base.ts index 68e8ef9..5b005f3 100644 --- a/core/src/components/recording-button-base.ts +++ b/core/src/components/recording-button-base.ts @@ -34,11 +34,7 @@ import type { } from "../controllers/socket-controller.js"; import ButtonStyles from "../styles/buttons.js"; import RecordingButtonStyles from "../styles/recording-button.js"; -import type { - ProxyOptions, - RecordingSocketInboundMessage, - RecordingState, -} from "../types.js"; +import type { ProxyOptions, RecordingState } from "../types.js"; import { audioEventEvent, audioLevelChangedEvent, @@ -59,8 +55,7 @@ import "./speech-audio-visualiser.js"; export abstract class RecordingButtonBase< TConfig, - TMessage extends - RecordingSocketInboundMessage = RecordingSocketInboundMessage, + TMessage extends { type: string }, > extends LitElement { @state() _debug_displayAudio?: boolean; diff --git a/core/src/types.ts b/core/src/types.ts index 7cdc78c..90097d9 100644 --- a/core/src/types.ts +++ b/core/src/types.ts @@ -1,5 +1,3 @@ -export type RecordingSocketInboundMessage = { type: string }; - export type RecordingState = | "initializing" | "recording" From bbebcc9a8074d6944f3ef0b5bfc2040f59ab392f Mon Sep 17 00:00:00 2001 From: markitosha Date: Wed, 3 Jun 2026 11:53:58 +0200 Subject: [PATCH 30/50] refactor: centralize socket inbound types in core for shared handler Define TranscribeMessage, StreamAmbientMessage, and RecordingSocketInboundMessage in core so RecordingButtonBase can narrow the WebSocket switch while dictation and ambient components still declare their mode-specific message generic. --- ambient/src/controllers/ambient-controller.ts | 14 ++------- core/src/components/recording-button-base.ts | 27 +++++++--------- core/src/socket-messages.ts | 31 +++++++++++++++++++ .../src/controllers/dictation-controller.ts | 14 ++------- 4 files changed, 49 insertions(+), 37 deletions(-) create mode 100644 core/src/socket-messages.ts diff --git a/ambient/src/controllers/ambient-controller.ts b/ambient/src/controllers/ambient-controller.ts index 24e69c8..cbdc49a 100644 --- a/ambient/src/controllers/ambient-controller.ts +++ b/ambient/src/controllers/ambient-controller.ts @@ -1,4 +1,5 @@ import { SocketController } from "@core/controllers/socket-controller.js"; +import type { StreamAmbientMessage } from "@core/socket-messages.js"; import type { ProxyOptions } from "@core/types.js"; import { type Corti, @@ -6,6 +7,8 @@ import { CortiWebSocketProxyClient, } from "@corti/sdk"; +export type { StreamAmbientMessage } from "@core/socket-messages.js"; + export type AmbientStreamSessionConfig = { interactionId: string; configuration: Corti.StreamConfig; @@ -15,17 +18,6 @@ type AmbientStreamSocket = Awaited< ReturnType >; -export type StreamAmbientMessage = - | Corti.StreamTranscriptMessage - | Corti.StreamFactsMessage - | Corti.StreamFlushedMessage - | Corti.StreamDeltaUsageMessage - | Corti.StreamEndedMessage - | Corti.StreamUsageMessage - | Corti.StreamErrorMessage - | Corti.StreamConfigStatusMessage - | Corti.StreamAudioEventMessage; - type OutboundItem = Blob | Corti.StreamEndMessage; export class AmbientController extends SocketController< diff --git a/core/src/components/recording-button-base.ts b/core/src/components/recording-button-base.ts index 5b005f3..eea253f 100644 --- a/core/src/components/recording-button-base.ts +++ b/core/src/components/recording-button-base.ts @@ -34,6 +34,7 @@ import type { } from "../controllers/socket-controller.js"; import ButtonStyles from "../styles/buttons.js"; import RecordingButtonStyles from "../styles/recording-button.js"; +import type { RecordingSocketInboundMessage } from "../socket-messages.js"; import type { ProxyOptions, RecordingState } from "../types.js"; import { audioEventEvent, @@ -55,7 +56,7 @@ import "./speech-audio-visualiser.js"; export abstract class RecordingButtonBase< TConfig, - TMessage extends { type: string }, + TMessage extends RecordingSocketInboundMessage = RecordingSocketInboundMessage, > extends LitElement { @state() _debug_displayAudio?: boolean; @@ -155,15 +156,11 @@ export abstract class RecordingButtonBase< this.toggleRecording(); } - #handleWebSocketMessage = (message: TMessage): void => { - const inbound = message as TMessage & Record; - - switch (inbound.type) { + #handleWebSocketMessage = (message: RecordingSocketInboundMessage): void => { + switch (message.type) { case "CONFIG_DENIED": this.dispatchEvent( - errorEvent( - `Config denied: ${String(inbound.reason ?? "Unknown reason")}`, - ), + errorEvent(`Config denied: ${message.reason ?? "Unknown reason"}`), ); this.#handleStop(); break; @@ -172,25 +169,25 @@ export abstract class RecordingButtonBase< this.#handleStop(); break; case "transcript": - this.dispatchEvent(transcriptEvent(inbound as never)); + this.dispatchEvent(transcriptEvent(message)); break; case "command": - this.dispatchEvent(commandEvent(inbound as never)); + this.dispatchEvent(commandEvent(message)); break; case "facts": - this.dispatchEvent(factsEvent(inbound as never)); + this.dispatchEvent(factsEvent(message)); break; case "usage": - this.dispatchEvent(usageEvent(inbound as never)); + this.dispatchEvent(usageEvent(message)); break; case "delta_usage": - this.dispatchEvent(deltaUsageEvent(inbound as never)); + this.dispatchEvent(deltaUsageEvent(message)); break; case "audioEvent": - this.dispatchEvent(audioEventEvent(inbound as never)); + this.dispatchEvent(audioEventEvent(message)); break; case "error": - this.dispatchEvent(errorEvent(String(inbound.error))); + this.dispatchEvent(errorEvent(String(message.error))); this.#handleStop(); break; case "ended": diff --git a/core/src/socket-messages.ts b/core/src/socket-messages.ts new file mode 100644 index 0000000..0124955 --- /dev/null +++ b/core/src/socket-messages.ts @@ -0,0 +1,31 @@ +import type { Corti } from "@corti/sdk"; + +// Inbound WebSocket message unions live in core (not dictation/ambient) because +// RecordingButtonBase is shared and switches on both transcribe and stream payloads. +// A per-package generic TMessage is not narrowed inside that switch, which forces +// casts; RecordingSocketInboundMessage is the concrete union the handler branches on. +export type TranscribeMessage = + | Corti.TranscribeConfigStatusMessage + | Corti.TranscribeUsageMessage + | Corti.TranscribeDeltaUsageMessage + | Corti.TranscribeEndedMessage + | Corti.TranscribeErrorMessage + | Corti.TranscribeTranscriptMessage + | Corti.TranscribeCommandMessage + | Corti.TranscribeFlushedMessage + | Corti.TranscribeAudioEventMessage; + +export type StreamAmbientMessage = + | Corti.StreamTranscriptMessage + | Corti.StreamFactsMessage + | Corti.StreamFlushedMessage + | Corti.StreamDeltaUsageMessage + | Corti.StreamEndedMessage + | Corti.StreamUsageMessage + | Corti.StreamErrorMessage + | Corti.StreamConfigStatusMessage + | Corti.StreamAudioEventMessage; + +export type RecordingSocketInboundMessage = + | TranscribeMessage + | StreamAmbientMessage; diff --git a/dictation/src/controllers/dictation-controller.ts b/dictation/src/controllers/dictation-controller.ts index a764480..bd144db 100644 --- a/dictation/src/controllers/dictation-controller.ts +++ b/dictation/src/controllers/dictation-controller.ts @@ -1,4 +1,5 @@ import { SocketController } from "@core/controllers/socket-controller.js"; +import type { TranscribeMessage } from "@core/socket-messages.js"; import type { ProxyOptions } from "@core/types.js"; import { type Corti, @@ -6,21 +7,12 @@ import { CortiWebSocketProxyClient, } from "@corti/sdk"; +export type { TranscribeMessage } from "@core/socket-messages.js"; + type TranscribeSocket = Awaited< ReturnType >; -export type TranscribeMessage = - | Corti.TranscribeConfigStatusMessage - | Corti.TranscribeUsageMessage - | Corti.TranscribeDeltaUsageMessage - | Corti.TranscribeEndedMessage - | Corti.TranscribeErrorMessage - | Corti.TranscribeTranscriptMessage - | Corti.TranscribeCommandMessage - | Corti.TranscribeFlushedMessage - | Corti.TranscribeAudioEventMessage; - type OutboundItem = | Blob | Corti.TranscribeFlushMessage From 467d199bd8db8962eec6c54a180e1ce09b909b83 Mon Sep 17 00:00:00 2001 From: markitosha Date: Wed, 3 Jun 2026 11:56:46 +0200 Subject: [PATCH 31/50] refactor: type WebSocket handler with TMessage on RecordingButtonBase Keep the existing handler shape; RecordingSocketInboundMessage remains the generic bound and shared union in core. --- core/src/components/recording-button-base.ts | 24 ++++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/core/src/components/recording-button-base.ts b/core/src/components/recording-button-base.ts index eea253f..f3331c1 100644 --- a/core/src/components/recording-button-base.ts +++ b/core/src/components/recording-button-base.ts @@ -156,11 +156,15 @@ export abstract class RecordingButtonBase< this.toggleRecording(); } - #handleWebSocketMessage = (message: RecordingSocketInboundMessage): void => { - switch (message.type) { + #handleWebSocketMessage = (message: TMessage): void => { + const inbound = message as TMessage & Record; + + switch (inbound.type) { case "CONFIG_DENIED": this.dispatchEvent( - errorEvent(`Config denied: ${message.reason ?? "Unknown reason"}`), + errorEvent( + `Config denied: ${String(inbound.reason ?? "Unknown reason")}`, + ), ); this.#handleStop(); break; @@ -169,25 +173,25 @@ export abstract class RecordingButtonBase< this.#handleStop(); break; case "transcript": - this.dispatchEvent(transcriptEvent(message)); + this.dispatchEvent(transcriptEvent(inbound as never)); break; case "command": - this.dispatchEvent(commandEvent(message)); + this.dispatchEvent(commandEvent(inbound as never)); break; case "facts": - this.dispatchEvent(factsEvent(message)); + this.dispatchEvent(factsEvent(inbound as never)); break; case "usage": - this.dispatchEvent(usageEvent(message)); + this.dispatchEvent(usageEvent(inbound as never)); break; case "delta_usage": - this.dispatchEvent(deltaUsageEvent(message)); + this.dispatchEvent(deltaUsageEvent(inbound as never)); break; case "audioEvent": - this.dispatchEvent(audioEventEvent(message)); + this.dispatchEvent(audioEventEvent(inbound as never)); break; case "error": - this.dispatchEvent(errorEvent(String(message.error))); + this.dispatchEvent(errorEvent(String(inbound.error))); this.#handleStop(); break; case "ended": From 1b5682bdc61deb925a511e8a5b1e3daa9b59c55a Mon Sep 17 00:00:00 2001 From: markitosha Date: Wed, 3 Jun 2026 12:03:30 +0200 Subject: [PATCH 32/50] refactor: narrow TMessage in WebSocket handler without casts Rely on RecordingSocketInboundMessage as the generic bound so switch cases dispatch events directly from message. --- core/src/components/recording-button-base.ts | 21 +++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/core/src/components/recording-button-base.ts b/core/src/components/recording-button-base.ts index f3331c1..b5577d9 100644 --- a/core/src/components/recording-button-base.ts +++ b/core/src/components/recording-button-base.ts @@ -157,14 +157,11 @@ export abstract class RecordingButtonBase< } #handleWebSocketMessage = (message: TMessage): void => { - const inbound = message as TMessage & Record; - switch (inbound.type) { + switch (message.type) { case "CONFIG_DENIED": this.dispatchEvent( - errorEvent( - `Config denied: ${String(inbound.reason ?? "Unknown reason")}`, - ), + errorEvent(`Config denied: ${message.reason ?? "Unknown reason"}`), ); this.#handleStop(); break; @@ -173,25 +170,25 @@ export abstract class RecordingButtonBase< this.#handleStop(); break; case "transcript": - this.dispatchEvent(transcriptEvent(inbound as never)); + this.dispatchEvent(transcriptEvent(message)); break; case "command": - this.dispatchEvent(commandEvent(inbound as never)); + this.dispatchEvent(commandEvent(message)); break; case "facts": - this.dispatchEvent(factsEvent(inbound as never)); + this.dispatchEvent(factsEvent(message)); break; case "usage": - this.dispatchEvent(usageEvent(inbound as never)); + this.dispatchEvent(usageEvent(message)); break; case "delta_usage": - this.dispatchEvent(deltaUsageEvent(inbound as never)); + this.dispatchEvent(deltaUsageEvent(message)); break; case "audioEvent": - this.dispatchEvent(audioEventEvent(inbound as never)); + this.dispatchEvent(audioEventEvent(message)); break; case "error": - this.dispatchEvent(errorEvent(String(inbound.error))); + this.dispatchEvent(errorEvent(message.error)); this.#handleStop(); break; case "ended": From 93c0a644a4eb4b4fbb65247ee27060779ee5e815 Mon Sep 17 00:00:00 2001 From: markitosha Date: Wed, 3 Jun 2026 14:05:08 +0200 Subject: [PATCH 33/50] chore: trim blank line in WebSocket message handler --- core/src/components/recording-button-base.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/core/src/components/recording-button-base.ts b/core/src/components/recording-button-base.ts index b5577d9..73af2a4 100644 --- a/core/src/components/recording-button-base.ts +++ b/core/src/components/recording-button-base.ts @@ -157,7 +157,6 @@ export abstract class RecordingButtonBase< } #handleWebSocketMessage = (message: TMessage): void => { - switch (message.type) { case "CONFIG_DENIED": this.dispatchEvent( From f658e0a88000aa7e46d912b019e355a2aa85a2a9 Mon Sep 17 00:00:00 2001 From: markitosha Date: Wed, 3 Jun 2026 14:46:06 +0200 Subject: [PATCH 34/50] ci: use ubuntu-latest runners again Self-hosted ci runners were blocking workflow jobs from completing reliably. --- .github/workflows/ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8184124..1702031 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,7 +8,7 @@ concurrency: jobs: compile: - runs-on: ci + runs-on: ubuntu-latest steps: - name: Checkout repo @@ -30,7 +30,7 @@ jobs: run: pnpm run build lint: - runs-on: ci + runs-on: ubuntu-latest steps: - name: Checkout repo @@ -52,7 +52,7 @@ jobs: run: pnpm run lint test: - runs-on: ci + runs-on: ubuntu-latest steps: - name: Checkout repo @@ -76,7 +76,7 @@ jobs: publish: needs: [compile, lint, test] if: startsWith(github.ref, 'refs/tags/v') - runs-on: ci + runs-on: ubuntu-latest permissions: contents: read id-token: write From 22e081f6a0f173a9aa4bbfcf14061c04ebc3b45a Mon Sep 17 00:00:00 2001 From: markitosha Date: Wed, 3 Jun 2026 14:48:07 +0200 Subject: [PATCH 35/50] ci: switch workflow jobs back to self-hosted ci runners --- .github/workflows/ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1702031..8184124 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,7 +8,7 @@ concurrency: jobs: compile: - runs-on: ubuntu-latest + runs-on: ci steps: - name: Checkout repo @@ -30,7 +30,7 @@ jobs: run: pnpm run build lint: - runs-on: ubuntu-latest + runs-on: ci steps: - name: Checkout repo @@ -52,7 +52,7 @@ jobs: run: pnpm run lint test: - runs-on: ubuntu-latest + runs-on: ci steps: - name: Checkout repo @@ -76,7 +76,7 @@ jobs: publish: needs: [compile, lint, test] if: startsWith(github.ref, 'refs/tags/v') - runs-on: ubuntu-latest + runs-on: ci permissions: contents: read id-token: write From e696d96355d300fbe4f8ff2b52a28bc778236237 Mon Sep 17 00:00:00 2001 From: markitosha Date: Wed, 3 Jun 2026 14:56:36 +0200 Subject: [PATCH 36/50] ci: use ubuntu-latest runners for workflow jobs --- .github/workflows/ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8184124..1702031 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,7 +8,7 @@ concurrency: jobs: compile: - runs-on: ci + runs-on: ubuntu-latest steps: - name: Checkout repo @@ -30,7 +30,7 @@ jobs: run: pnpm run build lint: - runs-on: ci + runs-on: ubuntu-latest steps: - name: Checkout repo @@ -52,7 +52,7 @@ jobs: run: pnpm run lint test: - runs-on: ci + runs-on: ubuntu-latest steps: - name: Checkout repo @@ -76,7 +76,7 @@ jobs: publish: needs: [compile, lint, test] if: startsWith(github.ref, 'refs/tags/v') - runs-on: ci + runs-on: ubuntu-latest permissions: contents: read id-token: write From 9fcfb2d0cf89d4a44760d697877530a898628c0a Mon Sep 17 00:00:00 2001 From: markitosha Date: Wed, 3 Jun 2026 15:02:51 +0200 Subject: [PATCH 37/50] fix(ci): install core compile deps at workspace root Add lit, @corti/sdk, and @lit/context to root devDependencies so tsc -p core resolves on CI; align Biome schema and format recording-button-base imports. --- biome.json | 2 +- core/src/components/recording-button-base.ts | 5 +++-- package.json | 3 +++ pnpm-lock.yaml | 9 +++++++++ 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/biome.json b/biome.json index 3b390d7..707e868 100644 --- a/biome.json +++ b/biome.json @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/2.3.6/schema.json", + "$schema": "https://biomejs.dev/schemas/2.4.16/schema.json", "assist": { "actions": { "source": { diff --git a/core/src/components/recording-button-base.ts b/core/src/components/recording-button-base.ts index 73af2a4..990b433 100644 --- a/core/src/components/recording-button-base.ts +++ b/core/src/components/recording-button-base.ts @@ -32,9 +32,9 @@ import type { SocketControllerOutboundItem, SocketControllerWebSocket, } from "../controllers/socket-controller.js"; +import type { RecordingSocketInboundMessage } from "../socket-messages.js"; import ButtonStyles from "../styles/buttons.js"; import RecordingButtonStyles from "../styles/recording-button.js"; -import type { RecordingSocketInboundMessage } from "../socket-messages.js"; import type { ProxyOptions, RecordingState } from "../types.js"; import { audioEventEvent, @@ -56,7 +56,8 @@ import "./speech-audio-visualiser.js"; export abstract class RecordingButtonBase< TConfig, - TMessage extends RecordingSocketInboundMessage = RecordingSocketInboundMessage, + TMessage extends + RecordingSocketInboundMessage = RecordingSocketInboundMessage, > extends LitElement { @state() _debug_displayAudio?: boolean; diff --git a/package.json b/package.json index 286ad1c..082e569 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,8 @@ "storybook:build": "tsc -p core && tsc -p tsconfig.stories.json && pnpm run analyze && storybook build" }, "devDependencies": { + "@corti/sdk": "3.0.0", + "@lit/context": "^1.1.6", "@biomejs/biome": "^2.3.6", "@custom-elements-manifest/analyzer": "^0.10.3", "@open-wc/testing": "^4.0.0", @@ -35,6 +37,7 @@ "concurrently": "^8.2.2", "esbuild": "^0.25.0", "husky": "^8.0.0", + "lit": "^3.3.1", "lint-staged": "^15.2.7", "sinon": "^19.0.2", "storybook": "10.1.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4f646c2..d7f4eb4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,9 +11,15 @@ importers: '@biomejs/biome': specifier: ^2.3.6 version: 2.4.16 + '@corti/sdk': + specifier: 3.0.0 + version: 3.0.0 '@custom-elements-manifest/analyzer': specifier: ^0.10.3 version: 0.10.10 + '@lit/context': + specifier: ^1.1.6 + version: 1.1.6 '@open-wc/testing': specifier: ^4.0.0 version: 4.0.0 @@ -59,6 +65,9 @@ importers: lint-staged: specifier: ^15.2.7 version: 15.5.2 + lit: + specifier: ^3.3.1 + version: 3.3.3 sinon: specifier: ^19.0.2 version: 19.0.5 From 4ac3e90fea99a93b34d1cd7e74c33d33028ef3c8 Mon Sep 17 00:00:00 2001 From: markitosha Date: Wed, 3 Jun 2026 15:47:00 +0200 Subject: [PATCH 38/50] fix(ci): set package version from dictation/ and ambient/ directories pnpm version at the workspace root does not honor --dir; run it inside each package folder instead. --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1702031..33d547e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -117,8 +117,8 @@ jobs: - name: Set version run: | VERSION="${{ steps.version.outputs.version }}" - pnpm --dir dictation version "$VERSION" --no-git-tag-version - pnpm --dir ambient version "$VERSION" --no-git-tag-version + (cd dictation && pnpm version "$VERSION" --no-git-tag-version) + (cd ambient && pnpm version "$VERSION" --no-git-tag-version) echo "dictation: $(node -p "require('./dictation/package.json').version")" echo "ambient: $(node -p "require('./ambient/package.json').version")" From 8bec61a0c19b6a06428d815d9f500258b2172b7d Mon Sep 17 00:00:00 2001 From: markitosha Date: Wed, 3 Jun 2026 16:13:52 +0200 Subject: [PATCH 39/50] fix(publish): resolve package entry to bundle.js tsc output keeps @core imports that are not published; only bundle.js inlines core. Point main/module and exports.import at bundle.js so Vite and other bundlers load the correct artifact. --- ambient/package.json | 7 +++---- dictation/package.json | 7 +++---- scripts/build-ambient.mjs | 13 +++++++++++-- scripts/build-dictation.mjs | 13 +++++++++++-- 4 files changed, 28 insertions(+), 12 deletions(-) diff --git a/ambient/package.json b/ambient/package.json index 7f43cc3..bca4e55 100644 --- a/ambient/package.json +++ b/ambient/package.json @@ -5,14 +5,13 @@ "version": "0.0.0-dev", "license": "MIT", "type": "module", - "main": "index.js", - "module": "index.js", + "main": "bundle.js", + "module": "bundle.js", "types": "index.d.ts", "exports": { ".": { "types": "./index.d.ts", - "import": "./index.js", - "browser": "./bundle.js", + "import": "./bundle.js", "default": "./bundle.js" } }, diff --git a/dictation/package.json b/dictation/package.json index cc56ff1..010b9b7 100644 --- a/dictation/package.json +++ b/dictation/package.json @@ -5,14 +5,13 @@ "version": "0.0.0-dev", "license": "MIT", "type": "module", - "main": "index.js", - "module": "index.js", + "main": "bundle.js", + "module": "bundle.js", "types": "index.d.ts", "exports": { ".": { "types": "./index.d.ts", - "import": "./index.js", - "browser": "./bundle.js", + "import": "./bundle.js", "default": "./bundle.js" } }, diff --git a/scripts/build-ambient.mjs b/scripts/build-ambient.mjs index 8904106..2a21379 100644 --- a/scripts/build-ambient.mjs +++ b/scripts/build-ambient.mjs @@ -1,4 +1,4 @@ -import { cpSync } from "node:fs"; +import { cpSync, readFileSync, writeFileSync } from "node:fs"; import { dirname, resolve } from "node:path"; import { fileURLToPath } from "node:url"; import * as esbuild from "esbuild"; @@ -17,4 +17,13 @@ await esbuild.build({ platform: "browser", }); -cpSync(resolve(pkgDir, "package.json"), resolve(pkgDir, "dist/package.json")); +const distPkgPath = resolve(pkgDir, "dist/package.json"); +cpSync(resolve(pkgDir, "package.json"), distPkgPath); + +const distPkg = JSON.parse(readFileSync(distPkgPath, "utf8")); +if (distPkg.exports?.["."]?.import !== "./bundle.js") { + throw new Error( + "ambient package.json must resolve the main entry to ./bundle.js (tsc output keeps unresolved @core imports)", + ); +} +writeFileSync(distPkgPath, `${JSON.stringify(distPkg, null, 2)}\n`); diff --git a/scripts/build-dictation.mjs b/scripts/build-dictation.mjs index 36bf521..79306e0 100644 --- a/scripts/build-dictation.mjs +++ b/scripts/build-dictation.mjs @@ -1,4 +1,4 @@ -import { cpSync } from "node:fs"; +import { cpSync, readFileSync, writeFileSync } from "node:fs"; import { dirname, resolve } from "node:path"; import { fileURLToPath } from "node:url"; import * as esbuild from "esbuild"; @@ -17,4 +17,13 @@ await esbuild.build({ platform: "browser", }); -cpSync(resolve(pkgDir, "package.json"), resolve(pkgDir, "dist/package.json")); +const distPkgPath = resolve(pkgDir, "dist/package.json"); +cpSync(resolve(pkgDir, "package.json"), distPkgPath); + +const distPkg = JSON.parse(readFileSync(distPkgPath, "utf8")); +if (distPkg.exports?.["."]?.import !== "./bundle.js") { + throw new Error( + "dictation package.json must resolve the main entry to ./bundle.js (tsc output keeps unresolved @core imports)", + ); +} +writeFileSync(distPkgPath, `${JSON.stringify(distPkg, null, 2)}\n`); From de6d483a2919c954ebb4e9b987f2f7d663e43eaa Mon Sep 17 00:00:00 2001 From: markitosha Date: Wed, 3 Jun 2026 16:41:12 +0200 Subject: [PATCH 40/50] fix(core): skip duplicate custom element registration Shared core tags are bundled into both dictation-web and ambient-web. Guard registration so loading both packages on one page does not throw. --- .../src/components/speech-audio-visualiser.ts | 5 ++-- .../src/components/speech-keybinding-input.ts | 5 ++-- core/src/icons/icons.ts | 14 +++++----- core/src/utils/custom-elements.ts | 27 +++++++++++++++++++ 4 files changed, 40 insertions(+), 11 deletions(-) create mode 100644 core/src/utils/custom-elements.ts diff --git a/core/src/components/speech-audio-visualiser.ts b/core/src/components/speech-audio-visualiser.ts index fcb1511..4327508 100644 --- a/core/src/components/speech-audio-visualiser.ts +++ b/core/src/components/speech-audio-visualiser.ts @@ -1,12 +1,13 @@ import { html, LitElement, type PropertyValues } from "lit"; -import { customElement, property } from "lit/decorators.js"; +import { property } from "lit/decorators.js"; +import { safeCustomElement } from "../utils/custom-elements.js"; import { classMap } from "lit/directives/class-map.js"; import { map } from "lit/directives/map.js"; import { range } from "lit/directives/range.js"; import AudioVisualiserStyles from "../styles/audio-visualiser.js"; import { normalizeToRange } from "../utils/validation.js"; -@customElement("speech-audio-visualiser") +@safeCustomElement("speech-audio-visualiser") export class SpeechAudioVisualiser extends LitElement { @property({ type: Number }) level: number = 0; diff --git a/core/src/components/speech-keybinding-input.ts b/core/src/components/speech-keybinding-input.ts index 8d7d676..63e3757 100644 --- a/core/src/components/speech-keybinding-input.ts +++ b/core/src/components/speech-keybinding-input.ts @@ -1,6 +1,7 @@ import { consume } from "@lit/context"; import { html, LitElement } from "lit"; -import { customElement, property, state } from "lit/decorators.js"; +import { property, state } from "lit/decorators.js"; +import { safeCustomElement } from "../utils/custom-elements.js"; import { pushToTalkKeybindingContext, toggleToTalkKeybindingContext, @@ -9,7 +10,7 @@ import KeybindingSelectorStyles from "../styles/keybinding-selector.js"; import { keybindingChangedEvent } from "../utils/events.js"; import { normalizeKeybinding } from "../utils/keybinding.js"; -@customElement("speech-keybinding-input") +@safeCustomElement("speech-keybinding-input") export class SpeechKeybindingInput extends LitElement { @property({ type: String }) keybindingType: "push-to-talk" | "toggle-to-talk" = "toggle-to-talk"; diff --git a/core/src/icons/icons.ts b/core/src/icons/icons.ts index 5618cbd..a0378bb 100644 --- a/core/src/icons/icons.ts +++ b/core/src/icons/icons.ts @@ -1,8 +1,8 @@ /* eslint-disable max-classes-per-file */ import { css, html, LitElement } from "lit"; -import { customElement } from "lit/decorators.js"; +import { safeCustomElement } from "../utils/custom-elements.js"; -@customElement("icon-mic-on") +@safeCustomElement("icon-mic-on") export class IconMicOn extends LitElement { render() { return html` @@ -28,7 +28,7 @@ export class IconMicOn extends LitElement { } } -@customElement("icon-mic-off") +@safeCustomElement("icon-mic-off") export class IconMicOff extends LitElement { render() { return html`
@@ -55,7 +55,7 @@ export class IconMicOff extends LitElement { } } -@customElement("icon-recording") +@safeCustomElement("icon-recording") export class IconRecording extends LitElement { render() { return html` @@ -79,7 +79,7 @@ export class IconRecording extends LitElement { `; } } -@customElement("icon-settings") +@safeCustomElement("icon-settings") export class IconSettings extends LitElement { render() { return html`
@@ -104,7 +104,7 @@ export class IconSettings extends LitElement { } } -@customElement("icon-headset") +@safeCustomElement("icon-headset") export class IconHeadset extends LitElement { static styles = css` :host { @@ -139,7 +139,7 @@ export class IconHeadset extends LitElement { } } -@customElement("icon-loading-spinner") +@safeCustomElement("icon-loading-spinner") export class IconLoadingSpinner extends LitElement { static styles = css` @keyframes spin { diff --git a/core/src/utils/custom-elements.ts b/core/src/utils/custom-elements.ts new file mode 100644 index 0000000..5950ce7 --- /dev/null +++ b/core/src/utils/custom-elements.ts @@ -0,0 +1,27 @@ +/** + * Like Lit's `@customElement`, but skips registration when the tag already exists. + * Both published bundles inline core, so pages that load dictation and ambient + * must not throw on duplicate registry entries. + */ +export function safeCustomElement(tag: string) { + return ( + classOrTarget: T, + context?: ClassDecoratorContext, + ): T => { + if (customElements.get(tag)) { + return classOrTarget; + } + + if (context !== undefined) { + context.addInitializer(() => { + if (!customElements.get(tag)) { + customElements.define(tag, classOrTarget); + } + }); + return classOrTarget; + } + + customElements.define(tag, classOrTarget); + return classOrTarget; + }; +} From 6e118636e6052788ab6f041a782c24eac8117722 Mon Sep 17 00:00:00 2001 From: markitosha Date: Wed, 3 Jun 2026 16:42:20 +0200 Subject: [PATCH 41/50] chore: fix import order for safeCustomElement --- core/src/components/speech-audio-visualiser.ts | 2 +- core/src/components/speech-keybinding-input.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/components/speech-audio-visualiser.ts b/core/src/components/speech-audio-visualiser.ts index 4327508..4ac519f 100644 --- a/core/src/components/speech-audio-visualiser.ts +++ b/core/src/components/speech-audio-visualiser.ts @@ -1,10 +1,10 @@ import { html, LitElement, type PropertyValues } from "lit"; import { property } from "lit/decorators.js"; -import { safeCustomElement } from "../utils/custom-elements.js"; import { classMap } from "lit/directives/class-map.js"; import { map } from "lit/directives/map.js"; import { range } from "lit/directives/range.js"; import AudioVisualiserStyles from "../styles/audio-visualiser.js"; +import { safeCustomElement } from "../utils/custom-elements.js"; import { normalizeToRange } from "../utils/validation.js"; @safeCustomElement("speech-audio-visualiser") diff --git a/core/src/components/speech-keybinding-input.ts b/core/src/components/speech-keybinding-input.ts index 63e3757..53963a8 100644 --- a/core/src/components/speech-keybinding-input.ts +++ b/core/src/components/speech-keybinding-input.ts @@ -1,12 +1,12 @@ import { consume } from "@lit/context"; import { html, LitElement } from "lit"; import { property, state } from "lit/decorators.js"; -import { safeCustomElement } from "../utils/custom-elements.js"; import { pushToTalkKeybindingContext, toggleToTalkKeybindingContext, } from "../contexts/mixins/keybindings-context.js"; import KeybindingSelectorStyles from "../styles/keybinding-selector.js"; +import { safeCustomElement } from "../utils/custom-elements.js"; import { keybindingChangedEvent } from "../utils/events.js"; import { normalizeKeybinding } from "../utils/keybinding.js"; From bbd2a512da74ba166c7d8df98923c7821049fe14 Mon Sep 17 00:00:00 2001 From: markitosha Date: Wed, 3 Jun 2026 17:08:44 +0200 Subject: [PATCH 42/50] chore: name shared workspace package @corti/core-web Wire dictation and ambient to @corti/core-web workspace imports, add core/package.json, and strip the bundled core dep from dist manifests before publish. --- .storybook/main.js | 2 +- ambient/package.json | 3 ++- .../src/components/ambient-device-selector.ts | 2 +- .../components/ambient-keybinding-selector.ts | 2 +- .../components/ambient-language-selector.ts | 2 +- .../components/ambient-recording-button.ts | 4 ++-- .../src/components/ambient-settings-menu.ts | 2 +- .../ambient-virtual-mode-selector.ts | 4 ++-- ambient/src/components/corti-ambient.ts | 6 ++--- ambient/src/contexts/ambient-context.ts | 2 +- ambient/src/controllers/ambient-controller.ts | 8 +++---- ambient/src/index.ts | 4 ++-- ambient/tsconfig.json | 2 +- core/package.json | 23 ++++++++++++++++++ dictation/package.json | 3 ++- dictation/src/components/corti-dictation.ts | 2 +- .../components/dictation-device-selector.ts | 2 +- .../dictation-keybinding-selector.ts | 2 +- .../components/dictation-language-selector.ts | 2 +- .../components/dictation-recording-button.ts | 2 +- .../src/components/dictation-settings-menu.ts | 2 +- dictation/src/contexts/dictation-context.ts | 2 +- .../src/controllers/dictation-controller.ts | 8 +++---- dictation/src/index.ts | 4 ++-- dictation/tsconfig.json | 2 +- package.json | 12 +++++----- pnpm-lock.yaml | 24 ++++++++++++++++--- pnpm-workspace.yaml | 1 + scripts/build-ambient.mjs | 7 +++--- scripts/build-dictation.mjs | 7 +++--- tsconfig.stories.json | 2 +- tsconfig.test.json | 2 +- 32 files changed, 97 insertions(+), 55 deletions(-) create mode 100644 core/package.json diff --git a/.storybook/main.js b/.storybook/main.js index 6d6793c..845b647 100644 --- a/.storybook/main.js +++ b/.storybook/main.js @@ -16,7 +16,7 @@ export default { config.resolve ??= {}; config.resolve.alias = { ...config.resolve.alias, - "@core": resolve(root, "core/src"), + "@corti/core-web": resolve(root, "core/src"), }; return config; }, diff --git a/ambient/package.json b/ambient/package.json index bca4e55..2868327 100644 --- a/ambient/package.json +++ b/ambient/package.json @@ -38,9 +38,10 @@ "real-time" ], "dependencies": { + "@corti/core-web": "workspace:*", "@corti/sdk": "3.0.0", "@lit/context": "^1.1.6", - "lit": "^3.3.1" + "lit": "^3.3.3" }, "scripts": { "build": "tsc -b && node ../scripts/build-ambient.mjs" diff --git a/ambient/src/components/ambient-device-selector.ts b/ambient/src/components/ambient-device-selector.ts index 78dca7e..8434e2e 100644 --- a/ambient/src/components/ambient-device-selector.ts +++ b/ambient/src/components/ambient-device-selector.ts @@ -1,4 +1,4 @@ -import { DeviceSelectorBase } from "@core/components/device-selector-base.js"; +import { DeviceSelectorBase } from "@corti/core-web/components/device-selector-base.js"; import { customElement } from "lit/decorators.js"; @customElement("ambient-device-selector") diff --git a/ambient/src/components/ambient-keybinding-selector.ts b/ambient/src/components/ambient-keybinding-selector.ts index 0b073b0..9f47782 100644 --- a/ambient/src/components/ambient-keybinding-selector.ts +++ b/ambient/src/components/ambient-keybinding-selector.ts @@ -1,4 +1,4 @@ -import { KeybindingSelectorBase } from "@core/components/keybinding-selector-base.js"; +import { KeybindingSelectorBase } from "@corti/core-web/components/keybinding-selector-base.js"; import { customElement } from "lit/decorators.js"; @customElement("ambient-keybinding-selector") diff --git a/ambient/src/components/ambient-language-selector.ts b/ambient/src/components/ambient-language-selector.ts index 99f483f..5ba76f7 100644 --- a/ambient/src/components/ambient-language-selector.ts +++ b/ambient/src/components/ambient-language-selector.ts @@ -1,4 +1,4 @@ -import { LanguageSelectorBase } from "@core/components/language-selector-base.js"; +import { LanguageSelectorBase } from "@corti/core-web/components/language-selector-base.js"; import { customElement } from "lit/decorators.js"; @customElement("ambient-language-selector") diff --git a/ambient/src/components/ambient-recording-button.ts b/ambient/src/components/ambient-recording-button.ts index b91d9c5..c59b24c 100644 --- a/ambient/src/components/ambient-recording-button.ts +++ b/ambient/src/components/ambient-recording-button.ts @@ -1,5 +1,5 @@ -import { RecordingButtonBase } from "@core/components/recording-button-base.js"; -import { errorEvent } from "@core/utils/events.js"; +import { RecordingButtonBase } from "@corti/core-web/components/recording-button-base.js"; +import { errorEvent } from "@corti/core-web/utils/events.js"; import type { Corti } from "@corti/sdk"; import { consume } from "@lit/context"; import { customElement, state } from "lit/decorators.js"; diff --git a/ambient/src/components/ambient-settings-menu.ts b/ambient/src/components/ambient-settings-menu.ts index 4f1a8ed..5387863 100644 --- a/ambient/src/components/ambient-settings-menu.ts +++ b/ambient/src/components/ambient-settings-menu.ts @@ -1,4 +1,4 @@ -import { SettingsMenuBase } from "@core/components/settings-menu-base.js"; +import { SettingsMenuBase } from "@corti/core-web/components/settings-menu-base.js"; import type { TemplateResult } from "lit"; import { html } from "lit"; import { customElement } from "lit/decorators.js"; diff --git a/ambient/src/components/ambient-virtual-mode-selector.ts b/ambient/src/components/ambient-virtual-mode-selector.ts index 5e483a6..7a05261 100644 --- a/ambient/src/components/ambient-virtual-mode-selector.ts +++ b/ambient/src/components/ambient-virtual-mode-selector.ts @@ -1,11 +1,11 @@ -import { virtualModeChangedEvent } from "@core/utils/events.js"; +import { virtualModeChangedEvent } from "@corti/core-web/utils/events.js"; import { consume } from "@lit/context"; import { html, LitElement } from "lit"; import { customElement, property, state } from "lit/decorators.js"; import { virtualModeContext } from "../contexts/ambient-context.js"; import AmbientVirtualModeSelectorStyles from "../styles/ambient-virtual-mode-selector.js"; -import "@core/icons/icons.js"; +import "@corti/core-web/icons/icons.js"; @customElement("ambient-virtual-mode-selector") export class AmbientVirtualModeSelector extends LitElement { diff --git a/ambient/src/components/corti-ambient.ts b/ambient/src/components/corti-ambient.ts index fae3f48..3d6283a 100644 --- a/ambient/src/components/corti-ambient.ts +++ b/ambient/src/components/corti-ambient.ts @@ -1,6 +1,6 @@ -import { CortiRoot } from "@core/components/corti-root.js"; -import type { ConfigurableSettings } from "@core/types.js"; -import { commaSeparatedConverter } from "@core/utils/converters.js"; +import { CortiRoot } from "@corti/core-web/components/corti-root.js"; +import type { ConfigurableSettings } from "@corti/core-web/types.js"; +import { commaSeparatedConverter } from "@corti/core-web/utils/converters.js"; import type { Corti } from "@corti/sdk"; import { html, nothing } from "lit"; import { customElement, property, state } from "lit/decorators.js"; diff --git a/ambient/src/contexts/ambient-context.ts b/ambient/src/contexts/ambient-context.ts index 88ac1de..613483b 100644 --- a/ambient/src/contexts/ambient-context.ts +++ b/ambient/src/contexts/ambient-context.ts @@ -1,4 +1,4 @@ -import { RootContext } from "@core/contexts/root-context.js"; +import { RootContext } from "@corti/core-web/contexts/root-context.js"; import type { Corti } from "@corti/sdk"; import { createContext, provide } from "@lit/context"; import type { PropertyValues } from "lit"; diff --git a/ambient/src/controllers/ambient-controller.ts b/ambient/src/controllers/ambient-controller.ts index cbdc49a..99af8c0 100644 --- a/ambient/src/controllers/ambient-controller.ts +++ b/ambient/src/controllers/ambient-controller.ts @@ -1,13 +1,13 @@ -import { SocketController } from "@core/controllers/socket-controller.js"; -import type { StreamAmbientMessage } from "@core/socket-messages.js"; -import type { ProxyOptions } from "@core/types.js"; +import { SocketController } from "@corti/core-web/controllers/socket-controller.js"; +import type { StreamAmbientMessage } from "@corti/core-web/socket-messages.js"; +import type { ProxyOptions } from "@corti/core-web/types.js"; import { type Corti, type CortiClient, CortiWebSocketProxyClient, } from "@corti/sdk"; -export type { StreamAmbientMessage } from "@core/socket-messages.js"; +export type { StreamAmbientMessage } from "@corti/core-web/socket-messages.js"; export type AmbientStreamSessionConfig = { interactionId: string; diff --git a/ambient/src/index.ts b/ambient/src/index.ts index 5d3ee3f..570a2ff 100644 --- a/ambient/src/index.ts +++ b/ambient/src/index.ts @@ -2,7 +2,7 @@ export type { ConfigurableSettings, Keybinding, RecordingState, -} from "@core/types.js"; +} from "@corti/core-web/types.js"; export type { AudioEventEventDetail, AudioLevelChangedEventDetail, @@ -19,7 +19,7 @@ export type { TranscriptEventDetail, UsageEventDetail, VirtualModeChangedEventDetail, -} from "@core/utils/events.js"; +} from "@corti/core-web/utils/events.js"; export { AmbientDeviceSelector } from "./components/ambient-device-selector.js"; export { AmbientKeybindingSelector } from "./components/ambient-keybinding-selector.js"; export { AmbientLanguageSelector } from "./components/ambient-language-selector.js"; diff --git a/ambient/tsconfig.json b/ambient/tsconfig.json index 1cbe28d..a979a2f 100644 --- a/ambient/tsconfig.json +++ b/ambient/tsconfig.json @@ -6,7 +6,7 @@ "outDir": "dist", "tsBuildInfoFile": "dist/.tsbuildinfo", "paths": { - "@core/*": ["../core/src/*"] + "@corti/core-web/*": ["../core/src/*"] } }, "include": ["src/**/*.ts"], diff --git a/core/package.json b/core/package.json new file mode 100644 index 0000000..2d3f9e5 --- /dev/null +++ b/core/package.json @@ -0,0 +1,23 @@ +{ + "name": "@corti/core-web", + "description": "Shared Corti speech web component core (dictation + ambient)", + "version": "0.0.0-dev", + "private": true, + "license": "MIT", + "type": "module", + "exports": { + "./*": { + "types": "./dist/*.d.ts", + "import": "./dist/*.js", + "default": "./dist/*.js" + } + }, + "dependencies": { + "@corti/sdk": "3.0.0", + "@lit/context": "^1.1.6", + "lit": "^3.3.3" + }, + "scripts": { + "build": "tsc -b" + } +} diff --git a/dictation/package.json b/dictation/package.json index 010b9b7..ff5d3aa 100644 --- a/dictation/package.json +++ b/dictation/package.json @@ -37,9 +37,10 @@ "healthcare" ], "dependencies": { + "@corti/core-web": "workspace:*", "@corti/sdk": "3.0.0", "@lit/context": "^1.1.6", - "lit": "^3.3.1" + "lit": "^3.3.3" }, "scripts": { "build": "tsc -b && node ../scripts/build-dictation.mjs" diff --git a/dictation/src/components/corti-dictation.ts b/dictation/src/components/corti-dictation.ts index d745439..3bf3e64 100644 --- a/dictation/src/components/corti-dictation.ts +++ b/dictation/src/components/corti-dictation.ts @@ -1,4 +1,4 @@ -import { CortiRoot } from "@core/components/corti-root.js"; +import { CortiRoot } from "@corti/core-web/components/corti-root.js"; import type { Corti, CortiAuth } from "@corti/sdk"; import { html, nothing } from "lit"; import { customElement, property, state } from "lit/decorators.js"; diff --git a/dictation/src/components/dictation-device-selector.ts b/dictation/src/components/dictation-device-selector.ts index 9cf21f1..538b8d5 100644 --- a/dictation/src/components/dictation-device-selector.ts +++ b/dictation/src/components/dictation-device-selector.ts @@ -1,4 +1,4 @@ -import { DeviceSelectorBase } from "@core/components/device-selector-base.js"; +import { DeviceSelectorBase } from "@corti/core-web/components/device-selector-base.js"; import { customElement } from "lit/decorators.js"; @customElement("dictation-device-selector") diff --git a/dictation/src/components/dictation-keybinding-selector.ts b/dictation/src/components/dictation-keybinding-selector.ts index b57b657..48dc623 100644 --- a/dictation/src/components/dictation-keybinding-selector.ts +++ b/dictation/src/components/dictation-keybinding-selector.ts @@ -1,4 +1,4 @@ -import { KeybindingSelectorBase } from "@core/components/keybinding-selector-base.js"; +import { KeybindingSelectorBase } from "@corti/core-web/components/keybinding-selector-base.js"; import { customElement } from "lit/decorators.js"; @customElement("dictation-keybinding-selector") diff --git a/dictation/src/components/dictation-language-selector.ts b/dictation/src/components/dictation-language-selector.ts index 36de3c5..1c19e86 100644 --- a/dictation/src/components/dictation-language-selector.ts +++ b/dictation/src/components/dictation-language-selector.ts @@ -1,4 +1,4 @@ -import { LanguageSelectorBase } from "@core/components/language-selector-base.js"; +import { LanguageSelectorBase } from "@corti/core-web/components/language-selector-base.js"; import { customElement } from "lit/decorators.js"; @customElement("dictation-language-selector") diff --git a/dictation/src/components/dictation-recording-button.ts b/dictation/src/components/dictation-recording-button.ts index 6367a4a..51ec6a5 100644 --- a/dictation/src/components/dictation-recording-button.ts +++ b/dictation/src/components/dictation-recording-button.ts @@ -1,4 +1,4 @@ -import { RecordingButtonBase } from "@core/components/recording-button-base.js"; +import { RecordingButtonBase } from "@corti/core-web/components/recording-button-base.js"; import type { Corti } from "@corti/sdk"; import { consume } from "@lit/context"; import { customElement, state } from "lit/decorators.js"; diff --git a/dictation/src/components/dictation-settings-menu.ts b/dictation/src/components/dictation-settings-menu.ts index 0f5ef6c..5cca5b5 100644 --- a/dictation/src/components/dictation-settings-menu.ts +++ b/dictation/src/components/dictation-settings-menu.ts @@ -1,4 +1,4 @@ -import { SettingsMenuBase } from "@core/components/settings-menu-base.js"; +import { SettingsMenuBase } from "@corti/core-web/components/settings-menu-base.js"; import type { TemplateResult } from "lit"; import { html } from "lit"; import { customElement } from "lit/decorators.js"; diff --git a/dictation/src/contexts/dictation-context.ts b/dictation/src/contexts/dictation-context.ts index 8b40bb9..abb7e64 100644 --- a/dictation/src/contexts/dictation-context.ts +++ b/dictation/src/contexts/dictation-context.ts @@ -1,4 +1,4 @@ -import { RootContext } from "@core/contexts/root-context.js"; +import { RootContext } from "@corti/core-web/contexts/root-context.js"; import type { Corti } from "@corti/sdk"; import { createContext, provide } from "@lit/context"; import type { PropertyValues } from "lit"; diff --git a/dictation/src/controllers/dictation-controller.ts b/dictation/src/controllers/dictation-controller.ts index bd144db..2694759 100644 --- a/dictation/src/controllers/dictation-controller.ts +++ b/dictation/src/controllers/dictation-controller.ts @@ -1,13 +1,13 @@ -import { SocketController } from "@core/controllers/socket-controller.js"; -import type { TranscribeMessage } from "@core/socket-messages.js"; -import type { ProxyOptions } from "@core/types.js"; +import { SocketController } from "@corti/core-web/controllers/socket-controller.js"; +import type { TranscribeMessage } from "@corti/core-web/socket-messages.js"; +import type { ProxyOptions } from "@corti/core-web/types.js"; import { type Corti, type CortiClient, CortiWebSocketProxyClient, } from "@corti/sdk"; -export type { TranscribeMessage } from "@core/socket-messages.js"; +export type { TranscribeMessage } from "@corti/core-web/socket-messages.js"; type TranscribeSocket = Awaited< ReturnType diff --git a/dictation/src/index.ts b/dictation/src/index.ts index a2d4bae..e32661a 100644 --- a/dictation/src/index.ts +++ b/dictation/src/index.ts @@ -2,7 +2,7 @@ export type { ConfigurableSettings, Keybinding, RecordingState, -} from "@core/types.js"; +} from "@corti/core-web/types.js"; export type { AudioEventEventDetail, AudioLevelChangedEventDetail, @@ -18,7 +18,7 @@ export type { RecordingStateChangedEventDetail, TranscriptEventDetail, UsageEventDetail, -} from "@core/utils/events.js"; +} from "@corti/core-web/utils/events.js"; export { CortiDictation as default, CortiDictation, diff --git a/dictation/tsconfig.json b/dictation/tsconfig.json index 1cbe28d..a979a2f 100644 --- a/dictation/tsconfig.json +++ b/dictation/tsconfig.json @@ -6,7 +6,7 @@ "outDir": "dist", "tsBuildInfoFile": "dist/.tsbuildinfo", "paths": { - "@core/*": ["../core/src/*"] + "@corti/core-web/*": ["../core/src/*"] } }, "include": ["src/**/*.ts"], diff --git a/package.json b/package.json index 082e569..999ae1e 100644 --- a/package.json +++ b/package.json @@ -5,18 +5,18 @@ "packageManager": "pnpm@10.12.1", "scripts": { "analyze": "cem analyze --litelement --exclude dist", - "build": "tsc -p core && pnpm -r run build && pnpm run analyze", - "prepublish": "tsc -p core && pnpm -r exec tsc -b && pnpm run analyze", + "build": "pnpm -r run build && pnpm run analyze", + "prepublish": "pnpm -r exec tsc -b && pnpm run analyze", "lint": "biome check .", "format": "biome format --write .", "biome:check": "biome check .", "biome:format": "biome format --write .", "biome:fix": "biome check --write .", "prepare": "husky && husky install", - "test": "tsc -p core && wtr --coverage", - "test:watch": "concurrently -k -r \"tsc -p core --watch --preserveWatchOutput\" \"wtr --watch\"", + "test": "pnpm --filter @corti/core-web exec tsc -b && wtr --coverage", + "test:watch": "concurrently -k -r \"pnpm --filter @corti/core-web exec tsc -b --watch --preserveWatchOutput\" \"wtr --watch\"", "storybook": "pnpm run analyze && storybook dev -p 8080", - "storybook:build": "tsc -p core && tsc -p tsconfig.stories.json && pnpm run analyze && storybook build" + "storybook:build": "pnpm --filter @corti/core-web exec tsc -b && tsc -p tsconfig.stories.json && pnpm run analyze && storybook build" }, "devDependencies": { "@corti/sdk": "3.0.0", @@ -37,7 +37,7 @@ "concurrently": "^8.2.2", "esbuild": "^0.25.0", "husky": "^8.0.0", - "lit": "^3.3.1", + "lit": "^3.3.3", "lint-staged": "^15.2.7", "sinon": "^19.0.2", "storybook": "10.1.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d7f4eb4..2f7b1c8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -66,7 +66,7 @@ importers: specifier: ^15.2.7 version: 15.5.2 lit: - specifier: ^3.3.1 + specifier: ^3.3.3 version: 3.3.3 sinon: specifier: ^19.0.2 @@ -83,6 +83,9 @@ importers: ambient: dependencies: + '@corti/core-web': + specifier: workspace:* + version: link:../core '@corti/sdk': specifier: 3.0.0 version: 3.0.0 @@ -90,11 +93,26 @@ importers: specifier: ^1.1.6 version: 1.1.6 lit: - specifier: ^3.3.1 + specifier: ^3.3.3 + version: 3.3.3 + + core: + dependencies: + '@corti/sdk': + specifier: 3.0.0 + version: 3.0.0 + '@lit/context': + specifier: ^1.1.6 + version: 1.1.6 + lit: + specifier: ^3.3.3 version: 3.3.3 dictation: dependencies: + '@corti/core-web': + specifier: workspace:* + version: link:../core '@corti/sdk': specifier: 3.0.0 version: 3.0.0 @@ -102,7 +120,7 @@ importers: specifier: ^1.1.6 version: 1.1.6 lit: - specifier: ^3.3.1 + specifier: ^3.3.3 version: 3.3.3 packages: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index ed1e926..9672a50 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,3 +1,4 @@ packages: + - core - dictation - ambient diff --git a/scripts/build-ambient.mjs b/scripts/build-ambient.mjs index 2a21379..3a2862c 100644 --- a/scripts/build-ambient.mjs +++ b/scripts/build-ambient.mjs @@ -7,9 +7,6 @@ const root = resolve(dirname(fileURLToPath(import.meta.url)), ".."); const pkgDir = resolve(root, "ambient"); await esbuild.build({ - alias: { - "@core": resolve(root, "core/src"), - }, bundle: true, entryPoints: [resolve(pkgDir, "dist/index.js")], format: "esm", @@ -23,7 +20,9 @@ cpSync(resolve(pkgDir, "package.json"), distPkgPath); const distPkg = JSON.parse(readFileSync(distPkgPath, "utf8")); if (distPkg.exports?.["."]?.import !== "./bundle.js") { throw new Error( - "ambient package.json must resolve the main entry to ./bundle.js (tsc output keeps unresolved @core imports)", + "ambient package.json must resolve the main entry to ./bundle.js (tsc output keeps unresolved @corti/core-web imports)", ); } +delete distPkg.dependencies?.["@corti/core-web"]; +delete distPkg.scripts; writeFileSync(distPkgPath, `${JSON.stringify(distPkg, null, 2)}\n`); diff --git a/scripts/build-dictation.mjs b/scripts/build-dictation.mjs index 79306e0..07afb79 100644 --- a/scripts/build-dictation.mjs +++ b/scripts/build-dictation.mjs @@ -7,9 +7,6 @@ const root = resolve(dirname(fileURLToPath(import.meta.url)), ".."); const pkgDir = resolve(root, "dictation"); await esbuild.build({ - alias: { - "@core": resolve(root, "core/src"), - }, bundle: true, entryPoints: [resolve(pkgDir, "dist/index.js")], format: "esm", @@ -23,7 +20,9 @@ cpSync(resolve(pkgDir, "package.json"), distPkgPath); const distPkg = JSON.parse(readFileSync(distPkgPath, "utf8")); if (distPkg.exports?.["."]?.import !== "./bundle.js") { throw new Error( - "dictation package.json must resolve the main entry to ./bundle.js (tsc output keeps unresolved @core imports)", + "dictation package.json must resolve the main entry to ./bundle.js (tsc output keeps unresolved @corti/core-web imports)", ); } +delete distPkg.dependencies?.["@corti/core-web"]; +delete distPkg.scripts; writeFileSync(distPkgPath, `${JSON.stringify(distPkg, null, 2)}\n`); diff --git a/tsconfig.stories.json b/tsconfig.stories.json index 9b18253..1c3dd31 100644 --- a/tsconfig.stories.json +++ b/tsconfig.stories.json @@ -4,7 +4,7 @@ "rootDir": ".", "outDir": "dist/stories", "paths": { - "@core/*": ["./core/src/*"], + "@corti/core-web/*": ["./core/src/*"], "@dictation/*": ["./dictation/src/*"], "@ambient/*": ["./ambient/src/*"] } diff --git a/tsconfig.test.json b/tsconfig.test.json index cedfb8f..ecdac5f 100644 --- a/tsconfig.test.json +++ b/tsconfig.test.json @@ -3,7 +3,7 @@ "compilerOptions": { "baseUrl": ".", "paths": { - "@core/*": ["core/src/*"] + "@corti/core-web/*": ["core/src/*"] } }, "include": ["test/**/*.ts"] From b20b673a8c98c7436f78e57261689a8e4c8fe69f Mon Sep 17 00:00:00 2001 From: markitosha Date: Wed, 3 Jun 2026 17:46:04 +0200 Subject: [PATCH 43/50] refactor: drop @corti/core-web package; bundle core in published dist Use @core path alias for shared source only. safeCustomElement on all custom elements. Ship self-contained .d.ts via dist/core/ rewrite; keep bundle.js as the runtime entry. --- .storybook/main.js | 2 +- ambient/package.json | 1 - .../src/components/ambient-device-selector.ts | 6 +-- .../components/ambient-keybinding-selector.ts | 6 +-- .../components/ambient-language-selector.ts | 6 +-- .../components/ambient-recording-button.ts | 9 ++-- .../src/components/ambient-settings-menu.ts | 6 +-- .../ambient-virtual-mode-selector.ts | 9 ++-- ambient/src/components/corti-ambient.ts | 11 ++--- ambient/src/contexts/ambient-context.ts | 7 +-- ambient/src/controllers/ambient-controller.ts | 8 ++-- ambient/src/index.ts | 4 +- ambient/tsconfig.json | 2 +- core/package.json | 23 ---------- dictation/package.json | 1 - dictation/src/components/corti-dictation.ts | 7 +-- .../components/dictation-device-selector.ts | 6 +-- .../dictation-keybinding-selector.ts | 6 +-- .../components/dictation-language-selector.ts | 6 +-- .../components/dictation-recording-button.ts | 7 +-- .../src/components/dictation-settings-menu.ts | 6 +-- dictation/src/contexts/dictation-context.ts | 7 +-- .../src/controllers/dictation-controller.ts | 8 ++-- dictation/src/index.ts | 4 +- dictation/tsconfig.json | 2 +- package.json | 10 ++--- pnpm-lock.yaml | 18 -------- pnpm-workspace.yaml | 1 - scripts/build-ambient.mjs | 6 ++- scripts/build-dictation.mjs | 6 ++- scripts/bundle-core-types.mjs | 43 +++++++++++++++++++ tsconfig.stories.json | 2 +- tsconfig.test.json | 2 +- 33 files changed, 129 insertions(+), 119 deletions(-) delete mode 100644 core/package.json create mode 100644 scripts/bundle-core-types.mjs diff --git a/.storybook/main.js b/.storybook/main.js index 845b647..6d6793c 100644 --- a/.storybook/main.js +++ b/.storybook/main.js @@ -16,7 +16,7 @@ export default { config.resolve ??= {}; config.resolve.alias = { ...config.resolve.alias, - "@corti/core-web": resolve(root, "core/src"), + "@core": resolve(root, "core/src"), }; return config; }, diff --git a/ambient/package.json b/ambient/package.json index 2868327..fea5837 100644 --- a/ambient/package.json +++ b/ambient/package.json @@ -38,7 +38,6 @@ "real-time" ], "dependencies": { - "@corti/core-web": "workspace:*", "@corti/sdk": "3.0.0", "@lit/context": "^1.1.6", "lit": "^3.3.3" diff --git a/ambient/src/components/ambient-device-selector.ts b/ambient/src/components/ambient-device-selector.ts index 8434e2e..5cea4dc 100644 --- a/ambient/src/components/ambient-device-selector.ts +++ b/ambient/src/components/ambient-device-selector.ts @@ -1,7 +1,7 @@ -import { DeviceSelectorBase } from "@corti/core-web/components/device-selector-base.js"; -import { customElement } from "lit/decorators.js"; +import { DeviceSelectorBase } from "@core/components/device-selector-base.js"; +import { safeCustomElement } from "@core/utils/custom-elements.js"; -@customElement("ambient-device-selector") +@safeCustomElement("ambient-device-selector") export class AmbientDeviceSelector extends DeviceSelectorBase {} declare global { diff --git a/ambient/src/components/ambient-keybinding-selector.ts b/ambient/src/components/ambient-keybinding-selector.ts index 9f47782..7eae9e3 100644 --- a/ambient/src/components/ambient-keybinding-selector.ts +++ b/ambient/src/components/ambient-keybinding-selector.ts @@ -1,7 +1,7 @@ -import { KeybindingSelectorBase } from "@corti/core-web/components/keybinding-selector-base.js"; -import { customElement } from "lit/decorators.js"; +import { KeybindingSelectorBase } from "@core/components/keybinding-selector-base.js"; +import { safeCustomElement } from "@core/utils/custom-elements.js"; -@customElement("ambient-keybinding-selector") +@safeCustomElement("ambient-keybinding-selector") export class AmbientKeybindingSelector extends KeybindingSelectorBase {} declare global { diff --git a/ambient/src/components/ambient-language-selector.ts b/ambient/src/components/ambient-language-selector.ts index 5ba76f7..c7f4d58 100644 --- a/ambient/src/components/ambient-language-selector.ts +++ b/ambient/src/components/ambient-language-selector.ts @@ -1,7 +1,7 @@ -import { LanguageSelectorBase } from "@corti/core-web/components/language-selector-base.js"; -import { customElement } from "lit/decorators.js"; +import { LanguageSelectorBase } from "@core/components/language-selector-base.js"; +import { safeCustomElement } from "@core/utils/custom-elements.js"; -@customElement("ambient-language-selector") +@safeCustomElement("ambient-language-selector") export class AmbientLanguageSelector extends LanguageSelectorBase {} declare global { diff --git a/ambient/src/components/ambient-recording-button.ts b/ambient/src/components/ambient-recording-button.ts index c59b24c..44d422a 100644 --- a/ambient/src/components/ambient-recording-button.ts +++ b/ambient/src/components/ambient-recording-button.ts @@ -1,8 +1,9 @@ -import { RecordingButtonBase } from "@corti/core-web/components/recording-button-base.js"; -import { errorEvent } from "@corti/core-web/utils/events.js"; +import { RecordingButtonBase } from "@core/components/recording-button-base.js"; +import { errorEvent } from "@core/utils/events.js"; import type { Corti } from "@corti/sdk"; import { consume } from "@lit/context"; -import { customElement, state } from "lit/decorators.js"; +import { safeCustomElement } from "@core/utils/custom-elements.js"; +import { state } from "lit/decorators.js"; import { DEFAULT_AMBIENT_CONFIG } from "../constants.js"; import { ambientConfigContext, @@ -20,7 +21,7 @@ const interactionIdRequiredError = () => "interactionId is required. Set interactionId on corti-ambient or ambient-root.", ); -@customElement("ambient-recording-button") +@safeCustomElement("ambient-recording-button") export class AmbientRecordingButton extends RecordingButtonBase< AmbientStreamSessionConfig, StreamAmbientMessage diff --git a/ambient/src/components/ambient-settings-menu.ts b/ambient/src/components/ambient-settings-menu.ts index 5387863..caf7dee 100644 --- a/ambient/src/components/ambient-settings-menu.ts +++ b/ambient/src/components/ambient-settings-menu.ts @@ -1,14 +1,14 @@ -import { SettingsMenuBase } from "@corti/core-web/components/settings-menu-base.js"; +import { SettingsMenuBase } from "@core/components/settings-menu-base.js"; import type { TemplateResult } from "lit"; import { html } from "lit"; -import { customElement } from "lit/decorators.js"; +import { safeCustomElement } from "@core/utils/custom-elements.js"; import "./ambient-device-selector.js"; import "./ambient-keybinding-selector.js"; import "./ambient-language-selector.js"; import "./ambient-virtual-mode-selector.js"; -@customElement("ambient-settings-menu") +@safeCustomElement("ambient-settings-menu") export class AmbientSettingsMenu extends SettingsMenuBase { protected _renderDeviceSelector(isRecording: boolean): TemplateResult { return html`( export const virtualModeContext = createContext(Symbol("virtualMode")); -@customElement("ambient-root") +@safeCustomElement("ambient-root") export class AmbientRoot extends RootContext { @provide({ context: ambientConfigContext }) @property({ attribute: false, type: Object }) diff --git a/ambient/src/controllers/ambient-controller.ts b/ambient/src/controllers/ambient-controller.ts index 99af8c0..cbdc49a 100644 --- a/ambient/src/controllers/ambient-controller.ts +++ b/ambient/src/controllers/ambient-controller.ts @@ -1,13 +1,13 @@ -import { SocketController } from "@corti/core-web/controllers/socket-controller.js"; -import type { StreamAmbientMessage } from "@corti/core-web/socket-messages.js"; -import type { ProxyOptions } from "@corti/core-web/types.js"; +import { SocketController } from "@core/controllers/socket-controller.js"; +import type { StreamAmbientMessage } from "@core/socket-messages.js"; +import type { ProxyOptions } from "@core/types.js"; import { type Corti, type CortiClient, CortiWebSocketProxyClient, } from "@corti/sdk"; -export type { StreamAmbientMessage } from "@corti/core-web/socket-messages.js"; +export type { StreamAmbientMessage } from "@core/socket-messages.js"; export type AmbientStreamSessionConfig = { interactionId: string; diff --git a/ambient/src/index.ts b/ambient/src/index.ts index 570a2ff..5d3ee3f 100644 --- a/ambient/src/index.ts +++ b/ambient/src/index.ts @@ -2,7 +2,7 @@ export type { ConfigurableSettings, Keybinding, RecordingState, -} from "@corti/core-web/types.js"; +} from "@core/types.js"; export type { AudioEventEventDetail, AudioLevelChangedEventDetail, @@ -19,7 +19,7 @@ export type { TranscriptEventDetail, UsageEventDetail, VirtualModeChangedEventDetail, -} from "@corti/core-web/utils/events.js"; +} from "@core/utils/events.js"; export { AmbientDeviceSelector } from "./components/ambient-device-selector.js"; export { AmbientKeybindingSelector } from "./components/ambient-keybinding-selector.js"; export { AmbientLanguageSelector } from "./components/ambient-language-selector.js"; diff --git a/ambient/tsconfig.json b/ambient/tsconfig.json index a979a2f..1cbe28d 100644 --- a/ambient/tsconfig.json +++ b/ambient/tsconfig.json @@ -6,7 +6,7 @@ "outDir": "dist", "tsBuildInfoFile": "dist/.tsbuildinfo", "paths": { - "@corti/core-web/*": ["../core/src/*"] + "@core/*": ["../core/src/*"] } }, "include": ["src/**/*.ts"], diff --git a/core/package.json b/core/package.json deleted file mode 100644 index 2d3f9e5..0000000 --- a/core/package.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "@corti/core-web", - "description": "Shared Corti speech web component core (dictation + ambient)", - "version": "0.0.0-dev", - "private": true, - "license": "MIT", - "type": "module", - "exports": { - "./*": { - "types": "./dist/*.d.ts", - "import": "./dist/*.js", - "default": "./dist/*.js" - } - }, - "dependencies": { - "@corti/sdk": "3.0.0", - "@lit/context": "^1.1.6", - "lit": "^3.3.3" - }, - "scripts": { - "build": "tsc -b" - } -} diff --git a/dictation/package.json b/dictation/package.json index ff5d3aa..f683273 100644 --- a/dictation/package.json +++ b/dictation/package.json @@ -37,7 +37,6 @@ "healthcare" ], "dependencies": { - "@corti/core-web": "workspace:*", "@corti/sdk": "3.0.0", "@lit/context": "^1.1.6", "lit": "^3.3.3" diff --git a/dictation/src/components/corti-dictation.ts b/dictation/src/components/corti-dictation.ts index 3bf3e64..a4b6381 100644 --- a/dictation/src/components/corti-dictation.ts +++ b/dictation/src/components/corti-dictation.ts @@ -1,7 +1,8 @@ -import { CortiRoot } from "@corti/core-web/components/corti-root.js"; +import { CortiRoot } from "@core/components/corti-root.js"; import type { Corti, CortiAuth } from "@corti/sdk"; import { html, nothing } from "lit"; -import { customElement, property, state } from "lit/decorators.js"; +import { safeCustomElement } from "@core/utils/custom-elements.js"; +import { property, state } from "lit/decorators.js"; import { classMap } from "lit/directives/class-map.js"; import { ref } from "lit/directives/ref.js"; import { DEFAULT_DICTATION_CONFIG } from "../constants.js"; @@ -12,7 +13,7 @@ import "../contexts/dictation-context.js"; import "./dictation-recording-button.js"; import "./dictation-settings-menu.js"; -@customElement("corti-dictation") +@safeCustomElement("corti-dictation") export class CortiDictation extends CortiRoot< DictationRoot, DictationRecordingButton diff --git a/dictation/src/components/dictation-device-selector.ts b/dictation/src/components/dictation-device-selector.ts index 538b8d5..75e99f6 100644 --- a/dictation/src/components/dictation-device-selector.ts +++ b/dictation/src/components/dictation-device-selector.ts @@ -1,7 +1,7 @@ -import { DeviceSelectorBase } from "@corti/core-web/components/device-selector-base.js"; -import { customElement } from "lit/decorators.js"; +import { DeviceSelectorBase } from "@core/components/device-selector-base.js"; +import { safeCustomElement } from "@core/utils/custom-elements.js"; -@customElement("dictation-device-selector") +@safeCustomElement("dictation-device-selector") export class DictationDeviceSelector extends DeviceSelectorBase {} declare global { diff --git a/dictation/src/components/dictation-keybinding-selector.ts b/dictation/src/components/dictation-keybinding-selector.ts index 48dc623..e3ae537 100644 --- a/dictation/src/components/dictation-keybinding-selector.ts +++ b/dictation/src/components/dictation-keybinding-selector.ts @@ -1,7 +1,7 @@ -import { KeybindingSelectorBase } from "@corti/core-web/components/keybinding-selector-base.js"; -import { customElement } from "lit/decorators.js"; +import { KeybindingSelectorBase } from "@core/components/keybinding-selector-base.js"; +import { safeCustomElement } from "@core/utils/custom-elements.js"; -@customElement("dictation-keybinding-selector") +@safeCustomElement("dictation-keybinding-selector") export class DictationKeybindingSelector extends KeybindingSelectorBase {} declare global { diff --git a/dictation/src/components/dictation-language-selector.ts b/dictation/src/components/dictation-language-selector.ts index 1c19e86..558b916 100644 --- a/dictation/src/components/dictation-language-selector.ts +++ b/dictation/src/components/dictation-language-selector.ts @@ -1,7 +1,7 @@ -import { LanguageSelectorBase } from "@corti/core-web/components/language-selector-base.js"; -import { customElement } from "lit/decorators.js"; +import { LanguageSelectorBase } from "@core/components/language-selector-base.js"; +import { safeCustomElement } from "@core/utils/custom-elements.js"; -@customElement("dictation-language-selector") +@safeCustomElement("dictation-language-selector") export class DictationLanguageSelector extends LanguageSelectorBase {} declare global { diff --git a/dictation/src/components/dictation-recording-button.ts b/dictation/src/components/dictation-recording-button.ts index 51ec6a5..13abbc2 100644 --- a/dictation/src/components/dictation-recording-button.ts +++ b/dictation/src/components/dictation-recording-button.ts @@ -1,7 +1,8 @@ -import { RecordingButtonBase } from "@corti/core-web/components/recording-button-base.js"; +import { RecordingButtonBase } from "@core/components/recording-button-base.js"; import type { Corti } from "@corti/sdk"; import { consume } from "@lit/context"; -import { customElement, state } from "lit/decorators.js"; +import { safeCustomElement } from "@core/utils/custom-elements.js"; +import { state } from "lit/decorators.js"; import { DEFAULT_DICTATION_CONFIG } from "../constants.js"; import { debugDisplayAudioContext, @@ -12,7 +13,7 @@ import { type TranscribeMessage, } from "../controllers/dictation-controller.js"; -@customElement("dictation-recording-button") +@safeCustomElement("dictation-recording-button") export class DictationRecordingButton extends RecordingButtonBase< Corti.TranscribeConfig, TranscribeMessage diff --git a/dictation/src/components/dictation-settings-menu.ts b/dictation/src/components/dictation-settings-menu.ts index 5cca5b5..906a033 100644 --- a/dictation/src/components/dictation-settings-menu.ts +++ b/dictation/src/components/dictation-settings-menu.ts @@ -1,13 +1,13 @@ -import { SettingsMenuBase } from "@corti/core-web/components/settings-menu-base.js"; +import { SettingsMenuBase } from "@core/components/settings-menu-base.js"; import type { TemplateResult } from "lit"; import { html } from "lit"; -import { customElement } from "lit/decorators.js"; +import { safeCustomElement } from "@core/utils/custom-elements.js"; import "./dictation-device-selector.js"; import "./dictation-keybinding-selector.js"; import "./dictation-language-selector.js"; -@customElement("dictation-settings-menu") +@safeCustomElement("dictation-settings-menu") export class DictationSettingsMenu extends SettingsMenuBase { protected _renderDeviceSelector(isRecording: boolean): TemplateResult { return html`( Symbol("debugDisplayAudio"), ); -@customElement("dictation-root") +@safeCustomElement("dictation-root") export class DictationRoot extends RootContext { // ───────────────────────────────────────────────────────────────────────────── // Properties diff --git a/dictation/src/controllers/dictation-controller.ts b/dictation/src/controllers/dictation-controller.ts index 2694759..bd144db 100644 --- a/dictation/src/controllers/dictation-controller.ts +++ b/dictation/src/controllers/dictation-controller.ts @@ -1,13 +1,13 @@ -import { SocketController } from "@corti/core-web/controllers/socket-controller.js"; -import type { TranscribeMessage } from "@corti/core-web/socket-messages.js"; -import type { ProxyOptions } from "@corti/core-web/types.js"; +import { SocketController } from "@core/controllers/socket-controller.js"; +import type { TranscribeMessage } from "@core/socket-messages.js"; +import type { ProxyOptions } from "@core/types.js"; import { type Corti, type CortiClient, CortiWebSocketProxyClient, } from "@corti/sdk"; -export type { TranscribeMessage } from "@corti/core-web/socket-messages.js"; +export type { TranscribeMessage } from "@core/socket-messages.js"; type TranscribeSocket = Awaited< ReturnType diff --git a/dictation/src/index.ts b/dictation/src/index.ts index e32661a..a2d4bae 100644 --- a/dictation/src/index.ts +++ b/dictation/src/index.ts @@ -2,7 +2,7 @@ export type { ConfigurableSettings, Keybinding, RecordingState, -} from "@corti/core-web/types.js"; +} from "@core/types.js"; export type { AudioEventEventDetail, AudioLevelChangedEventDetail, @@ -18,7 +18,7 @@ export type { RecordingStateChangedEventDetail, TranscriptEventDetail, UsageEventDetail, -} from "@corti/core-web/utils/events.js"; +} from "@core/utils/events.js"; export { CortiDictation as default, CortiDictation, diff --git a/dictation/tsconfig.json b/dictation/tsconfig.json index a979a2f..1cbe28d 100644 --- a/dictation/tsconfig.json +++ b/dictation/tsconfig.json @@ -6,7 +6,7 @@ "outDir": "dist", "tsBuildInfoFile": "dist/.tsbuildinfo", "paths": { - "@corti/core-web/*": ["../core/src/*"] + "@core/*": ["../core/src/*"] } }, "include": ["src/**/*.ts"], diff --git a/package.json b/package.json index 999ae1e..be9358f 100644 --- a/package.json +++ b/package.json @@ -5,18 +5,18 @@ "packageManager": "pnpm@10.12.1", "scripts": { "analyze": "cem analyze --litelement --exclude dist", - "build": "pnpm -r run build && pnpm run analyze", - "prepublish": "pnpm -r exec tsc -b && pnpm run analyze", + "build": "tsc -b core && pnpm -r run build && pnpm run analyze", + "prepublish": "tsc -b core && pnpm -r exec tsc -b && pnpm run analyze", "lint": "biome check .", "format": "biome format --write .", "biome:check": "biome check .", "biome:format": "biome format --write .", "biome:fix": "biome check --write .", "prepare": "husky && husky install", - "test": "pnpm --filter @corti/core-web exec tsc -b && wtr --coverage", - "test:watch": "concurrently -k -r \"pnpm --filter @corti/core-web exec tsc -b --watch --preserveWatchOutput\" \"wtr --watch\"", + "test": "tsc -b core && wtr --coverage", + "test:watch": "concurrently -k -r \"tsc -b core --watch --preserveWatchOutput\" \"wtr --watch\"", "storybook": "pnpm run analyze && storybook dev -p 8080", - "storybook:build": "pnpm --filter @corti/core-web exec tsc -b && tsc -p tsconfig.stories.json && pnpm run analyze && storybook build" + "storybook:build": "tsc -b core && tsc -p tsconfig.stories.json && pnpm run analyze && storybook build" }, "devDependencies": { "@corti/sdk": "3.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2f7b1c8..aa33d95 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -82,21 +82,6 @@ importers: version: 5.9.3 ambient: - dependencies: - '@corti/core-web': - specifier: workspace:* - version: link:../core - '@corti/sdk': - specifier: 3.0.0 - version: 3.0.0 - '@lit/context': - specifier: ^1.1.6 - version: 1.1.6 - lit: - specifier: ^3.3.3 - version: 3.3.3 - - core: dependencies: '@corti/sdk': specifier: 3.0.0 @@ -110,9 +95,6 @@ importers: dictation: dependencies: - '@corti/core-web': - specifier: workspace:* - version: link:../core '@corti/sdk': specifier: 3.0.0 version: 3.0.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 9672a50..ed1e926 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,4 +1,3 @@ packages: - - core - dictation - ambient diff --git a/scripts/build-ambient.mjs b/scripts/build-ambient.mjs index 3a2862c..45a90ec 100644 --- a/scripts/build-ambient.mjs +++ b/scripts/build-ambient.mjs @@ -2,6 +2,7 @@ import { cpSync, readFileSync, writeFileSync } from "node:fs"; import { dirname, resolve } from "node:path"; import { fileURLToPath } from "node:url"; import * as esbuild from "esbuild"; +import { bundleCoreTypes } from "./bundle-core-types.mjs"; const root = resolve(dirname(fileURLToPath(import.meta.url)), ".."); const pkgDir = resolve(root, "ambient"); @@ -14,15 +15,16 @@ await esbuild.build({ platform: "browser", }); +bundleCoreTypes(resolve(pkgDir, "dist"), resolve(root, "core/dist")); + const distPkgPath = resolve(pkgDir, "dist/package.json"); cpSync(resolve(pkgDir, "package.json"), distPkgPath); const distPkg = JSON.parse(readFileSync(distPkgPath, "utf8")); if (distPkg.exports?.["."]?.import !== "./bundle.js") { throw new Error( - "ambient package.json must resolve the main entry to ./bundle.js (tsc output keeps unresolved @corti/core-web imports)", + "ambient package.json must resolve the main entry to ./bundle.js (tsc output keeps unresolved @core imports)", ); } -delete distPkg.dependencies?.["@corti/core-web"]; delete distPkg.scripts; writeFileSync(distPkgPath, `${JSON.stringify(distPkg, null, 2)}\n`); diff --git a/scripts/build-dictation.mjs b/scripts/build-dictation.mjs index 07afb79..d1c4571 100644 --- a/scripts/build-dictation.mjs +++ b/scripts/build-dictation.mjs @@ -2,6 +2,7 @@ import { cpSync, readFileSync, writeFileSync } from "node:fs"; import { dirname, resolve } from "node:path"; import { fileURLToPath } from "node:url"; import * as esbuild from "esbuild"; +import { bundleCoreTypes } from "./bundle-core-types.mjs"; const root = resolve(dirname(fileURLToPath(import.meta.url)), ".."); const pkgDir = resolve(root, "dictation"); @@ -14,15 +15,16 @@ await esbuild.build({ platform: "browser", }); +bundleCoreTypes(resolve(pkgDir, "dist"), resolve(root, "core/dist")); + const distPkgPath = resolve(pkgDir, "dist/package.json"); cpSync(resolve(pkgDir, "package.json"), distPkgPath); const distPkg = JSON.parse(readFileSync(distPkgPath, "utf8")); if (distPkg.exports?.["."]?.import !== "./bundle.js") { throw new Error( - "dictation package.json must resolve the main entry to ./bundle.js (tsc output keeps unresolved @corti/core-web imports)", + "dictation package.json must resolve the main entry to ./bundle.js (tsc output keeps unresolved @core imports)", ); } -delete distPkg.dependencies?.["@corti/core-web"]; delete distPkg.scripts; writeFileSync(distPkgPath, `${JSON.stringify(distPkg, null, 2)}\n`); diff --git a/scripts/bundle-core-types.mjs b/scripts/bundle-core-types.mjs new file mode 100644 index 0000000..b9f907c --- /dev/null +++ b/scripts/bundle-core-types.mjs @@ -0,0 +1,43 @@ +import { cpSync, readdirSync, readFileSync, statSync, writeFileSync } from "node:fs"; +import { dirname, join, relative, resolve } from "node:path"; + +/** + * Copies core/dist into pkg/dist/core and rewrites @core/* imports in emitted + * .d.ts so published packages are self-contained (core is not an npm package). + */ +export function bundleCoreTypes(pkgDistDir, coreDistDir) { + const distDir = resolve(pkgDistDir); + const bundledCoreDir = join(distDir, "core"); + + cpSync(resolve(coreDistDir), bundledCoreDir, { recursive: true }); + + const rewriteFile = (filePath) => { + let content = readFileSync(filePath, "utf8"); + if (!content.includes("@core/")) { + return; + } + const fileDir = dirname(filePath); + let relToCore = relative(fileDir, bundledCoreDir).replace(/\\/g, "/"); + if (relToCore === "" || relToCore === ".") { + relToCore = "."; + } else if (!relToCore.startsWith(".")) { + relToCore = `./${relToCore}`; + } + const prefix = relToCore.endsWith("/") ? relToCore : `${relToCore}/`; + content = content.replaceAll("@core/", prefix); + writeFileSync(filePath, content); + }; + + const walk = (dir) => { + for (const name of readdirSync(dir)) { + const full = join(dir, name); + if (statSync(full).isDirectory()) { + walk(full); + } else if (name.endsWith(".d.ts")) { + rewriteFile(full); + } + } + }; + + walk(distDir); +} diff --git a/tsconfig.stories.json b/tsconfig.stories.json index 1c3dd31..9b18253 100644 --- a/tsconfig.stories.json +++ b/tsconfig.stories.json @@ -4,7 +4,7 @@ "rootDir": ".", "outDir": "dist/stories", "paths": { - "@corti/core-web/*": ["./core/src/*"], + "@core/*": ["./core/src/*"], "@dictation/*": ["./dictation/src/*"], "@ambient/*": ["./ambient/src/*"] } diff --git a/tsconfig.test.json b/tsconfig.test.json index ecdac5f..cedfb8f 100644 --- a/tsconfig.test.json +++ b/tsconfig.test.json @@ -3,7 +3,7 @@ "compilerOptions": { "baseUrl": ".", "paths": { - "@corti/core-web/*": ["core/src/*"] + "@core/*": ["core/src/*"] } }, "include": ["test/**/*.ts"] From c22ec0e10554ed278a187d9b58a32532a37daba1 Mon Sep 17 00:00:00 2001 From: markitosha Date: Wed, 3 Jun 2026 17:48:00 +0200 Subject: [PATCH 44/50] chore: fix biome import order after safeCustomElement migration --- ambient/src/components/ambient-recording-button.ts | 2 +- ambient/src/components/ambient-settings-menu.ts | 2 +- ambient/src/components/ambient-virtual-mode-selector.ts | 2 +- ambient/src/components/corti-ambient.ts | 2 +- ambient/src/contexts/ambient-context.ts | 2 +- dictation/src/components/corti-dictation.ts | 2 +- dictation/src/components/dictation-recording-button.ts | 2 +- dictation/src/components/dictation-settings-menu.ts | 2 +- dictation/src/contexts/dictation-context.ts | 2 +- scripts/bundle-core-types.mjs | 8 +++++++- 10 files changed, 16 insertions(+), 10 deletions(-) diff --git a/ambient/src/components/ambient-recording-button.ts b/ambient/src/components/ambient-recording-button.ts index 44d422a..bcfce96 100644 --- a/ambient/src/components/ambient-recording-button.ts +++ b/ambient/src/components/ambient-recording-button.ts @@ -1,8 +1,8 @@ import { RecordingButtonBase } from "@core/components/recording-button-base.js"; +import { safeCustomElement } from "@core/utils/custom-elements.js"; import { errorEvent } from "@core/utils/events.js"; import type { Corti } from "@corti/sdk"; import { consume } from "@lit/context"; -import { safeCustomElement } from "@core/utils/custom-elements.js"; import { state } from "lit/decorators.js"; import { DEFAULT_AMBIENT_CONFIG } from "../constants.js"; import { diff --git a/ambient/src/components/ambient-settings-menu.ts b/ambient/src/components/ambient-settings-menu.ts index caf7dee..f0c16c4 100644 --- a/ambient/src/components/ambient-settings-menu.ts +++ b/ambient/src/components/ambient-settings-menu.ts @@ -1,7 +1,7 @@ import { SettingsMenuBase } from "@core/components/settings-menu-base.js"; +import { safeCustomElement } from "@core/utils/custom-elements.js"; import type { TemplateResult } from "lit"; import { html } from "lit"; -import { safeCustomElement } from "@core/utils/custom-elements.js"; import "./ambient-device-selector.js"; import "./ambient-keybinding-selector.js"; diff --git a/ambient/src/components/ambient-virtual-mode-selector.ts b/ambient/src/components/ambient-virtual-mode-selector.ts index 382e2d4..fab36f8 100644 --- a/ambient/src/components/ambient-virtual-mode-selector.ts +++ b/ambient/src/components/ambient-virtual-mode-selector.ts @@ -1,7 +1,7 @@ +import { safeCustomElement } from "@core/utils/custom-elements.js"; import { virtualModeChangedEvent } from "@core/utils/events.js"; import { consume } from "@lit/context"; import { html, LitElement } from "lit"; -import { safeCustomElement } from "@core/utils/custom-elements.js"; import { property, state } from "lit/decorators.js"; import { virtualModeContext } from "../contexts/ambient-context.js"; import AmbientVirtualModeSelectorStyles from "../styles/ambient-virtual-mode-selector.js"; diff --git a/ambient/src/components/corti-ambient.ts b/ambient/src/components/corti-ambient.ts index 9328178..978ab3e 100644 --- a/ambient/src/components/corti-ambient.ts +++ b/ambient/src/components/corti-ambient.ts @@ -1,9 +1,9 @@ import { CortiRoot } from "@core/components/corti-root.js"; import type { ConfigurableSettings } from "@core/types.js"; import { commaSeparatedConverter } from "@core/utils/converters.js"; +import { safeCustomElement } from "@core/utils/custom-elements.js"; import type { Corti } from "@corti/sdk"; import { html, nothing } from "lit"; -import { safeCustomElement } from "@core/utils/custom-elements.js"; import { property, state } from "lit/decorators.js"; import { classMap } from "lit/directives/class-map.js"; import { ref } from "lit/directives/ref.js"; diff --git a/ambient/src/contexts/ambient-context.ts b/ambient/src/contexts/ambient-context.ts index 1aadd19..9962a0d 100644 --- a/ambient/src/contexts/ambient-context.ts +++ b/ambient/src/contexts/ambient-context.ts @@ -1,8 +1,8 @@ import { RootContext } from "@core/contexts/root-context.js"; +import { safeCustomElement } from "@core/utils/custom-elements.js"; import type { Corti } from "@corti/sdk"; import { createContext, provide } from "@lit/context"; import type { PropertyValues } from "lit"; -import { safeCustomElement } from "@core/utils/custom-elements.js"; import { property } from "lit/decorators.js"; import { DEFAULT_AMBIENT_CONFIG } from "../constants.js"; diff --git a/dictation/src/components/corti-dictation.ts b/dictation/src/components/corti-dictation.ts index a4b6381..284c69f 100644 --- a/dictation/src/components/corti-dictation.ts +++ b/dictation/src/components/corti-dictation.ts @@ -1,7 +1,7 @@ import { CortiRoot } from "@core/components/corti-root.js"; +import { safeCustomElement } from "@core/utils/custom-elements.js"; import type { Corti, CortiAuth } from "@corti/sdk"; import { html, nothing } from "lit"; -import { safeCustomElement } from "@core/utils/custom-elements.js"; import { property, state } from "lit/decorators.js"; import { classMap } from "lit/directives/class-map.js"; import { ref } from "lit/directives/ref.js"; diff --git a/dictation/src/components/dictation-recording-button.ts b/dictation/src/components/dictation-recording-button.ts index 13abbc2..8dc34bd 100644 --- a/dictation/src/components/dictation-recording-button.ts +++ b/dictation/src/components/dictation-recording-button.ts @@ -1,7 +1,7 @@ import { RecordingButtonBase } from "@core/components/recording-button-base.js"; +import { safeCustomElement } from "@core/utils/custom-elements.js"; import type { Corti } from "@corti/sdk"; import { consume } from "@lit/context"; -import { safeCustomElement } from "@core/utils/custom-elements.js"; import { state } from "lit/decorators.js"; import { DEFAULT_DICTATION_CONFIG } from "../constants.js"; import { diff --git a/dictation/src/components/dictation-settings-menu.ts b/dictation/src/components/dictation-settings-menu.ts index 906a033..e6e4ebf 100644 --- a/dictation/src/components/dictation-settings-menu.ts +++ b/dictation/src/components/dictation-settings-menu.ts @@ -1,7 +1,7 @@ import { SettingsMenuBase } from "@core/components/settings-menu-base.js"; +import { safeCustomElement } from "@core/utils/custom-elements.js"; import type { TemplateResult } from "lit"; import { html } from "lit"; -import { safeCustomElement } from "@core/utils/custom-elements.js"; import "./dictation-device-selector.js"; import "./dictation-keybinding-selector.js"; diff --git a/dictation/src/contexts/dictation-context.ts b/dictation/src/contexts/dictation-context.ts index eb0d3f4..5d8947f 100644 --- a/dictation/src/contexts/dictation-context.ts +++ b/dictation/src/contexts/dictation-context.ts @@ -1,8 +1,8 @@ import { RootContext } from "@core/contexts/root-context.js"; +import { safeCustomElement } from "@core/utils/custom-elements.js"; import type { Corti } from "@corti/sdk"; import { createContext, provide } from "@lit/context"; import type { PropertyValues } from "lit"; -import { safeCustomElement } from "@core/utils/custom-elements.js"; import { property } from "lit/decorators.js"; export const dictationConfigContext = createContext< diff --git a/scripts/bundle-core-types.mjs b/scripts/bundle-core-types.mjs index b9f907c..c4a6fe0 100644 --- a/scripts/bundle-core-types.mjs +++ b/scripts/bundle-core-types.mjs @@ -1,4 +1,10 @@ -import { cpSync, readdirSync, readFileSync, statSync, writeFileSync } from "node:fs"; +import { + cpSync, + readdirSync, + readFileSync, + statSync, + writeFileSync, +} from "node:fs"; import { dirname, join, relative, resolve } from "node:path"; /** From b7ebe411fbecd56871992b51b170d69357dd0d92 Mon Sep 17 00:00:00 2001 From: markitosha Date: Wed, 3 Jun 2026 19:34:56 +0200 Subject: [PATCH 45/50] docs: add package READMEs and monorepo overview for npm Per-package READMEs for @corti/dictation-web and @corti/ambient-web with install, quick start, and links to docs.corti.ai. Copy README into dist on build so npm publish includes them. --- README.md | 235 +++--------------------------------- ambient/README.md | 122 +++++++++++++++++++ dictation/README.md | 110 +++++++++++++++++ scripts/build-ambient.mjs | 7 +- scripts/build-dictation.mjs | 7 +- 5 files changed, 263 insertions(+), 218 deletions(-) create mode 100644 ambient/README.md create mode 100644 dictation/README.md diff --git a/README.md b/README.md index e96e268..ac0c188 100644 --- a/README.md +++ b/README.md @@ -1,228 +1,31 @@ -# Corti Dictation Web Component +# Corti Speech Web Components -[![Published on npm](https://img.shields.io/npm/v/@corti/dictation-web.svg?logo=npm)](https://www.npmjs.com/package/@corti/dictation-web) -[![License: MIT](https://img.shields.io/npm/l/%40corti%2Fdictation-web)](https://opensource.org/licenses/MIT) -[![Get Support on Discord](https://img.shields.io/badge/Discord-Get%20Support-5865F2.svg?logo=discord&logoColor=fff)](https://discord.com/invite/zXeXHgnZXX) -[![Live Demo](https://img.shields.io/badge/Live%20Demo-blue.svg?logo=rocket&logoColor=fff)](https://codepen.io/hccullen/pen/OPJmxQR) - -## Overview - -The **Corti Dictation Web Component** is a web component that enables real-time speech-to-text dictation using Corti's Dictation API. It provides a simple interface for capturing audio, streaming it to the API, and handling transcripts. - -This library offers two approaches: -- **Opinionated Component**: Use `` for a complete, ready-to-use solution with built-in UI -- **Modular Components**: Use individual components for maximum flexibility and custom UI implementations - -> **Note:** OAuth 2.0 authentication is not handled by this library. The client must provide an authorization token or token refresh function while using the component. - -## Component Architecture - -### Opinionated Component - -**``** - A complete, ready-to-use component that includes: -- Recording button with visual feedback -- Settings menu for device, language, and keybinding selection -- Automatic state management -- Built-in styling and theming -- Support for both push-to-talk and toggle-to-talk keybindings simultaneously -- Keyboard shortcut (keybinding) support - -This is the easiest way to get started and works out of the box. - -### Modular Components - -For more control and flexibility, you can use individual components: - -- **``** - Context provider that manages authentication, configuration, and shared state -- **``** - Standalone recording button with audio visualization -- **``** - Settings menu with device, language, and keybinding selectors -- **``** - Device selection dropdown -- **``** - Language selection dropdown -- **``** - Keybinding configuration component for keyboard shortcuts (supports both push-to-talk and toggle-to-talk) - -Ambient stream components (parallel modular set; shared selectors use the same implementation with `ambient-*` tags): - -- **``** - All-in-one ambient capture component (includes virtual mode by default in settings) -- **``** - Context provider for ambient stream sessions -- **``** - Standalone recording button with audio visualization -- **``** - Settings menu with device, language, keybinding, and optional virtual mode -- **``** - Device selection dropdown -- **``** - Language selection dropdown -- **``** - Keybinding configuration (push-to-talk and toggle-to-talk) -- **``** - Virtual mode toggle (ambient only; tab/window/app audio mixed with microphone) - -Device, language, keybinding selectors, and settings menu are registered under both `dictation-*` and `ambient-*` tag names. TypeScript exports mirror that: `DictationDeviceSelector` / `AmbientDeviceSelector`, and so on. - -These components share state through a context system, allowing you to build custom UIs while leveraging the same underlying functionality. - -## Installation - -Install the package using your preferred package manager: - -```bash -# npm -npm i @corti/dictation-web - -# yarn -yarn add @corti/dictation-web - -# pnpm -pnpm add @corti/dictation-web - -# bun -bun add @corti/dictation-web -``` - -Then import the module in your code. You can either use a side-effect import to auto-register the component: - -```js -// Side-effect import - automatically registers the component -import '@corti/dictation-web'; -``` - -Or import the component class directly: - -```js -// Named import - register the component manually if needed -import { CortiDictation } from '@corti/dictation-web'; -``` +Lit-based web components for Corti speech APIs. Published as two npm packages from this monorepo: -Alternatively, use a CDN to start quickly (not recommended for production): +| Package | Use case | Primary element | +| --- | --- | --- | +| [@corti/dictation-web](https://www.npmjs.com/package/@corti/dictation-web) | Real-time single-speaker dictation (Transcribe) | `` | +| [@corti/ambient-web](https://www.npmjs.com/package/@corti/ambient-web) | Real-time multi-speaker ambient streaming (Streams) | `` | -```html - -``` +Package readmes: [dictation/README.md](./dictation/README.md), [ambient/README.md](./ambient/README.md). -## Demo - -🚀 [Hosted Demo](https://codepen.io/hccullen/pen/OPJmxQR) - -## Quick Start - -Here's a simple example to get you started: - -```html - - - - - - - - - -``` - -### Modular Example - -For more control, use individual components to build a custom UI: - -```html - - - - - - - - - - - - - -``` - -### Ambient Example (with Virtual Mode) - -```html - -``` - -Include `virtualMode` in `settingsEnabled` to show the Virtual mode toggle in the settings menu. When the user turns it on and starts recording, the browser prompts to share a tab/window/application; that audio is mixed with the selected microphone into one stream (microphone on the left channel, shared audio on the right). - -### Keyboard Shortcuts (Keybindings) - -The component supports both push-to-talk and toggle-to-talk keybindings simultaneously. You can configure separate keybindings for each behavior: - -**Toggle-to-Talk Keybinding (default: `Enter`):** -- Pressing the key toggles recording on/off -- Works like clicking the button - -**Push-to-Talk Keybinding (default: `Space`):** -- Keydown starts recording -- Keyup stops recording -- Works like press-and-hold - -You can use either key names (from `event.key`) or key codes (from `event.code`): +[![Dictation on npm](https://img.shields.io/npm/v/@corti/dictation-web.svg?logo=npm&label=dictation)](https://www.npmjs.com/package/@corti/dictation-web) +[![Ambient on npm](https://img.shields.io/npm/v/@corti/ambient-web.svg?logo=npm&label=ambient)](https://www.npmjs.com/package/@corti/ambient-web) +[![License: MIT](https://img.shields.io/npm/l/%40corti%2Fdictation-web)](https://opensource.org/licenses/MIT) +[![Get Support on Discord](https://img.shields.io/badge/Discord-Get%20Support-5865F2.svg?logo=discord&logoColor=fff)](https://discord.com/invite/zXeXHgnZXX) -```html - - +## Overview - - +Both packages share the same architecture: - - - -``` +1. **Opinionated component** — drop-in UI (`` or ``) +2. **Modular components** — compose your own layout under `` or `` -Keybindings are platform-aware: -- Keybindings are automatically ignored when typing in input fields, textareas, or contenteditable elements -- Both key names (e.g., `"k"`, `"Meta"`, `"Space"`) and key codes (e.g., `"KeyK"`, `"MetaLeft"`, `"Space"`) are supported -- Both keybindings can be active at the same time -- **Note:** If both keybindings are set to the same key, toggle-to-talk takes priority +> **Note:** OAuth 2.0 authentication is not handled by this library. The client must provide an authorization token or token refresh function while using the component. Ambient streaming also requires an `interactionId`. ## Documentation -For more detailed information, see: +Product documentation (install, API, auth, styling) lives on [docs.corti.ai](https://docs.corti.ai): -- **[API Reference](docs/API_REFERENCE.md)** - Complete API documentation for properties, methods, and events -- **[Authentication Guide](docs/AUTHENTICATION.md)** - How to set up authentication with tokens and refresh mechanisms -- **[Styling Guide](docs/styling.md)** - Customize the component's appearance with CSS variables and themes -- **[Examples](https://github.com/corticph/corti-examples/tree/main/dictation/typescript/web-component)** - Practical usage examples and demos -- **[Development Guide](docs/DEV_README.md)** - Information for contributors and developers +- [Dictation Web Component](https://docs.corti.ai/sdk/dictation/overview) +- [Ambient Web Component](https://docs.corti.ai/sdk/ambient/overview) diff --git a/ambient/README.md b/ambient/README.md new file mode 100644 index 0000000..0c3917d --- /dev/null +++ b/ambient/README.md @@ -0,0 +1,122 @@ +# @corti/ambient-web + +[![Published on npm](https://img.shields.io/npm/v/@corti/ambient-web.svg?logo=npm)](https://www.npmjs.com/package/@corti/ambient-web) +[![License: MIT](https://img.shields.io/npm/l/%40corti%2Fambient-web)](https://opensource.org/licenses/MIT) +[![Get Support on Discord](https://img.shields.io/badge/Discord-Get%20Support-5865F2.svg?logo=discord&logoColor=fff)](https://discord.com/invite/zXeXHgnZXX) + +Web components for real-time, multi-speaker ambient streaming on the Corti Streams API. + +- **All-in-one:** `` — recording button, settings (device, language, virtual mode by default), keyboard shortcuts, and theming +- **Modular:** `` plus ``, ``, and selectors for custom layouts + +> **Note:** OAuth 2.0 authentication is not handled by this library. The client must provide an authorization token or token refresh function while using the component. Each ambient session also requires an `interactionId`. + +For single-speaker dictation with voice commands, use [@corti/dictation-web](https://www.npmjs.com/package/@corti/dictation-web) instead. + +## Installation + +```bash +npm i @corti/ambient-web +# yarn add @corti/ambient-web +# pnpm add @corti/ambient-web +``` + +```js +import "@corti/ambient-web"; +// or: import { CortiAmbient } from "@corti/ambient-web"; +``` + +CDN (quick try only): + +```html + +``` + +## Quick start + +```html + + + +``` + +## Virtual mode + +Include `virtualMode` in `settingsEnabled` to show the Virtual mode toggle in the settings menu (included by default on ``). Add `keybinding` to expose shortcut configuration in settings: + +```html + +``` + +When enabled, the browser prompts for tab/window/application audio; that stream is mixed with the microphone (mic left channel, shared audio right). + +## Modular layout + +```html + + + + + + +``` + +| Component | Role | +| --- | --- | +| `` | Context provider (auth, config, interaction ID, virtual mode) | +| `` | Start/stop with audio visualization | +| `` | Device, language, keybinding, and virtual mode UI | +| `` | Device dropdown | +| `` | Language dropdown | +| `` | Push-to-talk / toggle-to-talk keys | +| `` | Virtual mode toggle | + +## Keybindings + +Defaults: **Enter** (toggle-to-talk), **Space** (push-to-talk). Key names (`event.key`) and codes (`event.code`) are supported. Shortcuts are ignored while focus is in inputs. If both modes use the same key, toggle-to-talk wins. + +Configure on `` or ``: + +```html + +``` + +## Documentation + +- [Ambient Web Component (full guide)](https://docs.corti.ai/sdk/ambient/overview) +- [API reference](https://docs.corti.ai/sdk/ambient/reference) +- [Authentication](https://docs.corti.ai/sdk/ambient/authentication) +- [Styling](https://docs.corti.ai/sdk/ambient/styling) +- [Proxy setup](https://docs.corti.ai/sdk/ambient/proxy) +- [Examples](https://github.com/corticph/corti-examples/tree/main/ambient) + +## Repository + +Source and issue tracking: [github.com/corticph/dictation-web](https://github.com/corticph/dictation-web) diff --git a/dictation/README.md b/dictation/README.md new file mode 100644 index 0000000..d0d4ba7 --- /dev/null +++ b/dictation/README.md @@ -0,0 +1,110 @@ +# @corti/dictation-web + +[![Published on npm](https://img.shields.io/npm/v/@corti/dictation-web.svg?logo=npm)](https://www.npmjs.com/package/@corti/dictation-web) +[![License: MIT](https://img.shields.io/npm/l/%40corti%2Fdictation-web)](https://opensource.org/licenses/MIT) +[![Get Support on Discord](https://img.shields.io/badge/Discord-Get%20Support-5865F2.svg?logo=discord&logoColor=fff)](https://discord.com/invite/zXeXHgnZXX) +[![Live Demo](https://img.shields.io/badge/Live%20Demo-blue.svg?logo=rocket&logoColor=fff)](https://codepen.io/hccullen/pen/OPJmxQR) + +Web components for real-time, single-speaker dictation on the Corti Transcribe API. + +- **All-in-one:** `` — recording button, settings, keyboard shortcuts, and theming +- **Modular:** `` plus ``, ``, and selectors for custom layouts + +> **Note:** OAuth 2.0 authentication is not handled by this library. The client must provide an authorization token or token refresh function while using the component. + +For multi-speaker ambient streaming, use [@corti/ambient-web](https://www.npmjs.com/package/@corti/ambient-web) instead. + +## Installation + +```bash +npm i @corti/dictation-web +# yarn add @corti/dictation-web +# pnpm add @corti/dictation-web +``` + +```js +import "@corti/dictation-web"; +// or: import { CortiDictation } from "@corti/dictation-web"; +``` + +CDN (quick try only): + +```html + +``` + +## Quick start + +```html + + + + +``` + +## Modular layout + +```html + + + + + + +``` + +Modular components require `` as a parent. They share state through Lit context. + +| Component | Role | +| --- | --- | +| `` | Context provider (auth, config, devices, keybindings) | +| `` | Start/stop with audio visualization | +| `` | Device, language, and keybinding UI | +| `` | Device dropdown | +| `` | Language dropdown | +| `` | Push-to-talk / toggle-to-talk keys | + +## Keybindings + +Defaults: **Enter** (toggle-to-talk), **Space** (push-to-talk). Key names (`event.key`) and codes (`event.code`) are supported. Shortcuts are ignored while focus is in inputs. If both modes use the same key, toggle-to-talk wins. + +Configure on `` or ``: + +```html + +``` + +## Documentation + +- [Dictation Web Component (full guide)](https://docs.corti.ai/sdk/dictation/overview) +- [API reference](https://docs.corti.ai/sdk/dictation/reference) +- [Authentication](https://docs.corti.ai/sdk/dictation/authentication) +- [Styling](https://docs.corti.ai/sdk/dictation/styling) +- [Proxy setup](https://docs.corti.ai/sdk/dictation/proxy) +- [Examples](https://github.com/corticph/corti-examples/tree/main/dictation) + +## Repository + +Source and issue tracking: [github.com/corticph/dictation-web](https://github.com/corticph/dictation-web) diff --git a/scripts/build-ambient.mjs b/scripts/build-ambient.mjs index 45a90ec..d3cc02e 100644 --- a/scripts/build-ambient.mjs +++ b/scripts/build-ambient.mjs @@ -1,4 +1,4 @@ -import { cpSync, readFileSync, writeFileSync } from "node:fs"; +import { cpSync, existsSync, readFileSync, writeFileSync } from "node:fs"; import { dirname, resolve } from "node:path"; import { fileURLToPath } from "node:url"; import * as esbuild from "esbuild"; @@ -28,3 +28,8 @@ if (distPkg.exports?.["."]?.import !== "./bundle.js") { } delete distPkg.scripts; writeFileSync(distPkgPath, `${JSON.stringify(distPkg, null, 2)}\n`); + +const readmeSrc = resolve(pkgDir, "README.md"); +if (existsSync(readmeSrc)) { + cpSync(readmeSrc, resolve(pkgDir, "dist/README.md")); +} diff --git a/scripts/build-dictation.mjs b/scripts/build-dictation.mjs index d1c4571..9869e86 100644 --- a/scripts/build-dictation.mjs +++ b/scripts/build-dictation.mjs @@ -1,4 +1,4 @@ -import { cpSync, readFileSync, writeFileSync } from "node:fs"; +import { cpSync, existsSync, readFileSync, writeFileSync } from "node:fs"; import { dirname, resolve } from "node:path"; import { fileURLToPath } from "node:url"; import * as esbuild from "esbuild"; @@ -28,3 +28,8 @@ if (distPkg.exports?.["."]?.import !== "./bundle.js") { } delete distPkg.scripts; writeFileSync(distPkgPath, `${JSON.stringify(distPkg, null, 2)}\n`); + +const readmeSrc = resolve(pkgDir, "README.md"); +if (existsSync(readmeSrc)) { + cpSync(readmeSrc, resolve(pkgDir, "dist/README.md")); +} From bcce5c910135d50a3b8e2362bc8b82ed5bf7d9f0 Mon Sep 17 00:00:00 2001 From: markitosha Date: Thu, 4 Jun 2026 21:03:41 +0200 Subject: [PATCH 46/50] fix(publish): restore dist/ npm layout for CDN and bundler compatibility Publish from package roots again so dist/bundle.js matches legacy jsdelivr URLs. Consolidate build scripts, commit per-package LICENSE files, and drop dist/package.json copying. --- .github/workflows/ci.yml | 4 ++-- ambient/.npmignore | 1 + ambient/LICENSE | 21 +++++++++++++++++++++ ambient/package.json | 21 ++++++++++++--------- dictation/.npmignore | 1 + dictation/LICENSE | 21 +++++++++++++++++++++ dictation/package.json | 21 ++++++++++++--------- scripts/build-ambient.mjs | 35 ----------------------------------- scripts/build-dictation.mjs | 35 ----------------------------------- scripts/build-package.mjs | 22 ++++++++++++++++++++++ 10 files changed, 92 insertions(+), 90 deletions(-) create mode 100644 ambient/.npmignore create mode 100644 ambient/LICENSE create mode 100644 dictation/.npmignore create mode 100644 dictation/LICENSE delete mode 100644 scripts/build-ambient.mjs delete mode 100644 scripts/build-dictation.mjs create mode 100644 scripts/build-package.mjs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 33d547e..565a5f8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -131,7 +131,7 @@ jobs: npx -y npm@latest publish "$@" } SUFFIX="${{ steps.version.outputs.suffix }}" - cd dictation/dist + cd dictation if [[ -n "$SUFFIX" ]]; then publish --access public --tag "$SUFFIX" else @@ -152,7 +152,7 @@ jobs: npx -y npm@latest publish "$@" } SUFFIX="${{ steps.version.outputs.suffix }}" - cd ambient/dist + cd ambient if [[ -n "$SUFFIX" ]]; then publish --access public --tag "$SUFFIX" else diff --git a/ambient/.npmignore b/ambient/.npmignore new file mode 100644 index 0000000..64a826e --- /dev/null +++ b/ambient/.npmignore @@ -0,0 +1 @@ +dist/.tsbuildinfo diff --git a/ambient/LICENSE b/ambient/LICENSE new file mode 100644 index 0000000..53a2cfb --- /dev/null +++ b/ambient/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Corti + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/ambient/package.json b/ambient/package.json index fea5837..ae180ff 100644 --- a/ambient/package.json +++ b/ambient/package.json @@ -5,18 +5,21 @@ "version": "0.0.0-dev", "license": "MIT", "type": "module", - "main": "bundle.js", - "module": "bundle.js", - "types": "index.d.ts", + "main": "dist/bundle.js", + "module": "dist/bundle.js", + "types": "dist/index.d.ts", "exports": { ".": { - "types": "./index.d.ts", - "import": "./bundle.js", - "default": "./bundle.js" + "types": "./dist/index.d.ts", + "import": "./dist/bundle.js", + "default": "./dist/bundle.js" } }, - "jsdelivr": "./bundle.js", - "browser": "./bundle.js", + "jsdelivr": "./dist/bundle.js", + "browser": "./dist/bundle.js", + "files": [ + "dist" + ], "bugs": { "url": "https://docs.corti.ai", "email": "help@corti.ai" @@ -43,6 +46,6 @@ "lit": "^3.3.3" }, "scripts": { - "build": "tsc -b && node ../scripts/build-ambient.mjs" + "build": "tsc -b && node ../scripts/build-package.mjs ambient" } } diff --git a/dictation/.npmignore b/dictation/.npmignore new file mode 100644 index 0000000..64a826e --- /dev/null +++ b/dictation/.npmignore @@ -0,0 +1 @@ +dist/.tsbuildinfo diff --git a/dictation/LICENSE b/dictation/LICENSE new file mode 100644 index 0000000..53a2cfb --- /dev/null +++ b/dictation/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Corti + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/dictation/package.json b/dictation/package.json index f683273..8dfcad8 100644 --- a/dictation/package.json +++ b/dictation/package.json @@ -5,18 +5,21 @@ "version": "0.0.0-dev", "license": "MIT", "type": "module", - "main": "bundle.js", - "module": "bundle.js", - "types": "index.d.ts", + "main": "dist/bundle.js", + "module": "dist/bundle.js", + "types": "dist/index.d.ts", "exports": { ".": { - "types": "./index.d.ts", - "import": "./bundle.js", - "default": "./bundle.js" + "types": "./dist/index.d.ts", + "import": "./dist/bundle.js", + "default": "./dist/bundle.js" } }, - "jsdelivr": "./bundle.js", - "browser": "./bundle.js", + "jsdelivr": "./dist/bundle.js", + "browser": "./dist/bundle.js", + "files": [ + "dist" + ], "bugs": { "url": "https://docs.corti.ai", "email": "help@corti.ai" @@ -42,6 +45,6 @@ "lit": "^3.3.3" }, "scripts": { - "build": "tsc -b && node ../scripts/build-dictation.mjs" + "build": "tsc -b && node ../scripts/build-package.mjs dictation" } } diff --git a/scripts/build-ambient.mjs b/scripts/build-ambient.mjs deleted file mode 100644 index d3cc02e..0000000 --- a/scripts/build-ambient.mjs +++ /dev/null @@ -1,35 +0,0 @@ -import { cpSync, existsSync, readFileSync, writeFileSync } from "node:fs"; -import { dirname, resolve } from "node:path"; -import { fileURLToPath } from "node:url"; -import * as esbuild from "esbuild"; -import { bundleCoreTypes } from "./bundle-core-types.mjs"; - -const root = resolve(dirname(fileURLToPath(import.meta.url)), ".."); -const pkgDir = resolve(root, "ambient"); - -await esbuild.build({ - bundle: true, - entryPoints: [resolve(pkgDir, "dist/index.js")], - format: "esm", - outfile: resolve(pkgDir, "dist/bundle.js"), - platform: "browser", -}); - -bundleCoreTypes(resolve(pkgDir, "dist"), resolve(root, "core/dist")); - -const distPkgPath = resolve(pkgDir, "dist/package.json"); -cpSync(resolve(pkgDir, "package.json"), distPkgPath); - -const distPkg = JSON.parse(readFileSync(distPkgPath, "utf8")); -if (distPkg.exports?.["."]?.import !== "./bundle.js") { - throw new Error( - "ambient package.json must resolve the main entry to ./bundle.js (tsc output keeps unresolved @core imports)", - ); -} -delete distPkg.scripts; -writeFileSync(distPkgPath, `${JSON.stringify(distPkg, null, 2)}\n`); - -const readmeSrc = resolve(pkgDir, "README.md"); -if (existsSync(readmeSrc)) { - cpSync(readmeSrc, resolve(pkgDir, "dist/README.md")); -} diff --git a/scripts/build-dictation.mjs b/scripts/build-dictation.mjs deleted file mode 100644 index 9869e86..0000000 --- a/scripts/build-dictation.mjs +++ /dev/null @@ -1,35 +0,0 @@ -import { cpSync, existsSync, readFileSync, writeFileSync } from "node:fs"; -import { dirname, resolve } from "node:path"; -import { fileURLToPath } from "node:url"; -import * as esbuild from "esbuild"; -import { bundleCoreTypes } from "./bundle-core-types.mjs"; - -const root = resolve(dirname(fileURLToPath(import.meta.url)), ".."); -const pkgDir = resolve(root, "dictation"); - -await esbuild.build({ - bundle: true, - entryPoints: [resolve(pkgDir, "dist/index.js")], - format: "esm", - outfile: resolve(pkgDir, "dist/bundle.js"), - platform: "browser", -}); - -bundleCoreTypes(resolve(pkgDir, "dist"), resolve(root, "core/dist")); - -const distPkgPath = resolve(pkgDir, "dist/package.json"); -cpSync(resolve(pkgDir, "package.json"), distPkgPath); - -const distPkg = JSON.parse(readFileSync(distPkgPath, "utf8")); -if (distPkg.exports?.["."]?.import !== "./bundle.js") { - throw new Error( - "dictation package.json must resolve the main entry to ./bundle.js (tsc output keeps unresolved @core imports)", - ); -} -delete distPkg.scripts; -writeFileSync(distPkgPath, `${JSON.stringify(distPkg, null, 2)}\n`); - -const readmeSrc = resolve(pkgDir, "README.md"); -if (existsSync(readmeSrc)) { - cpSync(readmeSrc, resolve(pkgDir, "dist/README.md")); -} diff --git a/scripts/build-package.mjs b/scripts/build-package.mjs new file mode 100644 index 0000000..7b1ff6b --- /dev/null +++ b/scripts/build-package.mjs @@ -0,0 +1,22 @@ +import { dirname, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; +import * as esbuild from "esbuild"; +import { bundleCoreTypes } from "./bundle-core-types.mjs"; + +const pkgName = process.argv[2]; +if (pkgName !== "dictation" && pkgName !== "ambient") { + throw new Error("Usage: node build-package.mjs "); +} + +const root = resolve(dirname(fileURLToPath(import.meta.url)), ".."); +const pkgDir = resolve(root, pkgName); + +await esbuild.build({ + bundle: true, + entryPoints: [resolve(pkgDir, "dist/index.js")], + format: "esm", + outfile: resolve(pkgDir, "dist/bundle.js"), + platform: "browser", +}); + +bundleCoreTypes(resolve(pkgDir, "dist"), resolve(root, "core/dist")); From cb020abb9d735d224e3cf56cee51fcdd441b7fb3 Mon Sep 17 00:00:00 2001 From: markitosha Date: Thu, 4 Jun 2026 21:43:27 +0200 Subject: [PATCH 47/50] fix(ambient): preserve custom participants when toggling virtual mode Move virtual-mode transcription updates into a util; only inject default doctor/patient channels when participants are empty, and clear auto-injected defaults on disable via reference equality. --- ambient/src/constants.ts | 7 ++++ ambient/src/contexts/ambient-context.ts | 44 ++++++++---------------- ambient/src/utils/virtual-mode-config.ts | 36 +++++++++++++++++++ 3 files changed, 58 insertions(+), 29 deletions(-) create mode 100644 ambient/src/utils/virtual-mode-config.ts diff --git a/ambient/src/constants.ts b/ambient/src/constants.ts index 3730963..a273b7a 100644 --- a/ambient/src/constants.ts +++ b/ambient/src/constants.ts @@ -1,5 +1,12 @@ import type { Corti } from "@corti/sdk"; +/** Default multichannel mapping when virtual mode is on and no participants are configured. */ +export const DEFAULT_VIRTUAL_MODE_PARTICIPANTS: Corti.StreamConfigParticipant[] = + [ + { channel: 0, role: "doctor" }, + { channel: 1, role: "patient" }, + ]; + export const DEFAULT_AMBIENT_CONFIG: Corti.StreamConfig = { mode: { outputLocale: "en", type: "facts" }, transcription: { diff --git a/ambient/src/contexts/ambient-context.ts b/ambient/src/contexts/ambient-context.ts index 9962a0d..d1076e9 100644 --- a/ambient/src/contexts/ambient-context.ts +++ b/ambient/src/contexts/ambient-context.ts @@ -5,6 +5,7 @@ import { createContext, provide } from "@lit/context"; import type { PropertyValues } from "lit"; import { property } from "lit/decorators.js"; import { DEFAULT_AMBIENT_CONFIG } from "../constants.js"; +import { applyVirtualModeToAmbientConfig } from "../utils/virtual-mode-config.js"; export const ambientConfigContext = createContext< Corti.StreamConfig | undefined @@ -36,33 +37,12 @@ export class AmbientRoot extends RootContext { this.addEventListener("virtual-mode-changed", (e: Event) => { const event = e as CustomEvent<{ enabled: boolean }>; this.virtualMode = event.detail.enabled; - // Set multichannel transcription for virtual mode const base = this.ambientConfig ?? DEFAULT_AMBIENT_CONFIG; - if (event.detail.enabled) { - this.ambientConfig = { - ...base, - transcription: { - ...base.transcription, - isDiarization: false, - isMultichannel: true, - participants: [ - { channel: 0, role: "doctor" }, - { channel: 1, role: "patient" }, - ], - }, - }; - } else { - this.ambientConfig = { - ...base, - transcription: { - ...base.transcription, - isDiarization: true, - isMultichannel: false, - participants: [], - }, - }; - } + this.ambientConfig = applyVirtualModeToAmbientConfig( + base, + event.detail.enabled, + ); }); this.addEventListener("languages-changed", (e: Event) => { @@ -89,12 +69,18 @@ export class AmbientRoot extends RootContext { protected override willUpdate(changedProperties: PropertyValues): void { super.willUpdate(changedProperties); - if (!changedProperties.has("ambientConfig")) { - return; + if (changedProperties.has("virtualMode")) { + const base = this.ambientConfig ?? DEFAULT_AMBIENT_CONFIG; + this.ambientConfig = applyVirtualModeToAmbientConfig( + base, + this.virtualMode, + ); } - this._selectedLanguage = - this.ambientConfig?.transcription?.primaryLanguage ?? "en"; + if (changedProperties.has("ambientConfig")) { + this._selectedLanguage = + this.ambientConfig?.transcription?.primaryLanguage ?? "en"; + } } } diff --git a/ambient/src/utils/virtual-mode-config.ts b/ambient/src/utils/virtual-mode-config.ts new file mode 100644 index 0000000..2382a0e --- /dev/null +++ b/ambient/src/utils/virtual-mode-config.ts @@ -0,0 +1,36 @@ +import type { Corti } from "@corti/sdk"; +import { DEFAULT_VIRTUAL_MODE_PARTICIPANTS } from "../constants.js"; + +export function applyVirtualModeToAmbientConfig( + base: Corti.StreamConfig, + enabled: boolean, +): Corti.StreamConfig { + const existingParticipants = base.transcription?.participants; + + if (enabled) { + return { + ...base, + transcription: { + ...base.transcription, + isDiarization: false, + isMultichannel: true, + participants: existingParticipants?.length + ? existingParticipants + : DEFAULT_VIRTUAL_MODE_PARTICIPANTS, + }, + }; + } + + return { + ...base, + transcription: { + ...base.transcription, + isDiarization: true, + isMultichannel: false, + participants: + existingParticipants === DEFAULT_VIRTUAL_MODE_PARTICIPANTS + ? [] + : (existingParticipants ?? []), + }, + }; +} From 18e425f93376e31a82de43744bf1a0b6fe70a55f Mon Sep 17 00:00:00 2001 From: markitosha Date: Fri, 5 Jun 2026 00:27:43 +0200 Subject: [PATCH 48/50] ci: run workflow jobs on self-hosted ci runners --- .github/workflows/ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 565a5f8..846588f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,7 +8,7 @@ concurrency: jobs: compile: - runs-on: ubuntu-latest + runs-on: ci steps: - name: Checkout repo @@ -30,7 +30,7 @@ jobs: run: pnpm run build lint: - runs-on: ubuntu-latest + runs-on: ci steps: - name: Checkout repo @@ -52,7 +52,7 @@ jobs: run: pnpm run lint test: - runs-on: ubuntu-latest + runs-on: ci steps: - name: Checkout repo @@ -76,7 +76,7 @@ jobs: publish: needs: [compile, lint, test] if: startsWith(github.ref, 'refs/tags/v') - runs-on: ubuntu-latest + runs-on: ci permissions: contents: read id-token: write From 1babe78afd36107cac0c275560c870229e2630d2 Mon Sep 17 00:00:00 2001 From: markitosha Date: Fri, 5 Jun 2026 11:55:04 +0200 Subject: [PATCH 49/50] ci: use ubuntu-latest runners on public repo Self-hosted ci runners are not available for this repository. --- .github/workflows/ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 846588f..565a5f8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,7 +8,7 @@ concurrency: jobs: compile: - runs-on: ci + runs-on: ubuntu-latest steps: - name: Checkout repo @@ -30,7 +30,7 @@ jobs: run: pnpm run build lint: - runs-on: ci + runs-on: ubuntu-latest steps: - name: Checkout repo @@ -52,7 +52,7 @@ jobs: run: pnpm run lint test: - runs-on: ci + runs-on: ubuntu-latest steps: - name: Checkout repo @@ -76,7 +76,7 @@ jobs: publish: needs: [compile, lint, test] if: startsWith(github.ref, 'refs/tags/v') - runs-on: ci + runs-on: ubuntu-latest permissions: contents: read id-token: write From c2fe656a99b95e85ec06346321ab02d8145c4869 Mon Sep 17 00:00:00 2001 From: markitosha Date: Fri, 5 Jun 2026 15:15:37 +0200 Subject: [PATCH 50/50] fix(storybook): align Storybook versions and monorepo story imports Pin Storybook addons to 10.1.5 to prevent startup crashes from version drift, update package repository URLs to speech-web-components, and fix story paths after the monorepo split. --- ambient/package.json | 2 +- dictation/package.json | 2 +- package.json | 5 +- pnpm-lock.yaml | 116 ++++++++++++------------- stories/ambient-root.stories.ts | 4 +- stories/device-selector.stories.ts | 4 +- stories/helpers.ts | 2 +- stories/keybinding-selector.stories.ts | 4 +- stories/language-selector.stories.ts | 4 +- stories/recording-button.stories.ts | 4 +- stories/settings-menu.stories.ts | 6 +- 11 files changed, 73 insertions(+), 80 deletions(-) diff --git a/ambient/package.json b/ambient/package.json index ae180ff..e66608f 100644 --- a/ambient/package.json +++ b/ambient/package.json @@ -24,7 +24,7 @@ "url": "https://docs.corti.ai", "email": "help@corti.ai" }, - "repository": "github:corticph/dictation-web", + "repository": "github:corticph/speech-web-components", "documentation": "https://docs.corti.ai/sdk/ambient", "homepage": "https://docs.corti.ai/sdk/ambient", "keywords": [ diff --git a/dictation/package.json b/dictation/package.json index 8dfcad8..dd6ac7d 100644 --- a/dictation/package.json +++ b/dictation/package.json @@ -24,7 +24,7 @@ "url": "https://docs.corti.ai", "email": "help@corti.ai" }, - "repository": "github:corticph/dictation-web", + "repository": "github:corticph/speech-web-components", "documentation": "https://docs.corti.ai/sdk/dictation", "homepage": "https://docs.corti.ai/sdk/dictation", "keywords": [ diff --git a/package.json b/package.json index be9358f..042525a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,7 @@ { "private": true, "description": "Web components for Corti Speech (dictation + ambient)", + "repository": "github:corticph/speech-web-components", "type": "module", "packageManager": "pnpm@10.12.1", "scripts": { @@ -25,10 +26,10 @@ "@custom-elements-manifest/analyzer": "^0.10.3", "@open-wc/testing": "^4.0.0", "@storybook/addon-a11y": "10.1.5", - "@storybook/addon-docs": "^10.1.5", + "@storybook/addon-docs": "10.1.5", "@storybook/addon-links": "10.1.5", "@storybook/web-components": "10.1.5", - "@storybook/web-components-vite": "^10.1.5", + "@storybook/web-components-vite": "10.1.5", "@types/mocha": "^10.0.7", "@web/dev-server-esbuild": "0.4.4", "@web/storybook-builder": "^0.1.16", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index aa33d95..510e80d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -27,8 +27,8 @@ importers: specifier: 10.1.5 version: 10.1.5(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)) '@storybook/addon-docs': - specifier: ^10.1.5 - version: 10.4.2(@types/react@19.2.16)(esbuild@0.25.12)(rollup@4.61.0)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.1)(esbuild@0.25.12)(terser@5.48.0)(yaml@2.9.0)) + specifier: 10.1.5 + version: 10.1.5(@types/react@19.2.16)(esbuild@0.25.12)(rollup@4.61.0)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.1)(esbuild@0.25.12)(terser@5.48.0)(yaml@2.9.0)) '@storybook/addon-links': specifier: 10.1.5 version: 10.1.5(react@19.2.7)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)) @@ -36,8 +36,8 @@ importers: specifier: 10.1.5 version: 10.1.5(lit@3.3.3)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)) '@storybook/web-components-vite': - specifier: ^10.1.5 - version: 10.4.2(esbuild@0.25.12)(lit@3.3.3)(rollup@4.61.0)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.1)(esbuild@0.25.12)(terser@5.48.0)(yaml@2.9.0)) + specifier: 10.1.5 + version: 10.1.5(esbuild@0.25.12)(lit@3.3.3)(rollup@4.61.0)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.1)(esbuild@0.25.12)(terser@5.48.0)(yaml@2.9.0)) '@types/mocha': specifier: ^10.0.7 version: 10.0.10 @@ -1130,14 +1130,10 @@ packages: peerDependencies: storybook: ^10.1.5 - '@storybook/addon-docs@10.4.2': - resolution: {integrity: sha512-CtW1O4xSKZPNtpWgpfp4yB/x4pj/of+3MvlEDfErSlr3Hp3QmEa2pCLaecR08H5LJqJFlt1PtG0UrIynTvgW9w==} + '@storybook/addon-docs@10.1.5': + resolution: {integrity: sha512-2FfqFrfEeaKv8OerZCWt1b+dm7N/nizv1G2CnTZfWJ0TKxbPDH6kffAqC9lMnT3xAZjDWiBLdnVx2oouKdmSvw==} peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.4.2 - peerDependenciesMeta: - '@types/react': - optional: true + storybook: ^10.1.5 '@storybook/addon-links@10.1.5': resolution: {integrity: sha512-a1uXpNgIZg6U2v3+431RNFCLvcuNPT2kQjFEKNAVLyNe4Krig/yR3HabGoxKHINLrtBzn/rE9yNeDhMKYfvVnA==} @@ -1148,11 +1144,11 @@ packages: react: optional: true - '@storybook/builder-vite@10.4.2': - resolution: {integrity: sha512-d3+i9vbbUfV6hvT90qabmy1WmC4bEJ7iAYDm0217doeA+S6awF25GF0qOy9gN9waU4NMntHoVpdB1YQO2wUj/w==} + '@storybook/builder-vite@10.1.5': + resolution: {integrity: sha512-5alpNa+TQXK1zp9MeovUK/yIUkZqpIFUScUer6cYgidI96Boovn7OXt5oXQ8CqqpzuEtgCvz44TzCmgZoGv41g==} peerDependencies: - storybook: ^10.4.2 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + storybook: ^10.1.5 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 '@storybook/channels@7.6.24': resolution: {integrity: sha512-rNSifUbCjUPWQMZPptY5VTY4c4iOrCzDKmmDeBeurPH0ZiDvnJjW7v9dlXzlDNoXFUv+jBE+RjrEfNWsnJhvsQ==} @@ -1169,12 +1165,12 @@ packages: '@storybook/core-events@7.6.24': resolution: {integrity: sha512-9mhV2grn+IYljRJSqoTec3XhoMs1Va0aYWe937siX3Fj77F6zuXmEugrJstgVYsPAgcqH9eBSCM7rwdmbo7LVg==} - '@storybook/csf-plugin@10.4.2': - resolution: {integrity: sha512-GqX/2DeF3/jKs5D7gpDiuT9gd0c/f2TKcnQ5av4/s3YqeN+0nhm7btkCrDfgF16uzE1Zj3OrkxvB3AOkfxWgDg==} + '@storybook/csf-plugin@10.1.5': + resolution: {integrity: sha512-v+D7PVRkNUHznfoQg8yqpLWZIIbPddqHDSi1oBGdegF0Kv/lVsGqTZGRLroApsMu7BLwLhpcMID6ofxlfftWKg==} peerDependencies: esbuild: '*' rollup: '*' - storybook: ^10.4.2 + storybook: ^10.1.5 vite: '*' webpack: '*' peerDependenciesMeta: @@ -1217,19 +1213,12 @@ packages: '@storybook/preview@7.6.24': resolution: {integrity: sha512-8qa9OFD1XKrX0Ts7vZFSd0ugIHoQt4rBGZNG7gE17laFxMTMiNAaTEqBF44f6vslx0z8VjIPtQ8qKeurU0IQdg==} - '@storybook/react-dom-shim@10.4.2': - resolution: {integrity: sha512-Eng3Yt2NCjPX94QcfyLeUFhrMj0hec2yU9J/qafBVbfj9XrFI8o+0ZwYJ7uXb9ECbvPN4y06dgt/2W/LiR417w==} + '@storybook/react-dom-shim@10.1.5': + resolution: {integrity: sha512-CsXcq26wINUgYP8KnfSuS60B10/Ag34YdcnWIEl9hM5UtTQ65WYJ9fVFqpzfnQrkpgRMd7iQjtmUhCe+4umnHg==} peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@types/react-dom': ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^10.4.2 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true + storybook: ^10.1.5 '@storybook/router@7.6.24': resolution: {integrity: sha512-298nfeJrcw/5o30obLxnu8YA5Mp566GIQTR1bvjglh9b2w4hJXwhGcZD8/rxrMbi7yDemGgLyyicMNvWr+cpQA==} @@ -1243,11 +1232,10 @@ packages: '@storybook/types@7.6.24': resolution: {integrity: sha512-XOhLmXnQprLRIs4dT9kmWHgETEiGdOjbJ9ULQGoKR72wia47Buzrjwg5Ym3BTQEzrtLpo/8FD3NS+Migldp+XA==} - '@storybook/web-components-vite@10.4.2': - resolution: {integrity: sha512-XD0vUnfJVu0aeUlwhiU3mzhdAnWSLPuljcxvWJOk/AvYQ3kKIeiM1OFFbCMUBjs6DTyomyW+t4HrSe20QoHNJg==} + '@storybook/web-components-vite@10.1.5': + resolution: {integrity: sha512-d7UXuKoRsusd4pZ5gQGE4qnoPw6SrWOz1G9QelD7f1MjRhmWrlZ/FnCvzcXIEKI5VJ2nPXqcJkTkqrqa0CTSEg==} peerDependencies: - storybook: ^10.4.2 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + storybook: ^10.1.5 '@storybook/web-components@10.1.5': resolution: {integrity: sha512-Lw+dYaNHx4zx7I1XeiwVDXIv2fu10VKBb2Bny2lRUMf7WOowFMiGKozIgZ678a6v/MTh4VWCd1r48fNfNkC0oA==} @@ -1255,12 +1243,6 @@ packages: lit: ^2.0.0 || ^3.0.0 storybook: ^10.1.5 - '@storybook/web-components@10.4.2': - resolution: {integrity: sha512-dzZhJ1G/kQ3+19ureRsV1s3Sy5krcyf5mGdUa3vdt9SFP1KiAbzUnD8ur/jiUmOKcdn6lrEKMs4NY4rSzU4mPA==} - peerDependencies: - lit: ^2.0.0 || ^3.0.0 - storybook: ^10.4.2 - '@storybook/web-components@7.6.24': resolution: {integrity: sha512-Qn+3gFUXDFEAB67rkf2rmt2C+vRD1KbQAUt+nMJv58ZxQ8z0wRjrY412eW4LAciKcZEzTPlNs1q76QKe9kLekw==} engines: {node: '>=16.0.0'} @@ -1461,6 +1443,17 @@ packages: '@vitest/expect@3.2.4': resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + '@vitest/mocker@3.2.4': + resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + '@vitest/pretty-format@3.2.4': resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} @@ -4511,20 +4504,18 @@ snapshots: axe-core: 4.12.0 storybook: 10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@storybook/addon-docs@10.4.2(@types/react@19.2.16)(esbuild@0.25.12)(rollup@4.61.0)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.1)(esbuild@0.25.12)(terser@5.48.0)(yaml@2.9.0))': + '@storybook/addon-docs@10.1.5(@types/react@19.2.16)(esbuild@0.25.12)(rollup@4.61.0)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.1)(esbuild@0.25.12)(terser@5.48.0)(yaml@2.9.0))': dependencies: '@mdx-js/react': 3.1.1(@types/react@19.2.16)(react@19.2.7) - '@storybook/csf-plugin': 10.4.2(esbuild@0.25.12)(rollup@4.61.0)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.1)(esbuild@0.25.12)(terser@5.48.0)(yaml@2.9.0)) + '@storybook/csf-plugin': 10.1.5(esbuild@0.25.12)(rollup@4.61.0)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.1)(esbuild@0.25.12)(terser@5.48.0)(yaml@2.9.0)) '@storybook/icons': 2.0.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - '@storybook/react-dom-shim': 10.4.2(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)) + '@storybook/react-dom-shim': 10.1.5(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)) react: 19.2.7 react-dom: 19.2.7(react@19.2.7) storybook: 10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) ts-dedent: 2.2.0 - optionalDependencies: - '@types/react': 19.2.16 transitivePeerDependencies: - - '@types/react-dom' + - '@types/react' - esbuild - rollup - vite @@ -4537,14 +4528,16 @@ snapshots: optionalDependencies: react: 19.2.7 - '@storybook/builder-vite@10.4.2(esbuild@0.25.12)(rollup@4.61.0)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.1)(esbuild@0.25.12)(terser@5.48.0)(yaml@2.9.0))': + '@storybook/builder-vite@10.1.5(esbuild@0.25.12)(rollup@4.61.0)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.1)(esbuild@0.25.12)(terser@5.48.0)(yaml@2.9.0))': dependencies: - '@storybook/csf-plugin': 10.4.2(esbuild@0.25.12)(rollup@4.61.0)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.1)(esbuild@0.25.12)(terser@5.48.0)(yaml@2.9.0)) + '@storybook/csf-plugin': 10.1.5(esbuild@0.25.12)(rollup@4.61.0)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.1)(esbuild@0.25.12)(terser@5.48.0)(yaml@2.9.0)) + '@vitest/mocker': 3.2.4(vite@8.0.16(@types/node@25.9.1)(esbuild@0.25.12)(terser@5.48.0)(yaml@2.9.0)) storybook: 10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) ts-dedent: 2.2.0 vite: 8.0.16(@types/node@25.9.1)(esbuild@0.25.12)(terser@5.48.0)(yaml@2.9.0) transitivePeerDependencies: - esbuild + - msw - rollup - webpack @@ -4599,7 +4592,7 @@ snapshots: dependencies: ts-dedent: 2.2.0 - '@storybook/csf-plugin@10.4.2(esbuild@0.25.12)(rollup@4.61.0)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.1)(esbuild@0.25.12)(terser@5.48.0)(yaml@2.9.0))': + '@storybook/csf-plugin@10.1.5(esbuild@0.25.12)(rollup@4.61.0)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.1)(esbuild@0.25.12)(terser@5.48.0)(yaml@2.9.0))': dependencies: storybook: 10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) unplugin: 2.3.11 @@ -4675,13 +4668,11 @@ snapshots: '@storybook/preview@7.6.24': {} - '@storybook/react-dom-shim@10.4.2(@types/react@19.2.16)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))': + '@storybook/react-dom-shim@10.1.5(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))': dependencies: react: 19.2.7 react-dom: 19.2.7(react@19.2.7) storybook: 10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - optionalDependencies: - '@types/react': 19.2.16 '@storybook/router@7.6.24': dependencies: @@ -4705,16 +4696,17 @@ snapshots: '@types/express': 4.17.25 file-system-cache: 2.3.0 - '@storybook/web-components-vite@10.4.2(esbuild@0.25.12)(lit@3.3.3)(rollup@4.61.0)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.1)(esbuild@0.25.12)(terser@5.48.0)(yaml@2.9.0))': + '@storybook/web-components-vite@10.1.5(esbuild@0.25.12)(lit@3.3.3)(rollup@4.61.0)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.1)(esbuild@0.25.12)(terser@5.48.0)(yaml@2.9.0))': dependencies: - '@storybook/builder-vite': 10.4.2(esbuild@0.25.12)(rollup@4.61.0)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.1)(esbuild@0.25.12)(terser@5.48.0)(yaml@2.9.0)) - '@storybook/web-components': 10.4.2(lit@3.3.3)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)) + '@storybook/builder-vite': 10.1.5(esbuild@0.25.12)(rollup@4.61.0)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(vite@8.0.16(@types/node@25.9.1)(esbuild@0.25.12)(terser@5.48.0)(yaml@2.9.0)) + '@storybook/web-components': 10.1.5(lit@3.3.3)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)) storybook: 10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - vite: 8.0.16(@types/node@25.9.1)(esbuild@0.25.12)(terser@5.48.0)(yaml@2.9.0) transitivePeerDependencies: - esbuild - lit + - msw - rollup + - vite - webpack '@storybook/web-components@10.1.5(lit@3.3.3)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))': @@ -4725,14 +4717,6 @@ snapshots: tiny-invariant: 1.3.3 ts-dedent: 2.2.0 - '@storybook/web-components@10.4.2(lit@3.3.3)(storybook@10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))': - dependencies: - '@storybook/global': 5.0.0 - lit: 3.3.3 - storybook: 10.1.5(@testing-library/dom@10.4.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - tiny-invariant: 1.3.3 - ts-dedent: 2.2.0 - '@storybook/web-components@7.6.24(lit@3.3.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: '@storybook/client-logger': 7.6.24 @@ -5002,6 +4986,14 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 + '@vitest/mocker@3.2.4(vite@8.0.16(@types/node@25.9.1)(esbuild@0.25.12)(terser@5.48.0)(yaml@2.9.0))': + dependencies: + '@vitest/spy': 3.2.4 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 8.0.16(@types/node@25.9.1)(esbuild@0.25.12)(terser@5.48.0)(yaml@2.9.0) + '@vitest/pretty-format@3.2.4': dependencies: tinyrainbow: 2.0.0 diff --git a/stories/ambient-root.stories.ts b/stories/ambient-root.stories.ts index ba5e3d2..5e115a4 100644 --- a/stories/ambient-root.stories.ts +++ b/stories/ambient-root.stories.ts @@ -7,8 +7,8 @@ import "../ambient/src/components/ambient-recording-button.js"; import "../core/src/components/speech-audio-visualiser.js"; import "../ambient/src/components/ambient-settings-menu.js"; import type { AmbientSettingsMenu } from "../ambient/src/components/ambient-settings-menu.js"; -import type { AmbientRoot } from "../src/contexts/ambient-context.js"; -import "../src/contexts/ambient-context.js"; +import type { AmbientRoot } from "../ambient/src/contexts/ambient-context.js"; +import "../ambient/src/contexts/ambient-context.js"; type AmbientRootStory = AmbientSettingsMenu & Pick< diff --git a/stories/device-selector.stories.ts b/stories/device-selector.stories.ts index 529c79f..9ddc39a 100644 --- a/stories/device-selector.stories.ts +++ b/stories/device-selector.stories.ts @@ -4,8 +4,8 @@ import { action } from "storybook/actions"; import type { DictationDeviceSelector } from "../dictation/src/components/dictation-device-selector.js"; import "../dictation/src/components/dictation-device-selector.js"; -import "../src/contexts/dictation-context.js"; -import type { DictationRoot } from "../src/contexts/dictation-context.js"; +import "../dictation/src/contexts/dictation-context.js"; +import type { DictationRoot } from "../dictation/src/contexts/dictation-context.js"; import { disableControls, mockDevices } from "./helpers.js"; export type DeviceSelectorStory = DictationDeviceSelector & diff --git a/stories/helpers.ts b/stories/helpers.ts index 39a027d..187b351 100644 --- a/stories/helpers.ts +++ b/stories/helpers.ts @@ -2,7 +2,7 @@ import { action } from "storybook/actions"; import { LANGUAGES_SUPPORTED_EU, LANGUAGES_SUPPORTED_US, -} from "../src/constants"; +} from "../core/src/constants.js"; export function disableControls(controls: string[]) { const argTypes: Record = {}; diff --git a/stories/keybinding-selector.stories.ts b/stories/keybinding-selector.stories.ts index 439882d..5c84c74 100644 --- a/stories/keybinding-selector.stories.ts +++ b/stories/keybinding-selector.stories.ts @@ -4,8 +4,8 @@ import { action } from "storybook/actions"; import type { DictationKeybindingSelector } from "../dictation/src/components/dictation-keybinding-selector.js"; import "../dictation/src/components/dictation-keybinding-selector.js"; -import "../src/contexts/dictation-context.js"; -import type { DictationRoot } from "../src/contexts/dictation-context.js"; +import "../dictation/src/contexts/dictation-context.js"; +import type { DictationRoot } from "../dictation/src/contexts/dictation-context.js"; import { disableControls } from "./helpers.js"; export type KeybindingSelectorStory = DictationKeybindingSelector & diff --git a/stories/language-selector.stories.ts b/stories/language-selector.stories.ts index ac8a35e..e946ffe 100644 --- a/stories/language-selector.stories.ts +++ b/stories/language-selector.stories.ts @@ -4,9 +4,9 @@ import { action } from "storybook/actions"; import type { DictationLanguageSelector } from "../dictation/src/components/dictation-language-selector.js"; import "../dictation/src/components/dictation-language-selector.js"; -import "../src/contexts/dictation-context.js"; +import "../dictation/src/contexts/dictation-context.js"; -import type { DictationRoot } from "../src/contexts/dictation-context.js"; +import type { DictationRoot } from "../dictation/src/contexts/dictation-context.js"; import { languages } from "./helpers.js"; export type LanguageSelectorStory = DictationLanguageSelector & diff --git a/stories/recording-button.stories.ts b/stories/recording-button.stories.ts index ccde7db..7028fa3 100644 --- a/stories/recording-button.stories.ts +++ b/stories/recording-button.stories.ts @@ -4,8 +4,8 @@ import { action } from "storybook/actions"; import type { DictationRecordingButton } from "../dictation/src/components/dictation-recording-button.js"; import "../dictation/src/components/dictation-recording-button.js"; -import "../src/contexts/dictation-context.js"; -import type { DictationRoot } from "../src/contexts/dictation-context.js"; +import "../dictation/src/contexts/dictation-context.js"; +import type { DictationRoot } from "../dictation/src/contexts/dictation-context.js"; import { disableControls } from "./helpers.js"; export type RecordingButtonStory = DictationRecordingButton & diff --git a/stories/settings-menu.stories.ts b/stories/settings-menu.stories.ts index d4d8981..2d31395 100644 --- a/stories/settings-menu.stories.ts +++ b/stories/settings-menu.stories.ts @@ -4,9 +4,9 @@ import { action } from "storybook/actions"; import type { DictationSettingsMenu } from "../dictation/src/components/dictation-settings-menu.js"; import "../dictation/src/components/dictation-settings-menu.js"; -import "../src/contexts/ambient-context.js"; -import "../src/contexts/dictation-context.js"; -import type { DictationRoot } from "../src/contexts/dictation-context.js"; +import "../ambient/src/contexts/ambient-context.js"; +import "../dictation/src/contexts/dictation-context.js"; +import type { DictationRoot } from "../dictation/src/contexts/dictation-context.js"; import DeviceSelectorStoryMeta, { type DeviceSelectorStory, WithCustomDevices as WithCustomDevicesDeviceSelectorStory,