-
-
-
+
+
+
XState is a best-in-class open source library for
- orchestrating and managing state in JavaScript and TypeScript apps.
-
+ orchestrating and managing complex application logic in JavaScript and TypeScript apps.
+
-
+
+ Get started>}
+ >
+ Jump straight into learning how to use Stately Studio editor, starting
+ with states.
+
+ Stately Studio overview>}
+ >
+ Find out more about Stately Studio's visual editor and collaborating
+ with your team using Stately Studio's premium features.
+
+ Learn state machines and statecharts>}
+ >
+ With our no-code introduction.
+
+ Learn XState>}
+ >
+ Get started with our JavaScript and TypeScript library for state
+ machines and statecharts.
+
+
Watch our [“What are initial states?” video on YouTube](https://www.youtube.com/watch?v=goCpmgyrjL0&list=PLvWgkXBB3dd4I_l-djWVU2UGPyBgKfnTQ&index=3) (1m17s).
-:::
+
({
- // highlight-next-line
+ // [!code highlight:1]
userId: input.userId,
feedback: '',
- // highlight-next-line
+ // [!code highlight:1]
rating: input.defaultRating,
}),
// ...
});
const feedbackActor = createActor(feedbackMachine, {
- // highlight-start
+ // [!code highlight:4]
input: {
userId: '123',
defaultRating: 5,
},
- // highlight-end
});
```
-:::studio
+
Input is coming to Stately Studio’s editor soon.
-:::
+
## Creating actors with input
@@ -63,11 +61,10 @@ const userFetcher = fromPromise(({ input }: { input: { userId: string } }) => {
});
const userFetcherActor = createActor(userFetcher, {
- // highlight-start
+ // [!code highlight:3]
input: {
userId: '123',
},
- // highlight-end
}).start();
userFetcherActor.onDone((data) => {
@@ -91,7 +88,7 @@ const counter = fromTransition((state, event)) => {
});
const counterActor = createActor(counter, {
- // highlight-start
+ // [!code highlight:23]
input: {
startingCount: 10,
}
@@ -115,7 +112,6 @@ const intervalActor = createActor(intervalLogic, {
input: {
interval: 1000,
},
- // highlight-end
});
intervalActor.start();
@@ -129,12 +125,11 @@ When an actor is started, it will automatically send a special event named `xsta
import { createActor, createMachine } from 'xstate';
const feedbackMachine = createMachine({
- // highlight-start
+ // [!code highlight:4]
entry: ({ event }) => {
console.log(event.input);
// logs { userId: '123', defaultRating: 5 }
},
- // highlight-end
// ...
});
@@ -164,11 +159,10 @@ const feedbackMachine = setup({
}).createMachine({
invoke: {
src: 'liveFeedback',
- // highlight-start
+ // [!code highlight:3]
input: {
domain: 'stately.ai',
},
- // highlight-end
},
});
```
@@ -180,11 +174,10 @@ import { createActor, setup } from 'xstate';
const feedbackMachine = setup({
actors: {
- // highlight-start
+ // [!code highlight:3]
fetchUser: fromPromise(({ input }) => {
return fetch(`/users/${input.userId}`).then((res) => res.json());
}),
- // highlight-end
},
}).createMachine({
context: {
@@ -194,7 +187,7 @@ const feedbackMachine = setup({
},
invoke: {
src: 'fetchUser',
- // highlight-next-line
+ // [!code highlight:1]
input: ({ context }) => ({ userId: context.userId }),
},
// ...
@@ -218,14 +211,13 @@ const feedbackMachine = setup({
},
},
actors: {
- // highlight-start
+ // [!code highlight:6]
emailUser: fromPromise(({ input }: { input: { userId: string } }) => {
return fetch(`/users/${input.userId}`, {
method: 'POST',
// ...
});
}),
- // highlight-end
},
}).createMachine({
context: {
@@ -240,7 +232,7 @@ const feedbackMachine = setup({
actions: assign({
emailRef: ({ context, spawn }) => {
return spawn('emailUser', {
- // highlight-next-line
+ // [!code highlight:1]
input: { userId: context.userId },
});
},
@@ -318,13 +310,13 @@ const Component = (props) => {
## Input and TypeScript
-:::typescript
+
**XState v5 requires TypeScript version 5.0 or greater.**
-For best results, use the latest TypeScript version. [Read more about XState and TypeScript](typescript.mdx)
+For best results, use the latest TypeScript version. [Read more about XState and TypeScript](typescript)
-:::
+
You can strongly type the `input` of your machine in the `types.input` property of the machine setup.
@@ -333,12 +325,11 @@ import { createActor, setup } from 'xstate';
const machine = setup({
types: {
- // highlight-start
+ // [!code highlight:4]
input: {} as {
userId: string;
defaultRating: number;
};
- // highlight-end
context: {} as {
userId: string;
feedback: string;
@@ -415,7 +406,7 @@ const feedbackMachine = createMachine({
invoke: {
src: 'fetchUser',
input: ({ event }) => {
- // highlight-next-line
+ // [!code highlight:1]
assertEvent(event, 'messageSent');
return {
message: event.message,
diff --git a/docs/inspection.mdx b/content/docs/inspection.mdx
similarity index 94%
rename from docs/inspection.mdx
rename to content/docs/inspection.mdx
index c2894fa5b..24bad7bf6 100644
--- a/docs/inspection.mdx
+++ b/content/docs/inspection.mdx
@@ -9,13 +9,13 @@ The Inspect API is a way to inspect the state transitions of your state machines
- Actor snapshot updates
- State transition microsteps
-:::new
+
-[We’ve recently released Stately Inspector](/blog/2024-01-15-stately-inspector/), a universal tool that enables you to visually inspect the state of any application, frontend or backend, with the visualization of Stately’s editor.
+[We’ve recently released Stately Inspector](../../docs/assets/blog/2024-01-15-stately-inspector/), a universal tool that enables you to visually inspect the state of any application, frontend or backend, with the visualization of Stately’s editor.
-[Learn more about Stately Inspector](inspector.mdx)
+[Learn more about Stately Inspector](inspector)
-:::
+
The Inspect API lets you attach an “inspector,” an observer that observes inspection events, to the root of an actor system:
diff --git a/docs/inspector.mdx b/content/docs/inspector.mdx
similarity index 95%
rename from docs/inspector.mdx
rename to content/docs/inspector.mdx
index e3611821c..e6f6d7aa3 100644
--- a/docs/inspector.mdx
+++ b/content/docs/inspector.mdx
@@ -6,11 +6,11 @@ title: Inspector
Stately Inspector is a tool that allows you to inspect your application’s state visually. It primarily works with frontend applications using XState but can also work with backend code and code that uses any state management solution.
-:::new
+
-[Read about our recent release of Stately Inspector on our blog](/blog/2024-01-15-stately-inspector/).
+[Read about our recent release of Stately Inspector on our blog](../../docs/assets/blog/2024-01-15-stately-inspector/).
-:::
+
## Install Stately Inspector
@@ -24,17 +24,17 @@ Then import the relevant inspector creator into your app. The creator is used to
```ts
import { createActor } from 'xstate';
-// highlight-next-line
+// [!code highlight:1]
import { createBrowserInspector } from '@statelyai/inspect';
import { machine } from './machine';
-// highlight-next-line
+// [!code highlight:1]
const { inspect } = createBrowserInspector();
// ...
const actor = createActor(machine, {
- // highlight-next-line
+ // [!code highlight:1]
inspect,
// ... other actor options
});
@@ -44,11 +44,11 @@ actor.start();
When you run your app, a new tab or popup window will open with the Inspector.
-:::tip
+
When using the browser inspector, ensure that the popup window is not blocked by your browser’s popup blocker.
-:::
+
## Inspector options
diff --git a/docs/installation.mdx b/content/docs/installation.mdx
similarity index 82%
rename from docs/installation.mdx
rename to content/docs/installation.mdx
index 9a33c2c1d..0ea9dbb12 100644
--- a/docs/installation.mdx
+++ b/content/docs/installation.mdx
@@ -2,34 +2,32 @@
title: Installation
---
-# Installation
-
XState has **zero dependencies** and runs anywhere that JavaScript runs. You can install XState using your favorite package manager, like [npm](https://www.npmjs.com/), [pnpm](https://pnpm.js.org/), or [yarn](https://yarnpkg.com/).
-
-
+
+
```bash
npm install xstate
```
-
+
-
+
```bash
pnpm install xstate
```
-
+
-
+
```bash
yarn add xstate
```
-
+
## CDN
diff --git a/docs/invoke.mdx b/content/docs/invoke.mdx
similarity index 87%
rename from docs/invoke.mdx
rename to content/docs/invoke.mdx
index 456b765b5..1f208ea81 100644
--- a/docs/invoke.mdx
+++ b/content/docs/invoke.mdx
@@ -2,28 +2,28 @@
title: 'Invoke'
---
-[State machines](machines.mdx) can “invoke” one or many [actors](actors.mdx) within a given state. The invoked actor will start when the state is entered, and stop when the state is exited. Any XState actor can be invoked, including simple Promise-based actors, or even complex machine-based actors.
+[State machines](machines) can “invoke” one or many [actors](actors) within a given state. The invoked actor will start when the state is entered, and stop when the state is exited. Any XState actor can be invoked, including simple Promise-based actors, or even complex machine-based actors.
Invoking an actor is useful for managing synchronous or asynchronous work that the state machine needs to orchestrate and communicate with at a high level, but doesn't need to know about in detail.
-:::tip
+
[Read about the difference between invoking and spawning actors](actors.mdx#invoking-and-spawning-actors).
-:::
+
-:::studio
+
-You can visualize your state machines and easily invoke actors in our drag-and-drop Stately editor. [Read more about actors in Stately’s editor](editor-actions-and-actors.mdx).
+You can visualize your state machines and easily invoke actors in our drag-and-drop Stately editor. [Read more about actors in Stately’s editor](editor-actions-and-actors).
-:::
+
-Actors can be invoked within any state _except_ for the [top-level final state](final-states.mdx). In the following example, the `loading` state invokes a Promise-based actor:
+Actors can be invoked within any state _except_ for the [top-level final state](final-states). In the following example, the `loading` state invokes a Promise-based actor:
```ts
import { setup, createActor, fromPromise, assign } from 'xstate';
@@ -61,7 +61,7 @@ const userMachine = setup({
},
},
loading: {
- // highlight-start
+ // [!code highlight:13]
invoke: {
id: 'getUser',
src: 'fetchUser',
@@ -75,7 +75,6 @@ const userMachine = setup({
actions: assign({ error: ({ event }) => event.error }),
},
},
- // highlight-end
},
success: {},
failure: {
@@ -93,13 +92,12 @@ Actors can also be invoked on the _root_ of the machine, and they will be active
import { fromEvent } from 'rxjs';
import { fromEventObservable } from 'xstate';
const interactiveMachine = createMachine({
- // highlight-start
+ // [!code highlight:5]
invoke: {
src: fromEventObservable(
() => fromEvent(document.body, 'click') as Subscribable,
),
},
- // highlight-end
on: {
click: {
actions: ({ event }) => console.log(event),
@@ -114,14 +112,13 @@ And `invoke` can be an array, to invoke [multiple actors](#multiple-actors):
const vitalsWorkflow = createMachine({
states: {
CheckVitals: {
- // highlight-start
+ // [!code highlight:6]
invoke: [
{ src: 'checkTirePressure' },
{ src: 'checkOilPressure' },
{ src: 'checkCoolantLevel' },
{ src: 'checkBattery' },
],
- // highlight-end
},
},
});
@@ -144,12 +141,11 @@ Unlike actions, errors thrown by invoked actors can be handled directly:
```ts
invoke: {
src: 'fetchUser',
- // highlight-start
+ // [!code highlight:4]
onError: {
target: 'failure',
actions: assign({ error: ({ event }) => event.error })
}
- // highlight-end
}
```
@@ -177,7 +173,7 @@ However, if you want a transition to re-enter the parent state, set the transiti
[Read more about re-entering states](/docs/transitions#re-entering).
-## The `invoke` property API {#api}
+## The `invoke` property API [#api]
An invocation is defined in a state node's configuration with the `invoke` property, whose value is an object that contains:
@@ -189,7 +185,7 @@ An invocation is defined in a state node's configuration with the `invoke` prope
- `onSnapshot` - Transition that occurs when the actor emits a new value.
- `systemId` - A string identifing the actor, unique system-wide.
-### Source {#src}
+### Source [#src]
The `src` represents the [actor logic](actors.mdx#actor-logic-creators) the machine should use when creating the actor. There are several actor logic creators available in XState:
@@ -251,10 +247,10 @@ const actor = createActor(
- Event object `output` property is provided with actor's output data
- Not available for callback actors
-:::warning
+
Don't get the `onDone` property on a state confused with `invoke.onDone` - they are similar transitions, but refer to different things.
-- The `onDone` property on a [state](states.mdx) node refers to the compound state node reaching a [final state](final-states.mdx).
+- The `onDone` property on a [state](states) node refers to the compound state node reaching a [final state](final-states).
- The `invoke.onDone` property refers to the invocation (`invoke.src`) being done.
```js
@@ -263,7 +259,7 @@ loading: {
invoke: {
src: someSrc,
// refers to `someSrc` being done
- // highlight-next-line
+ // [!code highlight:1]
onDone: {/* ... */}
},
initial: 'loadFoo',
@@ -273,13 +269,13 @@ loading: {
loadingComplete: { type: 'final' }
},
// refers to 'loading.loadingComplete' being reached
- // highlight-next-line
+ // [!code highlight:1]
onDone: { target: 'loaded' }
}
// ...
```
-:::
+
The `onDone` transition can be an object:
@@ -287,14 +283,13 @@ The `onDone` transition can be an object:
{
invoke: {
src: 'fetchItem',
- // highlight-start
+ // [!code highlight:6]
onDone: {
target: 'success',
actions: ({ event }) => {
console.log(event.output);
}
}
- // highlight-end
}
}
```
@@ -305,9 +300,8 @@ Or, for simplicity, target-only transitions can be strings:
{
invoke: {
src: 'fetchItem',
- // highlight-start
+ // [!code highlight:1]
onDone: 'success',
- // highlight-end
}
}
```
@@ -322,14 +316,13 @@ The `onError` transition can be an object:
```ts
invoke: {
src: 'getUser',
- // highlight-start
+ // [!code highlight:6]
onError: {
target: 'failure',
actions: ({ event }) => {
console.error(event.error);
}
}
- // highlight-end
}
```
@@ -339,9 +332,8 @@ Or, for simplicity, target-only transitions can be strings:
{
invoke: {
src: 'getUser',
- // highlight-start
+ // [!code highlight:1]
onError: 'failure'
- // highlight-end
}
}
```
@@ -355,11 +347,10 @@ Or, for simplicity, target-only transitions can be strings:
```ts
invoke: {
src: 'getUser',
- // highlight-start
+ // [!code highlight:3]
onSnapshot: {
actions: ({ event }) => console.log(event.snapshot)
}
- // highlight-end
}
```
@@ -371,21 +362,20 @@ To define input to an invoked actor, use `input`.
The `input` property can be a static input value, or a function that returns the input value. The function will be passed an object that contains the current `context` and `event`.
-:::tip
+
Behind the scenes, input is conveyed to the actor by an event:
`{ type: 'xstate.init', input: ... }`.
-:::
+
#### Input from a static value
```ts
invoke: {
src: 'liveFeedback',
- // highlight-start
+ // [!code highlight:3]
input: {
domain: 'stately.ai'
}
- // highlight-end
}
```
@@ -396,16 +386,15 @@ invoke: {
src: fromPromise(({ input: { endpoint, userId } }) => {
return fetch(`${endpoint}/${userId}`).then((res) => res.json());
}),
- // highlight-start
+ // [!code highlight:4]
input: ({ context, event }) => ({
endpoint: context.endpoint,
userId: event.userId
})
- // highlight-end
}
```
-See [Input](input.mdx) for more.
+See [Input](input) for more.
## Invoking Promises
@@ -450,7 +439,7 @@ const userMachine = setup({
},
},
loading: {
- // highlight-start
+ // [!code highlight:13]
invoke: {
id: 'getUser',
src: fromPromise(({ input }) => fetchUser(input.userId)),
@@ -464,7 +453,6 @@ const userMachine = setup({
actions: assign({ error: ({ event }) => event.error }),
},
},
- // highlight-end
},
success: {},
failure: {
@@ -528,7 +516,7 @@ const searchMachine = setup({
},
},
searching: {
- // highlight-start
+ // [!code highlight:19]
invoke: {
id: 'search',
src: fromPromise(({ input: { query } }) => search(query)),
@@ -548,7 +536,6 @@ const searchMachine = setup({
actions: assign({ results: ({ event }) => event.output }),
},
},
- // highlight-end
},
success: {},
failure: {},
@@ -566,7 +553,7 @@ actor.subscribe({
## Invoking Callbacks
-You can invoke [callback actor logic](./callback-actors.mdx) by:
+You can invoke [callback actor logic](./callback-actors) by:
1. Setting up the callback actor logic in the `actors` object of the `setup({ actors: { ... } })` call
2. Invoking the callback actor logic by its source name (`src`) in the `invoke` property of a state
@@ -576,30 +563,28 @@ import { setup, fromCallback } from 'xstate';
const machine = setup({
actors: {
- // highlight-start
+ // [!code highlight:3]
someCallback: fromCallback(({ input, sendBack, receive }) => {
// ...
}),
- // highlight-end
},
}).createMachine({
// ...
- // highlight-start
+ // [!code highlight:6]
invoke: {
src: 'someCallback',
input: {
/* ... */
},
},
- // highlight-end
});
```
-Read [callback actor logic](./callback-actors.mdx) for more information on callback actors.
+Read [callback actor logic](./callback-actors) for more information on callback actors.
## Invoking Observables
-You can invoke [observable logic](./observable-actors.mdx) by:
+You can invoke [observable logic](./observable-actors) by:
1. Setting up the observable logic in the `actors` object of the `setup({ actors: { ... } })` call
2. Invoking the observable logic by its source name (`src`) in the `invoke` property of a state
@@ -610,15 +595,14 @@ import { interval } from 'rxjs';
const machine = setup({
actors: {
- // highlight-start
+ // [!code highlight:3]
someObservable: fromObservable(({ input }: { input: number }) => {
return interval(input.ms);
}),
- // highlight-end
},
}).createMachine({
// ...
- // highlight-start
+ // [!code highlight:9]
invoke: {
src: 'someObservable',
input: { ms: 1000 },
@@ -628,11 +612,10 @@ const machine = setup({
},
},
},
- // highlight-end
});
```
-Read [observable actor logic](./observable-actors.mdx) for more information on observable actors.
+Read [observable actor logic](./observable-actors) for more information on observable actors.
## Invoking Event Observables
@@ -665,7 +648,7 @@ const machine = setup({
## Invoking Transitions
-You can invoke [transition actor logic](./transition-actors.mdx) by:
+You can invoke [transition actor logic](./transition-actors) by:
1. Setting up the transition actor logic in the `actors` object of the `setup({ actors: { ... } })` call
2. Invoking the transition actor logic by its source name (`src`) in the `invoke` property of a state
@@ -675,16 +658,15 @@ import { setup, fromTransition } from 'xstate';
const machine = setup({
actors: {
- // highlight-start
+ // [!code highlight:4]
someTransition: fromTransition((state, event, { input }) => {
// ...
return state;
}),
- // highlight-end
},
}).createMachine({
// ...
- // highlight-start
+ // [!code highlight:11]
invoke: {
src: 'someTransition',
input: {
@@ -696,15 +678,14 @@ const machine = setup({
},
},
},
- // highlight-end
});
```
-Read [transition actor logic](./transition-actors.mdx) for more information on transition actors.
+Read [transition actor logic](./transition-actors) for more information on transition actors.
## Invoking Machines
-You can invoke [state machine actor logic](./state-machine-actors.mdx) by:
+You can invoke [state machine actor logic](./state-machine-actors) by:
1. Setting up the state machine actor logic in the `actors` object of the `setup({ actors: { ... } })` call
2. Invoking the state machine actor logic by its source name (`src`) in the `invoke` property of a state
@@ -723,40 +704,38 @@ const childMachine = setup({
const machine = setup({
actors: {
- // highlight-start
+ // [!code highlight:1]
someMachine: childMachine,
- // highlight-end
},
}).createMachine({
// ...
- // highlight-start
+ // [!code highlight:6]
invoke: {
src: 'someMachine',
input: {
/* ... */
},
},
- // highlight-end
});
```
-Read [state machine actor logic](./state-machine-actors.mdx) for more information on state machine actors.
+Read [state machine actor logic](./state-machine-actors) for more information on state machine actors.
## Sending Responses
-An invoked actor (or [spawned actor](./spawn.mdx)) can _respond_ to another actor; i.e., it can send an event _in response to_ an event sent by another actor. To do so, provide a reference to the sending actor as a custom property on the event object being sent. In the following example, we use `event.sender`, but any name works.
+An invoked actor (or [spawned actor](./spawn)) can _respond_ to another actor; i.e., it can send an event _in response to_ an event sent by another actor. To do so, provide a reference to the sending actor as a custom property on the event object being sent. In the following example, we use `event.sender`, but any name works.
```js
// Parent
actions: sendTo('childActor', ({ self }) => ({
type: 'ping',
- // highlight-next-line
+ // [!code highlight:1]
sender: self,
}));
// Child
actions: sendTo(
- // highlight-next-line
+ // [!code highlight:1]
({ event }) => event.sender,
{ type: 'pong' },
);
@@ -774,13 +753,12 @@ const authServerMachine = createMachine({
waitingForCode: {
on: {
CODE: {
- // highlight-start
+ // [!code highlight:5]
actions: sendTo(
({ event }) => event.sender,
{ type: 'TOKEN' },
{ delay: 1000 },
),
- // highlight-end
},
},
},
@@ -801,12 +779,11 @@ const authClientMachine = createMachine({
id: 'auth-server',
src: authServerMachine,
},
- // highlight-start
+ // [!code highlight:4]
entry: sendTo('auth-server', ({ self }) => ({
type: 'CODE',
sender: self,
})),
- // highlight-end
on: {
TOKEN: { target: 'authorized' },
},
@@ -820,9 +797,9 @@ const authClientMachine = createMachine({
Note that by default `sendTo` will send events anonymously, in which case the receiver will not know the source of the event.
-:::note
+
In XState v4, the `respond(...)` action creator was used for this purpose. In XState v5, use `sendTo(...)` instead.
-:::
+
## Multiple Actors
@@ -874,13 +851,13 @@ actor.subscribe({
## Invoke and TypeScript
-:::typescript
+
**XState v5 requires TypeScript version 5.0 or greater.**
-For best results, use the latest TypeScript version. [Read more about XState and TypeScript](typescript.mdx)
+For best results, use the latest TypeScript version. [Read more about XState and TypeScript](typescript)
-:::
+
You should use the `setup({ ... })` API to properly infer types for invoked actor logic.
@@ -894,13 +871,12 @@ interface User {
const machine = setup({
actors: {
- // highlight-start
+ // [!code highlight:5]
fetchUser: fromPromise(async ({ input }) => {
const response = await fetch(`https://example.com/${input.userId}`);
return response.json();
}),
- // highlight-end
},
}).createMachine({
// ...
@@ -917,7 +893,7 @@ const machine = setup({
},
loadingUser: {
invoke: {
- // highlight-start
+ // [!code highlight:9]
src: 'fetchUser',
input: ({ context }) => ({
userId: context.userId, // Type enforced to be string
@@ -927,14 +903,13 @@ const machine = setup({
user: ({ event }) => event.output, // Strongly typed as User
}),
},
- // highlight-end
},
},
},
});
```
-Read the documentation on [setting up state machines](./setup.mdx) for more information.
+Read the documentation on [setting up state machines](./setup) for more information.
## Invoke cheatsheet
@@ -963,7 +938,7 @@ const userMachine = setup({
},
},
loading: {
- // highlight-start
+ // [!code highlight:13]
invoke: {
id: 'getUser',
src: 'getUser',
@@ -977,7 +952,6 @@ const userMachine = setup({
actions: assign({ error: ({ event }) => event.error }),
},
},
- // highlight-end
},
success: {},
failure: {
@@ -996,13 +970,12 @@ import { createMachine } from 'xstate';
import { fromEventObservable, fromEvent } from 'rxjs';
const interactiveMachine = createMachine({
- // highlight-start
+ // [!code highlight:5]
invoke: {
src: fromEventObservable(
() => fromEvent(document.body, 'click') as Subscribable,
),
},
- // highlight-end
on: {
click: {
actions: ({ event }) => console.log(event),
@@ -1019,14 +992,13 @@ import { createMachine } from 'xstate';
const vitalsWorkflow = createMachine({
states: {
CheckVitals: {
- // highlight-start
+ // [!code highlight:6]
invoke: [
{ src: 'checkTirePressure' /* ... */ },
{ src: 'checkOilPressure' /* ... */ },
{ src: 'checkCoolantLevel' /* ... */ },
{ src: 'checkBattery' /* ... */ },
],
- // highlight-end
},
},
});
diff --git a/docs/keyboard-shortcuts.mdx b/content/docs/keyboard-shortcuts.mdx
similarity index 96%
rename from docs/keyboard-shortcuts.mdx
rename to content/docs/keyboard-shortcuts.mdx
index 7897cbbef..9ed6485f9 100644
--- a/docs/keyboard-shortcuts.mdx
+++ b/content/docs/keyboard-shortcuts.mdx
@@ -4,8 +4,8 @@ title: Keyboard shortcuts
Stately Studio has a number of keyboard shortcuts.
-
-
+
+
| Keyboard shortcut | Description |
| ---------------------------------------------------- | ------------------- |
@@ -30,9 +30,9 @@ Stately Studio has a number of keyboard shortcuts.
| Spacebar + Mouse down | Drag to pan |
| Command + . | Show/hide UI |
-
+
-
+
| Keyboard shortcut | Description |
| ------------------------------------------------- | ------------------- |
@@ -57,7 +57,7 @@ Stately Studio has a number of keyboard shortcuts.
| Spacebar + Mouse down | Drag to pan |
| Shift + . | Show/hide UI |
-
+
diff --git a/docs/live-simulation.mdx b/content/docs/live-simulation.mdx
similarity index 82%
rename from docs/live-simulation.mdx
rename to content/docs/live-simulation.mdx
index eda9001ad..e18342ef6 100644
--- a/docs/live-simulation.mdx
+++ b/content/docs/live-simulation.mdx
@@ -2,17 +2,17 @@
title: Live simulation mode
---
-# Live simulation mode
+import { Play, Triangle } from 'lucide-react';
Live simulation mode helps you share your simulated machine with your team without screen sharing or screenshots. Share the generated live simulation link, and your team can view your simulation in real-time and even trigger events themselves.
-:::studio
+
-Live simulation is a premium feature of Stately Studio. You can try Stately Studio’s premium plans with a free trial. [Check out the features on our Pro plan](studio-pro-plan.mdx), [Team plan](studio-team-plan.mdx), [Enterprise plan](studio-enterprise-plan.mdx) or [upgrade your existing plan](https://stately.ai/registry/billing).
+Live simulation is a premium feature of Stately Studio. You can try Stately Studio’s premium plans with a free trial. [Check out the features on our Pro plan](studio-pro-plan), [Team plan](studio-team-plan), [Enterprise plan](studio-enterprise-plan) or [upgrade your existing plan](https://stately.ai/registry/billing).
-:::
+
-
+{/*
-
+ */}
+
+
## Simulate your machine with others
You must be signed in to start a live simulation. Enter **Simulate** mode from the **Simulate** button.
-:::tip
+
When you’re in **Simulate** mode, your current state and next available events are highlighted in blue to simulate the flow of your machine. Click the available events to transition through states and review your logic.
-:::
+
Use the **Live mode** button in the bottom left corner to reveal the **Live simulation** options and choose **Start a live simulation** to start a live simulation session.
diff --git a/versioned_docs/version-4/lock-machines.mdx b/content/docs/lock-machines.mdx
similarity index 81%
rename from versioned_docs/version-4/lock-machines.mdx
rename to content/docs/lock-machines.mdx
index 8971adeb5..25b4156f0 100644
--- a/versioned_docs/version-4/lock-machines.mdx
+++ b/content/docs/lock-machines.mdx
@@ -2,23 +2,25 @@
title: Lock machines
---
+import { Lock, Unlock, Info } from 'lucide-react';
+
You can lock a machine anytime to prevent accidental edits. Locked machines have a **Locked** status displayed in the editor’s top bar and in the project’s machine list in the left panel.
Hover over the **Locked** text to view who locked the machine and when.
-:::studio
+
-Locking machines is a premium feature of Stately Studio. You can try Stately Studio’s premium plans with a free trial. [Check out the features on our Pro plan](studio-pro-plan.mdx), [Team plan](studio-team-plan.mdx), [Enterprise plan](studio-enterprise-plan.mdx) or [upgrade your existing plan](https://stately.ai/registry/billing).
+Locking machines is a premium feature of Stately Studio. You can try Stately Studio’s premium plans with a free trial. [Check out the features on our Pro plan](studio-pro-plan), [Team plan](studio-team-plan), [Enterprise plan](studio-enterprise-plan) or [upgrade your existing plan](https://stately.ai/registry/billing).
-:::
+
Locking a machine prevents you, or anyone else on your team, from the following:
- Editing the machine
- Deleting the machine
- Renaming the machine
-- [Importing code](import-from-code.mdx) to replace the machine
-- [Restoring a past version](versions.mdx) of the machine
+- [Importing code](import-from-code) to replace the machine
+- [Restoring a past version](versions) of the machine
If somebody else is viewing or editing the machine when it is locked, their changes will not be saved, and they will be notified that the machine is now locked.
diff --git a/docs/machine-restore.mdx b/content/docs/machine-restore.mdx
similarity index 66%
rename from docs/machine-restore.mdx
rename to content/docs/machine-restore.mdx
index 72ac3d16b..141c3d7c9 100644
--- a/docs/machine-restore.mdx
+++ b/content/docs/machine-restore.mdx
@@ -5,23 +5,23 @@ title: Machine restore
The Studio is built using a server-client architecture.
Whenever you edit a machine, we will persist these changes to our database, ready for you to use when you return - on any device with an internet connection.
-
+
But what happens with your edits if your internet connection fails or the Stately backend is having problems?
This is where machine restore comes into play.
### Example
-In our example, Santa’s delivery machine has a problem; the Christmas-time state is unreachable.
-So we do as any good Santa’s helper would; we create an event to get to Christmas.
-But alas, we’re offline, so our changes could get lost.
-Before this new feature, there was a chance you wouldn’t notice you’d gone offline or that the server returned an error.
-But as you can see in the GIF below, we’ve introduced new error banners to show you what’s happening.
+In our example, Santa's delivery machine has a problem; the Christmas-time state is unreachable.
+So we do as any good Santa's helper would; we create an event to get to Christmas.
+But alas, we're offline, so our changes could get lost.
+Before this new feature, there was a chance you wouldn't notice you'd gone offline or that the server returned an error.
+But as you can see in the GIF below, we've introduced new error banners to show you what's happening.
-If you lose connectivity, we’ll show the error banner saying, “You are offline, so we can’t save your machine; we will try our best to store a local copy you can restore later.”
+If you lose connectivity, we'll show the error banner saying, "You are offline, so we can't save your machine; we will try our best to store a local copy you can restore later."
So feel free to keep editing; you can restore your work the next time you visit this machine on the same device.
-
+
### How to restore
@@ -39,10 +39,10 @@ Now you have two options:
You can see this in action using our example from above.
When I return to the Studio, I can restore the changes I did while offline. Christmas is saved.
-
+
-:::info
+
Read more in [our blog post introducing machine restore](https://stately.ai/blog/2022-12-22-machine-recovery).
-:::
+
diff --git a/docs/machines.mdx b/content/docs/machines.mdx
similarity index 89%
rename from docs/machines.mdx
rename to content/docs/machines.mdx
index a03b0d7cf..60bf8ccc7 100644
--- a/docs/machines.mdx
+++ b/content/docs/machines.mdx
@@ -2,13 +2,13 @@
title: 'State machines'
---
-A [state machine](state-machines-and-statecharts.mdx) is a model that describes the behavior of something, for example an [actor](actors.mdx). [Finite state](finite-states.mdx) machines describe how the state of an actor transitions to another state when an [event](transitions.mdx) occurs.
+A [state machine](state-machines-and-statecharts) is a model that describes the behavior of something, for example an [actor](actors). [Finite state](finite-states) machines describe how the state of an actor transitions to another state when an [event](transitions) occurs.
-:::tip
+
-Read our [introduction to state machines and statecharts](state-machines-and-statecharts.mdx) if you haven’t already!
+Read our [introduction to state machines and statecharts](state-machines-and-statecharts) if you haven’t already!
-:::
+
## Benefits of state machines
@@ -16,7 +16,7 @@ State machines help build reliable and robust software. [Read more about the ben
## Creating a state machine
-In [XState](xstate.mdx), a state machine (referred to as a “machine”) is created using the `createMachine(config)` function:
+In [XState](xstate), a state machine (referred to as a “machine”) is created using the `createMachine(config)` function:
```ts
import { createMachine } from 'xstate';
@@ -58,7 +58,7 @@ feedbackActor.send({ type: 'feedback.good' });
## Creating actors from machines
-A machine contains the logic of an actor. An [actor](actors.mdx) is a running instance of the machine; in other words, it is the entity whose logic is described by the machine. Multiple actors can be created from the same machine, and each of those actors will exhibit the same behavior (reaction to received events), but they will be independent of each other and have their own states.
+A machine contains the logic of an actor. An [actor](actors) is a running instance of the machine; in other words, it is the entity whose logic is described by the machine. Multiple actors can be created from the same machine, and each of those actors will exhibit the same behavior (reaction to received events), but they will be independent of each other and have their own states.
To create an actor, use the `createActor(machine)` function:
@@ -81,10 +81,10 @@ You can also create an actor [from other types of logic](/docs/actors/#actor-log
Machine implementations are the language-specific code that is executed but is not directly related to the state machine’s logic (states and transitions). This includes:
-- [Actions](actions.mdx), which are fire-and-forget side-effects.
-- [Actors](actors.mdx), which are entities that can communicate with the machine actor.
-- [Guards](guards.mdx), which are conditions that determine whether a transition should be taken.
-- [Delays](delayed-transitions.mdx), which specify the time before a delayed transition is taken or a delayed event is sent.
+- [Actions](actions), which are fire-and-forget side-effects.
+- [Actors](actors), which are entities that can communicate with the machine actor.
+- [Guards](guards), which are conditions that determine whether a transition should be taken.
+- [Delays](delayed-transitions), which specify the time before a delayed transition is taken or a delayed event is sent.
The default implementations can be provided in a `setup({...})` function when creating a machine, and then you can reference those implementations using JSON-serializable strings and/or objects, such as `{ type: 'doSomething' }`.
@@ -157,12 +157,11 @@ const machineSetup = setup({
// Create a custom action with full type safety
// Can be defined in any file that imports the machineSetup
-// highlight-start
+// [!code highlight:4]
const logCount = machineSetup.createAction(({ context, event }) => {
// context and event are fully typed
console.log(`Count: ${context.count}, Event: ${event.type}`);
});
-// highlight-end
const machine = machineSetup.createMachine({
context: { count: 0, name: 'Counter' },
@@ -206,7 +205,7 @@ const machineSetup = setup({
},
});
-// highlight-start
+// [!code highlight:49]
// Type-bound assign - context is fully typed
const incrementCount = machineSetup.assign({
count: ({ context }) => context.count + 1,
@@ -256,7 +255,6 @@ const batchActions = machineSetup.enqueueActions(({ enqueue, check }) => {
enqueue(emitCountChanged);
}
});
-// highlight-end
const machine = machineSetup.createMachine({
context: { count: 0, items: [] },
@@ -284,7 +282,7 @@ _Since XState version 5.19.0_
When you create a state machine actor, the next state is determined by the machine's current state and the event that is sent to the actor. However, you can also determine the next **state** and **actions** from the current state and event by using the pure `transition(machine, state, event)` and `initialTransition(machine)` functions:
```ts
-// highlight-next-line
+// [!code highlight:1]
import { createMachine, initialTransition, transition } from 'xstate';
const machine = createMachine({
@@ -301,7 +299,7 @@ const machine = createMachine({
},
});
-// highlight-next-line
+// [!code highlight:1]
const [initialState, initialActions] = initialTransition(machine);
console.log(initialState.value);
@@ -310,7 +308,7 @@ console.log(initialState.value);
console.log(initialActions);
// logs []
-// highlight-next-line
+// [!code highlight:1]
const [nextState, actions] = transition(machine, initialState, {
type: 'start',
});
@@ -324,9 +322,11 @@ console.log(actions);
## Determining the next state
-:::warning
-It is recommended to use the `initialTransition(…)` and `transition(…)` functions instead of `getNextSnapshot(…)` and `getInitialSnapshot(…)`, which will be deprecated.
-:::
+
+ It is recommended to use the `initialTransition(…)` and `transition(…)`
+ functions instead of `getNextSnapshot(…)` and `getInitialSnapshot(…)`, which
+ will be deprecated.
+
When you create a state machine actor, the next state is determined by the machine's current state and the event that is sent to the actor. If you want to determine the next state outside of the actor, you can use the `getNextSnapshot(…)` function:
@@ -399,7 +399,7 @@ const lightMachineSetup = setup({
// ...
});
-// highlight-start
+// [!code highlight:25]
// Create individual state configurations
const green = lightMachineSetup.createStateConfig({
entry: { type: 'startTimer' },
@@ -425,7 +425,6 @@ const red = lightMachineSetup.createStateConfig({
EMERGENCY: { target: 'green' },
},
});
-// highlight-end
// Compose the machine using the modular state configs
const trafficLightMachine = lightMachineSetup.createMachine({
@@ -442,13 +441,13 @@ All state configurations created with `.createStateConfig(...)` have the full ty
## Machines and TypeScript
-:::typescript
+
**XState v5 requires TypeScript version 5.0 or greater.**
-For best results, use the latest TypeScript version. [Read more about XState and TypeScript](typescript.mdx)
+For best results, use the latest TypeScript version. [Read more about XState and TypeScript](typescript)
-:::
+
The best way to provide strong typing for your machine is to use the `setup(...)` function and/or the `.types` property.
diff --git a/content/docs/meta.json b/content/docs/meta.json
new file mode 100644
index 000000000..86c53aaaa
--- /dev/null
+++ b/content/docs/meta.json
@@ -0,0 +1,16 @@
+{
+ "title": "Documentation",
+ "pages": [
+ "index",
+ "get-started",
+ "core-concepts",
+ "stately-studio",
+ "actors",
+ "state-machines",
+ "agents",
+ "guides",
+ "packages",
+ "developer-tools",
+ "glossary"
+ ]
+}
diff --git a/docs/migration.mdx b/content/docs/migration.mdx
similarity index 81%
rename from docs/migration.mdx
rename to content/docs/migration.mdx
index 336b942de..7439e9bd1 100644
--- a/docs/migration.mdx
+++ b/content/docs/migration.mdx
@@ -4,19 +4,19 @@ title: 'Migrating from XState v4 to v5'
The guide below explains how to migrate from XState version 4 to version 5. Migrating from XState v4 to v5 should be a straightforward process. If you get stuck or have any questions, please reach out to the Stately team on [our Discord](https://discord.gg/xstate).
-:::new
+
-Read [David’s blog post on the launch of XState v5](/blog/2023-12-01-xstate-v5).
+Read [David’s blog post on the launch of XState v5](../../docs/assets/blog/2023-12-01-xstate-v5).
-:::
+
This guide is for developers who want to update their codebase from v4 to v5 and should also be valuable for any developers wanting to know the differences between v4 and v5.
-:::video
+
Prefer video? [Watch our XState v5 webinar on YouTube](https://www.youtube.com/live/TRVjeil-y74).
-:::
+
## XState v5 and TypeScript
@@ -37,7 +37,7 @@ Follow these guidelines to ensure that your TypeScript project is ready to use X
{
compilerOptions: {
// ...
- // highlight-next-line
+ // [!code highlight:1]
strictNullChecks: true,
// or set `strict` to true, which includes `strictNullChecks`
// "strict": true
@@ -51,18 +51,18 @@ Follow these guidelines to ensure that your TypeScript project is ready to use X
### Use `createMachine()`, not `Machine()`
-:::breakingchange
+
Breaking change
-:::
+
The `Machine(config)` function is now called `createMachine(config)`:
-
-
+
+
-```ts
+```ts twoslash
import { createMachine } from 'xstate';
const machine = createMachine({
@@ -70,9 +70,9 @@ const machine = createMachine({
});
```
-
+
-
+
```ts
// ❌ DEPRECATED
@@ -83,21 +83,21 @@ const machine = Machine({
});
```
-
+
### Use `createActor()`, not `interpret()`
-:::breakingchange
+
Breaking change
-:::
+
The `interpret()` function has been renamed to `createActor()`:
-
-
+
+
```ts
import { createMachine, createActor } from 'xstate';
@@ -110,8 +110,8 @@ const actor = createActor(machine, {
});
```
-
-
+
+
```ts
import { createMachine, interpret } from 'xstate';
@@ -124,21 +124,21 @@ const actor = interpret(machine, {
});
```
-
+
### Use `machine.provide()`, not `machine.withConfig()`
-:::breakingchange
+
Breaking change
-:::
+
The `machine.withConfig()` method has been renamed to `machine.provide()`:
-
-
+
+
```ts
// ✅
@@ -156,9 +156,9 @@ const specificMachine = machine.provide({
});
```
-
+
-
+
```ts
// ❌ DEPRECATED
@@ -176,21 +176,21 @@ const specificMachine = machine.withConfig({
});
```
-
+
### Set context with `input`, not `machine.withContext()`
-:::breakingchange
+
Breaking change
-:::
+
-The `machine.withContext(...)` method can no longer be used, as `context` can no longer be overridden directly. Use [input](input.mdx) instead:
+The `machine.withContext(...)` method can no longer be used, as `context` can no longer be overridden directly. Use [input](input) instead:
-
-
+
+
```ts
// ✅
@@ -207,9 +207,9 @@ const actor = createActor(machine, {
});
```
-
+
-
+
```ts
// ❌ DEPRECATED
@@ -224,21 +224,21 @@ const moneyMachine = machine.withContext({
});
```
-
+
### Actions ordered by default, `predictableActionArguments` no longer needed
-:::breakingchange
+
Breaking change
-:::
+
Actions are now in predictable order by default, so the `predictableActionArguments` flag is no longer required. Assign actions will always run in the order they are defined.
-
-
+
+
```ts
// ✅
@@ -259,9 +259,9 @@ const machine = createMachine({
});
```
-
+
-
+
```ts
// ❌ DEPRECATED
@@ -283,7 +283,7 @@ const machine = createMachine({
});
```
-
+
### The `spawn()` function has been removed
@@ -293,39 +293,38 @@ Instead of using the imported `spawn()` function to create actors inside `assign
- Use the `spawnChild(...)` action creator (preferred)
- Or use the `spawn(...)` method from the first argument passed to the assigner function inside of `assign(...)` actions (useful if you need the actor ref in `context`)
-Read the documentation on [spawning actors](./spawn.mdx) for more information.
+Read the documentation on [spawning actors](./spawn) for more information.
-
-
+
+
```ts
// ✅
-// highlight-next-line
+// [!code highlight:1]
import { spawnChild, assign } from 'xstate';
// Spawning a direct child:
const machine1 = createMachine({
// ...
- // highlight-start
+ // [!code highlight:3]
entry: spawnChild('someChildLogic', {
id: 'someChild',
}),
- // highlight-end
});
// Spawning a child with the actor ref in `context`:
const machine2 = createMachine({
// ...
entry: assign({
- // highlight-next-line
+ // [!code highlight:1]
child: ({ spawn }) => spawn('someChildLogic'),
}),
});
```
-
+
-
+
```ts
// ❌
@@ -334,27 +333,27 @@ import { assign, spawn } from 'xstate';
const machine = createMachine({
// ...
entry: assign({
- // highlight-next-line
+ // [!code highlight:1]
child: () => spawn('someChildLogic'),
}),
});
```
-
+
### Use `getNextSnapshot(…)` instead of `machine.transition(…)`
The `machine.transition(…)` method now requires an "actor scope" for the 3rd argument, which is internally created by `createActor(…)`. Instead, use `getNextSnapshot(…)` to get the next snapshot from some actor logic based on the current snapshot and event:
-
-
+
+
```ts
// ✅
import {
createMachine,
- // highlight-next-line
+ // [!code highlight:1]
getNextSnapshot,
} from 'xstate';
@@ -362,20 +361,19 @@ const machine = createMachine({
// ...
});
-// highlight-start
+// [!code highlight:5]
const nextState = getNextSnapshot(
machine,
machine.resolveState({ value: 'green' }),
{ type: 'timer' },
);
-// highlight-end
nextState.value; // yellow
```
-
+
-
+
```ts
// ❌
@@ -390,7 +388,7 @@ const nextState = machine.transition('green', { type: 'timer' });
nextState.value; // yellow
```
-
+
### Send events explictly instead of using `autoForward`
@@ -399,8 +397,8 @@ The `autoForward` property on invoke configs has been removed. Instead, send eve
In general, it's _not_ recommended to forward all events to an actor. Instead, only forward the specific events that the actor needs.
-
-
+
+
```ts
// ✅
@@ -410,19 +408,18 @@ const machine = createMachine({
src: 'someSource',
id: 'someId',
},
- // highlight-start
+ // [!code highlight:5]
always: {
// Forward events to the invoked actor
// This will not cause an infinite loop in XState v5
actions: sendTo('someId', ({ event }) => event),
},
- // highlight-end
});
```
-
+
-
+
```ts
// ❌
@@ -431,54 +428,54 @@ const machine = createMachine({
invoke: {
src: 'someSource',
id: 'someId'
- // highlight-next-line
+ // [!code highlight:1]
autoForward: true // deprecated
}
});
```
-
+
## States
### Use `state.getMeta()` instead of `state.meta`
-:::breakingchange
+
Breaking change
-:::
+
The `state.meta` property has been renamed to `state.getMeta()`:
-
-
+
+
```ts
// ✅
state.getMeta();
```
-
+
-
+
```ts
// ❌ DEPRECATED
state.meta;
```
-
+
### The `state.toStrings()` method has been removed
-:::breakingchange
+
Breaking change
-:::
+
```ts
import { type StateValue } from 'xstate';
@@ -504,40 +501,40 @@ const stateValueStrings = getStateValueStrings(stateValue);
### Use `state._nodes` instead of `state.configuration`
-:::breakingchange
+
Breaking change
-:::
+
The `state.configuration` property has been renamed to `state._nodes`:
-
-
+
+
```ts
// ✅
state._nodes;
```
-
+
-
+
```ts
// ❌ DEPRECATED
state.configuration;
```
-
+
### Read events from inspection API instead of `state.events`
-The `state.events` property has been removed, because events are not part of state, unless you explicitly add them to the state's `context`. Use the [inspection API](./inspection.mdx) to observe events instead, or add the event explicitly to the state's `context`:
+The `state.events` property has been removed, because events are not part of state, unless you explicitly add them to the state's `context`. Use the [inspection API](./inspection) to observe events instead, or add the event explicitly to the state's `context`:
-
-
+
+
```ts
// ✅
@@ -545,20 +542,19 @@ import { createActor } from 'xstate';
import { someMachine } from './someMachine';
const actor = createActor(someMachine, {
-// highlight-start
+// [!code highlight:5]
inspect: (inspEvent) => {
if (inspEvent.type === '@xstate.event') {
console.log(inspEvent.event);
}
}
-// highlight-end
});
````
-
+
-
+
```ts
// ✅
@@ -567,18 +563,17 @@ import { setup, createActor } from 'xstate';
const someMachine = setup({
// ...
actions: {
- // highlight-start
+ // [!code highlight:3]
recordEvent: assign({
event: ({ event }) => event
})
- // highlight-end
}
}).createMachine({
context: { event: undefined },
on: {
someEvent: {
// ...
- // highlight-next-line
+ // [!code highlight:1]
actions: ['recordEvent']
}
}
@@ -586,14 +581,14 @@ const someMachine = setup({
const someActor = createActor(someMachine);
someActor.subscribe(snapshot => {
- // highlight-next-line
+ // [!code highlight:1]
console.log(snapshot.context.event);
});
````
-
+
-
+
```ts
// ❌ DEPRECATED
@@ -602,28 +597,28 @@ import { someMachine } from './someMachine';
const actor = interpret(someMachine);
actor.subscribe((state) => {
- // highlight-next-line
+ // [!code highlight:1]
console.log(state.event); // Removed
});
```
-
+
## Events and transitions
### Implementation functions receive a single argument
-:::breakingchange
+
Breaking change
-:::
+
Implementation functions now take in a single argument: an object with `context`, `event`, and other properties.
-
-
+
+
```ts
// ✅
@@ -634,9 +629,9 @@ const machine = createMachine({
});
```
-
+
-
+
```ts
// ❌ DEPRECATED
@@ -647,23 +642,23 @@ const machine = createMachine({
});
```
-
+
### `send()` is removed; use `raise()` or `sendTo()`
-:::breakingchange
+
Breaking change
-:::
+
The `send(...)` action creator is removed. Use `raise(...)` for sending events to self or `sendTo(...)` for sending events to other actors instead.
Read the documentation on the [`sendTo` action](actions.mdx#send-to-action) and [`raise` action](actions.mdx#raise-action) for more information.
-
-
+
+
```ts
// ✅
@@ -679,9 +674,9 @@ const machine = createMachine({
});
```
-
+
-
+
```ts
// ❌ DEPRECATED
@@ -697,7 +692,7 @@ const machine = createMachine({
});
```
-
+
**Pre-migration tip:** Update v4 projects to use `sendTo` or `raise` instead of `send`.
@@ -708,8 +703,8 @@ The `pure()` and `choose()` methods have been removed. Use `enqueueActions()` in
For `pure()` actions:
-
-
+
+
```ts
// ✅
@@ -721,9 +716,9 @@ entry: [
];
```
-
+
-
+
```ts
// ❌ DEPRECATED
@@ -734,13 +729,13 @@ entry: [
];
```
-
+
For `choose()` actions:
-
-
+
+
```ts
// ✅
@@ -754,9 +749,9 @@ entry: [
];
```
-
+
-
+
```ts
// ❌ DEPRECATED
@@ -770,83 +765,83 @@ entry: [
];
```
-
+
### `actor.send()` no longer accepts string types
-:::breakingchange
+
Breaking change
-:::
+
String event types can no longer be sent to, e.g., `actor.send(event)`; you must send an event object instead:
-
-
+
+
```ts
// ✅
actor.send({ type: 'someEvent' });
```
-
+
-
+
```ts
// ❌ DEPRECATED
actor.send('someEvent');
```
-
+
**Pre-migration tip:** Update v4 projects to pass an object to `.send()`.
### `state.can()` no longer accepts string types
-:::breakingchange
+
Breaking change
-:::
+
String event types can no longer be sent to, e.g., `state.can(event)`; you must send an event object instead:
-
-
+
+
```ts
// ✅
state.can({ type: 'someEvent' });
```
-
+
-
+
```ts
// ❌ DEPRECATED
state.can('someEvent');
```
-
+
### Guarded transitions use `guard`, not `cond`
-:::breakingchange
+
Breaking change
-:::
+
The `cond` transition property for guarded transitions is now called `guard`:
-
-
+
+
```ts
// ✅
@@ -860,9 +855,9 @@ const machine = createMachine({
});
```
-
+
-
+
```ts
// ❌ DEPRECATED
@@ -877,21 +872,21 @@ const machine = createMachine({
});
```
-
+
### Use `params` to pass params to actions & guards
-:::breakingchange
+
Breaking change
-:::
+
Properties other than `type` on action objects and guard objects should be nested under a `params` property; `{ type: 'someType', message: 'hello' }` becomes `{ type: 'someType', params: { message: 'hello' }}`. These `params` are then passed to the 2nd argument of the action or guard implementation:
-
-
+
+
```ts
// ✅
@@ -921,9 +916,9 @@ const machine = createMachine({
});
```
-
+
-
+
```ts
// ❌ DEPRECATED
@@ -954,23 +949,23 @@ const machine = createMachine(
);
```
-
+
**Pre-migration tip:** Update action and guard objects on v4 projects to move properties (other than `type`) to a `params` object.
### Use wildcard `*` transitions, not strict mode
-:::breakingchange
+
Breaking change
-:::
+
Strict mode is removed. If you want to throw on unhandled events, you should use a wildcard transition:
-
-
+
+
```ts
// ✅
@@ -979,25 +974,23 @@ const machine = createMachine({
knownEvent: {
// ...
},
- // highlight-start
+ // [!code highlight:6]
'*': {
// unknown event
actions: ({ event }) => {
throw new Error(`Unknown event: ${event.type}`);
},
},
- // highlight-end
},
});
const actor = createActor(machine);
actor.subscribe({
- // highlight-start
+ // [!code highlight:3]
error: (err) => {
console.error(err);
},
- // highlight-end
});
actor.start();
@@ -1005,9 +998,9 @@ actor.start();
actor.send({ type: 'unknownEvent' });
```
-
+
-
+
```ts
// ❌ DEPRECATED
@@ -1025,21 +1018,21 @@ const service = interpret(machine);
service.send({ type: 'unknownEvent' });
```
-
+
### Use explicit eventless (`always`) transitions
-:::breakingchange
+
Breaking change
-:::
+
Eventless (“always”) transitions must now be defined through the `always: { ... }` property of a state node; they can no longer be defined via an empty string:
-
-
+
+
```ts
// ✅
@@ -1055,9 +1048,9 @@ const machine = createMachine({
});
```
-
+
-
+
```ts
// ❌ DEPRECATED
@@ -1075,25 +1068,25 @@ const machine = createMachine({
});
```
-
+
**Pre-migration tip:** Update v4 projects to use `always` for _eventless_ transitions.
### Use `reenter: true`, not `internal: false`
-:::breakingchange
+
Breaking change
-:::
+
`internal: false` is now `reenter: true`
External transitions previously specified with `internal: false` are now specified with `reenter: true`:
-
-
+
+
```ts
// ✅
@@ -1108,9 +1101,9 @@ const machine = createMachine({
});
```
-
+
-
+
```ts
// ❌ DEPRECATED
@@ -1125,21 +1118,21 @@ const machine = createMachine({
});
```
-
+
### Transitions are internal by default, not external
-:::breakingchange
+
Breaking change
-:::
+
All transitions are **internal by default**. This change is relevant for transitions defined on state nodes with `entry` or `exit` actions, invoked actors, or delayed transitions (`after`). If you relied on the previous XState v4 behavior where transitions implicitly re-entered a state node, use `reenter: true`:
-
-
+
+
```ts
// ✅
@@ -1149,7 +1142,7 @@ const machine = createMachine({
compoundState: {
entry: 'someAction',
on: {
- // highlight-start
+ // [!code highlight:10]
someEvent: {
target: 'compoundState.childState',
// Reenters the `compoundState` state,
@@ -1160,7 +1153,6 @@ const machine = createMachine({
target: 'childState',
reenter: true,
},
- // highlight-end
},
initial: 'childState',
states: {
@@ -1171,9 +1163,9 @@ const machine = createMachine({
});
```
-
+
-
+
```ts
// ❌ DEPRECATED
@@ -1183,7 +1175,7 @@ const machine = createMachine({
compoundState: {
entry: 'someAction',
on: {
- // highlight-start
+ // [!code highlight:7]
someEvent: {
// implicitly external
target: 'compoundState.childState', // non-relative target
@@ -1191,7 +1183,6 @@ const machine = createMachine({
selfEvent: {
target: 'compoundState',
},
- // highlight-end
},
initial: 'childState',
states: {
@@ -1202,11 +1193,11 @@ const machine = createMachine({
});
```
-
+
-
-
+
+
```ts
// ✅
@@ -1229,9 +1220,9 @@ const machine = createMachine({
});
```
-
+
-
+
```ts
// ❌ DEPRECATED
@@ -1254,21 +1245,21 @@ const machine = createMachine({
});
```
-
+
### Child state nodes are always re-entered
-:::breakingchange
+
Breaking change
-:::
+
Child state nodes are always re-entered when they are targeted by transitions (both external and internal) defined on compound state nodes. This change is relevant only if a child state node has `entry` or `exit` actions, invoked actors, or delayed transitions (`after`). Add a `stateIn` guard to prevent undesirable re-entry of the child state:
-
-
+
+
```ts
// ✅
@@ -1294,9 +1285,9 @@ const machine = createMachine({
});
```
-
+
-
+
```ts
// ❌ DEPRECATED
@@ -1322,22 +1313,22 @@ const machine = createMachine({
});
```
-
+
### Use `stateIn()` to validate state transitions, not `in`
-:::breakingchange
+
Breaking change
-:::
+
The `in: 'someState'` transition property is removed. Use `guard: stateIn(...)` instead:
-
-
+
+
```ts
// ✅
@@ -1351,9 +1342,9 @@ const machine = createMachine({
});
```
-
+
-
+
```ts
// ❌ DEPRECATED
@@ -1367,21 +1358,21 @@ const machine = createMachine({
});
```
-
+
### Use `actor.subscribe()` instead of `state.history`
-:::breakingchange
+
Breaking change
-:::
+
The `state.history` property is removed. If you want the previous snapshot, you should maintain that via `actor.subscribe(...)` instead.
-
-
+
+
```ts
// ✅
@@ -1393,9 +1384,9 @@ actor.subscribe((snapshot) => {
});
```
-
+
-
+
```ts
// ❌ DEPRECATED
@@ -1404,39 +1395,38 @@ actor.subscribe((state) => {
});
```
-
+
**Pre-migration tip:** Update v4 projects to track history using `actor.subscribe()`.
### Actions can throw errors without `escalate`
-:::breakingchange
+
Breaking change
-:::
+
The `escalate` action creator is removed. In XState v5 actions can throw errors, and they will propagate as expected. Errors can be handled using an `onError` transition.
-
-
+
+
```ts
// ✅
const childMachine = createMachine({
// This will be sent to the parent machine that invokes this child
- // highlight-start
+ // [!code highlight:3]
entry: () => {
throw new Error('This is some error');
},
- // highlight-end
});
const parentMachine = createMachine({
invoke: {
src: childMachine,
- // highlight-start
+ // [!code highlight:11]
onError: {
actions: ({ context, event }) => {
console.log(event.error);
@@ -1448,38 +1438,36 @@ const parentMachine = createMachine({
// }
},
},
- // highlight-end
},
});
```
-
+
-
+
```ts
// ❌ DEPRECATED
const childMachine = createMachine({
- // highlight-start
+ // [!code highlight:1]
entry: escalate('This is some error'),
- // highlight-end
});
/* ... */
```
-
+
## Actors
### Use actor logic creators for `invoke.src` instead of functions
-:::breakingchange
+
Breaking change
-:::
+
The available actor logic creators are:
@@ -1490,10 +1478,10 @@ The available actor logic creators are:
- `fromTransition`
- `fromCallback`
-See [Actors](actors.mdx) for more information.
+See [Actors](actors) for more information.
-
-
+
+
```ts
// ✅
@@ -1517,9 +1505,9 @@ const machine = setup({
});
```
-
+
-
+
```ts
// ❌ DEPRECATED
@@ -1537,11 +1525,11 @@ const machine = createMachine({
});
```
-
+
-
-
+
+
```ts
// ✅
@@ -1559,9 +1547,9 @@ const machine = createMachine({
});
```
-
+
-
+
```ts
// ❌ DEPRECATED
@@ -1577,11 +1565,11 @@ const machine = createMachine({
});
```
-
+
-
-
+
+
```ts
// ✅
@@ -1597,9 +1585,9 @@ const machine = createMachine({
});
```
-
+
-
+
```ts
// ❌ DEPRECATED
@@ -1613,21 +1601,21 @@ const machine = createMachine({
});
```
-
+
### Use `invoke.input` instead of `invoke.data`
-:::breakingchange
+
Breaking change
-:::
+
The `invoke.data` property is removed. If you want to provide context to invoked actors, use `invoke.input`:
-
-
+
+
```ts
// ✅
@@ -1648,9 +1636,9 @@ const machine = createMachine({
});
```
-
+
-
+
```ts
// ❌ DEPRECATED
@@ -1669,21 +1657,21 @@ const machine = createMachine({
});
```
-
+
### Use `output` in final states instead of `data`
-:::breakingchange
+
Breaking change
-:::
+
To produce output data from a machine which reached its final state, use the top-level `output` property instead of `data`:
-
-
+
+
```ts
// ✅
@@ -1700,9 +1688,9 @@ const machine = createMachine({
});
```
-
+
-
+
```ts
// ❌ DEPRECATED
@@ -1719,13 +1707,13 @@ const machine = createMachine({
});
```
-
+
To provide a dynamically generated output, replace `invoke.data` with `invoke.output` and add a top-level `output` property:
-
-
+
+
```ts
// ✅
@@ -1743,9 +1731,9 @@ const machine = createMachine({
});
```
-
+
-
+
```ts
// ❌ DEPRECATED
@@ -1762,21 +1750,21 @@ const machine = createMachine({
});
```
-
+
### Don't use property mappers in `input` or `output`
-:::breakingchange
+
Breaking change
-:::
+
If you want to provide dynamic context to invoked actors, or produce dynamic output from final states, use a function instead of an object with property mappers.
-
-
+
+
```ts
// ✅
@@ -1810,9 +1798,9 @@ const machine = createMachine({
});
```
-
+
-
+
```ts
// ❌ DEPRECATED
@@ -1840,21 +1828,21 @@ const machine = createMachine({
});
```
-
+
### Use `actors` property on `options` object instead of `services`
-:::breakingchange
+
Breaking change
-:::
+
`services` have been renamed to `actors`:
-
-
+
+
```ts
// ✅
@@ -1872,9 +1860,9 @@ const specificMachine = machine.provide({
});
```
-
+
-
+
```ts
// ❌ DEPRECATED
@@ -1892,21 +1880,21 @@ const specificMachine = machine.withConfig({
});
```
-
+
### Use `subscribe()` for changes, not `onTransition()`
-:::breakingchange
+
Breaking change
-:::
+
The `actor.onTransition(...)` method is removed. Use `actor.subscribe(...)` instead.
-
-
+
+
```ts
// ✅
@@ -1916,9 +1904,9 @@ actor.subscribe((state) => {
});
```
-
+
-
+
```ts
// ❌ DEPRECATED
@@ -1928,23 +1916,23 @@ actor.onTransition((state) => {
});
```
-
+
### `createActor()` (formerly `interpret()`) accepts a second argument to restore state
-:::breakingchange
+
Breaking change
-:::
+
`interpret(machine).start(state)` is now `createActor(machine, { snapshot }).start()`
To restore an actor at a specific state, you should now pass the state as the `snapshot` property of the `options` argument of `createActor(logic, options)`. The `actor.start()` property no longer takes in a `state` argument.
-
-
+
+
```ts
// ✅
@@ -1952,9 +1940,9 @@ const actor = createActor(machine, { snapshot: someState });
actor.start();
```
-
+
-
+
```ts
// ❌ DEPRECATED
@@ -1962,21 +1950,21 @@ const actor = interpret(machine);
actor.start(someState);
```
-
+
### Use `actor.getSnapshot()` to get actor’s state
-:::breakingchange
+
Breaking change
-:::
+
Subscribing to an actor (`actor.subscribe(...)`) after the actor has started will no longer emit the current snapshot immediately. Instead, read the current snapshot from `actor.getSnapshot()`:
-
-
+
+
```ts
// ✅
@@ -1991,9 +1979,9 @@ actor.subscribe((state) => {
});
```
-
+
-
+
```ts
// ❌ DEPRECATED
@@ -2005,21 +1993,21 @@ actor.subscribe((state) => {
});
```
-
+
### Loop over events instead of using `actor.batch()`
-:::breakingchange
+
Breaking change
-:::
+
The `actor.batch([...])` method for batching events is removed.
-
-
+
+
```ts
// ✅
@@ -2028,33 +2016,33 @@ for (const event of events) {
}
```
-
+
-
+
```ts
// ❌ DEPRECATED
actor.batch(events);
```
-
+
**Pre-migration tip:** Update v4 projects to loop over events to send them as a batch.
### Use `snapshot.status === 'done'` instead of `snapshot.done`
-:::breakingchange
+
Breaking change
-:::
+
The `snapshot.done` property, which was previously in the snapshot object of state machine actors, is removed. Use `snapshot.status === 'done'` instead, which is available to all actors:
-
+
```ts
// ✅
@@ -2068,9 +2056,9 @@ actor.subscribe((snapshot) => {
});
```
-
+
-
+
```ts
// ❌ DEPRECATED
@@ -2084,16 +2072,16 @@ actor.subscribe((state) => {
});
```
-
+
### `state.nextEvents` has been removed
-:::breakingchange
+
Breaking change
-:::
+
The `state.nextEvents` property is removed, since it is not a completely safe/reliable way of determining the next events that can be sent to the actor. If you want to get the next events according to the previous behavior, you can use this helper function:
@@ -2112,16 +2100,16 @@ const nextEvents = getNextEvents(state);
### Use `types` instead of `schema`
-:::breakingchange
+
Breaking change
-:::
+
The `machineConfig.schema` property is renamed to `machineConfig.types`:
-
-
+
+
```ts
// ✅
@@ -2137,9 +2125,9 @@ const machine = createMachine({
});
```
-
+
-
+
```ts
// ❌ DEPRECATED
@@ -2155,27 +2143,27 @@ const machine = createMachine({
});
```
-
+
### Use `types.typegen` instead of `tsTypes`
-:::breakingchange
+
Breaking change
-:::
+
-:::warningxstate
+
XState Typegen does not fully support XState v5 yet. However, strongly-typed machines can still be achieved without Typegen.
-:::
+
The `machineConfig.tsTypes` property has been renamed and is now at `machineConfig.types.typegen`.
-
-
+
+
```ts
// ✅
@@ -2192,9 +2180,9 @@ const machine = createMachine({
});
```
-
+
-
+
```ts
// ❌ DEPRECATED
@@ -2211,23 +2199,23 @@ const machine = createMachine({
});
```
-
+
## `@xstate/react`
### `useInterpret()` is now `useActorRef()`
-:::breakingchange
+
Breaking change
-:::
+
The `useInterpret()` hook, which is used to return an `actorRef` ("service" in XState v4), is renamed to `useActorRef()`.
-
-
+
+
```ts
// ✅
@@ -2236,9 +2224,9 @@ import { useActorRef } from '@xstate/react';
const actorRef = useActorRef(machine); // or any other logic
```
-
+
-
+
```ts
// ❌ DEPRECATED
@@ -2247,23 +2235,23 @@ import { useInterpret } from '@xstate/react';
const service = useInterpret(machine);
```
-
+
### `useActor(logic)` now accepts actor logic, not an actor
-:::breakingchange
+
Breaking change
-:::
+
The `useActor(logic)` hook now accepts _actor logic_ (such as `fromPromise(...)`, `createMachine(...)`, etc.) instead of an existing `ActorRef`.
To use an existing `ActorRef`, use `actor.send(...)` to send events and `useSelector(actor, ...)` to get the snapshot:
-
-
+
+
```tsx
// ✅
@@ -2276,9 +2264,9 @@ function Component({ someActorRef }) {
}
```
-
+
-
+
```tsx
// ❌ DEPRECATED
@@ -2291,16 +2279,16 @@ function Component({ someActorRef }) {
}
```
-
+
## Use `machine.provide()` to provide implementations in hooks
-:::breakingchange
+
Breaking change
-:::
+
For dynamically creating machines with provided implementations, the `useMachine(...)`, `useActor(...)`, and `useActorRef(...)` hooks no longer accept:
@@ -2311,8 +2299,8 @@ Instead, `machine.provide(...)` should be passed directly to the 1st argument.
The `@xstate/react` package considers machines with the same configuration to be the same machine, so it will minimize rerenders but still keep the provided implementations up-to-date.
-
-
+
+
```tsx
// ✅
@@ -2334,9 +2322,9 @@ function Component(props) {
}
```
-
+
-
+
```tsx
// ❌ DEPRECATED
@@ -2356,9 +2344,9 @@ function Component(props) {
}
```
-
+
-
+
```tsx
// ❌ DEPRECATED
@@ -2380,26 +2368,26 @@ function Component(props) {
}
```
-
+
## `@xstate/vue`
### `useMachine()` now returns `snapshot` instead of `state`, and `actor` instead of `service`
-:::breakingchange
+
Breaking change
-:::
+
To keep consistent naming with the rest of XState and related libraries:
- `state` is now `snapshot`
- `service` is now `actor`
-
-
+
+
```tsx
// ✅
@@ -2408,17 +2396,17 @@ import { useMachine } from '@xstate/vue';
// ...
const {
- // highlight-next-line
+ // [!code highlight:1]
snapshot, // Renamed from `state`
send,
- // highlight-next-line
+ // [!code highlight:1]
actor, // Renamed from `service`
} = useMachine(someMachine);
```
-
+
-
+
```tsx
// ❌ DEPRECATED
@@ -2427,41 +2415,41 @@ import { useMachine } from '@xstate/vue';
// ...
const {
- // highlight-next-line
+ // [!code highlight:1]
state, // Renamed to `snapshot` in @xstate/vue 3.0.0
send,
- // highlight-next-line
+ // [!code highlight:1]
service, // Renamed to `actor` in @xstate/vue 3.0.0
} = useMachine(someMachine);
```
-
+
## New features
-- [Create actor systems](system.mdx)
+- [Create actor systems](system)
- [New actor logic creators](/docs/actors#actor-logic-creators)
-- [Deep persistence for invoked and spawned actors](persistence.mdx)
-- [Provide input data to state machines and actors](input.mdx)
-- [Specify output “done data” for actors](output.mdx)
+- [Deep persistence for invoked and spawned actors](persistence)
+- [Provide input data to state machines and actors](input)
+- [Specify output “done data” for actors](output)
- [Partial event descriptors (partial wildcards)](/docs/transitions#partial-wildcard-transitions)
- [Enqueue actions](/docs/actions#enqueue-actions)
- [Higher-level guards](/docs/guards#higher-level-guards)
- [Setup API for specifying types and strongly-typed state values](/docs/machines#providing-implementations)
-- [Inspect API](inspection.mdx)
+- [Inspect API](inspection)
## Frequently asked questions
### When will Stately Studio be compatible with XState v5?
-We are currently working on [Stately Studio](studio.mdx) compatibility with XState v5. Exporting to XState v5 (JavaScript or TypeScript) is already available. We are working on support for new XState v5 features, such as higher-order guards, partial event wildcards, and machine input/output.
+We are currently working on [Stately Studio](studio) compatibility with XState v5. Exporting to XState v5 (JavaScript or TypeScript) is already available. We are working on support for new XState v5 features, such as higher-order guards, partial event wildcards, and machine input/output.
Upvote or comment on [Stately Studio + XState v5 compatibility in our roadmap](https://feedback.stately.ai/editor/p/stately-studio-xstate-v5-compatibility) to stay updated on our progress.
### When will the XState VS Code extension be compatible with XState v5?
-The [XState VS Code extension](xstate-vscode-extension.mdx) is not yet compatible with XState v5. The extension is a priority for us, and work is already underway.
+The [XState VS Code extension](xstate-vscode-extension) is not yet compatible with XState v5. The extension is a priority for us, and work is already underway.
Upvote or comment on [XState v5 compatibility for VS Code extension in our roadmap](https://feedback.stately.ai/devtools/p/xstate-v5-compatibility-for-vs-code-extension) to stay updated on our progress.
diff --git a/docs/observable-actors.mdx b/content/docs/observable-actors.mdx
similarity index 96%
rename from docs/observable-actors.mdx
rename to content/docs/observable-actors.mdx
index 15f6396de..89aae03b9 100644
--- a/docs/observable-actors.mdx
+++ b/content/docs/observable-actors.mdx
@@ -4,11 +4,11 @@ title: Observable Actors
Observable actors are actors that represent an observable stream of values. This makes it easy to interop with observable libraries like RxJS.
-:::tip
+
All XState actors are observable.
-:::
+
## Observable actor capabilities
@@ -28,7 +28,7 @@ You can define observable actor logic using the `fromObservable(...)` actor logi
import { fromObservable, createActor } from 'xstate';
import { interval } from 'rxjs';
-// highlight-next-line
+// [!code highlight:1]
const intervalLogic = fromObservable(() => interval(1000));
const intervalActor = createActor(intervalLogic);
@@ -49,11 +49,11 @@ You can pass in `input` to an observable actor by passing it to the `createActor
import { fromObservable, createActor } from 'xstate';
import { interval } from 'rxjs';
-// highlight-next-line
+// [!code highlight:1]
const intervalLogic = fromObservable(({ input }) => interval(input.interval));
const intervalActor = createActor(intervalLogic, {
- // highlight-next-line
+ // [!code highlight:1]
input: { interval: 10_000 },
});
intervalActor.subscribe((snapshot) => {
diff --git a/docs/output.mdx b/content/docs/output.mdx
similarity index 72%
rename from docs/output.mdx
rename to content/docs/output.mdx
index f68834764..606dca3fb 100644
--- a/docs/output.mdx
+++ b/content/docs/output.mdx
@@ -2,13 +2,13 @@
title: 'Output'
---
-Output refers to the final data that an [actor](actors.mdx) produces. When an actor is responsible for performing some task, such as making a network request or running complex calculations, it will return output once it finishes that task. The output represents the result of the actor’s work. Actors only produce output when their status is “done”; i.e. when they are in their [final state](final-states.mdx).
+Output refers to the final data that an [actor](actors) produces. When an actor is responsible for performing some task, such as making a network request or running complex calculations, it will return output once it finishes that task. The output represents the result of the actor’s work. Actors only produce output when their status is “done”; i.e. when they are in their [final state](final-states).
Some actors may run indefinitely and not produce any output.
## Output in machine actors
-Read [final states](final-states.mdx) for more information on how to specify output in machine actors.
+Read [final states](final-states) for more information on how to specify output in machine actors.
## Output in promise actors
@@ -36,13 +36,13 @@ actor.start();
## Output and TypeScript
-:::typescript
+
**XState v5 requires TypeScript version 5.0 or greater.**
-For best results, use the latest TypeScript version. [Read more about XState and TypeScript](typescript.mdx)
+For best results, use the latest TypeScript version. [Read more about XState and TypeScript](typescript)
-:::
+
The `output` property can be typed in the `.types` property of the machine setup:
@@ -50,11 +50,10 @@ The `output` property can be typed in the `.types` property of the machine setup
import { setup, createActor } from 'xstate';
const machine = setup({
- // highlight-start
+ // [!code highlight:3]
types: {
output: {} as { total: number },
},
- // highlight-end
}).createMachine({
// ...
output: ({ context }) => ({
diff --git a/content/docs/packages/meta.json b/content/docs/packages/meta.json
new file mode 100644
index 000000000..1b0afabb3
--- /dev/null
+++ b/content/docs/packages/meta.json
@@ -0,0 +1,11 @@
+{
+ "title": "Packages",
+ "pages": [
+ "xstate-store",
+ "xstate-react",
+ "xstate-vue",
+ "xstate-svelte",
+ "xstate-graph",
+ "xstate-test"
+ ]
+}
diff --git a/docs/parallel-states.mdx b/content/docs/parallel-states.mdx
similarity index 96%
rename from docs/parallel-states.mdx
rename to content/docs/parallel-states.mdx
index b18887eda..cce01d031 100644
--- a/docs/parallel-states.mdx
+++ b/content/docs/parallel-states.mdx
@@ -2,7 +2,7 @@
title: Parallel states
---
-In statecharts, a parallel state is a state that has multiple child states (also known as **regions**) that are all active at the same time. This is different from a [parent state](parent-states.mdx), where only _one_ child state is active at a time.
+In statecharts, a parallel state is a state that has multiple child states (also known as **regions**) that are all active at the same time. This is different from a [parent state](parent-states), where only _one_ child state is active at a time.
Parallel states have the following characteristics:
@@ -10,11 +10,11 @@ Parallel states have the following characteristics:
- Exiting a parallel state will also simultaneously exit all of its regions.
- An event received in a parallel state is simultaneously received & handled by all of its regions.
-:::studio
+
You can easily visualize and simulate parallel states in Stately's editor. [Read more about parallel states in Stately's editor](/docs/editor-states-and-transitions/#parallel-states).
-:::
+
Here is a music player example with a parallel state consisting of two regions, one for handling playing the track and one for handling the volume:
@@ -23,7 +23,7 @@ import { createMachine, assign } from 'xstate';
const playerMachine = createMachine({
id: 'player',
- // highlight-next-line
+ // [!code highlight:1]
type: 'parallel',
states: {
track: {
@@ -99,7 +99,7 @@ export const machine = createMachine({
},
},
beansGround: {
- // highlight-next-line
+ // [!code highlight:1]
type: 'final',
},
},
@@ -115,18 +115,17 @@ export const machine = createMachine({
},
},
waterBoiled: {
- // highlight-next-line
+ // [!code highlight:1]
type: 'final',
},
},
},
},
type: 'parallel',
- // highlight-start
+ // [!code highlight:3]
onDone: {
target: 'makingCoffee',
},
- // highlight-end
},
makingCoffee: {},
},
diff --git a/docs/parent-states.mdx b/content/docs/parent-states.mdx
similarity index 95%
rename from docs/parent-states.mdx
rename to content/docs/parent-states.mdx
index abddbe9b8..3b3c62e52 100644
--- a/docs/parent-states.mdx
+++ b/content/docs/parent-states.mdx
@@ -6,17 +6,17 @@ States can contain more states, also known as **child states**. These child stat
Child states are nested inside their parent states. Parent states are also known as **compound states**.
-:::studio
+
You can easily visualize and simulate parent and child states in Stately's editor. [Read more about parent states in Stately's editor](/docs/editor-states-and-transitions/#parent-and-child-states).
-:::
+
-:::tip
+
Watch our ["Parent and child states" video on YouTube](https://www.youtube.com/watch?v=aUhEdeIf_mQ&list=PLvWgkXBB3dd4I_l-djWVU2UGPyBgKfnTQ&index=5) (1m6s).
-:::
+
+{/*
-
+ */}
+
+
You can access your projects from **My Projects** at the left of Stately Studio’s top bar when you’re signed into Stately Studio. **My Projects** lists your personal projects and is one of the locations where you can create new projects.
When you select a project, the first machine in the project will open in Stately Studio’s editor. The other machines in your project are accessible from the machines list in the left drawer menu.
-
+{/*
-
+ */}
+
+
### Create a new project
-You can create a new project when you first save a machine or from the **Create project** button in [**My Projects**](/#my-projects). You must be signed in to Stately Studio to access **My Projects** and shared team projects, or to create new projects.
+You can create a new project when you first save a machine or from the **Create project** button in [**My Projects**](#my-projects). You must be signed in to Stately Studio to access **My Projects** and shared team projects, or to create new projects.
#### Create a new project from **My Projects**
@@ -44,23 +50,23 @@ The **Save** button will save your machine or prompt you to sign into Stately St
A project can be **public**, **unlisted**, or **private**. If the project is a shared team project, only team members with the **Owner** or **Admin** roles can change its visibility.
-:::studio
+
The project’s visibility is display in the lower left corner of the canvas.
-:::
+
-- Public projects are visible to everyone. They are discoverable on the [Discover](discover.mdx) page and listed on your profile page.
+- Public projects are visible to everyone. They are discoverable on the [Discover](discover) page and listed on your profile page.
- Unlisted projects are visible to everyone with the project’s URL but are not findable on the Discover page or listed on your profile page.
- Private projects are only visible to you and the team that owns the project.
Use the **Share** button in Stately Studio’s top bar and toggle the project’s visibility between **public**, **unlisted**, or **private** from the dropdown menu in the Share dialog.
-:::studio
+
-Unlisted and Private projects are a premium feature of Stately Studio. [Check out the features on our Pro plan](studio-pro-plan.mdx), [Team plan](studio-team-plan.mdx), [Enterprise plan](studio-enterprise-plan.mdx) or [upgrade your existing plan](https://stately.ai/registry/billing).
+Unlisted and Private projects are a premium feature of Stately Studio. [Check out the features on our Pro plan](studio-pro-plan), [Team plan](studio-team-plan), [Enterprise plan](studio-enterprise-plan) or [upgrade your existing plan](https://stately.ai/registry/billing).
-:::
+
### Favorite a project
diff --git a/docs/promise-actors.mdx b/content/docs/promise-actors.mdx
similarity index 96%
rename from docs/promise-actors.mdx
rename to content/docs/promise-actors.mdx
index 05053133a..25914f00d 100644
--- a/docs/promise-actors.mdx
+++ b/content/docs/promise-actors.mdx
@@ -26,13 +26,12 @@ async function getUser(id: string) {
return { id /* other user data */ };
}
-// highlight-start
+// [!code highlight:5]
const promiseLogic = fromPromise(async () => {
const user = await getUser('123');
return user;
});
-// highlight-end
const promiseActor = createActor(promiseLogic);
@@ -61,7 +60,7 @@ const promiseLogic = fromPromise(async ({ input }) => {
});
const promiseActor = createActor(promiseLogic, {
- // highlight-next-line
+ // [!code highlight:1]
input: { id: '123' },
});
```
@@ -125,7 +124,7 @@ import { somePromiseLogic } from './somePromiseLogic';
const promiseActor = createActor(somePromiseLogic);
promiseActor.start();
-// highlight-next-line
+// [!code highlight:1]
const output = await toPromise(promiseActor);
console.log(output);
@@ -146,12 +145,11 @@ const promiseLogic = fromPromise(async () => {
const promiseActor = createActor(promiseLogic);
promiseActor.subscribe({
- // highlight-start
+ // [!code highlight:4]
error: (error) => {
console.error(error);
// logs 'Error: Something went wrong'
},
- // highlight-end
});
promiseActor.start();
@@ -169,13 +167,12 @@ import { fromPromise, createActor } from 'xstate';
const promiseLogic = fromPromise(
async ({
input,
- // highlight-next-line
+ // [!code highlight:1]
signal,
}) => {
- // highlight-start
+ // [!code highlight:2]
// Pass the signal to abort fetching if signaled
const data = await fetch('/some/url', { signal });
- // highlight-end
return data;
},
@@ -186,8 +183,7 @@ promiseActor.start();
// ...
-// highlight-start
+// [!code highlight:2]
// Abort the promise actor
promiseActor.stop();
-// highlight-end
```
diff --git a/docs/pure-transitions.mdx b/content/docs/pure-transitions.mdx
similarity index 97%
rename from docs/pure-transitions.mdx
rename to content/docs/pure-transitions.mdx
index 4a8f6e4ea..0e1e7140b 100644
--- a/docs/pure-transitions.mdx
+++ b/content/docs/pure-transitions.mdx
@@ -26,15 +26,14 @@ const machine = createMachine({
},
});
-// highlight-start
+// [!code highlight:5]
// Get initial state and actions
const [initialState, initialActions] = initialTransition(machine);
console.log(initialState.value); // 'pending'
console.log(initialActions); // [{ type: 'doSomething', ... }]
-// highlight-end
-// highlight-start
+// [!code highlight:7]
// Get next state and actions
const [nextState, actions] = transition(machine, initialState, {
type: 'start', // The event to send
@@ -42,7 +41,6 @@ const [nextState, actions] = transition(machine, initialState, {
console.log(nextState.value); // 'started'
console.log(actions); // [{ type: 'doSomething', ... }]
-// highlight-end
```
This pure functional approach offers several benefits:
@@ -76,7 +74,7 @@ const machine = createMachine({
},
});
-// highlight-start
+// [!code highlight:8]
// Get initial state and actions
const [initialState, initialActions] = initialTransition(machine, {
initialCount: 0,
@@ -85,7 +83,6 @@ const [initialState, initialActions] = initialTransition(machine, {
console.log(initialState.value); // 'pending'
console.log(initialState.context); // { count: 0 }
console.log(initialActions); // [{ type: 'doSomething', ... }]
-// highlight-end
```
### `transition(machine, state, event)`
@@ -112,7 +109,7 @@ const machine = createMachine({
// Get initial state and actions
const [initialState, initialActions] = initialTransition(machine);
-// highlight-start
+// [!code highlight:7]
// Get next state and actions
const [nextState, actions] = transition(machine, initialState, {
type: 'start', // The event to send
@@ -120,7 +117,6 @@ const [nextState, actions] = transition(machine, initialState, {
console.log(nextState.value); // 'started'
console.log(actions); // [{ type: 'doSomething', ... }]
-// highlight-end
```
## Actions
diff --git a/docs/quick-start.mdx b/content/docs/quick-start.mdx
similarity index 73%
rename from docs/quick-start.mdx
rename to content/docs/quick-start.mdx
index 56aa22376..c8728a843 100644
--- a/docs/quick-start.mdx
+++ b/content/docs/quick-start.mdx
@@ -2,60 +2,62 @@
title: Quick start
description: 'Start here to jump straight into XState and Stately Studio.'
---
+import { Tab, Tabs } from 'fumadocs-ui/components/tabs';
+
This quick start guide will help you get started with XState and Stately Studio. You will learn how to create a state machine, create an actor from that state machine, send events to that actor, and observe the state changes.
-:::studio
+
-The fastest way to start with Stately Studio is to go to [state.new](https://state.new). There, you’ll find a starter machine with all the statechart basics ready for you to edit. [Read more about Stately Studio](studio.mdx).
+The fastest way to start with Stately Studio is to go to [state.new](https://state.new). There, you’ll find a starter machine with all the statechart basics ready for you to edit. [Read more about Stately Studio](studio).
-:::
+
## Installing XState v5
-[XState](xstate.mdx) is a visual state management and orchestration library for JavaScript and TypeScript.
+[XState](xstate) is a visual state management and orchestration library for JavaScript and TypeScript.
Install the XState v5 using your preferred package manager:
-
-
+
+
```bash
npm install xstate
```
-
+
-
+
```bash
pnpm install xstate
```
-
+
-
+
```bash
yarn add xstate
```
-
+
-:::typescript
+
**XState v5 requires TypeScript version 5.0 or greater.**
-For best results, use the latest TypeScript version. [Read more about XState and TypeScript](typescript.mdx)
+For best results, use the latest TypeScript version. [Read more about XState and TypeScript](typescript)
-:::
+
## Create a machine
-In XState, a [machine](machines.mdx) is an object that contains all the logic for an [actor](actors.mdx). In this example, we will create a simple toggle machine that can be in one of two states: `Active` or `Inactive`. The `toggle` event will toggle the state between `Active` and `Inactive`.
+In XState, a [machine](machines) is an object that contains all the logic for an [actor](actors). In this example, we will create a simple toggle machine that can be in one of two states: `Active` or `Inactive`. The `toggle` event will toggle the state between `Active` and `Inactive`.
-```js
+```ts
import { createMachine } from 'xstate';
const toggleMachine = createMachine({
@@ -72,11 +74,11 @@ const toggleMachine = createMachine({
});
```
-[Read our introduction to state machines and statecharts](state-machines-and-statecharts.mdx) to familiarize yourself with the concepts.
+[Read our introduction to state machines and statecharts](state-machines-and-statecharts) to familiarize yourself with the concepts.
## Create an actor and send events
-[Machine logic](/docs/actors#actor-logic) can be used to create an actor. An [actor](actors.mdx) is a running process that can receive messages (events), send messages and change its behavior based on the messages it receives.
+[Machine logic](/docs/actors#actor-logic) can be used to create an actor. An [actor](actors) is a running process that can receive messages (events), send messages and change its behavior based on the messages it receives.
```js
import { createMachine, createActor } from 'xstate';
@@ -104,7 +106,7 @@ actor.send({ type: 'toggle' }); // logs 'Inactive'
## Use delayed transitions
-[Delayed transitions](delayed-transitions.mdx) are transitions that automatically happen after a specified interval of time.
+[Delayed transitions](delayed-transitions) are transitions that automatically happen after a specified interval of time.
```js
export const toggleMachine = createMachine({
@@ -124,13 +126,14 @@ export const toggleMachine = createMachine({
## Handle context data
-[Context](context.mdx) is how you store data in a state machine actor.
+[Context](context) is how you store data in a state machine actor.
```ts
import { assign, createMachine } from 'xstate';
export const toggleMachine = createMachine({
id: 'toggle',
+ // [!code highlight:1]
context: { count: 0 },
initial: 'Inactive',
states: {
@@ -150,19 +153,19 @@ export const toggleMachine = createMachine({
## Add input
-[Input](input.mdx) is how initial data can be provided to a machine actor.
+[Input](input) is how initial data can be provided to a machine actor.
-[Guards](guards.mdx) are used to conditionally allow or disallow transitions.
+[Guards](guards) are used to conditionally allow or disallow transitions.
```ts
import { assign, createMachine } from 'xstate';
export const toggleMachine = createMachine({
id: 'toggle',
- // highlight-next-line
+ // [!code highlight:1]
context: ({ input }) => ({
count: 0,
- // highlight-next-line
+ // [!code highlight:1]
maxCount: input.maxCount,
}),
initial: 'Inactive',
@@ -171,7 +174,7 @@ export const toggleMachine = createMachine({
on: {
toggle: {
// Only trigger toggle transition if count is less than maxCount
- // highlight-next-line
+ // [!code highlight:1]
guard: ({ context }) => context.count < context.maxCount,
target: 'Active',
},
@@ -188,7 +191,7 @@ export const toggleMachine = createMachine({
});
const actor = createActor(toggleMachine, {
- // highlight-next-line
+ // [!code highlight:1]
input: { maxCount: 10 },
});
@@ -204,7 +207,7 @@ actor.send({ type: 'toggle' });
## Use your machine with a framework
- [Check out all our packages](/docs/category/xstate-packages)
-- [Find out more about the `@xstate/react` package](xstate-react.mdx)
+- [Find out more about the `@xstate/react` package](xstate-react)
```jsx
import { useMachine } from '@xstate/react';
@@ -223,5 +226,5 @@ const App = () => {
```
- [Use the XState v5 templates](https://github.com/statelyai/xstate/tree/main/templates)
-- [Find more examples](examples.mdx)
-- [Migrate from XState V4 to XState V5](migration.mdx)
+- [Find more examples](examples)
+- [Migrate from XState V4 to XState V5](migration)
diff --git a/content/docs/setup.mdx b/content/docs/setup.mdx
new file mode 100644
index 000000000..3f4cb5f69
--- /dev/null
+++ b/content/docs/setup.mdx
@@ -0,0 +1,81 @@
+---
+title: 'Setup'
+---
+
+In XState version 5, you can now use the `setup({ ... })` function to setup types and sources for your machines. This has many benefits:
+
+- Reduced boilerplate for strongly typing and providing named sources
+- More robust machine logic, as named sources are guaranteed to exist
+- Better type inference for actions, actors, guards, delays, context, events, etc.
+- Strongly-typed snapshot and done events for actors
+- Strongly-typed state values
+- Reusability of source logic
+
+Example usage:
+
+```ts
+import { setup, assign } from 'xstate';
+
+const machine = setup({
+ types: {
+ context: {} as { count: number },
+ events: {} as { type: 'inc' } | { type: 'dec' },
+ },
+ actions: {
+ increment: assign({
+ count: ({ context }) => context.count + 1,
+ }),
+ decrement: assign({
+ count: ({ context }) => context.count - 1,
+ }),
+ },
+}).createMachine({
+ context: { count: 0 },
+ on: {
+ inc: { actions: 'increment' },
+ dec: { actions: 'decrement' },
+ },
+});
+```
+
+
+
+Ensure you are using the latest version of TypeScript (version 5.0 or higher). See the docs on [TypeScript usage with XState](./typescript) for more information.
+
+
+
+## Setting up types
+
+Machine types should be setup in the `types` property of `setup({ types })`. This is where you can setup the types for your machine, including:
+
+- Types for `context`
+- Types for `events`, including event payloads
+- Types for `input`
+- Types for `actions`, including action `params`
+- Types for `guards`, including guard `params`
+- Types for `actors`
+
+## Migrating from `createMachine`
+
+Migrating from bare `createMachine({ ... })` to `setup({ ... }).createMachine({ ... })` to create a machine is simple.
+
+1. Import `setup` instead of `createMachine` from `'xstate'`
+1. Move `types` from `createMachine(...)` to `setup(...)`
+1. Move action, actor, guard, etc. sources from the 2nd argument of `createMachine(config, sources)` to `setup({ ... })`
+
+```ts
+import {
+// createMachine
+ setup
+} from 'xstate';
+
+const machine =
+ setup({
+ types: { ... },
+ actions: { ... },
+ guards: { ... }
+ })
+ .createMachine({
+ // types: { ... }
+ }, /* { actions, guards, ... } */);
+```
diff --git a/docs/sign-up.mdx b/content/docs/sign-up.mdx
similarity index 81%
rename from docs/sign-up.mdx
rename to content/docs/sign-up.mdx
index 546c18e88..1fac90ad1 100644
--- a/docs/sign-up.mdx
+++ b/content/docs/sign-up.mdx
@@ -2,17 +2,16 @@
title: Sign up for Stately Studio
---
-# Sign up
[Sign up for a Stately Studio account from the sign up page](https://stately.ai/registry/login) or using the **Sign in** button in [the editor](https://stately.ai/editor)’s top bar.
Sign up using your email address and password, or sign in using your GitHub, Google, or Twitter account credentials.
-:::studio
+
-We offer a **free trial** on the Stately Studio [Pro](studio-pro-plan.mdx), [Team](studio-team-plan.mdx), or [Enterprise](studio-enterprise-plan.mdx) plans so you can explore how our premium features work for you and your team. You can [upgrade](/upgrade.mdx) when you’re signed into Stately Studio.
+We offer a **free trial** on the Stately Studio [Pro](studio-pro-plan), [Team](studio-team-plan), or [Enterprise](studio-enterprise-plan) plans so you can explore how our premium features work for you and your team. You can [upgrade](/upgrade) when you’re signed into Stately Studio.
-:::
+
### Using email
diff --git a/docs/simulate-mode.mdx b/content/docs/simulate-mode.mdx
similarity index 86%
rename from docs/simulate-mode.mdx
rename to content/docs/simulate-mode.mdx
index b11ecd1ba..fc7378ad2 100644
--- a/docs/simulate-mode.mdx
+++ b/content/docs/simulate-mode.mdx
@@ -3,6 +3,8 @@ title: 'Simulate mode'
description: 'Tour the features in Stately editor’s Simulate mode, including a guide to all the panels and how to simulate your machines.'
---
+import { Play, ListOrderedIcon, RefreshCcw, AlertCircle } from 'lucide-react';
+
You can simulate your machine as if it were live using the **Simulate** button. Your machine will start in the initial state, and any possible events that can be triggered are highlighted in blue.
**S
Press any available event to walk through your machine on the canvas or using the event buttons in the **Simulation controls** panel. Use **Reset** in the canvas tools to return to the initial state and clear the [event log](#event-log).
-:::warning
+
Simulate mode is disabled if your machine contains errors. States and events with errors are marked with an error icon in **Design** mode. Hover over any error icon to find out more about the error. Fix all the errors to enable Simulate mode.
-:::
+
### Simulate eventless (always) events
@@ -34,8 +36,8 @@ All triggered events are recorded, in order, in the **Reset** to return to the initial state and clear the event log.
-:::studio
+
-[Live simulation mode](live-simulation.mdx) ([premium feature](studio-pro-plan.mdx)) helps you share your simulated machine with your team without screen sharing or screenshots.
+[Live simulation mode](live-simulation) ([premium feature](studio-pro-plan)) helps you share your simulated machine with your team without screen sharing or screenshots.
-:::
+
diff --git a/versioned_docs/version-4/sources.mdx b/content/docs/sources.mdx
similarity index 79%
rename from versioned_docs/version-4/sources.mdx
rename to content/docs/sources.mdx
index 77e6cfa33..477c452b4 100644
--- a/versioned_docs/version-4/sources.mdx
+++ b/content/docs/sources.mdx
@@ -3,13 +3,15 @@ title: 'Sources'
description: 'You can add source code for actors, actions, and guards from the Sources panel. Your source code will be included in your live actors, synced projects, and exported code.'
---
-You can add source code for [actors](/docs/actors), [actions](/docs/actions), and [guards](/docs/guards) from the **Sources** panel. Your source code will be included in your [live actors](/docs/stately-sky-getting-started), [synced projects](/docs/import-from-github), and [exported code](/docs/export-as-code.mdx) found in the **Code** panel.
+import { Code, PenSquare, TextQuote } from 'lucide-react';
-:::info
+You can add source code for [actors](actors), [actions](actions), and [guards](guards) from the **Sources** panel. Your source code will be included in your [live actors](stately-sky-getting-started), [synced projects](import-from-github), and [exported code](export-as-code) found in the **Code** panel.
-Sources for [delayed (after) transitions](/docs/delayed-transitions) are coming soon.
+
-:::
+Sources for [delayed (after) transitions](delayed-transitions) are not yet supported. You can still use delayed transitions in your machines, but the delay implementation will need to be handled in your exported code rather than defined in the Sources panel.
+
+
## Adding sources
@@ -41,11 +43,11 @@ Would be given a default name of `inline:(machine).a.b#entry[0]`. These default
You can only delete unused sources that any actors, actions, or guards do not reference. This prevents you from accidentally deleting a currently used source in your machine.
-:::tip
+
You can **delete all unused sources** from the **...** menu in the top right corner of the **Sources** panel.
-:::
+
## Source templates
diff --git a/docs/spawn.mdx b/content/docs/spawn.mdx
similarity index 95%
rename from docs/spawn.mdx
rename to content/docs/spawn.mdx
index 0e2ab9779..008da9030 100644
--- a/docs/spawn.mdx
+++ b/content/docs/spawn.mdx
@@ -3,16 +3,16 @@ title: 'Spawn'
description: 'You can use spawn to run actors. Actors created with spawn are spawning actors, and actors created with invoke are invoking actors.'
---
-Sometimes invoking [actors](actors.mdx) may not be flexible enough for your needs. For example, you might want to:
+Sometimes invoking [actors](actors) may not be flexible enough for your needs. For example, you might want to:
- Invoke child machines that last across _several_ states
- Invoke a _dynamic number_ of actors
You can do this by **spawning** an actor instead of invoking. Actors created by spawning are **spawning actors**, and actors created with invoke are **invoking actors**.
-:::tip
+
[Read about the difference between spawning and invoking actors](actors.mdx#invoking-and-spawning-actors).
-:::
+
There are two ways to spawn: the `spawnChild` action creator, or the `spawn` helper function for `assign`.
@@ -67,11 +67,10 @@ const parentMachine = createMachine({
entry: [
assign({
childMachineRefs: ({ spawn }) => [
- // highlight-start
+ // [!code highlight:3]
spawn(childMachine),
spawn(childMachine),
spawn(childMachine),
- // highlight-end
],
}),
],
@@ -138,18 +137,18 @@ const machine = setup({
// ...
on: {
'thing.stop': {
- // highlight-next-line
+ // [!code highlight:1]
actions: stopChild('thing'),
},
'thing.stopFromContext': {
- // highlight-next-line
+ // [!code highlight:1]
actions: stopChild(({ context }) => context.something),
},
},
});
```
-Stopping a child actor does _not_ remove it from `context`. To remove it from context, use the [`assign(...)` action creator](./context.mdx):
+Stopping a child actor does _not_ remove it from `context`. To remove it from context, use the [`assign(...)` action creator](./context):
```ts
import { setup, stopChild } from 'xstate';
@@ -171,13 +170,13 @@ const machine = setup({
## Spawn and TypeScript
-:::typescript
+
**XState v5 requires TypeScript version 5.0 or greater.**
-For best results, use the latest TypeScript version. [Read more about XState and TypeScript](typescript.mdx)
+For best results, use the latest TypeScript version. [Read more about XState and TypeScript](typescript)
-:::
+
_Coming soon_
diff --git a/docs/state-done-events.mdx b/content/docs/state-done-events.mdx
similarity index 99%
rename from docs/state-done-events.mdx
rename to content/docs/state-done-events.mdx
index 2eb432d4c..f098dc1cf 100644
--- a/docs/state-done-events.mdx
+++ b/content/docs/state-done-events.mdx
@@ -15,11 +15,11 @@ For example, in a coffee machine, you might use an `onDone` event to transition
State done events also help maintain separation of concerns by allowing child states to focus on their specific tasks while the parent state handles the overall flow coordination.
-:::tip
+
Watch our [“What are state done events?” video on YouTube](https://www.youtube.com/watch?v=3laC3gWBLnM&list=PLvWgkXBB3dd4I_l-djWVU2UGPyBgKfnTQ&index=11) (1m16s).
-:::
+
In the video player above, when the video player reaches the *Stopped* state, the *Opened* state transitions through the *onDone* state done event to the *Closed* state.
diff --git a/docs/state-machine-actors.mdx b/content/docs/state-machine-actors.mdx
similarity index 93%
rename from docs/state-machine-actors.mdx
rename to content/docs/state-machine-actors.mdx
index 237bd7680..0a158cac1 100644
--- a/docs/state-machine-actors.mdx
+++ b/content/docs/state-machine-actors.mdx
@@ -2,13 +2,15 @@
title: State machine actors
---
+import { Info } from 'lucide-react';
+
State machine actors are actors whose logic is represented by a finite state machine or statechart.
-:::xstate
+
-This page is just an overview on using state machines to represent actor logic. Read the documentation on [state machines](./machines.mdx) to learn about state machines in depth.
+This page is just an overview on using state machines to represent actor logic. Read the documentation on [state machines](./machines) to learn about state machines in depth.
-:::
+
## State machine actor capabilities
@@ -84,11 +86,10 @@ const feedbackMachine = setup({
});
const feedbackActor = createActor(feedbackMachine, {
- // highlight-start
+ // [!code highlight:3]
input: {
defaultRating: 3,
},
- // highlight-end
});
feedbackActor.subscribe((snapshot) => {
@@ -101,4 +102,4 @@ feedbackActor.start();
## State machine actor output
-Read [state machine output](./output.mdx) for more information.
+Read [state machine output](./output) for more information.
diff --git a/docs/state-machines-and-statecharts.mdx b/content/docs/state-machines-and-statecharts.mdx
similarity index 85%
rename from docs/state-machines-and-statecharts.mdx
rename to content/docs/state-machines-and-statecharts.mdx
index 20633abdb..b1ea42bef 100644
--- a/docs/state-machines-and-statecharts.mdx
+++ b/content/docs/state-machines-and-statecharts.mdx
@@ -32,15 +32,15 @@ State machines model your application logic. Below is the logic for a video play
Statecharts extend traditional finite state machines to model more complex logic.
-Statecharts are a visual extension to state machines that use boxes and arrows, much like flowcharts and sequence diagrams. Statecharts add extra features not available in ordinary state machines, including [hierarchy](parent-states.mdx), [concurrency](parallel-states.mdx) and [communication](actor-model.mdx).
+Statecharts are a visual extension to state machines that use boxes and arrows, much like flowcharts and sequence diagrams. Statecharts add extra features not available in ordinary state machines, including [hierarchy](parent-states), [concurrency](parallel-states) and [communication](actor-model).
When you make a state machine in [Stately Studio](https://stately.ai/editor), it’s also a statechart!
-:::studio
+
In Stately Studio, we refer to both state machines and statecharts as **state machines**.
-:::
+
## States
@@ -48,7 +48,7 @@ A state describes the machine’s status or mode, which could be as simple as *
{/* no alt because the image is already described in the surrounding text */}
-
+{/*
-
+ */}
+
+
[View the dog states machine in Stately Studio](https://stately.ai/registry/editor/1f84ff0d-fe41-4a92-ad5c-fadfa8b37ffb?machineId=469f2d59-551f-43cb-bfc0-e6f3ea0f9d87).
@@ -67,9 +69,9 @@ When a state machine starts, it enters the **initial state** first. A machine
In this statechart describing the process of walking the dog, the initial state would be **waiting** to walk.
-- [Read more about states](states.mdx).
-- [Read more about finite states](finite-states.mdx).
-- [Read more about initial states](initial-states.mdx).
+- [Read more about states](states).
+- [Read more about finite states](finite-states).
+- [Read more about initial states](initial-states).
### States in XState
@@ -81,7 +83,7 @@ import { createMachine } from 'xstate';
const dogMachine = createMachine({
id: 'dog',
initial: 'asleep',
- // highlight-start
+ // [!code highlight:9]
states: {
asleep: {
// ...
@@ -91,17 +93,16 @@ const dogMachine = createMachine({
},
//...
},
- // highlight-end
});
```
-:::studio
+
### States in Stately Studio
-The rounded rectangle boxes are states. [Read how to create states in Stately Studio](states.mdx).
+The rounded rectangle boxes are states. [Read how to create states in Stately Studio](states).
-:::
+
## Transitions and events
@@ -111,7 +112,7 @@ Transitions are “deterministic”; each combination of state and event always
{/* no alt because the image is already described in the surrounding text */}
-
+{/*
-
+ */}
+
+
[View the dog states machine with events and transitions in Stately Studio](https://stately.ai/registry/editor/1f84ff0d-fe41-4a92-ad5c-fadfa8b37ffb?machineId=e48e774e-c31f-4e51-a934-6b795c12b2b9).
With its two finite states and transitions, this tiny dog process is a _Finite State Machine._ A state machine is used to describe the behavior of something. The machine describes the thing’s states and the transitions between those states. It’s a Finite State Machine because it has a finite number of states. (Sometimes abbreviated to FSM by folks who love jargon).
-[Read more about transitions and events](transitions.mdx).
+[Read more about transitions and events](transitions).
### Events and transitions in XState
@@ -140,31 +143,29 @@ const dogMachine = createMachine({
initial: 'asleep',
states: {
asleep: {
- // highlight-start
+ // [!code highlight:3]
on: {
'wakes up': 'awake',
},
- // highlight-end
},
awake: {
- // highlight-start
+ // [!code highlight:3]
on: {
'falls asleep': 'asleep',
},
- // highlight-end
},
//...
},
});
```
-:::studio
+
### Events and transitions in Stately Studio
-In Stately Studio, the arrows are transitions, and the rounded rectangles on the arrow’s lines are events. Each transition has a **source** state which comes before the transition, and a **target** state, which comes after the transition. The transition’s arrow starts from the source state and points to the target state. [Read how to create events and transitions in Stately Studio](editor-states-and-transitions.mdx).
+In Stately Studio, the arrows are transitions, and the rounded rectangles on the arrow’s lines are events. Each transition has a **source** state which comes before the transition, and a **target** state, which comes after the transition. The transition’s arrow starts from the source state and points to the target state. [Read how to create events and transitions in Stately Studio](editor-states-and-transitions).
-:::
+
## Final state
@@ -172,7 +173,7 @@ Most processes with states will have a _final state_, the last state when the pr
In the dog walking statechart, the final state would be **walk complete**.
-
+{/*
-
+ */}
+
+
[View the dog walk machine in Stately Studio](https://stately.ai/registry/editor/1f84ff0d-fe41-4a92-ad5c-fadfa8b37ffb?machineId=988d8d05-86ba-422a-8a28-d13cbf54d481).
-[Read more about final states](final-states.mdx)
+[Read more about final states](final-states)
## Parent states
@@ -195,7 +198,7 @@ A parent state is symbolised by a labelled rectangle box that acts as a containe
{/* no alt because the image is already described in the surrounding text */}
-
+{/*
-
+ */}
+
+
[View the dog walk machine in Stately Studio](https://stately.ai/registry/editor/1f84ff0d-fe41-4a92-ad5c-fadfa8b37ffb?machineId=aa8a9c5d-8fd9-4e47-b71a-bda219cda066).
@@ -212,7 +217,7 @@ A parent state should also specify which child state is the initial state. In th
Parent and child states are one of the features that make statecharts capable of handling more complexity than an everyday state machine.
-[Read more about parent states](parent-states.mdx).
+[Read more about parent states](parent-states).
## Atomic states
@@ -226,7 +231,7 @@ Inside the **on a walk** parallel state, there could be two regions. One region
{/* no alt because the image is already described in the surrounding text */}
-
+{/*
-
+ */}
+
+
[View the dog walk machine in Stately Studio](https://stately.ai/registry/editor/1f84ff0d-fe41-4a92-ad5c-fadfa8b37ffb?machineId=1f43dcd3-255c-40bf-b6b0-eba9a2bccb23).
Both regions should also specify which child state is the initial state. In our **tail** region, the initial state is **not wagging**.
-[Read more about parallel states](parallel-states.mdx).
+[Read more about parallel states](parallel-states).
## Self-transition
@@ -253,7 +260,7 @@ In a **dog begging** process, there would be a **begging** state with a **gets t
{/* no alt because the image is already described in the surrounding text */}
-
+{/*
-
+ */}
+
+
[View the dog begging machine in Stately Studio](https://stately.ai/registry/editor/17986605-400c-4c00-8b33-47e3ecca478b?machineId=933419cb-dd94-453c-a2b1-de2290c0a5a5).
@@ -270,4 +279,4 @@ In a **dog begging** process, there would be a **begging** state with a **gets t
## What next?
-Now you know enough to get started in the [Stately Studio](https://stately.ai/editor?source=docs). Get an [overview of Stately Studio and its features](studio.mdx), or [continue to learn about XState](xstate.mdx).
+Now you know enough to get started in the [Stately Studio](https://stately.ai/editor?source=docs). Get an [overview of Stately Studio and its features](studio), or [continue to learn about XState](xstate).
diff --git a/docs/stately-sky-getting-started.mdx b/content/docs/stately-sky-getting-started.mdx
similarity index 85%
rename from docs/stately-sky-getting-started.mdx
rename to content/docs/stately-sky-getting-started.mdx
index ef3313642..fa172ed46 100644
--- a/docs/stately-sky-getting-started.mdx
+++ b/content/docs/stately-sky-getting-started.mdx
@@ -4,24 +4,24 @@ title: 'Stately Sky getting started'
# Getting started with Stately Sky 🌤️
-This guide will walk you through deploying a simple traffic light state machine workflow with Stately Sky using [XState](/docs/xstate.mdx), [Vite](https://vitejs.dev/) and [React](https://reactjs.org/).
+This guide will walk you through deploying a simple traffic light state machine workflow with Stately Sky using [XState](/docs/xstate), [Vite](https://vitejs.dev/) and [React](https://reactjs.org/).
-:::warning
+
Please note that Sky is currently in beta and will be changing rapidly.
-:::
+
## What you’ll need
- A [Stately](https://stately.ai) account with a [Pro, Team, or Enterprise subscription](https://stately.ai/pricing).
- Our [Stately Sky starter project](https://github.com/statelyai/sky-starter-app). Clone the repo to your local machine.
-:::studio
+
-Our premium users get unlimited use of Stately Sky while it’s in beta. You can try Stately Studio’s premium plans with a free trial. [Check out the features on our Pro plan](studio-pro-plan.mdx), [Team plan](studio-team-plan.mdx), [Enterprise plan](studio-enterprise-plan.mdx) or [upgrade your existing plan](https://stately.ai/registry/billing).
+Our premium users get unlimited use of Stately Sky while it’s in beta. You can try Stately Studio’s premium plans with a free trial. [Check out the features on our Pro plan](studio-pro-plan), [Team plan](studio-team-plan), [Enterprise plan](studio-enterprise-plan) or [upgrade your existing plan](https://stately.ai/registry/billing).
-:::
+
## Getting started video
@@ -38,17 +38,17 @@ For this example, we’ll create a simple traffic light machine with three state
name="Traffic light"
/>
-:::xstate
-Sky only supports [XState](https://github.com/statelyai/xstate) V5 machines. The [changes in XState V5](/docs/migration.mdx) provide both a better developer experience and adhere to the [Actor Model](/docs/actor-model.mdx) more closely, allowing Sky to capably deploy machines that reliably communicate their state.
-:::
+
+Sky only supports [XState](https://github.com/statelyai/xstate) V5 machines. The [changes in XState V5](/docs/migration) provide both a better developer experience and adhere to the [Actor Model](/docs/actor-model) more closely, allowing Sky to capably deploy machines that reliably communicate their state.
+
-:::typescript
+
**XState v5 requires TypeScript version 5.0 or greater.**
-For best results, use the latest TypeScript version. [Read more about XState and TypeScript](typescript.mdx)
+For best results, use the latest TypeScript version. [Read more about XState and TypeScript](typescript)
-:::
+
## Step 2: Create an API key
@@ -57,13 +57,13 @@ After creating your machine, you’ll need to create an API key to deploy it to
1. Use the **Deploy** button in the top right corner of the editor to open the Stately Sky options.
2. Use the **Create API Key** button to generate an API key.
-
+
3. Be sure to copy that API key and save it somewhere safe. You’ll need it later.
The page should look like this:
-
+
## Step 3: Deploy your machine to Sky
@@ -75,7 +75,7 @@ Once you have generated the API key, you can deploy your machine to Sky as a wor
You’ll need the workflow’s URL to reference it from the starter project.
-
+
## Step 4: Add the actor in the starter project
@@ -94,14 +94,14 @@ const actor = actorFromStately({
});
```
-:::tip
+
By default, Sky is multiplayer.
The session ID is used to shard the multiplayer session. Each actor has a unique session ID.
- Use a shared session ID to allow multiple users to reference the same actor.
- If you want users isolated, use a unique session ID for each user.
-:::
+
## Step 5: Fetching the config from Sky
@@ -109,7 +109,7 @@ Now that we’ve created the actor, we need to fetch the config from Sky. Doing
To fetch the config, we’ll use the [XState CLI tool](/docs/developer-tools.mdx#xstate-cli-command-line-interface) and the `sky` script already in our `package.json`. This script runs the command over all the files in the `src` repo to find configs associated with any initialized actors.
-
+
1. Using your package manager of choice, run the `sky` command:
@@ -126,11 +126,11 @@ You’ll notice a warning in the `sky.ts` file that the file is generated. You s
Running `xstate sky` will only affect a file if it hasn’t already been fetched. If you make changes to the machine in the Studio, you’ll need to delete the generated file `yourFile.sky.ts` and run the command again. Alternatively, you can force the refetch by running `xstate sky --refetch`.
-:::tip
+
Add your generated `sky.ts` files to source control.
-:::
+
## Finishing up
diff --git a/content/docs/stately-studio/accounts/meta.json b/content/docs/stately-studio/accounts/meta.json
new file mode 100644
index 000000000..d9cfb015a
--- /dev/null
+++ b/content/docs/stately-studio/accounts/meta.json
@@ -0,0 +1,7 @@
+{
+ "title": "Accounts",
+ "pages": [
+ "sign-up",
+ "upgrade"
+ ]
+}
diff --git a/content/docs/stately-studio/code/meta.json b/content/docs/stately-studio/code/meta.json
new file mode 100644
index 000000000..b9f9422cb
--- /dev/null
+++ b/content/docs/stately-studio/code/meta.json
@@ -0,0 +1,10 @@
+{
+ "title": "Code",
+ "pages": [
+ "import-from-code",
+ "import-from-github",
+ "generate-test-paths",
+ "sources",
+ "export-as-code"
+ ]
+}
diff --git a/content/docs/stately-studio/design-mode/meta.json b/content/docs/stately-studio/design-mode/meta.json
new file mode 100644
index 000000000..2edeee018
--- /dev/null
+++ b/content/docs/stately-studio/design-mode/meta.json
@@ -0,0 +1,16 @@
+{
+ "title": "Design mode",
+ "pages": [
+ "design-mode",
+ "generate-flow",
+ "generate-react",
+ "colors",
+ "annotations",
+ "descriptions",
+ "figma",
+ "assets",
+ "editor-tags",
+ "machine-restore",
+ "autolayout"
+ ]
+}
diff --git a/content/docs/stately-studio/meta.json b/content/docs/stately-studio/meta.json
new file mode 100644
index 000000000..50376cf73
--- /dev/null
+++ b/content/docs/stately-studio/meta.json
@@ -0,0 +1,27 @@
+{
+ "title": "Stately Studio",
+ "pages": [
+ "studio",
+ "studio-pro-plan",
+ "studio-team-plan",
+ "studio-enterprise-plan",
+ "studio-community-plan",
+ "editor-states-and-transitions",
+ "editor-actions-and-actors",
+ "design-mode",
+ "simulate-mode",
+ "code",
+ "projects",
+ "stately-sky",
+ "teams",
+ "discover",
+ "share",
+ "accounts",
+ "versions",
+ "lock-machines",
+ "keyboard-shortcuts",
+ "canvas-view-controls",
+ "user-preferences",
+ "studio-api"
+ ]
+}
diff --git a/content/docs/stately-studio/share/meta.json b/content/docs/stately-studio/share/meta.json
new file mode 100644
index 000000000..bc5fc667f
--- /dev/null
+++ b/content/docs/stately-studio/share/meta.json
@@ -0,0 +1,8 @@
+{
+ "title": "Share",
+ "pages": [
+ "embed",
+ "image",
+ "url"
+ ]
+}
diff --git a/content/docs/stately-studio/simulate-mode/meta.json b/content/docs/stately-studio/simulate-mode/meta.json
new file mode 100644
index 000000000..4181956ea
--- /dev/null
+++ b/content/docs/stately-studio/simulate-mode/meta.json
@@ -0,0 +1,7 @@
+{
+ "title": "Simulate mode",
+ "pages": [
+ "simulate-mode",
+ "live-simulation"
+ ]
+}
diff --git a/content/docs/stately-studio/stately-sky/meta.json b/content/docs/stately-studio/stately-sky/meta.json
new file mode 100644
index 000000000..9f6a782a9
--- /dev/null
+++ b/content/docs/stately-studio/stately-sky/meta.json
@@ -0,0 +1,6 @@
+{
+ "title": "Stately Sky",
+ "pages": [
+ "stately-sky-getting-started"
+ ]
+}
diff --git a/docs/states.mdx b/content/docs/states.mdx
similarity index 91%
rename from docs/states.mdx
rename to content/docs/states.mdx
index 2113d9d4e..6fd829a46 100644
--- a/docs/states.mdx
+++ b/content/docs/states.mdx
@@ -11,26 +11,26 @@ These states are “finite”; the machine can only move through the states you
embedURL="https://stately.ai/registry/editor/embed/e13bef2b-bb13-4465-96ac-0bc25340688e?machineId=741f69fd-7f01-4932-9407-6871e225bb6d"
/>
-:::studio
+
-You can visualize your state machines and easily add states in our drag-and-drop Stately editor. [Read more about states in Stately’s editor](editor-states-and-transitions.mdx).
+You can visualize your state machines and easily add states in our drag-and-drop Stately editor. [Read more about states in Stately’s editor](editor-states-and-transitions).
-:::
+
-:::tip
+
Watch our [“What are states?” video on YouTube](https://www.youtube.com/watch?v=z-6yhmSWUcc&list=PLvWgkXBB3dd4I_l-djWVU2UGPyBgKfnTQ&index=2) (53s).
-:::
+
## State object
-The state object represents the current state of a running machine ([actor](actor-model.mdx)) and contains the following properties:
+The state object represents the current state of a running machine ([actor](actor-model)) and contains the following properties:
- **`value`**: the current state value, which is either:
- a string representing a simple state like `'playing'`, or:
- an object representing nested states like `{ paused: 'buffering' }`.
-- **`context`**: the current [context](context.mdx) (extended state.)
+- **`context`**: the current [context](context) (extended state.)
- **`meta`**: an object containing state node meta data.
```ts
@@ -105,7 +105,7 @@ Coming soon… a visual example.
- `state.value === { form: 'invalid' }` - this represents a state machine with an active child node with key `form` that has an active child node with key `invalid`
-For state machines with [parallel state nodes](parallel-states.mdx), the state value contains object(s) with multiple keys for each state node region:
+For state machines with [parallel state nodes](parallel-states), the state value contains object(s) with multiple keys for each state node region:
```ts
state.value ===
@@ -119,7 +119,7 @@ State machines may also have no state nodes other than the root state node. For
## State context
-State machines can have [context](context.mdx), which is an object that represents the extended state of the machine. The context is immutable, and can only be updated by [assigning](actions.mdx#assign-action) to it in an action. You can read the `state.context` property to get the current context.
+State machines can have [context](context), which is an object that represents the extended state of the machine. The context is immutable, and can only be updated by [assigning](actions.mdx#assign-action) to it in an action. You can read the `state.context` property to get the current context.
```ts
const currentState = feedbackActor.getSnapshot();
@@ -173,9 +173,9 @@ console.log(currentState.can({ type: 'feedback.submit' }));
A state is considered “changed” if a transition is enabled for the given `state` and `event` object.
-:::warningxstate
+
The `state.can(...)` method will also check transition guards by executing them. Transition guards should be pure functions.
-:::
+
## `state.hasTag(tag)`
@@ -261,15 +261,14 @@ console.log(currentState.getMeta());
## State descriptions
-You can add `.description` to states to describe their purpose and share related notes with your team. In Stately Studio’s editor, these descriptions are rendered in the machine and support markdown including links, images, and lists. [Read more about descriptions in Stately Studio](descriptions.mdx).
+You can add `.description` to states to describe their purpose and share related notes with your team. In Stately Studio’s editor, these descriptions are rendered in the machine and support markdown including links, images, and lists. [Read more about descriptions in Stately Studio](descriptions).
```ts
states: {
"Loading Move Destinations": {
- // highlight-start
+ // [!code highlight:2]
description:
"Load data from the server based on the entity's id and type (project or machine). Result includes the entity's current location, and the list or tree of valid destination options to which the user may move that entity.",
- // highlight-end
invoke: {
src: "loadMoveData",
id: "loadMoveData",
@@ -291,13 +290,13 @@ states: {
## States and TypeScript
-:::typescript
+
**XState v5 requires TypeScript version 5.0 or greater.**
-For best results, use the latest TypeScript version. [Read more about XState and TypeScript](typescript.mdx)
+For best results, use the latest TypeScript version. [Read more about XState and TypeScript](typescript)
-:::
+
_Coming soon_
@@ -339,4 +338,4 @@ console.log(state.getMeta());
## Further resources
-[Persisting state](persistence.mdx)
+[Persisting state](persistence)
diff --git a/docs/studio-api.mdx b/content/docs/studio-api.mdx
similarity index 83%
rename from docs/studio-api.mdx
rename to content/docs/studio-api.mdx
index e6e37ba45..30163ab9d 100644
--- a/docs/studio-api.mdx
+++ b/content/docs/studio-api.mdx
@@ -11,11 +11,11 @@ Some things you can do with the API include:
- Fetching information about your projects
- Fetching a specific version of a machine
-:::studio
+
-API access is a premium feature of Stately Studio. [Check out the features on our Pro plan](studio-pro-plan.mdx), [Team plan](studio-team-plan.mdx), [Enterprise plan](studio-enterprise-plan.mdx) or [upgrade your existing plan](https://stately.ai/registry/billing).
+API access is a premium feature of Stately Studio. [Check out the features on our Pro plan](studio-pro-plan), [Team plan](studio-team-plan), [Enterprise plan](studio-enterprise-plan) or [upgrade your existing plan](https://stately.ai/registry/billing).
-:::
+
## Authentication: Generating an API key
@@ -25,17 +25,17 @@ You can generate an API key for one of two scopes:
- **Project**: This key will have access to all the machines in a specific project.
- **Account**: This key will have access to all the projects and machines in your account.
-:::studio
+
It's important to keep your API key secret. If you believe your API key has been compromised, you can regenerate it at any time.
-:::
+
### Generating a project-wide API key
To generate an API key for a **project**, open any machine in the project you're interested in. Then, click on the "Deploy" button in the top right corner of the editor page. In the modal that appears, click "Create API Key", and make sure to copy it and store it in a safe place.
-
+{/*
-
+ */}
+
+
### Generating an account-wide API key
Generating an API key for an **account** can be done from the user's settings. In Settings, select the API Key tab, and click "Create API Key". Make sure to copy it and store it in a safe place.
-
+{/*
-
+ */}
+
+
## Making requests: Accessing the OpenAPI(Swagger) documentation
@@ -69,7 +73,7 @@ The easiest way to get started with the Studio API is to use the [OpenAPI(Swagge
To test the API, you can must first authenticate with your API key, using the "Authorize" button in the top right corner of the page.
-
+{/*
-
+ */}
+
+
### Testing endpoints
diff --git a/docs/studio-community-plan.mdx b/content/docs/studio-community-plan.mdx
similarity index 64%
rename from docs/studio-community-plan.mdx
rename to content/docs/studio-community-plan.mdx
index 3dc4f6847..1e15c0e1d 100644
--- a/docs/studio-community-plan.mdx
+++ b/content/docs/studio-community-plan.mdx
@@ -2,15 +2,13 @@
title: Stately Studio Community plan
---
-# Stately Studio Community plan
-
**Stately Studio will always be free to our Community users** on this free plan, and we will make many future features available on every plan. Request features and check out what we’ve got planned on [our roadmap](https://feedback.stately.ai).
-:::studio
+
-We offer a **free trial** on the Stately Studio [Pro](studio-pro-plan.mdx), [Team](studio-team-plan.mdx), or [Enterprise](studio-enterprise-plan.mdx) plans so you can explore how our premium features work for you and your team. You can [upgrade](/upgrade.mdx) when you’re signed into Stately Studio.
+We offer a **free trial** on the Stately Studio [Pro](studio-pro-plan), [Team](studio-team-plan), or [Enterprise](studio-enterprise-plan) plans so you can explore how our premium features work for you and your team. You can [upgrade](/upgrade) when you’re signed into Stately Studio.
-:::
+
## Community features
@@ -18,15 +16,15 @@ Our Community plan features include the following:
- Unlimited [public projects](projects.mdx#change-a-projects-visibility)
- [Design and simulate flows](/studio.mdx#studio-editor)
-- [Import from code](import-from-code.mdx)
-- [Export as code](export-as-code.mdx)
-- [Discover and fork public machines](discover.mdx)
-- [XState VS Code extension](xstate-vscode-extension.mdx)
+- [Import from code](import-from-code)
+- [Export as code](export-as-code)
+- [Discover and fork public machines](discover)
+- [XState VS Code extension](xstate-vscode-extension)
-:::info
+
## Why pay for a premium plan?
Our premium plans include private and unlisted projects, AI assistance with Stately AI, live workflows with Stately Sky, useful features for team management and much more. Your subscription also helps support the Stately team as we build and improve Stately Studio and XState.
-:::
+
diff --git a/docs/studio-enterprise-plan.mdx b/content/docs/studio-enterprise-plan.mdx
similarity index 72%
rename from docs/studio-enterprise-plan.mdx
rename to content/docs/studio-enterprise-plan.mdx
index 3d287c983..beabcbd11 100644
--- a/docs/studio-enterprise-plan.mdx
+++ b/content/docs/studio-enterprise-plan.mdx
@@ -2,14 +2,14 @@
title: Stately Studio Enterprise plan
---
-# Stately Studio Enterprise plan
+import { Mail } from 'lucide-react';
Upgrade to an Enterprise account to enjoy all of our paid plan features as well as features designed to integrate Stately Studio with the specific needs of your organization, including custom integrations, greater security, and top-tier support. An enterprise account includes the following features:
## Enterprise features
-- Everything from the [Team](studio-team-plan.mdx) plan
-- Unlimited [generated flows](generate-flow.mdx)
+- Everything from the [Team](studio-team-plan) plan
+- Unlimited [generated flows](generate-flow)
- Flexible hosting
- Dedicated priority support
- Custom server locations
@@ -22,17 +22,14 @@ Upgrade to an Enterprise account to enjoy all of our paid plan features as well
We have many more team features coming soon. Request features and check out what we’ve got planned on [our roadmap](https://feedback.stately.ai).
-
-
- Email the Stately team
- {' '}
- for a custom plan tailored to the requirements of your organization.
-
-:::info
+
+ Email the Stately team
+ {' '}
+for a custom plan tailored to the requirements of your organization.
-## Why pay for a premium plan?
+
Our premium plans include private and unlisted projects, AI assistance with Stately AI, live workflows with Stately Sky, useful features for team management and much more. Your subscription also helps support the Stately team as we build and improve Stately Studio and XState.
-:::
+
diff --git a/docs/studio-pro-plan.mdx b/content/docs/studio-pro-plan.mdx
similarity index 59%
rename from docs/studio-pro-plan.mdx
rename to content/docs/studio-pro-plan.mdx
index ce59d48f2..32b26ff42 100644
--- a/docs/studio-pro-plan.mdx
+++ b/content/docs/studio-pro-plan.mdx
@@ -2,62 +2,58 @@
title: Stately Studio Pro plan
---
-# Stately Studio Pro plan
-
[Upgrade to a Pro account](https://stately.ai/pricing) to create more expressive flows, work faster with AI assistance, and achieve greater flexibility in editing with version control. A Pro account includes the following features:
## Pro features
-- Everything from the [Community plan](studio-community-plan.mdx)
+- Everything from the [Community plan](studio-community-plan)
- [Private and unlisted projects](/docs/projects/#change-a-projects-visibility)
-- [Generate and modify using AI](generate-flow.mdx)
-- [Deploy live workflows](stately-sky-getting-started.mdx)
-- [Generate React UIs](generate-react.mdx)
-- [Version history](versions.mdx)
-- [Import from GitHub](import-from-github.mdx)
-- [Live simulation mode](live-simulation.mdx)
-- [Embed Figma frames](figma.mdx)
-- [State assets](assets.mdx)
-- [Lock machines](lock-machines.mdx)
-- [Generate test paths](generate-test-paths.mdx)
-- [Color states and transitions](colors.mdx)
-- [Export flows to markdown](export-as-code.mdx)
-- [Export flows as stories](export-as-code.mdx)
+- [Generate and modify using AI](generate-flow)
+- [Deploy live workflows](stately-sky-getting-started)
+- [Generate React UIs](generate-react)
+- [Version history](versions)
+- [Import from GitHub](import-from-github)
+- [Live simulation mode](live-simulation)
+- [Embed Figma frames](figma)
+- [State assets](assets)
+- [Lock machines](lock-machines)
+- [Generate test paths](generate-test-paths)
+- [Color states and transitions](colors)
+- [Export flows to markdown](export-as-code)
+- [Export flows as stories](export-as-code)
- [Priority support](/docs/studio-pro-plan/#priority-support)
-- [GitHub Sync](import-from-github.mdx)
+- [GitHub Sync](import-from-github)
- Actors (coming soon!)
We have many more pro features coming soon. Request features and check out what we’ve got planned on [our roadmap](https://feedback.stately.ai).
We offer a **free trial** on all of our premium plans so you can explore how our Pro features work for you.
-:::studio
+
**Stately Studio will always be free to our Community users** on the free plan, and we will make many future features available on every plan.
-:::
+
## Pro accounts
You can choose between monthly or yearly billing on all of our premium plans.
-:::studio
-
-### Pro features as a team member
+
-If you are a team member of another user’s [team](teams.mdx), with the role of [Admin](/docs/teams/#admin-role) or [Editor](/docs/teams/#editor-role), you also have access to [premium features](#pro-features)! However, if you want to create your own teams, you need to [upgrade to your own Team subscription](upgrade.mdx).
+If you are a team member of another user’s [team](teams), with the role of [Admin](/docs/teams/#admin-role) or [Editor](/docs/teams/#editor-role), you also have access to [premium features](#pro-features)! However, if you want to create your own teams, you need to [upgrade to your own Team subscription](upgrade).
-:::
+
### How to sign up
[Sign up for a Stately Studio account from the sign up page](https://stately.ai/registry/login) or using the **Sign in** button in [the editor](https://stately.ai/editor)’s top bar.
-Read more about [signing up for Stately Studio](sign-up.mdx).
+Read more about [signing up for Stately Studio](sign-up).
### How to upgrade
-You can [upgrade](upgrade.mdx) when you’re signed into Stately Studio using the **Upgrade** button in the editor’s footer.
+You can [upgrade](upgrade) when you’re signed into Stately Studio using the **Upgrade** button in the editor’s footer.
## Priority support
@@ -71,10 +67,8 @@ You can cancel your Pro plan at any time. When you cancel your Pro plan:
- Private projects will become read-only.
- You will no longer have access to other Pro features like deploying live workflows with Stately Sky, AI generation features, saving machine versions, etc.
-:::info
-
-## Why pay for a premium plan?
+
Our premium plans include private and unlisted projects, AI assistance with Stately AI, live workflows with Stately Sky, useful features for team management and much more. Your subscription also helps support the Stately team as we build and improve Stately Studio and XState.
-:::
+
diff --git a/docs/studio-team-plan.mdx b/content/docs/studio-team-plan.mdx
similarity index 75%
rename from docs/studio-team-plan.mdx
rename to content/docs/studio-team-plan.mdx
index 31df27857..ed91b7d76 100644
--- a/docs/studio-team-plan.mdx
+++ b/content/docs/studio-team-plan.mdx
@@ -2,14 +2,12 @@
title: Stately Studio Team plan
---
-# Stately Studio Team plan
-
[Upgrade to a Team account](https://stately.ai/pricing) to enjoy all of our Pro features as well as many features designed to help you collaborate with your team, on any number of projects. A Team account includes the following features:
## Team features
-- Everything from the [Pro](studio-pro-plan.mdx) plan
-- Create one or more [teams](teams.mdx), based on your needs
+- Everything from the [Pro](studio-pro-plan) plan
+- Create one or more [teams](teams), based on your needs
- [Private, shared team projects](/docs/projects/#change-a-projects-visibility)
- Add up to 10 [team members](/docs/teams/#invite-new-members-to-a-team)
- [Team admins and editors](/docs/teams/#admin-role)
@@ -20,33 +18,31 @@ We have many more team features coming soon. Request features and check out what
We offer a **free trial** on all of our premium plans so you can explore how our Team features work for you and your team.
-:::studio
+
**Stately Studio will always be free to our Community users** on the free plan, and we will make many future features available on every plan.
-:::
+
## Team accounts
You can choose between monthly or yearly billing on all of our premium plans.
-:::studio
-
-### Pro features as a team member
+
-If you are a team member of another user’s [team](teams.mdx), with the role of [Admin](/docs/teams/#admin-role) or [Editor](/docs/teams/#editor-role), you also have access to [premium features](studio-pro-plan.mdx)! However, if you want to create your own teams, you need to [upgrade to your own Pro or Team subscription](upgrade.mdx).
+If you are a team member of another user’s [team](teams), with the role of [Admin](/docs/teams/#admin-role) or [Editor](/docs/teams/#editor-role), you also have access to [premium features](studio-pro-plan)! However, if you want to create your own teams, you need to [upgrade to your own Pro or Team subscription](upgrade).
-:::
+
### How to sign up
You can sign up for a Stately Studio account from the [**Sign in page**](https://stately.ai/registry/login) or the **Sign in** button in [the editor](https://stately.ai/editor)’s top bar.
-Read more about [signing up for Stately Studio](sign-up.mdx).
+Read more about [signing up for Stately Studio](sign-up).
### How to upgrade
-You can [upgrade](upgrade.mdx) when you’re signed into Stately Studio using the **Upgrade** button in the editor’s footer.
+You can [upgrade](upgrade) when you’re signed into Stately Studio using the **Upgrade** button in the editor’s footer.
## Priority support
@@ -64,10 +60,8 @@ You can cancel your Team plan at any time. When you cancel your Team plan:
- Team members’ private projects will become read-only.
- Team members will lose access to Pro features unless they have purchased their own Pro subscription.
-:::info
-
-## Why pay for a premium plan?
+
Our premium plans include private and unlisted projects, AI assistance with Stately AI, live workflows with Stately Sky, useful features for team management and much more. Your subscription also helps support the Stately team as we build and improve Stately Studio and XState.
-:::
+
diff --git a/docs/studio.mdx b/content/docs/studio.mdx
similarity index 66%
rename from docs/studio.mdx
rename to content/docs/studio.mdx
index f32647db7..c576f560f 100644
--- a/docs/studio.mdx
+++ b/content/docs/studio.mdx
@@ -2,12 +2,14 @@
title: Stately Studio
---
-Stately Studio is a suite of tools for building app logic, including the Editor, [developer tools for XState](developer-tools.mdx), and much more coming soon.
+import { HelpCircle, GraduationCap, MoreHorizontal, ThemedImage } from 'lucide-react';
+
+Stately Studio is a suite of tools for building app logic, including the Editor, [developer tools for XState](developer-tools), and much more coming soon.
🚀 Open Stately Studio (state.new)
-
+{/*
-
+ */}
+
+
-You can use [Stately Studio’s editor](/studio.mdx#stately-studios-editor) to model your logic using state machines and statecharts visually; no code required! Collaborate on your machines with coworkers and friends with [shared projects in teams](/#projects-and-teams). Use the [XState VS Code extension](xstate-vscode-extension.mdx) to use the editor with your codebase inside your code editor, or [export](/#export) your code from Stately Studio into your codebase.
+You can use [Stately Studio’s editor](/studio.mdx#stately-studios-editor) to model your logic using state machines and statecharts visually; no code required! Collaborate on your machines with coworkers and friends with [shared projects in teams](#projects-and-teams). Use the [XState VS Code extension](xstate-vscode-extension) to use the editor with your codebase inside your code editor, or [export](#export) your code from Stately Studio into your codebase.
-:::tip
+
-What are state machines and statecharts? We’re glad you asked! [Check out our no-code introduction to state machines and statecharts](state-machines-and-statecharts.mdx).
+What are state machines and statecharts? We’re glad you asked! [Check out our no-code introduction to state machines and statecharts](state-machines-and-statecharts).
-:::
+
## Stately Studio’s editor
-Stately Studio’s editor supports everything you need to visually build state machines and statecharts. The editor currently has two modes; [**Design** mode](design-mode.mdx) for creating your machines and [**Simulate** mode](simulate-mode.mdx) for simulating how your machine works.
+Stately Studio’s editor supports everything you need to visually build state machines and statecharts. The editor currently has two modes; [**Design** mode](design-mode) for creating your machines and [**Simulate** mode](simulate-mode) for simulating how your machine works.
-:::video
+
[Learn how to use Stately in our quick introduction video (7m36s)](https://www.youtube.com/watch?v=EzYIerEutgk).
-:::
+
### Quick start tutorials
@@ -47,7 +51,7 @@ When you first visit the Editor, you’ll be shown two short videos (7m36s) as a
### Projects and teams
-
+{/*
-
+ */}
-As a [premium user](https://stately.ai/pricing), you can create and join teams in Stately Studio to share your machines and collaborate on private team projects. [Read more about Projects](projects.mdx) and [Teams](teams.mdx).
+
-
+As a [premium user](https://stately.ai/pricing), you can create and join teams in Stately Studio to share your machines and collaborate on private team projects. [Read more about Projects](projects) and [Teams](teams).
+
+{/*
-
+ */}
+
+
### Discover machines
-Are you seeking inspiration for your machine? Or do you want to learn from how somebody else models their machines? The [Discover page](https://stately.ai/registry/discover) lists all the public machines created with Stately Studio. [Read more about the Discover page](discover.mdx).
+Are you seeking inspiration for your machine? Or do you want to learn from how somebody else models their machines? The [Discover page](https://stately.ai/registry/discover) lists all the public machines created with Stately Studio. [Read more about the Discover page](discover).
-
+{/*
-
+ */}
+
+
## Our roadmap
diff --git a/docs/system.mdx b/content/docs/system.mdx
similarity index 92%
rename from docs/system.mdx
rename to content/docs/system.mdx
index 86ee78097..9a36abc45 100644
--- a/docs/system.mdx
+++ b/content/docs/system.mdx
@@ -10,14 +10,14 @@ In XState, a system is implicitly created from the root actor, which is the acto
import { createMachine, createActor } from 'xstate';
const machine = createMachine({
- // highlight-next-line
+ // [!code highlight:1]
entry: ({ system }) => {
// ...
},
});
const actor = createActor(machine).start();
-// highlight-next-line
+// [!code highlight:1]
actor.system;
```
@@ -35,11 +35,11 @@ actor.start();
This is useful for actors in the system to be able send events to the root actor.
-:::studio
+
Coming soon… systems in Stately Studio’s editor 🤫
-:::
+
## Actor registration
@@ -54,7 +54,7 @@ const formMachine = createMachine({
// ...
on: {
submit: {
- // highlight-next-line
+ // [!code highlight:1]
actions: sendTo(({ system }) => system.get('notifier'), {
type: 'notify',
message: 'Form submitted!',
@@ -65,7 +65,7 @@ const formMachine = createMachine({
const feedbackMachine = createMachine({
invoke: {
- // highlight-next-line
+ // [!code highlight:1]
systemId: 'formMachine',
src: formMachine,
},
@@ -97,7 +97,7 @@ const todosMachine = createMachine({
actions: assign({
todos: ({ context, spawn }) => {
const newTodo = spawn(todoMachine, {
- // highlight-next-line
+ // [!code highlight:1]
systemId: `todo-${context.todos.length}`,
});
@@ -121,13 +121,13 @@ You can also reference a specific actor from the system using `system.get('actor
## Systems and TypeScript
-:::typescript
+
**XState v5 requires TypeScript version 5.0 or greater.**
-For best results, use the latest TypeScript version. [Read more about XState and TypeScript](typescript.mdx)
+For best results, use the latest TypeScript version. [Read more about XState and TypeScript](typescript)
-:::
+
- `invoke.systemId`
- `spawn(thing, { systemId })`
@@ -142,14 +142,14 @@ For best results, use the latest TypeScript version. [Read more about XState and
import { createMachine, createActor } from 'xstate';
const machine = createMachine({
- // highlight-next-line
+ // [!code highlight:1]
entry: ({ system }) => {
// ...
},
});
const actor = createActor(machine).start();
-// highlight-next-line
+// [!code highlight:1]
actor.system;
```
@@ -159,7 +159,7 @@ actor.system;
import { createActor } from 'xstate';
const actor = createActor(machine, {
- // highlight-next-line
+ // [!code highlight:1]
systemId: 'root-id',
});
@@ -175,7 +175,7 @@ const formMachine = createMachine({
// ...
on: {
submit: {
- // highlight-next-line
+ // [!code highlight:1]
actions: sendTo(({ system }) => system.get('notifier'), {
type: 'notify',
message: 'Form submitted!',
@@ -186,7 +186,7 @@ const formMachine = createMachine({
const feedbackMachine = createMachine({
invoke: {
- // highlight-next-line
+ // [!code highlight:1]
systemId: 'formMachine',
src: formMachine,
},
@@ -218,7 +218,7 @@ const todosMachine = createMachine({
actions: assign({
todos: ({ context, spawn }) => {
const newTodo = spawn(todoMachine, {
- // highlight-next-line
+ // [!code highlight:1]
systemId: `todo-${context.todos.length}`,
});
diff --git a/docs/tags.mdx b/content/docs/tags.mdx
similarity index 94%
rename from docs/tags.mdx
rename to content/docs/tags.mdx
index 4631afa5d..eb8630e8d 100644
--- a/docs/tags.mdx
+++ b/content/docs/tags.mdx
@@ -35,13 +35,13 @@ console.log(feedbackActor.getSnapshot().hasTag('visible'));
## Tags and TypeScript
-:::typescript
+
**XState v5 requires TypeScript version 5.0 or greater.**
-For best results, use the latest TypeScript version. [Read more about XState and TypeScript](typescript.mdx)
+For best results, use the latest TypeScript version. [Read more about XState and TypeScript](typescript)
-:::
+
You can strongly type the `tags` of your machine in the `types.tags` property of the machine setup.
@@ -50,7 +50,7 @@ import { setup } from 'xstate';
const machine = setup({
types: {
- // highlight-next-line
+ // [!code highlight:1]
tags: {} as 'pending' | 'success' | 'error',
},
}).createMachine({
diff --git a/docs/teams.mdx b/content/docs/teams.mdx
similarity index 91%
rename from docs/teams.mdx
rename to content/docs/teams.mdx
index c7eb459b8..3d103df36 100644
--- a/docs/teams.mdx
+++ b/content/docs/teams.mdx
@@ -3,9 +3,11 @@ title: Teams
description: 'You can create and join teams in Stately Studio to share and collaborate on team projects.'
---
+import { MoreHorizontal } from 'lucide-react';
+
You can create and join teams in Stately Studio to share and collaborate on team projects.
-
+{/*
-
+ */}
+
+
-:::studio
+
-Teams and shared projects are [Team features](studio-team-plan.mdx) of Stately Studio. [Check out the features on our Team plan](https://stately.ai/pricing) or [upgrade to the Team plan](https://stately.ai/registry/billing).
+Teams and shared projects are [Team features](studio-team-plan) of Stately Studio. [Check out the features on our Team plan](https://stately.ai/pricing) or [upgrade to the Team plan](https://stately.ai/registry/billing).
-:::
+
## Team roles
@@ -85,11 +89,11 @@ Users with the Editor role can:
### Viewer role
-:::studio
+
A Viewer is free of charge and does not count toward your number of seats.
-:::
+
Users with the Viewer role can:
@@ -121,11 +125,11 @@ You need to have [enough seats on your Pro plan](#teams-members-and-the-availabl
The invitation will be sent to the invitee’s email address. The invitee will appear as a team member in the **Pending** section of the **Members** page until they accept the invitation. Once the invitation is accepted, the team member will be listed on the **Members** page, organized by role.
-:::studio
+
A subscription seat is only taken up at the time of accepting the invitation. Any particular team member is considered to occupy a single seat even if they are a member of more than one team.
-:::
+
## Change a team member’s role
@@ -166,7 +170,7 @@ Only team owners can delete a team.
Shared projects can be created and worked on between team members of any given team. Team projects are listed inside their Team in the Stately Studio workspace. Projects are Private by default, but can be made Public or Unlisted.
-
+{/*
-
+ */}
+
+
#### Create a shared team project
diff --git a/docs/templates.mdx b/content/docs/templates.mdx
similarity index 100%
rename from docs/templates.mdx
rename to content/docs/templates.mdx
diff --git a/docs/testing.mdx b/content/docs/testing.mdx
similarity index 93%
rename from docs/testing.mdx
rename to content/docs/testing.mdx
index d752b9b2a..07bdeaa00 100644
--- a/docs/testing.mdx
+++ b/content/docs/testing.mdx
@@ -52,11 +52,11 @@ test('some actor', async () => {
});
```
-:::studio
+
-You can now [generate test paths from your state machines in Stately Studio](generate-test-paths.mdx). You can try Stately Studio’s premium plans with a free trial. [Check out the features on our Pro plan](studio-pro-plan.mdx), [Team plan](studio-team-plan.mdx), [Enterprise plan](studio-enterprise-plan.mdx) or [upgrade your existing plan](https://stately.ai/registry/billing).
+You can now [generate test paths from your state machines in Stately Studio](generate-test-paths). You can try Stately Studio’s premium plans with a free trial. [Check out the features on our Pro plan](studio-pro-plan), [Team plan](studio-team-plan), [Enterprise plan](studio-enterprise-plan) or [upgrade your existing plan](https://stately.ai/registry/billing).
-:::
+
## Testing actors
@@ -200,10 +200,10 @@ test('mocking promise actors', async () => {
## Using `@xstate/test`
-:::warning
+
The XState Test model-based testing utilities have moved into `xstate` itself and are now available under `xstate/graph`. The standalone `@xstate/test` package is deprecated in favor of the integrated testing utilities.
-:::
+
The model-based testing utilities allow you to automatically generate test cases from your state machines, ensuring comprehensive coverage of all possible paths and edge cases.
diff --git a/docs/transition-actors.mdx b/content/docs/transition-actors.mdx
similarity index 98%
rename from docs/transition-actors.mdx
rename to content/docs/transition-actors.mdx
index 2b6562f4f..4ef6222f4 100644
--- a/docs/transition-actors.mdx
+++ b/content/docs/transition-actors.mdx
@@ -72,16 +72,15 @@ import { fromTransition, createActor } from 'xstate';
const countLogic = fromTransition(
(state, event) => {
// ...
- // highlight-start
+ // [!code highlight:5]
},
({ input }: { input: number }) => ({
count: input, // Initial state
}),
);
-// highlight-end
const countActor = createActor(countLogic, {
- // highlight-next-line
+ // [!code highlight:1]
input: 42,
});
diff --git a/docs/transitions.mdx b/content/docs/transitions.mdx
similarity index 89%
rename from docs/transitions.mdx
rename to content/docs/transitions.mdx
index 3d4f26efb..9e702ad83 100644
--- a/docs/transitions.mdx
+++ b/content/docs/transitions.mdx
@@ -6,11 +6,11 @@ A **transition** is a change from one finite state to another, triggered by an e
An **event** is a signal, trigger, or message that causes a transition. When an actor receives an event, its machine will determine if there are any enabled transitions for that event in the current state. If enabled transitions exist, the machine will take them and execute their actions.
-:::studio
+
You can visualize your state machines and easily add transitions in our drag-and-drop Stately editor. [Read more about transitions in Stately's editor](/docs/editor-states-and-transitions/#transitions-and-events).
-:::
+
-:::studio
+
You can easily visualize self-transitions in Stately's editor. [Read more about self-transitions in Stately's editor](/docs/editor-states-and-transitions/#self-transitions).
-:::
+
## Transitions between states
@@ -144,14 +142,13 @@ const feedbackMachine = createMachine({
form: {
on: {
submit: {
- // highlight-start
+ // [!code highlight:2]
// Target is the key of the sibling state
target: 'submitting',
- // highlight-end
},
},
},
- // highlight-next-line
+ // [!code highlight:1]
submitting: {
// ...
},
@@ -189,7 +186,7 @@ const machine = createMachine({
},
on: {
'mode.reset': {
- // highlight-next-line
+ // [!code highlight:1]
target: '.system',
},
},
@@ -198,15 +195,15 @@ const machine = createMachine({
## Re-entering
-By default, when a state machine transitions from some state to the same state or from a parent state to a descendent (child, grandchild, etc.) of that parent state, it will not re-enter the state; that is, it will not execute the [`exit` and `entry` actions](actions.mdx) of the parent state. It will not stop existing invoked actors or start new invoked actors.
+By default, when a state machine transitions from some state to the same state or from a parent state to a descendent (child, grandchild, etc.) of that parent state, it will not re-enter the state; that is, it will not execute the [`exit` and `entry` actions](actions) of the parent state. It will not stop existing invoked actors or start new invoked actors.
This can be changed with the transition `reenter` property: if you want the parent state to be re-entered, you can set `reenter: true`. This will cause the state to re-enter when transitioning to itself or descendent states, executing the `exit` and `entry` actions of the state. It will stop existing invoked actors, and start new invoked actors.
-:::tip
+
In XState v4, re-entering transitions were known as **external transitions**, and the default transitions were known as **internal transitions**.
-:::
+
**Self-transitions with `reenter: true`:**
@@ -321,10 +318,9 @@ const feedbackMachine = createMachine({
states: {
asleep: {
on: {
- // highlight-start
+ // [!code highlight:2]
// This transition will match any event
'*': { target: 'awake' },
- // highlight-end
},
},
awake: {},
@@ -351,12 +347,11 @@ const feedbackMachine = createMachine({
states: {
prompt: {
on: {
- // highlight-start
+ // [!code highlight:4]
// This will match the 'feedback' event as well as
// any event that starts with 'feedback.', e.g.:
// 'feedback.good', 'feedback.bad', etc.
'feedback.*': { target: 'form' },
- // highlight-end
},
},
form: {},
@@ -426,7 +421,7 @@ const machine = createMachine({
on: {
// This event will transition both regions to specific states
'set.dark.custom': {
- // highlight-next-line
+ // [!code highlight:1]
target: ['.mode.dark', '.theme.custom'],
},
// This event will transition one region while leaving the other unchanged
@@ -445,8 +440,8 @@ In this example:
## Other transitions
-- [**Eventless (always) transitions**](eventless-transitions.mdx) are transitions without events. These transitions are _always_ taken after any transition in their state is enabled.
-- [**Delayed (after) transitions**](delayed-transitions.mdx) are transitions that are enabled after a specified duration.
+- [**Eventless (always) transitions**](eventless-transitions) are transitions without events. These transitions are _always_ taken after any transition in their state is enabled.
+- [**Delayed (after) transitions**](delayed-transitions) are transitions that are enabled after a specified duration.
## Transition descriptions
@@ -459,7 +454,7 @@ const feedbackMachine = createMachine({
// ...
on: {
exit: {
- // highlight-next-line
+ // [!code highlight:1]
description: 'Closes the feedback form',
target: '.closed',
},
@@ -479,11 +474,10 @@ const feedbackMachine = createMachine({
states: {
prompt: {
on: {
- // highlight-start
+ // [!code highlight:3]
// This is shorthand for:
// 'feedback': { target: 'form' }
'feedback.good': 'thanks',
- // highlight-end
},
},
thanks: {},
@@ -496,13 +490,13 @@ Using the string target shorthand is useful for quickly prototyping state machin
## TypeScript
-:::typescript
+
**XState v5 requires TypeScript version 5.0 or greater.**
-For best results, use the latest TypeScript version. [Read more about XState and TypeScript](typescript.mdx)
+For best results, use the latest TypeScript version. [Read more about XState and TypeScript](typescript)
-:::
+
Transitions mainly use the event type that they are enabled by.
@@ -511,9 +505,8 @@ import { setup } from 'xstate';
const machine = setup({
types: {
- // highlight-start
+ // [!code highlight:1]
events: {} as { type: 'greet'; message: string } | { type: 'submit' },
- // highlight-end
},
}).createMachine({
// ...
@@ -528,14 +521,14 @@ const machine = setup({
});
```
-## Frequently asked questions {#faqs}
+## Frequently asked questions [#faqs]
How can I listen for events sent to actors?
-You can use the [inspection API](./inspection.mdx) to listen for all inspection events in an actor system. The `@xstate.event` inspection event contains information about events sent from one actor to another (or itself):
+You can use the [inspection API](./inspection) to listen for all inspection events in an actor system. The `@xstate.event` inspection event contains information about events sent from one actor to another (or itself):
```ts
import { createActor } from 'xstate';
@@ -544,10 +537,9 @@ import { someMachine } from './someMachine';
const actor = createActor(someMachine, {
inspect: (inspectionEvent) => {
if (inspectionEvent.type === '@xstate.event') {
- // highlight-start
+ // [!code highlight:2]
// The event object sent from one actor to another
console.log(inspectionEvent.event);
- // highlight-end
}
},
});
@@ -620,24 +612,11 @@ const machine = createMachine({
});
```
-## Pure transition functions
+## Transitioning state
_Since XState version 5.19.0_
-You can compute the next state and actions of a state machine without creating a live actor using the pure `transition(machine, state, event)` and `initialTransition(machine)` functions. These functions return `[nextState, actions]` tuples that represent what would happen during a transition, but without executing any side effects.
-
-This is useful for:
-
-- Server-side applications and API endpoints
-- Testing state machine logic
-- State previews and debugging
-- Scenarios where you need deterministic behavior
-
-:::tip
-
-For comprehensive documentation on pure transition functions, see the [Pure transition functions](/docs/pure-transitions) guide.
-
-:::
+When you create a state machine actor, the next state is determined by the machine's current state and the event that is sent to the actor. However, you can also determine the next **state** and **actions** from the current state and event by using the pure `transition(machine, state, event)` and `initialTransition(machine)` functions:
```ts
import { createMachine, initialTransition, transition } from 'xstate';
@@ -657,19 +636,29 @@ const machine = createMachine({
});
const [initialState, initialActions] = initialTransition(machine);
+
+console.log(initialState.value);
+// logs 'pending'
+
+console.log(initialActions);
+// logs []
+
const [nextState, actions] = transition(machine, initialState, {
type: 'start',
});
-console.log(nextState.value); // 'started'
-console.log(actions); // [{ type: 'doSomething', … }]
+console.log(nextState.value);
+// logs 'started'
+
+console.log(actions);
+// logs [{ type: 'doSomething', … }]
```
## Determining the next state
-:::warning
+
It is recommended to use the `initialTransition(…)` and `transition(…)` functions instead of `getNextSnapshot(…)` and `getInitialSnapshot(…)`, which will be deprecated.
-:::
+
When you create a state machine actor, the next state is determined by the machine's current state and the event that is sent to the actor. If you want to determine the next state outside of the actor, you can use the `getNextSnapshot(…)` function:
diff --git a/content/docs/typegen.mdx b/content/docs/typegen.mdx
new file mode 100644
index 000000000..18c861c42
--- /dev/null
+++ b/content/docs/typegen.mdx
@@ -0,0 +1,11 @@
+---
+title: 'Typegen'
+---
+
+
+
+Typegen is not supported in XState version 5.
+
+
+
+Typegen is not supported in XState version 5.
diff --git a/docs/typescript.mdx b/content/docs/typescript.mdx
similarity index 91%
rename from docs/typescript.mdx
rename to content/docs/typescript.mdx
index 6dee08678..171ca62cb 100644
--- a/docs/typescript.mdx
+++ b/content/docs/typescript.mdx
@@ -4,13 +4,13 @@ title: TypeScript
XState v5 and its related libraries are written in [TypeScript](https://www.typescriptlang.org), and utilize complex types to provide the best type safety and inference possible for you.
-:::typescript
+
**XState v5 requires TypeScript version 5.0 or greater.**
For best results, use the **latest TypeScript version**.
-:::
+
Follow these guidelines to ensure that your TypeScript project is ready to use XState v5:
@@ -32,12 +32,12 @@ Use the latest version of TypeScript; version 5.0 or greater is required.
{
compilerOptions: {
// ...
- // highlight-next-line
+ // [!code highlight:1]
strictNullChecks: true,
// or set `strict` to true, which includes `strictNullChecks`
// "strict": true,
- // highlight-next-line
+ // [!code highlight:1]
skipLibCheck: true,
},
}
@@ -65,7 +65,7 @@ const feedbackMachine = setup({
});
```
-You can also specify TypeScript types inside the [machine config](machines.mdx) using the `.types` property:
+You can also specify TypeScript types inside the [machine config](machines) using the `.types` property:
```ts
import { createMachine } from 'xstate';
@@ -83,7 +83,7 @@ These types will be inferred throughout the machine config and in the created ma
## Dynamic parameters
-It is recommended to use dynamic parameters in [actions](./actions.mdx) and [guards](./guards.mdx) as they allow you to make reusable functions that are not closely tied to the machine, and are strongly-typed.
+It is recommended to use dynamic parameters in [actions](./actions) and [guards](./guards) as they allow you to make reusable functions that are not closely tied to the machine, and are strongly-typed.
```ts
import { setup } from 'xstate';
@@ -119,11 +119,11 @@ const feedbackMachine = setup({
### Actions and Guards
-:::info
+
It is strongly recommended to use dynamic parameters instead of directly accessing the event object whenever possible for improved type safety and reusability.
-:::
+
If using dynamic parameters is infeasible and you must use the event in an action or guard implementation, you can assert the event type using the `assertEvent(...)` helper function:
@@ -146,7 +146,7 @@ const machine = createMachine({
// Calling `assertEvent` will throw if
// the event is not the expected type.
- // highlight-next-line
+ // [!code highlight:1]
assertEvent(event, 'greet');
// Now we know the event is a `greet` event,
@@ -156,7 +156,7 @@ const machine = createMachine({
// ...
exit: ({ event }) => {
// You can also assert multiple possible event types.
- // highlight-next-line
+ // [!code highlight:1]
assertEvent(event, ['greet', 'log']);
// Now we know the event is a `greet` or `log` event,
@@ -192,7 +192,7 @@ const machine = createMachine({
invoke: {
src: 'someActor',
input: ({ event }) => {
- // highlight-next-line
+ // [!code highlight:1]
assertEvent(event, 'messageSent');
return { message: event.message };
@@ -244,6 +244,6 @@ type SomeEvent = EventFromLogic;
## Typegen
-[Typegen](/docs/developer-tools#xstate-typegen-files) does not yet support XState v5. However, with the `setup(...)` function and/or the `.types` property explained above, you can provide strong typing for most (if not all) of your machine.
+[Typegen](/docs/developer-tools#xstate-typegen-files) is not supported in XState version 5. However, with the `setup(...)` function and/or the `.types` property explained above, you can provide strong typing for most (if not all) of your machine.
If you were previously using typegen to narrow down events used in actions or guards, you can use [the `assertEvent(...)` helper function](#asserting-events) to narrow down the event type.
diff --git a/versioned_docs/version-4/upgrade.mdx b/content/docs/upgrade.mdx
similarity index 60%
rename from versioned_docs/version-4/upgrade.mdx
rename to content/docs/upgrade.mdx
index 3d524b82a..83fa72399 100644
--- a/versioned_docs/version-4/upgrade.mdx
+++ b/content/docs/upgrade.mdx
@@ -2,17 +2,19 @@
title: Upgrade your Stately Studio account
---
+import { CircleDollarSign, ThemedImage } from 'lucide-react';
+
# Upgrade
-**Stately Studio will always be free to our Community users** on the [Community plan](studio-community-plan.mdx), and we will make many future features available on every plan.
+**Stately Studio will always be free to our Community users** on the [Community plan](studio-community-plan), and we will make many future features available on every plan.
-We offer a **free trial** on the Stately Studio [Pro](studio-pro-plan.mdx), [Team](studio-team-plan.mdx), or [Enterprise](studio-enterprise-plan.mdx) plans so you can explore how our premium features work for you and your team. You can [upgrade](upgrade.mdx) when you’re signed into Stately Studio.
+We offer a **free trial** on the Stately Studio [Pro](studio-pro-plan), [Team](studio-team-plan), or [Enterprise](studio-enterprise-plan) plans so you can explore how our premium features work for you and your team. You can [upgrade](upgrade) when you’re signed into Stately Studio.
## Upgrade to a Pro or Team plan
-You can [upgrade](upgrade.mdx) when you’re signed into Stately Studio using the **Upgrade** button in the editor’s footer.
+You can [upgrade](upgrade) when you’re signed into Stately Studio using the **Upgrade** button in the editor’s footer.
-
+{/*
-
+ */}
+
+
## Upgrade to an Enterprise plan
@@ -36,7 +40,7 @@ You can [upgrade](upgrade.mdx) when you’re signed into Stately Studio using th
- From the editor, use the Editor menu, and from the **Account** section, select **Billing**.
- From elsewhere in the Studio, select your avatar from the header and choose **Billing** from the account menu.
-
+{/*
-
+ */}
+
+
diff --git a/docs/url.mdx b/content/docs/url.mdx
similarity index 87%
rename from docs/url.mdx
rename to content/docs/url.mdx
index d694dab2c..bfd2ccd4e 100644
--- a/docs/url.mdx
+++ b/content/docs/url.mdx
@@ -23,7 +23,7 @@ You can copy the machine URL from the browser address bar, which will share the
1. Use the **Share** button in Stately Studio’s top bar to open the Share dialog.
2. Use the **Copy share URL** button to copy the machine’s URL to your clipboard.
-
+{/* TODO: add image illustrating above */}
## Machine URL parameters
@@ -31,4 +31,4 @@ Depending on where you copy your URL from, it may contain the following paramete
- **machineId**: the unique ID for the machine. For example, `machineId=491a4c60-5300-4e22-92cf-8a32a8ffffca`.
- **mode**: the current machine mode. For example, `mode=Simulate`.
-- **version**: the current [machine version](versions.mdx). For example, `version=78730cff-1e90-4190-9e41-426733b71c9f`.
+- **version**: the current [machine version](versions). For example, `version=78730cff-1e90-4190-9e41-426733b71c9f`.
diff --git a/versioned_docs/version-4/user-preferences.mdx b/content/docs/user-preferences.mdx
similarity index 95%
rename from versioned_docs/version-4/user-preferences.mdx
rename to content/docs/user-preferences.mdx
index 4b7f6707a..8c8366e2b 100644
--- a/versioned_docs/version-4/user-preferences.mdx
+++ b/content/docs/user-preferences.mdx
@@ -2,6 +2,8 @@
title: User preferences
---
+import { Sun, Moon, Sparkle } from 'lucide-react';
+
We have some simple user preferences to help you customize Stately Studio to fit your needs.
## Light mode and dark mode
@@ -20,11 +22,11 @@ Switch between the light and dark mode setting here in the docs to preview the m
1. Use your avatar button in the top right of Stately Studio to open the user menu.
2. Use the setting to either **Switch to light mode** or **Switch to dark mode**.
-:::studio
+
We plan to set light mode and dark mode according to your operating system preferences in the future. Please [upvote this feature in our roadmap](https://feedback.stately.ai/editor/p/automatic-lightdark-mode-based-on-system-preferences) if it’s a priority for you.
-:::
+
## Translucency
diff --git a/docs/versions.mdx b/content/docs/versions.mdx
similarity index 90%
rename from docs/versions.mdx
rename to content/docs/versions.mdx
index 1a7db1c9f..1af9c25c7 100644
--- a/docs/versions.mdx
+++ b/content/docs/versions.mdx
@@ -2,27 +2,28 @@
title: Version history
---
-# Version history
+import { History, ArchiveRestore, X, Copy, Trash, Info } from 'lucide-react';
+
Version history is helpful if you want to save checkpoints while modeling machines or mirror version changes in the rest of your codebase. New versions can be saved from the current machine using the **Version history** panel in the lower left of the canvas.
All users can view versions of public machines. Users on our premium plans can view and create versions for machines in team projects and their own machines in **My Projects**. [Read more about team roles and versions](#team-roles-and-versions).
-:::studio
+
-Version history is a premium feature of Stately Studio. You can try Stately Studio’s premium plans with a free trial. [Check out the features on our Pro plan](studio-pro-plan.mdx), [Team plan](studio-team-plan.mdx), [Enterprise plan](studio-enterprise-plan.mdx) or [upgrade your existing plan](https://stately.ai/registry/billing).
+Version history is a premium feature of Stately Studio. You can try Stately Studio’s premium plans with a free trial. [Check out the features on our Pro plan](studio-pro-plan), [Team plan](studio-team-plan), [Enterprise plan](studio-enterprise-plan) or [upgrade your existing plan](https://stately.ai/registry/billing).
-:::
+
## Save a version
Save a new version of your machine from the **Version history** panel in the lower left corner of the canvas.
-:::tip
+
The **Save** button will be disabled unless you have changed your machine since you created the latest version.
-:::
+
Versions are named sequentially by default and have the version creator’s avatar. The version’s timestamp is always shown under the version name.
@@ -63,11 +64,11 @@ You can return to viewing the current version of your machine from the **Version history** panel using the restore icon button or using the **Restore** button in the top bar when [viewing a version](#view-a-version).
-:::tip
+
-You cannot restore a version when a machine is [locked](lock-machines.mdx). Unlock the machine from the machine **Details** panel to re-enable restoring versions.
+You cannot restore a version when a machine is [locked](lock-machines). Unlock the machine from the machine **Details** panel to re-enable restoring versions.
-:::
+
## Create a new machine from a version
diff --git a/docs/visualizer.mdx b/content/docs/visualizer.mdx
similarity index 83%
rename from docs/visualizer.mdx
rename to content/docs/visualizer.mdx
index 331945b68..c59802dec 100644
--- a/docs/visualizer.mdx
+++ b/content/docs/visualizer.mdx
@@ -1,33 +1,32 @@
---
-title: Visualizer
+title: Visualizer (deprecated)
---
-# Visualizer (Legacy)
-:::studio
+
Are you looking for the _Stately Studio_ visual _editor_? Check out the [Stately Studio overview](/).
-:::
+
-
+
The [Stately Visualizer](https://stately.ai/viz) is a tool for creating and inspecting statecharts to visualize the state of your applications. You can use the viz as a playground for exploring XState’s capabilities.
-:::warning
+
The XState Visualizer is deprecated and is no longer maintained.
-:::
+
-We recommend you only continue using the legacy visualizer if you need to execute actions and guards or visualize multiple machines simultaneously. These features are coming to the [Stately editor](studio.mdx) very soon.
+We recommend you only continue using the legacy visualizer if you need to execute actions and guards or visualize multiple machines simultaneously. These features are coming to the [Stately editor](studio) very soon.
## Use the Visualizer
- [Take me to the Visualizer](https://stately.ai/viz)
- [Try the Visualizer in Inspect mode](https://stately.ai/viz?inspect).
-The Visualizer is deprecated and we encourage you to migrate your projects to use the [Stately editor](studio.mdx).
+The Visualizer is deprecated and we encourage you to migrate your projects to use the [Stately editor](studio).
## Feedback and bug reports
diff --git a/docs/xstate-fsm.mdx b/content/docs/xstate-fsm.mdx
similarity index 91%
rename from docs/xstate-fsm.mdx
rename to content/docs/xstate-fsm.mdx
index 790953618..e4c2d1124 100644
--- a/docs/xstate-fsm.mdx
+++ b/content/docs/xstate-fsm.mdx
@@ -3,10 +3,10 @@ title: '@xstate/fsm'
description: 'The @xstate/fsm package is deprecated in XState v5. Use XState instead.'
---
-:::warning
+
The [@xstate/fsm package](https://github.com/statelyai/xstate/tree/main/packages/xstate-fsm) is deprecated in XState v5. Use [XState](https://github.com/statelyai/xstate) instead.
-:::
+
[Read the @xstate/fsm docs for XState v4](/docs/xstate-v4/xstate/packages/xstate-fsm).
diff --git a/versioned_docs/version-4/xstate/packages/xstate-graph.mdx b/content/docs/xstate-graph.mdx
similarity index 94%
rename from versioned_docs/version-4/xstate/packages/xstate-graph.mdx
rename to content/docs/xstate-graph.mdx
index 5382a9de8..433b965ba 100644
--- a/versioned_docs/version-4/xstate/packages/xstate-graph.mdx
+++ b/content/docs/xstate-graph.mdx
@@ -1,18 +1,7 @@
---
title: '@xstate/graph'
-description: 'The @xstate/graph package contains graph algorithms and utilities for XState machines. Learn how to install and use @xstate/graph.'
---
-:::warning
-
-**Docs for XState v4 are no longer maintained**
-
-This page is no longer maintained as [XState V5 has been released](/blog/2023-12-01-xstate-v5).
-
-[Read about the `@xstate/graph package` in XState v5](/docs/xstate-graph).
-
-:::
-
The [@xstate/graph package](https://github.com/statelyai/xstate/tree/main/packages/xstate-graph) contains graph algorithms and utilities for XState machines.
## Quick start
@@ -40,7 +29,7 @@ const paths = getSimplePaths(machine);
#### Arguments
- `machine` - the [`Machine`](https://xstate.js.org/docs/guides/machines.html) to traverse
-- `options` (optional) - [options](/#options) that customize how the algorithm will traverse the machine
+- `options` (optional) - [options](#options) that customize how the algorithm will traverse the machine
Returns the [shortest paths (Dijkstra's algorithm)](https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm) of a [machine](https://xstate.js.org/docs/guides/machines.html) from the initial state to every other state as a mapped object, where the:
@@ -164,7 +153,7 @@ console.log(shortestPaths);
Arguments:
- `machine` - the [`Machine`](https://xstate.js.org/docs/guides/machines.html) to traverse
-- `options` (optional) - [options](/#options) that customize how the algorithm will traverse the machine
+- `options` (optional) - [options](#options) that customize how the algorithm will traverse the machine
Returns the [simple paths]() of a [machine](https://xstate.js.org/docs/guides/machines.html) as a mapped object, where the:
@@ -317,7 +306,7 @@ Returns a path object with the following keys:
```js
import { createMachine } from 'xstate';
-import { getSimplePaths } from '@xstate/graph';
+import { getPathsFromEvents } from '@xstate/graph';
const feedbackMachine = createMachine({
id: 'feedback',
@@ -350,7 +339,7 @@ const feedbackMachine = createMachine({
},
});
-const path = getPathFromEvents(feedbackMachine, [
+const path = getPathsFromEvents(feedbackMachine, [
{ type: 'CLICK_GOOD' },
{ type: 'SUBMIT' },
{ type: 'CLOSE' },
diff --git a/docs/xstate-immer.mdx b/content/docs/xstate-immer.mdx
similarity index 89%
rename from docs/xstate-immer.mdx
rename to content/docs/xstate-immer.mdx
index e27d791c1..05182219a 100644
--- a/docs/xstate-immer.mdx
+++ b/content/docs/xstate-immer.mdx
@@ -3,10 +3,10 @@ title: '@xstate/immer'
description: 'The @xstate/immer is deprecated in XState v5.'
---
-:::warning
+
The [@xstate/immer package](https://github.com/statelyai/xstate/tree/main/packages/xstate-immer) is deprecated in XState v5.
-:::
+
[Read the @xstate/immer docs for XState v4](/docs/xstate-v4/xstate/packages/xstate-immer).
diff --git a/docs/xstate-react.mdx b/content/docs/xstate-react.mdx
similarity index 94%
rename from docs/xstate-react.mdx
rename to content/docs/xstate-react.mdx
index 069b1e5b3..d5376701a 100644
--- a/docs/xstate-react.mdx
+++ b/content/docs/xstate-react.mdx
@@ -15,45 +15,45 @@ Use the following templates to get started quickly with XState and React:
Install the latest versions of both `xstate` and `@xstate/react`. `xstate` is a peer dependency of `@xstate/react`.
-
-
+
+
```bash
npm install xstate @xstate/react
```
-
+
-
+
```bash
pnpm install xstate @xstate/react
```
-
+
-
+
```bash
yarn add xstate @xstate/react
```
-
+
-
+
```bash
bun add xstate @xstate/react
```
-
+
-:::studio
+
-Want to get started with React extra fast? Try the [generate React app feature in Stately Studio](generate-react.mdx).
+Want to get started with React extra fast? Try the [generate React app feature in Stately Studio](generate-react).
-:::
+
## Examples
@@ -89,7 +89,7 @@ const promiseLogic = fromPromise(async () => {
});
function Component() {
- // highlight-next-line
+ // [!code highlight:1]
const [state, send] = useActor(promiseLogic);
if (state.status === 'done') {
@@ -108,15 +108,15 @@ function Component() {
A [React hook](https://reactjs.org/hooks) that creates an actor from the given `machine` and starts an actor that runs for the lifetime of the component.
-:::info
+
The `useMachine(...)` hook is an alias for the `useActor(...)` hook.
-:::
+
#### Arguments
-- `machine` - An [XState machine](machines.mdx)
+- `machine` - An [XState machine](machines)
- `options?` (optional) - Actor options.
**Returns** a tuple of `[snapshot, send, actorRef]`:
@@ -237,12 +237,12 @@ Returns a [React Context object](https://beta.reactjs.org/learn/passing-data-dee
#### Arguments
-- `logic` - Actor logic, like an [XState machine](machines.mdx)
+- `logic` - Actor logic, like an [XState machine](machines)
Returns a React Context object that contains the following properties:
- `Provider` - a React Context Provider component with the following props:
- - `logic` - Actor logic, such as an [XState machine](machines.mdx) ,that must be of the same type as the actor logic passed to `createActorContext(...)`
+ - `logic` - Actor logic, such as an [XState machine](machines) ,that must be of the same type as the actor logic passed to `createActorContext(...)`
- `useSelector(selector, compare?)` - a React hook that takes in a `selector` function and optional `compare` function and returns the selected value from the actor snapshot
- `useActorRef()` - a React hook that returns the actor ref of the actor created from the actor `logic`
@@ -434,7 +434,7 @@ You can provide input to actors
## Matching states
-When using [hierarchical](parent-states.mdx) and [parallel](parallel-states.mdx) machines, the state values will be objects, not strings. In this case, it is best to use [`state.matches(...)`](states.mdx#statematchesstatevalue).
+When using [hierarchical](parent-states) and [parallel](parallel-states) machines, the state values will be objects, not strings. In this case, it is best to use [`state.matches(...)`](states.mdx#statematchesstatevalue).
We can do this with `if/else if/else` blocks:
diff --git a/docs/xstate-store-v2.mdx b/content/docs/xstate-store-v2.mdx
similarity index 88%
rename from docs/xstate-store-v2.mdx
rename to content/docs/xstate-store-v2.mdx
index 1fd135e39..960145302 100644
--- a/docs/xstate-store-v2.mdx
+++ b/content/docs/xstate-store-v2.mdx
@@ -4,40 +4,40 @@ title: '@xstate/store'
**Version 2.x** ([Version 3.x docs](./xstate-store))
-XState Store is a small library for simple state management in JavaScript/TypeScript applications. It is meant for updating store data using **events** for vanilla JavaScript/TypeScript apps, React apps, and more. It is comparable to libraries like Zustand, Redux, and Pinia. For more complex state management, you should use [XState](./xstate.mdx) instead, or you can [use XState Store with XState](#using-xstate-store-with-xstate).
+XState Store is a small library for simple state management in JavaScript/TypeScript applications. It is meant for updating store data using **events** for vanilla JavaScript/TypeScript apps, React apps, and more. It is comparable to libraries like Zustand, Redux, and Pinia. For more complex state management, you should use [XState](./xstate) instead, or you can [use XState Store with XState](#using-xstate-store-with-xstate).
-:::info
+
The `@xstate/store` library requires TypeScript version 5.4 or above.
-:::
+
## Installation
-
-
+
+
```bash
npm install @xstate/store
```
-
+
-
+
```bash
pnpm install @xstate/store
```
-
+
-
+
```bash
yarn add @xstate/store
```
-
+
## Quick start
@@ -95,7 +95,7 @@ To create a store, you need to pass an object to the `createStore(…)` function
- The keys are the event types (e.g. `"inc"`, `"add"`, `"changeName"`)
- The values are the `context` updates to apply when the event is sent to the store, as either an object or a function.
-Updating `context` in transitions is similar to using the [`assign` action](./context.mdx) in XState. You can update specific `context` properties by using an object:
+Updating `context` in transitions is similar to using the [`assign` action](./context) in XState. You can update specific `context` properties by using an object:
```ts
import { createStore } from '@xstate/store';
@@ -103,13 +103,12 @@ import { createStore } from '@xstate/store';
const store = createStore({
context: { count: 0, incremented: false /* ... */ },
on: {
- // highlight-start
+ // [!code highlight:5]
inc: {
count: (context, event: { by: number }) => context.count + event.by,
// Static values do not need to be wrapped in a function
incremented: true,
},
- // highlight-end
},
});
```
@@ -122,7 +121,7 @@ import { createStore } from '@xstate/store';
const store = createStore({
context: { count: 0, incremented: false /* ... */ },
on: {
- // highlight-start
+ // [!code highlight:8]
inc: (context, event: { by: number }) => {
// ...
@@ -131,7 +130,6 @@ const store = createStore({
incremented: true,
};
},
- // highlight-end
},
});
```
@@ -145,13 +143,12 @@ const store = createStore({
context: { count: 0, incremented: false /* ... */ },
on: {
reset: (context, event) => {
- // highlight-start
+ // [!code highlight:5]
// You can use `...context` to preserve other properties
return {
...context,
count: 0,
};
- // highlight-end
},
},
});
@@ -204,7 +201,7 @@ import { createStore } from '@xstate/store';
const store = createStore({
context: { name: 'David', count: 0 },
on: {
- // highlight-start
+ // [!code highlight:10]
updateName: (context, event: { name: string }) => {
return {
name: event.name,
@@ -215,7 +212,6 @@ const store = createStore({
return context.count + event.by;
},
},
- // highlight-end
},
});
@@ -239,15 +235,15 @@ import { createStore } from '@xstate/store';
const store = createStore({
types: {
- // highlight-next-line
+ // [!code highlight:1]
emitted: {} as { type: 'incremented'; by: number },
},
context: { count: 0 },
on: {
- // highlight-next-line
+ // [!code highlight:1]
inc: (context, event: { by: number }, { emit }) => {
if (event.by > 0) {
- // highlight-next-line
+ // [!code highlight:1]
emit({ type: 'incremented', by: event.by });
}
@@ -258,17 +254,16 @@ const store = createStore({
},
});
-// highlight-start
+// [!code highlight:4]
const sub = store.on('incremented', (event) => {
console.log(`Emitted by ${event.by}`);
// => logs "Emitted by 10"
});
-// highlight-end
store.send({ type: 'inc', by: 10 });
// Stop listening for emitted events
-// highlight-next-line
+// [!code highlight:1]
sub.unsubscribe();
```
@@ -278,27 +273,26 @@ Note that you can strongly type emitted events in the `types.emitted` property o
## Inspection
-Just like with XState, you can use the [Inspect API](./inspection.mdx) to inspect events sent to the store and state transitions within the store by using the .inspect method:
+Just like with XState, you can use the [Inspect API](./inspection) to inspect events sent to the store and state transitions within the store by using the .inspect method:
```ts
const store = createStore({
// ...
});
-// highlight-start
+// [!code highlight:5]
store.inspect((inspectionEvent) => {
// type: '@xstate.snapshot' or
// type: '@xstate.event'
console.log(inspectionEvent);
});
-// highlight-end
```
-:::info
+
Since the store is automatically started, inspectors will immediately receive the initial state snapshot.
-:::
+
The `.inspect(…)` method returns a subscription object:
@@ -311,10 +305,10 @@ const sub = store.inspect((inspectionEvent) => {
sub.unsubscribe();
```
-You can use the [Stately Inspector](./inspector.mdx) to inspect and visualize the state of the store.
+You can use the [Stately Inspector](./inspector) to inspect and visualize the state of the store.
```ts
-// highlight-next-line
+// [!code highlight:1]
import { createBrowserInspector } from '@statelyai/inspect';
import { createStore } from '@xstate/store';
@@ -322,13 +316,12 @@ const store = createStore({
// ...
});
-// highlight-start
+// [!code highlight:3]
const inspector = createBrowserInspector({
// ...
});
-// highlight-end
-// highlight-next-line
+// [!code highlight:1]
store.inspect(inspector);
```
@@ -338,28 +331,25 @@ If you want to use [Immer](https://immerjs.github.io/immer/) to update the `cont
```ts
import { createStoreWithProducer } from '@xstate/store';
-// highlight-next-line
+// [!code highlight:1]
import { produce } from 'immer';
const store = createStoreWithProducer(
- // highlight-start
+ // [!code highlight:2]
// Producer
produce,
- // highlight-end
{
context: { count: 0, todos: [] },
on: {
inc: (context, event: { by: number }) => {
- // highlight-start
+ // [!code highlight:2]
// No return; handled by Immer
context.count += event.by;
- // highlight-end
},
addTodo: (context, event: { todo: string }) => {
- // highlight-start
+ // [!code highlight:2]
// No return; handled by Immer
context.todos.push(event.todo);
- // highlight-end
},
},
},
@@ -376,7 +366,7 @@ If you are using React, you can use the `useSelector(store, selector)` hook to s
```tsx
import { createStore } from '@xstate/store';
-// highlight-next-line
+// [!code highlight:1]
import { useSelector } from '@xstate/store/react';
// Create a store
@@ -391,15 +381,14 @@ const store = createStore({
// Use the `useSelector` hook to subscribe to the store
function Component(props) {
- // highlight-next-line
+ // [!code highlight:1]
const count = useSelector(store, (state) => state.context.count);
// This component displays the count and has a button to increment it
return (
- // highlight-start Count: {count}
+ // [!code highlight:1]
store.send({ type: 'inc' })}>Increment
- // highlight-end
);
}
@@ -413,28 +402,26 @@ _Documentation coming soon!_
## Using XState Store with XState
-You may notice that stores are very similar to [actors in XState](./actors.mdx). This is very much by design. XState's actors are very powerful, but may also be too complex for simple use cases, which is why `@xstate/store` exists.
+You may notice that stores are very similar to [actors in XState](./actors). This is very much by design. XState's actors are very powerful, but may also be too complex for simple use cases, which is why `@xstate/store` exists.
However, if you have existing XState code, and you enjoy the simplicity of creating store logic with `@xstate/store`, you can use the `fromStore(context, transitions)` actor logic creator to create XState-compatible store logic that can be passed to the `createActor(storeLogic)` function:
```ts
-// highlight-start
+// [!code highlight:2]
import { fromStore } from '@xstate/store';
import { createActor } from 'xstate';
-// highlight-end
// Instead of:
// const store = createStore( ... };
const storeLogic = fromStore({
context: { count: 0, incremented: false /* ... */ },
on: {
- // highlight-start
+ // [!code highlight:5]
inc: {
count: (context, event) => context.count + 1,
// Static values do not need to be wrapped in a function
incremented: true,
},
- // highlight-end
},
});
@@ -472,19 +459,18 @@ Using `fromStore(…)` to create store actor logic also has the advantage of all
```ts
import { fromStore } from '@xstate/store';
-// highlight-start
+// [!code highlight:5]
const storeLogic = fromStore({
context: (initialCount: number) => ({
count: initialCount,
}),
on: {
- // highlight-end
// ...
},
});
const actor = createActor(storeLogic, {
- // highlight-next-line
+ // [!code highlight:1]
input: 42,
});
```
@@ -550,18 +536,17 @@ const machine = createMachine({
});
```
-For stronger typing, use the [`setup(…)` function](./setup.mdx) to strongly type the `context` and `events`:
+For stronger typing, use the [`setup(…)` function](./setup) to strongly type the `context` and `events`:
```ts
import { setup } from 'xstate';
const machine = setup({
- // highlight-start
+ // [!code highlight:4]
types: {
context: {} as { count: number; name: string },
events: {} as { type: 'inc'; by: number },
},
- // highlight-end
}).createMachine({
// Same as the previous example
});
diff --git a/docs/xstate-store.mdx b/content/docs/xstate-store.mdx
similarity index 96%
rename from docs/xstate-store.mdx
rename to content/docs/xstate-store.mdx
index 7d8a9e793..350f08584 100644
--- a/docs/xstate-store.mdx
+++ b/content/docs/xstate-store.mdx
@@ -2,42 +2,42 @@
title: '@xstate/store'
---
-**Version 3.x** ([Version 2.x docs](./xstate-store-v2.mdx))
+**Version 3.x** ([Version 2.x docs](./xstate-store-v2))
-XState Store is a small library for simple state management in JavaScript/TypeScript applications. It is meant for updating store data using **events** for vanilla JavaScript/TypeScript apps, React apps, and more. It is comparable to libraries like Zustand, Redux, and Pinia. For more complex state management, you should use [XState](./xstate.mdx) instead, or you can [use XState Store with XState](#using-xstate-store-with-xstate).
+XState Store is a small library for simple state management in JavaScript/TypeScript applications. It is meant for updating store data using **events** for vanilla JavaScript/TypeScript apps, React apps, and more. It is comparable to libraries like Zustand, Redux, and Pinia. For more complex state management, you should use [XState](./xstate) instead, or you can [use XState Store with XState](#using-xstate-store-with-xstate).
-:::info
+
The `@xstate/store` library requires TypeScript version 5.4 or above.
-:::
+
## Installation
-
-
+
+
```bash
npm install @xstate/store
```
-
+
-
+
```bash
pnpm install @xstate/store
```
-
+
-
+
```bash
yarn add @xstate/store
```
-
+
## Quick start
@@ -104,12 +104,11 @@ import { createStore } from '@xstate/store';
const store = createStore({
context: { count: 0, name: 'David' },
on: {
- // highlight-start
+ // [!code highlight:4]
inc: (context) => ({
...context, // Preserve other context properties
count: context.count + 1,
}),
- // highlight-end
},
});
```
@@ -124,7 +123,7 @@ import { createStore } from '@xstate/store';
const store = createStore({
context: { count: 0 },
on: {
- // highlight-start
+ // [!code highlight:9]
incrementDelayed: (context, event, enqueue) => {
enqueue.effect(() => {
setTimeout(() => {
@@ -134,7 +133,6 @@ const store = createStore({
return context;
},
- // highlight-end
increment: (context) => ({
...context,
count: context.count + 1,
@@ -143,7 +141,7 @@ const store = createStore({
});
```
-:::warning
+
**Important:** Both `enqueue.effect()` and `enqueue.emit()` must be called **synchronously** within the transition function. Calling them outside the function's synchronous execution (e.g., inside an async callback or Promise) will have no effect, since the transition function must complete synchronously.
@@ -177,7 +175,7 @@ const store = createStore({
This ensures **determinism**: all state changes, effects, and emitted events must be the direct result of an event being sent to the store. Async callbacks cannot enqueue effects or emit events because they happen at unpredictable times, breaking the deterministic event-driven model.
-:::
+
## Emitting Events
@@ -188,18 +186,16 @@ import { createStore } from '@xstate/store';
const store = createStore({
context: { count: 0 },
- // highlight-start
+ // [!code highlight:5]
emits: {
increased: (payload: { by: number }) => {
// Optional side effects can go here
},
},
- // highlight-end
on: {
inc: (context, event: { by: number }, enqueue) => {
- // highlight-start
+ // [!code highlight:1]
enqueue.emit.increased({ by: event.by });
- // highlight-end
return {
...context,
@@ -245,12 +241,11 @@ const store = createStore({
const snapshot = store.getSnapshot();
-// highlight-start
+// [!code highlight:4]
const [nextState, effects] = store.transition(snapshot, {
type: 'inc',
by: 1,
});
-// highlight-end
console.log(nextState.context);
// => { count: 1 }
@@ -354,7 +349,7 @@ You can:
- Subscribe to changes with `atom.subscribe(observer)`
- Update the atom with `atom.set(value)`
-:::info
+
Atoms are best used for:
- Simple, independent pieces of state
@@ -363,7 +358,7 @@ Atoms are best used for:
- When you need direct value updates without constraints
For state that needs to follow specific transition rules or complex update logic, consider using a store instead.
-:::
+
### Creating Atoms
@@ -431,7 +426,7 @@ countAtom.set(2); // Does not log anything
### Combined Atoms
-You can create derived/computed atoms that combine values from other atoms, stores, or selectors:
+You can create derived atoms that combine values from other atoms, stores, or selectors:
```ts
const nameAtom = createAtom('David');
@@ -475,7 +470,7 @@ console.log(totalAtom.get()); // 10 (8 + 2)
The previous value is `undefined` on the first computation. Since TypeScript cannot infer the type of `prev`, you should provide a type parameter to `createAtom()` for type safety.
-:::warning
+
The `read(...)` function for combining atoms is deprecated since v3.5.0. Instead, use the direct `.get()` method on atoms when creating combined atoms:
```ts
@@ -485,7 +480,8 @@ const combinedAtom = createAtom((read) => read(atomA) + read(atomB));
// ✅ New API
const combinedAtom = createAtom(() => atomA.get() + atomB.get());
```
-:::
+
+
### Async Atoms
@@ -542,9 +538,9 @@ store.trigger.increment();
console.log(doubleCountAtom.get()); // 2
```
-:::tip
+
Combined atoms are read-only by design. If you need to update multiple values atomically, consider using a store instead.
-:::
+
### Using Atoms with React
@@ -645,7 +641,7 @@ function Counter() {
## Inspection
-Just like with XState, you can use the [Inspect API](./inspection.mdx) to inspect events sent to the store and state transitions within the store by using the .inspect method:
+Just like with XState, you can use the [Inspect API](./inspection) to inspect events sent to the store and state transitions within the store by using the .inspect method:
```ts
import { createStore } from '@xstate/store';
@@ -654,20 +650,19 @@ const store = createStore({
// ...
});
-// highlight-start
+// [!code highlight:5]
store.inspect((inspectionEvent) => {
// type: '@xstate.snapshot' or
// type: '@xstate.event'
console.log(inspectionEvent);
});
-// highlight-end
```
-:::info
+
Since the store is automatically started, inspectors will immediately receive the initial state snapshot.
-:::
+
The `.inspect(…)` method returns a subscription object:
@@ -682,7 +677,7 @@ const sub = store.inspect((inspectionEvent) => {
sub.unsubscribe();
```
-You can use the [Stately Inspector](./inspector.mdx) to inspect and visualize the state of the store.
+You can use the [Stately Inspector](./inspector) to inspect and visualize the state of the store.
```ts
import { createBrowserInspector } from '@statelyai/inspect';
@@ -730,11 +725,11 @@ const store = createStore({
Deprecated: createStoreWithProducer(…)
-:::warning
+
This API is deprecated. Use `produce` from [Immer](https://immerjs.github.io/immer/) or similar libraries directly with `createStore(…)` instead.
-:::
+
In previous versions of `@xstate/store`, you could use the `createStoreWithProducer(…)` function to pass in a producer function to update the `context` for every transition. This will not be supported in future versions of `@xstate/store`. Instead, you can use the `produce(…)` function from [Immer](https://immerjs.github.io/immer/) or similar libraries directly with `createStore(…)`.
@@ -856,10 +851,9 @@ You can also provide a custom comparator function as the third argument to optim
function OptimizedCounter() {
const [count, store] = useCountStore(
(s) => s.context.count,
- // highlight-start
+ // [!code highlight:2]
// Custom comparator function
(prev, next) => prev === next, // Only re-render when count actually changes
- // highlight-end
);
return (
@@ -1001,9 +995,9 @@ function Counter({ currentCount = 0 }) {
This behavior ensures that state updates are always explicit and traceable through events, maintaining a predictable data flow in your application.
-:::tip
+
If you need to synchronize store state with prop changes, consider whether the value should be stored in the store at all. Sometimes it's simpler to use the prop directly in your component and compute derived values outside of the store.
-:::
+
## Usage with Solid
@@ -1617,7 +1611,7 @@ store.trigger.dec();
## Using XState Store with XState
-You may notice that stores are very similar to [actors in XState](./actors.mdx). This is very much by design. XState's actors are very powerful, but may also be too complex for simple use cases, which is why `@xstate/store` exists.
+You may notice that stores are very similar to [actors in XState](./actors). This is very much by design. XState's actors are very powerful, but may also be too complex for simple use cases, which is why `@xstate/store` exists.
However, if you have existing XState code, and you enjoy the simplicity of creating store logic with `@xstate/store`, you can use the `fromStore(context, transitions)` actor logic creator to create XState-compatible store logic that can be passed to the `createActor(storeLogic)` function:
@@ -1630,13 +1624,12 @@ import { createActor } from 'xstate';
const storeLogic = fromStore({
context: { count: 0, incremented: false /* ... */ },
on: {
- // highlight-start
+ // [!code highlight:5]
inc: {
count: (context, event) => context.count + 1,
// Static values do not need to be wrapped in a function
incremented: true,
},
- // highlight-end
},
});
@@ -1677,18 +1670,17 @@ Using `fromStore(…)` to create store actor logic also has the advantage of all
import { fromStore } from '@xstate/store';
const storeLogic = fromStore({
- // highlight-start
+ // [!code highlight:3]
context: (initialCount: number) => ({
count: initialCount,
}),
- // highlight-end
on: {
// ...
},
});
const actor = createActor(storeLogic, {
- // highlight-next-line
+ // [!code highlight:1]
input: 42,
});
```
@@ -1754,18 +1746,17 @@ const machine = createMachine({
});
```
-For stronger typing, use the [`setup(…)` function](./setup.mdx) to strongly type the `context` and `events`:
+For stronger typing, use the [`setup(…)` function](./setup) to strongly type the `context` and `events`:
```ts
import { setup } from 'xstate';
const machine = setup({
- // highlight-start
+ // [!code highlight:4]
types: {
context: {} as { count: number; name: string },
events: {} as { type: 'inc'; by: number },
},
- // highlight-end
}).createMachine({
// Same as the previous example
});
diff --git a/docs/xstate-svelte.mdx b/content/docs/xstate-svelte.mdx
similarity index 92%
rename from docs/xstate-svelte.mdx
rename to content/docs/xstate-svelte.mdx
index d11126969..071fad3ad 100644
--- a/docs/xstate-svelte.mdx
+++ b/content/docs/xstate-svelte.mdx
@@ -15,30 +15,30 @@ Use the following templates to get started quickly with XState and Svelte:
Install the latest versions of both `xstate` and `@xstate/svelte`. `xstate` is a peer dependency of `@xstate/svelte`.
-
-
+
+
```bash
npm install xstate @xstate/svelte
```
-
+
-
+
```bash
pnpm install xstate @xstate/svelte
```
-
+
-
+
```bash
yarn add xstate @xstate/svelte
```
-
+
## API
@@ -49,7 +49,7 @@ A function that creates an actor from the given `machine` and starts an actor th
**Arguments**
-- `machine` - An [XState machine](machines.mdx).
+- `machine` - An [XState machine](machines).
- `options` (optional) - Actor options
**Returns** `{ snapshot, send, actorRef}`:
@@ -92,14 +92,13 @@ 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
+// [!code highlight:3]
const persistedState = JSON.parse(
localStorage.getItem('some-persisted-state-key'),
);
-// highlight-end
const { snapshot, send } = useMachine(someMachine, {
- // highlight-next-line
+ // [!code highlight:1]
snapshot: persistedState,
});
diff --git a/docs/xstate-test.mdx b/content/docs/xstate-test.mdx
similarity index 98%
rename from docs/xstate-test.mdx
rename to content/docs/xstate-test.mdx
index ef1f2ef3c..83fa9557a 100644
--- a/docs/xstate-test.mdx
+++ b/content/docs/xstate-test.mdx
@@ -2,17 +2,17 @@
title: '@xstate/test'
---
-:::warningxstate
+
The latest version of the model-based testing utilities (prev. `@xstate/test`) are now part of the latest `@xstate/graph` package.
Documentation for `@xstate/graph` (including the testing utilities) is coming soon; the documentation below is for `@xstate/test@beta`.
-:::
+
The [@xstate/test package](https://github.com/statelyai/xstate/tree/main/packages/xstate-test) contains utilities for facilitating [model-based testing](https://en.wikipedia.org/wiki/Model-based_testing) for any software.
-**Watch the talk**: [Write Fewer Tests! From Automation to Autogeneration](https://slides.com/davidkpiano/mbt) at React Rally 2019 ([🎥 Video](https://www.youtube.com/watch?v=tpNmPKjPSFQ))
+**Watch the talk**: [Write Fewer Tests! From Automation to Autogeneration](https://slides.com/davidkhourshid/mbt) at React Rally 2019 ([🎥 Video](https://www.youtube.com/watch?v=tpNmPKjPSFQ))
## Quick start
diff --git a/docs/xstate-vscode-extension.mdx b/content/docs/xstate-vscode-extension.mdx
similarity index 94%
rename from docs/xstate-vscode-extension.mdx
rename to content/docs/xstate-vscode-extension.mdx
index b6993c6cf..54ced1248 100644
--- a/docs/xstate-vscode-extension.mdx
+++ b/content/docs/xstate-vscode-extension.mdx
@@ -2,15 +2,19 @@
title: 'XState VS Code extension'
---
-# XState VS Code extension
-
The [XState VS Code extension](https://marketplace.visualstudio.com/items?itemName=statelyai.stately-vscode) enhances the XState development experience by providing VS Code users with autocomplete, typegen, linting, and a visual editor inside VS Code.
-:::tip
+
+
+XState VS Code extension is not fully supported in XState version 5.
+
+
+
+
If you don’t use VS Code but use an open source code editor that supports VS Code extensions, you can [download the XState VS Code extension from the OpenVSX registry](https://open-vsx.org/extension/statelyai/stately-vscode).
-:::
+
## Installation
@@ -34,7 +38,7 @@ You can also [download the VS Code extension from the VS Code marketplace](https
## TypeScript typegen
-You can automatically generate intelligent typings for XState with our VS Code extension and [command line interface](developer-tools.mdx#xstate-cli-command-line-interface). [Read more about how to use typegen, and our recommended best practices, on the Typegen page](typegen.mdx).
+You can automatically generate intelligent typings for XState with our VS Code extension and [command line interface](developer-tools.mdx#xstate-cli-command-line-interface). [Read more about how to use typegen, and our recommended best practices, on the Typegen page](typegen).
## `xsm` snippet
@@ -53,9 +57,8 @@ If you’d like to ignore linting/autocomplete on a machine, add an `// xstate-i
createMachine({});
```
-:::tip
+
-## Machine layout persistence
Upon opening an XState machine in VS Code, you may notice a long `@xstate-layout` comment inserted in the code just above the call to `createMachine()`.
@@ -67,10 +70,10 @@ createMachine({...});
This layout string is for persisting manual changes you make to the machine’s layout and is automatically updated by the XState Extension whenever layout changes occur. It is not intended to be human-readable nor manually edited. When updates to this string are made by the extension, the file is not saved until a manual save is performed. The layout algorithm is able to interpret this string and automatically format the machine's layout whenever it is re-opened in Stately Studio’s editor.
-:::
+
-:::warning
+
**Caution**: if you use tab based-indentation in VS Code the extension might not work. [Setup VS Code to insert spaces](https://code.visualstudio.com/docs/editor/codebasics#_indentation) automatically.
-:::
+
diff --git a/docs/xstate-vue.mdx b/content/docs/xstate-vue.mdx
similarity index 95%
rename from docs/xstate-vue.mdx
rename to content/docs/xstate-vue.mdx
index ee32b6d12..d138d9b06 100644
--- a/docs/xstate-vue.mdx
+++ b/content/docs/xstate-vue.mdx
@@ -17,30 +17,30 @@ Use the following templates to get started quickly with XState and Vue:
Install the latest versions of both `xstate` and `@xstate/vue`. `xstate` is a peer dependency of `@xstate/vue`.
-
-
+
+
```bash
npm install xstate @xstate/vue
```
-
+
-
+
```bash
pnpm install xstate @xstate/vue
```
-
+
-
+
```bash
yarn add xstate @xstate/vue
```
-
+
{/* TODO: CDN? */}
@@ -53,7 +53,7 @@ A [Vue composition function](https://v3.vuejs.org/guide/composition-api-introduc
#### Arguments
-- `actorLogic` - An [XState machine](machines.mdx)
+- `actorLogic` - An [XState machine](machines)
- `options` (optional) - Actor options
**Returns** `{ snapshot, send, actorRef }`:
@@ -68,7 +68,7 @@ A [Vue composition function](https://v3.vuejs.org/guide/composition-api-introduc
#### Arguments
-- `machine` - An [XState machine](machines.mdx)
+- `machine` - An [XState machine](machines)
- `options` (optional) - Actor options
**Returns** `{ snapshot, send, actorRef }`:
diff --git a/docs/xstate.mdx b/content/docs/xstate.mdx
similarity index 82%
rename from docs/xstate.mdx
rename to content/docs/xstate.mdx
index 8315ba1cd..9b9bed62e 100644
--- a/docs/xstate.mdx
+++ b/content/docs/xstate.mdx
@@ -5,42 +5,42 @@ slug: '/xstate'
XState is a state management and orchestration solution for JavaScript and TypeScript apps.
-It uses [event-driven](transitions.mdx) programming, [state machines, statecharts](state-machines-and-statecharts.mdx), and the [actor model](actor-model.mdx) to handle complex logic in predictable, robust, and visual ways. XState provides a powerful and flexible way to manage application and workflow state by allowing developers to model logic as actors and state machines. It integrates well with React, Vue, Svelte, and other frameworks and can be used in the frontend, backend, or wherever JavaScript runs.
+It uses [event-driven](transitions) programming, [state machines, statecharts](state-machines-and-statecharts), and the [actor model](actor-model) to handle complex logic in predictable, robust, and visual ways. XState provides a powerful and flexible way to manage application and workflow state by allowing developers to model logic as actors and state machines. It integrates well with React, Vue, Svelte, and other frameworks and can be used in the frontend, backend, or wherever JavaScript runs.
-:::tip
+
-Want to find out more about state machines? [Read our introduction](state-machines-and-statecharts.mdx).
+Want to find out more about state machines? [Read our introduction](state-machines-and-statecharts).
-:::
+
## Installation
XState is available on [npm](https://www.npmjs.com/package/xstate):
-
-
+
+
```bash
npm install xstate
```
-
+
-
+
```bash
pnpm install xstate
```
-
+
-
+
```bash
yarn add xstate
```
-
+
## Create a simple machine
@@ -90,7 +90,7 @@ countActor.send({ type: 'SET', value: 10 });
title="Simple machine"
/>
-[Check out more cheatsheet examples](cheatsheet.mdx).
+[Check out more cheatsheet examples](cheatsheet).
## Create a more complex machine
@@ -160,16 +160,16 @@ textActor.send({ type: 'text.cancel' });
## Download the XState VS Code extension
-:::warningxstate
+
The XState VS Code extension does not fully support XState v5 yet.
-:::
+
- [Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=statelyai.stately-vscode)
- [Open VSX Registry](https://open-vsx.org/extension/statelyai/stately-vscode)
-[Read more about our developer tools](developer-tools.mdx).
+[Read more about our developer tools](developer-tools).
## Packages
diff --git a/docs/canvas-view-controls.mdx b/docs/canvas-view-controls.mdx
deleted file mode 100644
index af8cac93a..000000000
--- a/docs/canvas-view-controls.mdx
+++ /dev/null
@@ -1,83 +0,0 @@
----
-title: Canvas controls
----
-
-We’ve recently added a canvas tools panel to help you with common tasks while designing and simulating state machines.
-
-- [Generate with AI](generate-flow.mdx).
-- Pointer mode, for dragging and selecting items on the
- canvas.
-- Hand mode, for panning around the canvas.
-- Quick add menu, for adding a [state](editor-states-and-transitions.mdx)
- or a [note](annotations.mdx).
-
-
-
-
-
-## View controls
-
-You spend a lot of time on the canvas while designing and simulating state machines, so we’ve added view controls to help you navigate around your machines.
-
-## Show/hide UI (user interface)
-
-You can show and hide most of the editor’s user interface to help you focus on your machine.
-
-1. Open the editor menu from the Stately icon in the top left of Stately Studio.
-2. From the **View** submenu, toggle **Show/hide UI** to show and hide the UI.
-
-You can also use the Command /Ctrl + . keyboard shortcut to show and hide the UI.
-
-:::tip
-
-We’ve got [keyboard shortcuts](keyboard-shortcuts.mdx) for many of the view controls.
-
-:::
-
-Below is a preview of a machine _with_ the UI hidden.
-
-
-
-
-
-Below is a preview of a machine _without_ the UI hidden.
-
-
-
-
-
-## View controls
-
-- Undo
-- Redo
-- Center in view: Center currently selected item or entire machine
- in view.
-- Zoom in %: Current zoom level. Press to open the zoom menu.
-
-:::studio
-
-[Find out more about light mode, dark mode, and translucency in user preferences](user-preferences.mdx).
-
-:::
-
-## Zoom to selection
-
-You can use **Zoom to selection** from right-click on any transition or state on the canvas or in the **Structure** panel.
diff --git a/docs/colors.mdx b/docs/colors.mdx
deleted file mode 100644
index 0da5e221e..000000000
--- a/docs/colors.mdx
+++ /dev/null
@@ -1,63 +0,0 @@
----
-title: Colors
----
-
-You can highlight your machine’s state and event nodes with colors. You can use colors however you like; some ideas include:
-
-- Color coding groups or types of states or events
-- Emphasizing success or error states
-- Making your machines match your brand
-
-:::studio
-
-Colors are a premium feature of Stately Studio. [Check out the features on our Pro plan](studio-pro-plan.mdx), [Team plan](studio-team-plan.mdx), [Enterprise plan](studio-enterprise-plan.mdx) or [upgrade your existing plan](https://stately.ai/registry/billing).
-
-:::
-
-
-
-:::tip
-
-A note on accessibility: not everyone perceives color the same way, and as many as 8% of men and 0.5% of women are [color blind](https://www.nei.nih.gov/learn-about-eye-health/eye-conditions-and-diseases/color-blindness). Ensure your statecharts are inclusive by using color to emphasize or decorate your machines and [do not use color as the only way to convey information](https://www.w3.org/WAI/WCAG21/Understanding/use-of-color.html).
-
-:::
-
-## Change the color of a state or event
-
-All states and events have a default color. In dark mode, the default color is grey. In light mode, the default color is white.
-
-When you hover over the color options, a preview of the color will be shown on the selected state or event.
-
-Colors are faded out in Simulate mode to make the current state and possible events easier to distinguish.
-
-### On the canvas
-
-1. Select the state or event whose color you want to change.
-2. Choose the circular color swatch in the center of the Edit menu to open the **Color state** or **Color event** options.
-3. Choose your desired color from the available color options.
-
-### Use the details panel
-
-1. Select the state or event whose color you want to change.
-2. Open the **Details** panel from the right tool menu.
-3. Choose the circular color swatch in the top right of the **Details** panel to open the **Color state** or **Color event** options.
-4. Choose your desired color from the available color options.
-
-## Available colors
-
-
-
-- Default: grey in dark mode, white in light mode
-- Purple
-- Pink
-- Red
-- Orange
-- Yellow
-- Green
-- Blue
diff --git a/docs/glossary.mdx b/docs/glossary.mdx
deleted file mode 100644
index 332594e16..000000000
--- a/docs/glossary.mdx
+++ /dev/null
@@ -1,87 +0,0 @@
----
-title: Glossary
----
-
-This glossary is an alphabetical guide to the most common terms in statecharts and state machines.
-
-:::tip
-
-Looking for more detailed information on these concepts? [Read the introduction to state machines and statecharts](state-machines-and-statecharts.mdx).
-
-:::
-
-## Actions
-
-An [action](actions.mdx) is an effect that is executed during a state transition. Actions are “fire-and-forget effects”; once the machine has fired the action, it moves on and forgets the action.
-
-## Actors
-
-When you run a state machine, it becomes an [actor](actors.mdx), which is a running process that can receive events, send events, and change its behavior based on the events it receives, which can cause effects outside of the actor.
-
-## After transitions
-
-See [delayed transitions](/#delayed-transitions).
-
-## Always transitions
-
-See [eventless transitions](/#eventless-transitions).
-
-## Compound states
-
-See [parent and child states](/#parent-and-child-states).
-
-## Context
-
-[Context](context.mdx) is the place that contextual data is stored in a state machine actor.
-
-## Delayed transitions
-
-[Delayed transitions](delayed-transitions.mdx) are transitions that only happen after a specified interval of time. If another event happens before the end of the timer, the transition doesn’t complete. Delayed transitions are labeled “after” and often referred to as “after” transitions.
-
-## Eventless transitions
-
-[Eventless transitions](eventless-transitions.mdx) are transitions without events. These transitions are *always* taken after any transition in their state is enabled. No event is necessary to trigger the transition. Eventless transitions are labeled “always” and often referred to as “always” transitions.
-
-## Final state
-
-When a machine reaches the [final state](final-states.mdx), it can no longer receive any events, and anything running inside it is canceled and cleaned up. A machine can have multiple final states or no final states.
-
-## Guards
-
-A [guard](guards.mdx) is a condition that the machine checks when it goes through an event. If the condition is true, the machine follows the transition to the next state. If the condition is false, the machine follows the rest of the conditions to the next state. Any transition can be a guarded transition.
-
-## History state
-
-A [history state](history-states.mdx) returns the parent state to its most recently active child state.
-
-## Initial state
-
-When a state machine starts, it enters the [**initial state**](initial-states.mdx) first. A machine can only have one top-level initial state.
-
-## Invoked actors
-
-An [invoked actor](actors.mdx) is an actor that can execute its own actions and communicate with the machine. These invoked actors are started in a state and stopped when the state is exited.
-
-## Parallel states
-
-A [parallel state](parallel-states.mdx) is a state separated into multiple regions of child states, where each region is active simultaneously.
-
-## Parent and child states
-
-States can contain more states, also known as [child states](parent-states.mdx). These child states are only active when the parent state is active. Child states are nested inside their parent states. Parent states are also known as compound states.
-
-## States
-
-A [state](states.mdx) describes the status of the machine. A state can be as simple as _active_ and _inactive_. These states are finite; the machine can only move through the pre-defined states. A state machine can only be in one state at a time.
-
-## Statecharts
-
-[Statecharts](state-machines-and-statecharts.mdx) are a visual extension to state machines enabling you to model more complex logic, including hierarchy, concurrency, and communication.
-
-## State machines
-
-A [state machine](state-machines-and-statecharts.mdx) is a model that describes how the state of a process transitions to another state when an event occurs. State machines make building reliable software easier because they prevent impossible states and undesired transitions. When you run a state machine, it becomes an [actor](actors.mdx).
-
-## Transitions and events
-
-A machine moves from state to state through [transitions](transitions.mdx). Transitions are caused by events; when an event happens, the machine transitions to the next state. Transitions are “deterministic”; each combination of state and event always points to the same next state.
diff --git a/docs/lock-machines.mdx b/docs/lock-machines.mdx
deleted file mode 100644
index 8971adeb5..000000000
--- a/docs/lock-machines.mdx
+++ /dev/null
@@ -1,40 +0,0 @@
----
-title: Lock machines
----
-
-You can lock a machine anytime to prevent accidental edits. Locked machines have a **Locked** status displayed in the editor’s top bar and in the project’s machine list in the left panel.
-
-Hover over the **Locked** text to view who locked the machine and when.
-
-:::studio
-
-Locking machines is a premium feature of Stately Studio. You can try Stately Studio’s premium plans with a free trial. [Check out the features on our Pro plan](studio-pro-plan.mdx), [Team plan](studio-team-plan.mdx), [Enterprise plan](studio-enterprise-plan.mdx) or [upgrade your existing plan](https://stately.ai/registry/billing).
-
-:::
-
-Locking a machine prevents you, or anyone else on your team, from the following:
-
-- Editing the machine
-- Deleting the machine
-- Renaming the machine
-- [Importing code](import-from-code.mdx) to replace the machine
-- [Restoring a past version](versions.mdx) of the machine
-
-If somebody else is viewing or editing the machine when it is locked, their changes will not be saved, and they will be notified that the machine is now locked.
-
-## How to lock and unlock a machine
-
-From the editor menu, go to **Machine** > **Lock machine** / **Unlock machine**.
-
-From the machine’s **Details** panel, use the Lock machine / Unlock machine icon button.
-
-If the machine is already locked, you can unlock it by clicking on the **Locked** button in the editor’s top bar and then confirming that you wish to unlock the machine.
-
-## Team roles and locking machines
-
-All team members can view locked machines. Only team owners, Admins, and Editors can lock and unlock machines.
-
-| Capability | Owner | Admin | Editor | Viewer |
-| ----------------------- | ------ | ------ | ------ | ------ |
-| View locked machine | ✅ Yes | ✅ Yes | ✅ Yes | ✅ Yes |
-| Lock and unlock machine | ✅ Yes | ✅ Yes | ✅ Yes | 🚫 No |
diff --git a/docs/setup.mdx b/docs/setup.mdx
deleted file mode 100644
index 813fe3dba..000000000
--- a/docs/setup.mdx
+++ /dev/null
@@ -1,237 +0,0 @@
----
-title: 'Setup'
----
-
-In XState version 5, you can now use the `setup({ ... })` function to setup types and sources for your machines. This has many benefits:
-
-- Reduced boilerplate for strongly typing and providing named sources
-- More robust machine logic, as named sources are guaranteed to exist
-- Better type inference for actions, actors, guards, delays, context, events, etc.
-- Strongly-typed snapshot and done events for actors
-- Strongly-typed state values
-- Reusability of source logic
-
-Example usage:
-
-```ts
-import { setup, assign } from 'xstate';
-
-const machine = setup({
- types: {
- context: {} as { count: number },
- events: {} as { type: 'inc' } | { type: 'dec' },
- },
- actions: {
- increment: assign({
- count: ({ context }) => context.count + 1,
- }),
- decrement: assign({
- count: ({ context }) => context.count - 1,
- }),
- },
-}).createMachine({
- context: { count: 0 },
- on: {
- inc: { actions: 'increment' },
- dec: { actions: 'decrement' },
- },
-});
-```
-
-:::warning
-
-Ensure you are using the latest version of TypeScript (version 5.0 or higher). See the docs on [TypeScript usage with XState](./typescript.mdx) for more information.
-
-:::
-
-## Setting up types
-
-Machine types should be setup in the `types` property of `setup({ types })`. This is where you can setup the types for your machine, including:
-
-- Types for `context`
-- Types for `events`, including event payloads
-- Types for `input`
-- Types for `actions`, including action `params`
-- Types for `guards`, including guard `params`
-- Types for `actors`
-
-## Migrating from `createMachine`
-
-Migrating from bare `createMachine({ ... })` to `setup({ ... }).createMachine({ ... })` to create a machine is simple.
-
-1. Import `setup` instead of `createMachine` from `'xstate'`
-1. Move `types` from `createMachine(...)` to `setup(...)`
-1. Move action, actor, guard, etc. sources from the 2nd argument of `createMachine(config, sources)` to `setup({ ... })`
-
-```ts
-import {
-// createMachine
- setup
-} from 'xstate';
-
-const machine =
- setup({
- types: { ... },
- actions: { ... },
- guards: { ... }
- })
- .createMachine({
- // types: { ... }
- }, /* { actions, guards, ... } */);
-```
-
-## Extending setups
-
-_ Since XState version 5.24.0_
-
-The `.extend()` method allows you to progressively build up your setup by extending actions, guards, and delays. This enables patterns that weren't possible before with full type safety.
-
-### Why use `.extend()`?
-
-Before `.extend()`, all actions, guards, and delays had to be defined in a single `setup()` call. With `.extend()`, you can:
-
-- **Compose setups from multiple sources**: Create base setups that can be extended for different domains or modules
-- **Reference base sources in extended sources**: Use base actions, guards, and delays within extended ones with full type safety
-- **Chain extensions**: Build up complex setups incrementally while maintaining type safety throughout
-
-### Basic usage
-
-You can extend any setup by calling `.extend()` with additional actions, guards, or delays:
-
-```ts
-import { setup, enqueueActions } from 'xstate';
-
-const baseSetup = setup({
- actions: {
- doSomething: () => {
- console.log('Doing something');
- },
- },
- guards: {
- truthy: () => true,
- },
-});
-
-// highlight-start
-const extendedSetup = baseSetup.extend({
- actions: {
- doSomethingElse: () => {
- console.log('Doing something else');
- },
- },
- guards: {
- falsy: () => false,
- },
-});
-// highlight-end
-
-const machine = extendedSetup.createMachine({
- entry: [{ type: 'doSomething' }, { type: 'doSomethingElse' }], // ✅ Both actions are available
- on: {
- EV: {
- guard: { type: 'truthy' }, // ✅ Base guard is available
- actions: { type: 'doSomethingElse' },
- },
- },
-});
-```
-
-### Referencing base sources in extended sources
-
-One of the powerful features of `.extend()` is the ability to reference base actions, guards, and delays within extended ones, with full type safety:
-
-```ts
-import { setup, enqueueActions, not, and, or, assign } from 'xstate';
-
-const baseSetup = setup({
- types: {
- context: {} as { count: number },
- },
- actions: {
- increment: assign({
- count: ({ context }) => context.count + 1,
- }),
- },
- guards: {
- truthy: () => true,
- isPositive: ({ context }) => context.count > 0,
- },
-});
-
-const extendedSetup = baseSetup.extend({
- guards: {
- // ✅ Can reference base guard with not()
- falsy: not('truthy'),
-
- // ✅ Can combine base guards with and()
- isPositiveAndTruthy: and(['isPositive', 'truthy']),
-
- // ❌ TypeScript error: 'nonexistent' doesn't exist
- // nonexistent: not('nonexistent'),
- },
- actions: {
- // ✅ Can reference base actions in enqueueActions
- incrementAndLog: enqueueActions(({ enqueue, check }) => {
- enqueue('increment'); // ✅ Base action is available
-
- if (check('isPositive')) {
- // ✅ Extended guard is available
- enqueue.raise({ type: 'POSITIVE' });
- }
-
- // ❌ TypeScript error: 'nonexistent' doesn't exist
- // enqueue('nonexistent');
- }),
- },
-});
-
-const machine = extendedSetup.createMachine({
- on: {
- EV: {
- guard: 'isPositiveAndTruthy', // ✅ Extended guard is available
- actions: 'incrementAndLog',
- },
- },
-});
-```
-
-Delays can also be extended and referenced in actions:
-
-```ts
-import { setup, raise } from 'xstate';
-
-const baseSetup = setup({
- delays: {
- short: 10,
- },
-});
-
-const extendedSetup = baseSetup.extend({
- delays: {
- medium: 100,
- },
-});
-
-const machine = extendedSetup.createMachine({
- initial: 'a',
- states: {
- a: {
- entry: [
- raise({ type: 'GO' }, { delay: 'short' }), // ✅ Base delay
- raise({ type: 'GO' }, { delay: 'medium' }), // ✅ Extended delay
- // ❌ TypeScript error: 'long' doesn't exist
- // raise({ type: 'GO' }, { delay: 'long' }),
- ],
- on: {
- GO: 'b',
- },
- },
- b: {
- after: {
- medium: 'c', // ✅ Extended delay available in after
- },
- },
- c: {},
- },
-});
-```
diff --git a/docs/sources.mdx b/docs/sources.mdx
deleted file mode 100644
index 2ec3a05bc..000000000
--- a/docs/sources.mdx
+++ /dev/null
@@ -1,56 +0,0 @@
----
-title: 'Sources'
-description: 'You can add source code for actors, actions, and guards from the Sources panel. Your source code will be included in your live actors, synced projects, and exported code.'
----
-
-You can add source code for [actors](actors.mdx), [actions](actions.mdx), and [guards](guards.mdx) from the **Sources** panel. Your source code will be included in your [live actors](stately-sky-getting-started.mdx), [synced projects](import-from-github.mdx), and [exported code](export-as-code.mdx) found in the **Code** panel.
-
-:::info
-
-Sources for [delayed (after) transitions](delayed-transitions.mdx) are not yet supported. You can still use delayed transitions in your machines, but the delay implementation will need to be handled in your exported code rather than defined in the Sources panel.
-
-:::
-
-## Adding sources
-
-You can add sources from the **Sources** panel. Use the edit button alongside the action, actor, or guard on the canvas to open its source.
-
-You can also open the **Sources** panel without selecting an action, actor, or guard. By default, the **Sources** panel shows all the sources in the machine, and you can also add new sources without referencing them with an action, actor, or guard. Sources currently referenced in the machine are highlighted in the **Sources** panel. Unused sources are dimmed.
-
-Each source requires a name (ID) and source code. The ID is used to reference the source code. The source code for the actor, action, or guard will be included in the generated code. Sources have distinct names, so multiple actors, actions, or guards can reference them.
-
-### Unnamed actions, actors, and guards
-
-When importing a machine from your codebase, unnamed actions, actors, and guards are assigned a default name based on its position in your machine config. For example, the following action:
-
-```js
-createMachine({
- states: {
- a: {
- states: {
- b: { entry: [assign({ name: 'laura' })] },
- },
- },
- },
-});
-```
-
-Would be given a default name of `inline:(machine).a.b#entry[0]`. These default names are not visible in the editor but will be used in the synced or exported code unless you give your action, actor, or guard a name. `inline:` is prepended to the name to make them more readable and easier to find in your code. After first importing your machine, we recommend you give all your actions, actors, and guards a name. Naming is a one-time step, and you can always rename them later.
-
-## Deleting sources
-
-You can only delete unused sources that any actors, actions, or guards do not reference. This prevents you from accidentally deleting a currently used source in your machine.
-
-:::tip
-
-You can **delete all unused sources** from the **...** menu in the top right corner of the **Sources** panel.
-
-:::
-
-## Source templates
-
-Each source type has optional logic templates. You can use the template buttons to quickly add the implementation code for XState’s [logic creators](/docs/actors#actor-logic-creators), [higher-level guards](/docs/guards#higher-level-guards), and [built-in actions](/docs/actions), and the correct XState imports will be added to your code for sync or export.
-
-## Formatting
-
-You can format your source code with [Prettier](https://prettier.io/) by using the format button.
diff --git a/docs/typegen.mdx b/docs/typegen.mdx
deleted file mode 100644
index 84fcef013..000000000
--- a/docs/typegen.mdx
+++ /dev/null
@@ -1,11 +0,0 @@
----
-title: 'Typegen'
----
-
-:::warning
-
-**This feature is not available for XState version 5 yet.**
-
-:::
-
-Typegen support for XState version 5 is in progress.
diff --git a/docs/upgrade.mdx b/docs/upgrade.mdx
deleted file mode 100644
index 3d524b82a..000000000
--- a/docs/upgrade.mdx
+++ /dev/null
@@ -1,47 +0,0 @@
----
-title: Upgrade your Stately Studio account
----
-
-# Upgrade
-
-**Stately Studio will always be free to our Community users** on the [Community plan](studio-community-plan.mdx), and we will make many future features available on every plan.
-
-We offer a **free trial** on the Stately Studio [Pro](studio-pro-plan.mdx), [Team](studio-team-plan.mdx), or [Enterprise](studio-enterprise-plan.mdx) plans so you can explore how our premium features work for you and your team. You can [upgrade](upgrade.mdx) when you’re signed into Stately Studio.
-
-## Upgrade to a Pro or Team plan
-
-You can [upgrade](upgrade.mdx) when you’re signed into Stately Studio using the **Upgrade** button in the editor’s footer.
-
-
-
-
-
-## Upgrade to an Enterprise plan
-
-
-
- Email the Stately team
- {' '}
- for a custom plan tailored to the requirements of your organization.
-
-
-## Manage your subscription plan
-
-- From the editor, use the Editor menu, and from the **Account** section, select **Billing**.
-- From elsewhere in the Studio, select your avatar from the header and choose **Billing** from the account menu.
-
-
-
-
diff --git a/docs/user-preferences.mdx b/docs/user-preferences.mdx
deleted file mode 100644
index 4b7f6707a..000000000
--- a/docs/user-preferences.mdx
+++ /dev/null
@@ -1,38 +0,0 @@
----
-title: User preferences
----
-
-We have some simple user preferences to help you customize Stately Studio to fit your needs.
-
-## Light mode and dark mode
-
-You can choose whether you prefer light mode or dark mode, and Stately Studio will remember your setting. You must be signed in to choose your preferred mode.
-
-
-
-Switch between the light and dark mode setting here in the docs to preview the machine, above, switching between light and dark mode in Stately Studio.
-
-### Switch between light and dark mode
-
-1. Use your avatar button in the top right of Stately Studio to open the user menu.
-2. Use the setting to either **Switch to light mode** or **Switch to dark mode**.
-
-:::studio
-
-We plan to set light mode and dark mode according to your operating system preferences in the future. Please [upvote this feature in our roadmap](https://feedback.stately.ai/editor/p/automatic-lightdark-mode-based-on-system-preferences) if it’s a priority for you.
-
-:::
-
-## Translucency
-
-Events are translucent in the Stately Studio canvas to make it easier to distinguish overlapping events and transitions. You can choose to turn translucency off if you prefer.
-
-### Enable and disable translucency
-
-1. Use your avatar button in the top right of Stately Studio to open the user menu.
-2. Use the setting to either **Disable translucency** or **Enable translucency**.
-
-Translucency is not yet supported in Safari.
diff --git a/docs/xstate-graph.mdx b/docs/xstate-graph.mdx
deleted file mode 100644
index 8e0158ba5..000000000
--- a/docs/xstate-graph.mdx
+++ /dev/null
@@ -1,588 +0,0 @@
----
-title: 'Graph Utilities'
-description: 'Generate paths through state machines for testing and analysis'
-slug: graph
----
-
-:::info
-
-The graph utilities are now included in the main `xstate` package. Import from `xstate/graph` instead of the deprecated `@xstate/graph` and `@xstate/test` packages.
-
-:::
-
-State machines can be represented as directed graphs, where states are nodes and transitions are edges. XState provides utilities to traverse these graphs and generate **paths**: sequences of events that transition a machine from one state to another.
-
-## Why use path generation?
-
-Path generation is useful for:
-
-- **Model-based testing** - automatically generate test cases that cover all reachable states and transitions
-- **Visualization** - understand the structure and flow of complex machines
-- **Validation** - verify all states are reachable and all transitions are exercised
-- **Documentation** - generate human-readable sequences of user flows
-
-## Quick start
-
-```ts
-import { createMachine } from 'xstate';
-import { getShortestPaths, getSimplePaths } from 'xstate/graph';
-
-const machine = createMachine({
- initial: 'a',
- states: {
- a: {
- on: { NEXT: 'b', SKIP: 'c' }
- },
- b: {
- on: { NEXT: 'c' }
- },
- c: { type: 'final' }
- }
-});
-
-const shortestPaths = getShortestPaths(machine);
-// - a
-// - a -> b
-// - a -> c (via SKIP, not through b)
-
-const simplePaths = getSimplePaths(machine);
-// - a
-// - a -> b
-// - a -> b -> c
-// - a -> c (via SKIP)
-```
-
-## Core concepts
-
-### Paths and steps
-
-A **path** represents a sequence of transitions from one state to another. Each path contains:
-
-- `state` - the final state reached by this path
-- `steps` - array of steps taken to reach that state
-
-A **step** represents a single transition:
-
-- `state` - the state before this transition
-- `event` - the event that triggered the transition
-
-```ts
-// Example path structure
-{
- // The final state reached by this path
- state: { value: 'thanks', context: {} },
- // The steps taken to reach this state
- steps: [
- { state: { value: 'question' }, event: { type: 'CLICK_BAD' } },
- { state: { value: 'form' }, event: { type: 'SUBMIT' } }
- ]
-}
-```
-
-### Shortest vs simple paths
-
-**Shortest paths** use Dijkstra's algorithm to find the minimum number of transitions to reach each state. Use shortest paths when you want:
-- One efficient path to each state
-- Minimal test cases for state coverage
-- Quick traversal verification
-
-**Simple paths** use depth-first search to find all possible non-cyclic paths. Use simple paths when you want:
-- Complete transition coverage
-- All possible user flows
-- Exhaustive testing
-
-## `getShortestPaths(logic, options?)`
-
-Returns the shortest path from the initial state to every reachable state.
-
-```ts
-import { createMachine } from 'xstate';
-import { getShortestPaths } from 'xstate/graph';
-
-const feedbackMachine = createMachine({
- id: 'feedback',
- initial: 'question',
- states: {
- question: {
- on: {
- CLICK_GOOD: { target: 'thanks' },
- CLICK_BAD: { target: 'form' },
- CLOSE: { target: 'closed' }
- }
- },
- form: {
- on: {
- SUBMIT: { target: 'thanks' },
- CLOSE: { target: 'closed' }
- }
- },
- thanks: {
- on: {
- CLOSE: { target: 'closed' }
- }
- },
- closed: {
- type: 'final'
- }
- }
-});
-
-const paths = getShortestPaths(feedbackMachine);
-
-// Returns array of paths:
-// [
-// { state: 'question', steps: [] },
-// { state: 'thanks', steps: [{ state: 'question', event: { type: 'CLICK_GOOD' } }] },
-// { state: 'form', steps: [{ state: 'question', event: { type: 'CLICK_BAD' } }] },
-// { state: 'closed', steps: [{ state: 'question', event: { type: 'CLOSE' } }] }
-// ]
-```
-
-Notice that reaching `closed` from `thanks` (2 steps) is not included because there's a shorter path directly from `question` (1 step).
-
-## `getSimplePaths(logic, options?)`
-
-Returns all simple (non-cyclic) paths from the initial state to every reachable state.
-
-```ts
-import { getSimplePaths } from 'xstate/graph';
-
-const paths = getSimplePaths(feedbackMachine);
-
-// Returns many more paths, including:
-// - question → thanks (via CLICK_GOOD)
-// - question → form → thanks (via CLICK_BAD, SUBMIT)
-// - question → thanks → closed (via CLICK_GOOD, CLOSE)
-// - question → form → thanks → closed (via CLICK_BAD, SUBMIT, CLOSE)
-// - question → form → closed (via CLICK_BAD, CLOSE)
-// - question → closed (via CLOSE)
-// ... and more
-```
-
-Simple paths provide complete transition coverage - every valid sequence through the machine.
-
-## `getPathsFromEvents(logic, events, options?)`
-
-Traces a specific sequence of events and returns the resulting path. Useful for validating that a specific user flow works as expected.
-
-```ts
-import { getPathsFromEvents } from 'xstate/graph';
-
-const path = getPathsFromEvents(feedbackMachine, [
- { type: 'CLICK_BAD' },
- { type: 'SUBMIT' },
- { type: 'CLOSE' }
-]);
-
-// Returns:
-// {
-// state: { value: 'closed' },
-// ,
-// steps: [
-// { state: { value: 'question' }, event: { type: 'CLICK_BAD' } },
-// { state: { value: 'form' }, event: { type: 'SUBMIT' } },
-// { state: { value: 'thanks' }, event: { type: 'CLOSE' } }
-// ]
-// }
-```
-
-## Traversal options
-
-All path functions accept an options object to customize traversal:
-
-### `events`
-
-Specify event payloads for events that require data. By default, events are traversed with just their type.
-
-```ts
-import { setup, assign } from 'xstate';
-import { getShortestPaths } from 'xstate/graph';
-
-const counterMachine = setup({
- types: {
- events: {} as { type: 'INC'; value: number }
- }
-}).createMachine({
- id: 'counter',
- initial: 'active',
- context: { count: 0 },
- states: {
- active: {
- on: {
- INC: {
- actions: assign({
- count: ({ context, event }) => context.count + event.value
- })
- }
- }
- }
- }
-});
-
-const paths = getShortestPaths(counterMachine, {
- events: [
- { type: 'INC', value: 1 },
- { type: 'INC', value: 5 },
- { type: 'INC', value: 10 }
- ]
-});
-```
-
-You can also provide a function that returns events based on the current state:
-
-```ts
-const paths = getShortestPaths(counterMachine, {
- events: (state) => {
- // Generate different events based on context
- if (state.context.count < 10) {
- return [{ type: 'INC', value: 1 }];
- }
- return [{ type: 'INC', value: 10 }];
- }
-});
-```
-
-### `toState`
-
-Filter paths to only those reaching states matching a condition:
-
-```ts
-const paths = getShortestPaths(feedbackMachine, {
- toState: (state) => state.value === 'closed'
-});
-
-// Only returns paths ending in 'closed' state
-```
-
-### `fromState`
-
-Start traversal from a specific state instead of the initial state:
-
-```ts
-import { createActor } from 'xstate';
-
-const actor = createActor(feedbackMachine).start();
-actor.send({ type: 'CLICK_BAD' });
-
-const paths = getShortestPaths(feedbackMachine, {
- fromState: actor.getSnapshot()
-});
-
-// Paths starting from 'form' state
-```
-
-### `stopWhen`
-
-Stop traversing when a condition is met:
-
-```ts
-const paths = getShortestPaths(counterMachine, {
- events: [{ type: 'INC', value: 1 }],
- stopWhen: (state) => state.context.count >= 5
-});
-
-// Stops exploring paths once count reaches 5
-```
-
-### `limit`
-
-Maximum number of states to traverse (prevents infinite loops with context):
-
-```ts
-const paths = getShortestPaths(counterMachine, {
- events: [{ type: 'INC', value: 1 }],
- limit: 100 // Stop after 100 unique states
-});
-```
-
-### `serializeState` and `serializeEvent`
-
-Customize how states and events are serialized for comparison. By default, states are serialized as JSON strings of their value and context.
-
-```ts
-const paths = getShortestPaths(machine, {
- serializeState: (state) => {
- // Only consider state value, ignore context
- return JSON.stringify(state.value);
- },
- serializeEvent: (event) => {
- // Custom event serialization
- return event.type;
- }
-});
-```
-
-## Working with context
-
-When machines have dynamic context, the state space can become infinite. Use `stopWhen` or `limit` to bound the traversal:
-
-```ts
-import { setup, assign } from 'xstate';
-import { getShortestPaths } from 'xstate/graph';
-
-const counterMachine = setup({
- types: {
- events: {} as { type: 'INC'; value: number } | { type: 'DEC'; value: number }
- }
-}).createMachine({
- id: 'counter',
- initial: 'counting',
- context: { count: 0 },
- states: {
- counting: {
- always: {
- target: 'done',
- guard: ({ context }) => context.count >= 10
- },
- on: {
- INC: {
- actions: assign({
- count: ({ context, event }) => context.count + event.value
- })
- },
- DEC: {
- actions: assign({
- count: ({ context, event }) => context.count - event.value
- })
- }
- }
- },
- done: {
- type: 'final'
- }
- }
-});
-
-const paths = getShortestPaths(counterMachine, {
- events: [
- { type: 'INC', value: 1 },
- { type: 'INC', value: 5 },
- { type: 'DEC', value: 1 }
- ],
- // Bound the state space
- stopWhen: (state) => state.context.count > 15 || state.context.count < -5
-});
-```
-
-## `getAdjacencyMap(logic, options?)`
-
-Returns a map representing the state machine as a graph, with states as keys and their transitions as values.
-
-```ts
-import { getAdjacencyMap } from 'xstate/graph';
-
-const adjacencyMap = getAdjacencyMap(feedbackMachine);
-
-// Structure:
-// {
-// '"question"': {
-// state: { value: 'question', ... },
-// transitions: {
-// '{"type":"CLICK_GOOD"}': { event: {...}, state: {...} },
-// '{"type":"CLICK_BAD"}': { event: {...}, state: {...} },
-// '{"type":"CLOSE"}': { event: {...}, state: {...} }
-// }
-// },
-// '"form"': { ... },
-// ...
-// }
-```
-
-## `toDirectedGraph(machine)`
-
-Converts a machine to a directed graph structure for visualization:
-
-```ts
-import { toDirectedGraph } from 'xstate/graph';
-
-const digraph = toDirectedGraph(feedbackMachine);
-
-// Structure:
-// {
-// id: 'feedback',
-// stateNode: StateNode,
-// children: [
-// { id: 'feedback.question', children: [], edges: [...] },
-// { id: 'feedback.form', children: [], edges: [...] },
-// ...
-// ],
-// edges: [
-// { source: StateNode, target: StateNode, transition: {...} },
-// ...
-// ]
-// }
-```
-
-## Model-based testing
-
-Path generation enables model-based testing - generating test cases directly from your state machine. Use `createTestModel` to wrap your machine with testing utilities:
-
-```ts
-import { createMachine } from 'xstate';
-import { createTestModel } from 'xstate/graph';
-
-const toggleMachine = createMachine({
- id: 'toggle',
- initial: 'inactive',
- states: {
- inactive: {
- on: { TOGGLE: 'active' }
- },
- active: {
- on: { TOGGLE: 'inactive' }
- }
- }
-});
-
-const model = createTestModel(toggleMachine);
-
-// Get paths for testing
-const paths = model.getShortestPaths();
-
-// Use with your test framework
-describe('toggle', () => {
- for (const path of paths) {
- it(`reaches ${JSON.stringify(path.state.value)}`, async () => {
- await path.test({
- events: {
- TOGGLE: async () => {
- // Execute the toggle action in your app
- await page.click('#toggle-button');
- }
- },
- states: {
- inactive: async (state) => {
- // Assert the app is in inactive state
- await expect(page.locator('#status')).toHaveText('Inactive');
- },
- active: async (state) => {
- await expect(page.locator('#status')).toHaveText('Active');
- }
- }
- });
- });
- }
-});
-```
-
-### TestModel methods
-
-- `model.getShortestPaths(options?)` - get shortest paths
-- `model.getSimplePaths(options?)` - get all simple paths
-- `model.getPaths(pathGenerator)` - use custom path generator
-
-### Path testing
-
-Each path returned by `TestModel` has a `test` method that:
-
-1. Starts from the initial state
-2. Executes each event in the path using your event handlers
-3. Verifies each state using your state assertions
-
-```ts
-path.test({
- events: {
- // Map event types to async functions that execute the event
- CLICK_GOOD: async () => await page.click('.good-button'),
- SUBMIT: async () => await page.click('button[type="submit"]')
- },
- states: {
- // Map state values to async assertions
- question: async () => await expect(page.locator('.question')).toBeVisible(),
- form: async () => await expect(page.locator('form')).toBeVisible(),
- thanks: async () => await expect(page.locator('.thanks')).toBeVisible()
- }
-});
-```
-
-:::studio
-
-You can [generate test paths from your state machines in Stately Studio](generate-test-paths.mdx), with support for Playwright, Vitest, and custom formats.
-
-:::
-
-## Path deduplication
-
-When using simple paths, you may get many paths where shorter paths are prefixes of longer ones. The `deduplicatePaths` utility removes redundant paths:
-
-```ts
-import { getSimplePaths, deduplicatePaths } from 'xstate/graph';
-
-const allPaths = getSimplePaths(machine);
-const uniquePaths = deduplicatePaths(allPaths);
-
-// Removes paths that are prefixes of longer paths
-// e.g., [A→B] is removed if [A→B→C] exists
-```
-
-## Example: Complete test generation
-
-```ts
-import { createMachine } from 'xstate';
-import { createTestModel } from 'xstate/graph';
-import { test, expect } from 'vitest';
-
-const authMachine = createMachine({
- id: 'auth',
- initial: 'loggedOut',
- states: {
- loggedOut: {
- on: {
- LOGIN: 'loggingIn'
- }
- },
- loggingIn: {
- on: {
- SUCCESS: 'loggedIn',
- FAILURE: 'loggedOut'
- }
- },
- loggedIn: {
- on: {
- LOGOUT: 'loggedOut'
- }
- }
- }
-});
-
-const model = createTestModel(authMachine);
-
-describe('auth flows', () => {
- const paths = model.getShortestPaths({
- toState: (state) => state.matches('loggedIn')
- });
-
- for (const path of paths) {
- test(path.description, async () => {
- // Setup
- const app = await setupApp();
-
- await path.test({
- events: {
- LOGIN: async () => {
- await app.fillLoginForm('user', 'pass');
- await app.submit();
- },
- SUCCESS: async () => {
- await app.mockAuthSuccess();
- },
- LOGOUT: async () => {
- await app.clickLogout();
- }
- },
- states: {
- loggedOut: async () => {
- expect(app.isLoggedIn()).toBe(false);
- },
- loggingIn: async () => {
- expect(app.isLoading()).toBe(true);
- },
- loggedIn: async () => {
- expect(app.isLoggedIn()).toBe(true);
- }
- }
- });
- });
- }
-});
-```
diff --git a/docusaurus.config.js b/docusaurus.config.js
deleted file mode 100644
index 39b17ef54..000000000
--- a/docusaurus.config.js
+++ /dev/null
@@ -1,297 +0,0 @@
-// @ts-check
-// Note: type annotations allow type checking and IDEs autocompletion
-require('dotenv').config();
-const a11yEmoji = require('@fec/remark-a11y-emoji');
-const { themes } = require('prism-react-renderer');
-
-/** @type {import('@docusaurus/types').Config} */
-const config = {
- title: 'Stately',
- tagline:
- 'Stately’s documentation and blog: state machines and statecharts for the modern web',
- url: 'https://stately.ai',
- baseUrl: '/',
- baseUrlIssueBanner: false,
- onBrokenAnchors: 'warn',
- onBrokenLinks: 'warn',
- onBrokenMarkdownLinks: 'warn',
- favicon: 'icon.svg',
- staticDirectories: ['static'],
-
- // GitHub pages deployment config.
- // If you aren't using GitHub pages, you don't need these.
- organizationName: 'statelyai', // Usually your GitHub org/user name.
- projectName: 'docs', // Usually your repo name.
-
- // Even if you don't use internalization, you can use this field to set useful
- // metadata like html lang. For example, if your site is Chinese, you may want
- // to replace "en" with "zh-Hans".
- i18n: {
- defaultLocale: 'en',
- locales: ['en'],
- },
-
- scripts: [
- {
- src: 'https://plausible.io/js/script.tagged-events.js',
- defer: true,
- 'data-domain': 'stately.ai',
- },
- ],
-
- presets: [
- [
- 'classic',
- {
- docs: {
- routeBasePath: '/docs',
- sidebarPath: require.resolve('./sidebars.js'),
-
- // Remove this to remove the "edit this page" links.
- editUrl: 'https://github.com/statelyai/docs/tree/main/',
-
- lastVersion: 'current',
- includeCurrentVersion: true,
- versions: {
- current: {
- label: 'XState v5',
- banner: 'none',
- },
- 4: {
- label: 'XState v4',
- path: 'xstate-v4',
- banner: 'none',
- },
- },
-
- // Different types of admonitions/“tip boxes” available for our use.
- admonitions: {
- keywords: [
- 'note',
- 'tip',
- 'info',
- 'warning',
- 'danger',
- 'typescript',
- 'xstate',
- 'warningxstate',
- 'breakingchange',
- 'studio',
- 'new',
- 'video',
- ],
- },
-
- // Add accessible emoji remark plugin
- remarkPlugins: [
- a11yEmoji,
- [require('@docusaurus/remark-plugin-npm2yarn'), { sync: true }],
- ],
- },
- blog: {
- blogTitle: 'Stately Blog',
- blogDescription: 'Stately’s engineering blog',
- blogSidebarCount: 0,
- postsPerPage: 10,
- editUrl: ({ locale, blogDirPath, blogPath, permalink }) =>
- `https://github.com/statelyai/docs/edit/main/${blogDirPath}/${blogPath}`,
- remarkPlugins: [
- [require('@docusaurus/remark-plugin-npm2yarn'), { sync: true }],
- ],
- },
- theme: {
- customCss: require.resolve('./src/css/custom.css'),
- },
- },
- ],
- ],
-
- plugins: [
- [
- '@docusaurus/plugin-client-redirects',
- {
- // Unbreak specific pages we know are broken where the structure changed between XState v4 and v5
- redirects: [
- {
- to: '/docs/xstate-v4/xstate/model-based-testing/intro',
- from: '/docs/category/xstate-model-based-testing',
- },
- {
- to: '/docs/xstate-v4/xstate/actors/parent-child-communication',
- from: '/docs/xstate/actors/parent-child-communication',
- },
- {
- to: '/docs/xstate-v4/xstate/typescript/type-helpers',
- from: '/docs/xstate/typescript/type-helpers',
- },
- {
- to: '/docs/states',
- from: '/docs/states/intro',
- },
- {
- to: '/docs/state-machines-and-statecharts',
- from: '/docs/xstate/basics/what-is-a-statechart',
- },
- {
- to: '/docs/typegen',
- from: '/docs/xstate/typescript/typegen',
- },
- {
- // Redirect to the new "Getting Started" page from the Sky category page (until we have a Sky category page)
- to: '/docs/stately-sky-getting-started',
- from: '/docs/sky',
- },
- ],
- createRedirects(existingPath) {
- if (existingPath.includes('/docs')) {
- // Redirect everything from /docs/xstate-v5 to /docs (to unbreak Google search results)
- return [existingPath.replace('/docs', '/docs/xstate-v5')];
- }
- return undefined; // Return a falsy value: no redirect created
- },
- },
- ],
- async function tailwindPlugin(context, options) {
- return {
- name: 'docusaurus-tailwindcss',
- configurePostCss(postcssOptions) {
- // Add Tailwind CSS v4 PostCSS plugin
- postcssOptions.plugins.unshift(require('@tailwindcss/postcss'));
- postcssOptions.plugins.push(require('autoprefixer'));
- return postcssOptions;
- },
- };
- },
- ],
-
- themeConfig:
- /** @type {import('@docusaurus/preset-classic').ThemeConfig} */
- ({
- image: 'static/docs-default.png',
- docs: {
- sidebar: {
- hideable: true,
- },
- },
- navbar: {
- title: '',
- logo: {
- alt: 'Stately',
- src: '/logo-black.svg',
- srcDark: '/logo-white-nobg.svg',
- href: '/docs',
- },
- items: [
- {
- type: 'search',
- position: 'right',
- },
- { to: '/docs', label: 'Docs', position: 'right' },
- {
- // href: 'https://tsdocs.dev/docs/xstate',
- href: 'https://www.jsdocs.io/package/xstate',
- label: 'API',
- position: 'right',
- className: 'plausible-event-name=docs+api',
- },
- {
- href: 'https://stately.ai/registry/projects',
- label: 'Studio',
- position: 'right',
- className: 'plausible-event-name=docs+studio',
- },
- {
- href: 'https://stately.ai/editor',
- label: 'Editor',
- position: 'right',
- className: 'plausible-event-name=docs+editor',
- },
- {
- href: 'https://stately.ai/registry/discover',
- label: 'Discover',
- position: 'right',
- className: 'plausible-event-name=docs+discover',
- },
- { to: 'blog', label: 'Blog', position: 'right' },
- {
- type: 'docsVersionDropdown',
- position: 'right',
- },
- {
- type: 'html',
- position: 'right',
- value:
- ' ',
- },
- ],
- },
- footer: {
- style: 'light',
- links: [
- {
- label: 'Changelog',
- href: 'https://stately.ai/blog/tags/changelog',
- target: '_self',
- },
- {
- label: 'Roadmap',
- href: 'https://feedback.stately.ai',
- target: '_self',
- },
- {
- label: 'Code of conduct',
- href: '/code-of-conduct',
- target: '_self',
- },
- {
- label: 'Privacy policy',
- href: '/privacy',
- target: '_self',
- },
- {
- html: ' ',
- },
- {
- html: ' ',
- },
- {
- html: ' ',
- },
- {
- html: ' ',
- },
- {
- html: ' ',
- },
- {
- html: ' ',
- },
- {
- html: ' ',
- },
- ],
- copyright: `Copyright © Stately, ${new Date().getFullYear()}`,
- },
- algolia: {
- appId: 'BYNMHHN151',
- apiKey: 'e2fd3f2a7cd06067674996dd674fb241',
- indexName: 'stately',
- contextualSearch: true,
- },
- announcementBar: {
- content:
- '
👋 Welcome! These docs are in beta, please give us any feedback in our
Discord Documentation channel .',
- isCloseable: true,
- },
- colorMode: {
- disableSwitch: false,
- respectPrefersColorScheme: true,
- },
- prism: {
- theme: themes.oneLight,
- darkTheme: themes.oneDark,
- },
- }),
-};
-
-module.exports = config;
diff --git a/eslint.config.mjs b/eslint.config.mjs
new file mode 100644
index 000000000..a8e4107a1
--- /dev/null
+++ b/eslint.config.mjs
@@ -0,0 +1,26 @@
+import { dirname } from 'path';
+import { fileURLToPath } from 'url';
+import { FlatCompat } from '@eslint/eslintrc';
+
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = dirname(__filename);
+
+const compat = new FlatCompat({
+ baseDirectory: __dirname,
+});
+
+const eslintConfig = [
+ ...compat.extends('next/core-web-vitals', 'next/typescript'),
+ {
+ ignores: [
+ 'node_modules/**',
+ '.next/**',
+ 'out/**',
+ 'build/**',
+ '.source/**',
+ 'next-env.d.ts',
+ ],
+ },
+];
+
+export default eslintConfig;
diff --git a/i18n/en/code.json b/i18n/en/code.json
deleted file mode 100644
index 10b366813..000000000
--- a/i18n/en/code.json
+++ /dev/null
@@ -1,392 +0,0 @@
-{
- "theme.ErrorPageContent.title": {
- "message": "This page crashed.",
- "description": "The title of the fallback page when the page crashed"
- },
- "theme.ErrorPageContent.tryAgain": {
- "message": "Try again",
- "description": "The label of the button to try again when the page crashed"
- },
- "theme.NotFound.title": {
- "message": "Page not found",
- "description": "The title of the 404 page"
- },
- "theme.NotFound.p1": {
- "message": "We could not find what you were looking for.",
- "description": "The first paragraph of the 404 page"
- },
- "theme.NotFound.p2": {
- "message": "Please contact the owner of the site that linked you to the original URL and let them know their link is broken.",
- "description": "The 2nd paragraph of the 404 page"
- },
- "theme.admonition.note": {
- "message": "note",
- "description": "The default label used for the Note admonition (:::note)"
- },
- "theme.admonition.tip": {
- "message": "tip",
- "description": "The default label used for the Tip admonition (:::tip)"
- },
- "theme.admonition.danger": {
- "message": "danger",
- "description": "The default label used for the Danger admonition (:::danger)"
- },
- "theme.admonition.info": {
- "message": "info",
- "description": "The default label used for the Info admonition (:::info)"
- },
- "theme.admonition.caution": {
- "message": "caution",
- "description": "The default label used for the Caution admonition (:::caution)"
- },
- "theme.AnnouncementBar.closeButtonAriaLabel": {
- "message": "Close",
- "description": "The ARIA label for close button of announcement bar"
- },
- "theme.BackToTopButton.buttonAriaLabel": {
- "message": "Scroll back to top",
- "description": "The ARIA label for the back to top button"
- },
- "theme.blog.archive.title": {
- "message": "Archive",
- "description": "The page & hero title of the blog archive page"
- },
- "theme.blog.archive.description": {
- "message": "Archive",
- "description": "The page & hero description of the blog archive page"
- },
- "theme.blog.paginator.navAriaLabel": {
- "message": "Blog list page navigation",
- "description": "The ARIA label for the blog pagination"
- },
- "theme.blog.paginator.newerEntries": {
- "message": "Newer entries",
- "description": "The label used to navigate to the newer blog posts page (previous page)"
- },
- "theme.blog.paginator.olderEntries": {
- "message": "Older entries",
- "description": "The label used to navigate to the older blog posts page (next page)"
- },
- "theme.blog.post.paginator.navAriaLabel": {
- "message": "Blog post page navigation",
- "description": "The ARIA label for the blog posts pagination"
- },
- "theme.blog.post.paginator.newerPost": {
- "message": "Newer post",
- "description": "The blog post button label to navigate to the newer/previous post"
- },
- "theme.blog.post.paginator.olderPost": {
- "message": "Older post",
- "description": "The blog post button label to navigate to the older/next post"
- },
- "theme.colorToggle.ariaLabel": {
- "message": "Switch between dark and light mode (currently {mode})",
- "description": "The ARIA label for the navbar color mode toggle"
- },
- "theme.colorToggle.ariaLabel.mode.dark": {
- "message": "dark mode",
- "description": "The name for the dark color mode"
- },
- "theme.colorToggle.ariaLabel.mode.light": {
- "message": "light mode",
- "description": "The name for the light color mode"
- },
- "theme.blog.post.plurals": {
- "message": "One post|{count} posts",
- "description": "Pluralized label for \"{count} posts\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)"
- },
- "theme.blog.tagTitle": {
- "message": "{nPosts} tagged with “{tagName}”",
- "description": "The title of the page for a blog tag"
- },
- "theme.blog.tagDescription": {
- "message": "Browse all posts tagged with “{tagName}” on the Stately blog. {nPosts} tagged with “{tagName}.”",
- "description": "The description of the page for a blog tag"
- },
- "theme.tags.tagsPageLink": {
- "message": "View all tags",
- "description": "The label of the link targeting the tag list page"
- },
- "theme.docs.breadcrumbs.home": {
- "message": "Home page",
- "description": "The ARIA label for the home page in the breadcrumbs"
- },
- "theme.docs.breadcrumbs.navAriaLabel": {
- "message": "Breadcrumbs",
- "description": "The ARIA label for the breadcrumbs"
- },
- "theme.docs.DocCard.categoryDescription": {
- "message": "{count} pages.",
- "description": "The default description for a category card in the generated index about how many items this category includes"
- },
- "theme.docs.paginator.navAriaLabel": {
- "message": "Docs pages navigation",
- "description": "The ARIA label for the docs pagination"
- },
- "theme.docs.paginator.previous": {
- "message": "Previous",
- "description": "The label used to navigate to the previous doc"
- },
- "theme.docs.paginator.next": {
- "message": "Next",
- "description": "The label used to navigate to the next doc"
- },
- "theme.docs.tagDocListPageTitle.nDocsTagged": {
- "message": "One doc tagged|{count} docs tagged",
- "description": "Pluralized label for \"{count} docs tagged\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)"
- },
- "theme.docs.tagDocListPageTitle": {
- "message": "{nDocsTagged} with “{tagName}”",
- "description": "The title of the page for a docs tag"
- },
- "theme.blog.tagListPageDescription": {
- "message": "From A-Z, browse all the tags used in the blog posts on the Stately Blog.",
- "description": "The description of the page for the blog tags list"
- },
- "theme.docs.versionBadge.label": {
- "message": "Version: {versionLabel}"
- },
- "theme.docs.versions.unreleasedVersionLabel": {
- "message": "Docs for {versionLabel} are in progress",
- "description": "The label used to tell the user that he's browsing an unreleased doc version"
- },
- "theme.docs.versions.unmaintainedVersionLabel": {
- "message": "Docs for {versionLabel} are no longer actively maintained",
- "description": "The label used to tell the user that he's browsing an unmaintained doc version"
- },
- "theme.docs.versions.latestVersionSuggestionLabel": {
- "message": "For {versionLabel}, see the {latestVersionLink} documentation.",
- "description": "The label used to tell the user to check the latest version"
- },
- "theme.docs.versions.latestVersionLinkLabel": {
- "message": "{versionLabel} documentation",
- "description": "The label used for the latest version suggestion link label"
- },
- "theme.common.editThisPage": {
- "message": "Edit this page on GitHub",
- "description": "The link label to edit the current page"
- },
- "theme.common.headingLinkTitle": {
- "message": "Direct link to heading",
- "description": "Title for link to heading"
- },
- "theme.lastUpdated.atDate": {
- "message": " on {date}",
- "description": "The words used to describe on which date a page has been last updated"
- },
- "theme.lastUpdated.byUser": {
- "message": " by {user}",
- "description": "The words used to describe by who the page has been last updated"
- },
- "theme.lastUpdated.lastUpdatedAtBy": {
- "message": "Last updated{atDate}{byUser}",
- "description": "The sentence used to display when a page has been last updated, and by who"
- },
- "theme.navbar.mobileVersionsDropdown.label": {
- "message": "Versions",
- "description": "The label for the navbar versions dropdown on mobile view"
- },
- "theme.common.skipToMainContent": {
- "message": "Skip to content",
- "description": "The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation"
- },
- "theme.tags.tagsListLabel": {
- "message": "Tags:",
- "description": "The label alongside a tag list"
- },
- "theme.blog.sidebar.navAriaLabel": {
- "message": "Blog recent posts navigation",
- "description": "The ARIA label for recent posts in the blog sidebar"
- },
- "theme.CodeBlock.copied": {
- "message": "Copied",
- "description": "The copied button label on code blocks"
- },
- "theme.CodeBlock.copyButtonAriaLabel": {
- "message": "Copy code to clipboard",
- "description": "The ARIA label for copy code blocks button"
- },
- "theme.CodeBlock.copy": {
- "message": "Copy",
- "description": "The copy button label on code blocks"
- },
- "theme.CodeBlock.wordWrapToggle": {
- "message": "Toggle word wrap",
- "description": "The title attribute for toggle word wrapping button of code block lines"
- },
- "theme.DocSidebarItem.toggleCollapsedCategoryAriaLabel": {
- "message": "Toggle the collapsible sidebar category '{label}'",
- "description": "The ARIA label to toggle the collapsible sidebar category"
- },
- "theme.navbar.mobileLanguageDropdown.label": {
- "message": "Languages",
- "description": "The label for the mobile language switcher dropdown"
- },
- "theme.TOCCollapsible.toggleButtonLabel": {
- "message": "On this page",
- "description": "The label used by the button on the collapsible TOC component"
- },
- "theme.blog.post.readMore": {
- "message": "Read more →",
- "description": "The label used in blog post item excerpts to link to full blog posts"
- },
- "theme.blog.post.readMoreLabel": {
- "message": "Read more about {title} →",
- "description": "The ARIA label for the link to full blog posts from excerpts"
- },
- "theme.blog.post.readingTime.plurals": {
- "message": "One minute read|{readingTime} minute read",
- "description": "Pluralized label for \"{readingTime} min read\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)"
- },
- "theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel": {
- "message": "← Back to main menu",
- "description": "The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)"
- },
- "theme.docs.sidebar.collapseButtonTitle": {
- "message": "Collapse sidebar",
- "description": "The title attribute for collapse button of doc sidebar"
- },
- "theme.docs.sidebar.collapseButtonAriaLabel": {
- "message": "Collapse sidebar",
- "description": "The title attribute for collapse button of doc sidebar"
- },
- "theme.docs.sidebar.expandButtonTitle": {
- "message": "Expand sidebar",
- "description": "The ARIA label and title attribute for expand button of doc sidebar"
- },
- "theme.docs.sidebar.expandButtonAriaLabel": {
- "message": "Expand sidebar",
- "description": "The ARIA label and title attribute for expand button of doc sidebar"
- },
- "theme.SearchBar.seeAll": {
- "message": "See all {count} results"
- },
- "theme.SearchPage.documentsFound.plurals": {
- "message": "One document found|{count} documents found",
- "description": "Pluralized label for \"{count} documents found\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)"
- },
- "theme.SearchPage.existingResultsTitle": {
- "message": "Search results for “{query}”",
- "description": "The search page title for non-empty query"
- },
- "theme.SearchPage.emptyResultsTitle": {
- "message": "Search the Stately documentation and blog",
- "description": "The search page title for empty query"
- },
- "theme.SearchPage.inputPlaceholder": {
- "message": "Type your search here",
- "description": "The placeholder for search page input"
- },
- "theme.SearchPage.inputLabel": {
- "message": "Search",
- "description": "The ARIA label for search page input"
- },
- "theme.SearchPage.algoliaLabel": {
- "message": "Search by Algolia",
- "description": "The ARIA label for Algolia mention"
- },
- "theme.SearchPage.noResultsText": {
- "message": "No results were found",
- "description": "The paragraph for empty search result"
- },
- "theme.SearchPage.fetchingNewResults": {
- "message": "Fetching new results…",
- "description": "The paragraph for fetching new search results"
- },
- "theme.SearchBar.label": {
- "message": "Search",
- "description": "The ARIA label and placeholder for search button"
- },
- "theme.SearchModal.searchBox.resetButtonTitle": {
- "message": "Clear the query",
- "description": "The label and ARIA label for search box reset button"
- },
- "theme.SearchModal.searchBox.cancelButtonText": {
- "message": "Cancel",
- "description": "The label and ARIA label for search box cancel button"
- },
- "theme.SearchModal.startScreen.recentSearchesTitle": {
- "message": "Recent",
- "description": "The title for recent searches"
- },
- "theme.SearchModal.startScreen.noRecentSearchesText": {
- "message": "No recent searches",
- "description": "The text when no recent searches"
- },
- "theme.SearchModal.startScreen.saveRecentSearchButtonTitle": {
- "message": "Save this search",
- "description": "The label for save recent search button"
- },
- "theme.SearchModal.startScreen.removeRecentSearchButtonTitle": {
- "message": "Remove this search from history",
- "description": "The label for remove recent search button"
- },
- "theme.SearchModal.startScreen.favoriteSearchesTitle": {
- "message": "Favorite",
- "description": "The title for favorite searches"
- },
- "theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle": {
- "message": "Remove this search from favorites",
- "description": "The label for remove favorite search button"
- },
- "theme.SearchModal.errorScreen.titleText": {
- "message": "Unable to fetch results",
- "description": "The title for error screen of search modal"
- },
- "theme.SearchModal.errorScreen.helpText": {
- "message": "You might want to check your network connection.",
- "description": "The help text for error screen of search modal"
- },
- "theme.SearchModal.footer.selectText": {
- "message": "to select",
- "description": "The explanatory text of the action for the enter key"
- },
- "theme.SearchModal.footer.selectKeyAriaLabel": {
- "message": "Enter key",
- "description": "The ARIA label for the Enter key button that makes the selection"
- },
- "theme.SearchModal.footer.navigateText": {
- "message": "to navigate",
- "description": "The explanatory text of the action for the Arrow up and Arrow down key"
- },
- "theme.SearchModal.footer.navigateUpKeyAriaLabel": {
- "message": "Arrow up",
- "description": "The ARIA label for the Arrow up key button that makes the navigation"
- },
- "theme.SearchModal.footer.navigateDownKeyAriaLabel": {
- "message": "Arrow down",
- "description": "The ARIA label for the Arrow down key button that makes the navigation"
- },
- "theme.SearchModal.footer.closeText": {
- "message": "to close",
- "description": "The explanatory text of the action for Escape key"
- },
- "theme.SearchModal.footer.closeKeyAriaLabel": {
- "message": "Escape key",
- "description": "The ARIA label for the Escape key button that close the modal"
- },
- "theme.SearchModal.footer.searchByText": {
- "message": "Search by",
- "description": "The text explain that the search is making by Algolia"
- },
- "theme.SearchModal.noResultsScreen.noResultsText": {
- "message": "No results for",
- "description": "The text explains that there are no results for the following search"
- },
- "theme.SearchModal.noResultsScreen.suggestedQueryText": {
- "message": "Try searching for",
- "description": "The text for the suggested query when no results are found for the following search"
- },
- "theme.SearchModal.noResultsScreen.reportMissingResultsText": {
- "message": "Believe this query should return results?",
- "description": "The text for the question where the user thinks there are missing results"
- },
- "theme.SearchModal.noResultsScreen.reportMissingResultsLinkText": {
- "message": "Let us know.",
- "description": "The text for the link to report missing results"
- },
- "theme.SearchModal.placeholder": {
- "message": "Search docs and blog",
- "description": "The placeholder of the input of the DocSearch pop-up modal"
- }
-}
diff --git a/lib/ThemedLogo.tsx b/lib/ThemedLogo.tsx
new file mode 100644
index 000000000..272bd2305
--- /dev/null
+++ b/lib/ThemedLogo.tsx
@@ -0,0 +1,30 @@
+'use client';
+
+import { useTheme } from 'next-themes';
+import { useEffect, useState } from 'react';
+
+import Logo from '@/content/docs/assets/logo-white-nobg.svg';
+import LogoDark from '@/content/docs/assets/logo-black.svg';
+
+export function ThemedLogo() {
+ const { theme, resolvedTheme } = useTheme();
+ const [mounted, setMounted] = useState(false);
+
+ // Avoid hydration mismatch by only rendering after mount
+ useEffect(() => {
+ setMounted(true);
+ }, []);
+
+ // Use resolvedTheme to handle system preference
+ const isDark = mounted && (resolvedTheme === 'dark' || theme === 'dark');
+
+ // White logo for dark mode, black logo for light mode
+ return (
+
+ );
+}
+
diff --git a/lib/cn.ts b/lib/cn.ts
new file mode 100644
index 000000000..ba66fd250
--- /dev/null
+++ b/lib/cn.ts
@@ -0,0 +1 @@
+export { twMerge as cn } from 'tailwind-merge';
diff --git a/lib/get-llm-text.ts b/lib/get-llm-text.ts
new file mode 100644
index 000000000..835a4fe95
--- /dev/null
+++ b/lib/get-llm-text.ts
@@ -0,0 +1,7 @@
+import { source } from '@/lib/source';
+import type { InferPageType } from 'fumadocs-core/source';
+export async function getLLMText(page: InferPageType
) {
+ const processed = await page.data.getText('processed');
+ return `# ${page.data.title} (${page.url})
+${processed}`;
+}
diff --git a/lib/inkeep-qa-schema.ts b/lib/inkeep-qa-schema.ts
new file mode 100644
index 000000000..7f1948fb5
--- /dev/null
+++ b/lib/inkeep-qa-schema.ts
@@ -0,0 +1,50 @@
+import { z } from 'zod';
+
+const InkeepRecordTypes = z.enum([
+ 'documentation',
+ 'site',
+ 'discourse_post',
+ 'github_issue',
+ 'github_discussion',
+ 'stackoverflow_question',
+ 'discord_forum_post',
+ 'discord_message',
+ 'custom_question_answer',
+]);
+
+const LinkType = z.union([
+ InkeepRecordTypes,
+ z.string(), // catch all
+]);
+
+const LinkSchema = z.looseObject({
+ label: z.string().nullish(), // the value of the footnote, e.g. `1`
+ url: z.string(),
+ title: z.string().nullish(),
+ type: LinkType.nullish(),
+ breadcrumbs: z.array(z.string()).nullish(),
+});
+
+const LinksSchema = z.array(LinkSchema).nullish();
+
+export const ProvideLinksToolSchema = z.object({
+ links: LinksSchema,
+});
+
+const KnownAnswerConfidence = z.enum([
+ 'very_confident',
+ 'somewhat_confident',
+ 'not_confident',
+ 'no_sources',
+ 'other',
+]);
+
+const AnswerConfidence = z.union([KnownAnswerConfidence, z.string()]); // evolvable
+
+const AIAnnotationsToolSchema = z.looseObject({
+ answerConfidence: AnswerConfidence,
+});
+
+export const ProvideAIAnnotationsToolSchema = z.object({
+ aiAnnotations: AIAnnotationsToolSchema,
+});
diff --git a/lib/layout.shared.tsx b/lib/layout.shared.tsx
new file mode 100644
index 000000000..132416b1f
--- /dev/null
+++ b/lib/layout.shared.tsx
@@ -0,0 +1,92 @@
+import type { BaseLayoutProps } from 'fumadocs-ui/layouts/shared';
+
+import {
+ BookOpenIcon,
+ CircuitBoardIcon,
+ PanelsTopLeftIcon,
+ TelescopeIcon,
+} from 'lucide-react';
+
+import { ThemedLogo } from './ThemedLogo';
+
+/**
+ * Shared layout configurations
+ *
+ * you can customise layouts individually from:
+ * Home Layout: app/(home)/layout.tsx
+ * Docs Layout: app/docs/layout.tsx
+ */
+export function baseOptions(): BaseLayoutProps {
+ return {
+ nav: {
+ title: ,
+ },
+ // see https://fumadocs.dev/docs/ui/navigation/links
+ links: [
+ {
+ text: 'Docs',
+ url: '/docs',
+ active: 'nested-url',
+ },
+ {
+ text: 'API',
+ url: 'https://www.jsdocs.io/package/xstate',
+ external: true,
+ icon: ,
+ },
+ {
+ text: 'Studio',
+ url: 'https://stately.ai/registry/projects',
+ external: true,
+ icon: ,
+ },
+ {
+ text: 'Editor',
+ url: 'https://stately.ai/editor',
+ external: true,
+ icon: ,
+ },
+ {
+ text: 'Discover',
+ url: 'https://stately.ai/registry/discover',
+ external: true,
+ icon: ,
+ },
+ {
+ text: 'Blog',
+ url: '/blog',
+ active: 'nested-url',
+ },
+ {
+ type: 'icon',
+ text: 'Visit XState GitHub repository',
+ icon: (
+
+
+
+
+ ),
+ url: 'https://github.com/statelyai/xstate',
+ external: true,
+ },
+ ],
+ };
+}
diff --git a/lib/source.ts b/lib/source.ts
new file mode 100644
index 000000000..767a07dad
--- /dev/null
+++ b/lib/source.ts
@@ -0,0 +1,34 @@
+import { docs } from '@/.source';
+import { type InferPageType, loader } from 'fumadocs-core/source';
+import { lucideIconsPlugin } from 'fumadocs-core/source/lucide-icons';
+import { createMDXSource } from 'fumadocs-mdx/runtime/next';
+import { blogPosts } from '@/.source';
+
+export const blog = loader({
+ baseUrl: '/blog',
+ source: createMDXSource(blogPosts),
+});
+
+// See https://fumadocs.dev/docs/headless/source-api for more info
+export const source = loader({
+ baseUrl: '/docs',
+ source: docs.toFumadocsSource(),
+ plugins: [lucideIconsPlugin()],
+});
+
+export function getPageImage(page: InferPageType) {
+ const segments = [...page.slugs, 'image.png'];
+
+ return {
+ segments,
+ url: `/og/docs/${segments.join('/')}`,
+ };
+}
+
+export async function getLLMText(page: InferPageType) {
+ const processed = await page.data.getText('processed');
+
+ return `# ${page.data.title} (${page.url})
+
+${processed}`;
+}
diff --git a/mdx-components.tsx b/mdx-components.tsx
new file mode 100644
index 000000000..244c704db
--- /dev/null
+++ b/mdx-components.tsx
@@ -0,0 +1,21 @@
+import defaultMdxComponents from 'fumadocs-ui/mdx';
+import * as TabsComponents from 'fumadocs-ui/components/tabs';
+import { EmbedMachine } from './content/components/EmbedMachine';
+import { YouTube } from './content/components/YouTube';
+import { Tweet } from './content/components/Tweet';
+import * as Twoslash from 'fumadocs-twoslash/ui';
+
+import type { MDXComponents } from 'mdx/types';
+
+// use this function to get MDX components, you will need it for rendering MDX
+export function getMDXComponents(components?: MDXComponents): MDXComponents {
+ return {
+ ...defaultMdxComponents,
+ ...TabsComponents,
+ ...components,
+ EmbedMachine,
+ YouTube,
+ Tweet,
+ ...Twoslash,
+ };
+}
diff --git a/next-env.d.ts b/next-env.d.ts
new file mode 100644
index 000000000..9edff1c7c
--- /dev/null
+++ b/next-env.d.ts
@@ -0,0 +1,6 @@
+///
+///
+import "./.next/types/routes.d.ts";
+
+// NOTE: This file should not be edited
+// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
diff --git a/next.config.mjs b/next.config.mjs
new file mode 100644
index 000000000..97ca45a7c
--- /dev/null
+++ b/next.config.mjs
@@ -0,0 +1,38 @@
+import { createMDX } from 'fumadocs-mdx/next';
+
+const withMDX = createMDX();
+
+/** @type {import('next').NextConfig} */
+const config = {
+ reactStrictMode: true,
+ images: {
+ remotePatterns: [
+ {
+ protocol: 'https',
+ hostname: 'stately.ai',
+ },
+ {
+ protocol: 'https',
+ hostname: 'cloudinary.com',
+ },
+ {
+ protocol: 'https',
+ hostname: '*.amazonaws.com',
+ },
+ ],
+ },
+ serverExternalPackages: ['typescript', 'twoslash'],
+ async redirects() {
+ return [];
+ },
+ async rewrites() {
+ return [
+ {
+ source: '/docs/:path*.mdx',
+ destination: '/llms.mdx/:path*',
+ },
+ ];
+ },
+};
+
+export default withMDX(config);
diff --git a/package.json b/package.json
index d587e6f5e..9dc4fd357 100644
--- a/package.json
+++ b/package.json
@@ -1,64 +1,59 @@
{
- "name": "stately-docs",
- "version": "0.1.0",
- "repository": "https://github.com/statelyai/docs",
+ "name": "fumadocs",
+ "version": "0.0.0",
+ "private": true,
+ "engines": {
+ "node": "24.x"
+ },
"scripts": {
- "dev": "docusaurus start",
- "build": "docusaurus build",
- "clear": "docusaurus clear",
- "serve": "docusaurus serve",
- "format": "prettier --write '**/*.{js,jsx,ts,tsx,md,mdx,json}'"
+ "build": "next build",
+ "dev": "next dev --turbo",
+ "start": "next start",
+ "postinstall": "fumadocs-mdx",
+ "lint": "eslint"
},
"dependencies": {
- "@docusaurus/core": "^3.1.0",
- "@docusaurus/plugin-client-redirects": "^3.1.0",
- "@docusaurus/preset-classic": "^3.1.0",
- "@docusaurus/remark-plugin-npm2yarn": "^3.1.0",
- "@headlessui/react": "^1.7.17",
- "@mdx-js/react": "^3.0.0",
- "@microsoft/api-extractor": "^7.38.3",
- "@tailwindcss/postcss": "^4.1.13",
- "@xstate/inspect": "^0.8.0",
- "@xstate/machine-extractor": "^0.13.0",
- "@xstate/react": "^3.2.2",
- "autoprefixer": "^10.4.16",
- "clsx": "^2.0.0",
- "docusaurus-plugin-api-extractor": "^2.0.4",
- "headlessui": "^0.0.0",
- "lucide-react": "^0.293.0",
+ "@ai-sdk/openai-compatible": "^1.0.29",
+ "@ai-sdk/react": "^2.0.115",
+ "@mdx-js/react": "^3.1.1",
+ "@radix-ui/react-presence": "^1.1.5",
+ "ai": "^5.0.113",
+ "class-variance-authority": "^0.7.1",
+ "fumadocs-core": "^16.2.4",
+ "fumadocs-mdx": "^13.0.8",
+ "fumadocs-twoslash": "^3.1.10",
+ "fumadocs-ui": "^16.2.5",
+ "hast": "^1.0.0",
+ "hast-util-to-jsx-runtime": "^2.3.6",
+ "lucide-react": "^0.544.0",
"mdx-embed": "^1.1.2",
- "postcss": "^8.5.6",
- "prism-react-renderer": "^2.3.0",
- "react": "^18.2.0",
- "react-dom": "^18.2.0",
- "tailwindcss": "^4.1.13",
- "tailwindcss-scoped-preflight": "^3.4.12",
- "typecheck": "^0.1.2",
- "xstate": "^4.38.3"
+ "next": "16.1.0",
+ "next-themes": "^0.4.6",
+ "react": "^19.2.3",
+ "react-dom": "^19.2.3",
+ "react-remove-scroll": "^2.7.2",
+ "remark": "^15.0.1",
+ "remark-gfm": "^4.0.1",
+ "remark-rehype": "^11.1.2",
+ "tailwind-merge": "^3.4.0",
+ "twoslash": "^0.3.4",
+ "unist-util-visit": "^5.0.0",
+ "xstate": "^5.25.0",
+ "zod": "^4.1.13"
},
"devDependencies": {
- "@docusaurus/module-type-aliases": "^3.1.0",
- "@docusaurus/tsconfig": "^3.1.0",
- "@docusaurus/types": "^3.1.0",
- "@fec/remark-a11y-emoji": "^4.0.2",
- "concurrently": "^8.2.2",
- "docusaurus-plugin-typedoc-api": "^4.0.1",
- "dotenv": "^16.3.1",
- "typescript": "^5.3.2"
- },
- "browserslist": {
- "production": [
- ">0.5%",
- "not dead",
- "not op_mini all"
- ],
- "development": [
- "last 1 chrome version",
- "last 1 firefox version",
- "last 1 safari version"
- ]
- },
- "engines": {
- "node": ">=16.14"
+ "@eslint/eslintrc": "^3.3.3",
+ "@tailwindcss/postcss": "^4.1.18",
+ "@types/hast": "^3.0.4",
+ "@types/mdx": "^2.0.13",
+ "@types/node": "24.6.2",
+ "@types/react": "^19.2.7",
+ "@types/react-dom": "^19.2.3",
+ "eslint": "^9.39.2",
+ "eslint-config-next": "16.1.0",
+ "next-validate-link": "^1.6.3",
+ "postcss": "^8.5.6",
+ "tailwindcss": "^4.1.18",
+ "typescript": "^5.9.3"
}
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
new file mode 100644
index 000000000..a5e9db588
--- /dev/null
+++ b/pnpm-lock.yaml
@@ -0,0 +1,7012 @@
+lockfileVersion: '6.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+dependencies:
+ '@ai-sdk/openai-compatible':
+ specifier: ^1.0.29
+ version: 1.0.29(zod@4.2.1)
+ '@ai-sdk/react':
+ specifier: ^2.0.115
+ version: 2.0.118(react@19.2.3)(zod@4.2.1)
+ '@mdx-js/react':
+ specifier: ^3.1.1
+ version: 3.1.1(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-presence':
+ specifier: ^1.1.5
+ version: 1.1.5(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ ai:
+ specifier: ^5.0.113
+ version: 5.0.116(zod@4.2.1)
+ class-variance-authority:
+ specifier: ^0.7.1
+ version: 0.7.1
+ fumadocs-core:
+ specifier: ^16.2.4
+ version: 16.3.2(@types/react@19.2.7)(lucide-react@0.544.0)(next@16.1.0)(react-dom@19.2.3)(react@19.2.3)(zod@4.2.1)
+ fumadocs-mdx:
+ specifier: ^13.0.8
+ version: 13.0.8(fumadocs-core@16.3.2)(next@16.1.0)(react@19.2.3)
+ fumadocs-twoslash:
+ specifier: ^3.1.10
+ version: 3.1.10(@types/react-dom@19.2.3)(@types/react@19.2.7)(fumadocs-ui@16.3.2)(react-dom@19.2.3)(react@19.2.3)(typescript@5.9.3)
+ fumadocs-ui:
+ specifier: ^16.2.5
+ version: 16.3.2(@types/react-dom@19.2.3)(@types/react@19.2.7)(lucide-react@0.544.0)(next@16.1.0)(react-dom@19.2.3)(react@19.2.3)(tailwindcss@4.1.18)(zod@4.2.1)
+ hast:
+ specifier: ^1.0.0
+ version: 1.0.0
+ hast-util-to-jsx-runtime:
+ specifier: ^2.3.6
+ version: 2.3.6
+ lucide-react:
+ specifier: ^0.544.0
+ version: 0.544.0(react@19.2.3)
+ mdx-embed:
+ specifier: ^1.1.2
+ version: 1.1.2(@mdx-js/mdx@1.6.22)(@mdx-js/react@3.1.1)(react-dom@19.2.3)(react@19.2.3)
+ next:
+ specifier: 16.1.0
+ version: 16.1.0(@babel/core@7.28.5)(react-dom@19.2.3)(react@19.2.3)
+ next-themes:
+ specifier: ^0.4.6
+ version: 0.4.6(react-dom@19.2.3)(react@19.2.3)
+ react:
+ specifier: ^19.2.3
+ version: 19.2.3
+ react-dom:
+ specifier: ^19.2.3
+ version: 19.2.3(react@19.2.3)
+ react-remove-scroll:
+ specifier: ^2.7.2
+ version: 2.7.2(@types/react@19.2.7)(react@19.2.3)
+ remark:
+ specifier: ^15.0.1
+ version: 15.0.1
+ remark-gfm:
+ specifier: ^4.0.1
+ version: 4.0.1
+ remark-rehype:
+ specifier: ^11.1.2
+ version: 11.1.2
+ tailwind-merge:
+ specifier: ^3.4.0
+ version: 3.4.0
+ twoslash:
+ specifier: ^0.3.4
+ version: 0.3.6(typescript@5.9.3)
+ unist-util-visit:
+ specifier: ^5.0.0
+ version: 5.0.0
+ xstate:
+ specifier: ^5.25.0
+ version: 5.25.0
+ zod:
+ specifier: ^4.1.13
+ version: 4.2.1
+
+devDependencies:
+ '@eslint/eslintrc':
+ specifier: ^3.3.3
+ version: 3.3.3
+ '@tailwindcss/postcss':
+ specifier: ^4.1.18
+ version: 4.1.18
+ '@types/hast':
+ specifier: ^3.0.4
+ version: 3.0.4
+ '@types/mdx':
+ specifier: ^2.0.13
+ version: 2.0.13
+ '@types/node':
+ specifier: 24.6.2
+ version: 24.6.2
+ '@types/react':
+ specifier: ^19.2.7
+ version: 19.2.7
+ '@types/react-dom':
+ specifier: ^19.2.3
+ version: 19.2.3(@types/react@19.2.7)
+ eslint:
+ specifier: ^9.39.2
+ version: 9.39.2
+ eslint-config-next:
+ specifier: 16.1.0
+ version: 16.1.0(@typescript-eslint/parser@8.50.0)(eslint@9.39.2)(typescript@5.9.3)
+ next-validate-link:
+ specifier: ^1.6.3
+ version: 1.6.3
+ postcss:
+ specifier: ^8.5.6
+ version: 8.5.6
+ tailwindcss:
+ specifier: ^4.1.18
+ version: 4.1.18
+ typescript:
+ specifier: ^5.9.3
+ version: 5.9.3
+
+packages:
+
+ /@ai-sdk/gateway@2.0.23(zod@4.2.1):
+ resolution: {integrity: sha512-qmX7afPRszUqG5hryHF3UN8ITPIRSGmDW6VYCmByzjoUkgm3MekzSx2hMV1wr0P+llDeuXb378SjqUfpvWJulg==, tarball: https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-2.0.23.tgz}
+ engines: {node: '>=18'}
+ peerDependencies:
+ zod: ^3.25.76 || ^4.1.8
+ dependencies:
+ '@ai-sdk/provider': 2.0.0
+ '@ai-sdk/provider-utils': 3.0.19(zod@4.2.1)
+ '@vercel/oidc': 3.0.5
+ zod: 4.2.1
+ dev: false
+
+ /@ai-sdk/openai-compatible@1.0.29(zod@4.2.1):
+ resolution: {integrity: sha512-cZUppWzxjfpNaH1oVZ6U8yDLKKsdGbC9X0Pex8cG9CXhKWSoVLLnW1rKr6tu9jDISK5okjBIW/O1ZzfnbUrtEw==, tarball: https://registry.npmjs.org/@ai-sdk/openai-compatible/-/openai-compatible-1.0.29.tgz}
+ engines: {node: '>=18'}
+ peerDependencies:
+ zod: ^3.25.76 || ^4.1.8
+ dependencies:
+ '@ai-sdk/provider': 2.0.0
+ '@ai-sdk/provider-utils': 3.0.19(zod@4.2.1)
+ zod: 4.2.1
+ dev: false
+
+ /@ai-sdk/provider-utils@3.0.19(zod@4.2.1):
+ resolution: {integrity: sha512-W41Wc9/jbUVXVwCN/7bWa4IKe8MtxO3EyA0Hfhx6grnmiYlCvpI8neSYWFE0zScXJkgA/YK3BRybzgyiXuu6JA==, tarball: https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.19.tgz}
+ engines: {node: '>=18'}
+ peerDependencies:
+ zod: ^3.25.76 || ^4.1.8
+ dependencies:
+ '@ai-sdk/provider': 2.0.0
+ '@standard-schema/spec': 1.1.0
+ eventsource-parser: 3.0.6
+ zod: 4.2.1
+ dev: false
+
+ /@ai-sdk/provider@2.0.0:
+ resolution: {integrity: sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==, tarball: https://registry.npmjs.org/@ai-sdk/provider/-/provider-2.0.0.tgz}
+ engines: {node: '>=18'}
+ dependencies:
+ json-schema: 0.4.0
+ dev: false
+
+ /@ai-sdk/react@2.0.118(react@19.2.3)(zod@4.2.1):
+ resolution: {integrity: sha512-K/5VVEGTIu9SWrdQ0s/11OldFU8IjprDzeE6TaC2fOcQWhG7dGVGl9H8Z32QBHzdfJyMhFUxEyFKSOgA2j9+VQ==, tarball: https://registry.npmjs.org/@ai-sdk/react/-/react-2.0.118.tgz}
+ engines: {node: '>=18'}
+ peerDependencies:
+ react: ^18 || ~19.0.1 || ~19.1.2 || ^19.2.1
+ zod: ^3.25.76 || ^4.1.8
+ peerDependenciesMeta:
+ zod:
+ optional: true
+ dependencies:
+ '@ai-sdk/provider-utils': 3.0.19(zod@4.2.1)
+ ai: 5.0.116(zod@4.2.1)
+ react: 19.2.3
+ swr: 2.3.8(react@19.2.3)
+ throttleit: 2.1.0
+ zod: 4.2.1
+ dev: false
+
+ /@alloc/quick-lru@5.2.0:
+ resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==, tarball: https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz}
+ engines: {node: '>=10'}
+ dev: true
+
+ /@babel/code-frame@7.27.1:
+ resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==, tarball: https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-validator-identifier': 7.28.5
+ js-tokens: 4.0.0
+ picocolors: 1.1.1
+
+ /@babel/compat-data@7.28.5:
+ resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==, tarball: https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz}
+ engines: {node: '>=6.9.0'}
+
+ /@babel/core@7.12.9:
+ resolution: {integrity: sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==, tarball: https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ '@babel/generator': 7.28.5
+ '@babel/helper-module-transforms': 7.28.3(@babel/core@7.12.9)
+ '@babel/helpers': 7.28.4
+ '@babel/parser': 7.28.5
+ '@babel/template': 7.27.2
+ '@babel/traverse': 7.28.5
+ '@babel/types': 7.28.5
+ convert-source-map: 1.9.0
+ debug: 4.4.3
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ lodash: 4.17.21
+ resolve: 1.22.11
+ semver: 5.7.2
+ source-map: 0.5.7
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/core@7.28.5:
+ resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==, tarball: https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ '@babel/generator': 7.28.5
+ '@babel/helper-compilation-targets': 7.27.2
+ '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5)
+ '@babel/helpers': 7.28.4
+ '@babel/parser': 7.28.5
+ '@babel/template': 7.27.2
+ '@babel/traverse': 7.28.5
+ '@babel/types': 7.28.5
+ '@jridgewell/remapping': 2.3.5
+ convert-source-map: 2.0.0
+ debug: 4.4.3
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ /@babel/generator@7.28.5:
+ resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==, tarball: https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/parser': 7.28.5
+ '@babel/types': 7.28.5
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+ jsesc: 3.1.0
+
+ /@babel/helper-compilation-targets@7.27.2:
+ resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==, tarball: https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/compat-data': 7.28.5
+ '@babel/helper-validator-option': 7.27.1
+ browserslist: 4.28.1
+ lru-cache: 5.1.1
+ semver: 6.3.1
+
+ /@babel/helper-globals@7.28.0:
+ resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==, tarball: https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz}
+ engines: {node: '>=6.9.0'}
+
+ /@babel/helper-module-imports@7.27.1:
+ resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==, tarball: https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/traverse': 7.28.5
+ '@babel/types': 7.28.5
+ transitivePeerDependencies:
+ - supports-color
+
+ /@babel/helper-module-transforms@7.28.3(@babel/core@7.12.9):
+ resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==, tarball: https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.12.9
+ '@babel/helper-module-imports': 7.27.1
+ '@babel/helper-validator-identifier': 7.28.5
+ '@babel/traverse': 7.28.5
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5):
+ resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==, tarball: https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-module-imports': 7.27.1
+ '@babel/helper-validator-identifier': 7.28.5
+ '@babel/traverse': 7.28.5
+ transitivePeerDependencies:
+ - supports-color
+
+ /@babel/helper-plugin-utils@7.10.4:
+ resolution: {integrity: sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==, tarball: https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz}
+ dev: false
+
+ /@babel/helper-plugin-utils@7.27.1:
+ resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==, tarball: https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz}
+ engines: {node: '>=6.9.0'}
+ dev: false
+
+ /@babel/helper-string-parser@7.27.1:
+ resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==, tarball: https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz}
+ engines: {node: '>=6.9.0'}
+
+ /@babel/helper-validator-identifier@7.28.5:
+ resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==, tarball: https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz}
+ engines: {node: '>=6.9.0'}
+
+ /@babel/helper-validator-option@7.27.1:
+ resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==, tarball: https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz}
+ engines: {node: '>=6.9.0'}
+
+ /@babel/helpers@7.28.4:
+ resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==, tarball: https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/template': 7.27.2
+ '@babel/types': 7.28.5
+
+ /@babel/parser@7.28.5:
+ resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==, tarball: https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+ dependencies:
+ '@babel/types': 7.28.5
+
+ /@babel/plugin-proposal-object-rest-spread@7.12.1(@babel/core@7.12.9):
+ resolution: {integrity: sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==, tarball: https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz}
+ deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.12.9
+ '@babel/helper-plugin-utils': 7.27.1
+ '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.12.9)
+ '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.12.9)
+ dev: false
+
+ /@babel/plugin-syntax-jsx@7.12.1(@babel/core@7.12.9):
+ resolution: {integrity: sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==, tarball: https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.12.9
+ '@babel/helper-plugin-utils': 7.27.1
+ dev: false
+
+ /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.12.9):
+ resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==, tarball: https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.12.9
+ '@babel/helper-plugin-utils': 7.27.1
+ dev: false
+
+ /@babel/plugin-transform-parameters@7.27.7(@babel/core@7.12.9):
+ resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==, tarball: https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.12.9
+ '@babel/helper-plugin-utils': 7.27.1
+ dev: false
+
+ /@babel/template@7.27.2:
+ resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==, tarball: https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ '@babel/parser': 7.28.5
+ '@babel/types': 7.28.5
+
+ /@babel/traverse@7.28.5:
+ resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==, tarball: https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ '@babel/generator': 7.28.5
+ '@babel/helper-globals': 7.28.0
+ '@babel/parser': 7.28.5
+ '@babel/template': 7.27.2
+ '@babel/types': 7.28.5
+ debug: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
+
+ /@babel/types@7.28.5:
+ resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==, tarball: https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-string-parser': 7.27.1
+ '@babel/helper-validator-identifier': 7.28.5
+
+ /@emnapi/core@1.7.1:
+ resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==, tarball: https://registry.npmjs.org/@emnapi/core/-/core-1.7.1.tgz}
+ requiresBuild: true
+ dependencies:
+ '@emnapi/wasi-threads': 1.1.0
+ tslib: 2.8.1
+ dev: true
+ optional: true
+
+ /@emnapi/runtime@1.7.1:
+ resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==, tarball: https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz}
+ requiresBuild: true
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
+ /@emnapi/wasi-threads@1.1.0:
+ resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==, tarball: https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz}
+ requiresBuild: true
+ dependencies:
+ tslib: 2.8.1
+ dev: true
+ optional: true
+
+ /@esbuild/aix-ppc64@0.25.12:
+ resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==, tarball: https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [aix]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/android-arm64@0.25.12:
+ resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==, tarball: https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [android]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/android-arm@0.25.12:
+ resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==, tarball: https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [android]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/android-x64@0.25.12:
+ resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==, tarball: https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [android]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/darwin-arm64@0.25.12:
+ resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==, tarball: https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [darwin]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/darwin-x64@0.25.12:
+ resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==, tarball: https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [darwin]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/freebsd-arm64@0.25.12:
+ resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==, tarball: https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [freebsd]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/freebsd-x64@0.25.12:
+ resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==, tarball: https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [freebsd]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/linux-arm64@0.25.12:
+ resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==, tarball: https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/linux-arm@0.25.12:
+ resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==, tarball: https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/linux-ia32@0.25.12:
+ resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==, tarball: https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/linux-loong64@0.25.12:
+ resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==, tarball: https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz}
+ engines: {node: '>=18'}
+ cpu: [loong64]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/linux-mips64el@0.25.12:
+ resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==, tarball: https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz}
+ engines: {node: '>=18'}
+ cpu: [mips64el]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/linux-ppc64@0.25.12:
+ resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==, tarball: https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/linux-riscv64@0.25.12:
+ resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==, tarball: https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz}
+ engines: {node: '>=18'}
+ cpu: [riscv64]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/linux-s390x@0.25.12:
+ resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==, tarball: https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz}
+ engines: {node: '>=18'}
+ cpu: [s390x]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/linux-x64@0.25.12:
+ resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==, tarball: https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/netbsd-arm64@0.25.12:
+ resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==, tarball: https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [netbsd]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/netbsd-x64@0.25.12:
+ resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==, tarball: https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [netbsd]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/openbsd-arm64@0.25.12:
+ resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==, tarball: https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/openbsd-x64@0.25.12:
+ resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==, tarball: https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [openbsd]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/openharmony-arm64@0.25.12:
+ resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==, tarball: https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openharmony]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/sunos-x64@0.25.12:
+ resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==, tarball: https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [sunos]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/win32-arm64@0.25.12:
+ resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==, tarball: https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [win32]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/win32-ia32@0.25.12:
+ resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==, tarball: https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [win32]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/win32-x64@0.25.12:
+ resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==, tarball: https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [win32]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@eslint-community/eslint-utils@4.9.0(eslint@9.39.2):
+ resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==, tarball: https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+ dependencies:
+ eslint: 9.39.2
+ eslint-visitor-keys: 3.4.3
+ dev: true
+
+ /@eslint-community/regexpp@4.12.2:
+ resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==, tarball: https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz}
+ engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+ dev: true
+
+ /@eslint/config-array@0.21.1:
+ resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==, tarball: https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ dependencies:
+ '@eslint/object-schema': 2.1.7
+ debug: 4.4.3
+ minimatch: 3.1.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@eslint/config-helpers@0.4.2:
+ resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==, tarball: https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ dependencies:
+ '@eslint/core': 0.17.0
+ dev: true
+
+ /@eslint/core@0.17.0:
+ resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==, tarball: https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ dependencies:
+ '@types/json-schema': 7.0.15
+ dev: true
+
+ /@eslint/eslintrc@3.3.3:
+ resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==, tarball: https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ dependencies:
+ ajv: 6.12.6
+ debug: 4.4.3
+ espree: 10.4.0
+ globals: 14.0.0
+ ignore: 5.3.2
+ import-fresh: 3.3.1
+ js-yaml: 4.1.1
+ minimatch: 3.1.2
+ strip-json-comments: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@eslint/js@9.39.2:
+ resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==, tarball: https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ dev: true
+
+ /@eslint/object-schema@2.1.7:
+ resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==, tarball: https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ dev: true
+
+ /@eslint/plugin-kit@0.4.1:
+ resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==, tarball: https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ dependencies:
+ '@eslint/core': 0.17.0
+ levn: 0.4.1
+ dev: true
+
+ /@floating-ui/core@1.7.3:
+ resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==, tarball: https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz}
+ dependencies:
+ '@floating-ui/utils': 0.2.10
+ dev: false
+
+ /@floating-ui/dom@1.7.4:
+ resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==, tarball: https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz}
+ dependencies:
+ '@floating-ui/core': 1.7.3
+ '@floating-ui/utils': 0.2.10
+ dev: false
+
+ /@floating-ui/react-dom@2.1.6(react-dom@19.2.3)(react@19.2.3):
+ resolution: {integrity: sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==, tarball: https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.6.tgz}
+ peerDependencies:
+ react: '>=16.8.0'
+ react-dom: '>=16.8.0'
+ dependencies:
+ '@floating-ui/dom': 1.7.4
+ react: 19.2.3
+ react-dom: 19.2.3(react@19.2.3)
+ dev: false
+
+ /@floating-ui/utils@0.2.10:
+ resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==, tarball: https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz}
+ dev: false
+
+ /@formatjs/intl-localematcher@0.7.2:
+ resolution: {integrity: sha512-1cpFlw1omNn2/Uz/vAdAyovlh7qS/po7MWipH3JrShT/lVUh2+lbEAWquyh9yRa84fqlLulTt7oysGtjATujZQ==, tarball: https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.7.2.tgz}
+ dependencies:
+ tslib: 2.8.1
+ dev: false
+
+ /@fumadocs/ui@16.3.2(@types/react@19.2.7)(lucide-react@0.544.0)(next@16.1.0)(react-dom@19.2.3)(react@19.2.3)(tailwindcss@4.1.18)(zod@4.2.1):
+ resolution: {integrity: sha512-CY5LAG1YZmU8Z1FQ0IfxMofV05oWbesX1Awx1vGSsIRIGPiMb5U0scvfEbI8OzAGCV4Xn9E6AgVr+k9b+JVKsQ==, tarball: https://registry.npmjs.org/@fumadocs/ui/-/ui-16.3.2.tgz}
+ peerDependencies:
+ '@types/react': '*'
+ next: 16.x.x
+ react: ^19.2.0
+ react-dom: ^19.2.0
+ tailwindcss: ^4.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ next:
+ optional: true
+ tailwindcss:
+ optional: true
+ dependencies:
+ '@types/react': 19.2.7
+ fumadocs-core: 16.3.2(@types/react@19.2.7)(lucide-react@0.544.0)(next@16.1.0)(react-dom@19.2.3)(react@19.2.3)(zod@4.2.1)
+ lodash.merge: 4.6.2
+ next: 16.1.0(@babel/core@7.28.5)(react-dom@19.2.3)(react@19.2.3)
+ next-themes: 0.4.6(react-dom@19.2.3)(react@19.2.3)
+ postcss-selector-parser: 7.1.1
+ react: 19.2.3
+ react-dom: 19.2.3(react@19.2.3)
+ tailwind-merge: 3.4.0
+ tailwindcss: 4.1.18
+ transitivePeerDependencies:
+ - '@mixedbread/sdk'
+ - '@orama/core'
+ - '@tanstack/react-router'
+ - algoliasearch
+ - lucide-react
+ - react-router
+ - supports-color
+ - waku
+ - zod
+ dev: false
+
+ /@humanfs/core@0.19.1:
+ resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==, tarball: https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz}
+ engines: {node: '>=18.18.0'}
+ dev: true
+
+ /@humanfs/node@0.16.7:
+ resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==, tarball: https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz}
+ engines: {node: '>=18.18.0'}
+ dependencies:
+ '@humanfs/core': 0.19.1
+ '@humanwhocodes/retry': 0.4.3
+ dev: true
+
+ /@humanwhocodes/module-importer@1.0.1:
+ resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, tarball: https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz}
+ engines: {node: '>=12.22'}
+ dev: true
+
+ /@humanwhocodes/retry@0.4.3:
+ resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==, tarball: https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz}
+ engines: {node: '>=18.18'}
+ dev: true
+
+ /@img/colour@1.0.0:
+ resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==, tarball: https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz}
+ engines: {node: '>=18'}
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@img/sharp-darwin-arm64@0.34.5:
+ resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==, tarball: https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [darwin]
+ requiresBuild: true
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-arm64': 1.2.4
+ dev: false
+ optional: true
+
+ /@img/sharp-darwin-x64@0.34.5:
+ resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==, tarball: https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [darwin]
+ requiresBuild: true
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-x64': 1.2.4
+ dev: false
+ optional: true
+
+ /@img/sharp-libvips-darwin-arm64@1.2.4:
+ resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==, tarball: https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz}
+ cpu: [arm64]
+ os: [darwin]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@img/sharp-libvips-darwin-x64@1.2.4:
+ resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==, tarball: https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz}
+ cpu: [x64]
+ os: [darwin]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@img/sharp-libvips-linux-arm64@1.2.4:
+ resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==, tarball: https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@img/sharp-libvips-linux-arm@1.2.4:
+ resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==, tarball: https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz}
+ cpu: [arm]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@img/sharp-libvips-linux-ppc64@1.2.4:
+ resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==, tarball: https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz}
+ cpu: [ppc64]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@img/sharp-libvips-linux-riscv64@1.2.4:
+ resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==, tarball: https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz}
+ cpu: [riscv64]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@img/sharp-libvips-linux-s390x@1.2.4:
+ resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==, tarball: https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz}
+ cpu: [s390x]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@img/sharp-libvips-linux-x64@1.2.4:
+ resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==, tarball: https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@img/sharp-libvips-linuxmusl-arm64@1.2.4:
+ resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==, tarball: https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@img/sharp-libvips-linuxmusl-x64@1.2.4:
+ resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==, tarball: https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@img/sharp-linux-arm64@0.34.5:
+ resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==, tarball: https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm64': 1.2.4
+ dev: false
+ optional: true
+
+ /@img/sharp-linux-arm@0.34.5:
+ resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==, tarball: https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm]
+ os: [linux]
+ requiresBuild: true
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm': 1.2.4
+ dev: false
+ optional: true
+
+ /@img/sharp-linux-ppc64@0.34.5:
+ resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==, tarball: https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [ppc64]
+ os: [linux]
+ requiresBuild: true
+ optionalDependencies:
+ '@img/sharp-libvips-linux-ppc64': 1.2.4
+ dev: false
+ optional: true
+
+ /@img/sharp-linux-riscv64@0.34.5:
+ resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==, tarball: https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [riscv64]
+ os: [linux]
+ requiresBuild: true
+ optionalDependencies:
+ '@img/sharp-libvips-linux-riscv64': 1.2.4
+ dev: false
+ optional: true
+
+ /@img/sharp-linux-s390x@0.34.5:
+ resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==, tarball: https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [s390x]
+ os: [linux]
+ requiresBuild: true
+ optionalDependencies:
+ '@img/sharp-libvips-linux-s390x': 1.2.4
+ dev: false
+ optional: true
+
+ /@img/sharp-linux-x64@0.34.5:
+ resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==, tarball: https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ optionalDependencies:
+ '@img/sharp-libvips-linux-x64': 1.2.4
+ dev: false
+ optional: true
+
+ /@img/sharp-linuxmusl-arm64@0.34.5:
+ resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==, tarball: https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-arm64': 1.2.4
+ dev: false
+ optional: true
+
+ /@img/sharp-linuxmusl-x64@0.34.5:
+ resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==, tarball: https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-x64': 1.2.4
+ dev: false
+ optional: true
+
+ /@img/sharp-wasm32@0.34.5:
+ resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==, tarball: https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [wasm32]
+ requiresBuild: true
+ dependencies:
+ '@emnapi/runtime': 1.7.1
+ dev: false
+ optional: true
+
+ /@img/sharp-win32-arm64@0.34.5:
+ resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==, tarball: https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [win32]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@img/sharp-win32-ia32@0.34.5:
+ resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==, tarball: https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [ia32]
+ os: [win32]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@img/sharp-win32-x64@0.34.5:
+ resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==, tarball: https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [win32]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@jridgewell/gen-mapping@0.3.13:
+ resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==, tarball: https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz}
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+ '@jridgewell/trace-mapping': 0.3.31
+
+ /@jridgewell/remapping@2.3.5:
+ resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==, tarball: https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz}
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+
+ /@jridgewell/resolve-uri@3.1.2:
+ resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==, tarball: https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz}
+ engines: {node: '>=6.0.0'}
+
+ /@jridgewell/sourcemap-codec@1.5.5:
+ resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==, tarball: https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz}
+
+ /@jridgewell/trace-mapping@0.3.31:
+ resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==, tarball: https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz}
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.5
+
+ /@mdx-js/mdx@1.6.22:
+ resolution: {integrity: sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==, tarball: https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz}
+ dependencies:
+ '@babel/core': 7.12.9
+ '@babel/plugin-syntax-jsx': 7.12.1(@babel/core@7.12.9)
+ '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.12.9)
+ '@mdx-js/util': 1.6.22
+ babel-plugin-apply-mdx-type-prop: 1.6.22(@babel/core@7.12.9)
+ babel-plugin-extract-import-names: 1.6.22
+ camelcase-css: 2.0.1
+ detab: 2.0.4
+ hast-util-raw: 6.0.1
+ lodash.uniq: 4.5.0
+ mdast-util-to-hast: 10.0.1
+ remark-footnotes: 2.0.0
+ remark-mdx: 1.6.22
+ remark-parse: 8.0.3
+ remark-squeeze-paragraphs: 4.0.0
+ style-to-object: 0.3.0
+ unified: 9.2.0
+ unist-builder: 2.0.3
+ unist-util-visit: 2.0.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@mdx-js/mdx@3.1.1:
+ resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==, tarball: https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz}
+ dependencies:
+ '@types/estree': 1.0.8
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.4
+ '@types/mdx': 2.0.13
+ acorn: 8.15.0
+ collapse-white-space: 2.1.0
+ devlop: 1.1.0
+ estree-util-is-identifier-name: 3.0.0
+ estree-util-scope: 1.0.0
+ estree-walker: 3.0.3
+ hast-util-to-jsx-runtime: 2.3.6
+ markdown-extensions: 2.0.0
+ recma-build-jsx: 1.0.0
+ recma-jsx: 1.0.1(acorn@8.15.0)
+ recma-stringify: 1.0.0
+ rehype-recma: 1.0.0
+ remark-mdx: 3.1.1
+ remark-parse: 11.0.0
+ remark-rehype: 11.1.2
+ source-map: 0.7.6
+ unified: 11.0.5
+ unist-util-position-from-estree: 2.0.0
+ unist-util-stringify-position: 4.0.0
+ unist-util-visit: 5.0.0
+ vfile: 6.0.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@mdx-js/react@3.1.1(@types/react@19.2.7)(react@19.2.3):
+ resolution: {integrity: sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==, tarball: https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz}
+ peerDependencies:
+ '@types/react': '>=16'
+ react: '>=16'
+ dependencies:
+ '@types/mdx': 2.0.13
+ '@types/react': 19.2.7
+ react: 19.2.3
+ dev: false
+
+ /@mdx-js/util@1.6.22:
+ resolution: {integrity: sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==, tarball: https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz}
+ dev: false
+
+ /@napi-rs/wasm-runtime@0.2.12:
+ resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==, tarball: https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz}
+ requiresBuild: true
+ dependencies:
+ '@emnapi/core': 1.7.1
+ '@emnapi/runtime': 1.7.1
+ '@tybys/wasm-util': 0.10.1
+ dev: true
+ optional: true
+
+ /@next/env@16.1.0:
+ resolution: {integrity: sha512-Dd23XQeFHmhf3KBW76leYVkejHlCdB7erakC2At2apL1N08Bm+dLYNP+nNHh0tzUXfPQcNcXiQyacw0PG4Fcpw==, tarball: https://registry.npmjs.org/@next/env/-/env-16.1.0.tgz}
+ dev: false
+
+ /@next/eslint-plugin-next@16.1.0:
+ resolution: {integrity: sha512-sooC/k0LCF4/jLXYHpgfzJot04lZQqsttn8XJpTguP8N3GhqXN3wSkh68no2OcZzS/qeGwKDFTqhZ8WofdXmmQ==, tarball: https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.1.0.tgz}
+ dependencies:
+ fast-glob: 3.3.1
+ dev: true
+
+ /@next/swc-darwin-arm64@16.1.0:
+ resolution: {integrity: sha512-onHq8dl8KjDb8taANQdzs3XmIqQWV3fYdslkGENuvVInFQzZnuBYYOG2HGHqqtvgmEU7xWzhgndXXxnhk4Z3fQ==, tarball: https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.1.0.tgz}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [darwin]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@next/swc-darwin-x64@16.1.0:
+ resolution: {integrity: sha512-Am6VJTp8KhLuAH13tPrAoVIXzuComlZlMwGr++o2KDjWiKPe3VwpxYhgV6I4gKls2EnsIMggL4y7GdXyDdJcFA==, tarball: https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.1.0.tgz}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [darwin]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@next/swc-linux-arm64-gnu@16.1.0:
+ resolution: {integrity: sha512-fVicfaJT6QfghNyg8JErZ+EMNQ812IS0lmKfbmC01LF1nFBcKfcs4Q75Yy8IqnsCqH/hZwGhqzj3IGVfWV6vpA==, tarball: https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.1.0.tgz}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@next/swc-linux-arm64-musl@16.1.0:
+ resolution: {integrity: sha512-TojQnDRoX7wJWXEEwdfuJtakMDW64Q7NrxQPviUnfYJvAx5/5wcGE+1vZzQ9F17m+SdpFeeXuOr6v3jbyusYMQ==, tarball: https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.1.0.tgz}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@next/swc-linux-x64-gnu@16.1.0:
+ resolution: {integrity: sha512-quhNFVySW4QwXiZkZ34SbfzNBm27vLrxZ2HwTfFFO1BBP0OY1+pI0nbyewKeq1FriqU+LZrob/cm26lwsiAi8Q==, tarball: https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.1.0.tgz}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@next/swc-linux-x64-musl@16.1.0:
+ resolution: {integrity: sha512-6JW0z2FZUK5iOVhUIWqE4RblAhUj1EwhZ/MwteGb//SpFTOHydnhbp3868gxalwea+mbOLWO6xgxj9wA9wNvNw==, tarball: https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.1.0.tgz}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@next/swc-win32-arm64-msvc@16.1.0:
+ resolution: {integrity: sha512-+DK/akkAvvXn5RdYN84IOmLkSy87SCmpofJPdB8vbLmf01BzntPBSYXnMvnEEv/Vcf3HYJwt24QZ/s6sWAwOMQ==, tarball: https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.1.0.tgz}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [win32]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@next/swc-win32-x64-msvc@16.1.0:
+ resolution: {integrity: sha512-Tr0j94MphimCCks+1rtYPzQFK+faJuhHWCegU9S9gDlgyOk8Y3kPmO64UcjyzZAlligeBtYZ/2bEyrKq0d2wqQ==, tarball: https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.1.0.tgz}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [win32]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@nodelib/fs.scandir@2.1.5:
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, tarball: https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz}
+ engines: {node: '>= 8'}
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ run-parallel: 1.2.0
+ dev: true
+
+ /@nodelib/fs.stat@2.0.5:
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, tarball: https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz}
+ engines: {node: '>= 8'}
+ dev: true
+
+ /@nodelib/fs.walk@1.2.8:
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, tarball: https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz}
+ engines: {node: '>= 8'}
+ dependencies:
+ '@nodelib/fs.scandir': 2.1.5
+ fastq: 1.19.1
+ dev: true
+
+ /@nolyfill/is-core-module@1.0.39:
+ resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==, tarball: https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz}
+ engines: {node: '>=12.4.0'}
+ dev: true
+
+ /@opentelemetry/api@1.9.0:
+ resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==, tarball: https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz}
+ engines: {node: '>=8.0.0'}
+ dev: false
+
+ /@orama/orama@3.1.18:
+ resolution: {integrity: sha512-a61ljmRVVyG5MC/698C8/FfFDw5a8LOIvyOLW5fztgUXqUpc1jOfQzOitSCbge657OgXXThmY3Tk8fpiDb4UcA==, tarball: https://registry.npmjs.org/@orama/orama/-/orama-3.1.18.tgz}
+ engines: {node: '>= 20.0.0'}
+ dev: false
+
+ /@radix-ui/number@1.1.1:
+ resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==, tarball: https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz}
+ dev: false
+
+ /@radix-ui/primitive@1.1.3:
+ resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==, tarball: https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz}
+ dev: false
+
+ /@radix-ui/react-accordion@1.2.12(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3):
+ resolution: {integrity: sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==, tarball: https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.12.tgz}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@radix-ui/primitive': 1.1.3
+ '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-direction': 1.1.1(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.3)
+ '@types/react': 19.2.7
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
+ react: 19.2.3
+ react-dom: 19.2.3(react@19.2.3)
+ dev: false
+
+ /@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3):
+ resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==, tarball: https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.7.tgz}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@types/react': 19.2.7
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
+ react: 19.2.3
+ react-dom: 19.2.3(react@19.2.3)
+ dev: false
+
+ /@radix-ui/react-collapsible@1.1.12(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3):
+ resolution: {integrity: sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==, tarball: https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.12.tgz}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@radix-ui/primitive': 1.1.3
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.3)
+ '@types/react': 19.2.7
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
+ react: 19.2.3
+ react-dom: 19.2.3(react@19.2.3)
+ dev: false
+
+ /@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3):
+ resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==, tarball: https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@radix-ui/react-slot': 1.2.3(@types/react@19.2.7)(react@19.2.3)
+ '@types/react': 19.2.7
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
+ react: 19.2.3
+ react-dom: 19.2.3(react@19.2.3)
+ dev: false
+
+ /@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.7)(react@19.2.3):
+ resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==, tarball: https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@types/react': 19.2.7
+ react: 19.2.3
+ dev: false
+
+ /@radix-ui/react-context@1.1.2(@types/react@19.2.7)(react@19.2.3):
+ resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==, tarball: https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@types/react': 19.2.7
+ react: 19.2.3
+ dev: false
+
+ /@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3):
+ resolution: {integrity: sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==, tarball: https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@radix-ui/primitive': 1.1.3
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@radix-ui/react-slot': 1.2.3(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.3)
+ '@types/react': 19.2.7
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
+ aria-hidden: 1.2.6
+ react: 19.2.3
+ react-dom: 19.2.3(react@19.2.3)
+ react-remove-scroll: 2.7.2(@types/react@19.2.7)(react@19.2.3)
+ dev: false
+
+ /@radix-ui/react-direction@1.1.1(@types/react@19.2.7)(react@19.2.3):
+ resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==, tarball: https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.1.tgz}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@types/react': 19.2.7
+ react: 19.2.3
+ dev: false
+
+ /@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3):
+ resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==, tarball: https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@radix-ui/primitive': 1.1.3
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.7)(react@19.2.3)
+ '@types/react': 19.2.7
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
+ react: 19.2.3
+ react-dom: 19.2.3(react@19.2.3)
+ dev: false
+
+ /@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.7)(react@19.2.3):
+ resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==, tarball: https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@types/react': 19.2.7
+ react: 19.2.3
+ dev: false
+
+ /@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3):
+ resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==, tarball: https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.3)
+ '@types/react': 19.2.7
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
+ react: 19.2.3
+ react-dom: 19.2.3(react@19.2.3)
+ dev: false
+
+ /@radix-ui/react-id@1.1.1(@types/react@19.2.7)(react@19.2.3):
+ resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==, tarball: https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.1.tgz}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.3)
+ '@types/react': 19.2.7
+ react: 19.2.3
+ dev: false
+
+ /@radix-ui/react-navigation-menu@1.2.14(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3):
+ resolution: {integrity: sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==, tarball: https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.14.tgz}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@radix-ui/primitive': 1.1.3
+ '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-direction': 1.1.1(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@types/react': 19.2.7
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
+ react: 19.2.3
+ react-dom: 19.2.3(react@19.2.3)
+ dev: false
+
+ /@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3):
+ resolution: {integrity: sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==, tarball: https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.15.tgz}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@radix-ui/primitive': 1.1.3
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@radix-ui/react-slot': 1.2.3(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.3)
+ '@types/react': 19.2.7
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
+ aria-hidden: 1.2.6
+ react: 19.2.3
+ react-dom: 19.2.3(react@19.2.3)
+ react-remove-scroll: 2.7.2(@types/react@19.2.7)(react@19.2.3)
+ dev: false
+
+ /@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3):
+ resolution: {integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==, tarball: https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.8.tgz}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@floating-ui/react-dom': 2.1.6(react-dom@19.2.3)(react@19.2.3)
+ '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/rect': 1.1.1
+ '@types/react': 19.2.7
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
+ react: 19.2.3
+ react-dom: 19.2.3(react@19.2.3)
+ dev: false
+
+ /@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3):
+ resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==, tarball: https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.3)
+ '@types/react': 19.2.7
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
+ react: 19.2.3
+ react-dom: 19.2.3(react@19.2.3)
+ dev: false
+
+ /@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3):
+ resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==, tarball: https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.3)
+ '@types/react': 19.2.7
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
+ react: 19.2.3
+ react-dom: 19.2.3(react@19.2.3)
+ dev: false
+
+ /@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3):
+ resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==, tarball: https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@radix-ui/react-slot': 1.2.3(@types/react@19.2.7)(react@19.2.3)
+ '@types/react': 19.2.7
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
+ react: 19.2.3
+ react-dom: 19.2.3(react@19.2.3)
+ dev: false
+
+ /@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3):
+ resolution: {integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==, tarball: https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.11.tgz}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@radix-ui/primitive': 1.1.3
+ '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-direction': 1.1.1(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.3)
+ '@types/react': 19.2.7
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
+ react: 19.2.3
+ react-dom: 19.2.3(react@19.2.3)
+ dev: false
+
+ /@radix-ui/react-scroll-area@1.2.10(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3):
+ resolution: {integrity: sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==, tarball: https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.10.tgz}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@radix-ui/number': 1.1.1
+ '@radix-ui/primitive': 1.1.3
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-direction': 1.1.1(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.3)
+ '@types/react': 19.2.7
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
+ react: 19.2.3
+ react-dom: 19.2.3(react@19.2.3)
+ dev: false
+
+ /@radix-ui/react-slot@1.2.3(@types/react@19.2.7)(react@19.2.3):
+ resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==, tarball: https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3)
+ '@types/react': 19.2.7
+ react: 19.2.3
+ dev: false
+
+ /@radix-ui/react-slot@1.2.4(@types/react@19.2.7)(react@19.2.3):
+ resolution: {integrity: sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==, tarball: https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3)
+ '@types/react': 19.2.7
+ react: 19.2.3
+ dev: false
+
+ /@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3):
+ resolution: {integrity: sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==, tarball: https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.13.tgz}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@radix-ui/primitive': 1.1.3
+ '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-direction': 1.1.1(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.3)
+ '@types/react': 19.2.7
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
+ react: 19.2.3
+ react-dom: 19.2.3(react@19.2.3)
+ dev: false
+
+ /@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.7)(react@19.2.3):
+ resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==, tarball: https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@types/react': 19.2.7
+ react: 19.2.3
+ dev: false
+
+ /@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.7)(react@19.2.3):
+ resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==, tarball: https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.3)
+ '@types/react': 19.2.7
+ react: 19.2.3
+ dev: false
+
+ /@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.7)(react@19.2.3):
+ resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==, tarball: https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.3)
+ '@types/react': 19.2.7
+ react: 19.2.3
+ dev: false
+
+ /@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.7)(react@19.2.3):
+ resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==, tarball: https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.3)
+ '@types/react': 19.2.7
+ react: 19.2.3
+ dev: false
+
+ /@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.7)(react@19.2.3):
+ resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==, tarball: https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@types/react': 19.2.7
+ react: 19.2.3
+ dev: false
+
+ /@radix-ui/react-use-previous@1.1.1(@types/react@19.2.7)(react@19.2.3):
+ resolution: {integrity: sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==, tarball: https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.1.tgz}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@types/react': 19.2.7
+ react: 19.2.3
+ dev: false
+
+ /@radix-ui/react-use-rect@1.1.1(@types/react@19.2.7)(react@19.2.3):
+ resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==, tarball: https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.1.tgz}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@radix-ui/rect': 1.1.1
+ '@types/react': 19.2.7
+ react: 19.2.3
+ dev: false
+
+ /@radix-ui/react-use-size@1.1.1(@types/react@19.2.7)(react@19.2.3):
+ resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==, tarball: https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.1.tgz}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.3)
+ '@types/react': 19.2.7
+ react: 19.2.3
+ dev: false
+
+ /@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3):
+ resolution: {integrity: sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==, tarball: https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+ dependencies:
+ '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@types/react': 19.2.7
+ '@types/react-dom': 19.2.3(@types/react@19.2.7)
+ react: 19.2.3
+ react-dom: 19.2.3(react@19.2.3)
+ dev: false
+
+ /@radix-ui/rect@1.1.1:
+ resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==, tarball: https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.1.tgz}
+ dev: false
+
+ /@rtsao/scc@1.1.0:
+ resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==, tarball: https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz}
+ dev: true
+
+ /@shikijs/core@3.20.0:
+ resolution: {integrity: sha512-f2ED7HYV4JEk827mtMDwe/yQ25pRiXZmtHjWF8uzZKuKiEsJR7Ce1nuQ+HhV9FzDcbIo4ObBCD9GPTzNuy9S1g==, tarball: https://registry.npmjs.org/@shikijs/core/-/core-3.20.0.tgz}
+ dependencies:
+ '@shikijs/types': 3.20.0
+ '@shikijs/vscode-textmate': 10.0.2
+ '@types/hast': 3.0.4
+ hast-util-to-html: 9.0.5
+ dev: false
+
+ /@shikijs/engine-javascript@3.20.0:
+ resolution: {integrity: sha512-OFx8fHAZuk7I42Z9YAdZ95To6jDePQ9Rnfbw9uSRTSbBhYBp1kEOKv/3jOimcj3VRUKusDYM6DswLauwfhboLg==, tarball: https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.20.0.tgz}
+ dependencies:
+ '@shikijs/types': 3.20.0
+ '@shikijs/vscode-textmate': 10.0.2
+ oniguruma-to-es: 4.3.4
+ dev: false
+
+ /@shikijs/engine-oniguruma@3.20.0:
+ resolution: {integrity: sha512-Yx3gy7xLzM0ZOjqoxciHjA7dAt5tyzJE3L4uQoM83agahy+PlW244XJSrmJRSBvGYELDhYXPacD4R/cauV5bzQ==, tarball: https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.20.0.tgz}
+ dependencies:
+ '@shikijs/types': 3.20.0
+ '@shikijs/vscode-textmate': 10.0.2
+ dev: false
+
+ /@shikijs/langs@3.20.0:
+ resolution: {integrity: sha512-le+bssCxcSHrygCWuOrYJHvjus6zhQ2K7q/0mgjiffRbkhM4o1EWu2m+29l0yEsHDbWaWPNnDUTRVVBvBBeKaA==, tarball: https://registry.npmjs.org/@shikijs/langs/-/langs-3.20.0.tgz}
+ dependencies:
+ '@shikijs/types': 3.20.0
+ dev: false
+
+ /@shikijs/rehype@3.20.0:
+ resolution: {integrity: sha512-/sqob3V/lJK0m2mZ64nkcWPN88im0D9atkI3S3PUBvtJZTHnJXVwZhHQFRDyObgEIa37IpHYHR3CuFtXB5bT2g==, tarball: https://registry.npmjs.org/@shikijs/rehype/-/rehype-3.20.0.tgz}
+ dependencies:
+ '@shikijs/types': 3.20.0
+ '@types/hast': 3.0.4
+ hast-util-to-string: 3.0.1
+ shiki: 3.20.0
+ unified: 11.0.5
+ unist-util-visit: 5.0.0
+ dev: false
+
+ /@shikijs/themes@3.20.0:
+ resolution: {integrity: sha512-U1NSU7Sl26Q7ErRvJUouArxfM2euWqq1xaSrbqMu2iqa+tSp0D1Yah8216sDYbdDHw4C8b75UpE65eWorm2erQ==, tarball: https://registry.npmjs.org/@shikijs/themes/-/themes-3.20.0.tgz}
+ dependencies:
+ '@shikijs/types': 3.20.0
+ dev: false
+
+ /@shikijs/transformers@3.20.0:
+ resolution: {integrity: sha512-PrHHMRr3Q5W1qB/42kJW6laqFyWdhrPF2hNR9qjOm1xcSiAO3hAHo7HaVyHE6pMyevmy3i51O8kuGGXC78uK3g==, tarball: https://registry.npmjs.org/@shikijs/transformers/-/transformers-3.20.0.tgz}
+ dependencies:
+ '@shikijs/core': 3.20.0
+ '@shikijs/types': 3.20.0
+ dev: false
+
+ /@shikijs/twoslash@3.20.0(typescript@5.9.3):
+ resolution: {integrity: sha512-fZz6vB9a0M8iuVF/ydIV4ToC09sbOh/TqxXZFWAh5J8bLiPsyQGtygKMDQ9L0Sdop3co0TIC/JsrLmsbmZwwsw==, tarball: https://registry.npmjs.org/@shikijs/twoslash/-/twoslash-3.20.0.tgz}
+ peerDependencies:
+ typescript: '>=5.5.0'
+ dependencies:
+ '@shikijs/core': 3.20.0
+ '@shikijs/types': 3.20.0
+ twoslash: 0.3.6(typescript@5.9.3)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@shikijs/types@3.20.0:
+ resolution: {integrity: sha512-lhYAATn10nkZcBQ0BlzSbJA3wcmL5MXUUF8d2Zzon6saZDlToKaiRX60n2+ZaHJCmXEcZRWNzn+k9vplr8Jhsw==, tarball: https://registry.npmjs.org/@shikijs/types/-/types-3.20.0.tgz}
+ dependencies:
+ '@shikijs/vscode-textmate': 10.0.2
+ '@types/hast': 3.0.4
+ dev: false
+
+ /@shikijs/vscode-textmate@10.0.2:
+ resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==, tarball: https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz}
+ dev: false
+
+ /@standard-schema/spec@1.1.0:
+ resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==, tarball: https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz}
+ dev: false
+
+ /@swc/helpers@0.5.15:
+ resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==, tarball: https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz}
+ dependencies:
+ tslib: 2.8.1
+ dev: false
+
+ /@tailwindcss/node@4.1.18:
+ resolution: {integrity: sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==, tarball: https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.18.tgz}
+ dependencies:
+ '@jridgewell/remapping': 2.3.5
+ enhanced-resolve: 5.18.4
+ jiti: 2.6.1
+ lightningcss: 1.30.2
+ magic-string: 0.30.21
+ source-map-js: 1.2.1
+ tailwindcss: 4.1.18
+ dev: true
+
+ /@tailwindcss/oxide-android-arm64@4.1.18:
+ resolution: {integrity: sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==, tarball: https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@tailwindcss/oxide-darwin-arm64@4.1.18:
+ resolution: {integrity: sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==, tarball: https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.18.tgz}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@tailwindcss/oxide-darwin-x64@4.1.18:
+ resolution: {integrity: sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==, tarball: https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.18.tgz}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@tailwindcss/oxide-freebsd-x64@4.1.18:
+ resolution: {integrity: sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==, tarball: https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [freebsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18:
+ resolution: {integrity: sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==, tarball: https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz}
+ engines: {node: '>= 10'}
+ cpu: [arm]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@tailwindcss/oxide-linux-arm64-gnu@4.1.18:
+ resolution: {integrity: sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==, tarball: https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@tailwindcss/oxide-linux-arm64-musl@4.1.18:
+ resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==, tarball: https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@tailwindcss/oxide-linux-x64-gnu@4.1.18:
+ resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==, tarball: https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@tailwindcss/oxide-linux-x64-musl@4.1.18:
+ resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==, tarball: https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@tailwindcss/oxide-wasm32-wasi@4.1.18:
+ resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==, tarball: https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz}
+ engines: {node: '>=14.0.0'}
+ cpu: [wasm32]
+ requiresBuild: true
+ dev: true
+ optional: true
+ bundledDependencies:
+ - '@napi-rs/wasm-runtime'
+ - '@emnapi/core'
+ - '@emnapi/runtime'
+ - '@tybys/wasm-util'
+ - '@emnapi/wasi-threads'
+ - tslib
+
+ /@tailwindcss/oxide-win32-arm64-msvc@4.1.18:
+ resolution: {integrity: sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==, tarball: https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@tailwindcss/oxide-win32-x64-msvc@4.1.18:
+ resolution: {integrity: sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==, tarball: https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@tailwindcss/oxide@4.1.18:
+ resolution: {integrity: sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==, tarball: https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.18.tgz}
+ engines: {node: '>= 10'}
+ optionalDependencies:
+ '@tailwindcss/oxide-android-arm64': 4.1.18
+ '@tailwindcss/oxide-darwin-arm64': 4.1.18
+ '@tailwindcss/oxide-darwin-x64': 4.1.18
+ '@tailwindcss/oxide-freebsd-x64': 4.1.18
+ '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.18
+ '@tailwindcss/oxide-linux-arm64-gnu': 4.1.18
+ '@tailwindcss/oxide-linux-arm64-musl': 4.1.18
+ '@tailwindcss/oxide-linux-x64-gnu': 4.1.18
+ '@tailwindcss/oxide-linux-x64-musl': 4.1.18
+ '@tailwindcss/oxide-wasm32-wasi': 4.1.18
+ '@tailwindcss/oxide-win32-arm64-msvc': 4.1.18
+ '@tailwindcss/oxide-win32-x64-msvc': 4.1.18
+ dev: true
+
+ /@tailwindcss/postcss@4.1.18:
+ resolution: {integrity: sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g==, tarball: https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.18.tgz}
+ dependencies:
+ '@alloc/quick-lru': 5.2.0
+ '@tailwindcss/node': 4.1.18
+ '@tailwindcss/oxide': 4.1.18
+ postcss: 8.5.6
+ tailwindcss: 4.1.18
+ dev: true
+
+ /@tybys/wasm-util@0.10.1:
+ resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==, tarball: https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz}
+ requiresBuild: true
+ dependencies:
+ tslib: 2.8.1
+ dev: true
+ optional: true
+
+ /@types/debug@4.1.12:
+ resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==, tarball: https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz}
+ dependencies:
+ '@types/ms': 2.1.0
+
+ /@types/estree-jsx@1.0.5:
+ resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==, tarball: https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz}
+ dependencies:
+ '@types/estree': 1.0.8
+
+ /@types/estree@1.0.8:
+ resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==, tarball: https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz}
+
+ /@types/hast@2.3.10:
+ resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==, tarball: https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz}
+ dependencies:
+ '@types/unist': 2.0.11
+ dev: false
+
+ /@types/hast@3.0.4:
+ resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==, tarball: https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz}
+ dependencies:
+ '@types/unist': 3.0.3
+
+ /@types/json-schema@7.0.15:
+ resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, tarball: https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz}
+ dev: true
+
+ /@types/json5@0.0.29:
+ resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==, tarball: https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz}
+ dev: true
+
+ /@types/mdast@3.0.15:
+ resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==, tarball: https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz}
+ dependencies:
+ '@types/unist': 2.0.11
+ dev: false
+
+ /@types/mdast@4.0.4:
+ resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==, tarball: https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz}
+ dependencies:
+ '@types/unist': 3.0.3
+
+ /@types/mdx@2.0.13:
+ resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==, tarball: https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz}
+
+ /@types/ms@2.1.0:
+ resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==, tarball: https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz}
+
+ /@types/node@24.6.2:
+ resolution: {integrity: sha512-d2L25Y4j+W3ZlNAeMKcy7yDsK425ibcAOO2t7aPTz6gNMH0z2GThtwENCDc0d/Pw9wgyRqE5Px1wkV7naz8ang==, tarball: https://registry.npmjs.org/@types/node/-/node-24.6.2.tgz}
+ dependencies:
+ undici-types: 7.13.0
+ dev: true
+
+ /@types/parse5@5.0.3:
+ resolution: {integrity: sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==, tarball: https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz}
+ dev: false
+
+ /@types/react-dom@19.2.3(@types/react@19.2.7):
+ resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==, tarball: https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz}
+ peerDependencies:
+ '@types/react': ^19.2.0
+ dependencies:
+ '@types/react': 19.2.7
+
+ /@types/react@19.2.7:
+ resolution: {integrity: sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==, tarball: https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz}
+ dependencies:
+ csstype: 3.2.3
+
+ /@types/unist@2.0.11:
+ resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==, tarball: https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz}
+
+ /@types/unist@3.0.3:
+ resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==, tarball: https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz}
+
+ /@typescript-eslint/eslint-plugin@8.50.0(@typescript-eslint/parser@8.50.0)(eslint@9.39.2)(typescript@5.9.3):
+ resolution: {integrity: sha512-O7QnmOXYKVtPrfYzMolrCTfkezCJS9+ljLdKW/+DCvRsc3UAz+sbH6Xcsv7p30+0OwUbeWfUDAQE0vpabZ3QLg==, tarball: https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.50.0.tgz}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ '@typescript-eslint/parser': ^8.50.0
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <6.0.0'
+ dependencies:
+ '@eslint-community/regexpp': 4.12.2
+ '@typescript-eslint/parser': 8.50.0(eslint@9.39.2)(typescript@5.9.3)
+ '@typescript-eslint/scope-manager': 8.50.0
+ '@typescript-eslint/type-utils': 8.50.0(eslint@9.39.2)(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.50.0(eslint@9.39.2)(typescript@5.9.3)
+ '@typescript-eslint/visitor-keys': 8.50.0
+ eslint: 9.39.2
+ ignore: 7.0.5
+ natural-compare: 1.4.0
+ ts-api-utils: 2.1.0(typescript@5.9.3)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/parser@8.50.0(eslint@9.39.2)(typescript@5.9.3):
+ resolution: {integrity: sha512-6/cmF2piao+f6wSxUsJLZjck7OQsYyRtcOZS02k7XINSNlz93v6emM8WutDQSXnroG2xwYlEVHJI+cPA7CPM3Q==, tarball: https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.50.0.tgz}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <6.0.0'
+ dependencies:
+ '@typescript-eslint/scope-manager': 8.50.0
+ '@typescript-eslint/types': 8.50.0
+ '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.3)
+ '@typescript-eslint/visitor-keys': 8.50.0
+ debug: 4.4.3
+ eslint: 9.39.2
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/project-service@8.50.0(typescript@5.9.3):
+ resolution: {integrity: sha512-Cg/nQcL1BcoTijEWyx4mkVC56r8dj44bFDvBdygifuS20f3OZCHmFbjF34DPSi07kwlFvqfv/xOLnJ5DquxSGQ==, tarball: https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.50.0.tgz}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <6.0.0'
+ dependencies:
+ '@typescript-eslint/tsconfig-utils': 8.50.0(typescript@5.9.3)
+ '@typescript-eslint/types': 8.50.0
+ debug: 4.4.3
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/scope-manager@8.50.0:
+ resolution: {integrity: sha512-xCwfuCZjhIqy7+HKxBLrDVT5q/iq7XBVBXLn57RTIIpelLtEIZHXAF/Upa3+gaCpeV1NNS5Z9A+ID6jn50VD4A==, tarball: https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.50.0.tgz}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ dependencies:
+ '@typescript-eslint/types': 8.50.0
+ '@typescript-eslint/visitor-keys': 8.50.0
+ dev: true
+
+ /@typescript-eslint/tsconfig-utils@8.50.0(typescript@5.9.3):
+ resolution: {integrity: sha512-vxd3G/ybKTSlm31MOA96gqvrRGv9RJ7LGtZCn2Vrc5htA0zCDvcMqUkifcjrWNNKXHUU3WCkYOzzVSFBd0wa2w==, tarball: https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.50.0.tgz}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <6.0.0'
+ dependencies:
+ typescript: 5.9.3
+ dev: true
+
+ /@typescript-eslint/type-utils@8.50.0(eslint@9.39.2)(typescript@5.9.3):
+ resolution: {integrity: sha512-7OciHT2lKCewR0mFoBrvZJ4AXTMe/sYOe87289WAViOocEmDjjv8MvIOT2XESuKj9jp8u3SZYUSh89QA4S1kQw==, tarball: https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.50.0.tgz}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <6.0.0'
+ dependencies:
+ '@typescript-eslint/types': 8.50.0
+ '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.50.0(eslint@9.39.2)(typescript@5.9.3)
+ debug: 4.4.3
+ eslint: 9.39.2
+ ts-api-utils: 2.1.0(typescript@5.9.3)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/types@8.50.0:
+ resolution: {integrity: sha512-iX1mgmGrXdANhhITbpp2QQM2fGehBse9LbTf0sidWK6yg/NE+uhV5dfU1g6EYPlcReYmkE9QLPq/2irKAmtS9w==, tarball: https://registry.npmjs.org/@typescript-eslint/types/-/types-8.50.0.tgz}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ dev: true
+
+ /@typescript-eslint/typescript-estree@8.50.0(typescript@5.9.3):
+ resolution: {integrity: sha512-W7SVAGBR/IX7zm1t70Yujpbk+zdPq/u4soeFSknWFdXIFuWsBGBOUu/Tn/I6KHSKvSh91OiMuaSnYp3mtPt5IQ==, tarball: https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.50.0.tgz}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <6.0.0'
+ dependencies:
+ '@typescript-eslint/project-service': 8.50.0(typescript@5.9.3)
+ '@typescript-eslint/tsconfig-utils': 8.50.0(typescript@5.9.3)
+ '@typescript-eslint/types': 8.50.0
+ '@typescript-eslint/visitor-keys': 8.50.0
+ debug: 4.4.3
+ minimatch: 9.0.5
+ semver: 7.7.3
+ tinyglobby: 0.2.15
+ ts-api-utils: 2.1.0(typescript@5.9.3)
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/utils@8.50.0(eslint@9.39.2)(typescript@5.9.3):
+ resolution: {integrity: sha512-87KgUXET09CRjGCi2Ejxy3PULXna63/bMYv72tCAlDJC3Yqwln0HiFJ3VJMst2+mEtNtZu5oFvX4qJGjKsnAgg==, tarball: https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.50.0.tgz}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <6.0.0'
+ dependencies:
+ '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2)
+ '@typescript-eslint/scope-manager': 8.50.0
+ '@typescript-eslint/types': 8.50.0
+ '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.3)
+ eslint: 9.39.2
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/visitor-keys@8.50.0:
+ resolution: {integrity: sha512-Xzmnb58+Db78gT/CCj/PVCvK+zxbnsw6F+O1oheYszJbBSdEjVhQi3C/Xttzxgi/GLmpvOggRs1RFpiJ8+c34Q==, tarball: https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.50.0.tgz}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ dependencies:
+ '@typescript-eslint/types': 8.50.0
+ eslint-visitor-keys: 4.2.1
+ dev: true
+
+ /@typescript/vfs@1.6.2(typescript@5.9.3):
+ resolution: {integrity: sha512-hoBwJwcbKHmvd2QVebiytN1aELvpk9B74B4L1mFm/XT1Q/VOYAWl2vQ9AWRFtQq8zmz6enTpfTV8WRc4ATjW/g==, tarball: https://registry.npmjs.org/@typescript/vfs/-/vfs-1.6.2.tgz}
+ peerDependencies:
+ typescript: '*'
+ dependencies:
+ debug: 4.4.3
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /@ungap/structured-clone@1.3.0:
+ resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==, tarball: https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz}
+ dev: false
+
+ /@unrs/resolver-binding-android-arm-eabi@1.11.1:
+ resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==, tarball: https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz}
+ cpu: [arm]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@unrs/resolver-binding-android-arm64@1.11.1:
+ resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==, tarball: https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz}
+ cpu: [arm64]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@unrs/resolver-binding-darwin-arm64@1.11.1:
+ resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==, tarball: https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz}
+ cpu: [arm64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@unrs/resolver-binding-darwin-x64@1.11.1:
+ resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==, tarball: https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz}
+ cpu: [x64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@unrs/resolver-binding-freebsd-x64@1.11.1:
+ resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==, tarball: https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz}
+ cpu: [x64]
+ os: [freebsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1:
+ resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==, tarball: https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz}
+ cpu: [arm]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@unrs/resolver-binding-linux-arm-musleabihf@1.11.1:
+ resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==, tarball: https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz}
+ cpu: [arm]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@unrs/resolver-binding-linux-arm64-gnu@1.11.1:
+ resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==, tarball: https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@unrs/resolver-binding-linux-arm64-musl@1.11.1:
+ resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==, tarball: https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@unrs/resolver-binding-linux-ppc64-gnu@1.11.1:
+ resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==, tarball: https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz}
+ cpu: [ppc64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@unrs/resolver-binding-linux-riscv64-gnu@1.11.1:
+ resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==, tarball: https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz}
+ cpu: [riscv64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@unrs/resolver-binding-linux-riscv64-musl@1.11.1:
+ resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==, tarball: https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz}
+ cpu: [riscv64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@unrs/resolver-binding-linux-s390x-gnu@1.11.1:
+ resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==, tarball: https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz}
+ cpu: [s390x]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@unrs/resolver-binding-linux-x64-gnu@1.11.1:
+ resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==, tarball: https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@unrs/resolver-binding-linux-x64-musl@1.11.1:
+ resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==, tarball: https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@unrs/resolver-binding-wasm32-wasi@1.11.1:
+ resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==, tarball: https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz}
+ engines: {node: '>=14.0.0'}
+ cpu: [wasm32]
+ requiresBuild: true
+ dependencies:
+ '@napi-rs/wasm-runtime': 0.2.12
+ dev: true
+ optional: true
+
+ /@unrs/resolver-binding-win32-arm64-msvc@1.11.1:
+ resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==, tarball: https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz}
+ cpu: [arm64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@unrs/resolver-binding-win32-ia32-msvc@1.11.1:
+ resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==, tarball: https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz}
+ cpu: [ia32]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@unrs/resolver-binding-win32-x64-msvc@1.11.1:
+ resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==, tarball: https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz}
+ cpu: [x64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@vercel/oidc@3.0.5:
+ resolution: {integrity: sha512-fnYhv671l+eTTp48gB4zEsTW/YtRgRPnkI2nT7x6qw5rkI1Lq2hTmQIpHPgyThI0znLK+vX2n9XxKdXZ7BUbbw==, tarball: https://registry.npmjs.org/@vercel/oidc/-/oidc-3.0.5.tgz}
+ engines: {node: '>= 20'}
+ dev: false
+
+ /acorn-jsx@5.3.2(acorn@8.15.0):
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, tarball: https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+ dependencies:
+ acorn: 8.15.0
+
+ /acorn@8.15.0:
+ resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==, tarball: https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
+ /ai@5.0.116(zod@4.2.1):
+ resolution: {integrity: sha512-+2hYJ80/NcDWuv9K2/MLP3cTCFgwWHmHlS1tOpFUKKcmLbErAAlE/S2knsKboc3PNAu8pQkDr2N3K/Vle7ENgQ==, tarball: https://registry.npmjs.org/ai/-/ai-5.0.116.tgz}
+ engines: {node: '>=18'}
+ peerDependencies:
+ zod: ^3.25.76 || ^4.1.8
+ dependencies:
+ '@ai-sdk/gateway': 2.0.23(zod@4.2.1)
+ '@ai-sdk/provider': 2.0.0
+ '@ai-sdk/provider-utils': 3.0.19(zod@4.2.1)
+ '@opentelemetry/api': 1.9.0
+ zod: 4.2.1
+ dev: false
+
+ /ajv@6.12.6:
+ resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, tarball: https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz}
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-json-stable-stringify: 2.1.0
+ json-schema-traverse: 0.4.1
+ uri-js: 4.4.1
+ dev: true
+
+ /ansi-styles@4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, tarball: https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz}
+ engines: {node: '>=8'}
+ dependencies:
+ color-convert: 2.0.1
+ dev: true
+
+ /argparse@1.0.10:
+ resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==, tarball: https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz}
+ dependencies:
+ sprintf-js: 1.0.3
+ dev: true
+
+ /argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, tarball: https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz}
+
+ /aria-hidden@1.2.6:
+ resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==, tarball: https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz}
+ engines: {node: '>=10'}
+ dependencies:
+ tslib: 2.8.1
+ dev: false
+
+ /aria-query@5.3.2:
+ resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==, tarball: https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /array-buffer-byte-length@1.0.2:
+ resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==, tarball: https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ is-array-buffer: 3.0.5
+ dev: true
+
+ /array-includes@3.1.9:
+ resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==, tarball: https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-abstract: 1.24.1
+ es-object-atoms: 1.1.1
+ get-intrinsic: 1.3.0
+ is-string: 1.1.1
+ math-intrinsics: 1.1.0
+ dev: true
+
+ /array.prototype.findlast@1.2.5:
+ resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==, tarball: https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ es-shim-unscopables: 1.1.0
+ dev: true
+
+ /array.prototype.findlastindex@1.2.6:
+ resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==, tarball: https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-abstract: 1.24.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ es-shim-unscopables: 1.1.0
+ dev: true
+
+ /array.prototype.flat@1.3.3:
+ resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==, tarball: https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.1
+ es-shim-unscopables: 1.1.0
+ dev: true
+
+ /array.prototype.flatmap@1.3.3:
+ resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==, tarball: https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.1
+ es-shim-unscopables: 1.1.0
+ dev: true
+
+ /array.prototype.tosorted@1.1.4:
+ resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==, tarball: https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.1
+ es-errors: 1.3.0
+ es-shim-unscopables: 1.1.0
+ dev: true
+
+ /arraybuffer.prototype.slice@1.0.4:
+ resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==, tarball: https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ array-buffer-byte-length: 1.0.2
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.1
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ is-array-buffer: 3.0.5
+ dev: true
+
+ /ast-types-flow@0.0.8:
+ resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==, tarball: https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz}
+ dev: true
+
+ /astring@1.9.0:
+ resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==, tarball: https://registry.npmjs.org/astring/-/astring-1.9.0.tgz}
+ hasBin: true
+ dev: false
+
+ /async-function@1.0.0:
+ resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==, tarball: https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /available-typed-arrays@1.0.7:
+ resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==, tarball: https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ possible-typed-array-names: 1.1.0
+ dev: true
+
+ /axe-core@4.11.0:
+ resolution: {integrity: sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ==, tarball: https://registry.npmjs.org/axe-core/-/axe-core-4.11.0.tgz}
+ engines: {node: '>=4'}
+ dev: true
+
+ /axobject-query@4.1.0:
+ resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==, tarball: https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /babel-plugin-apply-mdx-type-prop@1.6.22(@babel/core@7.12.9):
+ resolution: {integrity: sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==, tarball: https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz}
+ peerDependencies:
+ '@babel/core': ^7.11.6
+ dependencies:
+ '@babel/core': 7.12.9
+ '@babel/helper-plugin-utils': 7.10.4
+ '@mdx-js/util': 1.6.22
+ dev: false
+
+ /babel-plugin-extract-import-names@1.6.22:
+ resolution: {integrity: sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==, tarball: https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz}
+ dependencies:
+ '@babel/helper-plugin-utils': 7.10.4
+ dev: false
+
+ /bail@1.0.5:
+ resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==, tarball: https://registry.npmjs.org/bail/-/bail-1.0.5.tgz}
+ dev: false
+
+ /bail@2.0.2:
+ resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==, tarball: https://registry.npmjs.org/bail/-/bail-2.0.2.tgz}
+
+ /balanced-match@1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, tarball: https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz}
+ dev: true
+
+ /baseline-browser-mapping@2.9.11:
+ resolution: {integrity: sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==, tarball: https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz}
+ hasBin: true
+
+ /brace-expansion@1.1.12:
+ resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==, tarball: https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz}
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+ dev: true
+
+ /brace-expansion@2.0.2:
+ resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==, tarball: https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz}
+ dependencies:
+ balanced-match: 1.0.2
+ dev: true
+
+ /braces@3.0.3:
+ resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==, tarball: https://registry.npmjs.org/braces/-/braces-3.0.3.tgz}
+ engines: {node: '>=8'}
+ dependencies:
+ fill-range: 7.1.1
+ dev: true
+
+ /browserslist@4.28.1:
+ resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==, tarball: https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+ dependencies:
+ baseline-browser-mapping: 2.9.11
+ caniuse-lite: 1.0.30001761
+ electron-to-chromium: 1.5.267
+ node-releases: 2.0.27
+ update-browserslist-db: 1.2.3(browserslist@4.28.1)
+
+ /call-bind-apply-helpers@1.0.2:
+ resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==, tarball: https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+ dev: true
+
+ /call-bind@1.0.8:
+ resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==, tarball: https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-define-property: 1.0.1
+ get-intrinsic: 1.3.0
+ set-function-length: 1.2.2
+ dev: true
+
+ /call-bound@1.0.4:
+ resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==, tarball: https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ get-intrinsic: 1.3.0
+ dev: true
+
+ /callsites@3.1.0:
+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, tarball: https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz}
+ engines: {node: '>=6'}
+ dev: true
+
+ /camelcase-css@2.0.1:
+ resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==, tarball: https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz}
+ engines: {node: '>= 6'}
+ dev: false
+
+ /caniuse-lite@1.0.30001761:
+ resolution: {integrity: sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==, tarball: https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001761.tgz}
+
+ /ccount@1.1.0:
+ resolution: {integrity: sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==, tarball: https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz}
+ dev: false
+
+ /ccount@2.0.1:
+ resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==, tarball: https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz}
+
+ /chalk@4.1.2:
+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, tarball: https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz}
+ engines: {node: '>=10'}
+ dependencies:
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
+ dev: true
+
+ /character-entities-html4@2.1.0:
+ resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==, tarball: https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz}
+
+ /character-entities-legacy@1.1.4:
+ resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==, tarball: https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz}
+ dev: false
+
+ /character-entities-legacy@3.0.0:
+ resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==, tarball: https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz}
+
+ /character-entities@1.2.4:
+ resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==, tarball: https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz}
+ dev: false
+
+ /character-entities@2.0.2:
+ resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==, tarball: https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz}
+
+ /character-reference-invalid@1.1.4:
+ resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==, tarball: https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz}
+ dev: false
+
+ /character-reference-invalid@2.0.1:
+ resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==, tarball: https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz}
+
+ /chokidar@4.0.3:
+ resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==, tarball: https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz}
+ engines: {node: '>= 14.16.0'}
+ dependencies:
+ readdirp: 4.1.2
+ dev: false
+
+ /class-variance-authority@0.7.1:
+ resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==, tarball: https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz}
+ dependencies:
+ clsx: 2.1.1
+ dev: false
+
+ /client-only@0.0.1:
+ resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==, tarball: https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz}
+ dev: false
+
+ /clsx@2.1.1:
+ resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==, tarball: https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz}
+ engines: {node: '>=6'}
+ dev: false
+
+ /collapse-white-space@1.0.6:
+ resolution: {integrity: sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==, tarball: https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz}
+ dev: false
+
+ /collapse-white-space@2.1.0:
+ resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==, tarball: https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz}
+ dev: false
+
+ /color-convert@2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, tarball: https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz}
+ engines: {node: '>=7.0.0'}
+ dependencies:
+ color-name: 1.1.4
+ dev: true
+
+ /color-name@1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, tarball: https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz}
+ dev: true
+
+ /comma-separated-tokens@1.0.8:
+ resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==, tarball: https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz}
+ dev: false
+
+ /comma-separated-tokens@2.0.3:
+ resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==, tarball: https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz}
+ dev: false
+
+ /compute-scroll-into-view@3.1.1:
+ resolution: {integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==, tarball: https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz}
+ dev: false
+
+ /concat-map@0.0.1:
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, tarball: https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz}
+ dev: true
+
+ /convert-source-map@1.9.0:
+ resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==, tarball: https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz}
+ dev: false
+
+ /convert-source-map@2.0.0:
+ resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, tarball: https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz}
+
+ /cross-spawn@7.0.6:
+ resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==, tarball: https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz}
+ engines: {node: '>= 8'}
+ dependencies:
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.2
+ dev: true
+
+ /cssesc@3.0.0:
+ resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==, tarball: https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz}
+ engines: {node: '>=4'}
+ hasBin: true
+ dev: false
+
+ /csstype@3.2.3:
+ resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==, tarball: https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz}
+
+ /damerau-levenshtein@1.0.8:
+ resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==, tarball: https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz}
+ dev: true
+
+ /data-view-buffer@1.0.2:
+ resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==, tarball: https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-data-view: 1.0.2
+ dev: true
+
+ /data-view-byte-length@1.0.2:
+ resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==, tarball: https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-data-view: 1.0.2
+ dev: true
+
+ /data-view-byte-offset@1.0.1:
+ resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==, tarball: https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-data-view: 1.0.2
+ dev: true
+
+ /debug@3.2.7:
+ resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==, tarball: https://registry.npmjs.org/debug/-/debug-3.2.7.tgz}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ dependencies:
+ ms: 2.1.3
+ dev: true
+
+ /debug@4.4.3:
+ resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==, tarball: https://registry.npmjs.org/debug/-/debug-4.4.3.tgz}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ dependencies:
+ ms: 2.1.3
+
+ /decode-named-character-reference@1.2.0:
+ resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==, tarball: https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz}
+ dependencies:
+ character-entities: 2.0.2
+
+ /deep-is@0.1.4:
+ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, tarball: https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz}
+ dev: true
+
+ /define-data-property@1.1.4:
+ resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==, tarball: https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ gopd: 1.2.0
+ dev: true
+
+ /define-properties@1.2.1:
+ resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==, tarball: https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ define-data-property: 1.1.4
+ has-property-descriptors: 1.0.2
+ object-keys: 1.1.1
+ dev: true
+
+ /dequal@2.0.3:
+ resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==, tarball: https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz}
+ engines: {node: '>=6'}
+
+ /detab@2.0.4:
+ resolution: {integrity: sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==, tarball: https://registry.npmjs.org/detab/-/detab-2.0.4.tgz}
+ dependencies:
+ repeat-string: 1.6.1
+ dev: false
+
+ /detect-libc@2.1.2:
+ resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==, tarball: https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz}
+ engines: {node: '>=8'}
+
+ /detect-node-es@1.1.0:
+ resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==, tarball: https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz}
+ dev: false
+
+ /devlop@1.1.0:
+ resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==, tarball: https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz}
+ dependencies:
+ dequal: 2.0.3
+
+ /doctrine@2.1.0:
+ resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==, tarball: https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ esutils: 2.0.3
+ dev: true
+
+ /dunder-proto@1.0.1:
+ resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==, tarball: https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-errors: 1.3.0
+ gopd: 1.2.0
+ dev: true
+
+ /electron-to-chromium@1.5.267:
+ resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==, tarball: https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz}
+
+ /emoji-regex@9.2.2:
+ resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, tarball: https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz}
+ dev: true
+
+ /enhanced-resolve@5.18.4:
+ resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==, tarball: https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz}
+ engines: {node: '>=10.13.0'}
+ dependencies:
+ graceful-fs: 4.2.11
+ tapable: 2.3.0
+ dev: true
+
+ /es-abstract@1.24.1:
+ resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==, tarball: https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ array-buffer-byte-length: 1.0.2
+ arraybuffer.prototype.slice: 1.0.4
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ data-view-buffer: 1.0.2
+ data-view-byte-length: 1.0.2
+ data-view-byte-offset: 1.0.1
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ es-set-tostringtag: 2.1.0
+ es-to-primitive: 1.3.0
+ function.prototype.name: 1.1.8
+ get-intrinsic: 1.3.0
+ get-proto: 1.0.1
+ get-symbol-description: 1.1.0
+ globalthis: 1.0.4
+ gopd: 1.2.0
+ has-property-descriptors: 1.0.2
+ has-proto: 1.2.0
+ has-symbols: 1.1.0
+ hasown: 2.0.2
+ internal-slot: 1.1.0
+ is-array-buffer: 3.0.5
+ is-callable: 1.2.7
+ is-data-view: 1.0.2
+ is-negative-zero: 2.0.3
+ is-regex: 1.2.1
+ is-set: 2.0.3
+ is-shared-array-buffer: 1.0.4
+ is-string: 1.1.1
+ is-typed-array: 1.1.15
+ is-weakref: 1.1.1
+ math-intrinsics: 1.1.0
+ object-inspect: 1.13.4
+ object-keys: 1.1.1
+ object.assign: 4.1.7
+ own-keys: 1.0.1
+ regexp.prototype.flags: 1.5.4
+ safe-array-concat: 1.1.3
+ safe-push-apply: 1.0.0
+ safe-regex-test: 1.1.0
+ set-proto: 1.0.0
+ stop-iteration-iterator: 1.1.0
+ string.prototype.trim: 1.2.10
+ string.prototype.trimend: 1.0.9
+ string.prototype.trimstart: 1.0.8
+ typed-array-buffer: 1.0.3
+ typed-array-byte-length: 1.0.3
+ typed-array-byte-offset: 1.0.4
+ typed-array-length: 1.0.7
+ unbox-primitive: 1.1.0
+ which-typed-array: 1.1.19
+ dev: true
+
+ /es-define-property@1.0.1:
+ resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==, tarball: https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /es-errors@1.3.0:
+ resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==, tarball: https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /es-iterator-helpers@1.2.2:
+ resolution: {integrity: sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==, tarball: https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.2.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-abstract: 1.24.1
+ es-errors: 1.3.0
+ es-set-tostringtag: 2.1.0
+ function-bind: 1.1.2
+ get-intrinsic: 1.3.0
+ globalthis: 1.0.4
+ gopd: 1.2.0
+ has-property-descriptors: 1.0.2
+ has-proto: 1.2.0
+ has-symbols: 1.1.0
+ internal-slot: 1.1.0
+ iterator.prototype: 1.1.5
+ safe-array-concat: 1.1.3
+ dev: true
+
+ /es-object-atoms@1.1.1:
+ resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==, tarball: https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ es-errors: 1.3.0
+ dev: true
+
+ /es-set-tostringtag@2.1.0:
+ resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==, tarball: https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ has-tostringtag: 1.0.2
+ hasown: 2.0.2
+ dev: true
+
+ /es-shim-unscopables@1.1.0:
+ resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==, tarball: https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ hasown: 2.0.2
+ dev: true
+
+ /es-to-primitive@1.3.0:
+ resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==, tarball: https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ is-callable: 1.2.7
+ is-date-object: 1.1.0
+ is-symbol: 1.1.1
+ dev: true
+
+ /esast-util-from-estree@2.0.0:
+ resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==, tarball: https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz}
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ devlop: 1.1.0
+ estree-util-visit: 2.0.0
+ unist-util-position-from-estree: 2.0.0
+ dev: false
+
+ /esast-util-from-js@2.0.1:
+ resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==, tarball: https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz}
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ acorn: 8.15.0
+ esast-util-from-estree: 2.0.0
+ vfile-message: 4.0.3
+ dev: false
+
+ /esbuild@0.25.12:
+ resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==, tarball: https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz}
+ engines: {node: '>=18'}
+ hasBin: true
+ requiresBuild: true
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.25.12
+ '@esbuild/android-arm': 0.25.12
+ '@esbuild/android-arm64': 0.25.12
+ '@esbuild/android-x64': 0.25.12
+ '@esbuild/darwin-arm64': 0.25.12
+ '@esbuild/darwin-x64': 0.25.12
+ '@esbuild/freebsd-arm64': 0.25.12
+ '@esbuild/freebsd-x64': 0.25.12
+ '@esbuild/linux-arm': 0.25.12
+ '@esbuild/linux-arm64': 0.25.12
+ '@esbuild/linux-ia32': 0.25.12
+ '@esbuild/linux-loong64': 0.25.12
+ '@esbuild/linux-mips64el': 0.25.12
+ '@esbuild/linux-ppc64': 0.25.12
+ '@esbuild/linux-riscv64': 0.25.12
+ '@esbuild/linux-s390x': 0.25.12
+ '@esbuild/linux-x64': 0.25.12
+ '@esbuild/netbsd-arm64': 0.25.12
+ '@esbuild/netbsd-x64': 0.25.12
+ '@esbuild/openbsd-arm64': 0.25.12
+ '@esbuild/openbsd-x64': 0.25.12
+ '@esbuild/openharmony-arm64': 0.25.12
+ '@esbuild/sunos-x64': 0.25.12
+ '@esbuild/win32-arm64': 0.25.12
+ '@esbuild/win32-ia32': 0.25.12
+ '@esbuild/win32-x64': 0.25.12
+ dev: false
+
+ /escalade@3.2.0:
+ resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==, tarball: https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz}
+ engines: {node: '>=6'}
+
+ /escape-string-regexp@4.0.0:
+ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, tarball: https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz}
+ engines: {node: '>=10'}
+ dev: true
+
+ /escape-string-regexp@5.0.0:
+ resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==, tarball: https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz}
+ engines: {node: '>=12'}
+
+ /eslint-config-next@16.1.0(@typescript-eslint/parser@8.50.0)(eslint@9.39.2)(typescript@5.9.3):
+ resolution: {integrity: sha512-RlPb8E2uO/Ix/w3kizxz6+6ogw99WqtNzTG0ArRZ5NEkIYcsfRb8U0j7aTG7NjRvcrsak5QtUSuxGNN2UcA58g==, tarball: https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.1.0.tgz}
+ peerDependencies:
+ eslint: '>=9.0.0'
+ typescript: '>=3.3.1'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@next/eslint-plugin-next': 16.1.0
+ eslint: 9.39.2
+ eslint-import-resolver-node: 0.3.9
+ eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2)
+ eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.50.0)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2)
+ eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.2)
+ eslint-plugin-react: 7.37.5(eslint@9.39.2)
+ eslint-plugin-react-hooks: 7.0.1(eslint@9.39.2)
+ globals: 16.4.0
+ typescript: 5.9.3
+ typescript-eslint: 8.50.0(eslint@9.39.2)(typescript@5.9.3)
+ transitivePeerDependencies:
+ - '@typescript-eslint/parser'
+ - eslint-import-resolver-webpack
+ - eslint-plugin-import-x
+ - supports-color
+ dev: true
+
+ /eslint-import-resolver-node@0.3.9:
+ resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==, tarball: https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz}
+ dependencies:
+ debug: 3.2.7
+ is-core-module: 2.16.1
+ resolve: 1.22.11
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2):
+ resolution: {integrity: sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==, tarball: https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ peerDependencies:
+ eslint: '*'
+ eslint-plugin-import: '*'
+ eslint-plugin-import-x: '*'
+ peerDependenciesMeta:
+ eslint-plugin-import:
+ optional: true
+ eslint-plugin-import-x:
+ optional: true
+ dependencies:
+ '@nolyfill/is-core-module': 1.0.39
+ debug: 4.4.3
+ eslint: 9.39.2
+ eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.50.0)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2)
+ get-tsconfig: 4.13.0
+ is-bun-module: 2.0.0
+ stable-hash: 0.0.5
+ tinyglobby: 0.2.15
+ unrs-resolver: 1.11.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /eslint-module-utils@2.12.1(@typescript-eslint/parser@8.50.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2):
+ resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==, tarball: https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz}
+ engines: {node: '>=4'}
+ peerDependencies:
+ '@typescript-eslint/parser': '*'
+ eslint: '*'
+ eslint-import-resolver-node: '*'
+ eslint-import-resolver-typescript: '*'
+ eslint-import-resolver-webpack: '*'
+ peerDependenciesMeta:
+ '@typescript-eslint/parser':
+ optional: true
+ eslint:
+ optional: true
+ eslint-import-resolver-node:
+ optional: true
+ eslint-import-resolver-typescript:
+ optional: true
+ eslint-import-resolver-webpack:
+ optional: true
+ dependencies:
+ '@typescript-eslint/parser': 8.50.0(eslint@9.39.2)(typescript@5.9.3)
+ debug: 3.2.7
+ eslint: 9.39.2
+ eslint-import-resolver-node: 0.3.9
+ eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2)
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.50.0)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2):
+ resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==, tarball: https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz}
+ engines: {node: '>=4'}
+ peerDependencies:
+ '@typescript-eslint/parser': '*'
+ eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9
+ peerDependenciesMeta:
+ '@typescript-eslint/parser':
+ optional: true
+ dependencies:
+ '@rtsao/scc': 1.1.0
+ '@typescript-eslint/parser': 8.50.0(eslint@9.39.2)(typescript@5.9.3)
+ array-includes: 3.1.9
+ array.prototype.findlastindex: 1.2.6
+ array.prototype.flat: 1.3.3
+ array.prototype.flatmap: 1.3.3
+ debug: 3.2.7
+ doctrine: 2.1.0
+ eslint: 9.39.2
+ eslint-import-resolver-node: 0.3.9
+ eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.50.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2)
+ hasown: 2.0.2
+ is-core-module: 2.16.1
+ is-glob: 4.0.3
+ minimatch: 3.1.2
+ object.fromentries: 2.0.8
+ object.groupby: 1.0.3
+ object.values: 1.2.1
+ semver: 6.3.1
+ string.prototype.trimend: 1.0.9
+ tsconfig-paths: 3.15.0
+ transitivePeerDependencies:
+ - eslint-import-resolver-typescript
+ - eslint-import-resolver-webpack
+ - supports-color
+ dev: true
+
+ /eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.2):
+ resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==, tarball: https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz}
+ engines: {node: '>=4.0'}
+ peerDependencies:
+ eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9
+ dependencies:
+ aria-query: 5.3.2
+ array-includes: 3.1.9
+ array.prototype.flatmap: 1.3.3
+ ast-types-flow: 0.0.8
+ axe-core: 4.11.0
+ axobject-query: 4.1.0
+ damerau-levenshtein: 1.0.8
+ emoji-regex: 9.2.2
+ eslint: 9.39.2
+ hasown: 2.0.2
+ jsx-ast-utils: 3.3.5
+ language-tags: 1.0.9
+ minimatch: 3.1.2
+ object.fromentries: 2.0.8
+ safe-regex-test: 1.1.0
+ string.prototype.includes: 2.0.1
+ dev: true
+
+ /eslint-plugin-react-hooks@7.0.1(eslint@9.39.2):
+ resolution: {integrity: sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==, tarball: https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz}
+ engines: {node: '>=18'}
+ peerDependencies:
+ eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/parser': 7.28.5
+ eslint: 9.39.2
+ hermes-parser: 0.25.1
+ zod: 4.2.1
+ zod-validation-error: 4.0.2(zod@4.2.1)
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /eslint-plugin-react@7.37.5(eslint@9.39.2):
+ resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==, tarball: https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz}
+ engines: {node: '>=4'}
+ peerDependencies:
+ eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7
+ dependencies:
+ array-includes: 3.1.9
+ array.prototype.findlast: 1.2.5
+ array.prototype.flatmap: 1.3.3
+ array.prototype.tosorted: 1.1.4
+ doctrine: 2.1.0
+ es-iterator-helpers: 1.2.2
+ eslint: 9.39.2
+ estraverse: 5.3.0
+ hasown: 2.0.2
+ jsx-ast-utils: 3.3.5
+ minimatch: 3.1.2
+ object.entries: 1.1.9
+ object.fromentries: 2.0.8
+ object.values: 1.2.1
+ prop-types: 15.8.1
+ resolve: 2.0.0-next.5
+ semver: 6.3.1
+ string.prototype.matchall: 4.0.12
+ string.prototype.repeat: 1.0.0
+ dev: true
+
+ /eslint-scope@8.4.0:
+ resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==, tarball: https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 5.3.0
+ dev: true
+
+ /eslint-visitor-keys@3.4.3:
+ resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, tarball: https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dev: true
+
+ /eslint-visitor-keys@4.2.1:
+ resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==, tarball: https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ dev: true
+
+ /eslint@9.39.2:
+ resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==, tarball: https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ hasBin: true
+ peerDependencies:
+ jiti: '*'
+ peerDependenciesMeta:
+ jiti:
+ optional: true
+ dependencies:
+ '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2)
+ '@eslint-community/regexpp': 4.12.2
+ '@eslint/config-array': 0.21.1
+ '@eslint/config-helpers': 0.4.2
+ '@eslint/core': 0.17.0
+ '@eslint/eslintrc': 3.3.3
+ '@eslint/js': 9.39.2
+ '@eslint/plugin-kit': 0.4.1
+ '@humanfs/node': 0.16.7
+ '@humanwhocodes/module-importer': 1.0.1
+ '@humanwhocodes/retry': 0.4.3
+ '@types/estree': 1.0.8
+ ajv: 6.12.6
+ chalk: 4.1.2
+ cross-spawn: 7.0.6
+ debug: 4.4.3
+ escape-string-regexp: 4.0.0
+ eslint-scope: 8.4.0
+ eslint-visitor-keys: 4.2.1
+ espree: 10.4.0
+ esquery: 1.6.0
+ esutils: 2.0.3
+ fast-deep-equal: 3.1.3
+ file-entry-cache: 8.0.0
+ find-up: 5.0.0
+ glob-parent: 6.0.2
+ ignore: 5.3.2
+ imurmurhash: 0.1.4
+ is-glob: 4.0.3
+ json-stable-stringify-without-jsonify: 1.0.1
+ lodash.merge: 4.6.2
+ minimatch: 3.1.2
+ natural-compare: 1.4.0
+ optionator: 0.9.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /espree@10.4.0:
+ resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==, tarball: https://registry.npmjs.org/espree/-/espree-10.4.0.tgz}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ dependencies:
+ acorn: 8.15.0
+ acorn-jsx: 5.3.2(acorn@8.15.0)
+ eslint-visitor-keys: 4.2.1
+ dev: true
+
+ /esprima@4.0.1:
+ resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==, tarball: https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz}
+ engines: {node: '>=4'}
+ hasBin: true
+ dev: true
+
+ /esquery@1.6.0:
+ resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==, tarball: https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz}
+ engines: {node: '>=0.10'}
+ dependencies:
+ estraverse: 5.3.0
+ dev: true
+
+ /esrecurse@4.3.0:
+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, tarball: https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz}
+ engines: {node: '>=4.0'}
+ dependencies:
+ estraverse: 5.3.0
+ dev: true
+
+ /estraverse@5.3.0:
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, tarball: https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz}
+ engines: {node: '>=4.0'}
+ dev: true
+
+ /estree-util-attach-comments@3.0.0:
+ resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==, tarball: https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz}
+ dependencies:
+ '@types/estree': 1.0.8
+ dev: false
+
+ /estree-util-build-jsx@3.0.1:
+ resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==, tarball: https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz}
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ devlop: 1.1.0
+ estree-util-is-identifier-name: 3.0.0
+ estree-walker: 3.0.3
+ dev: false
+
+ /estree-util-is-identifier-name@3.0.0:
+ resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==, tarball: https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz}
+
+ /estree-util-scope@1.0.0:
+ resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==, tarball: https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz}
+ dependencies:
+ '@types/estree': 1.0.8
+ devlop: 1.1.0
+ dev: false
+
+ /estree-util-to-js@2.0.0:
+ resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==, tarball: https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz}
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ astring: 1.9.0
+ source-map: 0.7.6
+ dev: false
+
+ /estree-util-value-to-estree@3.5.0:
+ resolution: {integrity: sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ==, tarball: https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.5.0.tgz}
+ dependencies:
+ '@types/estree': 1.0.8
+ dev: false
+
+ /estree-util-visit@2.0.0:
+ resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==, tarball: https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz}
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/unist': 3.0.3
+
+ /estree-walker@3.0.3:
+ resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==, tarball: https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz}
+ dependencies:
+ '@types/estree': 1.0.8
+ dev: false
+
+ /esutils@2.0.3:
+ resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, tarball: https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /eventsource-parser@3.0.6:
+ resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==, tarball: https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz}
+ engines: {node: '>=18.0.0'}
+ dev: false
+
+ /extend-shallow@2.0.1:
+ resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==, tarball: https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-extendable: 0.1.1
+ dev: true
+
+ /extend@3.0.2:
+ resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==, tarball: https://registry.npmjs.org/extend/-/extend-3.0.2.tgz}
+
+ /fast-deep-equal@3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, tarball: https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz}
+ dev: true
+
+ /fast-glob@3.3.1:
+ resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==, tarball: https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz}
+ engines: {node: '>=8.6.0'}
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ '@nodelib/fs.walk': 1.2.8
+ glob-parent: 5.1.2
+ merge2: 1.4.1
+ micromatch: 4.0.8
+ dev: true
+
+ /fast-json-stable-stringify@2.1.0:
+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, tarball: https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz}
+ dev: true
+
+ /fast-levenshtein@2.0.6:
+ resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, tarball: https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz}
+ dev: true
+
+ /fastq@1.19.1:
+ resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==, tarball: https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz}
+ dependencies:
+ reusify: 1.1.0
+ dev: true
+
+ /fdir@6.5.0(picomatch@4.0.3):
+ resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==, tarball: https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz}
+ engines: {node: '>=12.0.0'}
+ peerDependencies:
+ picomatch: ^3 || ^4
+ peerDependenciesMeta:
+ picomatch:
+ optional: true
+ dependencies:
+ picomatch: 4.0.3
+
+ /file-entry-cache@8.0.0:
+ resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==, tarball: https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz}
+ engines: {node: '>=16.0.0'}
+ dependencies:
+ flat-cache: 4.0.1
+ dev: true
+
+ /fill-range@7.1.1:
+ resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==, tarball: https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz}
+ engines: {node: '>=8'}
+ dependencies:
+ to-regex-range: 5.0.1
+ dev: true
+
+ /find-up@5.0.0:
+ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, tarball: https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz}
+ engines: {node: '>=10'}
+ dependencies:
+ locate-path: 6.0.0
+ path-exists: 4.0.0
+ dev: true
+
+ /flat-cache@4.0.1:
+ resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==, tarball: https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz}
+ engines: {node: '>=16'}
+ dependencies:
+ flatted: 3.3.3
+ keyv: 4.5.4
+ dev: true
+
+ /flatted@3.3.3:
+ resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==, tarball: https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz}
+ dev: true
+
+ /for-each@0.3.5:
+ resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==, tarball: https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ is-callable: 1.2.7
+ dev: true
+
+ /fumadocs-core@16.3.2(@types/react@19.2.7)(lucide-react@0.544.0)(next@16.1.0)(react-dom@19.2.3)(react@19.2.3)(zod@4.2.1):
+ resolution: {integrity: sha512-lpvW2qnH0C7c1CGCv6Ym1GrDTVyV+APb1h3hBuWcGiAamNN1vw7lldXQVJ5ENL/SJr6TQ6gJ+qHExNohsh/ynA==, tarball: https://registry.npmjs.org/fumadocs-core/-/fumadocs-core-16.3.2.tgz}
+ peerDependencies:
+ '@mixedbread/sdk': ^0.19.0
+ '@orama/core': 1.x.x
+ '@tanstack/react-router': 1.x.x
+ '@types/react': '*'
+ algoliasearch: 5.x.x
+ lucide-react: '*'
+ next: 16.x.x
+ react: ^19.2.0
+ react-dom: ^19.2.0
+ react-router: 7.x.x
+ waku: ^0.26.0 || ^0.27.0
+ zod: '*'
+ peerDependenciesMeta:
+ '@mixedbread/sdk':
+ optional: true
+ '@orama/core':
+ optional: true
+ '@tanstack/react-router':
+ optional: true
+ '@types/react':
+ optional: true
+ algoliasearch:
+ optional: true
+ lucide-react:
+ optional: true
+ next:
+ optional: true
+ react:
+ optional: true
+ react-dom:
+ optional: true
+ react-router:
+ optional: true
+ waku:
+ optional: true
+ zod:
+ optional: true
+ dependencies:
+ '@formatjs/intl-localematcher': 0.7.2
+ '@orama/orama': 3.1.18
+ '@shikijs/rehype': 3.20.0
+ '@shikijs/transformers': 3.20.0
+ '@types/react': 19.2.7
+ estree-util-value-to-estree: 3.5.0
+ github-slugger: 2.0.0
+ hast-util-to-estree: 3.1.3
+ hast-util-to-jsx-runtime: 2.3.6
+ image-size: 2.0.2
+ lucide-react: 0.544.0(react@19.2.3)
+ negotiator: 1.0.0
+ next: 16.1.0(@babel/core@7.28.5)(react-dom@19.2.3)(react@19.2.3)
+ npm-to-yarn: 3.0.1
+ path-to-regexp: 8.3.0
+ react: 19.2.3
+ react-dom: 19.2.3(react@19.2.3)
+ remark: 15.0.1
+ remark-gfm: 4.0.1
+ remark-rehype: 11.1.2
+ scroll-into-view-if-needed: 3.1.0
+ shiki: 3.20.0
+ unist-util-visit: 5.0.0
+ zod: 4.2.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /fumadocs-mdx@13.0.8(fumadocs-core@16.3.2)(next@16.1.0)(react@19.2.3):
+ resolution: {integrity: sha512-UbUwH0iGvYbytnxhmfd7tWJKFK8L0mrbTAmrQYnpg6Wi/h8afNMJmbHBOzVcaEWJKeFipZ1CGDAsNA2fztwXNg==, tarball: https://registry.npmjs.org/fumadocs-mdx/-/fumadocs-mdx-13.0.8.tgz}
+ hasBin: true
+ peerDependencies:
+ '@fumadocs/mdx-remote': ^1.4.0
+ fumadocs-core: ^15.0.0 || ^16.0.0
+ next: ^15.3.0 || ^16.0.0
+ react: '*'
+ vite: 6.x.x || 7.x.x
+ peerDependenciesMeta:
+ '@fumadocs/mdx-remote':
+ optional: true
+ next:
+ optional: true
+ react:
+ optional: true
+ vite:
+ optional: true
+ dependencies:
+ '@mdx-js/mdx': 3.1.1
+ '@standard-schema/spec': 1.1.0
+ chokidar: 4.0.3
+ esbuild: 0.25.12
+ estree-util-value-to-estree: 3.5.0
+ fumadocs-core: 16.3.2(@types/react@19.2.7)(lucide-react@0.544.0)(next@16.1.0)(react-dom@19.2.3)(react@19.2.3)(zod@4.2.1)
+ js-yaml: 4.1.1
+ lru-cache: 11.2.4
+ mdast-util-to-markdown: 2.1.2
+ next: 16.1.0(@babel/core@7.28.5)(react-dom@19.2.3)(react@19.2.3)
+ picocolors: 1.1.1
+ picomatch: 4.0.3
+ react: 19.2.3
+ remark-mdx: 3.1.1
+ tinyexec: 1.0.2
+ tinyglobby: 0.2.15
+ unified: 11.0.5
+ unist-util-remove-position: 5.0.0
+ unist-util-visit: 5.0.0
+ zod: 4.2.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /fumadocs-twoslash@3.1.10(@types/react-dom@19.2.3)(@types/react@19.2.7)(fumadocs-ui@16.3.2)(react-dom@19.2.3)(react@19.2.3)(typescript@5.9.3):
+ resolution: {integrity: sha512-x45dgfCRyUSjqd/APhf4EWJBnqoEqNH7kp7P4GbVWJqvptNsr5kQtRjMRTbhbg28XsrsBNHRTa8q1/w+rDfm1Q==, tarball: https://registry.npmjs.org/fumadocs-twoslash/-/fumadocs-twoslash-3.1.10.tgz}
+ peerDependencies:
+ '@types/react': '*'
+ fumadocs-ui: ^15.0.0 || ^16.0.0
+ react: 18.x.x || 19.x.x
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@radix-ui/react-popover': 1.1.15(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@shikijs/twoslash': 3.20.0(typescript@5.9.3)
+ '@types/react': 19.2.7
+ fumadocs-ui: 16.3.2(@types/react-dom@19.2.3)(@types/react@19.2.7)(lucide-react@0.544.0)(next@16.1.0)(react-dom@19.2.3)(react@19.2.3)(tailwindcss@4.1.18)(zod@4.2.1)
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-gfm: 3.1.0
+ mdast-util-to-hast: 13.2.1
+ react: 19.2.3
+ shiki: 3.20.0
+ tailwind-merge: 3.4.0
+ twoslash: 0.3.6(typescript@5.9.3)
+ transitivePeerDependencies:
+ - '@types/react-dom'
+ - react-dom
+ - supports-color
+ - typescript
+ dev: false
+
+ /fumadocs-ui@16.3.2(@types/react-dom@19.2.3)(@types/react@19.2.7)(lucide-react@0.544.0)(next@16.1.0)(react-dom@19.2.3)(react@19.2.3)(tailwindcss@4.1.18)(zod@4.2.1):
+ resolution: {integrity: sha512-ju7s+DOG5MhrAEgKZOMhSdcmGkywj8AW688EB6HovmS9xsjcezJq5Egp2izJte1Y9c9lfBEIjbgxX33W+lZI9g==, tarball: https://registry.npmjs.org/fumadocs-ui/-/fumadocs-ui-16.3.2.tgz}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^19.2.0
+ react-dom: ^19.2.0
+ tailwindcss: ^4.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ tailwindcss:
+ optional: true
+ dependencies:
+ '@fumadocs/ui': 16.3.2(@types/react@19.2.7)(lucide-react@0.544.0)(next@16.1.0)(react-dom@19.2.3)(react@19.2.3)(tailwindcss@4.1.18)(zod@4.2.1)
+ '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@radix-ui/react-direction': 1.1.1(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-navigation-menu': 1.2.14(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@radix-ui/react-popover': 1.1.15(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@radix-ui/react-scroll-area': 1.2.10(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@radix-ui/react-slot': 1.2.4(@types/react@19.2.7)(react@19.2.3)
+ '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.3)(@types/react@19.2.7)(react-dom@19.2.3)(react@19.2.3)
+ '@types/react': 19.2.7
+ class-variance-authority: 0.7.1
+ fumadocs-core: 16.3.2(@types/react@19.2.7)(lucide-react@0.544.0)(next@16.1.0)(react-dom@19.2.3)(react@19.2.3)(zod@4.2.1)
+ next-themes: 0.4.6(react-dom@19.2.3)(react@19.2.3)
+ react: 19.2.3
+ react-dom: 19.2.3(react@19.2.3)
+ react-medium-image-zoom: 5.4.0(react-dom@19.2.3)(react@19.2.3)
+ scroll-into-view-if-needed: 3.1.0
+ tailwindcss: 4.1.18
+ transitivePeerDependencies:
+ - '@mixedbread/sdk'
+ - '@orama/core'
+ - '@tanstack/react-router'
+ - '@types/react-dom'
+ - algoliasearch
+ - lucide-react
+ - next
+ - react-router
+ - supports-color
+ - waku
+ - zod
+ dev: false
+
+ /function-bind@1.1.2:
+ resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, tarball: https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz}
+
+ /function.prototype.name@1.1.8:
+ resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==, tarball: https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ functions-have-names: 1.2.3
+ hasown: 2.0.2
+ is-callable: 1.2.7
+ dev: true
+
+ /functions-have-names@1.2.3:
+ resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==, tarball: https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz}
+ dev: true
+
+ /generator-function@2.0.1:
+ resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==, tarball: https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /gensync@1.0.0-beta.2:
+ resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, tarball: https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz}
+ engines: {node: '>=6.9.0'}
+
+ /get-intrinsic@1.3.0:
+ resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==, tarball: https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind-apply-helpers: 1.0.2
+ es-define-property: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ function-bind: 1.1.2
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ has-symbols: 1.1.0
+ hasown: 2.0.2
+ math-intrinsics: 1.1.0
+ dev: true
+
+ /get-nonce@1.0.1:
+ resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==, tarball: https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz}
+ engines: {node: '>=6'}
+ dev: false
+
+ /get-proto@1.0.1:
+ resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==, tarball: https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ dunder-proto: 1.0.1
+ es-object-atoms: 1.1.1
+ dev: true
+
+ /get-symbol-description@1.1.0:
+ resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==, tarball: https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ dev: true
+
+ /get-tsconfig@4.13.0:
+ resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==, tarball: https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz}
+ dependencies:
+ resolve-pkg-maps: 1.0.0
+ dev: true
+
+ /github-slugger@2.0.0:
+ resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==, tarball: https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz}
+ dev: false
+
+ /glob-parent@5.1.2:
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, tarball: https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz}
+ engines: {node: '>= 6'}
+ dependencies:
+ is-glob: 4.0.3
+ dev: true
+
+ /glob-parent@6.0.2:
+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, tarball: https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz}
+ engines: {node: '>=10.13.0'}
+ dependencies:
+ is-glob: 4.0.3
+ dev: true
+
+ /globals@14.0.0:
+ resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==, tarball: https://registry.npmjs.org/globals/-/globals-14.0.0.tgz}
+ engines: {node: '>=18'}
+ dev: true
+
+ /globals@16.4.0:
+ resolution: {integrity: sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==, tarball: https://registry.npmjs.org/globals/-/globals-16.4.0.tgz}
+ engines: {node: '>=18'}
+ dev: true
+
+ /globalthis@1.0.4:
+ resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==, tarball: https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ define-properties: 1.2.1
+ gopd: 1.2.0
+ dev: true
+
+ /gopd@1.2.0:
+ resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==, tarball: https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /graceful-fs@4.2.11:
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, tarball: https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz}
+ dev: true
+
+ /gray-matter@4.0.3:
+ resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==, tarball: https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz}
+ engines: {node: '>=6.0'}
+ dependencies:
+ js-yaml: 3.14.2
+ kind-of: 6.0.3
+ section-matter: 1.0.0
+ strip-bom-string: 1.0.0
+ dev: true
+
+ /has-bigints@1.1.0:
+ resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==, tarball: https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /has-flag@4.0.0:
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, tarball: https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz}
+ engines: {node: '>=8'}
+ dev: true
+
+ /has-property-descriptors@1.0.2:
+ resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==, tarball: https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz}
+ dependencies:
+ es-define-property: 1.0.1
+ dev: true
+
+ /has-proto@1.2.0:
+ resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==, tarball: https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ dunder-proto: 1.0.1
+ dev: true
+
+ /has-symbols@1.1.0:
+ resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==, tarball: https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /has-tostringtag@1.0.2:
+ resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==, tarball: https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-symbols: 1.1.0
+ dev: true
+
+ /hasown@2.0.2:
+ resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==, tarball: https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ function-bind: 1.1.2
+
+ /hast-to-hyperscript@9.0.1:
+ resolution: {integrity: sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==, tarball: https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz}
+ dependencies:
+ '@types/unist': 2.0.11
+ comma-separated-tokens: 1.0.8
+ property-information: 5.6.0
+ space-separated-tokens: 1.1.5
+ style-to-object: 0.3.0
+ unist-util-is: 4.1.0
+ web-namespaces: 1.1.4
+ dev: false
+
+ /hast-util-from-parse5@6.0.1:
+ resolution: {integrity: sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==, tarball: https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz}
+ dependencies:
+ '@types/parse5': 5.0.3
+ hastscript: 6.0.0
+ property-information: 5.6.0
+ vfile: 4.2.1
+ vfile-location: 3.2.0
+ web-namespaces: 1.1.4
+ dev: false
+
+ /hast-util-parse-selector@2.2.5:
+ resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==, tarball: https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz}
+ dev: false
+
+ /hast-util-raw@6.0.1:
+ resolution: {integrity: sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==, tarball: https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz}
+ dependencies:
+ '@types/hast': 2.3.10
+ hast-util-from-parse5: 6.0.1
+ hast-util-to-parse5: 6.0.0
+ html-void-elements: 1.0.5
+ parse5: 6.0.1
+ unist-util-position: 3.1.0
+ vfile: 4.2.1
+ web-namespaces: 1.1.4
+ xtend: 4.0.2
+ zwitch: 1.0.5
+ dev: false
+
+ /hast-util-to-estree@3.1.3:
+ resolution: {integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==, tarball: https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz}
+ dependencies:
+ '@types/estree': 1.0.8
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.4
+ comma-separated-tokens: 2.0.3
+ devlop: 1.1.0
+ estree-util-attach-comments: 3.0.0
+ estree-util-is-identifier-name: 3.0.0
+ hast-util-whitespace: 3.0.0
+ mdast-util-mdx-expression: 2.0.1
+ mdast-util-mdx-jsx: 3.2.0
+ mdast-util-mdxjs-esm: 2.0.1
+ property-information: 7.1.0
+ space-separated-tokens: 2.0.2
+ style-to-js: 1.1.21
+ unist-util-position: 5.0.0
+ zwitch: 2.0.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /hast-util-to-html@9.0.5:
+ resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==, tarball: https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz}
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ ccount: 2.0.1
+ comma-separated-tokens: 2.0.3
+ hast-util-whitespace: 3.0.0
+ html-void-elements: 3.0.0
+ mdast-util-to-hast: 13.2.1
+ property-information: 7.1.0
+ space-separated-tokens: 2.0.2
+ stringify-entities: 4.0.4
+ zwitch: 2.0.4
+ dev: false
+
+ /hast-util-to-jsx-runtime@2.3.6:
+ resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==, tarball: https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz}
+ dependencies:
+ '@types/estree': 1.0.8
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ comma-separated-tokens: 2.0.3
+ devlop: 1.1.0
+ estree-util-is-identifier-name: 3.0.0
+ hast-util-whitespace: 3.0.0
+ mdast-util-mdx-expression: 2.0.1
+ mdast-util-mdx-jsx: 3.2.0
+ mdast-util-mdxjs-esm: 2.0.1
+ property-information: 7.1.0
+ space-separated-tokens: 2.0.2
+ style-to-js: 1.1.21
+ unist-util-position: 5.0.0
+ vfile-message: 4.0.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /hast-util-to-parse5@6.0.0:
+ resolution: {integrity: sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==, tarball: https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz}
+ dependencies:
+ hast-to-hyperscript: 9.0.1
+ property-information: 5.6.0
+ web-namespaces: 1.1.4
+ xtend: 4.0.2
+ zwitch: 1.0.5
+ dev: false
+
+ /hast-util-to-string@3.0.1:
+ resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==, tarball: https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz}
+ dependencies:
+ '@types/hast': 3.0.4
+ dev: false
+
+ /hast-util-whitespace@3.0.0:
+ resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==, tarball: https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz}
+ dependencies:
+ '@types/hast': 3.0.4
+ dev: false
+
+ /hast@1.0.0:
+ resolution: {integrity: sha512-vFUqlRV5C+xqP76Wwq2SrM0kipnmpxJm7OfvVXpB35Fp+Fn4MV+ozr+JZr5qFvyR1q/U+Foim2x+3P+x9S1PLA==, tarball: https://registry.npmjs.org/hast/-/hast-1.0.0.tgz}
+ deprecated: Renamed to rehype
+ dev: false
+
+ /hastscript@6.0.0:
+ resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==, tarball: https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz}
+ dependencies:
+ '@types/hast': 2.3.10
+ comma-separated-tokens: 1.0.8
+ hast-util-parse-selector: 2.2.5
+ property-information: 5.6.0
+ space-separated-tokens: 1.1.5
+ dev: false
+
+ /hermes-estree@0.25.1:
+ resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==, tarball: https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz}
+ dev: true
+
+ /hermes-parser@0.25.1:
+ resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==, tarball: https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz}
+ dependencies:
+ hermes-estree: 0.25.1
+ dev: true
+
+ /html-void-elements@1.0.5:
+ resolution: {integrity: sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==, tarball: https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz}
+ dev: false
+
+ /html-void-elements@3.0.0:
+ resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==, tarball: https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz}
+ dev: false
+
+ /ignore@5.3.2:
+ resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==, tarball: https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz}
+ engines: {node: '>= 4'}
+ dev: true
+
+ /ignore@7.0.5:
+ resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==, tarball: https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz}
+ engines: {node: '>= 4'}
+ dev: true
+
+ /image-size@2.0.2:
+ resolution: {integrity: sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==, tarball: https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz}
+ engines: {node: '>=16.x'}
+ hasBin: true
+ dev: false
+
+ /import-fresh@3.3.1:
+ resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==, tarball: https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz}
+ engines: {node: '>=6'}
+ dependencies:
+ parent-module: 1.0.1
+ resolve-from: 4.0.0
+ dev: true
+
+ /imurmurhash@0.1.4:
+ resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, tarball: https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz}
+ engines: {node: '>=0.8.19'}
+ dev: true
+
+ /inherits@2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, tarball: https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz}
+ dev: false
+
+ /inline-style-parser@0.1.1:
+ resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==, tarball: https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz}
+ dev: false
+
+ /inline-style-parser@0.2.7:
+ resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==, tarball: https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz}
+ dev: false
+
+ /internal-slot@1.1.0:
+ resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==, tarball: https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ es-errors: 1.3.0
+ hasown: 2.0.2
+ side-channel: 1.1.0
+ dev: true
+
+ /is-alphabetical@1.0.4:
+ resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==, tarball: https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz}
+ dev: false
+
+ /is-alphabetical@2.0.1:
+ resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==, tarball: https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz}
+
+ /is-alphanumerical@1.0.4:
+ resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==, tarball: https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz}
+ dependencies:
+ is-alphabetical: 1.0.4
+ is-decimal: 1.0.4
+ dev: false
+
+ /is-alphanumerical@2.0.1:
+ resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==, tarball: https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz}
+ dependencies:
+ is-alphabetical: 2.0.1
+ is-decimal: 2.0.1
+
+ /is-array-buffer@3.0.5:
+ resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==, tarball: https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
+ dev: true
+
+ /is-async-function@2.1.1:
+ resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==, tarball: https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ async-function: 1.0.0
+ call-bound: 1.0.4
+ get-proto: 1.0.1
+ has-tostringtag: 1.0.2
+ safe-regex-test: 1.1.0
+ dev: true
+
+ /is-bigint@1.1.0:
+ resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==, tarball: https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-bigints: 1.1.0
+ dev: true
+
+ /is-boolean-object@1.2.2:
+ resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==, tarball: https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
+ dev: true
+
+ /is-buffer@2.0.5:
+ resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==, tarball: https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz}
+ engines: {node: '>=4'}
+ dev: false
+
+ /is-bun-module@2.0.0:
+ resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==, tarball: https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz}
+ dependencies:
+ semver: 7.7.3
+ dev: true
+
+ /is-callable@1.2.7:
+ resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==, tarball: https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /is-core-module@2.16.1:
+ resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==, tarball: https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ hasown: 2.0.2
+
+ /is-data-view@1.0.2:
+ resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==, tarball: https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
+ is-typed-array: 1.1.15
+ dev: true
+
+ /is-date-object@1.1.0:
+ resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==, tarball: https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
+ dev: true
+
+ /is-decimal@1.0.4:
+ resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==, tarball: https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz}
+ dev: false
+
+ /is-decimal@2.0.1:
+ resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==, tarball: https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz}
+
+ /is-extendable@0.1.1:
+ resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==, tarball: https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /is-extglob@2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, tarball: https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /is-finalizationregistry@1.1.1:
+ resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==, tarball: https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ dev: true
+
+ /is-generator-function@1.1.2:
+ resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==, tarball: https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ generator-function: 2.0.1
+ get-proto: 1.0.1
+ has-tostringtag: 1.0.2
+ safe-regex-test: 1.1.0
+ dev: true
+
+ /is-glob@4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, tarball: https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-extglob: 2.1.1
+ dev: true
+
+ /is-hexadecimal@1.0.4:
+ resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==, tarball: https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz}
+ dev: false
+
+ /is-hexadecimal@2.0.1:
+ resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==, tarball: https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz}
+
+ /is-map@2.0.3:
+ resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==, tarball: https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /is-negative-zero@2.0.3:
+ resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==, tarball: https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /is-number-object@1.1.1:
+ resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==, tarball: https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
+ dev: true
+
+ /is-number@7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, tarball: https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz}
+ engines: {node: '>=0.12.0'}
+ dev: true
+
+ /is-plain-obj@2.1.0:
+ resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==, tarball: https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz}
+ engines: {node: '>=8'}
+ dev: false
+
+ /is-plain-obj@4.1.0:
+ resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==, tarball: https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz}
+ engines: {node: '>=12'}
+
+ /is-regex@1.2.1:
+ resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==, tarball: https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ gopd: 1.2.0
+ has-tostringtag: 1.0.2
+ hasown: 2.0.2
+ dev: true
+
+ /is-set@2.0.3:
+ resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==, tarball: https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /is-shared-array-buffer@1.0.4:
+ resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==, tarball: https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ dev: true
+
+ /is-string@1.1.1:
+ resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==, tarball: https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ has-tostringtag: 1.0.2
+ dev: true
+
+ /is-symbol@1.1.1:
+ resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==, tarball: https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ has-symbols: 1.1.0
+ safe-regex-test: 1.1.0
+ dev: true
+
+ /is-typed-array@1.1.15:
+ resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==, tarball: https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ which-typed-array: 1.1.19
+ dev: true
+
+ /is-weakmap@2.0.2:
+ resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==, tarball: https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /is-weakref@1.1.1:
+ resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==, tarball: https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ dev: true
+
+ /is-weakset@2.0.4:
+ resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==, tarball: https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
+ dev: true
+
+ /is-whitespace-character@1.0.4:
+ resolution: {integrity: sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==, tarball: https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz}
+ dev: false
+
+ /is-word-character@1.0.4:
+ resolution: {integrity: sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==, tarball: https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz}
+ dev: false
+
+ /isarray@2.0.5:
+ resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==, tarball: https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz}
+ dev: true
+
+ /isexe@2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, tarball: https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz}
+ dev: true
+
+ /iterator.prototype@1.1.5:
+ resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==, tarball: https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ define-data-property: 1.1.4
+ es-object-atoms: 1.1.1
+ get-intrinsic: 1.3.0
+ get-proto: 1.0.1
+ has-symbols: 1.1.0
+ set-function-name: 2.0.2
+ dev: true
+
+ /jiti@2.6.1:
+ resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==, tarball: https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz}
+ hasBin: true
+ dev: true
+
+ /js-tokens@4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, tarball: https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz}
+
+ /js-yaml@3.14.2:
+ resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==, tarball: https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz}
+ hasBin: true
+ dependencies:
+ argparse: 1.0.10
+ esprima: 4.0.1
+ dev: true
+
+ /js-yaml@4.1.1:
+ resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==, tarball: https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz}
+ hasBin: true
+ dependencies:
+ argparse: 2.0.1
+
+ /jsesc@3.1.0:
+ resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==, tarball: https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ /json-buffer@3.0.1:
+ resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, tarball: https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz}
+ dev: true
+
+ /json-schema-traverse@0.4.1:
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, tarball: https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz}
+ dev: true
+
+ /json-schema@0.4.0:
+ resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==, tarball: https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz}
+ dev: false
+
+ /json-stable-stringify-without-jsonify@1.0.1:
+ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, tarball: https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz}
+ dev: true
+
+ /json5@1.0.2:
+ resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==, tarball: https://registry.npmjs.org/json5/-/json5-1.0.2.tgz}
+ hasBin: true
+ dependencies:
+ minimist: 1.2.8
+ dev: true
+
+ /json5@2.2.3:
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, tarball: https://registry.npmjs.org/json5/-/json5-2.2.3.tgz}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ /jsx-ast-utils@3.3.5:
+ resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==, tarball: https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz}
+ engines: {node: '>=4.0'}
+ dependencies:
+ array-includes: 3.1.9
+ array.prototype.flat: 1.3.3
+ object.assign: 4.1.7
+ object.values: 1.2.1
+ dev: true
+
+ /keyv@4.5.4:
+ resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, tarball: https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz}
+ dependencies:
+ json-buffer: 3.0.1
+ dev: true
+
+ /kind-of@6.0.3:
+ resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==, tarball: https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /language-subtag-registry@0.3.23:
+ resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==, tarball: https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz}
+ dev: true
+
+ /language-tags@1.0.9:
+ resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==, tarball: https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz}
+ engines: {node: '>=0.10'}
+ dependencies:
+ language-subtag-registry: 0.3.23
+ dev: true
+
+ /levn@0.4.1:
+ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, tarball: https://registry.npmjs.org/levn/-/levn-0.4.1.tgz}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+ dev: true
+
+ /lightningcss-android-arm64@1.30.2:
+ resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==, tarball: https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /lightningcss-darwin-arm64@1.30.2:
+ resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==, tarball: https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /lightningcss-darwin-x64@1.30.2:
+ resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==, tarball: https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /lightningcss-freebsd-x64@1.30.2:
+ resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==, tarball: https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [freebsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /lightningcss-linux-arm-gnueabihf@1.30.2:
+ resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==, tarball: https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /lightningcss-linux-arm64-gnu@1.30.2:
+ resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==, tarball: https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /lightningcss-linux-arm64-musl@1.30.2:
+ resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==, tarball: https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /lightningcss-linux-x64-gnu@1.30.2:
+ resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==, tarball: https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /lightningcss-linux-x64-musl@1.30.2:
+ resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==, tarball: https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /lightningcss-win32-arm64-msvc@1.30.2:
+ resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==, tarball: https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /lightningcss-win32-x64-msvc@1.30.2:
+ resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==, tarball: https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /lightningcss@1.30.2:
+ resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==, tarball: https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz}
+ engines: {node: '>= 12.0.0'}
+ dependencies:
+ detect-libc: 2.1.2
+ optionalDependencies:
+ lightningcss-android-arm64: 1.30.2
+ lightningcss-darwin-arm64: 1.30.2
+ lightningcss-darwin-x64: 1.30.2
+ lightningcss-freebsd-x64: 1.30.2
+ lightningcss-linux-arm-gnueabihf: 1.30.2
+ lightningcss-linux-arm64-gnu: 1.30.2
+ lightningcss-linux-arm64-musl: 1.30.2
+ lightningcss-linux-x64-gnu: 1.30.2
+ lightningcss-linux-x64-musl: 1.30.2
+ lightningcss-win32-arm64-msvc: 1.30.2
+ lightningcss-win32-x64-msvc: 1.30.2
+ dev: true
+
+ /locate-path@6.0.0:
+ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, tarball: https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz}
+ engines: {node: '>=10'}
+ dependencies:
+ p-locate: 5.0.0
+ dev: true
+
+ /lodash.merge@4.6.2:
+ resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, tarball: https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz}
+
+ /lodash.uniq@4.5.0:
+ resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==, tarball: https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz}
+ dev: false
+
+ /lodash@4.17.21:
+ resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, tarball: https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz}
+ dev: false
+
+ /longest-streak@3.1.0:
+ resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==, tarball: https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz}
+
+ /loose-envify@1.4.0:
+ resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==, tarball: https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz}
+ hasBin: true
+ dependencies:
+ js-tokens: 4.0.0
+ dev: true
+
+ /lru-cache@11.2.4:
+ resolution: {integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==, tarball: https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz}
+ engines: {node: 20 || >=22}
+ dev: false
+
+ /lru-cache@5.1.1:
+ resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, tarball: https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz}
+ dependencies:
+ yallist: 3.1.1
+
+ /lucide-react@0.544.0(react@19.2.3):
+ resolution: {integrity: sha512-t5tS44bqd825zAW45UQxpG2CvcC4urOwn2TrwSH8u+MjeE+1NnWl6QqeQ/6NdjMqdOygyiT9p3Ev0p1NJykxjw==, tarball: https://registry.npmjs.org/lucide-react/-/lucide-react-0.544.0.tgz}
+ peerDependencies:
+ react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ dependencies:
+ react: 19.2.3
+ dev: false
+
+ /magic-string@0.30.21:
+ resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==, tarball: https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz}
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+ dev: true
+
+ /markdown-escapes@1.0.4:
+ resolution: {integrity: sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==, tarball: https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz}
+ dev: false
+
+ /markdown-extensions@2.0.0:
+ resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==, tarball: https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz}
+ engines: {node: '>=16'}
+ dev: false
+
+ /markdown-table@3.0.4:
+ resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==, tarball: https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz}
+
+ /math-intrinsics@1.1.0:
+ resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==, tarball: https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /mdast-squeeze-paragraphs@4.0.0:
+ resolution: {integrity: sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==, tarball: https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz}
+ dependencies:
+ unist-util-remove: 2.1.0
+ dev: false
+
+ /mdast-util-definitions@4.0.0:
+ resolution: {integrity: sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==, tarball: https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz}
+ dependencies:
+ unist-util-visit: 2.0.3
+ dev: false
+
+ /mdast-util-find-and-replace@3.0.2:
+ resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==, tarball: https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz}
+ dependencies:
+ '@types/mdast': 4.0.4
+ escape-string-regexp: 5.0.0
+ unist-util-is: 6.0.1
+ unist-util-visit-parents: 6.0.2
+
+ /mdast-util-from-markdown@2.0.2:
+ resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==, tarball: https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz}
+ dependencies:
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ decode-named-character-reference: 1.2.0
+ devlop: 1.1.0
+ mdast-util-to-string: 4.0.0
+ micromark: 4.0.2
+ micromark-util-decode-numeric-character-reference: 2.0.2
+ micromark-util-decode-string: 2.0.1
+ micromark-util-normalize-identifier: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+ unist-util-stringify-position: 4.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ /mdast-util-gfm-autolink-literal@2.0.1:
+ resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==, tarball: https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz}
+ dependencies:
+ '@types/mdast': 4.0.4
+ ccount: 2.0.1
+ devlop: 1.1.0
+ mdast-util-find-and-replace: 3.0.2
+ micromark-util-character: 2.1.1
+
+ /mdast-util-gfm-footnote@2.1.0:
+ resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==, tarball: https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz}
+ dependencies:
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.2
+ micromark-util-normalize-identifier: 2.0.1
+ transitivePeerDependencies:
+ - supports-color
+
+ /mdast-util-gfm-strikethrough@2.0.0:
+ resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==, tarball: https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz}
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ /mdast-util-gfm-table@2.0.0:
+ resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==, tarball: https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz}
+ dependencies:
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ markdown-table: 3.0.4
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ /mdast-util-gfm-task-list-item@2.0.0:
+ resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==, tarball: https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz}
+ dependencies:
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ /mdast-util-gfm@3.1.0:
+ resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==, tarball: https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz}
+ dependencies:
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-gfm-autolink-literal: 2.0.1
+ mdast-util-gfm-footnote: 2.1.0
+ mdast-util-gfm-strikethrough: 2.0.0
+ mdast-util-gfm-table: 2.0.0
+ mdast-util-gfm-task-list-item: 2.0.0
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ /mdast-util-mdx-expression@2.0.1:
+ resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==, tarball: https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz}
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ /mdast-util-mdx-jsx@3.2.0:
+ resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==, tarball: https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz}
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ ccount: 2.0.1
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.2
+ parse-entities: 4.0.2
+ stringify-entities: 4.0.4
+ unist-util-stringify-position: 4.0.0
+ vfile-message: 4.0.3
+ transitivePeerDependencies:
+ - supports-color
+
+ /mdast-util-mdx@3.0.0:
+ resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==, tarball: https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz}
+ dependencies:
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-mdx-expression: 2.0.1
+ mdast-util-mdx-jsx: 3.2.0
+ mdast-util-mdxjs-esm: 2.0.1
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ /mdast-util-mdxjs-esm@2.0.1:
+ resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==, tarball: https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz}
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ /mdast-util-phrasing@4.1.0:
+ resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==, tarball: https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz}
+ dependencies:
+ '@types/mdast': 4.0.4
+ unist-util-is: 6.0.1
+
+ /mdast-util-to-hast@10.0.1:
+ resolution: {integrity: sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==, tarball: https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz}
+ dependencies:
+ '@types/mdast': 3.0.15
+ '@types/unist': 2.0.11
+ mdast-util-definitions: 4.0.0
+ mdurl: 1.0.1
+ unist-builder: 2.0.3
+ unist-util-generated: 1.1.6
+ unist-util-position: 3.1.0
+ unist-util-visit: 2.0.3
+ dev: false
+
+ /mdast-util-to-hast@13.2.1:
+ resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==, tarball: https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz}
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ '@ungap/structured-clone': 1.3.0
+ devlop: 1.1.0
+ micromark-util-sanitize-uri: 2.0.1
+ trim-lines: 3.0.1
+ unist-util-position: 5.0.0
+ unist-util-visit: 5.0.0
+ vfile: 6.0.3
+ dev: false
+
+ /mdast-util-to-markdown@2.1.2:
+ resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==, tarball: https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz}
+ dependencies:
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ longest-streak: 3.1.0
+ mdast-util-phrasing: 4.1.0
+ mdast-util-to-string: 4.0.0
+ micromark-util-classify-character: 2.0.1
+ micromark-util-decode-string: 2.0.1
+ unist-util-visit: 5.0.0
+ zwitch: 2.0.4
+
+ /mdast-util-to-string@4.0.0:
+ resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==, tarball: https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz}
+ dependencies:
+ '@types/mdast': 4.0.4
+
+ /mdurl@1.0.1:
+ resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==, tarball: https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz}
+ dev: false
+
+ /mdx-embed@1.1.2(@mdx-js/mdx@1.6.22)(@mdx-js/react@3.1.1)(react-dom@19.2.3)(react@19.2.3):
+ resolution: {integrity: sha512-AAronHC/sh4py+RhJOuX8+9+lyUbJsmCLquXNPCEHZ0llPWjMuwls77hII/lWI2kwBSPZPahrqti8kGTv1pi1w==, tarball: https://registry.npmjs.org/mdx-embed/-/mdx-embed-1.1.2.tgz}
+ peerDependencies:
+ '@mdx-js/mdx': ^1.6.16
+ '@mdx-js/react': ^1.6.16
+ react: ^16.x || ^17.x || ^18.x
+ react-dom: ^16.x || ^17.x || ^18.x
+ dependencies:
+ '@mdx-js/mdx': 1.6.22
+ '@mdx-js/react': 3.1.1(@types/react@19.2.7)(react@19.2.3)
+ react: 19.2.3
+ react-dom: 19.2.3(react@19.2.3)
+ dev: false
+
+ /merge2@1.4.1:
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, tarball: https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz}
+ engines: {node: '>= 8'}
+ dev: true
+
+ /micromark-core-commonmark@2.0.3:
+ resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==, tarball: https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz}
+ dependencies:
+ decode-named-character-reference: 1.2.0
+ devlop: 1.1.0
+ micromark-factory-destination: 2.0.1
+ micromark-factory-label: 2.0.1
+ micromark-factory-space: 2.0.1
+ micromark-factory-title: 2.0.1
+ micromark-factory-whitespace: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-chunked: 2.0.1
+ micromark-util-classify-character: 2.0.1
+ micromark-util-html-tag-name: 2.0.1
+ micromark-util-normalize-identifier: 2.0.1
+ micromark-util-resolve-all: 2.0.1
+ micromark-util-subtokenize: 2.1.0
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ /micromark-extension-gfm-autolink-literal@2.1.0:
+ resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==, tarball: https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz}
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-sanitize-uri: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ /micromark-extension-gfm-footnote@2.1.0:
+ resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==, tarball: https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz}
+ dependencies:
+ devlop: 1.1.0
+ micromark-core-commonmark: 2.0.3
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-normalize-identifier: 2.0.1
+ micromark-util-sanitize-uri: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ /micromark-extension-gfm-strikethrough@2.1.0:
+ resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==, tarball: https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz}
+ dependencies:
+ devlop: 1.1.0
+ micromark-util-chunked: 2.0.1
+ micromark-util-classify-character: 2.0.1
+ micromark-util-resolve-all: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ /micromark-extension-gfm-table@2.1.1:
+ resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==, tarball: https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz}
+ dependencies:
+ devlop: 1.1.0
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ /micromark-extension-gfm-tagfilter@2.0.0:
+ resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==, tarball: https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz}
+ dependencies:
+ micromark-util-types: 2.0.2
+
+ /micromark-extension-gfm-task-list-item@2.1.0:
+ resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==, tarball: https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz}
+ dependencies:
+ devlop: 1.1.0
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ /micromark-extension-gfm@3.0.0:
+ resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==, tarball: https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz}
+ dependencies:
+ micromark-extension-gfm-autolink-literal: 2.1.0
+ micromark-extension-gfm-footnote: 2.1.0
+ micromark-extension-gfm-strikethrough: 2.1.0
+ micromark-extension-gfm-table: 2.1.1
+ micromark-extension-gfm-tagfilter: 2.0.0
+ micromark-extension-gfm-task-list-item: 2.1.0
+ micromark-util-combine-extensions: 2.0.1
+ micromark-util-types: 2.0.2
+
+ /micromark-extension-mdx-expression@3.0.1:
+ resolution: {integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==, tarball: https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz}
+ dependencies:
+ '@types/estree': 1.0.8
+ devlop: 1.1.0
+ micromark-factory-mdx-expression: 2.0.3
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-events-to-acorn: 2.0.3
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ /micromark-extension-mdx-jsx@3.0.2:
+ resolution: {integrity: sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==, tarball: https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz}
+ dependencies:
+ '@types/estree': 1.0.8
+ devlop: 1.1.0
+ estree-util-is-identifier-name: 3.0.0
+ micromark-factory-mdx-expression: 2.0.3
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-events-to-acorn: 2.0.3
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+ vfile-message: 4.0.3
+
+ /micromark-extension-mdx-md@2.0.0:
+ resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==, tarball: https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz}
+ dependencies:
+ micromark-util-types: 2.0.2
+
+ /micromark-extension-mdxjs-esm@3.0.0:
+ resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==, tarball: https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz}
+ dependencies:
+ '@types/estree': 1.0.8
+ devlop: 1.1.0
+ micromark-core-commonmark: 2.0.3
+ micromark-util-character: 2.1.1
+ micromark-util-events-to-acorn: 2.0.3
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+ unist-util-position-from-estree: 2.0.0
+ vfile-message: 4.0.3
+
+ /micromark-extension-mdxjs@3.0.0:
+ resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==, tarball: https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz}
+ dependencies:
+ acorn: 8.15.0
+ acorn-jsx: 5.3.2(acorn@8.15.0)
+ micromark-extension-mdx-expression: 3.0.1
+ micromark-extension-mdx-jsx: 3.0.2
+ micromark-extension-mdx-md: 2.0.0
+ micromark-extension-mdxjs-esm: 3.0.0
+ micromark-util-combine-extensions: 2.0.1
+ micromark-util-types: 2.0.2
+
+ /micromark-factory-destination@2.0.1:
+ resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==, tarball: https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz}
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ /micromark-factory-label@2.0.1:
+ resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==, tarball: https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz}
+ dependencies:
+ devlop: 1.1.0
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ /micromark-factory-mdx-expression@2.0.3:
+ resolution: {integrity: sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==, tarball: https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz}
+ dependencies:
+ '@types/estree': 1.0.8
+ devlop: 1.1.0
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-events-to-acorn: 2.0.3
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+ unist-util-position-from-estree: 2.0.0
+ vfile-message: 4.0.3
+
+ /micromark-factory-space@2.0.1:
+ resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==, tarball: https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz}
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-types: 2.0.2
+
+ /micromark-factory-title@2.0.1:
+ resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==, tarball: https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz}
+ dependencies:
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ /micromark-factory-whitespace@2.0.1:
+ resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==, tarball: https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz}
+ dependencies:
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ /micromark-util-character@2.1.1:
+ resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==, tarball: https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz}
+ dependencies:
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ /micromark-util-chunked@2.0.1:
+ resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==, tarball: https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz}
+ dependencies:
+ micromark-util-symbol: 2.0.1
+
+ /micromark-util-classify-character@2.0.1:
+ resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==, tarball: https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz}
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ /micromark-util-combine-extensions@2.0.1:
+ resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==, tarball: https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz}
+ dependencies:
+ micromark-util-chunked: 2.0.1
+ micromark-util-types: 2.0.2
+
+ /micromark-util-decode-numeric-character-reference@2.0.2:
+ resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==, tarball: https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz}
+ dependencies:
+ micromark-util-symbol: 2.0.1
+
+ /micromark-util-decode-string@2.0.1:
+ resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==, tarball: https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz}
+ dependencies:
+ decode-named-character-reference: 1.2.0
+ micromark-util-character: 2.1.1
+ micromark-util-decode-numeric-character-reference: 2.0.2
+ micromark-util-symbol: 2.0.1
+
+ /micromark-util-encode@2.0.1:
+ resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==, tarball: https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz}
+
+ /micromark-util-events-to-acorn@2.0.3:
+ resolution: {integrity: sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==, tarball: https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz}
+ dependencies:
+ '@types/estree': 1.0.8
+ '@types/unist': 3.0.3
+ devlop: 1.1.0
+ estree-util-visit: 2.0.0
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+ vfile-message: 4.0.3
+
+ /micromark-util-html-tag-name@2.0.1:
+ resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==, tarball: https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz}
+
+ /micromark-util-normalize-identifier@2.0.1:
+ resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==, tarball: https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz}
+ dependencies:
+ micromark-util-symbol: 2.0.1
+
+ /micromark-util-resolve-all@2.0.1:
+ resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==, tarball: https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz}
+ dependencies:
+ micromark-util-types: 2.0.2
+
+ /micromark-util-sanitize-uri@2.0.1:
+ resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==, tarball: https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz}
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-encode: 2.0.1
+ micromark-util-symbol: 2.0.1
+
+ /micromark-util-subtokenize@2.1.0:
+ resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==, tarball: https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz}
+ dependencies:
+ devlop: 1.1.0
+ micromark-util-chunked: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ /micromark-util-symbol@2.0.1:
+ resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==, tarball: https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz}
+
+ /micromark-util-types@2.0.2:
+ resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==, tarball: https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz}
+
+ /micromark@4.0.2:
+ resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==, tarball: https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz}
+ dependencies:
+ '@types/debug': 4.1.12
+ debug: 4.4.3
+ decode-named-character-reference: 1.2.0
+ devlop: 1.1.0
+ micromark-core-commonmark: 2.0.3
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-chunked: 2.0.1
+ micromark-util-combine-extensions: 2.0.1
+ micromark-util-decode-numeric-character-reference: 2.0.2
+ micromark-util-encode: 2.0.1
+ micromark-util-normalize-identifier: 2.0.1
+ micromark-util-resolve-all: 2.0.1
+ micromark-util-sanitize-uri: 2.0.1
+ micromark-util-subtokenize: 2.1.0
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ /micromatch@4.0.8:
+ resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==, tarball: https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz}
+ engines: {node: '>=8.6'}
+ dependencies:
+ braces: 3.0.3
+ picomatch: 2.3.1
+ dev: true
+
+ /minimatch@3.1.2:
+ resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, tarball: https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz}
+ dependencies:
+ brace-expansion: 1.1.12
+ dev: true
+
+ /minimatch@9.0.5:
+ resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==, tarball: https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz}
+ engines: {node: '>=16 || 14 >=14.17'}
+ dependencies:
+ brace-expansion: 2.0.2
+ dev: true
+
+ /minimist@1.2.8:
+ resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, tarball: https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz}
+ dev: true
+
+ /ms@2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, tarball: https://registry.npmjs.org/ms/-/ms-2.1.3.tgz}
+
+ /nanoid@3.3.11:
+ resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==, tarball: https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ /napi-postinstall@0.3.4:
+ resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==, tarball: https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz}
+ engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
+ hasBin: true
+ dev: true
+
+ /natural-compare@1.4.0:
+ resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, tarball: https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz}
+ dev: true
+
+ /negotiator@1.0.0:
+ resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==, tarball: https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz}
+ engines: {node: '>= 0.6'}
+ dev: false
+
+ /next-themes@0.4.6(react-dom@19.2.3)(react@19.2.3):
+ resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==, tarball: https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz}
+ peerDependencies:
+ react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc
+ dependencies:
+ react: 19.2.3
+ react-dom: 19.2.3(react@19.2.3)
+ dev: false
+
+ /next-validate-link@1.6.3:
+ resolution: {integrity: sha512-batZxYlkQQSa8jl0gi1AQd5BlJDY3FG41yecpvBWVIM1t/FnBmbo3cMZZx8sSt4UdrsbLuRE2P3p5s+TsQ8m1A==, tarball: https://registry.npmjs.org/next-validate-link/-/next-validate-link-1.6.3.tgz}
+ dependencies:
+ gray-matter: 4.0.3
+ picocolors: 1.1.1
+ remark: 15.0.1
+ remark-gfm: 4.0.1
+ remark-mdx: 3.1.1
+ tinyglobby: 0.2.15
+ unist-util-visit: 5.0.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /next@16.1.0(@babel/core@7.28.5)(react-dom@19.2.3)(react@19.2.3):
+ resolution: {integrity: sha512-Y+KbmDbefYtHDDQKLNrmzE/YYzG2msqo2VXhzh5yrJ54tx/6TmGdkR5+kP9ma7i7LwZpZMfoY3m/AoPPPKxtVw==, tarball: https://registry.npmjs.org/next/-/next-16.1.0.tgz}
+ engines: {node: '>=20.9.0'}
+ hasBin: true
+ peerDependencies:
+ '@opentelemetry/api': ^1.1.0
+ '@playwright/test': ^1.51.1
+ babel-plugin-react-compiler: '*'
+ react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
+ react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
+ sass: ^1.3.0
+ peerDependenciesMeta:
+ '@opentelemetry/api':
+ optional: true
+ '@playwright/test':
+ optional: true
+ babel-plugin-react-compiler:
+ optional: true
+ sass:
+ optional: true
+ dependencies:
+ '@next/env': 16.1.0
+ '@swc/helpers': 0.5.15
+ baseline-browser-mapping: 2.9.11
+ caniuse-lite: 1.0.30001761
+ postcss: 8.4.31
+ react: 19.2.3
+ react-dom: 19.2.3(react@19.2.3)
+ styled-jsx: 5.1.6(@babel/core@7.28.5)(react@19.2.3)
+ optionalDependencies:
+ '@next/swc-darwin-arm64': 16.1.0
+ '@next/swc-darwin-x64': 16.1.0
+ '@next/swc-linux-arm64-gnu': 16.1.0
+ '@next/swc-linux-arm64-musl': 16.1.0
+ '@next/swc-linux-x64-gnu': 16.1.0
+ '@next/swc-linux-x64-musl': 16.1.0
+ '@next/swc-win32-arm64-msvc': 16.1.0
+ '@next/swc-win32-x64-msvc': 16.1.0
+ sharp: 0.34.5
+ transitivePeerDependencies:
+ - '@babel/core'
+ - babel-plugin-macros
+ dev: false
+
+ /node-releases@2.0.27:
+ resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==, tarball: https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz}
+
+ /npm-to-yarn@3.0.1:
+ resolution: {integrity: sha512-tt6PvKu4WyzPwWUzy/hvPFqn+uwXO0K1ZHka8az3NnrhWJDmSqI8ncWq0fkL0k/lmmi5tAC11FXwXuh0rFbt1A==, tarball: https://registry.npmjs.org/npm-to-yarn/-/npm-to-yarn-3.0.1.tgz}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dev: false
+
+ /object-assign@4.1.1:
+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==, tarball: https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /object-inspect@1.13.4:
+ resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==, tarball: https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /object-keys@1.1.1:
+ resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==, tarball: https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /object.assign@4.1.7:
+ resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==, tarball: https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.1
+ has-symbols: 1.1.0
+ object-keys: 1.1.1
+ dev: true
+
+ /object.entries@1.1.9:
+ resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==, tarball: https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.1
+ dev: true
+
+ /object.fromentries@2.0.8:
+ resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==, tarball: https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.1
+ es-object-atoms: 1.1.1
+ dev: true
+
+ /object.groupby@1.0.3:
+ resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==, tarball: https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.1
+ dev: true
+
+ /object.values@1.2.1:
+ resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==, tarball: https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.1
+ dev: true
+
+ /oniguruma-parser@0.12.1:
+ resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==, tarball: https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz}
+ dev: false
+
+ /oniguruma-to-es@4.3.4:
+ resolution: {integrity: sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==, tarball: https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.4.tgz}
+ dependencies:
+ oniguruma-parser: 0.12.1
+ regex: 6.1.0
+ regex-recursion: 6.0.2
+ dev: false
+
+ /optionator@0.9.4:
+ resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==, tarball: https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ deep-is: 0.1.4
+ fast-levenshtein: 2.0.6
+ levn: 0.4.1
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+ word-wrap: 1.2.5
+ dev: true
+
+ /own-keys@1.0.1:
+ resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==, tarball: https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ get-intrinsic: 1.3.0
+ object-keys: 1.1.1
+ safe-push-apply: 1.0.0
+ dev: true
+
+ /p-limit@3.1.0:
+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, tarball: https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz}
+ engines: {node: '>=10'}
+ dependencies:
+ yocto-queue: 0.1.0
+ dev: true
+
+ /p-locate@5.0.0:
+ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, tarball: https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz}
+ engines: {node: '>=10'}
+ dependencies:
+ p-limit: 3.1.0
+ dev: true
+
+ /parent-module@1.0.1:
+ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, tarball: https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz}
+ engines: {node: '>=6'}
+ dependencies:
+ callsites: 3.1.0
+ dev: true
+
+ /parse-entities@2.0.0:
+ resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==, tarball: https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz}
+ dependencies:
+ character-entities: 1.2.4
+ character-entities-legacy: 1.1.4
+ character-reference-invalid: 1.1.4
+ is-alphanumerical: 1.0.4
+ is-decimal: 1.0.4
+ is-hexadecimal: 1.0.4
+ dev: false
+
+ /parse-entities@4.0.2:
+ resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==, tarball: https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz}
+ dependencies:
+ '@types/unist': 2.0.11
+ character-entities-legacy: 3.0.0
+ character-reference-invalid: 2.0.1
+ decode-named-character-reference: 1.2.0
+ is-alphanumerical: 2.0.1
+ is-decimal: 2.0.1
+ is-hexadecimal: 2.0.1
+
+ /parse5@6.0.1:
+ resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==, tarball: https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz}
+ dev: false
+
+ /path-exists@4.0.0:
+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, tarball: https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz}
+ engines: {node: '>=8'}
+ dev: true
+
+ /path-key@3.1.1:
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, tarball: https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz}
+ engines: {node: '>=8'}
+ dev: true
+
+ /path-parse@1.0.7:
+ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, tarball: https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz}
+
+ /path-to-regexp@8.3.0:
+ resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==, tarball: https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz}
+ dev: false
+
+ /picocolors@1.1.1:
+ resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==, tarball: https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz}
+
+ /picomatch@2.3.1:
+ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, tarball: https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz}
+ engines: {node: '>=8.6'}
+ dev: true
+
+ /picomatch@4.0.3:
+ resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==, tarball: https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz}
+ engines: {node: '>=12'}
+
+ /possible-typed-array-names@1.1.0:
+ resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==, tarball: https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /postcss-selector-parser@7.1.1:
+ resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==, tarball: https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz}
+ engines: {node: '>=4'}
+ dependencies:
+ cssesc: 3.0.0
+ util-deprecate: 1.0.2
+ dev: false
+
+ /postcss@8.4.31:
+ resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==, tarball: https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz}
+ engines: {node: ^10 || ^12 || >=14}
+ dependencies:
+ nanoid: 3.3.11
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+ dev: false
+
+ /postcss@8.5.6:
+ resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==, tarball: https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz}
+ engines: {node: ^10 || ^12 || >=14}
+ dependencies:
+ nanoid: 3.3.11
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+ dev: true
+
+ /prelude-ls@1.2.1:
+ resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, tarball: https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz}
+ engines: {node: '>= 0.8.0'}
+ dev: true
+
+ /prop-types@15.8.1:
+ resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==, tarball: https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz}
+ dependencies:
+ loose-envify: 1.4.0
+ object-assign: 4.1.1
+ react-is: 16.13.1
+ dev: true
+
+ /property-information@5.6.0:
+ resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==, tarball: https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz}
+ dependencies:
+ xtend: 4.0.2
+ dev: false
+
+ /property-information@7.1.0:
+ resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==, tarball: https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz}
+ dev: false
+
+ /punycode@2.3.1:
+ resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, tarball: https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz}
+ engines: {node: '>=6'}
+ dev: true
+
+ /queue-microtask@1.2.3:
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, tarball: https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz}
+ dev: true
+
+ /react-dom@19.2.3(react@19.2.3):
+ resolution: {integrity: sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==, tarball: https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz}
+ peerDependencies:
+ react: ^19.2.3
+ dependencies:
+ react: 19.2.3
+ scheduler: 0.27.0
+ dev: false
+
+ /react-is@16.13.1:
+ resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==, tarball: https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz}
+ dev: true
+
+ /react-medium-image-zoom@5.4.0(react-dom@19.2.3)(react@19.2.3):
+ resolution: {integrity: sha512-BsE+EnFVQzFIlyuuQrZ9iTwyKpKkqdFZV1ImEQN573QPqGrIUuNni7aF+sZwDcxlsuOMayCr6oO/PZR/yJnbRg==, tarball: https://registry.npmjs.org/react-medium-image-zoom/-/react-medium-image-zoom-5.4.0.tgz}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ dependencies:
+ react: 19.2.3
+ react-dom: 19.2.3(react@19.2.3)
+ dev: false
+
+ /react-remove-scroll-bar@2.3.8(@types/react@19.2.7)(react@19.2.3):
+ resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==, tarball: https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@types/react': 19.2.7
+ react: 19.2.3
+ react-style-singleton: 2.2.3(@types/react@19.2.7)(react@19.2.3)
+ tslib: 2.8.1
+ dev: false
+
+ /react-remove-scroll@2.7.2(@types/react@19.2.7)(react@19.2.3):
+ resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==, tarball: https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@types/react': 19.2.7
+ react: 19.2.3
+ react-remove-scroll-bar: 2.3.8(@types/react@19.2.7)(react@19.2.3)
+ react-style-singleton: 2.2.3(@types/react@19.2.7)(react@19.2.3)
+ tslib: 2.8.1
+ use-callback-ref: 1.3.3(@types/react@19.2.7)(react@19.2.3)
+ use-sidecar: 1.1.3(@types/react@19.2.7)(react@19.2.3)
+ dev: false
+
+ /react-style-singleton@2.2.3(@types/react@19.2.7)(react@19.2.3):
+ resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==, tarball: https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@types/react': 19.2.7
+ get-nonce: 1.0.1
+ react: 19.2.3
+ tslib: 2.8.1
+ dev: false
+
+ /react@19.2.3:
+ resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==, tarball: https://registry.npmjs.org/react/-/react-19.2.3.tgz}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /readdirp@4.1.2:
+ resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==, tarball: https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz}
+ engines: {node: '>= 14.18.0'}
+ dev: false
+
+ /recma-build-jsx@1.0.0:
+ resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==, tarball: https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz}
+ dependencies:
+ '@types/estree': 1.0.8
+ estree-util-build-jsx: 3.0.1
+ vfile: 6.0.3
+ dev: false
+
+ /recma-jsx@1.0.1(acorn@8.15.0):
+ resolution: {integrity: sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==, tarball: https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+ dependencies:
+ acorn: 8.15.0
+ acorn-jsx: 5.3.2(acorn@8.15.0)
+ estree-util-to-js: 2.0.0
+ recma-parse: 1.0.0
+ recma-stringify: 1.0.0
+ unified: 11.0.5
+ dev: false
+
+ /recma-parse@1.0.0:
+ resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==, tarball: https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz}
+ dependencies:
+ '@types/estree': 1.0.8
+ esast-util-from-js: 2.0.1
+ unified: 11.0.5
+ vfile: 6.0.3
+ dev: false
+
+ /recma-stringify@1.0.0:
+ resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==, tarball: https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz}
+ dependencies:
+ '@types/estree': 1.0.8
+ estree-util-to-js: 2.0.0
+ unified: 11.0.5
+ vfile: 6.0.3
+ dev: false
+
+ /reflect.getprototypeof@1.0.10:
+ resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==, tarball: https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ get-intrinsic: 1.3.0
+ get-proto: 1.0.1
+ which-builtin-type: 1.2.1
+ dev: true
+
+ /regex-recursion@6.0.2:
+ resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==, tarball: https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz}
+ dependencies:
+ regex-utilities: 2.3.0
+ dev: false
+
+ /regex-utilities@2.3.0:
+ resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==, tarball: https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz}
+ dev: false
+
+ /regex@6.1.0:
+ resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==, tarball: https://registry.npmjs.org/regex/-/regex-6.1.0.tgz}
+ dependencies:
+ regex-utilities: 2.3.0
+ dev: false
+
+ /regexp.prototype.flags@1.5.4:
+ resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==, tarball: https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-errors: 1.3.0
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ set-function-name: 2.0.2
+ dev: true
+
+ /rehype-recma@1.0.0:
+ resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==, tarball: https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz}
+ dependencies:
+ '@types/estree': 1.0.8
+ '@types/hast': 3.0.4
+ hast-util-to-estree: 3.1.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /remark-footnotes@2.0.0:
+ resolution: {integrity: sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==, tarball: https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz}
+ dev: false
+
+ /remark-gfm@4.0.1:
+ resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==, tarball: https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz}
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-gfm: 3.1.0
+ micromark-extension-gfm: 3.0.0
+ remark-parse: 11.0.0
+ remark-stringify: 11.0.0
+ unified: 11.0.5
+ transitivePeerDependencies:
+ - supports-color
+
+ /remark-mdx@1.6.22:
+ resolution: {integrity: sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==, tarball: https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz}
+ dependencies:
+ '@babel/core': 7.12.9
+ '@babel/helper-plugin-utils': 7.10.4
+ '@babel/plugin-proposal-object-rest-spread': 7.12.1(@babel/core@7.12.9)
+ '@babel/plugin-syntax-jsx': 7.12.1(@babel/core@7.12.9)
+ '@mdx-js/util': 1.6.22
+ is-alphabetical: 1.0.4
+ remark-parse: 8.0.3
+ unified: 9.2.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /remark-mdx@3.1.1:
+ resolution: {integrity: sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==, tarball: https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz}
+ dependencies:
+ mdast-util-mdx: 3.0.0
+ micromark-extension-mdxjs: 3.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ /remark-parse@11.0.0:
+ resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==, tarball: https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz}
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-from-markdown: 2.0.2
+ micromark-util-types: 2.0.2
+ unified: 11.0.5
+ transitivePeerDependencies:
+ - supports-color
+
+ /remark-parse@8.0.3:
+ resolution: {integrity: sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==, tarball: https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz}
+ dependencies:
+ ccount: 1.1.0
+ collapse-white-space: 1.0.6
+ is-alphabetical: 1.0.4
+ is-decimal: 1.0.4
+ is-whitespace-character: 1.0.4
+ is-word-character: 1.0.4
+ markdown-escapes: 1.0.4
+ parse-entities: 2.0.0
+ repeat-string: 1.6.1
+ state-toggle: 1.0.3
+ trim: 0.0.1
+ trim-trailing-lines: 1.1.4
+ unherit: 1.1.3
+ unist-util-remove-position: 2.0.1
+ vfile-location: 3.2.0
+ xtend: 4.0.2
+ dev: false
+
+ /remark-rehype@11.1.2:
+ resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==, tarball: https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz}
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ mdast-util-to-hast: 13.2.1
+ unified: 11.0.5
+ vfile: 6.0.3
+ dev: false
+
+ /remark-squeeze-paragraphs@4.0.0:
+ resolution: {integrity: sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==, tarball: https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz}
+ dependencies:
+ mdast-squeeze-paragraphs: 4.0.0
+ dev: false
+
+ /remark-stringify@11.0.0:
+ resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==, tarball: https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz}
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-to-markdown: 2.1.2
+ unified: 11.0.5
+
+ /remark@15.0.1:
+ resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==, tarball: https://registry.npmjs.org/remark/-/remark-15.0.1.tgz}
+ dependencies:
+ '@types/mdast': 4.0.4
+ remark-parse: 11.0.0
+ remark-stringify: 11.0.0
+ unified: 11.0.5
+ transitivePeerDependencies:
+ - supports-color
+
+ /repeat-string@1.6.1:
+ resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==, tarball: https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz}
+ engines: {node: '>=0.10'}
+ dev: false
+
+ /resolve-from@4.0.0:
+ resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, tarball: https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz}
+ engines: {node: '>=4'}
+ dev: true
+
+ /resolve-pkg-maps@1.0.0:
+ resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==, tarball: https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz}
+ dev: true
+
+ /resolve@1.22.11:
+ resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==, tarball: https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz}
+ engines: {node: '>= 0.4'}
+ hasBin: true
+ dependencies:
+ is-core-module: 2.16.1
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+
+ /resolve@2.0.0-next.5:
+ resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==, tarball: https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz}
+ hasBin: true
+ dependencies:
+ is-core-module: 2.16.1
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+ dev: true
+
+ /reusify@1.1.0:
+ resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==, tarball: https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+ dev: true
+
+ /run-parallel@1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, tarball: https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz}
+ dependencies:
+ queue-microtask: 1.2.3
+ dev: true
+
+ /safe-array-concat@1.1.3:
+ resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==, tarball: https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz}
+ engines: {node: '>=0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ get-intrinsic: 1.3.0
+ has-symbols: 1.1.0
+ isarray: 2.0.5
+ dev: true
+
+ /safe-push-apply@1.0.0:
+ resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==, tarball: https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ es-errors: 1.3.0
+ isarray: 2.0.5
+ dev: true
+
+ /safe-regex-test@1.1.0:
+ resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==, tarball: https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-regex: 1.2.1
+ dev: true
+
+ /scheduler@0.27.0:
+ resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==, tarball: https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz}
+ dev: false
+
+ /scroll-into-view-if-needed@3.1.0:
+ resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==, tarball: https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz}
+ dependencies:
+ compute-scroll-into-view: 3.1.1
+ dev: false
+
+ /section-matter@1.0.0:
+ resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==, tarball: https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz}
+ engines: {node: '>=4'}
+ dependencies:
+ extend-shallow: 2.0.1
+ kind-of: 6.0.3
+ dev: true
+
+ /semver@5.7.2:
+ resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==, tarball: https://registry.npmjs.org/semver/-/semver-5.7.2.tgz}
+ hasBin: true
+ dev: false
+
+ /semver@6.3.1:
+ resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, tarball: https://registry.npmjs.org/semver/-/semver-6.3.1.tgz}
+ hasBin: true
+
+ /semver@7.7.3:
+ resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==, tarball: https://registry.npmjs.org/semver/-/semver-7.7.3.tgz}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ /set-function-length@1.2.2:
+ resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==, tarball: https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ define-data-property: 1.1.4
+ es-errors: 1.3.0
+ function-bind: 1.1.2
+ get-intrinsic: 1.3.0
+ gopd: 1.2.0
+ has-property-descriptors: 1.0.2
+ dev: true
+
+ /set-function-name@2.0.2:
+ resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==, tarball: https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ define-data-property: 1.1.4
+ es-errors: 1.3.0
+ functions-have-names: 1.2.3
+ has-property-descriptors: 1.0.2
+ dev: true
+
+ /set-proto@1.0.0:
+ resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==, tarball: https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ dunder-proto: 1.0.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ dev: true
+
+ /sharp@0.34.5:
+ resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==, tarball: https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ requiresBuild: true
+ dependencies:
+ '@img/colour': 1.0.0
+ detect-libc: 2.1.2
+ semver: 7.7.3
+ optionalDependencies:
+ '@img/sharp-darwin-arm64': 0.34.5
+ '@img/sharp-darwin-x64': 0.34.5
+ '@img/sharp-libvips-darwin-arm64': 1.2.4
+ '@img/sharp-libvips-darwin-x64': 1.2.4
+ '@img/sharp-libvips-linux-arm': 1.2.4
+ '@img/sharp-libvips-linux-arm64': 1.2.4
+ '@img/sharp-libvips-linux-ppc64': 1.2.4
+ '@img/sharp-libvips-linux-riscv64': 1.2.4
+ '@img/sharp-libvips-linux-s390x': 1.2.4
+ '@img/sharp-libvips-linux-x64': 1.2.4
+ '@img/sharp-libvips-linuxmusl-arm64': 1.2.4
+ '@img/sharp-libvips-linuxmusl-x64': 1.2.4
+ '@img/sharp-linux-arm': 0.34.5
+ '@img/sharp-linux-arm64': 0.34.5
+ '@img/sharp-linux-ppc64': 0.34.5
+ '@img/sharp-linux-riscv64': 0.34.5
+ '@img/sharp-linux-s390x': 0.34.5
+ '@img/sharp-linux-x64': 0.34.5
+ '@img/sharp-linuxmusl-arm64': 0.34.5
+ '@img/sharp-linuxmusl-x64': 0.34.5
+ '@img/sharp-wasm32': 0.34.5
+ '@img/sharp-win32-arm64': 0.34.5
+ '@img/sharp-win32-ia32': 0.34.5
+ '@img/sharp-win32-x64': 0.34.5
+ dev: false
+ optional: true
+
+ /shebang-command@2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, tarball: https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz}
+ engines: {node: '>=8'}
+ dependencies:
+ shebang-regex: 3.0.0
+ dev: true
+
+ /shebang-regex@3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, tarball: https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz}
+ engines: {node: '>=8'}
+ dev: true
+
+ /shiki@3.20.0:
+ resolution: {integrity: sha512-kgCOlsnyWb+p0WU+01RjkCH+eBVsjL1jOwUYWv0YDWkM2/A46+LDKVs5yZCUXjJG6bj4ndFoAg5iLIIue6dulg==, tarball: https://registry.npmjs.org/shiki/-/shiki-3.20.0.tgz}
+ dependencies:
+ '@shikijs/core': 3.20.0
+ '@shikijs/engine-javascript': 3.20.0
+ '@shikijs/engine-oniguruma': 3.20.0
+ '@shikijs/langs': 3.20.0
+ '@shikijs/themes': 3.20.0
+ '@shikijs/types': 3.20.0
+ '@shikijs/vscode-textmate': 10.0.2
+ '@types/hast': 3.0.4
+ dev: false
+
+ /side-channel-list@1.0.0:
+ resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==, tarball: https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ es-errors: 1.3.0
+ object-inspect: 1.13.4
+ dev: true
+
+ /side-channel-map@1.0.1:
+ resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==, tarball: https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ object-inspect: 1.13.4
+ dev: true
+
+ /side-channel-weakmap@1.0.2:
+ resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==, tarball: https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ get-intrinsic: 1.3.0
+ object-inspect: 1.13.4
+ side-channel-map: 1.0.1
+ dev: true
+
+ /side-channel@1.1.0:
+ resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==, tarball: https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ es-errors: 1.3.0
+ object-inspect: 1.13.4
+ side-channel-list: 1.0.0
+ side-channel-map: 1.0.1
+ side-channel-weakmap: 1.0.2
+ dev: true
+
+ /source-map-js@1.2.1:
+ resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==, tarball: https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz}
+ engines: {node: '>=0.10.0'}
+
+ /source-map@0.5.7:
+ resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==, tarball: https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz}
+ engines: {node: '>=0.10.0'}
+ dev: false
+
+ /source-map@0.7.6:
+ resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==, tarball: https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz}
+ engines: {node: '>= 12'}
+ dev: false
+
+ /space-separated-tokens@1.1.5:
+ resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==, tarball: https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz}
+ dev: false
+
+ /space-separated-tokens@2.0.2:
+ resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==, tarball: https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz}
+ dev: false
+
+ /sprintf-js@1.0.3:
+ resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==, tarball: https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz}
+ dev: true
+
+ /stable-hash@0.0.5:
+ resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==, tarball: https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz}
+ dev: true
+
+ /state-toggle@1.0.3:
+ resolution: {integrity: sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==, tarball: https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz}
+ dev: false
+
+ /stop-iteration-iterator@1.1.0:
+ resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==, tarball: https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ es-errors: 1.3.0
+ internal-slot: 1.1.0
+ dev: true
+
+ /string.prototype.includes@2.0.1:
+ resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==, tarball: https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-abstract: 1.24.1
+ dev: true
+
+ /string.prototype.matchall@4.0.12:
+ resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==, tarball: https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-abstract: 1.24.1
+ es-errors: 1.3.0
+ es-object-atoms: 1.1.1
+ get-intrinsic: 1.3.0
+ gopd: 1.2.0
+ has-symbols: 1.1.0
+ internal-slot: 1.1.0
+ regexp.prototype.flags: 1.5.4
+ set-function-name: 2.0.2
+ side-channel: 1.1.0
+ dev: true
+
+ /string.prototype.repeat@1.0.0:
+ resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==, tarball: https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz}
+ dependencies:
+ define-properties: 1.2.1
+ es-abstract: 1.24.1
+ dev: true
+
+ /string.prototype.trim@1.2.10:
+ resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==, tarball: https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-data-property: 1.1.4
+ define-properties: 1.2.1
+ es-abstract: 1.24.1
+ es-object-atoms: 1.1.1
+ has-property-descriptors: 1.0.2
+ dev: true
+
+ /string.prototype.trimend@1.0.9:
+ resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==, tarball: https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.1
+ dev: true
+
+ /string.prototype.trimstart@1.0.8:
+ resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==, tarball: https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ define-properties: 1.2.1
+ es-object-atoms: 1.1.1
+ dev: true
+
+ /stringify-entities@4.0.4:
+ resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==, tarball: https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz}
+ dependencies:
+ character-entities-html4: 2.1.0
+ character-entities-legacy: 3.0.0
+
+ /strip-bom-string@1.0.0:
+ resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==, tarball: https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /strip-bom@3.0.0:
+ resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==, tarball: https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz}
+ engines: {node: '>=4'}
+ dev: true
+
+ /strip-json-comments@3.1.1:
+ resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, tarball: https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz}
+ engines: {node: '>=8'}
+ dev: true
+
+ /style-to-js@1.1.21:
+ resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==, tarball: https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz}
+ dependencies:
+ style-to-object: 1.0.14
+ dev: false
+
+ /style-to-object@0.3.0:
+ resolution: {integrity: sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==, tarball: https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz}
+ dependencies:
+ inline-style-parser: 0.1.1
+ dev: false
+
+ /style-to-object@1.0.14:
+ resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==, tarball: https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz}
+ dependencies:
+ inline-style-parser: 0.2.7
+ dev: false
+
+ /styled-jsx@5.1.6(@babel/core@7.28.5)(react@19.2.3):
+ resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==, tarball: https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz}
+ engines: {node: '>= 12.0.0'}
+ peerDependencies:
+ '@babel/core': '*'
+ babel-plugin-macros: '*'
+ react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0'
+ peerDependenciesMeta:
+ '@babel/core':
+ optional: true
+ babel-plugin-macros:
+ optional: true
+ dependencies:
+ '@babel/core': 7.28.5
+ client-only: 0.0.1
+ react: 19.2.3
+ dev: false
+
+ /supports-color@7.2.0:
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, tarball: https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz}
+ engines: {node: '>=8'}
+ dependencies:
+ has-flag: 4.0.0
+ dev: true
+
+ /supports-preserve-symlinks-flag@1.0.0:
+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, tarball: https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz}
+ engines: {node: '>= 0.4'}
+
+ /swr@2.3.8(react@19.2.3):
+ resolution: {integrity: sha512-gaCPRVoMq8WGDcWj9p4YWzCMPHzE0WNl6W8ADIx9c3JBEIdMkJGMzW+uzXvxHMltwcYACr9jP+32H8/hgwMR7w==, tarball: https://registry.npmjs.org/swr/-/swr-2.3.8.tgz}
+ peerDependencies:
+ react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ dependencies:
+ dequal: 2.0.3
+ react: 19.2.3
+ use-sync-external-store: 1.6.0(react@19.2.3)
+ dev: false
+
+ /tailwind-merge@3.4.0:
+ resolution: {integrity: sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==, tarball: https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.4.0.tgz}
+ dev: false
+
+ /tailwindcss@4.1.18:
+ resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==, tarball: https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz}
+
+ /tapable@2.3.0:
+ resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==, tarball: https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz}
+ engines: {node: '>=6'}
+ dev: true
+
+ /throttleit@2.1.0:
+ resolution: {integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==, tarball: https://registry.npmjs.org/throttleit/-/throttleit-2.1.0.tgz}
+ engines: {node: '>=18'}
+ dev: false
+
+ /tinyexec@1.0.2:
+ resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==, tarball: https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz}
+ engines: {node: '>=18'}
+ dev: false
+
+ /tinyglobby@0.2.15:
+ resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==, tarball: https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz}
+ engines: {node: '>=12.0.0'}
+ dependencies:
+ fdir: 6.5.0(picomatch@4.0.3)
+ picomatch: 4.0.3
+
+ /to-regex-range@5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, tarball: https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz}
+ engines: {node: '>=8.0'}
+ dependencies:
+ is-number: 7.0.0
+ dev: true
+
+ /trim-lines@3.0.1:
+ resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==, tarball: https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz}
+ dev: false
+
+ /trim-trailing-lines@1.1.4:
+ resolution: {integrity: sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==, tarball: https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz}
+ dev: false
+
+ /trim@0.0.1:
+ resolution: {integrity: sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==, tarball: https://registry.npmjs.org/trim/-/trim-0.0.1.tgz}
+ deprecated: Use String.prototype.trim() instead
+ dev: false
+
+ /trough@1.0.5:
+ resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==, tarball: https://registry.npmjs.org/trough/-/trough-1.0.5.tgz}
+ dev: false
+
+ /trough@2.2.0:
+ resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==, tarball: https://registry.npmjs.org/trough/-/trough-2.2.0.tgz}
+
+ /ts-api-utils@2.1.0(typescript@5.9.3):
+ resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==, tarball: https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz}
+ engines: {node: '>=18.12'}
+ peerDependencies:
+ typescript: '>=4.8.4'
+ dependencies:
+ typescript: 5.9.3
+ dev: true
+
+ /tsconfig-paths@3.15.0:
+ resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==, tarball: https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz}
+ dependencies:
+ '@types/json5': 0.0.29
+ json5: 1.0.2
+ minimist: 1.2.8
+ strip-bom: 3.0.0
+ dev: true
+
+ /tslib@2.8.1:
+ resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==, tarball: https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz}
+
+ /twoslash-protocol@0.3.6:
+ resolution: {integrity: sha512-FHGsJ9Q+EsNr5bEbgG3hnbkvEBdW5STgPU824AHUjB4kw0Dn4p8tABT7Ncg1Ie6V0+mDg3Qpy41VafZXcQhWMA==, tarball: https://registry.npmjs.org/twoslash-protocol/-/twoslash-protocol-0.3.6.tgz}
+ dev: false
+
+ /twoslash@0.3.6(typescript@5.9.3):
+ resolution: {integrity: sha512-VuI5OKl+MaUO9UIW3rXKoPgHI3X40ZgB/j12VY6h98Ae1mCBihjPvhOPeJWlxCYcmSbmeZt5ZKkK0dsVtp+6pA==, tarball: https://registry.npmjs.org/twoslash/-/twoslash-0.3.6.tgz}
+ peerDependencies:
+ typescript: ^5.5.0
+ dependencies:
+ '@typescript/vfs': 1.6.2(typescript@5.9.3)
+ twoslash-protocol: 0.3.6
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /type-check@0.4.0:
+ resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, tarball: https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ prelude-ls: 1.2.1
+ dev: true
+
+ /typed-array-buffer@1.0.3:
+ resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==, tarball: https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ es-errors: 1.3.0
+ is-typed-array: 1.1.15
+ dev: true
+
+ /typed-array-byte-length@1.0.3:
+ resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==, tarball: https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ for-each: 0.3.5
+ gopd: 1.2.0
+ has-proto: 1.2.0
+ is-typed-array: 1.1.15
+ dev: true
+
+ /typed-array-byte-offset@1.0.4:
+ resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==, tarball: https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.8
+ for-each: 0.3.5
+ gopd: 1.2.0
+ has-proto: 1.2.0
+ is-typed-array: 1.1.15
+ reflect.getprototypeof: 1.0.10
+ dev: true
+
+ /typed-array-length@1.0.7:
+ resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==, tarball: https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.8
+ for-each: 0.3.5
+ gopd: 1.2.0
+ is-typed-array: 1.1.15
+ possible-typed-array-names: 1.1.0
+ reflect.getprototypeof: 1.0.10
+ dev: true
+
+ /typescript-eslint@8.50.0(eslint@9.39.2)(typescript@5.9.3):
+ resolution: {integrity: sha512-Q1/6yNUmCpH94fbgMUMg2/BSAr/6U7GBk61kZTv1/asghQOWOjTlp9K8mixS5NcJmm2creY+UFfGeW/+OcA64A==, tarball: https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.50.0.tgz}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <6.0.0'
+ dependencies:
+ '@typescript-eslint/eslint-plugin': 8.50.0(@typescript-eslint/parser@8.50.0)(eslint@9.39.2)(typescript@5.9.3)
+ '@typescript-eslint/parser': 8.50.0(eslint@9.39.2)(typescript@5.9.3)
+ '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.50.0(eslint@9.39.2)(typescript@5.9.3)
+ eslint: 9.39.2
+ typescript: 5.9.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /typescript@5.9.3:
+ resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==, tarball: https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ /unbox-primitive@1.1.0:
+ resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==, tarball: https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ has-bigints: 1.1.0
+ has-symbols: 1.1.0
+ which-boxed-primitive: 1.1.1
+ dev: true
+
+ /undici-types@7.13.0:
+ resolution: {integrity: sha512-Ov2Rr9Sx+fRgagJ5AX0qvItZG/JKKoBRAVITs1zk7IqZGTJUwgUr7qoYBpWwakpWilTZFM98rG/AFRocu10iIQ==, tarball: https://registry.npmjs.org/undici-types/-/undici-types-7.13.0.tgz}
+ dev: true
+
+ /unherit@1.1.3:
+ resolution: {integrity: sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==, tarball: https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz}
+ dependencies:
+ inherits: 2.0.4
+ xtend: 4.0.2
+ dev: false
+
+ /unified@11.0.5:
+ resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==, tarball: https://registry.npmjs.org/unified/-/unified-11.0.5.tgz}
+ dependencies:
+ '@types/unist': 3.0.3
+ bail: 2.0.2
+ devlop: 1.1.0
+ extend: 3.0.2
+ is-plain-obj: 4.1.0
+ trough: 2.2.0
+ vfile: 6.0.3
+
+ /unified@9.2.0:
+ resolution: {integrity: sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==, tarball: https://registry.npmjs.org/unified/-/unified-9.2.0.tgz}
+ dependencies:
+ '@types/unist': 2.0.11
+ bail: 1.0.5
+ extend: 3.0.2
+ is-buffer: 2.0.5
+ is-plain-obj: 2.1.0
+ trough: 1.0.5
+ vfile: 4.2.1
+ dev: false
+
+ /unist-builder@2.0.3:
+ resolution: {integrity: sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==, tarball: https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz}
+ dev: false
+
+ /unist-util-generated@1.1.6:
+ resolution: {integrity: sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==, tarball: https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz}
+ dev: false
+
+ /unist-util-is@4.1.0:
+ resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==, tarball: https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz}
+ dev: false
+
+ /unist-util-is@6.0.1:
+ resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==, tarball: https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz}
+ dependencies:
+ '@types/unist': 3.0.3
+
+ /unist-util-position-from-estree@2.0.0:
+ resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==, tarball: https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz}
+ dependencies:
+ '@types/unist': 3.0.3
+
+ /unist-util-position@3.1.0:
+ resolution: {integrity: sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==, tarball: https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz}
+ dev: false
+
+ /unist-util-position@5.0.0:
+ resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==, tarball: https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz}
+ dependencies:
+ '@types/unist': 3.0.3
+ dev: false
+
+ /unist-util-remove-position@2.0.1:
+ resolution: {integrity: sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==, tarball: https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz}
+ dependencies:
+ unist-util-visit: 2.0.3
+ dev: false
+
+ /unist-util-remove-position@5.0.0:
+ resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==, tarball: https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz}
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-visit: 5.0.0
+ dev: false
+
+ /unist-util-remove@2.1.0:
+ resolution: {integrity: sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==, tarball: https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz}
+ dependencies:
+ unist-util-is: 4.1.0
+ dev: false
+
+ /unist-util-stringify-position@2.0.3:
+ resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==, tarball: https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz}
+ dependencies:
+ '@types/unist': 2.0.11
+ dev: false
+
+ /unist-util-stringify-position@4.0.0:
+ resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==, tarball: https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz}
+ dependencies:
+ '@types/unist': 3.0.3
+
+ /unist-util-visit-parents@3.1.1:
+ resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==, tarball: https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz}
+ dependencies:
+ '@types/unist': 2.0.11
+ unist-util-is: 4.1.0
+ dev: false
+
+ /unist-util-visit-parents@6.0.2:
+ resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==, tarball: https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz}
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.1
+
+ /unist-util-visit@2.0.3:
+ resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==, tarball: https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz}
+ dependencies:
+ '@types/unist': 2.0.11
+ unist-util-is: 4.1.0
+ unist-util-visit-parents: 3.1.1
+ dev: false
+
+ /unist-util-visit@5.0.0:
+ resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==, tarball: https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz}
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.1
+ unist-util-visit-parents: 6.0.2
+
+ /unrs-resolver@1.11.1:
+ resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==, tarball: https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz}
+ requiresBuild: true
+ dependencies:
+ napi-postinstall: 0.3.4
+ optionalDependencies:
+ '@unrs/resolver-binding-android-arm-eabi': 1.11.1
+ '@unrs/resolver-binding-android-arm64': 1.11.1
+ '@unrs/resolver-binding-darwin-arm64': 1.11.1
+ '@unrs/resolver-binding-darwin-x64': 1.11.1
+ '@unrs/resolver-binding-freebsd-x64': 1.11.1
+ '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.1
+ '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.1
+ '@unrs/resolver-binding-linux-arm64-gnu': 1.11.1
+ '@unrs/resolver-binding-linux-arm64-musl': 1.11.1
+ '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.1
+ '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.1
+ '@unrs/resolver-binding-linux-riscv64-musl': 1.11.1
+ '@unrs/resolver-binding-linux-s390x-gnu': 1.11.1
+ '@unrs/resolver-binding-linux-x64-gnu': 1.11.1
+ '@unrs/resolver-binding-linux-x64-musl': 1.11.1
+ '@unrs/resolver-binding-wasm32-wasi': 1.11.1
+ '@unrs/resolver-binding-win32-arm64-msvc': 1.11.1
+ '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1
+ '@unrs/resolver-binding-win32-x64-msvc': 1.11.1
+ dev: true
+
+ /update-browserslist-db@1.2.3(browserslist@4.28.1):
+ resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==, tarball: https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+ dependencies:
+ browserslist: 4.28.1
+ escalade: 3.2.0
+ picocolors: 1.1.1
+
+ /uri-js@4.4.1:
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, tarball: https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz}
+ dependencies:
+ punycode: 2.3.1
+ dev: true
+
+ /use-callback-ref@1.3.3(@types/react@19.2.7)(react@19.2.3):
+ resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==, tarball: https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@types/react': 19.2.7
+ react: 19.2.3
+ tslib: 2.8.1
+ dev: false
+
+ /use-sidecar@1.1.3(@types/react@19.2.7)(react@19.2.3):
+ resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==, tarball: https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ dependencies:
+ '@types/react': 19.2.7
+ detect-node-es: 1.1.0
+ react: 19.2.3
+ tslib: 2.8.1
+ dev: false
+
+ /use-sync-external-store@1.6.0(react@19.2.3):
+ resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==, tarball: https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ dependencies:
+ react: 19.2.3
+ dev: false
+
+ /util-deprecate@1.0.2:
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, tarball: https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz}
+ dev: false
+
+ /vfile-location@3.2.0:
+ resolution: {integrity: sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==, tarball: https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz}
+ dev: false
+
+ /vfile-message@2.0.4:
+ resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==, tarball: https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz}
+ dependencies:
+ '@types/unist': 2.0.11
+ unist-util-stringify-position: 2.0.3
+ dev: false
+
+ /vfile-message@4.0.3:
+ resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==, tarball: https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz}
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-stringify-position: 4.0.0
+
+ /vfile@4.2.1:
+ resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==, tarball: https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz}
+ dependencies:
+ '@types/unist': 2.0.11
+ is-buffer: 2.0.5
+ unist-util-stringify-position: 2.0.3
+ vfile-message: 2.0.4
+ dev: false
+
+ /vfile@6.0.3:
+ resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==, tarball: https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz}
+ dependencies:
+ '@types/unist': 3.0.3
+ vfile-message: 4.0.3
+
+ /web-namespaces@1.1.4:
+ resolution: {integrity: sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==, tarball: https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz}
+ dev: false
+
+ /which-boxed-primitive@1.1.1:
+ resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==, tarball: https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ is-bigint: 1.1.0
+ is-boolean-object: 1.2.2
+ is-number-object: 1.1.1
+ is-string: 1.1.1
+ is-symbol: 1.1.1
+ dev: true
+
+ /which-builtin-type@1.2.1:
+ resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==, tarball: https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bound: 1.0.4
+ function.prototype.name: 1.1.8
+ has-tostringtag: 1.0.2
+ is-async-function: 2.1.1
+ is-date-object: 1.1.0
+ is-finalizationregistry: 1.1.1
+ is-generator-function: 1.1.2
+ is-regex: 1.2.1
+ is-weakref: 1.1.1
+ isarray: 2.0.5
+ which-boxed-primitive: 1.1.1
+ which-collection: 1.0.2
+ which-typed-array: 1.1.19
+ dev: true
+
+ /which-collection@1.0.2:
+ resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==, tarball: https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ is-map: 2.0.3
+ is-set: 2.0.3
+ is-weakmap: 2.0.2
+ is-weakset: 2.0.4
+ dev: true
+
+ /which-typed-array@1.1.19:
+ resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==, tarball: https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ available-typed-arrays: 1.0.7
+ call-bind: 1.0.8
+ call-bound: 1.0.4
+ for-each: 0.3.5
+ get-proto: 1.0.1
+ gopd: 1.2.0
+ has-tostringtag: 1.0.2
+ dev: true
+
+ /which@2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, tarball: https://registry.npmjs.org/which/-/which-2.0.2.tgz}
+ engines: {node: '>= 8'}
+ hasBin: true
+ dependencies:
+ isexe: 2.0.0
+ dev: true
+
+ /word-wrap@1.2.5:
+ resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==, tarball: https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /xstate@5.25.0:
+ resolution: {integrity: sha512-yyWzfhVRoTHNLjLoMmdwZGagAYfmnzpm9gPjlX2MhJZsDojXGqRxODDOi4BsgGRKD46NZRAdcLp6CKOyvQS0Bw==, tarball: https://registry.npmjs.org/xstate/-/xstate-5.25.0.tgz}
+ dev: false
+
+ /xtend@4.0.2:
+ resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==, tarball: https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz}
+ engines: {node: '>=0.4'}
+ dev: false
+
+ /yallist@3.1.1:
+ resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, tarball: https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz}
+
+ /yocto-queue@0.1.0:
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, tarball: https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz}
+ engines: {node: '>=10'}
+ dev: true
+
+ /zod-validation-error@4.0.2(zod@4.2.1):
+ resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==, tarball: https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz}
+ engines: {node: '>=18.0.0'}
+ peerDependencies:
+ zod: ^3.25.0 || ^4.0.0
+ dependencies:
+ zod: 4.2.1
+ dev: true
+
+ /zod@4.2.1:
+ resolution: {integrity: sha512-0wZ1IRqGGhMP76gLqz8EyfBXKk0J2qo2+H3fi4mcUP/KtTocoX08nmIAHl1Z2kJIZbZee8KOpBCSNPRgauucjw==, tarball: https://registry.npmjs.org/zod/-/zod-4.2.1.tgz}
+
+ /zwitch@1.0.5:
+ resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==, tarball: https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz}
+ dev: false
+
+ /zwitch@2.0.4:
+ resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==, tarball: https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz}
diff --git a/postcss.config.js b/postcss.config.mjs
similarity index 73%
rename from postcss.config.js
rename to postcss.config.mjs
index e5640725a..a34a3d560 100644
--- a/postcss.config.js
+++ b/postcss.config.mjs
@@ -1,4 +1,4 @@
-module.exports = {
+export default {
plugins: {
'@tailwindcss/postcss': {},
},
diff --git a/public/assets/landing/generate-react.png b/public/assets/landing/generate-react.png
new file mode 100644
index 000000000..67dbafee6
Binary files /dev/null and b/public/assets/landing/generate-react.png differ
diff --git a/public/assets/landing/inspector.png b/public/assets/landing/inspector.png
new file mode 100644
index 000000000..4bbbb8594
Binary files /dev/null and b/public/assets/landing/inspector.png differ
diff --git a/public/assets/landing/room-readings.png b/public/assets/landing/room-readings.png
new file mode 100644
index 000000000..24523835e
Binary files /dev/null and b/public/assets/landing/room-readings.png differ
diff --git a/public/assets/landing/stately-logo.svg b/public/assets/landing/stately-logo.svg
new file mode 100644
index 000000000..34b437fc5
--- /dev/null
+++ b/public/assets/landing/stately-logo.svg
@@ -0,0 +1 @@
+Stately
\ No newline at end of file
diff --git a/public/assets/landing/test-generation.png b/public/assets/landing/test-generation.png
new file mode 100644
index 000000000..730b0be92
Binary files /dev/null and b/public/assets/landing/test-generation.png differ
diff --git a/public/assets/landing/vscode-split.png b/public/assets/landing/vscode-split.png
new file mode 100644
index 000000000..dde22620f
Binary files /dev/null and b/public/assets/landing/vscode-split.png differ
diff --git a/public/landing-page/assets/amy.png b/public/landing-page/assets/amy.png
new file mode 100644
index 000000000..ae024c5a5
Binary files /dev/null and b/public/landing-page/assets/amy.png differ
diff --git a/public/landing-page/assets/aws.svg b/public/landing-page/assets/aws.svg
new file mode 100644
index 000000000..1022dca9c
--- /dev/null
+++ b/public/landing-page/assets/aws.svg
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/public/landing-page/assets/cisco.svg b/public/landing-page/assets/cisco.svg
new file mode 100644
index 000000000..c119fd4ef
--- /dev/null
+++ b/public/landing-page/assets/cisco.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/landing-page/assets/epic-games.svg b/public/landing-page/assets/epic-games.svg
new file mode 100644
index 000000000..d04232ea4
--- /dev/null
+++ b/public/landing-page/assets/epic-games.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/landing-page/assets/james.png b/public/landing-page/assets/james.png
new file mode 100644
index 000000000..1267bf057
Binary files /dev/null and b/public/landing-page/assets/james.png differ
diff --git a/public/landing-page/assets/lyft.svg b/public/landing-page/assets/lyft.svg
new file mode 100644
index 000000000..76f88e759
--- /dev/null
+++ b/public/landing-page/assets/lyft.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/landing-page/assets/maya.png b/public/landing-page/assets/maya.png
new file mode 100644
index 000000000..13e1e69c1
Binary files /dev/null and b/public/landing-page/assets/maya.png differ
diff --git a/public/landing-page/assets/microsoft.svg b/public/landing-page/assets/microsoft.svg
new file mode 100644
index 000000000..2ea0075fc
--- /dev/null
+++ b/public/landing-page/assets/microsoft.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/landing-page/assets/natalie.png b/public/landing-page/assets/natalie.png
new file mode 100644
index 000000000..660027c75
Binary files /dev/null and b/public/landing-page/assets/natalie.png differ
diff --git a/public/landing-page/assets/netflix.svg b/public/landing-page/assets/netflix.svg
new file mode 100644
index 000000000..e405d41d0
--- /dev/null
+++ b/public/landing-page/assets/netflix.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/public/landing-page/assets/patrick.png b/public/landing-page/assets/patrick.png
new file mode 100644
index 000000000..3b79f1683
Binary files /dev/null and b/public/landing-page/assets/patrick.png differ
diff --git a/public/landing-page/assets/presley.png b/public/landing-page/assets/presley.png
new file mode 100644
index 000000000..0de7798c4
Binary files /dev/null and b/public/landing-page/assets/presley.png differ
diff --git a/public/landing-page/assets/santi.png b/public/landing-page/assets/santi.png
new file mode 100644
index 000000000..10d630324
Binary files /dev/null and b/public/landing-page/assets/santi.png differ
diff --git a/scripts/lint.ts b/scripts/lint.ts
new file mode 100644
index 000000000..3104d3594
--- /dev/null
+++ b/scripts/lint.ts
@@ -0,0 +1,59 @@
+import {
+ type FileObject,
+ printErrors,
+ scanURLs,
+ validateFiles,
+} from 'next-validate-link';
+import type { InferPageType } from 'fumadocs-core/source';
+import { source } from '@/lib/source';
+
+async function checkLinks() {
+ const scanned = await scanURLs({
+ // pick a preset for your React framework
+ preset: 'next',
+ populate: {
+ 'docs/[[...slug]]': source.getPages().map((page) => {
+ return {
+ value: {
+ slug: page.slugs,
+ },
+ hashes: getHeadings(page),
+ };
+ }),
+ },
+ });
+
+ printErrors(
+ await validateFiles(await getFiles(), {
+ scanned,
+ // check `href` attributes in different MDX components
+ markdown: {
+ components: {
+ Card: { attributes: ['href'] },
+ },
+ },
+ // check relative paths
+ checkRelativePaths: 'as-url',
+ }),
+ true,
+ );
+}
+
+function getHeadings({ data }: InferPageType): string[] {
+ return data.toc?.map((item) => item.url.slice(1));
+}
+
+function getFiles() {
+ const promises = source.getPages().map(
+ async (page): Promise => ({
+ path: page.absolutePath!,
+ content: await page.data.getText('raw'),
+ url: page.url,
+ data: page.data,
+ }),
+ );
+
+ return Promise.all(promises);
+}
+
+void checkLinks();
diff --git a/sidebars.js b/sidebars.js
deleted file mode 100644
index 031a60407..000000000
--- a/sidebars.js
+++ /dev/null
@@ -1,465 +0,0 @@
-/**
- * Creating a sidebar enables you to:
- - create an ordered group of docs
- - render a sidebar for each doc of that group
- - provide next/previous navigation
-
- The sidebars can be generated from the filesystem, or explicitly defined here.
-
- Create as many sidebars as you want.
- */
-
-// @ts-check
-
-/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */
-const sidebars = {
- // By default, Docusaurus generates a sidebar from the docs folder structure
- // tutorialSidebar: [{type: 'autogenerated', dirName: '.'}],
-
- // But you can create a sidebar manually
-
- tutorialSidebar: [
- {
- type: 'doc',
- label: 'About Stately and XState',
- id: 'about',
- },
- {
- type: 'category',
- label: 'Get started',
- link: {
- type: 'generated-index',
- title: 'Get started',
- description: 'Get started quickly with XState and Stately Studio.',
- slug: '/category/get-started',
- keywords: ['guides'],
- },
- collapsed: false,
- collapsible: true,
- items: [
- 'quick-start',
- {
- type: 'doc',
- label: 'Install XState',
- id: 'installation',
- },
- {
- type: 'doc',
- label: 'Migrate to XState v5',
- id: 'migration',
- },
- {
- type: 'doc',
- label: 'Examples',
- id: 'examples',
- },
- 'templates',
- 'cheatsheet',
- 'typescript',
- {
- type: 'link',
- label: 'API',
- // href: 'https://tsdocs.dev/docs/xstate',
- href: 'https://www.jsdocs.io/package/xstate',
- },
- ],
- },
- {
- type: 'category',
- label: 'Core concepts',
- link: {
- type: 'generated-index',
- title: 'Core concepts',
- description: 'Learn the core concepts for XState and Stately Studio.',
- slug: '/category/core-concepts',
- keywords: ['guides'],
- },
- collapsed: false,
- collapsible: true,
- items: [
- {
- type: 'doc',
- label: 'State machines',
- id: 'state-machines-and-statecharts',
- },
- {
- type: 'doc',
- label: 'Actor model',
- id: 'actor-model',
- },
- {
- type: 'doc',
- label: 'What is XState?',
- id: 'xstate',
- },
- ],
- },
- {
- type: 'category',
- label: 'Stately Studio',
- link: {
- type: 'generated-index',
- title: 'Stately Studio',
- description: 'Learn how to use Stately Studio’s editor.',
- slug: '/category/studio',
- keywords: ['guides'],
- },
- collapsed: true,
- collapsible: true,
- items: [
- {
- type: 'doc',
- label: 'Introducing Stately Studio',
- id: 'studio',
- },
- {
- type: 'doc',
- label: 'Stately Studio Pro',
- id: 'studio-pro-plan',
- },
- {
- type: 'doc',
- label: 'Stately Studio Team',
- id: 'studio-team-plan',
- },
- {
- type: 'doc',
- label: 'Stately Studio Enterprise',
- id: 'studio-enterprise-plan',
- },
- {
- type: 'doc',
- label: 'Stately Studio Community',
- id: 'studio-community-plan',
- },
- {
- type: 'doc',
- label: 'States and transitions',
- id: 'editor-states-and-transitions',
- },
- {
- type: 'doc',
- label: 'Actions and actors',
- id: 'editor-actions-and-actors',
- },
- {
- type: 'category',
- label: 'Design mode',
- link: {
- type: 'doc',
- id: 'design-mode',
- },
- items: [
- {
- type: 'doc',
- label: 'Generate with AI',
- id: 'generate-flow',
- },
- {
- type: 'doc',
- label: 'Generate React app',
- id: 'generate-react',
- },
- {
- type: 'doc',
- label: 'Colors',
- id: 'colors',
- },
- {
- type: 'doc',
- label: 'Notes',
- id: 'annotations',
- },
- 'descriptions',
- {
- type: 'doc',
- label: 'Embed Figma',
- id: 'figma',
- },
- {
- type: 'doc',
- label: 'Assets',
- id: 'assets',
- },
- {
- type: 'doc',
- label: 'Tags',
- id: 'editor-tags',
- },
- 'machine-restore',
- 'autolayout',
- ],
- },
- {
- type: 'category',
- label: 'Simulate mode',
- link: {
- type: 'doc',
- id: 'simulate-mode',
- },
- items: [
- {
- type: 'doc',
- label: 'Live simulation',
- id: 'live-simulation',
- },
- ],
- },
- {
- type: 'category',
- label: 'Code',
- link: {
- type: 'generated-index',
- title: 'Code',
- description: 'Learn how to use Stately Studio’s code.',
- slug: '/category/code',
- keywords: ['guides'],
- },
- collapsed: true,
- collapsible: true,
- items: [
- 'import-from-code',
- 'import-from-github',
- 'generate-test-paths',
- 'sources',
- 'export-as-code',
- ],
- },
- 'projects',
- {
- type: 'category',
- label: 'Stately Sky',
- link: {
- type: 'doc',
- id: 'stately-sky-getting-started',
- },
- items: [
- {
- type: 'doc',
- label: 'Getting started',
- id: 'stately-sky-getting-started',
- },
- ],
- },
- {
- type: 'doc',
- label: 'Teams',
- id: 'teams',
- },
- 'discover',
- {
- type: 'category',
- label: 'Share',
- link: {
- type: 'generated-index',
- title: 'Share',
- description:
- 'Learn how to share machines created in Stately Studio.',
- slug: '/category/share',
- keywords: ['guides'],
- },
- items: [
- {
- type: 'doc',
- label: 'Embed URL',
- id: 'embed',
- },
- {
- type: 'doc',
- label: 'Image URL',
- id: 'image',
- },
- {
- type: 'doc',
- label: 'Share URL',
- id: 'url',
- },
- ],
- },
- {
- type: 'category',
- label: 'Accounts',
- link: {
- type: 'generated-index',
- title: 'Stately Studio accounts',
- description:
- 'Learn about Stately Studio plans and how to manage your account.',
- slug: '/category/accounts',
- keywords: ['guides'],
- },
- items: [
- {
- type: 'doc',
- label: 'Sign up',
- id: 'sign-up',
- },
- {
- type: 'doc',
- label: 'Upgrade',
- id: 'upgrade',
- },
- ],
- },
- {
- type: 'doc',
- label: 'Version history',
- id: 'versions',
- },
- {
- type: 'doc',
- label: 'Lock machines',
- id: 'lock-machines',
- },
- 'keyboard-shortcuts',
- 'canvas-view-controls',
- 'user-preferences',
- 'studio-api',
- ],
- },
- {
- type: 'category',
- label: 'Actors',
- link: {
- type: 'generated-index',
- title: 'Actors',
- description:
- 'Learn how to use actors and the actor model in XState and Stately Studio.',
- slug: '/category/actors',
- keywords: ['guides'],
- },
- collapsed: false,
- collapsible: true,
- items: [
- 'actors',
- 'state-machine-actors',
- 'promise-actors',
- 'transition-actors',
- 'callback-actors',
- 'observable-actors',
- 'invoke',
- 'spawn',
- 'system',
- 'inspection',
- ],
- },
- {
- type: 'category',
- label: 'State machines',
- link: {
- type: 'generated-index',
- title: 'State machines',
- description:
- 'Learn how to use state machines in XState and Stately Studio.',
- slug: '/category/state-machines',
- keywords: ['guides'],
- },
- collapsed: false,
- collapsible: true,
- items: [
- 'machines',
- 'setup',
- 'states',
- 'context',
- 'input',
- 'output',
- 'transitions',
- 'pure-transitions',
- 'eventless-transitions',
- 'delayed-transitions',
- 'actions',
- 'guards',
- 'initial-states',
- 'finite-states',
- 'parent-states',
- 'parallel-states',
- 'final-states',
- 'history-states',
- 'persistence',
- 'tags',
- 'event-emitter',
- ],
- },
- {
- type: 'category',
- label: 'Agents',
- link: {
- type: 'generated-index',
- title: 'Agents',
- description:
- 'Learn how to use AI agents with XState and Stately Studio.',
- slug: '/category/agents',
- keywords: ['agents'],
- },
- collapsed: true,
- collapsible: true,
- items: ['agents'],
- },
- {
- type: 'category',
- label: 'Guides',
- link: {
- type: 'generated-index',
- title: 'Guides',
- description:
- 'These guides cover different aspects such as using XState with immer, testing strategies, and other upcoming guides that will be added in the future. The purpose of these guides is to provide users with in-depth knowledge and practical examples to effectively utilize XState in their projects.',
- slug: '/category/guides',
- keywords: ['guides'],
- },
- collapsed: false,
- collapsible: true,
- items: ['testing', 'immer'],
- },
- {
- type: 'category',
- label: 'Packages',
- link: {
- type: 'generated-index',
- title: 'Packages',
- description: 'Find all the packages in XState.',
- slug: '/category/xstate-packages',
- keywords: ['guides'],
- },
- collapsed: true,
- collapsible: true,
- items: [
- 'xstate-store',
- 'xstate-react',
- 'xstate-vue',
- 'xstate-svelte',
- 'xstate-graph',
- 'xstate-test',
- ],
- },
- {
- type: 'category',
- label: 'Developer tools',
- collapsed: false,
- collapsible: true,
- link: {
- type: 'generated-index',
- title: 'Stately developer tools',
- description:
- 'Find all the developer tools you can use with XState and Stately Studio’s editor.',
- slug: '/category/developer-tools',
- keywords: ['guides'],
- },
- items: [
- 'xstate-vscode-extension',
- 'visualizer',
- 'inspector',
- {
- type: 'doc',
- label: 'Other tools',
- id: 'developer-tools',
- },
- ],
- },
- {
- type: 'doc',
- label: 'Glossary',
- id: 'glossary',
- },
- ],
-};
-
-module.exports = sidebars;
diff --git a/source.config.ts b/source.config.ts
new file mode 100644
index 000000000..dc8c5768d
--- /dev/null
+++ b/source.config.ts
@@ -0,0 +1,60 @@
+import {
+ defineCollections,
+ defineConfig,
+ defineDocs,
+ frontmatterSchema,
+ metaSchema,
+} from 'fumadocs-mdx/config';
+import { transformerTwoslash } from 'fumadocs-twoslash';
+import {
+ rehypeCodeDefaultOptions,
+ remarkImage,
+} from 'fumadocs-core/mdx-plugins';
+import z from 'zod';
+
+// You can customise Zod schemas for frontmatter and `meta.json` here
+// see https://fumadocs.dev/docs/mdx/collections
+export const docs = defineDocs({
+ docs: {
+ schema: frontmatterSchema,
+ postprocess: {
+ includeProcessedMarkdown: true,
+ },
+ },
+ meta: {
+ schema: metaSchema,
+ },
+});
+
+export const blogPosts = defineCollections({
+ type: 'doc',
+ dir: 'content/blog',
+ schema: frontmatterSchema.extend({
+ authors: z.array(z.string()),
+ date: z.iso.date().or(z.date()),
+ }),
+});
+
+export default defineConfig({
+ mdxOptions: {
+ // MDX options
+ rehypeCodeOptions: {
+ themes: {
+ light: 'github-light',
+ dark: 'github-dark',
+ },
+ transformers: [
+ ...(rehypeCodeDefaultOptions.transformers ?? []),
+ transformerTwoslash(),
+ ],
+ },
+ remarkPlugins: [
+ [
+ remarkImage,
+ {
+ external: false,
+ },
+ ],
+ ],
+ },
+});
diff --git a/src/components/Announcement.tsx b/src/components/Announcement.tsx
deleted file mode 100644
index 00eb58e2d..000000000
--- a/src/components/Announcement.tsx
+++ /dev/null
@@ -1,58 +0,0 @@
-import React, { useState } from 'react';
-
-interface AnnouncementProps {
- children: React.ReactNode;
- cta?: React.ReactNode;
- href: string;
-}
-
-export const Announcement: React.FC = ({
- cta,
- href,
- children,
-}) => {
- const [isHoveringLink, setIsHoveringLink] = useState(false);
-
- return (
-
- );
-};
diff --git a/src/components/EmbedMachine/styles.module.css b/src/components/EmbedMachine/styles.module.css
deleted file mode 100644
index 6722b8404..000000000
--- a/src/components/EmbedMachine/styles.module.css
+++ /dev/null
@@ -1,6 +0,0 @@
-iframe.embed {
- display: block;
- margin: 0 0 var(--ifm-paragraph-margin-bottom);
- width: 100%;
- aspect-ratio: 6 / 4;
-}
diff --git a/src/components/HomepageFeatures/index.tsx b/src/components/HomepageFeatures/index.tsx
deleted file mode 100644
index edd060a7e..000000000
--- a/src/components/HomepageFeatures/index.tsx
+++ /dev/null
@@ -1,70 +0,0 @@
-import clsx from 'clsx';
-import React from 'react';
-import styles from './styles.module.css';
-
-type FeatureItem = {
- title: string;
- Svg: React.ComponentType>;
- description: JSX.Element;
-};
-
-const FeatureList: FeatureItem[] = [
- {
- title: 'Easy to Use',
- Svg: require('@site/static/img/undraw_docusaurus_mountain.svg').default,
- description: (
- <>
- Docusaurus was designed from the ground up to be easily installed and
- used to get your website up and running quickly.
- >
- ),
- },
- {
- title: 'Focus on What Matters',
- Svg: require('@site/static/img/undraw_docusaurus_tree.svg').default,
- description: (
- <>
- Docusaurus lets you focus on your docs, and we'll do the chores. Go
- ahead and move your docs into the docs directory.
- >
- ),
- },
- {
- title: 'Powered by React',
- Svg: require('@site/static/img/undraw_docusaurus_react.svg').default,
- description: (
- <>
- Extend or customize your website layout by reusing React. Docusaurus can
- be extended while reusing the same header and footer.
- >
- ),
- },
-];
-
-function Feature({ title, Svg, description }: FeatureItem) {
- return (
-
-
-
-
-
-
{title}
-
{description}
-
-
- );
-}
-
-export default function HomepageFeatures(): JSX.Element {
- return (
-
-
-
- {FeatureList.map((props, idx) => (
-
- ))}
-
-
-
- );
-}
diff --git a/src/components/HomepageFeatures/styles.module.css b/src/components/HomepageFeatures/styles.module.css
deleted file mode 100644
index b248eb2e5..000000000
--- a/src/components/HomepageFeatures/styles.module.css
+++ /dev/null
@@ -1,11 +0,0 @@
-.features {
- display: flex;
- align-items: center;
- padding: 2rem 0;
- width: 100%;
-}
-
-.featureSvg {
- height: 200px;
- width: 200px;
-}
diff --git a/src/components/embeds/Tweet.tsx b/src/components/embeds/Tweet.tsx
deleted file mode 100644
index c53a30990..000000000
--- a/src/components/embeds/Tweet.tsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import { Tweet as MDXTweet } from 'mdx-embed';
-export default function Tweet({ id }: { id: string }) {
- return (
-
- );
-}
diff --git a/src/components/landing/Benefits.tsx b/src/components/landing/Benefits.tsx
deleted file mode 100644
index 6681a0b62..000000000
--- a/src/components/landing/Benefits.tsx
+++ /dev/null
@@ -1,715 +0,0 @@
-import {
- ArrowLeftRightIcon,
- BookOpenIcon,
- CalendarIcon,
- CheckCircleIcon,
- FileDownIcon,
- GithubIcon,
- MergeIcon,
- PartyPopperIcon,
- ShareIcon,
- ShieldCheckIcon,
- SparklesIcon,
- Wand2Icon,
-} from 'lucide-react';
-import { ReactNode, useEffect, useRef, useState } from 'react';
-import {
- ButtonLink,
- ComingSoon,
- SectionTitle,
- classNames,
-} from './SharedComponents';
-
-export function Benefits() {
- return (
- <>
-
-
-
-
- >
- );
-}
-
-function DesignSection() {
- return (
-
-
- <>
-
- Design how it works with a
- visual language for everyone on the team (even AI 🤖).
-
-
-
-
-
-
-
- Our drag and drop editor brings together contributors of all
- backgrounds. Code, diagrams, documentation, test generation, and
- more in one place. No more silos. Always up to date.
-
-
-
-
-
-
-
- AI's love helping at each phase with state machines to guide
- them, while humans use the visual editor to audit and enhance
- their work.
-
-
-
-
-
-
-
-
-
- Create flows with no code required . Rapidly
- prototype or gather requirements without worrying about
- technical details.
-
-
- Then simulate your design to test and
- iterate. You can even instantly try out a prototype as an
- auto-generated React app.
-
-
-
-
-
-
-
- Get feedback from your team and clients on how
- everything is supposed to work.
-
-
-
-
-
- Explore community diagrams to inspire your own
- solutions. Share your work with the community to get feedback
- and kudos.
-
-
-
-
-
-
-
-
- Embed Figma designs or attach images and other assets to
- states
- {' '}
- to view mockups, requirements documents, and more
- alongside the code.
-
-
-
-
-
-
- Embedded Figma frames stay in sync with your design
- files.
-
-
-
-
-
-
-
-
- Designers and product managers can fill in how each
- state is supposed to look.
-
-
-
-
-
-
-
-
- Intuitively understand what a state machine does
- with images at each step.
-
-
-
-
-
-
-
-
- Quickly prototype new ideas by experiencing mockups
- using the same logic as your code.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Generate flows with AI to scaffold
- behavior, suggest variants, turn up edge cases, and even
- write code.
-
-
-
-
-
-
- >
-
-
- );
-}
-
-function XStateSection() {
- return (
-
-
-
-
- Build with executable diagrams
- {' '}
- and get the best of text-based and visual tools.
-
-
-
-
-
- Run diagrams using XState , a best-in-class open
- source library for orchestrating and managing state in JavaScript
- and TypeScript apps. No lock-in.
-
-
-
-
- Read XState docs
-
-
- View on Github
-
-
-
-
-
-
-
-
-
-
- Use XState on the frontend, backend, or wherever JavaScript runs
-
- . Integrations are available for React, Vue, Svelte, and other
- frameworks.
-
-
-
-
-
-
- XState uses event-driven programming, state machines, statecharts,
- and the actor model to{' '}
-
- handle even the most complex logic in predictable, robust, and
- visual ways
-
- .
-
-
- Learn more about statecharts
-
-
-
-
-
-
-
-
-
-
- Bidirectional updates between code and
- visualization let you use what makes you most productive.
-
-
-
-
-
-
-
-
-
-
- Automatically visualize Redux, Zustand, and other code
- {' '}
- to get the benefits of Stately in your codebase even without
- XState.
-
-
-
-
-
-
- An IDE extension brings the power of Stately into
- VS Code.
-
-
- Download the VS Code extension
-
-
-
-
-
-
-
-
- Generate React apps from diagrams to
- jumpstart product development. Keep iterating visually with
- the help of AI, or dive straight into the code to rapidly
- extend the scaffolding with your vision.
-
-
-
-
-
-
-
-
-
-
-
-
- Generate tests automatically to keep
- coverage robust and up-to-date.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Export all of your generated code in
- Javascript or Typescript.
-
-
-
-
-
-
-
-
- Connect with Github to sync Stately with your
- codebase.
-
-
-
-
-
-
-
-
-
- Inspect running apps with Stately Inspector to
- help test, and debug your logic.
-
-
- Visualize communication between actors in your
- running app with sequence diagrams.
-
-
-
-
-
-
-
- );
-}
-
-function SourceOfTruthSection() {
- return (
-
-
-
- Products evolve. People are busy.
-
-
- Understand and stay aligned {' '}
- with Stately as the source of truth.
-
-
-
-
-
-
-
-
- Future proof your code with clear
- visualizations that are easy to return to and change later. Even
- years later.
-
-
-
-
-
-
-
-
-
- Living documentation keeps the whole team in
- sync without extra overhead.
-
-
-
-
-
-
-
-
-
-
- Reference an event catalog which is
- automatically generated and can be annotated to provide
- further information.
-
-
-
-
-
-
-
-
- Save versions as backup and to see the history of
- your work.
-
-
-
-
-
-
- Export as markdown stories, Mermaid drawings, or JSON documents
- {' '}
- that can be copied into issues and project documents.
-
-
-
-
-
- Generate diagram summaries to get oriented
- quickly.
-
-
-
-
-
- );
-}
-
-function SkySection() {
- return (
-
-
-
- Deploy to Stately Sky for an
- instant realtime backend.
-
-
-
-
- Want to keep it simple? Design in our visual
- editor, then one-click deploy to our multiplayer ready
- logic-as-a-service Stately Sky.
-
-
-
-
- Send events using our SDK, and{' '}
- we'll update all clients automatically .
-
-
-
-
-
-
-
- A seamless developer experience
-
- Coding against large cloud services is cumbersome, boilerplate
- heavy, and painful to deploy.
- Low/no-code platforms can be inflexible and require vendor lock-in.
-
-
-
- With Stately Sky, simply draw a diagram, generate an API key, and
- click "Deploy".
-
- It also offers reliable export options without any lock-in.
-
-
-
-
-
-
-
-
-
-
-
- Combine the expressiveness and readability of statecharts with
- the durability and fault tolerance of cloud computing by
- running state machines as actors in Sky.
-
-
-
-
-
-
-
-
- Multiplayer collaboration which can be
- useful for whiteboarding, document editing, gaming or many
- other types of apps.
-
-
-
-
-
-
-
- Asynchronous workflows enhance efficiency
- in operations without immediate results, such as data
- processing, email delivery, or API calls.
-
-
-
-
-
-
-
- Long-running backend processes like
- medical patient onboarding flows or inventory management.
-
-
-
-
-
-
-
-
-
- );
-}
-
-function BenefitSection({ anchorLink, children }) {
- return (
-
- );
-}
-
-function Strong({ children }) {
- return (
-
- {children}
-
- );
-}
-
-// Eventually maybe make all bolded text links to doc pages
-// function StrongLink({ children, href = 'https://www.stately.ai/docs' }) {
-// return (
-//
-// {children}
-//
-// );
-// }
-
-function FeatureText({
- children,
- imgSrc = '/landing/DELETE-1.png',
- imgAlt = 'TODO',
-}) {
- return {children}
;
-}
-
-function Feature({
- children,
- comingSoon,
- box,
- imgSrc,
- imgAlt,
- imgHeight,
- imgWidth,
- noPadding,
-}: {
- children: ReactNode;
- comingSoon?: boolean;
- box?: boolean;
- imgSrc?: string;
- imgAlt?: string;
- imgHeight?: string;
- imgWidth?: string;
- noPadding?: boolean;
-}) {
- const boxStyles = box
- ? 'bg-linear-to-b from-gray-800/50 to-gray-800/10 border-[0.5px] shadow-md shadow-blue-900 border-blue-850 rounded-2xl'
- : '';
-
- const paddingStyles = noPadding ? 0 : 'py-6 px-8';
- return (
-
- {children}
- {comingSoon &&
}
- {imgSrc && (
-
- )}
-
- );
-}
-
-function AnimateAwayGradient({ animationClass, children }) {
- const ref = useRef(null);
- const [isIntersecting, setIsIntersecting] = useState(false);
-
- useEffect(() => {
- const observer = new IntersectionObserver(([entry]) => {
- setIsIntersecting(entry.isIntersecting);
- });
- observer.observe(ref.current);
- return () => observer.disconnect();
- }, []);
-
- return (
-
- {children}
-
- );
-}
-
-function FeatureTitle({ children }) {
- return (
-
- {children}
-
- );
-}
diff --git a/src/components/landing/CaseStudies.tsx b/src/components/landing/CaseStudies.tsx
deleted file mode 100644
index 9f2bf2bd0..000000000
--- a/src/components/landing/CaseStudies.tsx
+++ /dev/null
@@ -1,80 +0,0 @@
-import {
- ButtonLink,
- ComingSoon,
- SectionTitle,
- classNames,
-} from './SharedComponents';
-
-export function CaseStudies() {
- return (
-
-
-
Built with Stately
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-function Quote({
- quote,
- href,
- quoter,
-}: {
- quote: string;
- quoter: string;
- href: string;
-}) {
- return (
-
-
- “{quote}”
-
-
- {quoter}
-
- Read case study
-
-
- );
-}
diff --git a/src/components/landing/FinalCallToAction.tsx b/src/components/landing/FinalCallToAction.tsx
deleted file mode 100644
index cd7993f7a..000000000
--- a/src/components/landing/FinalCallToAction.tsx
+++ /dev/null
@@ -1,26 +0,0 @@
-import { ButtonLink, SectionTitle } from './SharedComponents';
-
-export function FinalCallToAction() {
- return (
-
-
-
- Intelligent logic to transition from design to deployment,{' '}
- and back again.
-
-
-
-
- Sign up for free
-
-
- Book a demo
-
-
-
- );
-}
diff --git a/src/components/landing/Footer.tsx b/src/components/landing/Footer.tsx
deleted file mode 100644
index 623080174..000000000
--- a/src/components/landing/Footer.tsx
+++ /dev/null
@@ -1,154 +0,0 @@
-import Link from '@docusaurus/Link';
-
-export function Footer() {
- return (
-
- );
-}
-
-function AllLinks() {
- return (
-
-
-
-
-
-
- © {new Date().getFullYear()} Stately
-
-
-
- Features
- Documentation
- XState
- Stately Agent
-
- Case studies
-
- Pricing
-
-
- Changelog
- Blog
- Contact
-
-
- Privacy policy
- Code of conduct
-
-
-
- Discord
- Twitter
- YouTube
-
- LinkedIn
-
-
-
- );
-}
-
-function LinkList({ children, title }) {
- return (
-
- );
-}
-
-function LinkItem({ href, children }) {
- return (
-
-
- {children}
-
-
- );
-}
-
-function Newsletter() {
- return (
-
-
- Get updates by email
-
-
-
- );
-}
-
-function DiscordCommunity() {
- return (
-
-
- Be part of a friendly and helpful community
-
-
-
- Join our Discord
- {' '}
- to give us feedback and get support. And participate in our{' '}
-
- Office Hours
- {' '}
- for previews and announcements with the Stately team.
-
-
- );
-}
diff --git a/src/components/landing/Intro.tsx b/src/components/landing/Intro.tsx
deleted file mode 100644
index eaaa0da8b..000000000
--- a/src/components/landing/Intro.tsx
+++ /dev/null
@@ -1,148 +0,0 @@
-import { ButtonLink } from './SharedComponents';
-
-export function Intro() {
- return (
-
-
-
- Turn ideas into diagrams and code in minutes.
-
-
-
-
- From frontend user flows to backend workflows, visually build and
- deploy any type of logic with Stately as your source of truth.
-
-
-
-
-
-
-
-
-
-
- Want to get your team onboarded with XState or Stately? Whether it's
- consulting sessions, XState workshops, or a custom solution, we're
- here to help!
-
-
- Contact us
-
-
-
-
- );
-}
-
-function CallToActionButtons() {
- return (
-
-
- Try the visual editor
-
-
- Book a demo
-
-
- );
-}
-
-function Companies() {
- return (
-
-
-
-
-
-
-
-
-
- );
-}
-
-function Company({ src, alt, height, width }) {
- return (
-
- );
-}
-
-// function PromoVideo() {
-// return (
-//
-//
-// Video is unavailable in your browser.
-//
-// );
-// }
diff --git a/src/components/landing/Lifecycle.tsx b/src/components/landing/Lifecycle.tsx
deleted file mode 100644
index add24b6e6..000000000
--- a/src/components/landing/Lifecycle.tsx
+++ /dev/null
@@ -1,335 +0,0 @@
-import { ButtonLink, ComingSoon, classNames } from './SharedComponents';
-
-export function Lifecycle() {
- return (
-
-
- Stately transitions your team through the product lifecycle.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
-
-const boxStyles =
- 'flex h-fit w-fit max-w-6xl rounded-3xl bg-linear-to-b from-gray-800/50 to-gray-800/10 border border-[0.5px] shadow-md shadow-blue-900 border-blue-850 py-6 px-8 gap-12';
-
-const imgStyles =
- 'max-w-2xl rounded-md border-[0.5px] shadow-2xl shadow-blue-900 border-blue-850 h-96 w-full';
-
-function DesignSection() {
- return (
-
-
- Collaborate on robust app logic with a visual
- language that everyone on the team can understand.
-
-
- Generate flows with AI to scaffold behavior,
- suggest variants, turn up edge cases, and even write code.
-
-
-
- Simulate your logic to test and iterate.
-
-
-
- Run realistic simulations with live code in the visual editor.
- Prototype experiences by attaching mockups to states.
-
-
-
- Get feedback from your team and your clients on
- how everything is supposed to work.
-
-
-
- Explore community diagrams for inspiration on
- your own solutions. Then share your work back with the community to get
- feedback and kudos.
-
-
- );
-}
-
-function BuildSection() {
- return (
-
-
- Give your coding superpowers by getting the
- best of both text and visual tools.
-
-
-
-
-
- Bidirectional updates between code and
- visualization let you use what makes you most productive.
-
-
-
- Create legacy-proof code that is easy to
- understand and change later.
-
-
-
- Generate tests automatically to keep them
- robust and up-to-date.
-
-
-
- An IDE extension brings the power of
- Stately into VS Code.
-
-
- Download the VS Code extension
-
-
-
- Save versions as backup and to see the history of
- your work.
-
-
-
-
- Connect with Github to sync Stately with
- your code.
-
-
-
-
-
-
- Rapidly build workflows with integration templates
- {' '}
- in the visual editor. Especially when AI helps generate the code.
-
-
-
-
-
-
-
-
- Inspect running apps in the visual editor to help
- build, test, and debug your logic.
-
-
-
-
-
-
-
-
-
- Use state machines and statecharts to create
- reliable, resilient behaviors.
-
-
- Statecharts make state management simpler. Get an overview of how
- your application works at a glance. Find states that are often
- missed, including unwanted states, impossible states and
- unnecessary error states. As well as eliminating bugs and other
- issues caused by boolean-based state management.
-
-
-
- Learn more about statecharts
-
-
-
-
-
- {/*
-
- Drag around when functions are called in your code
- {' '}
- with visual effect blocks to make managing complex logic intuitive
- and simple.
-
*/}
-
-
- );
-}
-
-function ShipSection() {
- return (
-
-
- Deploy flows to Stately Sky to keep realtime state
- syncing simple.
-
-
- Send events from your code using our SDK to update state across clients
- automatically.
-
-
-
-
-
-
- );
-}
-
-function UnderstandSection() {
- return (
-
-
- Analyze, iterate, and align with Stately as the
- source of truth for your logic.
-
-
-
-
- Use living documentation that can keep the whole team
- in sync without extra overhead.
-
-
- Export flows as Mermaid, markdown, or JSON documents {' '}
- that can be copied into issues and project documents.
-
-
-
- Visualize communication between actors in a system
- with sequence diagrams.
-
-
-
-
-
-
-
- Catalog events automatically in an easy to use format.
-
-
And start the process again.
-
- );
-}
-
-function LifecycleStep({ num, title, color, children }) {
- const numberBgColor =
- color === 'pink'
- ? 'bg-pink-600'
- : color === 'green'
- ? 'bg-green-600'
- : color === 'purple'
- ? 'bg-purple-600'
- : color === 'orange'
- ? 'bg-orange-600'
- : color === 'teal'
- ? 'bg-teal-600'
- : 'text-gray-600';
- const otherNumberStyles = `flex justify-center items-center rounded-full w-16 h-16 select-none shadow-lg`;
- const numberStyles = classNames(numberBgColor, otherNumberStyles);
-
- const otherTextStyles = 'font-extrabold text-6xl pl-8 drop-shadow-sm';
- const textStyles = classNames('text-white/90', otherTextStyles);
-
- // const headerColor =
- // color === 'pink'
- // ? 'bg-linear-to-b from-pink-900 to-blue-950 border-t border-t-pink-600/40'
- // : color === 'green'
- // ? 'bg-linear-to-b from-green-900 to-blue-950 border-t border-t-green-600/40 '
- // : color === 'purple'
- // ? 'bg-linear-to-b from-purple-800 to-blue-950 border-t border-t-purple-600/40'
- // : color === 'orange'
- // ? 'bg-linear-to-b from-orange-800 to-blue-950 border-t border-t-orange-600/40'
- // : color === 'teal'
- // ? 'bg-linear-to-b from-teal-800 to-blue-950 border-t border-t-teal-600/40'
- // : '';
-
- return (
- <>
-
- {children}
- >
- );
-}
-
-function Strong({ children }) {
- return (
-
- {children}
-
- );
-}
-
-function StrongLink({ children, href = 'https://www.stately.ai/docs' }) {
- return (
-
- {children}
-
- );
-}
-
-function FeatureLeftImage({ children, imgSrc = '/landing/DELETE-1.png' }) {
- return (
-
-
-
- {children}
-
-
- );
-}
-
-function FeatureRightImage({ children, imgSrc = '/landing/DELETE-1.png' }) {
- return (
-
-
- {children}
-
-
-
- );
-}
-
-function FeatureText({ children, imgSrc = '/landing/DELETE-1.png' }) {
- return (
-
- );
-}
-
-function FeatureBox({ children, imgSrc = '/landing/DELETE-1.png' }) {
- return (
-
- );
-}
diff --git a/src/components/landing/Navbar.tsx b/src/components/landing/Navbar.tsx
deleted file mode 100644
index 738b9540b..000000000
--- a/src/components/landing/Navbar.tsx
+++ /dev/null
@@ -1,271 +0,0 @@
-import { MenuIcon, XIcon } from 'lucide-react';
-import { Fragment, ReactNode } from 'react';
-import { ButtonLink } from './SharedComponents';
-const { Disclosure, Menu, Transition } = require('@headlessui/react');
-
-const navigation = [
- { name: 'Docs', href: '/docs', current: false },
- {
- name: 'Case Studies',
- href: ' https://stately.ai/blog/tags/case-study',
- current: false,
- },
- { name: 'Blog', href: '/blog', current: false },
- { name: 'Pricing', href: '/pricing', current: false },
-];
-
-function classNames(...classes) {
- return classes.filter(Boolean).join(' ');
-}
-
-export function Navbar() {
- return (
-
- {({ open }) => (
- <>
-
-
-
- {/* Mobile menu button*/}
-
-
- Open main menu
- {open ? (
-
- ) : (
-
- )}
-
-
-
-
-
-
-
-
- {navigation.map((item) => (
-
- {item.name}
-
- ))}
-
-
-
-
-
-
- Log in
-
-
- Sign up
-
-
-
-
-
-
-
- {navigation.map((item) => (
-
- {item.name}
-
- ))}
-
- Log in
-
-
- Sign up
-
-
-
-
- >
- )}
-
- );
-}
-
-function FeaturesMenu() {
- return (
-
-
-
- Features
-
-
-
-
- Design
- Build
- Deploy
- Understand
-
- AI Agents
-
-
-
-
- );
-}
-
-const linkStyles =
- 'inline-flex items-center justify-center rounded-full px-3 py-2 text-sm font-medium no-underline hover:no-underline text-white font-semibold focus:outline-none focus:ring-1 focus:ring-blue-300 focus:ring-offset-1 focus:ring-offset-gray-800 cursor-pointer hover:bg-white/10';
-
-function NavLink({
- children,
- isCurrent,
- href,
- target,
-}: {
- children: ReactNode;
- isCurrent?: boolean;
- href: string;
- target?: '_blank' | '_self';
-}) {
- return (
-
- {children}
-
- );
-}
-
-function NavMenuItem({ children, href }) {
- return (
-
- {({ active }) => (
-
- {children}
-
- )}
-
- );
-}
-
-// TODO: use Docusaurus links
-{
- /* */
-}
diff --git a/src/components/landing/SharedComponents.tsx b/src/components/landing/SharedComponents.tsx
deleted file mode 100644
index 27618a73b..000000000
--- a/src/components/landing/SharedComponents.tsx
+++ /dev/null
@@ -1,96 +0,0 @@
-import { ReactNode } from 'react';
-
-export function ButtonLink({
- children,
- background,
- href,
- target = '_blank',
- rel,
- size = 'small',
-}: {
- children: ReactNode;
- background?: 'blue' | 'pink' | 'darkBlue' | 'orange';
- href: string;
- target?: '_blank' | '_self';
- rel?: string;
- size?: 'small' | 'medium' | 'large';
-}) {
- // Tailwind does not support string interpolation
- const bg =
- background === 'blue'
- ? 'bg-blue-600'
- : background === 'pink'
- ? 'bg-pink-600'
- : background === 'darkBlue'
- ? 'bg-blue-850'
- : background === 'orange'
- ? 'bg-orange-600'
- : 'bg-gray-800';
-
- // TODO: make medium default, but check all uses of ButtonLink
- const sizeStyles =
- size === 'small'
- ? 'h-8 text-sm px-3'
- : size === 'large'
- ? ' h-16 text-base md:text-lg px-6'
- : size === 'medium'
- ? 'h-12 text-base px-4'
- : 'h-12 text-base px-4';
-
- const text = `text-base font-semibold text-gray-50 no-underline`;
- const layout =
- 'inline-flex items-center justify-center rounded-full whitespace-nowrap';
- const various =
- 'w-fit shadow-md cursor-pointer touch-none select-none transform-gpu transition';
- const disabled = 'disabled:opacity-50 disabled:cursor-not-allowed';
- const hover =
- 'hover:before:opacity-50 hover:text-white hover:no-underline before:pointer-events-none before:bg-linear-to-b before:from-white/12 before:absolute before:inset-0 before:rounded-full before:opacity-0 before:transition-opacity';
-
- const buttonLinkStyles = classNames(
- bg,
- sizeStyles,
- text,
- layout,
- various,
- disabled,
- hover,
- );
-
- return (
-
- {children}
-
- );
-}
-
-export function classNames(...classes) {
- return classes.filter(Boolean).join(' ');
-}
-
-export function ComingSoon() {
- return (
-
- Coming to Stately Studio soon
-
- );
-}
-
-export function SectionTitle({ children }) {
- return (
-
- {children}
-
- );
-}
-
-export function TextLink({ href, target = '_blank', children }) {
- return (
-
- {children}
-
- );
-}
diff --git a/src/components/landing/StatelyAgent.tsx b/src/components/landing/StatelyAgent.tsx
deleted file mode 100644
index ad4d7d14d..000000000
--- a/src/components/landing/StatelyAgent.tsx
+++ /dev/null
@@ -1,232 +0,0 @@
-import React from 'react';
-import { TextLink, classNames, ButtonLink } from './SharedComponents';
-import { GithubIcon } from 'lucide-react';
-import { Highlight, themes } from 'prism-react-renderer';
-import { joke } from './agent-examples';
-
-export function StatelyAgent() {
- return (
- <>
-
-
-
-
-
- Try out Stately Agent and XState
-
-
- >
- );
-}
-
-function AgentIntro() {
- return (
-
-
-
- Build reliable AI agents with state machines.
-
-
-
-
- Stately Agent
- {' '}
- enhances{' '}
- XState {' '}
- with actors that make it easy to harness the power of LLMs.
-
-
-
-
- Guide the agent with a pipeline of distinct steps that can be
- created visually using{' '}
- Stately Studio .
-
-
-
-
- Agents can decide which action to take from the events available{' '}
- at the current step .
-
-
-
-
-
- Cycles let agents try steps again, perhaps with a refined input.
-
-
-
-
-
-
-
-
- Write familiar JavaScript/TypeScript. Full control.
- No lock-in. Open source.
-
-
-
- Read the docs
-
-
-
-
-
- );
-}
-
-function CodeExample() {
- return (
-
- How Stately Agent works.
-
-
-
-
-
- See complete examples
-
-
-
- );
-}
-
-export const Code = ({ code }) => (
-
- {({ style, tokens, getLineProps, getTokenProps }) => (
-
- {tokens.map((line, i) => (
-
- {line.map((token, key) => (
-
- ))}
-
- ))}
-
- )}
-
-);
-
-function Benefits() {
- return (
-
- Why use state machines with LLMs?
-
-
-
- Data can be processed in consistent, predictable ways.
-
-
-
-
- Performance can be improved by focusing on one crisply defined
- subtask at a time.
-
-
-
-
- Work can be distributed with subtasks being handled in different,
- explicitly designed ways.
-
-
-
-
- The output of each step can be validated, tested, and improved
- independently.
-
-
-
-
- They can be easier to maintain as requirements change and new AI
- capabilities are released.
-
-
-
-
- Easily connect multiple models and services, swapping out components
- as the frontier advances.
-
-
-
-
- );
-}
-
-function H2({
- children,
- color,
- styleOverrides,
-}: {
- children: React.ReactNode;
- color?: string;
- styleOverrides?: string;
-}) {
- const numberBgColor =
- color === 'pink'
- ? 'bg-pink-600'
- : color === 'green'
- ? 'bg-green-600'
- : color === 'purple'
- ? 'bg-purple-600'
- : color === 'orange'
- ? 'bg-orange-600'
- : color === 'teal'
- ? 'bg-teal-600'
- : 'text-gray-600';
- const otherNumberStyles = `flex justify-center items-center rounded-full w-16 h-16 select-none shadow-lg`;
-
- const otherTextStyles = 'font-extrabold text-5xl pl-8 drop-shadow-sm';
-
- const textStyles = classNames(
- 'text-white/90',
- otherTextStyles,
- styleOverrides,
- );
- return {children} ;
-}
-
-function FeatureBox({ children, imgSrc = '/landing/DELETE-1.png' }) {
- return (
-
- {children}
-
- );
-}
-
-function P({ children, color = 'text-white/60' }) {
- const otherTextStyles =
- 'm-auto max-w-xl mt-12 mb-12 text-lg tracking-tight md:text-xl lg:text-2xl leading-normal md:leading-normal lg:leading-normal text-white/60 drop-shadow-sm';
- const textStyles = classNames('text-white/90', otherTextStyles);
- return {children}
;
-}
-
-function FeatureP({ children }) {
- return (
-
- {children}
-
- );
-}
-
-function P2({ children }) {
- const otherTextStyles =
- 'm-auto max-w-2xl mt-12 mb-12 text-lg tracking-tight md:text-xl lg:text-2xl leading-normal md:leading-normal lg:leading-normal text-white/60 drop-shadow-sm';
- const textStyles = classNames('text-white/90', otherTextStyles);
- return {children}
;
-}
diff --git a/src/components/landing/Summary.tsx b/src/components/landing/Summary.tsx
deleted file mode 100644
index 3538479ed..000000000
--- a/src/components/landing/Summary.tsx
+++ /dev/null
@@ -1,149 +0,0 @@
-import { ReactNode } from 'react';
-import { ButtonLink, classNames, ComingSoon } from './SharedComponents';
-
-export function Summary() {
- return (
- <>
- {/* */}
-
- >
- );
-}
-
-// function Examples() {
-// return (
-//
-//
-// Your assistant for
-//
-//
-// Chatbots
-// Backend workflows
-// Onboarding
-// Auth
-// Prototypes
-// Requirements meetings
-// . . .
-//
-//
-// );
-// }
-
-function SummaryList() {
- return (
-
-
-
- Our visual editor brings together contributors of all backgrounds.
- Code, diagrams, documentation, test generation, and more in one place.
-
- No more silos. Always up to date.
-
-
-
-
- A best-in-class open source library for handling complexity at
- scale.
-
-
- Use our drag-and-drop visual editor to build your application logic,
- then export it directly into your XState project.
-
- No lock-in.
-
-
-
- Want to keep it simple? Design in our visual editor, then send
- events to Stately using our SDK and let us handle your backend with
- support for realtime multiplayer.
-
-
-
-
-
-
-
- );
-}
-// function SummaryListItemOld({
-// title,
-// details,
-// href,
-// linkText,
-// }: {
-// title: string;
-// details: string;
-// href?: string;
-// linkText?: string;
-// }) {
-// return (
-//
-// {title}
-// {details}
-// {href && linkText && (
-//
-//
-// {linkText}
-//
-//
-// )}
-//
-// );
-// }
-
-function SummaryListItem({
- title,
- children,
- href,
- linkText,
- full,
- imgSrc,
- boxBg,
-}: {
- children: ReactNode;
- full?: boolean;
- imgSrc?: string;
- boxBg?: boolean;
- title: string;
- href?: string;
- linkText?: string;
-}) {
- const width = full ? 'w-full' : 'flex-1';
- const boxStyles =
- boxBg &&
- 'rounded-3xl bg-linear-to-b from-gray-800/50 to-gray-800/10 border border-[0.5px] shadow-md shadow-blue-900 border-blue-850';
- const otherStyles = 'm-6 py-8 px-12 flex gap-16 justify-center';
- const itemStyles = classNames(width, boxStyles, otherStyles);
- return (
-
- {imgSrc &&
}
-
-
- {title}
-
-
{children}
- {href && linkText && (
-
-
- {linkText}
-
-
- )}
-
-
- );
-}
diff --git a/src/components/landing/Testimonials.tsx b/src/components/landing/Testimonials.tsx
deleted file mode 100644
index 6a8799b69..000000000
--- a/src/components/landing/Testimonials.tsx
+++ /dev/null
@@ -1,110 +0,0 @@
-import { SectionTitle } from './SharedComponents';
-
-export function Testimonials() {
- return (
-
-
- Loved by teams
-
-
-
-
-
- Every team where I introduced XState has been more effective at
- handling state management with complex user interfaces. It fills a
- gap in the JS ecosystem no other tool did before.
-
-
- We've been using XState for our new payments product. Shout out to
- the team that is making designing complex front-end flows a dream.
-
-
- XState is a revelation. It makes complex tasks easier to build and
- debug while also making the code more straightforward and
- approachable.
-
-
-
-
-
-
- XState naturally separates the logic and makes it simple to mock
- out API calls, so it's easier to test the code and organize it!
-
-
-
- We use XState to implement business workflows as statecharts. The
- visualizer helps us collaborate more closely with customers, the
- ability to externalize workflows as JSON configuration makes
- complex workflow changes surprisingly simple to roll out, and test
- case generation makes it easier than ever to move forward with
- confidence. XState makes it all possible!
-
-
-
-
-
-
- Advantages of XState: Visually clear view of the code flow, code
- reusability, test coverage, easy to debug/ spot bugs, code
- scalability & maintenance, and better code design & planning.
-
-
- Thinking and building with XState has been a revolution in how I
- develop robust business logic. But being able to visualize that in
- real time, has been a game changer in how I model and communicate
- any logic!
-
-
-
-
-
- );
-}
-
-function Testimonial({ imgSrc, name, company, children }) {
- return (
-
-
-
-
-
-
-
{name}
-
- @ {company}
-
-
-
- {children}
-
- );
-}
diff --git a/src/components/landing/agent-examples.ts b/src/components/landing/agent-examples.ts
deleted file mode 100644
index d1cfcd9f4..000000000
--- a/src/components/landing/agent-examples.ts
+++ /dev/null
@@ -1,78 +0,0 @@
-export const joke = `// Stately Agents are XState actors that are guided by a state machine.
-// They can send and receive events, spawn other agents,
-// and make decisions based on their current state.
-// To set one up we need to give it abilities then define its internal state machine.
-
-import OpenAI from 'openai';
-import { fromPromise, setup } from 'xstate';
-import { createAgent, createOpenAIAdapter } from '@statelyai/agent';
-import { jokeRater } from './agents';
-
-// 1. Create an LLM adapter.
-const openai = new OpenAI({
- apiKey: process.env.OPENAI_API_KEY,
-});
-
-const llmAdapter = createOpenAIAdapter(openai, {
- model: 'gpt-3.5-turbo-1106',
-});
-
-// 2. Set up the abilities the agent will use.
-// fromChat() lets the agent perform tasks using a basic prompt template.
-const getJokeCompletion = llmAdapter.fromChat(
- (topic: string) => \`Tell me a joke about \${topic}.\`
-);
-
-// fromEvent() lets the agent decide what to do based on the prompt
-// from the events connected to the current state.
-const decide = llmAdapter.fromEvent(
- (lastRating: string) =>
- \`Choose what to do next, given the previous rating of the joke: \${lastRating}\`
-);
-
-// Not all abilities need to involve LLM processing.
-const getTopic = fromPromise(async () => {
- const topic = await new Promise((res) => {
- console.log('Give me a joke topic:');
- const listener = (data: Buffer) => {
- const result = data.toString().trim();
- process.stdin.off('data', listener);
- res(result);
- };
- process.stdin.on('data', listener);
- });
- return topic;
-});
-
-const schemas = createSchemas({
- // ... Define schemas ...
-});
-
-// 3. Create a state machine that describes the agent's behavior.
-const jokerAgentLogic = setup({
- schemas,
- types: schemas.types,
- actors: {
- getJokeCompletion,
- getTopic,
- rateJoke: jokeRater,
- decide,
- },
-}).createMachine(
- // ... Define an XState machine that invokes abilities as needed ...
-);
-
-// 4. Create the agent and start it.
-const agent = createAgent(jokerAgentLogic);
-agent.start();
-
-// 5. Use the agent.
-// Send events to the agent to give it instructions.
-// How it handles them will depend on its current state.
-// This gives developers more safety and control.
-agent.send({ type: 'giveTopic', topic: 'chickens' });
-
-// See what the agent is doing at any time.
-agent.subscribe((state) => {
- console.log(state.value, state.context);
-})`;
diff --git a/src/css/custom.css b/src/css/custom.css
deleted file mode 100644
index 05689ff14..000000000
--- a/src/css/custom.css
+++ /dev/null
@@ -1,1964 +0,0 @@
-/**
- * Any CSS included here will be global. The classic template
- * bundles Infima by default. Infima is a CSS framework designed to
- * work well for content-centric websites.
- */
-
-@font-face {
- font-family: 'Inter';
- src: url('/inter-regular.woff2') format('woff2');
- font-display: swap;
- font-weight: 100 1000;
- font-style: normal;
-}
-
-@font-face {
- font-family: 'Inter';
- src: url('/inter-italic.woff2') format('woff2');
- font-display: swap;
- font-weight: 100 1000;
- font-style: italic;
-}
-
-html,
-body {
- background-color: var(--st-background);
- font-weight: var(--ifm-font-weight-normal);
- letter-spacing: -0.011rem;
- line-height: 1.625;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-}
-
-/* editor’s colours */
-:root {
- /* Yellow */
- --st-yellow-50: rgba(254, 253, 192, 0.5);
- --st-yellow-100: #fefcbf;
- --st-yellow-200: #faf089;
- --st-yellow-300: #f6e05e;
- --st-yellow-400: #ecc94b;
- --st-yellow-500: #d69e2e;
- --st-yellow-600: #b7791f;
- --st-yellow-700: #975a16;
- --st-yellow-800: #744210;
- --st-yellow-900: #5f370e;
-
- /* Pink */
- --st-pink-900: #370022;
- --st-pink-800: #670045;
- --st-pink-700: #a3006e;
- --st-pink-600: #cf008f;
- --st-pink-500: #e900a4;
- --st-pink-400: #ff66d8;
- --st-pink-300: #ffa0f3;
- --st-pink-200: #ffbafc;
- --st-pink-100: #ffd5ff;
- --st-pink-50: #ffeaff;
-
- /* Orange */
- --st-orange-900: #330600;
- --st-orange-800: #5f1700;
- --st-orange-700: #942f02;
- --st-orange-600: #b93d00;
- --st-orange-500: #db4206;
- --st-orange-400: #ff7f2c;
- --st-orange-300: #ffac7b;
- --st-orange-200: #ffc390;
- --st-orange-100: #ffdcbc;
- --st-orange-50: #ffede1;
-
- /* Green */
- --st-green-900: #02190a;
- --st-green-800: #003819;
- --st-green-700: #035c2a;
- --st-green-600: #007719;
- --st-green-500: #008931;
- --st-green-400: #0fb84c;
- --st-green-300: #67d770;
- --st-green-200: #8be48b;
- --st-green-100: #b3f1b0;
- --st-green-50: #d2fad3;
-
- /* Turquoise */
- --st-turquoise-900: #011725;
- --st-turquoise-800: #00344b;
- --st-turquoise-700: #005675;
- --st-turquoise-600: #016f8e;
- --st-turquoise-500: #01819b;
- --st-turquoise-400: #01b2c5;
- --st-turquoise-300: #4fd2df;
- --st-turquoise-200: #84dee9;
- --st-turquoise-100: #afedf1;
- --st-turquoise-50: #d6f7f9;
-
- /* Blue */
- --st-blue-900: #1a365d;
- --st-blue-800: #2a4365;
- --st-blue-700: #2c5282;
- --st-blue-600: #2b6cb0;
- --st-blue-500: #3182ce;
- --st-blue-400: #4299e1;
- --st-blue-300: #63b3ed;
- --st-blue-200: #90cdf4;
- --st-blue-100: #bee3f8;
- --st-blue-50: #ebf8ff;
-
- /* Violet */
- --st-violet-900: #1a0a41;
- --st-violet-800: #38197e;
- --st-violet-700: #632fc1;
- --st-violet-600: #7a42e4;
- --st-violet-500: #8c5ae9;
- --st-violet-400: #b690f4;
- --st-violet-300: #d4b6fb;
- --st-violet-200: #ddc9fc;
- --st-violet-100: #f0dcfd;
- --st-violet-50: #fcecff;
-
- /* Gray */
- --st-gray-900: #15151d;
- --st-gray-850: #212226;
- --st-gray-825: #27282a;
- --st-gray-800: #2d2e34;
- --st-gray-700: #45464f;
- --st-gray-600: #5d5f6a;
- --st-gray-500: #757785;
- --st-gray-400: #8f919d;
- --st-gray-300: #abacb5;
- --st-gray-200: #c6c7cd;
- --st-gray-100: #e1e2e5;
- --st-gray-50: #efeff1;
- --st-gray-25: #f7f8fa;
-
- /* Red */
- --st-red-900: #30060a;
- --st-red-800: #62101d;
- --st-red-700: #a21721;
- --st-red-600: #ca2023;
- --st-red-500: #e53035;
- --st-red-400: #fd7c7b;
- --st-red-300: #fdafab;
- --st-red-200: #fbc5bb;
- --st-red-100: #fedcd6;
- --st-red-50: #ffede7;
-}
-
-/* Override the default Infima variables here. */
-:root {
- --ifm-font-family-base: Inter, Helvetica, 'Helvetica Neue', Arial, sans-serif;
- --ifm-font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas,
- 'Liberation Mono', 'Courier New', monospace;
- --ifm-font-size-base: 100%;
- --ifm-line-height-base: 1.45;
- --ifm-h1-vertical-rhythm-top: 3;
- --ifm-h2-vertical-rhythm-top: 2;
- --ifm-h3-vertical-rhythm-top: 1.5;
- --ifm-heading-vertical-rhythm-top: 1.25;
- --ifm-h1-vertical-rhythm-bottom: 1.25;
- --ifm-heading-vertical-rhythm-bottom: 1;
- --ifm-link-decoration: underline;
- --docusaurus-highlighted-code-line-bg: var(--st-code-highlight-background);
- --ifm-heading-vertical-rhythm-bottom: 0.75;
- --ifm-footer-background-color: var(--st-background);
- --ifm-code-background: var(--st-code-highlight-background);
- --ifm-code-border-radius: 0.25em;
- --ifm-code-font-size: 95%;
- --ifm-code-padding-horizontal: 0.3rem;
- --ifm-code-padding-vertical: 0.1rem;
- --ifm-global-shadow-lw: none;
- --ifm-color-secondary: var(--st-text-secondary);
- --ifm-color-success: #00a400;
- --ifm-color-info: #54c7ec;
- --ifm-color-warning: #ffba00;
- --ifm-color-danger: #fa383e;
- --ifm-color-primary: var(--st-text);
- --ifm-color-primary-dark: var(--st-text);
- --ifm-color-primary-darker: var(--st-text);
- --ifm-color-primary-darkest: var(--st-text);
- --ifm-color-primary-light: var(--st-text);
- --ifm-color-primary-lighter: var(--st-text);
- --ifm-color-primary-lightest: var(--st-text);
- --ifm-color-primary-contrast-background: white;
- --ifm-color-primary-contrast-foreground: var(--st-text);
- --ifm-color-secondary-dark: var(--st-text);
- --ifm-color-secondary-darker: var(--st-text);
- --ifm-color-secondary-darkest: var(--st-text);
- --docusaurus-details-decoration-color: var(--st-text);
- --ifm-color-secondary-light: white;
- --ifm-color-secondary-lighter: white;
- --ifm-color-secondary-lightest: white;
- --ifm-color-secondary-contrast-background: var(--gray-800);
- --ifm-color-secondary-contrast-foreground: white;
- --ifm-color-success-dark: var(--st-turquoise-700);
- --ifm-color-success-darker: var(--st-turquoise-800);
- --ifm-color-success-darkest: var(--st-turquoise-900);
- --ifm-color-success-light: var(--st-green-200);
- --ifm-color-success-lighter: var(--st-green-100);
- --ifm-color-success-lightest: var(--st-green-50);
- --ifm-color-success-contrast-background: var(--ifm-color-success-lightest);
- --ifm-color-success-contrast-foreground: var(--ifm-color-success-darker);
- --ifm-color-info-dark: var(--st-blue-700);
- --ifm-color-info-darker: var(--st-blue-800);
- --ifm-color-info-darkest: var(--st-blue-900);
- --ifm-color-info-light: var(--st-blue-200);
- --ifm-color-info-lighter: var(--st-blue-100);
- --ifm-color-info-lightest: var(--st-blue-50);
- --ifm-color-info-contrast-background: var(--ifm-color-info-lightest);
- --ifm-color-info-contrast-foreground: var(--ifm-color-info-darker);
- --ifm-color-warning-dark: var(--st-orange-700);
- --ifm-color-warning-darker: var(--st-orange-800);
- --ifm-color-warning-darkest: var(--st-orange-900);
- --ifm-color-warning-light: var(--st-orange-200);
- --ifm-color-warning-lighter: var(--st-orange-100);
- --ifm-color-warning-lightest: var(--st-orange-50);
- --ifm-color-warning-contrast-background: var(--ifm-color-warning-lightest);
- --ifm-color-warning-contrast-foreground: var(--ifm-color-warning-darker);
- --ifm-color-danger-dark: var(--st-red-700);
- --ifm-color-danger-darker: var(--st-red-800);
- --ifm-color-danger-darkest: var(--st-red-900);
- --ifm-color-danger-light: var(--st-red-200);
- --ifm-color-danger-lighter: var(--st-red-100);
- --ifm-color-danger-lightest: var(--st-red-50);
- --ifm-color-danger-contrast-background: var(--ifm-color-danger-lightest);
- --ifm-color-danger-contrast-foreground: var(--ifm-color-danger-darker);
- --ifm-color-white: #fff;
- --ifm-color-black: #000;
- --ifm-color-gray-0: var(--st-gray-50);
- --ifm-color-gray-100: var(--st-gray-100);
- --ifm-color-gray-200: var(--st-gray-200);
- --ifm-color-gray-300: var(--st-gray-300);
- --ifm-color-gray-400: var(--st-gray-400);
- --ifm-color-gray-500: var(--st-gray-500);
- --ifm-color-gray-600: var(--st-gray-600);
- --ifm-color-gray-700: var(--st-gray-700);
- --ifm-color-gray-800: var(--st-gray-800);
- --ifm-color-gray-850: var(--st-gray-900);
- --ifm-color-gray-900: var(--st-gray-900);
- --ifm-color-gray-1000: var(--ifm-color-black);
-
- --ifm-color-emphasis-0: var(--ifm-color-gray-900);
- --ifm-color-emphasis-100: var(--ifm-color-gray-100);
- --ifm-color-emphasis-200: var(--ifm-color-gray-200);
- --ifm-color-emphasis-300: var(--ifm-color-gray-300);
- --ifm-color-emphasis-400: var(--ifm-color-gray-400);
- --ifm-color-emphasis-500: var(--ifm-color-gray-500);
- --ifm-color-emphasis-600: var(--ifm-color-gray-600);
- --ifm-color-emphasis-700: var(--ifm-color-gray-700);
- --ifm-color-emphasis-800: var(--ifm-color-gray-800);
- --ifm-color-emphasis-850: var(--ifm-color-gray-900);
- --ifm-color-emphasis-900: var(--ifm-color-gray-900);
- --ifm-color-emphasis-1000: var(--ifm-color-gray-900);
- --ifm-background-color: var(--st-background);
- --ifm-background-surface-color: var(--st-background);
- --ifm-hover-overlay: lightgrey;
- --ifm-link-color: var(--st-text-link);
- --ifm-link-hover-color: var(--st-text-link-hover);
- --ifm-pre-background: var(--st-codeblock-background);
- --ifm-heading-color: var(--st-heading);
- --ifm-color-content: var(--st-text);
- --ifm-color-content-inverse: var(--ifm-color-white);
- --ifm-color-content-secondary: var(--ifm-color-gray-700);
- --ifm-font-color-base: var(--st-text);
- --ifm-font-color-base-inverse: var(--ifm-color-content-inverse);
- --ifm-font-color-secondary: var(--ifm-color-content-secondary);
-
- /* announcement bar */
-
- --announcement-background: var(--st-announcement-bar-gradient);
- --announcement-text: var(--st-announcement-bar-text);
-
- /* navbar */
-
- --ifm-navbar-background-color: var(--st-navbar-background);
- --ifm-navbar-shadow: none;
- --ifm-navbar-link-color: var(--st-header-link);
- --ifm-dropdown-hover-background-color: var(--st-highlight-background);
- --ifm-dropdown-link-color: var(--st-navbar-link-color);
- --ifm-link-color: var(--st-navbar-link-color);
-
- /* breadcrumbs */
- --ifm-breadcrumb-size-multiplier: 1;
- --ifm-breadcrumb-border-radius: 0.75rem;
- --ifm-breadcrumb-padding-horizontal: 0.5rem;
- --ifm-breadcrumb-item-background-active: var(--st-highlight-background);
- --ifm-breadcrumb-color-active: var(--st-text-highlight);
-
- /* menu sidebar */
-
- --ifm-menu-color: var(--st-text-secondary);
- --ifm-menu-color-active: var(--ifm-color-primary);
- --ifm-menu-color-background-active: var(--st-highlight-background);
- --ifm-menu-color-background-hover: var(--st-highlight-background-hover);
- --ifm-menu-link-padding-horizontal: 0.75rem;
- --ifm-menu-link-padding-vertical: 0.4em;
- --ifm-menu-link-sublist-icon: url('data:image/svg+xml;utf8, ');
-
- /* contents list */
- --ifm-toc-border-color: var(--st-layout-border);
- --ifm-toc-link-color: var(--st-text);
- --ifm-toc-padding-vertical: 0.5rem;
- --ifm-toc-padding-horizontal: 0.5rem;
-
- /* tables */
- --ifm-table-border-color: var(--st-layout-border);
- --ifm-table-background: transparent;
- --ifm-table-stripe-background: rgba(255, 255, 255, 0.6);
- --ifm-footer-link-color: var(--st-footer-link);
-
- /* admonitions */
- --ifm-alert-background-color: white;
- --ifm-alert-background-color-highlight: white;
- --ifm-alert-foreground-color: black;
- --ifm-alert-border-color: grey;
- --ifm-alert-border-width: 1px;
- --ifm-alert-border-left-width: 1px;
- --ifm-alert-border-radius: 0.5rem;
- --ifm-alert-padding-vertical: 0.75rem;
- --ifm-alert-padding-horizontal: 0.65rem;
-
- /* tabs */
- --ifm-tabs-padding-horizontal: 0.75rem;
- --ifm-tabs-padding-vertical: 0.5rem;
- --ifm-tabs-color: var(--st-text);
- --ifm-tabs-color-active: var(--st-text-highlight);
- --ifm-tabs-panel-background: var(--st-background-secondary);
- --ifm-tabs-color-active-border: var(--st-background-secondary);
-}
-
-html[data-theme='light'],
-html[data-theme='light'] body {
- --st-background: white;
- --st-background-secondary: var(--st-gray-50);
- --st-text: var(--st-gray-800);
- --st-text-highlight: var(--st-gray-900);
- --st-heading: var(--st-text-highlight);
- --st-text-secondary: var(--st-gray-600);
- --st-text-link: var(--st-blue-700);
- --st-text-link-hover: var(--st-blue-600);
- --st-text-link-active: var(--st-blue-500);
- --st-announcement-bar-text: var(--st-turquoise-800);
- --st-announcement-bar-gradient: radial-gradient(
- circle,
- var(--st-blue-100) 0%,
- var(--st-blue-200) 67%,
- var(--st-blue-200) 90%,
- var(--st-blue-100) 100%
- );
- --st-navbar-background: white;
- --st-header-border: var(--st-gray-100);
- --st-layout-border: var(--st-gray-100);
- --st-layout-border-secondary: var(--st-gray-100);
- --st-code-border: transparent;
- --st-codeblock-background: rgba(255, 255, 255, 0.2);
- --st-admonition-codeblock-background: rgba(255, 255, 255, 0.2);
- --st-code-inline-border: 1px solid rgba(191, 227, 248, 0.5); /* var(--st-blue-100) in rgba */
- --st-code-inline-text: var(--st-blue-900);
- --st-code-highlight-background: var(--st-blue-50);
- --st-copy-button-background: var(--st-blue-100);
- --st-copy-button-text: var(--st-blue-800);
- --st-highlight-background: var(--st-blue-100);
- --st-highlight-background-hover: var(--st-blue-50);
- --st-button-background: var(--st-blue-200);
- --st-button-background-hover: var(--st-blue-100);
- --st-button-text: var(--st-blue-800);
- --st-icon-filter: sepia(100%) saturate(100%) hue-rotate(30deg) brightness(60%);
- --st-header-link: var(--st-gray-700);
- --st-footer-link: var(--st-gray-700);
- --st-link-button-border: var(--st-blue-400);
- --st-menu-link-hover: var(--st-gray-800);
- --st-menu-link-active: var(--st-gray-800);
- --st-menu-link-border: var(--st-layout-border-secondary);
- --st-menu-link-border-active: var(--st-gray-200);
- --st-menu-icon-filter: invert(100%) sepia(100%) saturate(800%)
- hue-rotate(175deg) brightness(70%);
- --st-badge-background-color: var(--st-blue-50);
- --st-badge-border-color: none;
- --st-badge-text: var(--st-blue-800);
-
- --ifm-breadcrumb-separator: url('data:image/svg+xml;utf8, ');
-
- --docsearch-primary-color: var(--st-gray-800);
- --docsearch-text-color: var(--st-text);
- --docsearch-highlight-color: var(--st-gray-200);
- --docsearch-muted-color: var(--st-gray-600);
- --docsearch-icon: var(--st-gray-600);
- --docsearch-icon-hover: var(--st-gray-700);
- --docsearch-container-background: rgba(
- 255,
- 255,
- 255,
- 0.6
- ); /* st-gray-50 rgb */
- --docsearch-logo-color: var(--st-gray-600);
- --docsearch-modal-background: white;
- --docsearch-modal-shadow: 0 0 1rem 0 var(--st-gray-500);
- --docsearch-searchbox-background: white;
- --docsearch-searchbox-focus-background: white;
- --docsearch-searchbox-shadow: inset 0 0 0 1px var(--st-gray-200);
- --docsearch-searchbox-shadow-active: inset 0 0 0 1px
- var(--st-link-button-border);
- --docsearch-hit-source: var(--st-gray-700);
- --docsearch-hit-color: var(--st-gray-700);
- --docsearch-hit-active-color: var(--st-gray-800);
- --docsearch-hit-background: var(--st-gray-50);
- --docsearch-hit-shadow: none;
- --docsearch-hit-mark: var(--st-gray-900);
- --docsearch-hit-mark-active: var(--st-gray-800);
- --docsearch-key-border: solid var(--st-gray-300);
- --docsearch-key-gradient: linear-gradient(
- -225deg,
- var(--st-gray-50),
- var(--st-gray-100)
- );
- --docsearch-key-shadow: inset 0 -3px 0 0 var(--st-gray-300);
- --docsearch-footer-background: var(--st-gray-50);
- --docsearch-footer-shadow: inset 0 1px 0 0 var(--st-gray-100);
-
- /* tags */
- --st-tag-border: 1px solid rgba(191, 227, 248, 0.5); /* var(--st-blue-100) in rgba */
- --st-tag-text: var(--st-blue-900);
- --st-tag-background: var(--st-blue-50);
-
- /* alert colours */
- --st-tip-background: var(--st-gray-50);
- --st-tip-accent: var(--st-gray-100);
- --st-tip-text: var(--st-gray-700);
- --st-warning-background: var(--st-orange-100);
- --st-warning-accent: var(--st-orange-200);
- --st-warning-text: var(--st-orange-800);
- --st-danger-background: var(--st-red-50);
- --st-danger-accent: var(--st-red-100);
- --st-danger-text: var(--st-red-800);
- --st-typescript-background: var(--st-blue-50);
- --st-typescript-accent: var(--st-blue-100);
- --st-typescript-text: var(--st-blue-800);
- --st-stately-background: var(--st-gray-50);
- --st-stately-accent: var(--st-gray-100);
- --st-stately-text: var(--st-gray-700);
- --st-xstate-background: var(--st-blue-50);
- --st-xstate-accent: var(--st-blue-100);
- --st-xstate-text: var(--st-blue-800);
- --st-success-background: var(--st-green-50);
- --st-success-accent: var(--st-green-200);
- --st-success-text: var(--st-green-800);
-}
-
-html[data-theme='dark'],
-html[data-theme='dark'] body {
- /* Override Infima dark mode defaults */
- --ifm-color-emphasis-0: white;
- --ifm-color-emphasis-100: var(--ifm-color-gray-900);
- --ifm-color-emphasis-200: var(--ifm-color-gray-850);
- --ifm-color-emphasis-300: var(--ifm-color-gray-800);
- --ifm-color-emphasis-400: var(--ifm-color-gray-700);
- --ifm-color-emphasis-500: var(--ifm-color-gray-600);
- --ifm-color-emphasis-600: var(--ifm-color-gray-500);
- --ifm-color-emphasis-700: var(--ifm-color-gray-400);
- --ifm-color-emphasis-800: var(--ifm-color-gray-300);
- --ifm-color-emphasis-900: var(--ifm-color-gray-200);
- --ifm-color-emphasis-1000: var(--ifm-color-gray-100);
- --ifm-hover-overlay: gray;
- --ifm-color-content: white;
- --ifm-color-content-secondary: white;
- --ifm-breadcrumb-separator-filter: none;
- --ifm-code-background: var(--st-code-highlight-background);
- --ifm-scrollbar-track-background-color: var(--st-gray-850);
- --ifm-scrollbar-thumb-background-color: var(--st-gray-800);
- --ifm-scrollbar-thumb-hover-background-color: var(--st-gray-700);
-
- --ifm-color-primary-contrast-background: rgb(16, 36, 69);
- --ifm-color-primary-contrast-foreground: rgb(235, 242, 252);
- --ifm-color-secondary-contrast-background: rgb(71, 71, 72);
- --ifm-color-secondary-contrast-foreground: rgb(253, 253, 254);
- --ifm-color-success-contrast-background: rgb(0, 49, 0);
- --ifm-color-success-contrast-foreground: rgb(230, 246, 230);
- --ifm-color-info-contrast-background: rgb(25, 60, 71);
- --ifm-color-info-contrast-foreground: rgb(238, 249, 253);
- --ifm-color-warning-contrast-background: rgb(77, 56, 0);
- --ifm-color-warning-contrast-foreground: rgb(255, 248, 230);
- --ifm-color-danger-contrast-background: rgb(75, 17, 19);
- --ifm-color-danger-contrast-foreground: rgb(255, 235, 236);
- --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3);
-
- --st-background: var(--st-gray-900);
- --st-background-secondary: var(--st-gray-800);
- --st-text: var(--st-gray-200);
- --st-text-highlight: var(--st-gray-50);
- --st-heading: var(--st-text-highlight);
- --st-text-secondary: var(--st-gray-400);
- --st-text-link: var(--st-blue-300);
- --st-text-link-hover: var(--st-blue-400);
- --st-text-link-active: var(--st-blue-400);
- --st-announcement-bar-text: var(--st-blue-200);
- --st-announcement-bar-gradient: radial-gradient(
- circle,
- var(--st-blue-800) 0%,
- var(--st-blue-700) 67%,
- var(--st-blue-700) 90%,
- var(--st-blue-800) 100%
- );
- --st-navbar-background: var(--st-gray-900);
- --st-search-background: var(--st-gray-800);
- --st-search-background-active: var(--st-gray-800);
- --st-header-border: var(--st-gray-700);
- --st-layout-border: var(--st-gray-700);
- --st-layout-border-secondary: var(--st-gray-700);
- --st-code-border: transparent;
- --st-code-inline-border: 1px solid rgba(69, 71, 79, 0.5); /* var(--st-gray-700) in rgba */
- --st-code-inline-text: var(--st-gray-50);
- --st-codeblock-background: rgba(0, 0, 0, 0.1);
- --st-admonition-codeblock-background: rgba(0, 0, 0, 0.7);
- --st-code-highlight-background: var(--st-gray-850);
- --docusaurus-highlighted-code-line-bg: var(--st-code-highlight-background);
- --st-copy-button-background: var(--st-blue-700);
- --st-copy-button-text: var(--st-blue-100);
- --st-highlight-background: var(--st-gray-800);
- --st-highlight-background-hover: var(--st-gray-825);
- --st-button-background-hover: var(--st-blue-700);
- --st-button-background: var(--st-gray-800);
- --st-button-text: white;
- --st-icon-filter: invert(100%) brightness(100%);
- --st-header-link: var(--st-gray-200);
- --st-footer-link: var(--st-gray-200);
- --st-link-button-border: var(--st-blue-500);
- --st-menu-link-hover: var(--st-gray-100);
- --st-menu-link-active: var(--st-gray-100);
- --st-menu-link-border: var(--st-layout-border-secondary);
- --st-menu-link-border-active: var(--st-gray-600);
- --st-menu-icon-filter: invert(100%) sepia(100%) saturate(700%)
- hue-rotate(175deg) brightness(40%);
- --st-badge-background-color: var(--st-blue-900);
- --st-badge-border-color: none;
- --st-badge-text: var(--st-blue-200);
-
- --ifm-breadcrumb-separator: url('data:image/svg+xml;utf8, ');
-
- /* alert colours */
- --st-tip-background: var(--st-gray-800);
- --st-tip-accent: var(--st-gray-700);
- --st-tip-text: var(--st-gray-200);
- --st-warning-background: var(--st-orange-700);
- --st-warning-accent: var(--st-orange-500);
- --st-warning-text: var(--st-orange-100);
- --st-danger-background: var(--st-red-700);
- --st-danger-accent: var(--st-red-500);
- --st-danger-text: var(--st-red-100);
- --st-typescript-background: var(--st-blue-900);
- --st-typescript-accent: var(--st-blue-800);
- --st-typescript-text: var(--st-blue-200);
- --st-stately-background: var(--st-gray-800);
- --st-stately-accent: var(--st-gray-700);
- --st-stately-text: var(--st-gray-200);
- --st-xstate-background: var(--st-blue-900);
- --st-xstate-accent: var(--st-blue-800);
- --st-xstate-text: var(--st-blue-200);
- --st-success-background: var(--st-green-900);
- --st-success-accent: var(--st-green-800);
- --st-success-text: var(--st-green-200);
-
- /* search */
- --docsearch-primary-color: var(--st-gray-200);
- --docsearch-text-color: var(--st-text);
- --docsearch-highlight-color: var(--st-gray-600);
- --docsearch-muted-color: var(--st-gray-400);
- --docsearch-icon: var(--st-gray-500);
- --docsearch-icon-hover: var(--st-gray-400);
- --docsearch-container-background: rgba(
- 21,
- 21,
- 30,
- 0.8
- ); /* st-gray-900 in rgb */
- --docsearch-logo-color: var(--st-gray-500);
- --docsearch-modal-background: var(--st-gray-900);
- --docsearch-modal-shadow: 0 0 1rem 0 black;
- --docsearch-searchbox-background: var(--st-gray-800);
- --docsearch-searchbox-focus-background: var(--st-gray-800);
- --docsearch-searchbox-shadow: inset 0 0 0 1px var(--st-gray-700);
- --docsearch-searchbox-shadow-active: inset 0 0 0 1px
- var(--st-link-button-border);
- --docsearch-hit-source: var(--st-gray-300);
- --docsearch-hit-color: var(--st-gray-300);
- --docsearch-hit-active-color: white;
- --docsearch-hit-background: var(--st-gray-800);
- --docsearch-hit-shadow: 0 1px 3px 0 var(--st-gray-900);
- --docsearch-hit-mark: var(--st-gray-50);
- --docsearch-hit-mark-active: white;
- --docsearch-key-border: solid var(--st-gray-600);
- --docsearch-key-gradient: linear-gradient(
- -225deg,
- var(--st-gray-850),
- var(--st-gray-800)
- );
- --docsearch-key-shadow: inset 0 -3px 0 0 var(--st-gray-600);
- --docsearch-footer-background: var(--st-gray-800);
- --docsearch-footer-shadow: inset 0 1px 0 0 var(--st-gray-700);
-
- /* navbar */
- --ifm-navbar-background-color: var(--st-navbar-background);
- --ifm-navbar-shadow: none;
-
- /* contents list */
- --ifm-toc-border-color: var(--st-layout-border-secondary);
- --ifm-toc-link-color: var(--st-text);
-
- /* tags */
- --st-tag-border: 1px solid rgba(69, 71, 79, 0.5); /* var(--st-gray-700) in rgba */
- --st-tag-text: var(--st-gray-50);
- --st-tag-background: var(--st-gray-850);
-}
-
-/* Code examples */
-
-html[data-theme='light'] .theme-code-block,
-html[data-theme='light'] .theme-code-block pre {
- background: var(--st-codeblock-background) !important;
- --ifm-pre-background: var(--st-codeblock-background) !important;
-}
-
-html[data-theme='light'] .theme-code-block {
- border: none;
-}
-
-html[data-theme='dark'] .theme-code-block,
-html[data-theme='dark'] .theme-code-block pre {
- background: var(--st-codeblock-background) !important;
- --ifm-pre-background: var(--st-codeblock-background) !important;
-}
-
-html[data-theme='dark'] .theme-code-block {
- border: none;
-}
-
-/* Specific font-variation-settings for web font support */
-
-:root {
- --ifm-font-weight-light: 440;
- --ifm-font-weight-normal: 430;
- --ifm-font-weight-semibold: 540;
- --ifm-font-weight-bold: 690;
-}
-
-.text--light {
- font-weight: var(--ifm-font-weight-light);
-}
-.text--normal {
- font-weight: var(--ifm-font-weight-normal);
-}
-.text--semibold {
- font-weight: var(--ifm-font-weight-semibold);
-}
-h1,
-h2,
-h3,
-h4,
-h5,
-h6,
-.text--bold {
- font-weight: var(--ifm-font-weight-bold);
-}
-
-h1 {
- letter-spacing: -0.022rem;
-}
-
-.markdown h1,
-.markdown h1:first-child,
-.index-page h1 {
- --ifm-h1-font-size: 2rem;
-}
-
-h2 {
- letter-spacing: -0.021rem;
-}
-
-.markdown h2 {
- margin-top: 4.5rem;
- --ifm-h2-font-size: 1.5rem;
-}
-
-h3 {
- letter-spacing: -0.019rem;
- color: var(--st-heading);
-}
-
-.markdown h3 {
- --ifm-h3-font-size: 1.25rem;
-}
-
-.markdown > h3 {
- margin-top: 3rem;
-}
-
-.markdown h4 {
- --ifm-h4-font-size: 1.15rem;
-}
-
-.markdown h5 {
- --ifm-h5-font-size: 1.05rem;
-}
-
-.markdown h6 {
- --ifm-h6-font-size: 1rem;
-}
-
-.text--bold,
-strong,
-b {
- color: var(--st-text-highlight);
- font-synthesis: none;
- font-weight: bold;
- font-weight: 750;
-}
-
-.text--italic,
-em,
-i {
- font-synthesis: none;
- font-style: italic;
-}
-
-/* Sub lists */
-
-ul ul,
-ul ol,
-ol ol,
-ol ul {
- margin-top: var(--ifm-list-item-margin);
-}
-
-/* Keyboard shortcuts */
-/* Match docsearch keys */
-
-kbd {
- border: var(--docsearch-key-border);
- background: var(--docsearch-key-gradient);
- box-shadow: var(--docsearch-key-shadow);
- color: var(--docsearch-muted-color);
- padding: 0.1rem 0.3rem 0.3rem 0.3rem;
-}
-
-/* Make secondary (not content) text a consistent size */
-
-.menu__link,
-.breadcrumbs__link,
-.table-of-contents,
-.footer__copyright {
- font-size: 0.9rem;
-}
-
-/* Make link underlines interfere less with text readability */
-
-a,
-a:hover {
- text-decoration-skip-ink: auto;
- text-underline-offset: 0.1rem;
- text-decoration-thickness: 1px;
-}
-
-/* Don’t underline links in menus or button-like links */
-
-.menu__link,
-.table-of-contents__link,
-.pagination-nav__link {
- text-decoration: none;
-}
-
-.pagination-nav__link {
- border-color: var(--st-layout-border) !important;
-}
-
-.pagination-nav__link:hover,
-.pagination-nav__link:active,
-.pagination-nav__link:focus {
- border-color: var(--st-link-button-border) !important;
-}
-
-.table-of-contents__link:hover,
-.table-of-contents__link:hover code {
- color: var(--st-text-link-hover);
-}
-
-.table-of-contents__link:hover,
-.table-of-contents__link:hover code {
- color: var(--st-text-link-active);
-}
-
-/* Set a maximum width and centre main content (including breadcrumbs) */
-
-article,
-.index-page {
- margin: 0 auto;
- max-width: 50rem;
- /* adds more side padding when in column mode */
- padding-left: 0.5rem;
- padding-right: 0.5rem;
-}
-
-/* back to top button */
-
-.clean-btn.theme-back-to-top-button {
- background-color: var(--st-button-background) !important;
-}
-
-.clean-btn.theme-back-to-top-button:hover {
- background-color: var(--st-button-background-hover) !important;
-}
-
-/* back to top icon */
-
-.clean-btn.theme-back-to-top-button::after {
- background-color: var(--st-button-text) !important;
-}
-
-/* Inline code */
-
-code {
- border: var(--st-code-inline-border);
- color: var(--st-code-inline-text);
- overflow-wrap: break-word;
- vertical-align: baseline;
-}
-
-/* Header */
-
-.navbar {
- border-bottom: 1px solid var(--st-header-border);
-}
-
-.navbar__icon {
- border-radius: 50%;
- display: flex;
- justify-content: center;
- align-items: center;
- height: 2rem;
- width: 2rem;
-}
-
-.navbar__icon:hover {
- background-color: var(--st-highlight-background-hover);
-}
-
-.navbar__icon svg {
- display: block;
-}
-
-.navbar-sidebar--show .navbar-sidebar .navbar__icon {
- margin-left: 0.5rem;
-}
-
-/* force search to align with sidebar by making logo width of sidebar */
-.navbar__brand {
- margin-right: 0;
-}
-
-@media (min-width: 1115px) {
- .navbar__brand {
- margin-right: 0;
- width: calc(var(--doc-sidebar-width) - 1rem);
- }
- article,
- .index-page {
- /* Let content breath some on a not-huge screen */
- padding-left: 2rem;
- padding-right: 2rem;
- }
-}
-
-.navbar__logo {
- height: 2rem;
-}
-
-.navbar__link {
- white-space: nowrap;
- text-decoration: none;
-}
-
-.dropdown__link--active,
-.dropdown__link--active:hover {
- --ifm-dropdown-link-color: var(--st-text-highlight);
- font-weight: var(--ifm-font-weight-bold);
-}
-
-.clean-btn {
- color: var(--st-header-link);
-}
-
-.clean-btn:hover {
- background: var(--st-highlight-background-hover) !important;
-}
-
-/* Announcement bar */
-
-.close {
- color: var(--st-text-link);
-}
-
-html div[class*='announcementBar'] {
- background: var(--announcement-background) !important;
- box-shadow: none;
- color: var(--announcement-text);
- font-size: 0.9rem !important;
- height: auto !important; /* override default variable */
- border-bottom: none;
-}
-
-html div[class*='announcementBar'] [class*='announcementBarContent'] {
- background: none !important;
- padding: 0.35rem 0 !important;
-}
-
-/* Allow layout to breathe (override Docusaurus defaults) */
-
-@media (min-width: 600px) {
- .container {
- max-width: 100%;
- }
-}
-@media (min-width: 728px) {
- .container {
- max-width: 100%;
- }
-}
-@media (min-width: 984px) {
- .container {
- max-width: 100%;
- }
-}
-@media (min-width: 1240px) {
- .container {
- max-width: 100%;
- }
-}
-
-/* Search */
-
-/* centre search bar on widest viewports */
-html .navbar__inner > .navbar__items:first-of-type {
- flex: 0 0 auto;
-}
-
-html .navbar__items--right {
- flex: 1 1 auto;
-}
-
-html .navbar__items > :first-child {
- margin-right: auto;
-}
-
-html .DocSearch-Modal {
- border-radius: 10px !important;
-}
-
-html .DocSearch-Form:has(.DocSearch-Input:focus) {
- box-shadow: var(--docsearch-searchbox-shadow-active);
-}
-
-html body.DocSearch--active #__docusaurus:not(.DocSearch-Container) {
- filter: blur(2px);
-}
-
-html .DocSearch-Button {
- box-shadow: var(--docsearch-searchbox-shadow);
-}
-
-html .DocSearch-Button:active,
-html .DocSearch-Button:focus,
-html .DocSearch-Button:hover {
- box-shadow: var(--docsearch-searchbox-shadow-active);
-}
-
-html .DocSearch-MagnifierLabel,
-html .DocSearch-Button .DocSearch-Search-Icon {
- color: var(--docsearch-icon) !important;
-}
-
-html .DocSearch-Button:hover .DocSearch-MagnifierLabel,
-html .DocSearch-Button:active .DocSearch-MagnifierLabel,
-html .DocSearch-Button:hover .DocSearch-Search-Icon,
-html .DocSearch-Button:active .DocSearch-Search-Icon {
- color: var(--docsearch-icon-hover) !important;
-}
-
-html .DocSearch-Hit-source {
- color: var(--docsearch-hit-source) !important;
-}
-
-html .DocSearch-Prefill {
- color: var(--st-text-highlight) !important;
-}
-
-html .DocSearch-Hits mark {
- color: var(--docsearch-hit-mark) !important;
- font-weight: bold;
-}
-
-html .DocSearch-Hit[aria-selected='true'] html .DocSearch-Hit-action,
-html .DocSearch-Hit[aria-selected='true'] html .DocSearch-Hit-icon,
-html .DocSearch-Hit[aria-selected='true'] html .DocSearch-Hit-path,
-html .DocSearch-Hit[aria-selected='true'] html .DocSearch-Hit-text,
-html .DocSearch-Hit[aria-selected='true'] html .DocSearch-Hit-title,
-html .DocSearch-Hit[aria-selected='true'] html .DocSearch-Hit-Tree,
-html .DocSearch-Hit[aria-selected='true'] mark,
-html .DocSearch-Hit[aria-selected='true'] html .DocSearch-Hit-action,
-html .DocSearch-Hit[aria-selected='true'] html .DocSearch-Hit-icon,
-html .DocSearch-Hit[aria-selected='true'] html .DocSearch-Hit-path,
-html .DocSearch-Hit[aria-selected='true'] html .DocSearch-Hit-text,
-html .DocSearch-Hit[aria-selected='true'] html .DocSearch-Hit-title,
-html .DocSearch-Hit[aria-selected='true'] html .DocSearch-Hit-Tree,
-html .DocSearch-Hit[aria-selected='true'] mark {
- color: var(--docsearch-hit-mark-active) !important;
-}
-
-html .DocSearch-Commands-Key,
-html .DocSearch-Button-Key {
- border: var(--docsearch-key-border);
- border-width: 0.1rem;
- box-shadow: var(--docsearch-key-shadow);
- font-size: 0.8rem;
- height: 1.2rem;
- padding: 0 0 2px 0;
- top: 1px;
- width: 1.2rem;
-}
-
-/* target the K key */
-
-html .DocSearch-Button-Key:nth-of-type(2) {
- font-size: 0.6rem;
-}
-
-/* above point where search gets minimised */
-/* centre search */
-
-@media (min-width: 768px) {
- html .DocSearch-Button {
- width: clamp(21ch, 90ch, 100%);
- margin: 0 auto;
- }
-}
-
-@media (min-width: 1049px) {
- html [class*='searchBox'] {
- width: 100%;
- }
-}
-
-/* Light/dark mode button */
-
-html [class*='toggleButton'] {
- height: 2rem;
- width: 2rem;
-}
-
-/* Breadcrumbs */
-
-.breadcrumbs__link {
- text-decoration: none;
-}
-
-.breadcrumbs__link:hover {
- color: var(--st-text-highlight);
-}
-
-.breadcrumbs__item--active .breadcrumbs__link {
- font-weight: bold;
- font-weight: var(--ifm-font-weight-bold);
- font-weight: var(--ifm-font-weight-bold);
-}
-
-.breadcrumbs__item:not(:last-child):after {
- color: var(--st-text);
- opacity: 1;
-}
-
-.breadcrumbs__item--active {
- --ifm-breadcrumb-padding-horizontal: 0.75rem;
-}
-
-/* Table of contents list */
-
-.col--2 {
- padding-left: 0;
- padding-right: 0;
-}
-
-.table-of-contents__link--active {
- color: var(--st-text-link);
- font-weight: bold;
- font-weight: var(--ifm-font-weight-bold);
- font-weight: var(--ifm-font-weight-bold);
-}
-
-.table-of-contents__link:hover {
- text-decoration-line: underline;
- text-decoration-thickness: 1px;
-}
-
-/* Add more space above page title */
-
-.markdown h1:first-child,
-.index-page h1 {
- margin-top: calc(var(--ifm-h1-vertical-rhythm-top) * var(--ifm-leading));
-}
-
-/* Menu sidebar */
-
-@media (min-width: 997px) {
- @supports (scrollbar-gutter: stable) {
- nav.menu {
- padding-top: 0.75rem !important; /* line up vertically with breadcrumbs + toc menu items */
- }
- }
-}
-
-.menu {
- font-weight: var(--ifm-font-weight-normal);
- overflow-x: hidden;
-}
-
-/* first-level menu items */
-.theme-doc-sidebar-item-category-level-1,
-.theme-doc-sidebar-item-link-level-1 {
- font-weight: var(--ifm-font-weight-semibold);
- padding-bottom: var(--ifm-menu-link-padding-vertical);
-}
-
-.theme-doc-sidebar-item-category-level-1 a,
-.theme-doc-sidebar-item-link-level-1 a {
- color: var(--st-text-highlight);
-}
-
-.theme-doc-sidebar-item-category-level-1 ul li,
-.theme-doc-sidebar-item-link-level-1 ul li {
- font-weight: var(--ifm-font-weight-normal);
- padding-bottom: 0;
-}
-
-.theme-doc-sidebar-item-category-level-1 ul li a,
-.theme-doc-sidebar-item-link-level-1 ul li a {
- color: var(--st-text-secondary);
-}
-
-.menu__list {
- list-style: none;
- margin: 0px;
- padding-left: 0px;
- padding: 0;
-}
-.menu__list .menu__list {
- flex: 0 0 100%;
- margin: 0;
- padding-left: 0px;
- padding: 0;
-}
-
-.menu__list-item:first-of-type {
- padding-top: 0.2rem;
-}
-.menu__list-item:last-of-type {
- padding-bottom: 0.2rem;
- margin-bottom: 0.5rem;
-}
-.menu__list-item:not(:first-child) {
- margin-top: 0;
-}
-.menu__list-item-collapsible {
- border-radius: 0;
-}
-
-.menu__list .menu__list .menu__list-item-collapsible {
- margin-left: 0;
-}
-
-.menu__link,
-.menu__caret {
- align-items: center;
- border-radius: 0;
- display: flex;
- transition: background var(--ifm-transition-fast)
- var(--ifm-transition-timing-default);
-}
-
-.theme-doc-sidebar-item-link-level-1 .menu__link {
- padding-top: calc(var(--ifm-menu-link-padding-horizontal) * 0.5);
- padding-bottom: calc(var(--ifm-menu-link-padding-horizontal) * 0.5);
-}
-
-.theme-doc-sidebar-item-link-level-1,
-.theme-doc-sidebar-item-link-level-2,
-.theme-doc-sidebar-item-link-level-3,
-.theme-doc-sidebar-item-link-level-4,
-.theme-doc-sidebar-item-category-level-1,
-.theme-doc-sidebar-item-category-level-2,
-.theme-doc-sidebar-item-category-level-3,
-.theme-doc-sidebar-item-category-level-4 {
- margin-left: 1rem;
-}
-
-.menu__list-item .menu__list-item {
- border-left: 1px solid var(--st-menu-link-border);
- margin-left: 1.2rem;
- padding-left: 2px;
-}
-
-.menu__list-item .menu__list-item .menu__list-item {
- border-left: none;
- margin-left: 0.5rem;
-}
-
-.menu__list-item .menu__list-item .menu__link--active {
- border-left: 3px solid var(--st-menu-link-border-active);
- margin-left: -4px;
- color: var(--st-text-highlight);
-}
-
-.menu__list-item .menu__list-item .menu__list-item .menu__link--active {
- border: none;
- margin-left: 0;
-}
-
-.menu__link {
- color: var(--st-text-secondary);
- flex: 1 1 0%;
-}
-
-.menu__link--active {
- color: var(--st-menu-link-active);
- font-weight: bold;
- font-weight: var(--ifm-font-weight-bold);
-}
-
-.menu__link:hover {
- color: var(--st-menu-link-hover);
- text-decoration: none;
-}
-
-.menu__caret::before,
-.menu__link--sublist-caret::before,
-.menu__link--sublist-caret::before {
- display: none;
-}
-
-.menu__caret::after,
-.menu__link--sublist-caret::after {
- content: '';
- background: var(--ifm-menu-link-sublist-icon) 50% / 1.3rem 1.3rem;
- filter: var(--st-menu-icon-filter);
- height: 1.3rem;
- transform: rotate(180deg);
- width: 1.3rem;
- transition: transform var(--ifm-transition-fast) linear;
-}
-
-.menu__link--sublist-caret::after {
- margin-left: 0;
- margin-right: 0.25rem;
- min-width: 1.25rem;
-}
-
-.menu__list-item--collapsed .menu__link--sublist::after,
-.menu__list-item--collapsed .menu__caret::after {
- transform: rotateZ(90deg);
-}
-
-/* Next/prev links */
-
-.pagination-nav__link {
- border-color: var(--ifm-color-emphasis-400);
-}
-
-.pagination-nav__link--prev .pagination-nav__label::before {
- content: '← ';
-}
-
-.pagination-nav__link--next .pagination-nav__label::after {
- content: ' →';
-}
-
-/* Hide external link icons in header and footer nav */
-
-.navbar__items [class*='iconExternalLink'],
-.navbar-sidebar__items [class*='iconExternalLink'],
-footer [class*='iconExternalLink'] {
- display: none;
-}
-
-/* Override default admonition styles */
-
-.alert {
- --ifm-code-background: var(--ifm-alert-background-color);
- --ifm-link-color: var(--ifm-alert-foreground-color);
- --ifm-link-hover-color: var(--ifm-alert-foreground-color);
- --ifm-link-decoration: underline;
- --ifm-tabs-color: var(--ifm-alert-foreground-color);
- --ifm-tabs-color-active: var(--ifm-alert-foreground-color);
- --ifm-tabs-color-active-border: var(--ifm-alert-border-color);
- background-color: var(--ifm-alert-background-color);
- border: var(--ifm-alert-border-width) solid var(--ifm-alert-border-color);
- border-left-width: var(--ifm-alert-border-left-width);
- border-radius: var(--ifm-alert-border-radius);
- box-shadow: none;
- color: var(--ifm-alert-foreground-color);
- display: grid;
- grid-template-columns: 1.2em minmax(auto, calc(100% - 1.2em));
- grid-template-rows: auto;
- grid-column-gap: 0.5em;
- grid-row-gap: 0;
- font-size: 0.95rem;
- padding: var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal);
-}
-
-details.alert {
- display: block;
-}
-
-details > div > div {
- padding: calc(var(--ifm-alert-padding-vertical) * 2)
- var(--ifm-alert-padding-horizontal) var(--ifm-alert-padding-vertical);
-}
-
-details summary::before {
- --docusaurus-details-decoration-color: var(--st-text);
- top: 0.35rem !important;
-}
-
-@media (min-width: 1300px) {
- details {
- --ifm-alert-padding-horizontal: 1rem;
- /* pull admonitions into margins so text aligns with paragraph text */
- margin-left: calc(-1 * var(--ifm-alert-padding-horizontal)) !important;
- margin-right: calc(-1 * var(--ifm-alert-padding-horizontal)) !important;
- }
-}
-
-.alert--primary {
- --ifm-alert-background-color: var(--st-tip-background);
- --ifm-alert-background-color-highlight: var(--st-tip-accent);
- --ifm-alert-foreground-color: var(--st-tip-text);
- --ifm-alert-border-color: var(--st-tip-accent);
-}
-
-.alert code {
- background-color: var(--st-admonition-codeblock-background);
- border-color: var(--st-admonition-codeblock-background);
- color: var(--ifm-alert-foreground-color);
-}
-
-.alert pre code {
- background-color: var(--st-admonition-codeblock-background);
- border-color: inherit;
-}
-
-.alert--secondary {
- --ifm-alert-background-color: var(--st-tip-background);
- --ifm-alert-background-color-highlight: var(--st-tip-accent);
- --ifm-alert-foreground-color: var(--st-tip-text);
- --ifm-alert-border-color: var(--st-tip-accent);
-}
-
-.alert--success,
-.alert--new,
-.alert--v4compatible {
- --ifm-alert-background-color: var(--st-success-background);
- --ifm-alert-background-color-highlight: var(--st-success-accent);
- --ifm-alert-foreground-color: var(--st-success-text);
- --ifm-alert-border-color: var(--st-success-accent);
-}
-
-.alert--studio {
- --ifm-alert-background-color: var(--st-stately-background);
- --ifm-alert-background-color-highlight: var(--st-stately-accent);
- --ifm-alert-foreground-color: var(--st-stately-text);
- --ifm-alert-border-color: var(--st-stately-accent);
-}
-
-.alert--xstate {
- --ifm-alert-background-color: var(--st-xstate-background);
- --ifm-alert-background-color-highlight: var(--st-xstate-accent);
- --ifm-alert-foreground-color: var(--st-xstate-text);
- --ifm-alert-border-color: var(--st-xstate-accent);
-}
-
-.alert--typescript {
- --ifm-alert-background-color: var(--st-typescript-background);
- --ifm-alert-background-color-highlight: var(--st-typescript-accent);
- --ifm-alert-foreground-color: var(--st-typescript-text);
- --ifm-alert-border-color: var(--st-typescript-accent);
-}
-
-.alert--info,
-.alert--tip,
-.alert--video {
- --ifm-alert-background-color: var(--st-tip-background);
- --ifm-alert-background-color-highlight: var(--st-tip-accent);
- --ifm-alert-foreground-color: var(--st-tip-text);
- --ifm-alert-border-color: var(--st-tip-accent);
-}
-
-.alert--danger,
-.alert--breakingchange {
- --ifm-alert-background-color: var(--st-danger-background);
- --ifm-alert-background-color-highlight: var(--st-danger-accent);
- --ifm-alert-foreground-color: var(--st-danger-text);
- --ifm-alert-border-color: var(--st-danger-accent);
-}
-
-.alert--warning,
-.theme-admonition-warning,
-.alert--warningxstate {
- --ifm-alert-background-color: var(--st-warning-background);
- --ifm-alert-background-color-highlight: var(--st-warning-accent);
- --ifm-alert-foreground-color: var(--st-warning-text);
- --ifm-alert-border-color: var(--st-warning-accent);
-}
-
-.alert--v4compatible,
-.alert--breakingchange {
- width: fit-content;
- padding: 4px 10px;
-}
-
-.alert__icon {
- display: inline-flex;
- margin-right: 0.4em;
-}
-
-.alert__icon svg {
- fill: currentColor;
- stroke: currentColor;
- stroke-width: 0;
-}
-
-.alert .close {
- color: inherit;
- margin: calc(var(--ifm-alert-padding-vertical) * -1)
- calc(var(--ifm-alert-padding-horizontal) * -1) 0 0;
- opacity: 0.75;
-}
-
-.alert:not(details) h2,
-.alert:not(details) h3,
-.alert:not(details) h4,
-.alert:not(details) h5,
-.alert:not(details) h6 {
- color: inherit;
- font-size: 1.1rem;
- margin-top: 0;
- margin-bottom: calc(var(--ifm-alert-padding-vertical) * 0.5);
-}
-
-.alert:not(details) * + h2,
-.alert:not(details) * + h3,
-.alert:not(details) * + h4,
-.alert:not(details) * + h5,
-.alert:not(details) * + h6 {
- margin-top: calc(var(--ifm-alert-padding-vertical) * 1.5);
-}
-
-.alert:not(details) a {
- color: inherit;
-}
-
-.alert .close:hover,
-.alert .close:focus {
- opacity: 1;
-}
-
-.alert:not(details) a {
- text-decoration-color: var(--ifm-alert-foreground-color);
-}
-
-.alert:not(details) a:hover {
- text-decoration-thickness: 1px;
-}
-
-/* Version banner */
-
-.alert--version {
- grid-template-columns: auto 1.2em minmax(auto, 66ch) auto;
- grid-template-areas:
- 'margin icon content'
- 'margin icon content';
- grid-template-rows: 1fr;
- grid-column-gap: 0.5em;
- margin-bottom: 1rem;
- padding: var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal);
-}
-
-@media (min-width: 1300px) {
- .alert--version {
- --ifm-alert-padding-horizontal: 0.85rem;
- /* pull admonitions into margins so text aligns with paragraph text */
- margin-left: calc(-1 * var(--ifm-alert-padding-horizontal));
- margin-right: calc(-1 * var(--ifm-alert-padding-horizontal));
- }
-}
-
-.versionBannerIcon svg {
- vertical-align: middle;
- height: 1.2em;
- width: 1.2em;
- fill: currentColor;
- /* pull into icon space */
- margin-left: -1.7em;
-}
-
-.versionBannerHeading {
- grid-area: content;
-}
-
-.versionBannerContent {
- grid-area: content;
-}
-
-.versionBannerContent > * {
- margin-bottom: 0.35em;
-}
-
-.versionBannerContent > :last-child {
- margin-bottom: 0;
-}
-
-/* Version badge */
-
-.badge--secondary {
- --ifm-badge-border-color: var(--st-badge-border-color);
- --ifm-badge-background-color: var(--st-badge-background-color);
- color: var(--st-badge-text);
-}
-
-/* Context boxes (custom HTML used in content pages) */
-
-.content-boxes {
- display: grid;
- grid-template-columns: repeat(1, 1fr);
- grid-template-rows: repeat(4, 1fr);
- grid-column-gap: 1rem;
- grid-row-gap: 1rem;
- padding: 0;
-}
-
-@media (min-width: 400px) {
- .content-boxes {
- display: grid;
- grid-template-columns: repeat(2, 1fr);
- grid-template-rows: repeat(2, 1fr);
- grid-column-gap: 1rem;
- grid-row-gap: 1rem;
- padding: 0;
- }
-}
-
-ul.content-boxes {
- margin: 1.5rem 0;
-}
-
-.content-boxes li {
- display: flex;
- list-style-type: none;
-}
-
-.content-boxes li + li {
- margin: 0;
-}
-
-a.link-box,
-.content-boxes a.link-box {
- display: grid;
- grid-template-rows: auto auto auto;
- row-gap: 0.5rem;
- border: 1px solid var(--st-layout-border);
- border-radius: var(--ifm-breadcrumb-border-radius);
- box-shadow: none;
- color: var(--st-text);
- margin: 0;
- padding: 2rem 1.5rem 1rem;
- /* padding-top: 1rem; */
- text-decoration: none;
- width: 100%;
- transition: border-color 0.2s ease;
-}
-
-a.link-box:hover,
-a.link-box:active,
-a.link-box:focus {
- border-color: var(--st-text-link-active);
-}
-
-a.link-box strong {
- color: var(--st-text-link);
- font-size: 1.1rem;
- margin: 0.25rem 0;
-}
-
-a.link-box > p {
- font-size: 0.8rem;
-}
-
-/* Index page list */
-
-.index-list {
- list-style-type: none;
- padding: 0;
-}
-
-/* Docs intro page */
-
-.docs-intro {
- display: flex;
- align-content: center;
- flex-direction: row;
- flex-wrap: wrap;
- gap: 0.5rem;
- margin: 2rem 0;
-}
-
-.docs-intro h2:hover a.hash-link {
- opacity: 0;
-}
-
-.docs-intro svg {
- display: block;
- width: 100%;
-}
-
-.docs-intro h2 {
- display: flex;
- align-content: center;
- margin: 0;
- flex-basis: clamp(10rem, 15rem, 30%);
-}
-
-.docs-intro p {
- flex-grow: 1;
- margin: 0;
- flex-basis: 60%;
-}
-
-/* Tabs */
-
-.tabs {
- color: var(--ifm-tabs-color);
- display: flex;
- font-weight: var(--ifm-font-weight-bold);
- margin-bottom: 0;
- overflow-x: auto;
- padding-left: 0;
-}
-
-.tabs__item {
- background: var(--ifm-tabs);
- border: 1px solid var(--ifm-tabs-color-active-border);
- border-bottom: none;
- border-radius: 0;
- border-bottom-left-radius: 0;
- border-bottom-right-radius: 0;
- cursor: pointer;
- display: inline-flex;
- padding: var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);
- transition: background-color var(--ifm-transition-fast)
- var(--ifm-transition-timing-default);
- font-size: small;
-}
-
-.tabs__item:first-child {
- border-top-left-radius: var(--ifm-global-radius);
-}
-
-.tabs__item:last-child {
- border-top-right-radius: var(--ifm-global-radius);
-}
-
-.tabs__item--active {
- background: var(--ifm-tabs-panel-background);
- border-bottom-color: transparent;
- border-bottom-left-radius: 0;
- border-bottom-right-radius: 0;
- color: var(--ifm-tabs-color-active);
-}
-
-.tabs__item:hover {
- background-color: var(--ifm-tabs-panel-background);
-}
-
-html[data-theme='light'] [role='tabpanel'] .theme-code-block,
-html[data-theme='dark'] [role='tabpanel'] .theme-code-block,
-html[data-theme='light'] [role='tabpanel'] .theme-code-block pre,
-html[data-theme='dark'] [role='tabpanel'] .theme-code-block pre {
- background: none !important;
- border: none !important;
-}
-
-.tabs-container .padding-top--s {
- background: var(--ifm-tabs-panel-background);
- border: 1px solid var(--ifm-tabs-panel-background);
- border-radius: var(--ifm-global-radius);
- border-top-left-radius: 0;
-}
-
-/* Videos */
-
-video {
- max-width: 100%;
- height: auto;
-}
-
-/* Blog */
-
-ul.blog-list {
- list-style-type: none;
- padding: 0;
-}
-
-.post-footer {
- margin-top: 1rem;
-}
-
-.post-tags {
- margin-top: 2rem;
-}
-
-.post-tags h2 {
- font-size: 1rem;
- display: inline;
-}
-
-/* Add more space above headings that follow tab panels */
-.tabs-container + h2,
-.tabs-container + h3,
-.tabs-container + h4 {
- margin-top: calc(var(--ifm-leading) * 2.5);
-}
-
-/* Inline Lucide icons */
-
-.markdown svg.lucide {
- margin-top: -0.1rem;
- vertical-align: middle;
-}
-
-/* embedded content in blog */
-
-.mdx-embed {
- margin: var(--ifm-leading) 0;
-}
-
-/* Footer */
-
-.footer {
- background: var(--st-background);
- border-top: 1px solid var(--st-header-border);
- padding: 0.5rem;
-}
-
-.footer .container {
- display: flex;
- flex-direction: row;
- flex-wrap: wrap;
- gap: 0.5rem;
- align-content: center;
-}
-
-@media (min-width: 570px) {
- .footer .container {
- display: block;
- }
-}
-
-ul.footer__links {
- display: flex;
- flex-direction: row;
- flex-wrap: wrap;
- gap: 0.5rem;
- justify-content: left;
- align-content: center;
- align-items: flex-start;
- margin: 0;
- padding: 0;
-}
-
-.footer__links li:nth-of-type(1),
-.footer__links li:nth-of-type(2),
-.footer__links li:nth-of-type(3),
-.footer__links li:nth-of-type(4) {
- width: 100%;
-}
-
-.footer__links li:nth-of-type(1) {
- margin-top: 1rem;
-}
-
-.footer__links li:nth-of-type(4) {
- margin-bottom: 1.25rem;
-}
-
-.footer__links li {
- list-style-type: none;
-}
-
-.footer__link-item {
- line-height: 1;
-}
-
-.footer__link-item a {
- color: var(--ifm-footer-link-color);
- padding: 0 0.2rem;
-}
-
-/* only icon links */
-span.footer__link-item a {
- display: flex;
- align-content: center;
- opacity: 0.7;
-}
-
-span.footer__link-item a:hover,
-span.footer__link-item a:active {
- opacity: 1;
-}
-
-.footer__links form {
- margin: 1rem 0;
-}
-
-.footer__links form .fields {
- display: flex;
- gap: 0.5rem;
- flex-wrap: wrap;
- margin: 0.5rem 0;
-}
-
-.footer__links form input {
- border: 1px solid var(--st-layout-border);
- border-radius: 0.25rem;
- font-size: inherit;
- flex: 1 1 auto;
- line-height: 1.2;
- padding: 0.2rem 0.5rem;
-}
-
-.footer__links form input[type='submit'] {
- background: var(--st-button-background-hover);
- border: none;
- border-radius: 0.35rem;
- flex: 0 0 auto;
- padding: 0.2rem 0.75rem;
-}
-
-.footer__links form input[type='submit']:hover,
-.footer__links form input[type='submit']:active {
- background: var(--st-button-background);
-}
-
-@media (min-width: 570px) {
- ul.footer__links {
- display: grid;
- grid-template-columns: 50% 1fr repeat(6, minmax(auto, 3rem));
- grid-template-rows: repeat(4, minmax(1.5rem, auto));
- grid-template-areas:
- 'link-one . github discord mastodon twitter youtube linkedin'
- 'link-two . . . . . . .'
- 'link-thr . form form form form form form'
- 'link-fou . form form form form form form';
- align-content: start;
- gap: 0;
- margin-top: 1rem;
- }
-
- .footer__links li:nth-of-type(1) {
- grid-area: link-one;
- }
- .footer__links li:nth-of-type(2) {
- grid-area: link-two;
- }
- .footer__links li:nth-of-type(3) {
- grid-area: link-thr;
- }
- .footer__links li:nth-of-type(4) {
- grid-area: link-fou;
- }
- .footer__links li:nth-of-type(5) {
- grid-area: github;
- }
- .footer__links li:nth-of-type(6) {
- grid-area: discord;
- }
- .footer__links li:nth-of-type(7) {
- grid-area: mastodon;
- }
- .footer__links li:nth-of-type(8) {
- grid-area: twitter;
- }
- .footer__links li:nth-of-type(9) {
- grid-area: youtube;
- }
- .footer__links li:nth-of-type(10) {
- grid-area: linkedin;
- }
- .footer__links li:nth-of-type(11) {
- grid-area: form;
- }
-
- .footer__links li:nth-of-type(1) {
- margin-top: 0;
- }
-
- .footer__links form {
- margin: 0;
- }
-}
-
-@media (min-width: 997px) {
- ul.footer__links {
- grid-template-columns: var(--doc-sidebar-width) 30% 1fr repeat(
- 6,
- minmax(auto, 3rem)
- );
- grid-template-areas:
- '. link-one . github discord mastodon twitter youtube linkedin'
- '. link-two . . . . . . .'
- '. link-thr . form form form form form form'
- '. link-fou . form form form form form form';
- }
-}
-
-@media (min-width: 1190px) {
- .footer {
- padding-left: var(--doc-sidebar-width);
- }
-
- footer div.footer__links,
- .footer__bottom p {
- padding: 0 var(--ifm-spacing-horizontal);
- max-width: 75%;
- }
-
- ul.footer__links {
- grid-template-columns: 30% 1fr repeat(6, minmax(auto, 3rem));
- grid-template-areas:
- 'link-one . github discord mastodon twitter youtube linkedin'
- 'link-two . . . . . . .'
- 'link-thr . form form form form form form'
- 'link-fou . form form form form form form';
- }
-}
-
-/* copyright */
-
-.footer__bottom p {
- margin: 0;
-}
-
-.visually-hidden {
- border: 0;
- clip: rect(0 0 0 0);
- height: auto;
- margin: 0;
- overflow: hidden;
- padding: 0;
- position: absolute;
- width: 1px;
- white-space: nowrap;
-}
diff --git a/src/css/landing-page.css b/src/css/landing-page.css
deleted file mode 100644
index c94ba7586..000000000
--- a/src/css/landing-page.css
+++ /dev/null
@@ -1,4 +0,0 @@
-@config "../../tailwind.config.js";
-@source "../**/*.{js,jsx,ts,tsx,md,mdx}";
-@import 'tailwindcss/theme';
-@import 'tailwindcss/utilities';
diff --git a/src/css/landing-styles.css b/src/css/landing-styles.css
deleted file mode 100644
index ac4c2271e..000000000
--- a/src/css/landing-styles.css
+++ /dev/null
@@ -1,167 +0,0 @@
-@property --x {
- syntax: '';
- initial-value: 0%;
- inherits: false;
-}
-
-@property --opacityBlue {
- syntax: '';
- initial-value: 25%;
- inherits: false;
-}
-
-@property --opacityOther {
- syntax: '';
- initial-value: 30%;
- inherits: false;
-}
-
-.bgimage-gradient-blue {
- background-image: radial-gradient(
- /* 90% 45% at 30% -15%, */ 90% 45% at var(--x) -15%,
- rgba(15, 110, 229, var(--opacityBlue)),
- rgba(255, 255, 255, 0)
- );
- animation: moveGradient 6s ease-in-out 0s infinite alternate,
- opacityBlue 6s ease-in-out 0s infinite alternate;
-}
-
-.bgimage-gradient-pink {
- background-image: radial-gradient(
- 90% 45% at var(--x) -15%,
- rgba(207, 36, 155, var(--opacityOther)),
- rgba(255, 255, 255, 0)
- );
- animation: moveGradient 6s ease-in-out 0s forwards,
- opacityOther 6s ease-in-out 0s forwards;
-}
-
-.bgimage-gradient-orange {
- background-image: radial-gradient(
- 90% 45% at var(--x) -15%,
- rgba(193, 79, 15, var(--opacityOther)),
- rgba(255, 255, 255, 0)
- );
- animation: moveGradient 6s ease-in-out 0s forwards,
- opacityOther 6s ease-in-out 0s forwards;
-}
-
-.bgimage-gradient-green {
- background-image: radial-gradient(
- 90% 45% at var(--x) -15%,
- rgba(41, 131, 59, var(--opacityOther)),
- rgba(255, 255, 255, 0)
- );
- animation: moveGradient 6s ease-in-out 0s forwards,
- opacityOther 6s ease-in-out 0s forwards;
-}
-
-.bgimage-gradient-purple {
- background-image: radial-gradient(
- 90% 45% at var(--x) -15%,
- rgba(131, 85, 229, var(--opacityOther)),
- rgba(255, 255, 255, 0)
- );
- animation: moveGradient 6s ease-in-out 0s forwards,
- opacityOther 6s ease-in-out 0s forwards;
-}
-
-@keyframes moveGradient {
- 0% {
- --x: 0%;
- }
- 100% {
- --x: 30%;
- }
-}
-
-@keyframes opacityBlue {
- 0% {
- --opacityBlue: 30%;
- }
- 100% {
- --opacityBlue: 45%;
- }
-}
-
-@keyframes opacityOther {
- 0% {
- --opacityOther: 45%;
- }
- 100% {
- --opacityOther: 15%;
- }
-}
-
-/*
- * Dot animation
- */
-
-.dot1 {
- animation: dot1Animation 5s ease-out infinite;
-}
-
-@keyframes dot1Animation {
- 0% {
- opacity: 1;
- }
- 65% {
- opacity: 1;
- }
- 66% {
- opacity: 0;
- }
- 100% {
- opacity: 0;
- }
-}
-
-.dot2 {
- animation: dot2Animation 5s ease-out infinite;
-}
-
-@keyframes dot2Animation {
- 0% {
- opacity: 0;
- }
- 21% {
- opacity: 0;
- }
- 22% {
- opacity: 1;
- }
- 65% {
- opacity: 1;
- }
- 66% {
- opacity: 0;
- }
- 100% {
- opacity: 0;
- }
-}
-
-.dot3 {
- animation: dot3Animation 5s ease-out infinite;
-}
-
-@keyframes dot3Animation {
- 0% {
- opacity: 0;
- }
- 43% {
- opacity: 0;
- }
- 44% {
- opacity: 1;
- }
- 65% {
- opacity: 1;
- }
- 66% {
- opacity: 0;
- }
- 100% {
- opacity: 0;
- }
-}
diff --git a/src/pages/agent.tsx b/src/pages/agent.tsx
deleted file mode 100644
index 0553ccef8..000000000
--- a/src/pages/agent.tsx
+++ /dev/null
@@ -1,70 +0,0 @@
-import { Footer } from '../components/landing/Footer';
-import { Intro } from '../components/landing/Intro';
-import { Navbar } from '../components/landing/Navbar';
-import React from 'react';
-import '../css/landing-page.css';
-import '../css/landing-styles.css';
-import Head from '@docusaurus/Head';
-import { StatelyAgent } from '../components/landing/StatelyAgent';
-
-export default function Agent() {
- return (
- // We need the class name `twp` here to ensure the Tailwind reset gets applied to all children.
-
-
-
Stately | Build complex logic intelligently
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
diff --git a/src/pages/code-of-conduct.mdx b/src/pages/code-of-conduct.mdx
deleted file mode 100644
index 53ff0b626..000000000
--- a/src/pages/code-of-conduct.mdx
+++ /dev/null
@@ -1,139 +0,0 @@
----
-title: Code of conduct
-image: share-image-code-of-conduct.png
-description: 'The Stately code of conduct outlines our commitment to creating an inclusive environment and how we expect our community to treat each other.'
----
-
-# Stately code of conduct
-
-Last updated May 26, 2022.
-
-## Our pledge
-
-We as members, contributors, and leaders pledge to make participation in our
-community a harassment-free experience for everyone, regardless of age, body
-size, visible or invisible disability, ethnicity, sex characteristics, gender
-identity and expression, level of experience, education, socio-economic status,
-nationality, personal appearance, race, caste, color, religion, or sexual
-identity and orientation.
-
-We pledge to act and interact in ways that contribute to an open, welcoming,
-diverse, inclusive, and healthy community.
-
-## Our standards
-
-Examples of behavior that contributes to a positive environment for our
-community include:
-
-- Demonstrating empathy and kindness toward other people
-- Being respectful of differing opinions, viewpoints, and experiences
-- Giving and gracefully accepting constructive feedback
-- Accepting responsibility and apologizing to those affected by our mistakes,
- and learning from the experience
-- Focusing on what is best not just for us as individuals, but for the overall
- community
-
-Examples of unacceptable behavior include:
-
-- The use of sexualized language or imagery, and sexual attention or advances of
- any kind
-- Trolling, insulting or derogatory comments, and personal or political attacks
-- Public or private harassment
-- Publishing others' private information, such as a physical or email address,
- without their explicit permission
-- Other conduct which could reasonably be considered inappropriate in a
- professional setting
-
-## Enforcement responsibilities
-
-Community leaders are responsible for clarifying and enforcing our standards of
-acceptable behavior and will take appropriate and fair corrective action in
-response to any behavior that they deem inappropriate, threatening, offensive,
-or harmful.
-
-Community leaders have the right and responsibility to remove, edit, or reject
-comments, commits, code, wiki edits, issues, and other contributions that are
-not aligned to this Code of Conduct, and will communicate reasons for moderation
-decisions when appropriate.
-
-## Scope
-
-This Code of Conduct applies within all community spaces, and also applies when
-an individual is officially representing the community in public spaces.
-Examples of representing our community include using an official e-mail address,
-posting via an official social media account, or acting as an appointed
-representative at an online or offline event.
-
-## Enforcement
-
-Instances of abusive, harassing, or otherwise unacceptable behavior may be
-reported to the community leaders responsible for enforcement at **support@stately.ai**.
-All complaints will be reviewed and investigated promptly and fairly.
-
-All community leaders are obligated to respect the privacy and security of the
-reporter of any incident.
-
-## Enforcement guidelines
-
-Community leaders will follow these Community impact Guidelines in determining
-the consequences for any action they deem in violation of this Code of Conduct:
-
-### 1. Correction
-
-**Community impact**: Use of inappropriate language or other behavior deemed
-unprofessional or unwelcome in the community.
-
-**Consequence**: A private, written warning from community leaders, providing
-clarity around the nature of the violation and an explanation of why the
-behavior was inappropriate. A public apology may be requested.
-
-### 2. Warning
-
-**Community impact**: A violation through a single incident or series of
-actions.
-
-**Consequence**: A warning with consequences for continued behavior. No
-interaction with the people involved, including unsolicited interaction with
-those enforcing the Code of Conduct, for a specified period of time. This
-includes avoiding interactions in community spaces as well as external channels
-like social media. Violating these terms may lead to a temporary or permanent
-ban.
-
-### 3. Temporary ban
-
-**Community impact**: A serious violation of community standards, including
-sustained inappropriate behavior.
-
-**Consequence**: A temporary ban from any sort of interaction or public
-communication with the community for a specified period of time. No public or
-private interaction with the people involved, including unsolicited interaction
-with those enforcing the Code of Conduct, is allowed during this period.
-Violating these terms may lead to a permanent ban.
-
-### 4. Permanent Bban
-
-**Community impact**: Demonstrating a pattern of violation of community
-standards, including sustained inappropriate behavior, harassment of an
-individual, or aggression toward or disparagement of classes of individuals.
-
-**Consequence**: A permanent ban from any sort of public interaction within the
-community.
-
-## Attribution
-
-This Code of Conduct is adapted from the [Contributor Covenant][homepage],
-version 2.1, available at
-[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
-
-Community impact Guidelines were inspired by
-[Mozilla's code of conduct enforcement ladder][mozilla coc].
-
-For answers to common questions about this code of conduct, see the FAQ at
-[https://www.contributor-covenant.org/faq][faq]. Translations are available at
-[https://www.contributor-covenant.org/translations][translations].
-
-[homepage]: https://www.contributor-covenant.org
-[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
-[mozilla coc]: https://github.com/mozilla/diversity
-[faq]: https://www.contributor-covenant.org/faq
-[translations]: https://www.contributor-covenant.org/translations
diff --git a/src/pages/index.tsx b/src/pages/index.tsx
deleted file mode 100644
index 01899c0bb..000000000
--- a/src/pages/index.tsx
+++ /dev/null
@@ -1,92 +0,0 @@
-import Head from '@docusaurus/Head';
-import { useEffect } from 'react';
-import { Benefits } from '../components/landing/Benefits';
-import { FinalCallToAction } from '../components/landing/FinalCallToAction';
-import { Footer } from '../components/landing/Footer';
-import { Intro } from '../components/landing/Intro';
-import { Navbar } from '../components/landing/Navbar';
-import { Testimonials } from '../components/landing/Testimonials';
-import { CaseStudies } from '../components/landing/CaseStudies';
-import '../css/landing-page.css';
-import '../css/landing-styles.css';
-
-export default function Index() {
- useEffect(() => {
- // Add the crisp chat script after the dynamic html has been loaded
- // @ts-ignore
- window.$crisp = [];
- // @ts-ignore
- window.CRISP_WEBSITE_ID = 'dff22f8a-0d73-4a83-91be-1f448410c464';
- (function () {
- let d = document;
- let s = d.createElement('script');
- s.src = 'https://client.crisp.chat/l.js';
- s.async = true;
- d.getElementsByTagName('head')[0].appendChild(s);
- })();
- }, []);
-
- return (
- // We need the class name `twp` here to ensure the Tailwind reset gets applied to all children.
-
-
-
Stately | Build complex logic intelligently
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-}
diff --git a/src/pages/pricing.tsx b/src/pages/pricing.tsx
deleted file mode 100644
index 8a3bedee3..000000000
--- a/src/pages/pricing.tsx
+++ /dev/null
@@ -1,35 +0,0 @@
-import useBaseUrl from '@docusaurus/useBaseUrl';
-import React, { useEffect } from 'react';
-
-// https://github.com/facebook/docusaurus/discussions/8387#discussioncomment-6067944
-// Loading a static HTML only works during SSR, so we use this hack to make it work during CSR
-export default function Index() {
- const landingPage = useBaseUrl('/pricing/index.html');
- const [html, setHtml] = React.useState('');
-
- useEffect(() => {
- // Fetch the HTML file from the static folder
- fetch(landingPage)
- // Convert the response to text
- .then((response) => response.text())
- // Set the HTML
- .then((html) => {
- setHtml(html);
-
- // Add the crisp chat script after the dynamic html has been loaded
- // @ts-ignore
- window.$crisp = [];
- // @ts-ignore
- window.CRISP_WEBSITE_ID = 'dff22f8a-0d73-4a83-91be-1f448410c464';
- (function () {
- let d = document;
- let s = d.createElement('script');
- s.src = 'https://client.crisp.chat/l.js';
- s.async = true;
- d.getElementsByTagName('head')[0].appendChild(s);
- })();
- });
- }, []);
-
- return
;
-}
diff --git a/src/pages/privacy.mdx b/src/pages/privacy.mdx
deleted file mode 100644
index 109ad3050..000000000
--- a/src/pages/privacy.mdx
+++ /dev/null
@@ -1,160 +0,0 @@
----
-title: Privacy
-image: share-image-privacy.png
-description: 'The Stately privacy policy outlines how we collect, use, and protect your personal data when you use our platform.'
----
-
-# Privacy policy
-
-Last updated February 2024:
-
-- Added information about [Stately Inspector](#inspector)
-
-## Analytics
-
-We use Plausible Analytics to collect aggregated statistics about your visits to Stately’s websites. The statistics include information such as pageviews, visit duration, visitors’ countries and devices. The aggregated statistics have no way to identify individuals from that data, and no data about any specific individual.
-
-[Plausible’s privacy information](https://plausible.io/privacy-focused-web-analytics).
-
-We track how you use Stately Studio and use Mixpanel to analyze the activity data. With your consent in the Studio settings, we attribute your hashed user id to the activity data. Analyzing patterns in user activity helps us understand how you use our tools and how we might improve your experience.
-
-[Mixpanel’s privacy information](https://mixpanel.com/legal/privacy-hub/).
-
-## Survey
-
-We use Google Forms for our surveys. Your survey responses are stored with Google. We do not collect any information about you except what you provide in your responses, and you’re not required to provide your email address unless you consent to further contact from us.
-
-We use the survey responses to help research and develop our products, and to potentially contact respondents for future research. We will not share any of the survey answers, or your email address, with any third-parties.
-
-If you would like us to delete your survey responses, please email jenny@stately.ai.
-
-[Google’s privacy policy](https://policies.google.com/privacy).
-
-## Storage
-
-We use Supabase as a database for our platform. We use the database to store your profile information required for login (email), optional profile information (name, profile picture) as well as any data you save on our platform. We also use Supabase to store any assets you add to your projects. We do not use Supabase to collect any further information about you.
-
-If you would like to delete your profile information from our database, please email support@stately.ai.
-
-[Supabase’s privacy policy](https://supabase.io/privacy).
-
-## Authentication
-
-We use GitHub, Google, and Twitter for authentication so you can sign into our platform using their platforms. We do not use these providers to collect any information about you.
-
-### GitHub Sync
-
-We use [GitHub tokens](https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/generating-a-user-access-token-for-a-github-app) to sync your GitHub repositories to your Stately projects when you connect a GitHub repo. We do not use GitHub to collect any information about you.
-
-[GitHub’s privacy statement](https://docs.github.com/en/github/site-policy/github-privacy-statement#github-privacy-statement).
-
-### Figma Sync
-
-We use [Figma tokens](https://help.figma.com/hc/en-us/articles/8085703771159-Manage-personal-access-tokens) to sync your Figma frames when you embed Figma assets. We do not use Figma to collect any information about you.
-
-[Figma’s privacy policy](https://www.figma.com/legal/privacy/).
-
-## Hosting
-
-We use GitHub to host our repositories and GitHub Pages to host our legacy documentation. We do not use GitHub to collect any information about you.
-
-[GitHub’s privacy statement](https://docs.github.com/en/github/site-policy/github-privacy-statement#github-privacy-statement).
-
-We use Vercel to host:
-
-- [stately.ai website](https://stately.ai)
-- [our docs and blog](https:stately.ai/docs)
-- our platform and API
-
-Vercel collects activity logs which includes your user agent information to help us understand where we need to fix bugs. We do not use Vercel to collect any further information about you.
-
-[Vercel’s privacy policy](https://vercel.com/legal/privacy-policy).
-
-We use Amazon Web Services to host a microservice that generates preview images of public machines. We do not use AWS to collect any information about you.
-
-## Videos and livestreams
-
-We use YouTube to broadcast livestreams and host our videos. We do not use YouTube to collect any information about you.
-
-[Google’s privacy policy](https://policies.google.com/privacy).
-
-We use StreamYard to record and broadcast livestreams. You will only have access to StreamYard if you join us as a guest in the StreamYard studio. We do not use StreamYard to collect any information about you.
-
-[StreamYard’s privacy policy](https://streamyard.com/resources/docs/privacy/index.html).
-
-## Chat
-
-We use Discord as a chat server for discussions about XState and Stately. We do not use Discord to collect any information about you.
-
-[Discord’s privacy policy](https://discord.com/privacy).
-
-## Search
-
-We use Algolia search to:
-
-- Index Stately Studio projects and machines
-- Provide useful search results in Stately Studio based on your search keywords.
-- Index our documentation content
-- Provide useful search results in our documentation based on your search keywords.
-
-We do not use Algolia to collect any information about you.
-
-[Algolia’s privacy policy, relevant section: 9](https://www.algolia.com/policies/privacy/).
-
-## Payment processing
-
-We use Stripe to collect your payment information and accept payments. We do not store any of your payment information ourselves, or use Stripe to collect any information about you.
-
-[Stripe’s privacy information](https://stripe.com/ie/privacy).
-
-## Studio emails
-
-We use Postmark to send you emails about your account and teams in the Stately Studio. We do not use your email address for any other purposes unless you have signed up to our [mailing list](#mailing-list). We do not use Postmark to collect any information about you.
-
-[Postmark’s privacy policy](https://postmarkapp.com/privacy-policy).
-
-## Mailing list
-
-We use Crisp to host our mailing list. Your email address is securely stored with Crisp.
-
-If you sign up for our mailing list, we will only use your email address to send you updates about Stately, or to request your feedback on Stately’s work. We will not send you spam and we will not share or sell your email address to any third-parties.
-
-You can unsubscribe from our mailing list at any time using the unsubscribe link included in all of our emails.
-
-[Crisp’s privacy policy](https://crisp.chat/en/privacy/).
-
-## Bug tracking
-
-We use Sentry to track bugs.
-
-While using the Studio, we gather data about your actions and your operating system and browser, commonly referred to as the [user_agent](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent). This is the only personally-identifiable information we send to Sentry.
-
-The actions we send to Sentry include copying nodes, moving edges, and similar events you can do in Stately Studio’s editor.
-
-We use this information to detect and address any issues that may have been overlooked during our quality control process.
-
-[Sentry’s privacy policy](https://sentry.io/privacy/).
-
-## Connecting actors
-
-We use Partykit for live connections between running actors.
-We don’t send any personal data to Partykit.
-We send machine configurations and events for the actors.
-
-[Partykit’s privacy policy](https://partykit.io/privacy)
-
-## Stately AI
-
-We use OpenAI for Stately AI features including generating flows, generating summaries, and enhancing generated React apps. The Stately AI features are optional Premium features and we do not send any of your personal data to OpenAI. We only send your machine configurations back to OpenAI if you are modifying an existing flow.
-
-[OpenAI’s privacy policy](https://openai.com/policies/privacy-policy)
-
-## Stately Inspector
-
-When you use Stately Inspector, your machine configurations are sent to our servers to generate the visualizations. We do not store your machine configurations on our servers or collect any information about your machines.
-
-## Support
-
-We use Crisp to respond to Premium support emails. Your email address is securely stored with Crisp. We do not use your email address for any other purpose.
-
-[Crisp’s privacy policy](https://crisp.chat/en/privacy/).
diff --git a/src/theme/Admonition/index.js b/src/theme/Admonition/index.js
deleted file mode 100644
index 951d0aeeb..000000000
--- a/src/theme/Admonition/index.js
+++ /dev/null
@@ -1,364 +0,0 @@
-import Translate from '@docusaurus/Translate';
-import { ThemeClassNames } from '@docusaurus/theme-common';
-import clsx from 'clsx';
-import React from 'react';
-import styles from './styles.module.css';
-function NoteIcon() {
- return (
-
-
-
- );
-}
-function TipIcon() {
- return (
-
-
-
- );
-}
-function DangerIcon() {
- return (
-
-
-
- );
-}
-function InfoIcon() {
- return (
-
-
-
- );
-}
-function CautionIcon() {
- return (
-
-
-
- );
-}
-function XStateIcon() {
- return (
-
-
-
- );
-}
-function TypeScriptIcon() {
- return (
-
-
-
- );
-}
-function StatelyIcon() {
- return (
-
-
-
-
-
- );
-}
-function PartyIcon() {
- return (
-
-
-
- );
-}
-function PlayIcon() {
- return (
-
-
-
- );
-}
-// eslint-disable-next-line @typescript-eslint/consistent-indexed-object-style
-const AdmonitionConfigs = {
- note: {
- infimaClassName: 'secondary',
- iconComponent: NoteIcon,
- label: (
-
- Note
-
- ),
- },
- tip: {
- infimaClassName: 'tip',
- iconComponent: TipIcon,
- label: (
-
- Tip
-
- ),
- },
- danger: {
- infimaClassName: 'danger',
- iconComponent: DangerIcon,
- label: (
-
- Danger
-
- ),
- },
- info: {
- infimaClassName: 'info',
- iconComponent: InfoIcon,
- label: (
-
- Info
-
- ),
- },
- caution: {
- infimaClassName: 'warning',
- iconComponent: CautionIcon,
- label: (
-
- Caution
-
- ),
- },
- warning: {
- infimaClassName: 'warning',
- iconComponent: CautionIcon,
- label: (
-
- Warning
-
- ),
- },
- xstate: {
- infimaClassName: 'xstate',
- iconComponent: XStateIcon,
- label: (
-
- XState
-
- ),
- },
- typescript: {
- infimaClassName: 'typescript',
- iconComponent: TypeScriptIcon,
- label: (
-
- TypeScript
-
- ),
- },
- studio: {
- infimaClassName: 'studio',
- iconComponent: StatelyIcon,
- label: (
-
- Studio
-
- ),
- },
- warningxstate: {
- infimaClassName: 'warningxstate',
- iconComponent: XStateIcon,
- label: (
-
- XState Warning
-
- ),
- },
- new: {
- infimaClassName: 'new',
- iconComponent: PartyIcon,
- label: (
-
- New
-
- ),
- },
- breakingchange: {
- infimaClassName: 'breakingchange',
- iconComponent: DangerIcon,
- label: (
-
- Breaking change
-
- ),
- },
- video: {
- infimaClassName: 'video',
- iconComponent: PlayIcon,
- label: (
-
- Video
-
- ),
- },
-};
-// Legacy aliases, undocumented but kept for retro-compatibility
-const aliases = {
- secondary: 'note',
- important: 'info',
- success: 'tip',
- warning: 'danger',
-};
-function getAdmonitionConfig(unsafeType) {
- const type = aliases[unsafeType] ?? unsafeType;
- const config = AdmonitionConfigs[type];
- if (config) {
- return config;
- }
- console.warn(
- `No admonition config found for admonition type "${type}". Using Info as fallback.`,
- );
- return AdmonitionConfigs.info;
-}
-// Workaround because it's difficult in MDX v1 to provide a MDX title as props
-// See https://github.com/facebook/docusaurus/pull/7152#issuecomment-1145779682
-function extractMDXAdmonitionTitle(children) {
- const items = React.Children.toArray(children);
- const mdxAdmonitionTitle = items.find(
- (item) =>
- React.isValidElement(item) &&
- item.props?.mdxType === 'mdxAdmonitionTitle',
- );
- const rest = <>{items.filter((item) => item !== mdxAdmonitionTitle)}>;
- return {
- mdxAdmonitionTitle,
- rest,
- };
-}
-function processAdmonitionProps(props) {
- const { mdxAdmonitionTitle, rest } = extractMDXAdmonitionTitle(
- props.children,
- );
- return {
- ...props,
- title: props.title ?? mdxAdmonitionTitle,
- children: rest,
- };
-}
-export default function Admonition(props) {
- const {
- children,
- type,
- title,
- icon: iconProp,
- } = processAdmonitionProps(props);
- const typeConfig = getAdmonitionConfig(type);
- const titleLabel = title ?? typeConfig.label;
- const { iconComponent: IconComponent } = typeConfig;
- const icon = iconProp ?? ;
- return (
-
-
- {icon}
-
- {children}
-
- );
-}
diff --git a/src/theme/Admonition/styles.module.css b/src/theme/Admonition/styles.module.css
deleted file mode 100644
index 77b8748c4..000000000
--- a/src/theme/Admonition/styles.module.css
+++ /dev/null
@@ -1,27 +0,0 @@
-.admonition {
- margin-bottom: 1em;
-}
-
-/* visually hide admonition headings as we should be using headings inside the admonition content
- the heading text will act as alternative text for the icons
-*/
-
-.admonitionHeading code {
- text-transform: none;
-}
-
-.admonitionIcon svg {
- vertical-align: middle;
- height: 1.2em;
- width: 1.2em;
- fill: currentColor;
- margin-top: -2px; /* pull icon to align vertically with text */
-}
-
-.admonitionContent > * {
- margin-bottom: 0.35em;
-}
-
-.admonitionContent > :last-child {
- margin-bottom: 0;
-}
\ No newline at end of file
diff --git a/src/theme/BlogLayout/index.js b/src/theme/BlogLayout/index.js
deleted file mode 100644
index b1866845e..000000000
--- a/src/theme/BlogLayout/index.js
+++ /dev/null
@@ -1,28 +0,0 @@
-import React from 'react';
-import clsx from 'clsx';
-import Layout from '@theme/Layout';
-import BlogSidebar from '@theme/BlogSidebar';
-export default function BlogLayout(props) {
- const { sidebar, toc, children, ...layoutProps } = props;
- const hasSidebar = sidebar && sidebar.items.length > 0;
- return (
-
-
-
-
-
- {children}
-
- {toc &&
{toc}
}
-
-
-
- );
-}
diff --git a/src/theme/BlogPostItem/Container/index.js b/src/theme/BlogPostItem/Container/index.js
deleted file mode 100644
index f8aaef97f..000000000
--- a/src/theme/BlogPostItem/Container/index.js
+++ /dev/null
@@ -1,24 +0,0 @@
-import React from 'react';
-import { useBaseUrlUtils } from '@docusaurus/useBaseUrl';
-import { useBlogPost } from '@docusaurus/theme-common/internal';
-export default function BlogPostItemContainer({ children, className }) {
- const { frontMatter, assets } = useBlogPost();
- const { withBaseUrl } = useBaseUrlUtils();
- const image = assets.image ?? frontMatter.image;
- return (
-
- {image && (
-
- )}
- {children}
-
- );
-}
diff --git a/src/theme/BlogPostItem/Content/index.js b/src/theme/BlogPostItem/Content/index.js
deleted file mode 100644
index 55f642b95..000000000
--- a/src/theme/BlogPostItem/Content/index.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import React from 'react';
-import clsx from 'clsx';
-import { blogPostContainerID } from '@docusaurus/utils-common';
-import { useBlogPost } from '@docusaurus/theme-common/internal';
-import MDXContent from '@theme/MDXContent';
-export default function BlogPostItemContent({ children, className }) {
- const { isBlogPostPage } = useBlogPost();
- return (
-
- {children}
-
- );
-}
diff --git a/src/theme/BlogPostItem/Footer/ReadMoreLink/index.js b/src/theme/BlogPostItem/Footer/ReadMoreLink/index.js
deleted file mode 100644
index 5a1770865..000000000
--- a/src/theme/BlogPostItem/Footer/ReadMoreLink/index.js
+++ /dev/null
@@ -1,32 +0,0 @@
-import React from 'react';
-import Translate, { translate } from '@docusaurus/Translate';
-import Link from '@docusaurus/Link';
-function ReadMoreLabel() {
- return (
-
- Read More
-
- );
-}
-export default function BlogPostItemFooterReadMoreLink(props) {
- const { blogPostTitle, ...linkProps } = props;
- return (
-
-
-
- );
-}
diff --git a/src/theme/BlogPostItem/Footer/index.js b/src/theme/BlogPostItem/Footer/index.js
deleted file mode 100644
index 59f7a8aec..000000000
--- a/src/theme/BlogPostItem/Footer/index.js
+++ /dev/null
@@ -1,54 +0,0 @@
-import React from 'react';
-import clsx from 'clsx';
-import { useBlogPost } from '@docusaurus/theme-common/internal';
-import EditThisPage from '@theme/EditThisPage';
-import TagsListInline from '@theme/TagsListInline';
-import ReadMoreLink from '@theme/BlogPostItem/Footer/ReadMoreLink';
-import styles from './styles.module.css';
-export default function BlogPostItemFooter() {
- const { metadata, isBlogPostPage } = useBlogPost();
- const { tags, title, editUrl, hasTruncateMarker } = metadata;
- // A post is truncated if it's in the "list view" and it has a truncate marker
- const truncatedPost = !isBlogPostPage && hasTruncateMarker;
- const tagsExists = tags.length > 0;
- const renderFooter = tagsExists || truncatedPost || editUrl;
- if (!renderFooter) {
- return null;
- }
- return (
-
- {isBlogPostPage && tagsExists && (
-
-
-
- )}
-
- {isBlogPostPage && editUrl && (
-
-
-
- )}
-
- {truncatedPost && (
-
- )}
-
- );
-}
diff --git a/src/theme/BlogPostItem/Footer/styles.module.css b/src/theme/BlogPostItem/Footer/styles.module.css
deleted file mode 100644
index b1e8a8db4..000000000
--- a/src/theme/BlogPostItem/Footer/styles.module.css
+++ /dev/null
@@ -1,3 +0,0 @@
-.blogPostFooterDetailsFull {
- flex-direction: column;
-}
\ No newline at end of file
diff --git a/src/theme/BlogPostItem/Header/Author/index.js b/src/theme/BlogPostItem/Header/Author/index.js
deleted file mode 100644
index 3263848ef..000000000
--- a/src/theme/BlogPostItem/Header/Author/index.js
+++ /dev/null
@@ -1,42 +0,0 @@
-import React from 'react';
-import clsx from 'clsx';
-import Link from '@docusaurus/Link';
-function MaybeLink(props) {
- if (props.href) {
- return ;
- }
- return <>{props.children}>;
-}
-export default function BlogPostItemHeaderAuthor({ author, className }) {
- const { name, title, url, imageURL, email } = author;
- const link = url || (email && `mailto:${email}`) || undefined;
- return (
-
- {imageURL && (
-
-
-
- )}
-
- {name && (
-
-
-
- {name}
-
-
- {title && (
-
- {title}
-
- )}
-
- )}
-
- );
-}
diff --git a/src/theme/BlogPostItem/Header/Authors/index.js b/src/theme/BlogPostItem/Header/Authors/index.js
deleted file mode 100644
index 9f2b156aa..000000000
--- a/src/theme/BlogPostItem/Header/Authors/index.js
+++ /dev/null
@@ -1,44 +0,0 @@
-import React from 'react';
-import clsx from 'clsx';
-import { useBlogPost } from '@docusaurus/theme-common/internal';
-import BlogPostItemHeaderAuthor from '@theme/BlogPostItem/Header/Author';
-import styles from './styles.module.css';
-// Component responsible for the authors layout
-export default function BlogPostItemHeaderAuthors({ className }) {
- const {
- metadata: { authors },
- assets,
- } = useBlogPost();
- const authorsCount = authors.length;
- if (authorsCount === 0) {
- return null;
- }
- const imageOnly = authors.every(({ name }) => !name);
- return (
-
- {authors.map((author, idx) => (
-
-
-
- ))}
-
- );
-}
diff --git a/src/theme/BlogPostItem/Header/Authors/styles.module.css b/src/theme/BlogPostItem/Header/Authors/styles.module.css
deleted file mode 100644
index c5aac4d9a..000000000
--- a/src/theme/BlogPostItem/Header/Authors/styles.module.css
+++ /dev/null
@@ -1,14 +0,0 @@
-.authorCol {
- max-width: inherit !important;
- flex-grow: 1 !important;
-}
-
-.imageOnlyAuthorRow {
- display: flex;
- flex-flow: row wrap;
-}
-
-.imageOnlyAuthorCol {
- margin-left: 0.3rem;
- margin-right: 0.3rem;
-}
diff --git a/src/theme/BlogPostItem/Header/Info/index.js b/src/theme/BlogPostItem/Header/Info/index.js
deleted file mode 100644
index dcf397287..000000000
--- a/src/theme/BlogPostItem/Header/Info/index.js
+++ /dev/null
@@ -1,54 +0,0 @@
-import React from 'react';
-import clsx from 'clsx';
-import { translate } from '@docusaurus/Translate';
-import { usePluralForm } from '@docusaurus/theme-common';
-import { useBlogPost } from '@docusaurus/theme-common/internal';
-import styles from './styles.module.css';
-// Very simple pluralization: probably good enough for now
-function useReadingTimePlural() {
- const { selectMessage } = usePluralForm();
- return (readingTimeFloat) => {
- const readingTime = Math.ceil(readingTimeFloat);
- return selectMessage(
- readingTime,
- translate(
- {
- id: 'theme.blog.post.readingTime.plurals',
- description:
- 'Pluralized label for "{readingTime} min read". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',
- message: 'One min read|{readingTime} min read',
- },
- { readingTime },
- ),
- );
- };
-}
-function ReadingTime({ readingTime }) {
- const readingTimePlural = useReadingTimePlural();
- return <>{readingTimePlural(readingTime)}>;
-}
-function Date({ date, formattedDate }) {
- return (
-
- {formattedDate}
-
- );
-}
-function Spacer() {
- return <>{' — '}>;
-}
-export default function BlogPostItemHeaderInfo({ className }) {
- const { metadata } = useBlogPost();
- const { date, formattedDate, readingTime } = metadata;
- return (
-
-
- {typeof readingTime !== 'undefined' && (
- <>
-
-
- >
- )}
-
- );
-}
diff --git a/src/theme/BlogPostItem/Header/Info/styles.module.css b/src/theme/BlogPostItem/Header/Info/styles.module.css
deleted file mode 100644
index 27d569e08..000000000
--- a/src/theme/BlogPostItem/Header/Info/styles.module.css
+++ /dev/null
@@ -1,3 +0,0 @@
-.container {
- font-size: 0.9rem;
-}
diff --git a/src/theme/BlogPostItem/Header/Title/index.js b/src/theme/BlogPostItem/Header/Title/index.js
deleted file mode 100644
index 72425f763..000000000
--- a/src/theme/BlogPostItem/Header/Title/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-import React from 'react';
-import clsx from 'clsx';
-import Link from '@docusaurus/Link';
-import { useBlogPost } from '@docusaurus/theme-common/internal';
-import styles from './styles.module.css';
-export default function BlogPostItemHeaderTitle({ className }) {
- const { metadata, isBlogPostPage } = useBlogPost();
- const { permalink, title } = metadata;
- const TitleHeading = isBlogPostPage ? 'h1' : 'h2';
- return (
-
- {isBlogPostPage ? (
- title
- ) : (
-
- {title}
-
- )}
-
- );
-}
diff --git a/src/theme/BlogPostItem/Header/Title/styles.module.css b/src/theme/BlogPostItem/Header/Title/styles.module.css
deleted file mode 100644
index 4905fd5c8..000000000
--- a/src/theme/BlogPostItem/Header/Title/styles.module.css
+++ /dev/null
@@ -1,17 +0,0 @@
-.title {
- font-size: 2.5rem;
-}
-
-.title a {
- font-size: 2.5rem;
- text-decoration: none;
-}
-
-/**
- Blog post title should be smaller on smaller devices
-**/
-@media (max-width: 576px) {
- .title {
- font-size: 2rem;
- }
-}
diff --git a/src/theme/BlogPostItem/Header/index.js b/src/theme/BlogPostItem/Header/index.js
deleted file mode 100644
index d79ad4e0a..000000000
--- a/src/theme/BlogPostItem/Header/index.js
+++ /dev/null
@@ -1,13 +0,0 @@
-import React from 'react';
-import BlogPostItemHeaderTitle from '@theme/BlogPostItem/Header/Title';
-import BlogPostItemHeaderInfo from '@theme/BlogPostItem/Header/Info';
-import BlogPostItemHeaderAuthors from '@theme/BlogPostItem/Header/Authors';
-export default function BlogPostItemHeader() {
- return (
-
-
-
-
-
- );
-}
diff --git a/src/theme/BlogPostItem/index.js b/src/theme/BlogPostItem/index.js
deleted file mode 100644
index a8ffec44e..000000000
--- a/src/theme/BlogPostItem/index.js
+++ /dev/null
@@ -1,24 +0,0 @@
-import { useBlogPost } from '@docusaurus/theme-common/internal';
-import BlogPostItemContainer from '@theme/BlogPostItem/Container';
-import BlogPostItemContent from '@theme/BlogPostItem/Content';
-import BlogPostItemFooter from '@theme/BlogPostItem/Footer';
-import BlogPostItemHeader from '@theme/BlogPostItem/Header';
-import clsx from 'clsx';
-import React from 'react';
-
-// apply a bottom margin in list view
-function useContainerClassName() {
- const { isBlogPostPage } = useBlogPost();
- return !isBlogPostPage ? 'margin-bottom--xl' : undefined;
-}
-export default function BlogPostItem({ children, className }) {
- const containerClassName = useContainerClassName();
-
- return (
-
-
- {children}
-
-
- );
-}
diff --git a/src/theme/BlogTagsListPage/index.js b/src/theme/BlogTagsListPage/index.js
deleted file mode 100644
index e3a95dd07..000000000
--- a/src/theme/BlogTagsListPage/index.js
+++ /dev/null
@@ -1,39 +0,0 @@
-import React from 'react';
-import clsx from 'clsx';
-import { translate } from '@docusaurus/Translate';
-import {
- PageMetadata,
- HtmlClassNameProvider,
- ThemeClassNames,
- translateTagsPageTitle,
-} from '@docusaurus/theme-common';
-import BlogLayout from '@theme/BlogLayout';
-import TagsListByLetter from '@theme/TagsListByLetter';
-import SearchMetadata from '@theme/SearchMetadata';
-function useBlogTagsPostsPageDescription() {
- return translate({
- id: 'theme.blog.tagListPageDescription',
- description: 'The description of the page for a blog tag',
- message: 'Browse all the tags used in the posts.',
- });
-}
-
-export default function BlogTagsListPage({ tags, sidebar }) {
- const title = translateTagsPageTitle();
- const description = useBlogTagsPostsPageDescription();
- return (
-
-
-
-
- {title}
-
-
-
- );
-}
diff --git a/src/theme/BlogTagsPostsPage/index.js b/src/theme/BlogTagsPostsPage/index.js
deleted file mode 100644
index ae88621d8..000000000
--- a/src/theme/BlogTagsPostsPage/index.js
+++ /dev/null
@@ -1,97 +0,0 @@
-import React from 'react';
-import clsx from 'clsx';
-import Translate, { translate } from '@docusaurus/Translate';
-import {
- PageMetadata,
- HtmlClassNameProvider,
- ThemeClassNames,
- usePluralForm,
-} from '@docusaurus/theme-common';
-import Link from '@docusaurus/Link';
-import BlogLayout from '@theme/BlogLayout';
-import BlogListPaginator from '@theme/BlogListPaginator';
-import SearchMetadata from '@theme/SearchMetadata';
-import BlogPostItems from '@theme/BlogPostItems';
-// Very simple pluralization: probably good enough for now
-function useBlogPostsPlural() {
- const { selectMessage } = usePluralForm();
- return (count) =>
- selectMessage(
- count,
- translate(
- {
- id: 'theme.blog.post.plurals',
- description:
- 'Pluralized label for "{count} posts". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',
- message: 'One post|{count} posts',
- },
- { count },
- ),
- );
-}
-function useBlogTagsPostsPageTitle(tag) {
- const blogPostsPlural = useBlogPostsPlural();
- return translate(
- {
- id: 'theme.blog.tagTitle',
- description: 'The title of the page for a blog tag',
- message: '{nPosts} tagged with "{tagName}"',
- },
- { nPosts: blogPostsPlural(tag.count), tagName: tag.label },
- );
-}
-function useBlogTagsPostsPageDescription(tag) {
- const blogPostsPlural = useBlogPostsPlural();
- return translate(
- {
- id: 'theme.blog.tagDescription',
- description: 'The description of the page for a blog tag',
- message: 'Browse all posts tagged with "{tagName}". {nPosts} found.',
- },
- { nPosts: blogPostsPlural(tag.count), tagName: tag.label },
- );
-}
-function BlogTagsPostsPageMetadata({ tag }) {
- const title = useBlogTagsPostsPageTitle(tag);
- const description = useBlogTagsPostsPageDescription(tag);
- return (
- <>
-
-
- >
- );
-}
-function BlogTagsPostsPageContent({ tag, items, sidebar, listMetadata }) {
- const title = useBlogTagsPostsPageTitle(tag);
- return (
-
-
- {title}
-
-
-
- View All Tags
-
-
-
-
-
-
- );
-}
-export default function BlogTagsPostsPage(props) {
- return (
-
-
-
-
- );
-}
diff --git a/src/theme/DocCard/index.js b/src/theme/DocCard/index.js
deleted file mode 100644
index 384f5956f..000000000
--- a/src/theme/DocCard/index.js
+++ /dev/null
@@ -1,70 +0,0 @@
-import Link from '@docusaurus/Link';
-import { translate } from '@docusaurus/Translate';
-import { useDocById } from '@docusaurus/theme-common/internal';
-import clsx from 'clsx';
-import styles from './styles.module.css';
-
-function CardContainer({ href, children }) {
- return (
-
- {children}
-
- );
-}
-function CardLayout({ href, title, description }) {
- return (
-
- {title}
- {description && (
-
- {description}
-
- )}
-
- );
-}
-function CardCategory({ item }) {
- const href = item.href;
- // Unexpected: categories that don't have a link have been filtered upfront
- if (!href) {
- return null;
- }
- return (
-
- );
-}
-function CardLink({ item }) {
- const doc = useDocById(item.docId);
- return (
-
- );
-}
-export default function DocCard({ item }) {
- switch (item.type) {
- case 'link':
- return ;
- case 'category':
- return ;
- default:
- throw new Error(`unknown item type ${JSON.stringify(item)}`);
- }
-}
diff --git a/src/theme/DocCard/styles.module.css b/src/theme/DocCard/styles.module.css
deleted file mode 100644
index 4f7ad27f4..000000000
--- a/src/theme/DocCard/styles.module.css
+++ /dev/null
@@ -1,27 +0,0 @@
-.cardContainer {
- --ifm-link-color: var(--ifm-color-emphasis-800);
- --ifm-link-hover-color: var(--ifm-color-emphasis-700);
- --ifm-link-hover-decoration: none;
-
- box-shadow: 0 1.5px 3px 0 rgb(0 0 0 / 15%);
- border: 1px solid var(--ifm-color-emphasis-200);
- transition: all var(--ifm-transition-fast) ease;
- transition-property: border, box-shadow;
-}
-
-.cardContainer:hover {
- border-color: var(--ifm-color-primary);
- box-shadow: 0 3px 6px 0 rgb(0 0 0 / 20%);
-}
-
-.cardContainer *:last-child {
- margin-bottom: 0;
-}
-
-.cardTitle {
- font-size: 1.2rem;
-}
-
-.cardDescription {
- font-size: 0.8rem;
-}
diff --git a/src/theme/DocCardList/index.js b/src/theme/DocCardList/index.js
deleted file mode 100644
index ba536cf5a..000000000
--- a/src/theme/DocCardList/index.js
+++ /dev/null
@@ -1,27 +0,0 @@
-import React from 'react';
-import clsx from 'clsx';
-import {
- useCurrentSidebarCategory,
- filterDocCardListItems,
-} from '@docusaurus/theme-common';
-import DocCard from '@theme/DocCard';
-function DocCardListForCurrentSidebarCategory({ className }) {
- const category = useCurrentSidebarCategory();
- return ;
-}
-export default function DocCardList(props) {
- const { items, className } = props;
- if (!items) {
- return ;
- }
- const filteredItems = filterDocCardListItems(items);
- return (
-
- {filteredItems.map((item, index) => (
-
-
-
- ))}
-
- );
-}
diff --git a/src/theme/DocCategoryGeneratedIndexPage/index.js b/src/theme/DocCategoryGeneratedIndexPage/index.js
deleted file mode 100644
index c9ef3f4bc..000000000
--- a/src/theme/DocCategoryGeneratedIndexPage/index.js
+++ /dev/null
@@ -1,60 +0,0 @@
-import React from 'react';
-import clsx from 'clsx';
-import {
- PageMetadata,
- useCurrentSidebarCategory,
-} from '@docusaurus/theme-common';
-import useBaseUrl from '@docusaurus/useBaseUrl';
-import DocCardList from '@theme/DocCardList';
-import DocPaginator from '@theme/DocPaginator';
-import DocVersionBanner from '@theme/DocVersionBanner';
-import DocVersionBadge from '@theme/DocVersionBadge';
-import DocBreadcrumbs from '@theme/DocBreadcrumbs';
-import Heading from '@theme/Heading';
-import styles from './styles.module.css';
-function DocCategoryGeneratedIndexPageMetadata({ categoryGeneratedIndex }) {
- return (
-
- );
-}
-function DocCategoryGeneratedIndexPageContent({ categoryGeneratedIndex }) {
- const category = useCurrentSidebarCategory();
- return (
-
-
-
-
-
-
-
- {categoryGeneratedIndex.title}
-
- {categoryGeneratedIndex.description && (
-
{categoryGeneratedIndex.description}
- )}
-
-
-
-
-
- );
-}
-export default function DocCategoryGeneratedIndexPage(props) {
- return (
- <>
-
-
- >
- );
-}
diff --git a/src/theme/DocCategoryGeneratedIndexPage/styles.module.css b/src/theme/DocCategoryGeneratedIndexPage/styles.module.css
deleted file mode 100644
index b04fa2e7d..000000000
--- a/src/theme/DocCategoryGeneratedIndexPage/styles.module.css
+++ /dev/null
@@ -1,19 +0,0 @@
-@media (min-width: 997px) {
- .generatedIndexPage {
- max-width: 75% !important;
- }
-
- .list article:nth-last-child(-n + 2) {
- margin-bottom: 0 !important;
- }
-}
-
-/* Duplicated from .markdown h1 */
-.title {
- --ifm-h1-font-size: 3rem;
- margin-bottom: calc(1.25 * var(--ifm-leading));
-}
-
-.list article:last-child {
- margin-bottom: 0 !important;
-}
diff --git a/src/theme/DocVersionBanner/index.js b/src/theme/DocVersionBanner/index.js
deleted file mode 100644
index c44563f54..000000000
--- a/src/theme/DocVersionBanner/index.js
+++ /dev/null
@@ -1,141 +0,0 @@
-import React from 'react';
-import clsx from 'clsx';
-import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
-import Link from '@docusaurus/Link';
-import Translate from '@docusaurus/Translate';
-import {
- useActivePlugin,
- useDocVersionSuggestions,
-} from '@docusaurus/plugin-content-docs/client';
-import { ThemeClassNames } from '@docusaurus/theme-common';
-import {
- useDocsPreferredVersion,
- useDocsVersion,
-} from '@docusaurus/theme-common/internal';
-function UnreleasedVersionLabel({ siteTitle, versionMetadata }) {
- return (
- {versionMetadata.label},
- }}
- >
- {
- 'This is unreleased documentation for {siteTitle} {versionLabel} version.'
- }
-
- );
-}
-function UnmaintainedVersionLabel({ siteTitle, versionMetadata }) {
- return (
- {versionMetadata.label},
- }}
- >
- {
- 'This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained.'
- }
-
- );
-}
-const BannerLabelComponents = {
- unreleased: UnreleasedVersionLabel,
- unmaintained: UnmaintainedVersionLabel,
-};
-function BannerLabel(props) {
- const BannerLabelComponent =
- BannerLabelComponents[props.versionMetadata.banner];
- return ;
-}
-function LatestVersionSuggestionLabel({ versionLabel, to, onClick }) {
- return (
-
-
- {versionLabel}
-
-
- ),
- }}
- >
- {'For {versionLabel}, see the {latestVersionLink} documentation.'}
-
- );
-}
-function DocVersionBannerEnabled({ className, versionMetadata }) {
- const {
- siteConfig: { title: siteTitle },
- } = useDocusaurusContext();
- const { pluginId } = useActivePlugin({ failfast: true });
- const getVersionMainDoc = (version) =>
- version.docs.find((doc) => doc.id === version.mainDocId);
- const { savePreferredVersionName } = useDocsPreferredVersion(pluginId);
- const { latestDocSuggestion, latestVersionSuggestion } =
- useDocVersionSuggestions(pluginId);
- // Try to link to same doc in latest version (not always possible), falling
- // back to main doc of latest version
- const latestVersionSuggestedDoc =
- latestDocSuggestion ?? getVersionMainDoc(latestVersionSuggestion);
- return (
-
-
-
-
-
-
-
-
- savePreferredVersionName(latestVersionSuggestion.name)
- }
- />
-
-
-
- );
-}
-export default function DocVersionBanner({ className }) {
- const versionMetadata = useDocsVersion();
- if (versionMetadata.banner) {
- return (
-
- );
- }
- return null;
-}
diff --git a/src/theme/Footer/Copyright/index.js b/src/theme/Footer/Copyright/index.js
deleted file mode 100644
index 58e4c55cd..000000000
--- a/src/theme/Footer/Copyright/index.js
+++ /dev/null
@@ -1,13 +0,0 @@
-import React from 'react';
-export default function FooterCopyright({ copyright }) {
- return (
-
-
-
- );
-}
diff --git a/src/theme/Footer/Links/MultiColumn/index.js b/src/theme/Footer/Links/MultiColumn/index.js
deleted file mode 100644
index 4a13d390d..000000000
--- a/src/theme/Footer/Links/MultiColumn/index.js
+++ /dev/null
@@ -1,37 +0,0 @@
-import React from 'react';
-import LinkItem from '@theme/Footer/LinkItem';
-function ColumnLinkItem({ item }) {
- return item.html ? (
-
- ) : (
-
-
-
- );
-}
-function Column({ column }) {
- return (
-
-
{column.title}
-
- {column.items.map((item, i) => (
-
- ))}
-
-
- );
-}
-export default function FooterLinksMultiColumn({ columns }) {
- return (
-
- {columns.map((column, i) => (
-
- ))}
-
- );
-}
diff --git a/src/theme/Footer/Links/Simple/index.js b/src/theme/Footer/Links/Simple/index.js
deleted file mode 100644
index 1c6412ddc..000000000
--- a/src/theme/Footer/Links/Simple/index.js
+++ /dev/null
@@ -1,27 +0,0 @@
-import React from 'react';
-import LinkItem from '@theme/Footer/LinkItem';
-function SimpleLinkItem({ item }) {
- return item.html ? (
-
- ) : (
-
- );
-}
-export default function FooterLinksSimple({ links }) {
- return (
-
-
- {links.map((item, i) => (
-
-
-
- ))}
-
-
- );
-}
diff --git a/src/theme/MDXComponents.ts b/src/theme/MDXComponents.ts
deleted file mode 100644
index 014009d66..000000000
--- a/src/theme/MDXComponents.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-// Import the original mapper
-import MDXComponents from '@theme-original/MDXComponents';
-import TabItem from '@theme/TabItem';
-import Tabs from '@theme/Tabs';
-import ThemedImage from '@theme/ThemedImage';
-import * as LucideIcons from 'lucide-react';
-import { Announcement } from '../components/Announcement';
-import EmbedMachine from '../components/EmbedMachine';
-import Tweet from '../components/embeds/Tweet';
-import YouTube from '../components/embeds/YouTube';
-
-export default {
- ...MDXComponents,
- ...LucideIcons,
- Announcement,
- Tweet,
- YouTube,
- EmbedMachine,
- ThemedImage,
- Tabs,
- TabItem,
-};
diff --git a/src/theme/Tabs/index.js b/src/theme/Tabs/index.js
deleted file mode 100644
index 39e915551..000000000
--- a/src/theme/Tabs/index.js
+++ /dev/null
@@ -1,121 +0,0 @@
-import React, { cloneElement } from 'react';
-import clsx from 'clsx';
-import {
- useScrollPositionBlocker,
- useTabs,
-} from '@docusaurus/theme-common/internal';
-import useIsBrowser from '@docusaurus/useIsBrowser';
-import styles from './styles.module.css';
-function TabList({ className, block, selectedValue, selectValue, tabValues }) {
- const tabRefs = [];
- const { blockElementScrollPositionUntilNextRender } =
- useScrollPositionBlocker();
- const handleTabChange = (event) => {
- const newTab = event.currentTarget;
- const newTabIndex = tabRefs.indexOf(newTab);
- const newTabValue = tabValues[newTabIndex].value;
- if (newTabValue !== selectedValue) {
- blockElementScrollPositionUntilNextRender(newTab);
- selectValue(newTabValue);
- }
- };
- const handleKeydown = (event) => {
- let focusElement = null;
- switch (event.key) {
- case 'Enter': {
- handleTabChange(event);
- break;
- }
- case 'ArrowRight': {
- const nextTab = tabRefs.indexOf(event.currentTarget) + 1;
- focusElement = tabRefs[nextTab] ?? tabRefs[0];
- break;
- }
- case 'ArrowLeft': {
- const prevTab = tabRefs.indexOf(event.currentTarget) - 1;
- focusElement = tabRefs[prevTab] ?? tabRefs[tabRefs.length - 1];
- break;
- }
- default:
- break;
- }
- focusElement?.focus();
- };
- return (
-
- {tabValues.map(({ value, label, attributes }) => (
- tabRefs.push(tabControl)}
- onKeyDown={handleKeydown}
- onClick={handleTabChange}
- {...attributes}
- className={clsx('tabs__item', styles.tabItem, attributes?.className, {
- 'tabs__item--active': selectedValue === value,
- })}
- >
- {label ?? value}
-
- ))}
-
- );
-}
-function TabContent({ lazy, children, selectedValue }) {
- const childTabs = (Array.isArray(children) ? children : [children]).filter(
- Boolean,
- );
- if (lazy) {
- const selectedTabItem = childTabs.find(
- (tabItem) => tabItem.props.value === selectedValue,
- );
- if (!selectedTabItem) {
- // fail-safe or fail-fast? not sure what's best here
- return null;
- }
- return cloneElement(selectedTabItem, { className: 'padding-top--s' });
- }
- return (
-
- {childTabs.map((tabItem, i) =>
- cloneElement(tabItem, {
- key: i,
- hidden: tabItem.props.value !== selectedValue,
- }),
- )}
-
- );
-}
-function TabsComponent(props) {
- const tabs = useTabs(props);
- return (
-
-
-
-
- );
-}
-export default function Tabs(props) {
- const isBrowser = useIsBrowser();
- return (
-
- );
-}
diff --git a/src/theme/Tabs/styles.module.css b/src/theme/Tabs/styles.module.css
deleted file mode 100644
index fe6540927..000000000
--- a/src/theme/Tabs/styles.module.css
+++ /dev/null
@@ -1,7 +0,0 @@
-.tabList + * {
- margin-top: var(--ifm-leading);
-}
-
-.tabItem {
- margin-top: 0 !important;
-}
diff --git a/src/theme/Tag/index.js b/src/theme/Tag/index.js
deleted file mode 100644
index d89c96d81..000000000
--- a/src/theme/Tag/index.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import React from 'react';
-import clsx from 'clsx';
-import Link from '@docusaurus/Link';
-import styles from './styles.module.css';
-export default function Tag({ permalink, label, count }) {
- return (
-
- {label}
- {count && {count} }
-
- );
-}
diff --git a/src/theme/Tag/styles.module.css b/src/theme/Tag/styles.module.css
deleted file mode 100644
index 770fbdde5..000000000
--- a/src/theme/Tag/styles.module.css
+++ /dev/null
@@ -1,67 +0,0 @@
-:root {
- --docusaurus-tag-list-border: var(--st-tag-border);
-}
-
-.tag {
- background: var(--st-tag-background);
- border: var(--st-tag-border);
- color: var(--st-tag-text);
- transition: border var(--ifm-transition-fast);
- text-decoration: none;
-}
-
-.tag:hover {
- border: var(--st-tag-border);
- text-decoration: underline;
-}
-
-.tagRegular {
- background: var(--st-tag-background);
- border-radius: var(--ifm-global-radius);
- padding: 0.2rem 0.5rem 0.3rem;
- font-size: 90%;
-}
-
-.tagWithCount {
- display: flex;
- align-items: center;
- position: relative;
- padding: 0 0.5rem 0 1rem;
- border-left: 0;
-}
-
-.tagWithCount::before,
-.tagWithCount::after {
- content: '';
- position: absolute;
- top: 50%;
- border: var(--st-tag-border);
- transition: inherit;
-}
-
-.tagWithCount::before {
- right: 100%;
- transform: translate(50%, -50%) rotate(-45deg);
- width: 1.18rem;
- height: 1.18rem;
- border-right: 0;
- border-bottom: 0;
-}
-
-.tagWithCount::after {
- left: 0;
- transform: translateY(-50%);
- width: 0.5rem;
- height: 0.5rem;
- border-radius: 50%;
-}
-
-.tagWithCount span {
- background: var(--ifm-color-secondary);
- color: var(--ifm-color-black);
- font-size: 0.7rem;
- line-height: 1.2;
- border-radius: var(--ifm-global-radius);
- padding: 0.1rem 0.4rem;
- margin-left: 0.3rem;
-}
\ No newline at end of file
diff --git a/src/theme/TagsListInline/index.js b/src/theme/TagsListInline/index.js
deleted file mode 100644
index bd113ddd2..000000000
--- a/src/theme/TagsListInline/index.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import React from 'react';
-import clsx from 'clsx';
-import Translate from '@docusaurus/Translate';
-import Tag from '@theme/Tag';
-import styles from './styles.module.css';
-export default function TagsListInline({ tags }) {
- return (
- <>
-
-
- Tags:
-
-
-
- {tags.map(({ label, permalink: tagPermalink }) => (
-
-
-
- ))}
-
- >
- );
-}
diff --git a/src/theme/TagsListInline/styles.module.css b/src/theme/TagsListInline/styles.module.css
deleted file mode 100644
index 3119dc7d6..000000000
--- a/src/theme/TagsListInline/styles.module.css
+++ /dev/null
@@ -1,8 +0,0 @@
-.tags {
- display: inline;
-}
-
-.tag {
- margin: 0 0.4rem 0.5rem 0;
- display: inline-block;
-}
diff --git a/static/.nojekyll b/static/.nojekyll
deleted file mode 100644
index e69de29bb..000000000
diff --git a/tsconfig.json b/tsconfig.json
index d250afaed..3fde8f684 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,6 +1,46 @@
{
- "extends": "@docusaurus/tsconfig",
"compilerOptions": {
- "baseUrl": "."
- }
+ "baseUrl": ".",
+ "target": "ESNext",
+ "lib": [
+ "dom",
+ "dom.iterable",
+ "esnext"
+ ],
+ "allowJs": true,
+ "skipLibCheck": true,
+ "strict": true,
+ "forceConsistentCasingInFileNames": true,
+ "noEmit": true,
+ "esModuleInterop": true,
+ "module": "esnext",
+ "moduleResolution": "bundler",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "jsx": "react-jsx",
+ "incremental": true,
+ "paths": {
+ "@/.source": [
+ "./.source/index.ts"
+ ],
+ "@/*": [
+ "./*"
+ ]
+ },
+ "plugins": [
+ {
+ "name": "next"
+ }
+ ]
+ },
+ "include": [
+ "next-env.d.ts",
+ "**/*.ts",
+ "**/*.tsx",
+ ".next/types/**/*.ts",
+ ".next/dev/types/**/*.ts"
+ ],
+ "exclude": [
+ "node_modules"
+ ]
}
diff --git a/versioned_docs/version-4/actions-and-actors/actors.mdx b/versioned_docs/version-4/actions-and-actors/actors.mdx
deleted file mode 100644
index b13f0ed29..000000000
--- a/versioned_docs/version-4/actions-and-actors/actors.mdx
+++ /dev/null
@@ -1,77 +0,0 @@
----
-title: Actors
-description: 'When you run a statechart, it becomes an actor: a running process that can receive and send messages, and change its behavior based on messages it receives.'
----
-
-:::warning
-
-**Docs for XState v4 are no longer maintained**
-
-This page is no longer maintained as [XState V5 has been released](/blog/2023-12-01-xstate-v5).
-
-Read about [actors](/docs/actors) and [the actor model](/docs/actor-model) in XState v5.
-
-:::
-
-When you run a statechart, it becomes an actor: a running process that can receive messages, send messages and change its behavior based on the messages it receives, which can cause effects outside of the actor.
-
-An invoked actor is an actor that can execute its own actions and communicate with the machine. These invoked actors are started in a state and stopped when the state is exited.
-
-:::video
-
-Watch our [“What are invoked actors?” video on YouTube](https://www.youtube.com/watch?v=TRMS8NYKWnA&list=PLvWgkXBB3dd4I_l-djWVU2UGPyBgKfnTQ&index=9) (1m57s).
-
-:::
-
-Invoked actors are are labeled on their invoking state with “Invoke /” followed by the actor’s source name and ID.
-
-You can invoke multiple actors on a single state. Top-level final states cannot have invoked actors.
-
-
-
-
-
-[View this machine in the Stately Studio](https://stately.ai/registry/editor/e13bef2b-bb13-4465-96ac-0bc25340688e?machineId=66f77051-089e-4b0a-9fa9-42e1f7598135).
-
-In the video player above, the *startVideo* actor is invoked when the video player is in the *Opened* state.
-
-## Invoke actors on a state
-
-First, select the state where you want to invoke an actor.
-
-## On the canvas
-
-1. Select the state where you want to invoke an actor.
-2. Use the plus icon button to open the edit menu.
-3. Choose **Invoked actor** from the menu to add an invoked actor block to the event.
-4. Write your actor’s source in the invoked actors’s text input.
-
-### Add actor source logic and ID
-
-1. Use the edit icon button to open the **Invoked actor** panel.
-2. Enter the actor’s source logic in the **Source logic** text input.
-3. Enter the actor’s ID in the **Actor ID** text input.
-
-## Using the event details panel
-
-1. Select the state where you want to invoke an actor.
-2. Open the state **Details** panel from the right tool menu.
-3. Use the **+ Effect** button to open the effects menu, and choose **Add invoked actor**.
-4. Use the edit icon button to open the **Invoked actor** panel.
-5. Enter the actor’s source logic in the **Source logic** text input.
-6. Enter the actor’s ID in the **Actor ID** text input.
-
-:::xstate
-
-## Looking for how to use actors in XState?
-
-Find out [more about using actors in XState](/xstate/actors/intro.mdx) in the XState section of the docs.
-
-:::
diff --git a/versioned_docs/version-4/actions-and-actors/entry-and-exit-actions.mdx b/versioned_docs/version-4/actions-and-actors/entry-and-exit-actions.mdx
deleted file mode 100644
index 69d79fbff..000000000
--- a/versioned_docs/version-4/actions-and-actors/entry-and-exit-actions.mdx
+++ /dev/null
@@ -1,160 +0,0 @@
----
-title: Entry & exit actions
-description: 'While the statechart is running, it can execute other effects called actions. Actions are “fire-and-forget effects.”'
----
-
-:::warning
-
-**Docs for XState v4 are no longer maintained**
-
-This page is no longer maintained as [XState V5 has been released](/blog/2023-12-01-xstate-v5).
-
-[Read about entry and exit actions in XState v5](/docs/actions).
-
-:::
-
-While the state machine is running, it can execute effects called actions.
-
-Actions are executed when a transition is triggered. Actions are “fire-and-forget effects”; once the machine has fired the action, it continues processing the transition and forgets the action. You can also fire actions when a state is entered or exited.
-
-:::video
-
-Watch our [“Entry actions and exit actions” video on YouTube](https://www.youtube.com/watch?v=GYoYZ1Dt1sA&list=PLvWgkXBB3dd4I_l-djWVU2UGPyBgKfnTQ&index=8) (1m32s).
-
-:::
-
-You can fire multiple entry and exit actions on a state. Top-level final states cannot have exit actions, since the machine is stopped and no further transitions can occur.
-
-
-
-
-
-[View this machine in the Stately Studio](https://stately.ai/registry/editor/e13bef2b-bb13-4465-96ac-0bc25340688e?machineId=222e2d7a-0ed6-4f2c-843a-e6646d717000).
-
-In our video player, we have entry and exit actions on the Playing state. We use the entry action of playVideo to fire an effect playing the video on entry to the Playing state. We use the exit action of pauseVideo to fire an effect pausing the video when the Playing state is exited.
-
-### Add a transition action
-
-First, select the event where you want an action to be fired.
-
-### On the canvas
-
-1. Use the plus icon button to open the edit menu.
-2. Choose **Action** from the menu to add an action block.
-3. Write your action’s name in the action’s text input.
-
-### Using the event details panel
-
-1. Open the event **Details** panel from the right tool menu.
-2. Use the **+ Transition action** button to add an action block.
-3. Write your action’s name in the action’s text input.
-
-## Delete a transition action
-
-First, select the transition action block you want to delete.
-
-### Using backspace
-
-Use the Backspace key to delete the transition action.
-
-### Using the event details panel
-
-1. Open the event **Details** panel from the right tool menu.
-2. Hover, focus, or select the transition action block to reveal the trash icon button.
-3. Use the trash icon button to delete the action.
-
-## Add an entry action or exit action to a state
-
-First, select the state you want to have an entry or exit action.
-
-### On the canvas
-
-1. Select the state where you want to add an action.
-2. Use the plus icon button to open the edit menu.
-3. Choose **Entry action** or **Exit action** from the menu to add an action block to the event.
-4. Write your action’s name in the action’s text input.
-
-### Using the event details panel
-
-1. Open the state **Details** panel from the right tool menu.
-2. Use the **+ Effect** button to open the effects menu, and choose **Add entry action** or **Add exit action**.
-3. Write your action’s name in the action’s text input.
-
-## Delete an entry action or exit action from a state
-
-First, select the action block you want to delete.
-
-### Using backspace
-
-Use the Backspace key to delete the action.
-
-### Using the event details panel
-
-1. Open the event **Details** panel from the right tool menu.
-2. Hover, focus, or select the action block to reveal the trash icon button.
-3. Use the trash icon button to delete the action.
-
-## Add a built-in action
-
-You can add built-in XState actions which will be formatted in your [exported code](/export-as-code.mdx). The options are:
-
-- [assign](../xstate/actions/context.mdx#assign-action): assigns data to the state context.
-- [raise](../xstate/actions/built-in-actions.mdx#raise-action): _raises_ an event that is received by the same machine.
-- [log](../xstate/actions/built-in-actions.mdx#log-action): an easy way to log messages to the console.
-- [sendTo](../xstate/actions/built-in-actions.mdx#sending-events-to-actors): sends an event to a specific actor.
-- [stop](/xstate/actors/spawn.mdx#stopping-spawned-actors): stops a child actor.
-
-To add a built-in action, first add a [transition action](#add-a-transition-action), [entry action](#add-an-entry-action-or-exit-action-to-a-state), or [exit action](#add-an-entry-action-or-exit-action-to-a-state).
-
-### On the canvas
-
-1. Hover, focus, or select the action block to reveal the edit icon button.
-2. Use the edit icon button to open the **Action** panel.
-3. Choose your desired action from the dropdown menu at the top of the **Action** panel.
-4. Fill out the required corresponding action input fields.
-
-### Using the details panel
-
-1. Open the state, or event **Details** panel from the right tool menu.
-1. Hover, focus, or select the action block to reveal the edit icon button.
-1. Use the edit icon button to open the **Action** panel.
-1. Choose your desired action from the dropdown menu at the top of the **Action** panel.
-1. Fill out the required corresponding action input fields.
-
-## Add a custom action
-
-You can also add custom actions with a custom action type and parameters which will be formatted as [XState action objects](../xstate/actions/actions.mdx) in your [exported code](/export-as-code.mdx).
-
-First, add a [transition action](#add-a-transition-action), [entry action](#add-an-entry-action-or-exit-action-to-a-state), or [exit action](#add-an-entry-action-or-exit-action-to-a-state).
-
-### On the canvas
-
-1. Hover, focus, or select the action block to reveal the edit icon button.
-2. Use the edit icon button to open the **Action** panel.
-3. Custom action is selected by default. Add your custom action type in the **Action type** text input.
-4. Add your custom **Action parameters** using the **Parameter key** and **Parameter value** text input pairs.
-
-[Read about action objects below for more on action types and and parameters](../xstate/actions).
-
-### Using the details panel
-
-1. Open the state, or event **Details** panel from the right tool menu.
-1. Hover, focus, or select the action block to reveal the edit icon button.
-1. Use the edit icon button to open the **Action** panel.
-1. Custom action is selected by default. Add your custom action type in the **Action type** text input.
-1. Add your custom **Action parameters** using the **Parameter key** and **Parameter value** text input pairs.
-
-:::xstate
-
-## Looking for how to use entry and exit actions in XState?
-
-Find out [more about actions in XState](../xstate/actions/actions.mdx) in the XState section of the docs.
-
-:::
diff --git a/versioned_docs/version-4/annotations.mdx b/versioned_docs/version-4/annotations.mdx
deleted file mode 100644
index 52b09923a..000000000
--- a/versioned_docs/version-4/annotations.mdx
+++ /dev/null
@@ -1,32 +0,0 @@
----
-title: Annotations
----
-
-You can use notes to annotate your machine, positioned anywhere inside your machine. Notes are useful for information or comments you want to add to your machine that are only visible inside Stately Studio and not included when you export as code.
-
-
-
-Notes are formatted with Markdown so you can add links, images, and other formatting to your annotations.
-
-:::tip
-
-Unlike [**descriptions**](descriptions.mdx), notes don’t need to be connected to a state or transition and can be added or positioned anywhere inside your machine.
-
-:::
-
-## Add notes to your machine
-
-You can add notes anywhere on your machine from **Design** and **Simulate** mode, but you can only edit them in **Design** mode.
-
-Notes are unrelated to a state or transition. Still, their layout position is connected to the closest root or parent state when you create them, which helps give your notes enough space in the auto layout.
-
-- Use the plus icon button in the canvas tools and choose **Note**.
-- Right-click anywhere on the canvas and choose **Add note**.
-
-### Edit and delete notes
-
-- Double-click or use the Enter key to edit the contents of a note.
-- Use the Backspace key to delete the selected note.
diff --git a/versioned_docs/version-4/assets.mdx b/versioned_docs/version-4/assets.mdx
deleted file mode 100644
index d5f166858..000000000
--- a/versioned_docs/version-4/assets.mdx
+++ /dev/null
@@ -1,42 +0,0 @@
----
-title: Assets in Stately’s editor
-description: 'Learn how to use assets on your states in Stately’s editor.'
----
-
-# Assets
-
-You can drag and drop assets on any state or upload them using the plus menu and **Asset** on any selected state.
-
-:::studio
-
-Assets are a premium feature of Stately Studio. [Check out the features on our Pro plan](studio-pro-plan.mdx), [Team plan](studio-team-plan.mdx), [Enterprise plan](studio-enterprise-plan.mdx) or [upgrade your existing plan](https://stately.ai/registry/billing).
-
-:::
-
-Assets are valuable when you want to include use cases, features, workflows, and more to your state machines. One of our most frequent requests is from teams who want to tie their logic to real-life user interfaces, and assets provide a way to connect user interface design to logic in a way your whole team can understand.
-
-
-
-## Order of assets
-
-The first asset, indicated by the star icon, is the asset shown on the canvas.
-
-Further assets are accessible from the state **Details** panel, where you can also drag to reorder the assets and choose their [displayed size](#asset-sizes).
-
-## Asset sizes
-
-Once your asset is uploaded to your state, you can choose the display size from the **Size** menu that shows on hover over the asset, or from the dropdown menu in the state **Details** panel:
-
-- small **sm**
-- medium **md**
-- large **lg**
-- extra large **xl**
-
-:::tip
-
-You can also add images from any URL using markdown in [state and transition descriptions](descriptions.mdx).
-
-:::
diff --git a/versioned_docs/version-4/autolayout.mdx b/versioned_docs/version-4/autolayout.mdx
deleted file mode 100644
index f03040223..000000000
--- a/versioned_docs/version-4/autolayout.mdx
+++ /dev/null
@@ -1,20 +0,0 @@
----
-title: Autolayout
----
-
-Autolayout chooses an optimal layout for your machine to make it easier to read and understand. When you import a machine, autolayout will be applied automatically. Otherwise, you can autolayout your machine anytime using the **Autolayout** button.
-
-## Autolayout from the editor menu
-
-1. Open the editor menu from the Stately icon in the top left of the Stately Studio.
-2. Choose **Autolayout** to lay out your machine.
-
-## Autolayout from the context menu
-
-1. Right-click anywhere on the canvas to open the context menu.
-2. Choose **Autolayout** to lay out your machine.
-
-## Autolayout from the zoom menu
-
-1. Select the current zoom level from the bottom right of the Stately Studio to open the zoom menu.
-2. Choose **Autolayout** to lay out your machine.
diff --git a/versioned_docs/version-4/descriptions.mdx b/versioned_docs/version-4/descriptions.mdx
deleted file mode 100644
index 3640172b8..000000000
--- a/versioned_docs/version-4/descriptions.mdx
+++ /dev/null
@@ -1,24 +0,0 @@
----
-title: Descriptions
----
-
-You can add descriptions to state and event nodes to describe their purpose and share related notes with your team. Descriptions support markdown formatting, including links and images.
-
-You can only add one description for each state or event. The machine object will include your descriptions in the state or event’s `description` when you export your statecharts to JSON.
-
-
-
-In the video player above, the text “The video player should be in full-screen mode” is a description of the *Opened* event.
-
-## Add a description to a state, event, or transition
-
-Use the plus icon button and choose **Description** from the menu to add a description block to your selected state, event, or transition.
-
-You can also add descriptions from the **Details** panel in the right tool menu.
-
-## Delete a description from a state, event, or transition
-
-Select the state, event, or transition whose description you want to delete, open the **Details** panel, and delete the contents of the description text area.
diff --git a/versioned_docs/version-4/design-mode.mdx b/versioned_docs/version-4/design-mode.mdx
deleted file mode 100644
index 10a6e030c..000000000
--- a/versioned_docs/version-4/design-mode.mdx
+++ /dev/null
@@ -1,32 +0,0 @@
----
-title: 'Design mode'
-description: 'Tour the features in Stately editor’s Design mode, including a guide to all the panels and how to use the editor.'
----
-
-Design your state machine flows in Design Mode. You can view and edit your machine from the canvas.
-
-You can add new [states](states/intro.mdx) by double-clicking anywhere on the canvas, and add [transitions and events](transitions-and-events/intro.mdx) from the handles on each side of the states.
-
-
-
-
-
-1. **Editor menu**: access common Stately shortcuts and view options.
-2. **Left drawer switch**: open and close the left drawer which contains the machines list (8) and tree view (9).
-3. **Breadcrumb**: Your current [project](projects.mdx) and machine.
-4. **Design/Simulate** switch: Switch between Design and [Simulate mode](simulate-mode.mdx).
-5. **Share** button: Open the share options.
-6. ** Export** button: open quick [export options](export-as-code.mdx).
-7. **User** button: Open the [user menu](user-preferences.mdx).
-8. **Machines list** (left drawer): List of machines in your current project.
-9. **Tree view** (left drawer): Tree view of your current machine.
-10. **Canvas**: View and edit your machine from the canvas.
-11. **Right toolbox**: Contextual menu which shows Details of current item highlighted on canvas.
-12. **[Canvas view controls](canvas-view-controls.mdx)**: Undo/redo and zoom options for the canvas.
-13. ** Help** button: open and close the help drawer.
diff --git a/versioned_docs/version-4/discover.mdx b/versioned_docs/version-4/discover.mdx
deleted file mode 100644
index 6c0b681d9..000000000
--- a/versioned_docs/version-4/discover.mdx
+++ /dev/null
@@ -1,37 +0,0 @@
----
-title: Discover
----
-
-Are you seeking inspiration for your machine? Or do you want to learn how somebody else models their machines? The [Discover page](https://stately.ai/registry/discover) lists all the public machines created with the Stately Studio.
-
-
-
-
-
-With the search feature, you can quickly filter your results by the number of states in a machine and whether the machine’s creator used [Stately Studio’s editor](https://stately.ai/editor) or our older [Viz](https://stately.ai/viz) tool. Each machine listed details its creator, number of states, and a link to view and edit the machine in the editor.
-
-## Export and fork public machines
-
-When viewing somebody else’s machine, you can’t make changes. You can fork the machine to create an editable copy inside your **My Projects**.
-
-### Export a public machine
-
-Choose **Export code** from the triple dot contextual menu alongside the machine name in the machines list.
-
-Read [more about exporting your machines as code](export-as-code.mdx).
-
-### Fork a public machine
-
-:::tip
-
-You must be signed into the Stately Studio to fork a machine.
-
-:::
-
-Choose **Fork to project** from the triple dot contextual menu alongside the machine name in the machines list.
diff --git a/versioned_docs/version-4/editor-actions-and-actors.mdx b/versioned_docs/version-4/editor-actions-and-actors.mdx
deleted file mode 100644
index 4c2d242f8..000000000
--- a/versioned_docs/version-4/editor-actions-and-actors.mdx
+++ /dev/null
@@ -1,77 +0,0 @@
----
-title: 'Actions and actors in Stately’s editor'
-description: 'Learn how to use exit actions, entry actions, and transition actions, and invoke actors in Stately’s editor.'
----
-
-# Actions and actors
-
-While the statechart is running, it can execute other effects called actions. You can fire an action upon entry or exit of a state. Actions are “fire-and-forget effects”; once the machine has fired the action, it moves on and forgets the action. You can also fire actions on transitions. [Read more about actions](/docs/actions).
-
-State machines can invoke actors as longer-running processes that can receive events, send events, and change their behavior based on the events they receive. You can invoke actors on entry to a state and stop on exit. [Read more about actors](/docs/actors).
-
-
-
-## Add actions
-
-- Select a state or transition and use **Action**.
-- Select a state and use **Entry action** or **Exit action**.
-- Select a state or transition, open the **Details** panel from the right tool menu, and use the **Effect** or **Action** button and choose **Add entry action**, **Add exit action**, or **Add action**.
-
-Use the edit icon button to open the **Sources** panel and add custom implementation code. Actions are created as custom actions by default, but you can also use [XState built-in actions](#xstate-built-in-actions).
-
-To remove an action, use the Backspace key, _right-click_ and choose **Delete**, or use the delete icon button in the **Details** panel.
-
-### Add action parameters
-
-You can add action parameters by selecting the action and using add **parameter**.
-
-## Add invoked actors
-
-You can invoke multiple actors on a single state. Top-level final states cannot have invoked actors. [Read more about invoking actors](/docs/invoke).
-
-
-
-In the video player above, the *startVideo* actor is invoked when the video player is in the *Opened* state.
-
-### Invoke actors on a state
-
-- Select a state and use **Invoke**.
-- Select a state, open the state **Details** panel from the right tool menu, and use the **Effect** button and choose **Add invoked actor**.
-
-Use the edit icon button to open the **Sources** panel and enter the actor’s source logic.
-
-Provide your actor with an ID so it can be used with the [`sendTo` or `stop` actions](#xstate-built-in-actions) to stop and send events to the actor. You can add actor input by selecting the actor and using add **input property**.
-
-To remove an actor, use the Backspace key, _right-click_ and choose **Delete**, or use the delete icon button in the **Details** panel.
-
-#### Invoke done and invoke error events
-
-**Invoke done events** and **invoke error events** transition from a state once its invocation has been completed or returns an error. The source state must have an invoked actor to create an invoke done or invoke error event.
-
-- Select the state with an invoked actor and create a new transition from that state. The first new transition will be created as an invoke done event.
-- Subsequent new transitions will be created as invoke error events.
-
-To change an invoke done or invoke error event back into a regular transition, Use the triple dot menu or _right-click_ the transition, and from **Event type**, choose **Always**.
-
-### XState built-in actions
-
-You can use the following built-in XState actions from the logic templates in the **[Sources](sources.mdx)** panel, which will be formatted in your [exported code](export-as-code.mdx). The options are:
-
-- [assign](/docs/actions/#assign-action): assigns data to the state context.
-- [raise](/docs/actions/#raise-action): raises an event that is received by the same machine.
-- [log](/docs/actions/#log-action): an easy way to log messages to the console.
-- [sendTo](/docs/actions/#send-to-action): sends an event to a specific actor.
-- [stop](/docs/actions/#stop-action): stops a child actor.
-
-- [Read more about actions in XState](/docs/actions).
-- [Read more about actors in XState](/docs/actors).
-
-### Spawning actors in Stately’s editor
-
-_Coming soon_
diff --git a/versioned_docs/version-4/editor-context-and-meta.mdx b/versioned_docs/version-4/editor-context-and-meta.mdx
deleted file mode 100644
index a181d7f8c..000000000
--- a/versioned_docs/version-4/editor-context-and-meta.mdx
+++ /dev/null
@@ -1,8 +0,0 @@
----
-title: 'Context and meta in Stately’s editor'
-description: 'Learn how to use context and meta information for your state machines in Stately’s editor.'
----
-
-- Coming soon… setting initial context values
-- Coming soon… updating context with assign
-- Coming soon… JS/TS export
diff --git a/versioned_docs/version-4/editor-states-and-transitions.mdx b/versioned_docs/version-4/editor-states-and-transitions.mdx
deleted file mode 100644
index 94c8c232a..000000000
--- a/versioned_docs/version-4/editor-states-and-transitions.mdx
+++ /dev/null
@@ -1,203 +0,0 @@
----
-title: 'States and transitions in Stately’s editor'
-description: 'Learn how to use states and transitions, including parent states, parallel states, guards, delayed transitions and eventless transitions in Stately’s editor.'
----
-
-# States and transitions
-
-State machines help us model how a process goes from state to state when an event occurs. At their most basic, state machines are made up of these states, events, and the transitions between them.
-
-:::tip
-
-Want to learn more about the concepts of state machines? [Check out our introduction to state machines and statecharts](state-machines-and-statecharts.mdx).
-
-:::
-
-## States
-
-In Stately’s editor, the rounded rectangle boxes are states. There are a few different types of states:
-
-- **Normal** states don’t have any special properties.
-- [**Initial states**](#initial-states) are the first states the machine enters when it starts.
-- [**Final states**](#final-states) are the last states the machine enters before it stops.
-- [**Parent states**](#parent-and-child-states) can contain more states, known as child states.
-- [**Parallel states**](#parallel-states) are parent states that have multiple child states that are all active at the same time.
-- [**History states**](#history-states) are parent states that remember which child state was active when the parent state was exited and re-enter that child state when the parent state is re-entered.
-
-
-
-You can invoke other state machines or actors on a state, or trigger an action when a state is entered or exited. [Read more about actions and actors in Stately’s editor](editor-actions-and-actors.mdx).
-
-In Stately’s editor, you can also add [descriptions](descriptions.mdx), [colors](colors.mdx), and [tags](/docs/tags) to states.
-
-### Create a state
-
-- Double-click anywhere on the canvas to create a new state there.
-- Select an existing state and use **child state** to add a new state inside.
-
-#### Delete a state
-
-- Use the triple dot menu or _right-click_ on a selected state, and choose **Delete** to delete the selected state.
-- Use the Backspace key to delete the selected state.
-
-### Parent and child states
-
-States can contain more states, also known as child states. These child states are only active when the parent state is active. [Read more about parent and child states](/docs/parent-states).
-
-To add a child state:
-
-- Select an existing state and use **child state** to add a new state inside.
-- If a state already contains child states, you can double-click inside the parent state to create another child state.
-- Copy a state or group of states and transitions, and paste them onto their new parent state.
-- Reparent a child state by selecting the child and choosing a new parent state from inside the state **Details** panel.
-
-### Initial states
-
-When a state machine starts, it enters the **initial state** first. In Stately’s editor, the filled circle with an arrow icon represents the initial state.
-
-Machines can only have one top-level initial state. Each parent state has its own initial state. If you have unreachable states, it might be because there is no initial state. [Read more about initial states](/docs/initial-states).
-
-To set a state as the initial state:
-
-- Use the triple dot menu or _right-click_ a state and choose Mark as initial state.
-- Select the parent state, open the state **Details** panel, and choose the desired initial state from the **Initial state** menu.
-
-### Final states
-
-When a machine reaches the final state, it can no longer receive any events, and anything running inside it is canceled and cleaned up.
-
-To turn a state into a final state:
-
-- Use the triple dot menu or _right-click_ a state, and from **State type**, choose **Final state**.
-- Select the state, open the state **Details** panel, and choose the **Final** state option.
-
-If you want your machine to transition from a parent state when its final child state is reached, use a [state done event](#state-done-event).
-
-### Parallel states
-
-In statecharts, a parallel state is a state that has multiple child states (also known as **regions**) that are all active at the same time. [Read more about parallel states](/docs/parallel-states). A dashed line borders each region.
-
-To turn a parent state into a parallel state:
-
-- Use the triple dot menu or _right-click_ a parent state, and from **State type**, choose **Parallel state**.
-- Select the parent state, open the state **Details** panel, and choose the **Parallel** state option.
-
-### History states
-
-A history state remembers the last child state that was active before its parent state was exited. When a transition from outside the parent state targets a history state, the remembered child state is entered. [Read more about history states](/docs/history-states).
-
-- Use the triple dot menu or _right-click_ a state, and from **State type**, choose **History state**.
-- Select the parent state, open the state **Details** panel, and choose the **History** state option.
-
-### Unreachable states
-
-A warning icon indicates an unreachable state. The state is unreachable because it isn’t connected to the [initial state](#initial-states) by a [transition](#transitions-and-events).
-
-## Transitions and events
-
-A machine moves from state to state through transitions. Transitions are caused by events; when an event happens, the machine transitions to the next state.
-
-In Stately’s editor, the arrows are transitions, and the rounded rectangles on the arrow’s lines are events. Each transition has a _source_ state, which comes before the transition, and a _target_ state, which comes after the transition. The transition’s arrow starts from the source state and points to the target state.
-
-There are a few different types of transitions:
-
-- **Normal** transitions are triggered by an event.
-- [**Guarded transitions**](#add-guards) are triggered by an event, but only if a specified condition is met.
-- [**Delayed transitions**](#delayed-after-transitions) (also known as _after_ transitions) are triggered by an internal XState event, but only after a specified time interval.
-- [**Eventless transitions**](#eventless-always-transitions) (also known as _always_ transitions) are triggered by a timer or other condition, and don’t have an event.
-
-
-
-### Create a transition and event
-
-- Click a handle on any state to create a transition, event, and target state.
-- Drag from a source state’s handle to the target state’s handle to connect them with a transition and event.
-
-#### Delete a transition
-
-Deleting a state will also delete any transitions with that state as a source.
-
-- Use the triple dot menu or _right-click_ on a selected transition, and choose **Delete** to delete the selected transition.
-- Use the Backspace key to delete the selected transition.
-
-### Changing transition source and target
-
-- Use the triple dot menu or _right-click_ the transition and choose **Switch source and target**.
-- Drag the transition handle from one state to a different state.
-- Select a transition, open the transition **Details** panel from the right tool menu, and choose a new source or target state from the dropdown menus.
-
-### Delayed (after) transitions
-
-**Delayed transitions** are transitions that only happen after a set amount of time. If another event occurs before the end of the timer, the transition doesn’t complete. [Read more about delayed transitions](/docs/delayed-transitions).
-
-In Stately’s editor, delayed transitions are labeled “after.” Delayed transitions have a default time interval of 500ms (0.5 seconds).
-
-To make a transition into a delayed transition:
-
-- Use the triple dot menu or _right-click_ a transition, and from **Event type**, choose **After**.
-- Select an event, open the transition **Details** panel from the right tool menu, and choose **After** from the **Trigger** dropdown menus.
-
-Your delay time interval will be displayed in a human-readable format on hover. For example, 15000ms will be displayed as 15 seconds.
-
-To set the delay interval:
-
-- Use the text input on the delayed transition to specify the interval in milliseconds (ms).
-- Select the transition delayed transition, open the transition **Details** panel from the right tool menu, and specify the interval in milliseconds (ms) in the **Delay** text input.
-
-To make a delayed transition into a regular transition, use the triple dot menu or _right-click_ a transition, and from **Event type**, choose **Event**.
-
-### Eventless (always) transitions
-
-**Eventless transitions** are transitions that are *always* taken when the transition is enabled. In Stately’s editor, eventless transitions are labeled “always.” [Read more about eventless transitions](/docs/eventless-transitions).
-
-To make a transition into an eventless transition:
-
-- Use the triple dot menu or _right-click_ a transition, and from **Event type**, choose **Always**.
-- Select an event, open the transition **Details** panel from the right tool menu, and choose **Always** from the **Trigger** dropdown menus.
-
-To make an eventless transition into a regular transition, use the triple dot menu or _right-click_ a transition, and from **Event type**, choose **Event**.
-
-### State done event
-
-Use a state done event to transition from a parent state when its final child state is reached. [Read more about state done events](/docs/state-done-events).
-
-To turn an event into a state done event:
-
-- Use the triple dot menu or _right-click_ an event, and from **Event type**, choose **State Done event**.
-
-To make a state done event into a regular transition, use the triple dot menu or _right-click_ a transition, and from **Event type**, choose **Event**.
-
-### Self-transitions
-
-A **self-transition** is when a state transitions back to itself, and is useful for changing context and/or executing actions without changing the finite state. You can also use self-transitions to restart a state. [Read more about self-transitions](/docs/transitions/#self-transitions).
-
-To create a self-transition:
-
-- Use the triple dot menu or _right-click_ an existing event, and choose **Make self transition**. The transition will be connected back to the source state.
-- Select an existing event, open the transition **Details** panel from the right tool menu, and choose the same state from the source and target dropdown menus.
-
-## Add guards
-
-A **guarded transition** is a transition that is only enabled if its condition is evaluated to be `true`. [Read more about guarded transitions](/docs/guards).
-
-In Stately’s editor, guards are numbered in the order they are checked and labeled with “if” or “else if” along with their condition. Multiple guards on the same events are connected with a dotted line.
-
-To add a guard:
-
-- Select a transition and use the **Add guard** to add a new guard to the transition. Use the text input to add the guard’s condition.
-- Use the triple dot menu or _right-click_ a transition and use **Add guard** to add a guard to the transition. Use the text input to add the guard’s condition.
-- Select an existing transition, open the transition **Details** panel from the right tool menu, and enter the guard’s condition into the **Guard** text input.
-
-To reorder guards:
-
-- Use the triple dot menu or _right-click_ the guarded transition, and from the **Reorder guards** menu, choose **Move up** or **Move down**.
-
-To delete a guard, remove its condition from the text input.
-
-You can add implementation code to your guards from the **[Sources](sources.mdx)** panel.
diff --git a/versioned_docs/version-4/embed.mdx b/versioned_docs/version-4/embed.mdx
deleted file mode 100644
index 174ade642..000000000
--- a/versioned_docs/version-4/embed.mdx
+++ /dev/null
@@ -1,70 +0,0 @@
----
-title: Embed machines using their embed URL
-description: You can embed your machines anywhere that supports iframes. Embed mode is a focused non-editable view of your machine in Stately Studio’s editor, which can be zoomed and panned.
----
-
-You can embed your machines anywhere that supports [`