From afc46162129767292c433127cd554530d0603a3e Mon Sep 17 00:00:00 2001 From: oscar marina Date: Wed, 28 Feb 2024 18:29:17 +0100 Subject: [PATCH 01/19] [@xstate/lit] Add Lit Controller --- jest.config.js | 3 + packages/xstate-lit/CHANGELOG.md | 1 + packages/xstate-lit/README.md | 147 ++ packages/xstate-lit/package.json | 61 + packages/xstate-lit/src/UseMachine.ts | 95 + packages/xstate-lit/src/index.ts | 1 + packages/xstate-lit/src/useActorRef.ts | 9 + packages/xstate-lit/test/UseActor.ts | 80 + packages/xstate-lit/test/UseActorRef.ts | 59 + .../test/UseActorWithTransitionLogic.ts | 47 + packages/xstate-lit/test/fetchMachine.ts | 39 + packages/xstate-lit/test/package.json | 3 + packages/xstate-lit/test/tsconfig.json | 10 + packages/xstate-lit/test/useActor.test.ts | 83 + packages/xstate-lit/test/useActorRef.test.ts | 21 + scripts/jest-utils/setup.js | 9 +- templates/lit-ts/.gitignore | 36 + templates/lit-ts/README.md | 9 + templates/lit-ts/custom-elements.json | 155 ++ templates/lit-ts/define/lit-ts-counter.ts | 3 + templates/lit-ts/define/lit-ts.ts | 3 + templates/lit-ts/demo/index.html | 32 + templates/lit-ts/demo/lit-ts-counter.html | 27 + templates/lit-ts/index.html | 11 + templates/lit-ts/package-lock.json | 2272 +++++++++++++++++ templates/lit-ts/package.json | 26 + templates/lit-ts/src/LitTs.ts | 158 ++ templates/lit-ts/src/LitTsCounter.ts | 88 + templates/lit-ts/src/counterMachine.ts | 74 + templates/lit-ts/src/feedbackMachine.ts | 64 + templates/lit-ts/src/index.ts | 1 + .../src/styles/lit-ts-counter-styles.css.ts | 107 + .../lit-ts/src/styles/lit-ts-styles.css.ts | 93 + templates/lit-ts/tsconfig.json | 27 + templates/lit-ts/vite.config.js | 14 + 35 files changed, 3867 insertions(+), 1 deletion(-) create mode 100644 packages/xstate-lit/CHANGELOG.md create mode 100644 packages/xstate-lit/README.md create mode 100644 packages/xstate-lit/package.json create mode 100644 packages/xstate-lit/src/UseMachine.ts create mode 100644 packages/xstate-lit/src/index.ts create mode 100644 packages/xstate-lit/src/useActorRef.ts create mode 100644 packages/xstate-lit/test/UseActor.ts create mode 100644 packages/xstate-lit/test/UseActorRef.ts create mode 100644 packages/xstate-lit/test/UseActorWithTransitionLogic.ts create mode 100644 packages/xstate-lit/test/fetchMachine.ts create mode 100644 packages/xstate-lit/test/package.json create mode 100644 packages/xstate-lit/test/tsconfig.json create mode 100644 packages/xstate-lit/test/useActor.test.ts create mode 100644 packages/xstate-lit/test/useActorRef.test.ts create mode 100644 templates/lit-ts/.gitignore create mode 100644 templates/lit-ts/README.md create mode 100644 templates/lit-ts/custom-elements.json create mode 100644 templates/lit-ts/define/lit-ts-counter.ts create mode 100644 templates/lit-ts/define/lit-ts.ts create mode 100644 templates/lit-ts/demo/index.html create mode 100644 templates/lit-ts/demo/lit-ts-counter.html create mode 100644 templates/lit-ts/index.html create mode 100644 templates/lit-ts/package-lock.json create mode 100644 templates/lit-ts/package.json create mode 100644 templates/lit-ts/src/LitTs.ts create mode 100644 templates/lit-ts/src/LitTsCounter.ts create mode 100644 templates/lit-ts/src/counterMachine.ts create mode 100644 templates/lit-ts/src/feedbackMachine.ts create mode 100644 templates/lit-ts/src/index.ts create mode 100644 templates/lit-ts/src/styles/lit-ts-counter-styles.css.ts create mode 100644 templates/lit-ts/src/styles/lit-ts-styles.css.ts create mode 100644 templates/lit-ts/tsconfig.json create mode 100644 templates/lit-ts/vite.config.js diff --git a/jest.config.js b/jest.config.js index 07edeb4e3c..6b7a915e47 100644 --- a/jest.config.js +++ b/jest.config.js @@ -6,6 +6,9 @@ const { constants } = require('jest-config'); module.exports = { prettierPath: null, setupFilesAfterEnv: ['@xstate-repo/jest-utils/setup'], + transformIgnorePatterns: [ + 'node_modules/(?!(@open-wc|lit-html|lit-element|lit|@lit)/)' + ], transform: { [constants.DEFAULT_JS_PATTERN]: 'babel-jest', '^.+\\.vue$': '@vue/vue3-jest', diff --git a/packages/xstate-lit/CHANGELOG.md b/packages/xstate-lit/CHANGELOG.md new file mode 100644 index 0000000000..9620536e4e --- /dev/null +++ b/packages/xstate-lit/CHANGELOG.md @@ -0,0 +1 @@ +# @xstate/lit diff --git a/packages/xstate-lit/README.md b/packages/xstate-lit/README.md new file mode 100644 index 0000000000..8f4fc81b0e --- /dev/null +++ b/packages/xstate-lit/README.md @@ -0,0 +1,147 @@ +# @xstate/lit + +The [@xstate/lit](https://github.com/lit/lit) package contains a [Reactive Controller](https://lit.dev/docs/composition/controllers/) for using XState with Lit. + +- [Read the full documentation in the XState docs](https://stately.ai/docs/xstate-lit/). +- [Read our contribution guidelines](https://github.com/statelyai/xstate/blob/main/CONTRIBUTING.md). + +## Quick Start + +1. Install `xstate` and `@xstate/lit`: + +```bash +npm i xstate @xstate/lit +``` + +**Via CDN** + +```html + +``` + +2. Import the `UseMachine` Lit controller: + +**`new UseMachine(this, {machine, options?, subscriptionProperty?)`** + +```js +import { html, LitElement } from 'lit'; +import { customElement, state } from 'lit/decorators.js'; +import { createBrowserInspector } from '@statelyai/inspect'; +import { createMachine } from 'xstate'; +import { UseMachine } from '@xstate/lit'; + +const { inspect } = createBrowserInspector({ + // Comment out the line below to start the inspector + autoStart: false, +}); + +const toggleMachine = createMachine({ + id: 'toggle', + initial: 'inactive', + states: { + inactive: { + on: { TOGGLE: 'active' }, + }, + active: { + on: { TOGGLE: 'inactive' }, + }, + }, +}); + +@customElement('toggle-component') +export class ToggleComponent extends LitElement { + toggleController: UseMachine; + + @state() + protected _xstate: { [k: string]: unknown } = {}; + + constructor() { + super(); + this.toggleController = new UseMachine(this, { + machine: toggleMachine, + options: { inspect }, + subscriptionProperty: '_xstate', + }); + } + + override updated(props: Map) { + super.updated && super.updated(props); + if (props.has('_xstate')) { + const { value } = this._xstate; + const toggleEvent = new CustomEvent('togglechange', { + detail: value, + }); + this.dispatchEvent(toggleEvent); + } + } + + private get _turn() { + return this.toggleController.snapshot.matches('inactive'); + } + + render() { + return html` + + `; + } +} +``` + +## API + +### `new UseMachine(host, {machine, options?, subscriptionProperty?)` + +A class that creates an actor from the given machine and starts a service that runs for the lifetime of the component. + +#### Constructor Options: + +`host`: ReactiveControllerHost: The Lit component host. +`machine`: AnyStateMachine: The XState machine to manage. +`options?`: ActorOptions: Optional options for the actor. +`subscriptionProperty?`: string: Optional property on the host to update with the state snapshot. + +#### Return Methods: + +`actor` - Returns the actor (state machine) instance. +`snapshot` - Returns the current state snapshot. +`send` - Sends an event to the state machine. +`unsubscribe` - Unsubscribes from state updates. + +## Matching States + +When using [hierarchical](https://xstate.js.org/docs/guides/hierarchical.html) and [parallel](https://xstate.js.org/docs/guides/parallel.html) machines, the state values will be objects, not strings. In this case, it is best to use [`state.matches(...)`](https://xstate.js.org/docs/guides/states.html#state-methods-and-properties). + +```js +${this.myXsateController.snapshot.matches('idle')} +// +${this.myXsateController.snapshot.matches({ loading: 'user' })} +// +${this.myXsateController.snapshot.matches({ loading: 'friends' })} +``` + +## Persisted and Rehydrated State + +You can persist and rehydrate state with `useMachine(...)` via `options.snapshot`: + +```js +// Get the persisted state config object from somewhere, e.g. localStorage +// highlight-start +const persistedState = JSON.parse( + localStorage.getItem('some-persisted-state-key'), +); +// highlight-end + +connectedCallback() { + super.connectedCallback && super.connectedCallback(); + this.fetchController = this.fetchController ?? new UseMachine(this, { + machine: someMachine, + options: { + snapshot: this.persistedState + } + }); +} + +// state will initially be that persisted state, not the machine’s initialState +``` diff --git a/packages/xstate-lit/package.json b/packages/xstate-lit/package.json new file mode 100644 index 0000000000..281f18bed9 --- /dev/null +++ b/packages/xstate-lit/package.json @@ -0,0 +1,61 @@ +{ + "name": "@xstate/lit", + "version": "1.0.0", + "description": "XState tools for Lit", + "keywords": [ + "state", + "machine", + "statechart", + "scxml", + "state", + "graph", + "store", + "lit", + "reactive controller", + "web components" + ], + "author": "David Khourshid ", + "homepage": "https://github.com/statelyai/xstate/tree/main/packages/xstate-lit#readme", + "license": "MIT", + "main": "dist/xstate-lit.cjs.js", + "module": "dist/xstate-lit.esm.js", + "exports": { + ".": { + "types": { + "import": "./dist/xstate-lit.cjs.mjs", + "default": "./dist/xstate-lit.cjs.js" + }, + "module": "./dist/xstate-lit.esm.js", + "import": "./dist/xstate-lit.cjs.mjs", + "default": "./dist/xstate-lit.cjs.js" + }, + "./package.json": "./package.json" + }, + "sideEffects": false, + "files": [ + "dist" + ], + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/statelyai/xstate.git" + }, + "bugs": { + "url": "https://github.com/statelyai/xstate/issues" + }, + "peerDependencies": { + "lit": "^3.1.2", + "xstate": "^5.8.2" + }, + "peerDependenciesMeta": { + "xstate": { + "optional": true + } + }, + "devDependencies": { + "@open-wc/testing-helpers": "^3.0.0", + "@testing-library/dom": "^9.3.4", + "@types/jest": "^29.5.10", + "lit": "^3.1.2", + "xstate": "5.8.2" + } +} diff --git a/packages/xstate-lit/src/UseMachine.ts b/packages/xstate-lit/src/UseMachine.ts new file mode 100644 index 0000000000..d012bef3c8 --- /dev/null +++ b/packages/xstate-lit/src/UseMachine.ts @@ -0,0 +1,95 @@ +import { ReactiveController, ReactiveControllerHost } from 'lit'; +import { + Actor, + AnyStateMachine, + ActorOptions, + Subscription, + EventFrom, + SnapshotFrom +} from 'xstate'; +import { useActorRef } from './useActorRef.ts'; + +export class UseMachine + implements ReactiveController +{ + private host: ReactiveControllerHost; + private machine: TMachine; + private options?: ActorOptions; + private subscriptionProperty: string; + private shouldUpdateSubscriptionProperty: boolean; + private actorRef = {} as Actor; + private subs: Subscription = { unsubscribe: () => {} }; + private currentSnapshot: SnapshotFrom; + + constructor( + host: ReactiveControllerHost, + { + machine, + options, + subscriptionProperty = '' + }: { + machine: TMachine; + options?: ActorOptions; + subscriptionProperty?: string; + } + ) { + this.machine = machine; + this.options = options; + this.subscriptionProperty = subscriptionProperty; + this.shouldUpdateSubscriptionProperty = subscriptionProperty in host; + this.currentSnapshot = this.snapshot; + this.onNext = this.onNext.bind(this); + + (this.host = host).addController(this); + } + + get actor() { + return this.actorRef; + } + + get snapshot() { + return this.actorRef?.getSnapshot?.(); + } + + send(ev: EventFrom) { + this.actorRef?.send(ev); + } + + unsubscribe() { + this.subs.unsubscribe(); + } + + protected updateSubscriptionProperty(snapshot: SnapshotFrom) { + if (this.shouldUpdateSubscriptionProperty) { + (this.host as unknown as Record)[ + this.subscriptionProperty + ] = snapshot; + } + } + + protected onNext(snapshot: SnapshotFrom) { + if (this.currentSnapshot !== snapshot) { + this.currentSnapshot = snapshot; + this.updateSubscriptionProperty(snapshot); + this.host.requestUpdate(); + } + } + + private startService() { + this.actorRef = useActorRef(this.machine, this.options); + this.subs = this.actorRef?.subscribe(this.onNext); + this.actorRef?.start(); + } + + private stopService() { + this.actorRef?.stop(); + } + + hostConnected() { + this.startService(); + } + + hostDisconnected() { + this.stopService(); + } +} diff --git a/packages/xstate-lit/src/index.ts b/packages/xstate-lit/src/index.ts new file mode 100644 index 0000000000..5ab5cf5953 --- /dev/null +++ b/packages/xstate-lit/src/index.ts @@ -0,0 +1 @@ +export { UseMachine } from './UseMachine.ts'; diff --git a/packages/xstate-lit/src/useActorRef.ts b/packages/xstate-lit/src/useActorRef.ts new file mode 100644 index 0000000000..c24b1ad1b1 --- /dev/null +++ b/packages/xstate-lit/src/useActorRef.ts @@ -0,0 +1,9 @@ +import { Actor, ActorOptions, AnyActorLogic, createActor } from 'xstate'; + +export const useActorRef = ( + logic: TMachine, + options?: ActorOptions +): Actor => { + const actorRef = createActor(logic, options); + return actorRef; +}; diff --git a/packages/xstate-lit/test/UseActor.ts b/packages/xstate-lit/test/UseActor.ts new file mode 100644 index 0000000000..28afce7547 --- /dev/null +++ b/packages/xstate-lit/test/UseActor.ts @@ -0,0 +1,80 @@ +import { html, LitElement } from 'lit'; +import type { AnyMachineSnapshot } from 'xstate'; +import { fromPromise } from 'xstate/actors'; +import { fetchMachine } from './fetchMachine.ts'; +import { UseMachine } from '../src/index.ts'; + +const onFetch = () => + new Promise((res) => { + setTimeout(() => res('some data'), 50); + }); + +const fMachine = fetchMachine.provide({ + actors: { + fetchData: fromPromise(onFetch) + } +}); + +export class UseActor extends LitElement { + fetchController: UseMachine = {} as UseMachine< + typeof fetchMachine + >; + persistedState: AnyMachineSnapshot | undefined = undefined; + + static properties = { + persistedState: { attribute: false } + }; + + override connectedCallback() { + super.connectedCallback && super.connectedCallback(); + + this.fetchController = new UseMachine(this, { + machine: fMachine, + options: { + snapshot: this.persistedState + } + }); + } + + override createRenderRoot() { + return this; + } + + override render() { + return html` + +
+ ${this.fetchController.snapshot.matches('idle') + ? html` + + ` + : ''} + ${this.fetchController.snapshot.matches('loading') + ? html`
Loading...
` + : ''} + ${this.fetchController.snapshot.matches('success') + ? html` +
+ Success! Data: +
+ ${this.fetchController.snapshot.context.data} +
+
+ ` + : ''} +
+ `; + } +} + +window.customElements.define('use-actor', UseActor); + +declare global { + interface HTMLElementTagNameMap { + 'use-actor': UseActor; + } +} diff --git a/packages/xstate-lit/test/UseActorRef.ts b/packages/xstate-lit/test/UseActorRef.ts new file mode 100644 index 0000000000..ffb5f05671 --- /dev/null +++ b/packages/xstate-lit/test/UseActorRef.ts @@ -0,0 +1,59 @@ +import { html, LitElement } from 'lit'; +import { createMachine } from 'xstate'; +import { UseMachine } from '../src/index.ts'; + +const machine = createMachine({ + initial: 'inactive', + states: { + inactive: { + on: { + TOGGLE: 'active' + } + }, + active: { + on: { + TOGGLE: 'inactive' + } + } + } +}); + +export class UseActorRef extends LitElement { + machineController: UseMachine = {} as UseMachine< + typeof machine + >; + + constructor() { + super(); + this.machineController = new UseMachine(this, { + machine: machine + }); + } + + override createRenderRoot() { + return this; + } + + private get _turn() { + return this.machineController.snapshot.matches('inactive'); + } + + override render() { + return html` + + `; + } +} + +window.customElements.define('use-actor-ref', UseActorRef); + +declare global { + interface HTMLElementTagNameMap { + 'use-actor-ref': UseActorRef; + } +} diff --git a/packages/xstate-lit/test/UseActorWithTransitionLogic.ts b/packages/xstate-lit/test/UseActorWithTransitionLogic.ts new file mode 100644 index 0000000000..5a11e7c01d --- /dev/null +++ b/packages/xstate-lit/test/UseActorWithTransitionLogic.ts @@ -0,0 +1,47 @@ +import { html, LitElement } from 'lit'; +import type { AnyStateMachine } from 'xstate'; +import { fromTransition } from 'xstate/actors'; +import { UseMachine } from '../src/index.ts'; + +const reducer = (state: number, event: { type: 'INC' }): number => { + if (event.type === 'INC') { + return state + 1; + } + return state; +}; + +const logic = fromTransition(reducer, 0); + +export class UseActorWithTransitionLogic extends LitElement { + fromTransitionLogicController: UseMachine; + constructor() { + super(); + this.fromTransitionLogicController = new UseMachine(this, { + machine: logic as unknown as AnyStateMachine + }); + } + + override createRenderRoot() { + return this; + } + + override render() { + return html` `; + } +} + +window.customElements.define( + 'use-actor-with-transition-logic', + UseActorWithTransitionLogic +); + +declare global { + interface HTMLElementTagNameMap { + 'use-actor-with-transition-logic': UseActorWithTransitionLogic; + } +} diff --git a/packages/xstate-lit/test/fetchMachine.ts b/packages/xstate-lit/test/fetchMachine.ts new file mode 100644 index 0000000000..cab7c73823 --- /dev/null +++ b/packages/xstate-lit/test/fetchMachine.ts @@ -0,0 +1,39 @@ +import { createMachine, assign, type ActorLogicFrom } from 'xstate'; + +const context = { + data: undefined as string | undefined +}; + +export const fetchMachine = createMachine({ + id: 'fetch', + types: {} as { + context: typeof context; + actors: { + src: 'fetchData'; + logic: ActorLogicFrom>; + }; + }, + initial: 'idle', + context, + states: { + idle: { + on: { FETCH: 'loading' } + }, + loading: { + invoke: { + id: 'fetchData', + src: 'fetchData', + onDone: { + target: 'success', + actions: assign({ + data: ({ event }) => event.output + }), + guard: ({ event }) => !!event.output.length + } + } + }, + success: { + type: 'final' + } + } +}); diff --git a/packages/xstate-lit/test/package.json b/packages/xstate-lit/test/package.json new file mode 100644 index 0000000000..3dbc1ca591 --- /dev/null +++ b/packages/xstate-lit/test/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/packages/xstate-lit/test/tsconfig.json b/packages/xstate-lit/test/tsconfig.json new file mode 100644 index 0000000000..e5a2d18a50 --- /dev/null +++ b/packages/xstate-lit/test/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "strict": true, + "types": ["jest"], + "moduleResolution": "node16", + "module": "node16", + "allowImportingTsExtensions": true, + "noEmit": true + } +} diff --git a/packages/xstate-lit/test/useActor.test.ts b/packages/xstate-lit/test/useActor.test.ts new file mode 100644 index 0000000000..e20abba6a3 --- /dev/null +++ b/packages/xstate-lit/test/useActor.test.ts @@ -0,0 +1,83 @@ +import type { UseActor } from './UseActor.ts'; +import type { UseActorWithTransitionLogic } from './UseActorWithTransitionLogic.ts'; +import { createActor, createMachine } from 'xstate'; +import { fixture, fixtureCleanup, html } from '@open-wc/testing-helpers'; +import { + getByText, + getByTestId, + findByText, + fireEvent, + waitFor +} from '@testing-library/dom'; +import { fetchMachine } from './fetchMachine.ts'; +import './UseActor.ts'; +import './UseActorWithTransitionLogic.ts'; + +const actorRef = createActor( + fetchMachine.provide({ + actors: { + fetchData: createMachine({ + initial: 'done', + states: { + done: { + type: 'final' + } + }, + output: 'persisted data' + }) as any + } + }) +).start(); +actorRef.send({ type: 'FETCH' }); + +const persistedFetchState = actorRef.getPersistedSnapshot(); + +const persistedFetchStateConfig = JSON.parse( + JSON.stringify(persistedFetchState) +); + +describe('useActor', () => { + afterEach(() => { + fixtureCleanup(); + }); + + it('should work with a component', async () => { + const el: UseActor = await fixture(html``); + const button = getByText(el, 'Fetch'); + await fireEvent.click(button); + await el.updateComplete; + await findByText(el, 'Loading...'); + await findByText(el, /Success/); + const dataEl = getByTestId(el, 'data'); + expect(dataEl.textContent?.trim()).toBe('some data'); + }); + + it('should work with a component with rehydrated state', async () => { + const el: UseActor = await fixture( + html`` + ); + await findByText(el, /Success/); + const dataEl = getByTestId(el, 'data'); + expect(dataEl.textContent?.trim()).toBe('persisted data'); + }); + + it('should work with a component with rehydrated state config', async () => { + const el: UseActor = await fixture( + html`` + ); + await findByText(el, /Success/); + const dataEl = getByTestId(el, 'data'); + expect(dataEl.textContent?.trim()).toBe('persisted data'); + }); + + it('should be able to spawn an actor from actor logic', async () => { + const el: UseActorWithTransitionLogic = await fixture( + html`` + ); + const buttonEl = getByTestId(el, 'count'); + await waitFor(() => expect(buttonEl.textContent?.trim()).toEqual('0')); + await fireEvent.click(buttonEl); + await el.updateComplete; + await waitFor(() => expect(buttonEl.textContent?.trim()).toEqual('1')); + }); +}); diff --git a/packages/xstate-lit/test/useActorRef.test.ts b/packages/xstate-lit/test/useActorRef.test.ts new file mode 100644 index 0000000000..ee87944182 --- /dev/null +++ b/packages/xstate-lit/test/useActorRef.test.ts @@ -0,0 +1,21 @@ +import type { UseActorRef } from './UseActorRef.ts'; +import { fixture, fixtureCleanup, html } from '@open-wc/testing-helpers'; +import { getByTestId, waitFor, fireEvent } from '@testing-library/dom'; +import './UseActorRef.ts'; + +describe('useActorRef', () => { + afterEach(() => { + fixtureCleanup(); + }); + + it('observer should be called with next state', async () => { + const el: UseActorRef = await fixture( + html`` + ); + const buttonEl = getByTestId(el, 'button'); + await waitFor(() => expect(buttonEl.textContent?.trim()).toBe('Turn on')); + await fireEvent.click(buttonEl); + await el.updateComplete; + await waitFor(() => expect(buttonEl.textContent?.trim()).toBe('Turn off')); + }); +}); diff --git a/scripts/jest-utils/setup.js b/scripts/jest-utils/setup.js index 243803c1cc..0648d1a2da 100644 --- a/scripts/jest-utils/setup.js +++ b/scripts/jest-utils/setup.js @@ -24,7 +24,14 @@ afterEach(() => { spy.mockRestore(); // actually log the "unobserved" calls to the console to make them observable in the test output - calls.forEach((args) => console[method](...args)); + calls + .filter( + (args) => + !args.includes( + 'Lit is in dev mode. Not recommended for production! See https://lit.dev/msg/dev-mode for more information.' + ) + ) + .forEach((args) => console[method](...args)); // as we just restored the mock, we need to setup a new spy consoleSpies[method] = spyOnConsole(method); diff --git a/templates/lit-ts/.gitignore b/templates/lit-ts/.gitignore new file mode 100644 index 0000000000..903714c956 --- /dev/null +++ b/templates/lit-ts/.gitignore @@ -0,0 +1,36 @@ +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +## system files +.DS_Store + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +## build +_site +dist +dev +build +.tmp +*.tgz +*.tsbuildinfo diff --git a/templates/lit-ts/README.md b/templates/lit-ts/README.md new file mode 100644 index 0000000000..09e219e50e --- /dev/null +++ b/templates/lit-ts/README.md @@ -0,0 +1,9 @@ +# XState Lit TypeScript template + +A starting point template for using XState with [Lit](https://lit.dev) and TypeScript. Create a feedback form using a simple state machine. + +Using [Vite](https://vitejs.dev/) as a build tool and to run the local development server. + +## [➡️ Open in CodeSandbox](https://codesandbox.io/p/sandbox/github/statelyai/xstate/tree/main/templates/lit-ts?file=%2Fsrc%2FfeedbackMachine.ts) + +[![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/statelyai/xstate/tree/main/templates/lit-ts?file=%2Fsrc%2FfeedbackMachine.ts) diff --git a/templates/lit-ts/custom-elements.json b/templates/lit-ts/custom-elements.json new file mode 100644 index 0000000000..996d00e2c0 --- /dev/null +++ b/templates/lit-ts/custom-elements.json @@ -0,0 +1,155 @@ +{ + "schemaVersion": "1.0.0", + "readme": "", + "modules": [ + { + "kind": "javascript-module", + "path": "src/LitTs.ts", + "declarations": [ + { + "kind": "class", + "description": "", + "name": "LitTs", + "members": [ + { + "kind": "field", + "name": "feedbackController", + "type": { + "text": "UseMachine" + } + }, + { + "kind": "method", + "name": "#getMatches", + "parameters": [ + { + "name": "match", + "type": { + "text": "'prompt' | 'thanks' | 'form' | 'closed'" + } + } + ] + }, + { + "kind": "field", + "name": "_feedbackTpl", + "readonly": true + }, + { + "kind": "field", + "name": "_closeFeedbackTpl", + "readonly": true + }, + { + "kind": "field", + "name": "_promptTpl", + "readonly": true + }, + { + "kind": "field", + "name": "_thanksTpl", + "readonly": true + }, + { + "kind": "field", + "name": "_formTpl", + "readonly": true + }, + { + "kind": "field", + "name": "_closedTpl", + "readonly": true + } + ], + "superclass": { + "name": "LitElement", + "package": "lit" + }, + "tagName": "lit-ts", + "customElement": true + } + ], + "exports": [ + { + "kind": "js", + "name": "LitTs", + "declaration": { + "name": "LitTs", + "module": "src/LitTs.ts" + } + } + ] + }, + { + "kind": "javascript-module", + "path": "src/feedbackMachine.ts", + "declarations": [ + { + "kind": "variable", + "name": "feedbackMachine" + } + ], + "exports": [ + { + "kind": "js", + "name": "feedbackMachine", + "declaration": { + "name": "feedbackMachine", + "module": "src/feedbackMachine.ts" + } + } + ] + }, + { + "kind": "javascript-module", + "path": "src/index.ts", + "declarations": [], + "exports": [ + { + "kind": "js", + "name": "LitTs", + "declaration": { + "name": "LitTs", + "module": "./LitTs.js" + } + } + ] + }, + { + "kind": "javascript-module", + "path": "src/styles/lit-ts-styles.css.ts", + "declarations": [ + { + "kind": "variable", + "name": "styles", + "default": "css`\n :host {\n --color-primary: #056dff;\n display: block;\n box-sizing: border-box;\n background: #eaeaea;\n display: flex;\n place-content: center;\n padding: 2rem;\n }\n\n :host([hidden]),\n [hidden] {\n display: none !important;\n }\n\n *,\n *::before,\n *::after {\n box-sizing: inherit;\n }\n\n em {\n display: block;\n margin-bottom: 1rem;\n text-align: center;\n }\n\n .step {\n padding: 2rem;\n background: white;\n border-radius: 1rem;\n box-shadow: 0 0.5rem 1rem #0001;\n width: 75vw;\n max-width: 40rem;\n }\n\n .feedback {\n position: relative;\n }\n\n .close-feedback {\n position: absolute;\n top: 0;\n right: 0;\n }\n\n .close-button {\n appearance: none;\n background: transparent;\n font: inherit;\n cursor: pointer;\n border: none;\n padding: 1rem;\n }\n\n .button {\n appearance: none;\n color: white;\n border: none;\n padding: 1rem 1.5rem;\n border-radius: 0.25rem;\n font: inherit;\n font-weight: bold;\n cursor: pointer;\n display: inline-block;\n margin-right: 1rem;\n background-color: var(--color-primary);\n }\n\n .button:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n }\n\n textarea {\n display: block;\n border: 2px solid #eaeaea;\n border-radius: 0.25rem;\n margin-bottom: 1rem;\n width: 100%;\n padding: 0.5rem;\n }\n`" + } + ], + "exports": [ + { + "kind": "js", + "name": "styles", + "declaration": { + "name": "styles", + "module": "src/styles/lit-ts-styles.css.ts" + } + } + ] + }, + { + "kind": "javascript-module", + "path": "define/lit-ts.ts", + "declarations": [], + "exports": [ + { + "kind": "custom-element-definition", + "name": "lit-ts", + "declaration": { + "name": "LitTs", + "module": "/src/LitTs.js" + } + } + ] + } + ] +} diff --git a/templates/lit-ts/define/lit-ts-counter.ts b/templates/lit-ts/define/lit-ts-counter.ts new file mode 100644 index 0000000000..c18900b222 --- /dev/null +++ b/templates/lit-ts/define/lit-ts-counter.ts @@ -0,0 +1,3 @@ +import { LitTsCounter } from '../src/LitTsCounter.js'; + +window.customElements.define('lit-ts-counter', LitTsCounter); diff --git a/templates/lit-ts/define/lit-ts.ts b/templates/lit-ts/define/lit-ts.ts new file mode 100644 index 0000000000..a717586e95 --- /dev/null +++ b/templates/lit-ts/define/lit-ts.ts @@ -0,0 +1,3 @@ +import { LitTs } from '../src/LitTs.js'; + +window.customElements.define('lit-ts', LitTs); diff --git a/templates/lit-ts/demo/index.html b/templates/lit-ts/demo/index.html new file mode 100644 index 0000000000..5d0b53326b --- /dev/null +++ b/templates/lit-ts/demo/index.html @@ -0,0 +1,32 @@ + + + + Vite + Lit + TS + + + + + + + + View counter demo + + + + diff --git a/templates/lit-ts/demo/lit-ts-counter.html b/templates/lit-ts/demo/lit-ts-counter.html new file mode 100644 index 0000000000..f6481bf43c --- /dev/null +++ b/templates/lit-ts/demo/lit-ts-counter.html @@ -0,0 +1,27 @@ + + + + Demo - xstate-lit + + + + + + +
+ + View feedback demo + +
+ + + diff --git a/templates/lit-ts/index.html b/templates/lit-ts/index.html new file mode 100644 index 0000000000..c76e66c84c --- /dev/null +++ b/templates/lit-ts/index.html @@ -0,0 +1,11 @@ + + + + + + + Redirect - url=/demo/index.html" + + + + diff --git a/templates/lit-ts/package-lock.json b/templates/lit-ts/package-lock.json new file mode 100644 index 0000000000..821d0b2f5c --- /dev/null +++ b/templates/lit-ts/package-lock.json @@ -0,0 +1,2272 @@ +{ + "name": "lit-ts", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "lit-ts", + "version": "0.0.0", + "dependencies": { + "@statelyai/inspect": "^0.2.4", + "lit": "^3.1.2", + "xstate": "^5.8.0" + }, + "devDependencies": { + "@custom-elements-manifest/analyzer": "^0.9.2", + "@web/rollup-plugin-html": "^2.1.2", + "tslib": "^2.6.2", + "typescript": "^5.3.3", + "vite": "^5.1.4" + } + }, + "node_modules/@custom-elements-manifest/analyzer": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@custom-elements-manifest/analyzer/-/analyzer-0.9.2.tgz", + "integrity": "sha512-E6OuKhtQvATUORveOZ0JifA9Rxf6hJ3do/rlG8h+wKFGOlY/eYoUGlq+o2/p4tOt0sTOt2MuzmdYOJ7qweeXwA==", + "dev": true, + "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": "~4.3.2" + }, + "bin": { + "cem": "cem.js", + "custom-elements-manifest": "cem.js" + } + }, + "node_modules/@custom-elements-manifest/analyzer/node_modules/typescript": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", + "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "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, + "dependencies": { + "es-module-lexer": "^0.9.3" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@github/catalyst": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@github/catalyst/-/catalyst-1.6.0.tgz", + "integrity": "sha512-u8A+DameixqpeyHzvnJWTGj+wfiskQOYHzSiJscCWVfMkIT3rxnbHMtGh3lMthaRY21nbUOK71WcsCnCrXhBJQ==", + "dev": true + }, + "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, + "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/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", + "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@lit-labs/ssr-dom-shim": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.2.0.tgz", + "integrity": "sha512-yWJKmpGE6lUURKAaIltoPIE/wrbY3TEkqQt+X0m+7fQNnAv0keydnYvbiJFP1PnMhizmIWRWOG5KLhYyc/xl+g==" + }, + "node_modules/@lit/reactive-element": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.0.4.tgz", + "integrity": "sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==", + "dependencies": { + "@lit-labs/ssr-dom-shim": "^1.2.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@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, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.0.tgz", + "integrity": "sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.0.tgz", + "integrity": "sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.0.tgz", + "integrity": "sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.0.tgz", + "integrity": "sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.0.tgz", + "integrity": "sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.0.tgz", + "integrity": "sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.0.tgz", + "integrity": "sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.0.tgz", + "integrity": "sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.0.tgz", + "integrity": "sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.0.tgz", + "integrity": "sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.0.tgz", + "integrity": "sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.0.tgz", + "integrity": "sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.0.tgz", + "integrity": "sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@statelyai/inspect": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@statelyai/inspect/-/inspect-0.2.4.tgz", + "integrity": "sha512-efzWSPV+x4lslO58qlsa1+UaW7MGEvL5tzSvVz9MhZBMYQLz/SuoOoYzEBd1xipnV88cSK9CGQYRUnxwE6PnwQ==", + "dependencies": { + "fast-safe-stringify": "^2.1.1", + "isomorphic-ws": "^5.0.0", + "partysocket": "^0.0.25", + "safe-stable-stringify": "^2.4.3", + "superjson": "^1", + "uuid": "^9.0.1" + }, + "peerDependencies": { + "xstate": "^5.5.1" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "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 + }, + "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==" + }, + "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, + "dependencies": { + "semver": "^7.3.4" + }, + "engines": { + "node": ">=10.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, + "dependencies": { + "@types/parse5": "^6.0.1", + "parse5": "^6.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@web/rollup-plugin-html": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@web/rollup-plugin-html/-/rollup-plugin-html-2.1.2.tgz", + "integrity": "sha512-Ki6s/dR9nnUVeydQg2K/DGMrj9VVTw2plktBCqvCQJovhuNAP4W+VxEVggAOryPm0teusixfYFyrYikXFcEpeA==", + "dev": true, + "dependencies": { + "@web/parse5-utils": "^2.1.0", + "glob": "^10.0.0", + "html-minifier-terser": "^7.1.0", + "parse5": "^6.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "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, + "engines": { + "node": ">=12" + }, + "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, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "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, + "engines": { + "node": ">=12.17" + } + }, + "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, + "engines": { + "node": ">=8" + } + }, + "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 + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/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, + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "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, + "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/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, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.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, + "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 + }, + "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, + "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/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "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, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/copy-anything": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", + "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", + "dependencies": { + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "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 + }, + "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 + }, + "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, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "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 + }, + "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 + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/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 + }, + "node_modules/esbuild": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "node_modules/event-target-shim": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-6.0.2.tgz", + "integrity": "sha512-8q3LsZjRezbFZ2PN+uP+Q7pnHUMmAOziU2vA2OwoFaKIXxlxl38IylhSSgUorWu/rf4er67w0ikBqjBFk/pomA==", + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "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, + "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, + "engines": { + "node": ">=6" + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "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, + "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, + "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/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, + "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/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "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, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "engines": { + "node": ">=8" + } + }, + "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, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-what": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isomorphic-ws": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", + "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/lit": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lit/-/lit-3.1.2.tgz", + "integrity": "sha512-VZx5iAyMtX7CV4K8iTLdCkMaYZ7ipjJZ0JcSdJ0zIdGxxyurjIn7yuuSxNBD7QmjvcNJwr0JS4cAdAtsy7gZ6w==", + "dependencies": { + "@lit/reactive-element": "^2.0.4", + "lit-element": "^4.0.4", + "lit-html": "^3.1.2" + } + }, + "node_modules/lit-element": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.0.4.tgz", + "integrity": "sha512-98CvgulX6eCPs6TyAIQoJZBCQPo80rgXR+dVBs61cstJXqtI+USQZAbA4gFHh6L/mxBx9MrgPLHLsUgDUHAcCQ==", + "dependencies": { + "@lit-labs/ssr-dom-shim": "^1.2.0", + "@lit/reactive-element": "^2.0.4", + "lit-html": "^3.1.2" + } + }, + "node_modules/lit-html": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.1.2.tgz", + "integrity": "sha512-3OBZSUrPnAHoKJ9AMjRL/m01YJxQMf+TMHanNtTHG68ubjnZxK0RFl102DPzsw4mWnHibfZIBJm3LWCZ/LmMvg==", + "dependencies": { + "@types/trusted-types": "^2.0.2" + } + }, + "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 + }, + "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, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/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, + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "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, + "engines": { + "node": ">=0.10.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, + "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 + }, + "node_modules/partysocket": { + "version": "0.0.25", + "resolved": "https://registry.npmjs.org/partysocket/-/partysocket-0.0.25.tgz", + "integrity": "sha512-1oCGA65fydX/FgdnsiBh68buOvfxuteoZVSb3Paci2kRp/7lhF0HyA8EDb5X/O6FxId1e+usPTQNRuzFEvkJbQ==", + "dependencies": { + "event-target-shim": "^6.0.2" + } + }, + "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, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "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, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dev": true, + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.12.0.tgz", + "integrity": "sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.12.0", + "@rollup/rollup-android-arm64": "4.12.0", + "@rollup/rollup-darwin-arm64": "4.12.0", + "@rollup/rollup-darwin-x64": "4.12.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.12.0", + "@rollup/rollup-linux-arm64-gnu": "4.12.0", + "@rollup/rollup-linux-arm64-musl": "4.12.0", + "@rollup/rollup-linux-riscv64-gnu": "4.12.0", + "@rollup/rollup-linux-x64-gnu": "4.12.0", + "@rollup/rollup-linux-x64-musl": "4.12.0", + "@rollup/rollup-win32-arm64-msvc": "4.12.0", + "@rollup/rollup-win32-ia32-msvc": "4.12.0", + "@rollup/rollup-win32-x64-msvc": "4.12.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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, + "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, + "engines": { + "node": ">=8" + } + }, + "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, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": 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, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "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, + "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, + "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/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, + "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 + }, + "node_modules/string-width-cjs/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, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "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, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/superjson": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-1.13.3.tgz", + "integrity": "sha512-mJiVjfd2vokfDxsQPOwJ/PtanO87LhpYY88ubI5dUB1Ab58Txbyje3+jpm+/83R/fevaq/107NNhtYBLuoTrFg==", + "dependencies": { + "copy-anything": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser": { + "version": "5.27.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.1.tgz", + "integrity": "sha512-29wAr6UU/oQpnTw5HoadwjUZnFQXGdOfj0LjZ4sVxzqwHh/QVkvr7m8y9WoR4iN3FRitVduTc6KdjcW38Npsug==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/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, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true, + "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, + "engines": { + "node": ">=8" + } + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vite": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.4.tgz", + "integrity": "sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==", + "dev": true, + "dependencies": { + "esbuild": "^0.19.3", + "postcss": "^8.4.35", + "rollup": "^4.2.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "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, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "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, + "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, + "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/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/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, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?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 + }, + "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, + "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-cjs/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, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ws": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "peer": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xstate": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/xstate/-/xstate-5.8.0.tgz", + "integrity": "sha512-YoJDJFRmmXcI6ZrL7H15Ew2Q5HjM/X3zcz1cqLT4OEeF/ktXDkWMGyIZOOMItM5ELR6sSqm1GY5el11M/JAb/A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/xstate" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } +} diff --git a/templates/lit-ts/package.json b/templates/lit-ts/package.json new file mode 100644 index 0000000000..b81378edad --- /dev/null +++ b/templates/lit-ts/package.json @@ -0,0 +1,26 @@ +{ + "name": "lit-ts", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "analyze": "cem analyze --litelement --globs \"{src,define}/**/*.{js,ts}\"", + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "start": "npm run dev" + }, + "dependencies": { + "@statelyai/inspect": "^0.2.4", + "lit": "^3.1.2", + "xstate": "^5.8.0" + }, + "devDependencies": { + "@custom-elements-manifest/analyzer": "^0.9.2", + "@web/rollup-plugin-html": "^2.1.2", + "tslib": "^2.6.2", + "typescript": "^5.3.3", + "vite": "^5.1.4" + }, + "customElements": "custom-elements.json" +} diff --git a/templates/lit-ts/src/LitTs.ts b/templates/lit-ts/src/LitTs.ts new file mode 100644 index 0000000000..636db2b8d0 --- /dev/null +++ b/templates/lit-ts/src/LitTs.ts @@ -0,0 +1,158 @@ +import { html, LitElement } from 'lit'; +import { createBrowserInspector } from '@statelyai/inspect'; +import { feedbackMachine } from './feedbackMachine.js'; +import { UseMachine } from '../../../packages/xstate-lit/src/index.js'; +// import { UseMachine } from '@xstate/lit'; +import { styles } from './styles/lit-ts-styles.css.js'; + +const { inspect } = createBrowserInspector({ + // Comment out the line below to start the inspector + autoStart: false +}); + +export class LitTs extends LitElement { + static override styles = [styles]; + + feedbackController: UseMachine; + + constructor() { + super(); + this.feedbackController = new UseMachine(this, { + machine: feedbackMachine, + options: { inspect } + }); + } + + #getMatches(match: 'prompt' | 'thanks' | 'form' | 'closed') { + return this.feedbackController.snapshot.matches(match); + } + + override render() { + return html` + ${this.#getMatches('closed') ? this._closedTpl : this._feedbackTpl} + `; + } + + get _feedbackTpl() { + return html` + + `; + } + + get _slotTpl() { + return html`
`; + } + + get _closeFeedbackTpl() { + return html` +
+ +
+ `; + } + + get _promptTpl() { + return html` +
+

How was your experience?

+ + + + +
+ `; + } + + get _thanksTpl() { + return html` +
+

Thanks for your feedback.

+ + ${this.feedbackController.snapshot.context.feedback + ? html`

"${this.feedbackController.snapshot.context.feedback}"

` + : ''} +
+ `; + } + + get _formTpl() { + return html` +
{ + ev.preventDefault(); + this.feedbackController.send({ type: 'submit' }); + }} + > +

What can we do better?

+ + + + + + +
+ `; + } + + get _closedTpl() { + return html` +
+ Feedback form closed. + +
+ `; + } +} + +declare global { + interface HTMLElementTagNameMap { + 'lit-ts': LitTs; + } +} diff --git a/templates/lit-ts/src/LitTsCounter.ts b/templates/lit-ts/src/LitTsCounter.ts new file mode 100644 index 0000000000..dad9140101 --- /dev/null +++ b/templates/lit-ts/src/LitTsCounter.ts @@ -0,0 +1,88 @@ +import { html, LitElement } from 'lit'; +import { state } from 'lit/decorators.js'; +import { type InspectionEvent } from 'xstate'; +import { counterMachine } from './counterMachine.js'; +import { UseMachine } from '../../../packages/xstate-lit/src/index.js'; +// import { UseMachine } from '@xstate/lit'; +import { styles } from './styles/lit-ts-counter-styles.css.js'; + +export class LitTsCounter extends LitElement { + static override styles = [styles]; + + #inspectEventsHandler: (inspEvent: InspectionEvent) => void = + this.#inspectEvents.bind(this); + + counterController: UseMachine = new UseMachine(this, { + machine: counterMachine, + options: { + inspect: this.#inspectEventsHandler + }, + subscriptionProperty: '_xstate' + }); + + @state() + _xstate: { [k: string]: unknown } = {}; + + override updated(props: Map) { + super.updated && super.updated(props); + + if (props.has('_xstate')) { + const { context, value } = this._xstate; + const detail = { ...(context || {}), value }; + const counterEvent = new CustomEvent('counterchange', { + bubbles: true, + detail + }); + this.dispatchEvent(counterEvent); + } + } + + #inspectEvents(inspEvent: InspectionEvent) { + if ( + inspEvent.type === '@xstate.snapshot' && + inspEvent.event.type === 'xstate.stop' + ) { + this._xstate = {}; + } + } + + get #disabled() { + return this.counterController.snapshot.matches('disabled'); + } + + override render() { + return html` +
+ + + + +

${this.counterController.snapshot.context.counter}

+
+
+ + +
+ `; + } +} + +declare global { + interface HTMLElementTagNameMap { + 'lit-ts-counter': LitTsCounter; + } +} diff --git a/templates/lit-ts/src/counterMachine.ts b/templates/lit-ts/src/counterMachine.ts new file mode 100644 index 0000000000..bb4d0cf5cc --- /dev/null +++ b/templates/lit-ts/src/counterMachine.ts @@ -0,0 +1,74 @@ +import { setup, assign } from 'xstate'; + +/* + * This state machine represents a simple counter that can be incremented, decremented, and toggled on and off. + * The counter starts in the "enabled" state, where it can be incremented or decremented. + * If the counter reaches its maximum value, it cannot be incremented further. Similarly, if the counter reaches its minimum value, it cannot be decremented further. The counter can also be toggled to the "disabled" state, where it cannot be incremented or decremented. + * Toggling it again will bring it back to the "enabled" state. + */ + +export const counterMachine = setup({ + types: { + context: {} as { counter: number; event: unknown }, + events: {} as + | { + type: 'INC'; + } + | { + type: 'DEC'; + } + | { + type: 'TOGGLE'; + } + }, + actions: { + increment: assign({ + counter: ({ context }) => context.counter + 1, + event: ({ event }) => event + }), + decrement: assign({ + counter: ({ context }) => context.counter - 1, + event: ({ event }) => event + }) + }, + guards: { + isNotMax: ({ context }) => context.counter < 10, + isNotMin: ({ context }) => context.counter > 0 + } +}).createMachine({ + id: 'counter', + context: { counter: 0, event: undefined }, + initial: 'enabled', + states: { + enabled: { + on: { + INC: { + actions: { + type: 'increment' + }, + guard: { + type: 'isNotMax' + } + }, + DEC: { + actions: { + type: 'decrement' + }, + guard: { + type: 'isNotMin' + } + }, + TOGGLE: { + target: 'disabled' + } + } + }, + disabled: { + on: { + TOGGLE: { + target: 'enabled' + } + } + } + } +}); diff --git a/templates/lit-ts/src/feedbackMachine.ts b/templates/lit-ts/src/feedbackMachine.ts new file mode 100644 index 0000000000..a125e29308 --- /dev/null +++ b/templates/lit-ts/src/feedbackMachine.ts @@ -0,0 +1,64 @@ +import { assign, setup } from 'xstate'; + +export const feedbackMachine = setup({ + types: { + context: {} as { feedback: string }, + events: {} as + | { + type: 'feedback.good'; + } + | { + type: 'feedback.bad'; + } + | { + type: 'feedback.update'; + value: string; + } + | { type: 'submit' } + | { + type: 'close'; + } + | { type: 'back' } + | { type: 'restart' } + }, + guards: { + feedbackValid: ({ context }) => context.feedback.length > 0 + } +}).createMachine({ + id: 'feedback', + initial: 'prompt', + context: { + feedback: '' + }, + states: { + prompt: { + on: { + 'feedback.good': 'thanks', + 'feedback.bad': 'form' + } + }, + form: { + on: { + 'feedback.update': { + actions: assign({ + feedback: ({ event }) => event.value + }) + }, + back: { target: 'prompt' }, + submit: { + guard: 'feedbackValid', + target: 'thanks' + } + } + }, + thanks: {}, + closed: { + on: { + restart: 'prompt' + } + } + }, + on: { + close: '.closed' + } +}); diff --git a/templates/lit-ts/src/index.ts b/templates/lit-ts/src/index.ts new file mode 100644 index 0000000000..80cc5a4feb --- /dev/null +++ b/templates/lit-ts/src/index.ts @@ -0,0 +1 @@ +export { LitTs } from './LitTs.js'; diff --git a/templates/lit-ts/src/styles/lit-ts-counter-styles.css.ts b/templates/lit-ts/src/styles/lit-ts-counter-styles.css.ts new file mode 100644 index 0000000000..215dd0f6f7 --- /dev/null +++ b/templates/lit-ts/src/styles/lit-ts-counter-styles.css.ts @@ -0,0 +1,107 @@ +import { css } from 'lit'; + +export const styles = css` + :host { + --color-primary: #056dff; + --_mark-color: rgb(197, 197, 197); + display: block; + box-sizing: border-box; + } + + :host([hidden]), + [hidden] { + display: none !important; + } + + *, + *::before, + *::after { + box-sizing: inherit; + } + + ::slotted(*) { + display: block; + color: var(--color-primary); + white-space: nowrap; + text-indent: -1.5rem; + text-decoration: none; + margin-top: 0.5rem; + } + + [aria-disabled='true'] { + opacity: 0.5; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + pointer-events: none; + cursor: not-allowed; + } + + p { + font-size: 1.5rem; + min-width: 4.25rem; + text-align: center; + margin: auto; + padding: 0.8333em; + border-radius: 1rem; + border: 0.0625rem solid var(--_mark-color); + } + + button { + appearance: none; + color: white; + border: none; + padding: 1rem 1.5rem; + border-radius: 0.25rem; + font: inherit; + cursor: pointer; + display: inline-block; + background-color: var(--color-primary); + } + + button + button { + margin-top: 1rem; + } + + div { + display: flex; + align-items: center; + max-width: 25rem; + padding: 1em 2em; + margin: auto; + background-color: rgb(238, 238, 238); + padding: 2rem; + background: white; + border-radius: 0.25rem; + box-shadow: 0 0.5rem 1rem #0001; + border: 0.0625rem solid var(--_mark-color); + border-bottom: none; + } + div + div { + position: relative; + border-top: 0.0625rem dashed var(--_mark-color); + border-bottom: 0.0625rem solid var(--_mark-color); + } + + div + div button { + margin: 0 auto; + min-width: 10.625rem; + } + + div + div span { + position: absolute; + display: block; + bottom: -1.5rem; + margin: 0; + } + + span { + display: flex; + flex-direction: column; + margin-right: 2rem; + } + + ::slotted(*) { + white-space: nowrap; + } +`; diff --git a/templates/lit-ts/src/styles/lit-ts-styles.css.ts b/templates/lit-ts/src/styles/lit-ts-styles.css.ts new file mode 100644 index 0000000000..658e3919ac --- /dev/null +++ b/templates/lit-ts/src/styles/lit-ts-styles.css.ts @@ -0,0 +1,93 @@ +import { css } from 'lit'; + +export const styles = css` + :host { + --color-primary: #056dff; + display: block; + box-sizing: border-box; + display: block; + margin: auto; + } + + :host([hidden]), + [hidden] { + display: none !important; + } + + *, + *::before, + *::after { + box-sizing: inherit; + } + + ::slotted(*) { + display: block; + color: var(--color-primary); + text-indent: 1rem; + white-space: nowrap; + text-decoration: none; + margin-top: 0.5rem; + } + + em { + display: block; + margin-bottom: 1rem; + text-align: center; + } + + .step { + padding: 2rem; + background: white; + border-radius: 1rem; + box-shadow: 0 0.5rem 1rem #0001; + width: 75vw; + max-width: 40rem; + } + + .feedback { + position: relative; + } + + .close-feedback { + position: absolute; + top: 0; + right: 0; + } + + .close-button { + appearance: none; + background: transparent; + font: inherit; + cursor: pointer; + border: none; + padding: 1rem; + } + + .button { + appearance: none; + color: white; + border: none; + padding: 1rem 1.5rem; + border-radius: 0.25rem; + font: inherit; + font-weight: bold; + cursor: pointer; + display: inline-block; + margin-right: 1rem; + background-color: var(--color-primary); + } + + .button:disabled { + cursor: not-allowed; + opacity: 0.5; + } + + textarea { + display: block; + border: 2px solid #eaeaea; + border-radius: 0.25rem; + margin-bottom: 1rem; + width: 100%; + padding: 0.5rem; + } +`; diff --git a/templates/lit-ts/tsconfig.json b/templates/lit-ts/tsconfig.json new file mode 100644 index 0000000000..ba77b6b018 --- /dev/null +++ b/templates/lit-ts/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "target": "es2021", + "lib": ["es2021", "DOM", "DOM.Iterable"], + "experimentalDecorators": true, + "module": "es2020", + "moduleResolution": "node", + "rootDirs": ["./src", "./define"], + "resolveJsonModule": true, + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "inlineSources": true, + "isolatedModules": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitAny": true, + "noImplicitThis": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "noImplicitOverride": true + }, + "include": ["src/**/*.ts", "define/**/*.ts"] +} diff --git a/templates/lit-ts/vite.config.js b/templates/lit-ts/vite.config.js new file mode 100644 index 0000000000..93b745228a --- /dev/null +++ b/templates/lit-ts/vite.config.js @@ -0,0 +1,14 @@ +import { defineConfig } from 'vite'; +import { rollupPluginHTML } from '@web/rollup-plugin-html'; + +export default defineConfig({ + plugins: [rollupPluginHTML()], + build: { + rollupOptions: { + input: 'demo/*.html', + output: { + format: 'es' + } + } + } +}); From 8d5837c78db0bd86dad89ac1426b40b4ca913016 Mon Sep 17 00:00:00 2001 From: oscar marina Date: Fri, 1 Mar 2024 18:33:40 +0100 Subject: [PATCH 02/19] [@xstate/lit] Fix wrong text --- packages/xstate-lit/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/xstate-lit/README.md b/packages/xstate-lit/README.md index 8f4fc81b0e..8612a2743b 100644 --- a/packages/xstate-lit/README.md +++ b/packages/xstate-lit/README.md @@ -91,7 +91,7 @@ export class ToggleComponent extends LitElement { ## API -### `new UseMachine(host, {machine, options?, subscriptionProperty?)` +### `new UseMachine(host, {machine, options?, subscriptionProperty?})` A class that creates an actor from the given machine and starts a service that runs for the lifetime of the component. @@ -114,11 +114,11 @@ A class that creates an actor from the given machine and starts a service that r When using [hierarchical](https://xstate.js.org/docs/guides/hierarchical.html) and [parallel](https://xstate.js.org/docs/guides/parallel.html) machines, the state values will be objects, not strings. In this case, it is best to use [`state.matches(...)`](https://xstate.js.org/docs/guides/states.html#state-methods-and-properties). ```js -${this.myXsateController.snapshot.matches('idle')} +${this.myXStateController.snapshot.matches('idle')} // -${this.myXsateController.snapshot.matches({ loading: 'user' })} +${this.myXStateController.snapshot.matches({ loading: 'user' })} // -${this.myXsateController.snapshot.matches({ loading: 'friends' })} +${this.myXStateController.snapshot.matches({ loading: 'friends' })} ``` ## Persisted and Rehydrated State From dc3aa911256811b3a87f0d6836ff991c7d1ebe07 Mon Sep 17 00:00:00 2001 From: oscar marina Date: Fri, 1 Mar 2024 18:35:11 +0100 Subject: [PATCH 03/19] [@xstate/lit] Remove unnecessary file --- packages/xstate-lit/test/tsconfig.json | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 packages/xstate-lit/test/tsconfig.json diff --git a/packages/xstate-lit/test/tsconfig.json b/packages/xstate-lit/test/tsconfig.json deleted file mode 100644 index e5a2d18a50..0000000000 --- a/packages/xstate-lit/test/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "strict": true, - "types": ["jest"], - "moduleResolution": "node16", - "module": "node16", - "allowImportingTsExtensions": true, - "noEmit": true - } -} From e6653d1a7cc9df1983a51b63c646ead05221f970 Mon Sep 17 00:00:00 2001 From: oscar marina Date: Fri, 1 Mar 2024 18:36:05 +0100 Subject: [PATCH 04/19] [@xstate/lit] Fix typecheck and remove unnecessary peerDependenciesMeta --- packages/xstate-lit/package.json | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/xstate-lit/package.json b/packages/xstate-lit/package.json index 281f18bed9..a71950f04b 100644 --- a/packages/xstate-lit/package.json +++ b/packages/xstate-lit/package.json @@ -19,6 +19,7 @@ "license": "MIT", "main": "dist/xstate-lit.cjs.js", "module": "dist/xstate-lit.esm.js", + "type": "module", "exports": { ".": { "types": { @@ -46,11 +47,6 @@ "lit": "^3.1.2", "xstate": "^5.8.2" }, - "peerDependenciesMeta": { - "xstate": { - "optional": true - } - }, "devDependencies": { "@open-wc/testing-helpers": "^3.0.0", "@testing-library/dom": "^9.3.4", From a4aae433403df53e07624fdc94bb4daa56daaa66 Mon Sep 17 00:00:00 2001 From: oscar marina Date: Sun, 3 Mar 2024 15:33:33 +0100 Subject: [PATCH 05/19] [@xstate/lit] Replace subscriptionProperty with callback function --- packages/xstate-lit/README.md | 23 ++++------------------- packages/xstate-lit/src/UseMachine.ts | 20 +++++--------------- templates/lit-ts/src/LitTsCounter.ts | 15 +++++++++++---- 3 files changed, 20 insertions(+), 38 deletions(-) diff --git a/packages/xstate-lit/README.md b/packages/xstate-lit/README.md index 8612a2743b..330f3b9f89 100644 --- a/packages/xstate-lit/README.md +++ b/packages/xstate-lit/README.md @@ -25,7 +25,7 @@ npm i xstate @xstate/lit ```js import { html, LitElement } from 'lit'; -import { customElement, state } from 'lit/decorators.js'; +import { customElement } from 'lit/decorators.js'; import { createBrowserInspector } from '@statelyai/inspect'; import { createMachine } from 'xstate'; import { UseMachine } from '@xstate/lit'; @@ -52,29 +52,14 @@ const toggleMachine = createMachine({ export class ToggleComponent extends LitElement { toggleController: UseMachine; - @state() - protected _xstate: { [k: string]: unknown } = {}; - - constructor() { +constructor() { super(); this.toggleController = new UseMachine(this, { machine: toggleMachine, - options: { inspect }, - subscriptionProperty: '_xstate', + options: { inspect } }); } - override updated(props: Map) { - super.updated && super.updated(props); - if (props.has('_xstate')) { - const { value } = this._xstate; - const toggleEvent = new CustomEvent('togglechange', { - detail: value, - }); - this.dispatchEvent(toggleEvent); - } - } - private get _turn() { return this.toggleController.snapshot.matches('inactive'); } @@ -100,7 +85,7 @@ A class that creates an actor from the given machine and starts a service that r `host`: ReactiveControllerHost: The Lit component host. `machine`: AnyStateMachine: The XState machine to manage. `options?`: ActorOptions: Optional options for the actor. -`subscriptionProperty?`: string: Optional property on the host to update with the state snapshot. +`callback?`: (snapshot: SnapshotFrom) => void: An optional subscription callback that listens to snapshot updates. #### Return Methods: diff --git a/packages/xstate-lit/src/UseMachine.ts b/packages/xstate-lit/src/UseMachine.ts index d012bef3c8..153680411a 100644 --- a/packages/xstate-lit/src/UseMachine.ts +++ b/packages/xstate-lit/src/UseMachine.ts @@ -15,8 +15,7 @@ export class UseMachine private host: ReactiveControllerHost; private machine: TMachine; private options?: ActorOptions; - private subscriptionProperty: string; - private shouldUpdateSubscriptionProperty: boolean; + private callback?: (snapshot: SnapshotFrom) => void; private actorRef = {} as Actor; private subs: Subscription = { unsubscribe: () => {} }; private currentSnapshot: SnapshotFrom; @@ -26,17 +25,16 @@ export class UseMachine { machine, options, - subscriptionProperty = '' + callback }: { machine: TMachine; options?: ActorOptions; - subscriptionProperty?: string; + callback?: (snapshot: SnapshotFrom) => void; } ) { this.machine = machine; this.options = options; - this.subscriptionProperty = subscriptionProperty; - this.shouldUpdateSubscriptionProperty = subscriptionProperty in host; + this.callback = callback; this.currentSnapshot = this.snapshot; this.onNext = this.onNext.bind(this); @@ -59,18 +57,10 @@ export class UseMachine this.subs.unsubscribe(); } - protected updateSubscriptionProperty(snapshot: SnapshotFrom) { - if (this.shouldUpdateSubscriptionProperty) { - (this.host as unknown as Record)[ - this.subscriptionProperty - ] = snapshot; - } - } - protected onNext(snapshot: SnapshotFrom) { if (this.currentSnapshot !== snapshot) { this.currentSnapshot = snapshot; - this.updateSubscriptionProperty(snapshot); + this.callback?.(snapshot); this.host.requestUpdate(); } } diff --git a/templates/lit-ts/src/LitTsCounter.ts b/templates/lit-ts/src/LitTsCounter.ts index dad9140101..060383f441 100644 --- a/templates/lit-ts/src/LitTsCounter.ts +++ b/templates/lit-ts/src/LitTsCounter.ts @@ -12,20 +12,23 @@ export class LitTsCounter extends LitElement { #inspectEventsHandler: (inspEvent: InspectionEvent) => void = this.#inspectEvents.bind(this); + #callbackHandler: (snapshot: SnapshotFrom) => void = + this.#callbackCounterController.bind(this); + counterController: UseMachine = new UseMachine(this, { machine: counterMachine, options: { inspect: this.#inspectEventsHandler }, - subscriptionProperty: '_xstate' + callback: this.#callbackHandler }); @state() - _xstate: { [k: string]: unknown } = {}; + _xstate: typeof this.counterController.snapshot = + {} as unknown as typeof this.counterController.snapshot; override updated(props: Map) { super.updated && super.updated(props); - if (props.has('_xstate')) { const { context, value } = this._xstate; const detail = { ...(context || {}), value }; @@ -37,12 +40,16 @@ export class LitTsCounter extends LitElement { } } + #callbackCounterController(snapshot: typeof this.counterController.snapshot) { + this._xstate = snapshot; + } + #inspectEvents(inspEvent: InspectionEvent) { if ( inspEvent.type === '@xstate.snapshot' && inspEvent.event.type === 'xstate.stop' ) { - this._xstate = {}; + this._xstate = {} as unknown as typeof this.counterController.snapshot; } } From 08e15e33069969a491ff3c27d8997fcc924019a6 Mon Sep 17 00:00:00 2001 From: Gen Liu Date: Thu, 29 Feb 2024 20:11:30 +0800 Subject: [PATCH 06/19] Update README.md to xstate v5 api (#4776) 1. state renamed to snapshot; 2. transition event should in an object. --- packages/xstate-vue/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/xstate-vue/README.md b/packages/xstate-vue/README.md index 8e471ca7bc..d97e429f09 100644 --- a/packages/xstate-vue/README.md +++ b/packages/xstate-vue/README.md @@ -45,11 +45,11 @@ const toggleMachine = createMachine({ } }); -const { snapshot, send } = useMachine(toggleMachine); +const { snapshot: state, send } = useMachine(toggleMachine);