+ default +
+{book.title}
+{book.author}
+From 038763fbdccc1ac2d2266d39ad74bd451bf99f95 Mon Sep 17 00:00:00 2001
From: prdHugo <48803115+HugoPerard@users.noreply.github.com>
Date: Wed, 26 Aug 2026 04:02:32 -0700
Subject: [PATCH 01/46] feat(landing): add apps workspace, astro tsconfig, and
tooling ignores
---
.gitignore | 3 +++
.oxlintrc.json | 2 +-
packages/typescript-config/astro.json | 13 +++++++++++++
pnpm-workspace.yaml | 1 +
turbo.json | 1 +
5 files changed, 19 insertions(+), 1 deletion(-)
create mode 100644 packages/typescript-config/astro.json
diff --git a/.gitignore b/.gitignore
index 96fab4f..1249ff8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -21,6 +21,9 @@ coverage
# Vercel
.vercel
+# Astro
+.astro
+
# Build Outputs
.next/
out/
diff --git a/.oxlintrc.json b/.oxlintrc.json
index 6eef9e4..7e4a6b5 100644
--- a/.oxlintrc.json
+++ b/.oxlintrc.json
@@ -18,5 +18,5 @@
"typescript/no-unnecessary-type-parameters": "off",
"typescript/no-unsafe-type-assertion": "off"
},
- "ignorePatterns": ["**/dist/**", "**/coverage/**"]
+ "ignorePatterns": ["**/dist/**", "**/coverage/**", "**/.astro/**"]
}
diff --git a/packages/typescript-config/astro.json b/packages/typescript-config/astro.json
new file mode 100644
index 0000000..4bc754b
--- /dev/null
+++ b/packages/typescript-config/astro.json
@@ -0,0 +1,13 @@
+{
+ "$schema": "https://json.schemastore.org/tsconfig",
+ "extends": "./base.json",
+ "compilerOptions": {
+ "module": "ESNext",
+ "moduleResolution": "Bundler",
+ "allowJs": true,
+ "jsx": "react-jsx",
+ "noEmit": true,
+ "declaration": false,
+ "declarationMap": false
+ }
+}
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index dee51e9..0e5a073 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -1,2 +1,3 @@
packages:
- "packages/*"
+ - "apps/*"
diff --git a/turbo.json b/turbo.json
index 078c76f..9f25de0 100644
--- a/turbo.json
+++ b/turbo.json
@@ -14,6 +14,7 @@
"dependsOn": ["^check-types"]
},
"dev": {
+ "dependsOn": ["^build"],
"cache": false,
"persistent": true
},
From 96ec75ee7a6e9ac68072a89bbd3534b92c1aa0ab Mon Sep 17 00:00:00 2001
From: prdHugo <48803115+HugoPerard@users.noreply.github.com>
Date: Wed, 26 Aug 2026 04:02:49 -0700
Subject: [PATCH 02/46] feat(landing): add Astro 6 app config, Tailwind 4
theme, and fonts
---
apps/landing/astro.config.ts | 30 +++++++++++++++++++++
apps/landing/package.json | 29 ++++++++++++++++++++
apps/landing/public/favicon.svg | 4 +++
apps/landing/src/env.d.ts | 1 +
apps/landing/src/styles/global.css | 43 ++++++++++++++++++++++++++++++
apps/landing/tsconfig.json | 10 +++++++
6 files changed, 117 insertions(+)
create mode 100644 apps/landing/astro.config.ts
create mode 100644 apps/landing/package.json
create mode 100644 apps/landing/public/favicon.svg
create mode 100644 apps/landing/src/env.d.ts
create mode 100644 apps/landing/src/styles/global.css
create mode 100644 apps/landing/tsconfig.json
diff --git a/apps/landing/astro.config.ts b/apps/landing/astro.config.ts
new file mode 100644
index 0000000..675aa50
--- /dev/null
+++ b/apps/landing/astro.config.ts
@@ -0,0 +1,30 @@
+import react from "@astrojs/react";
+import tailwindcss from "@tailwindcss/vite";
+import { defineConfig, fontProviders } from "astro/config";
+
+export default defineConfig({
+ output: "static",
+ integrations: [react()],
+ vite: {
+ plugins: [tailwindcss()],
+ },
+ fonts: [
+ {
+ name: "IBM Plex Sans",
+ cssVariable: "--font-ibm-plex-sans",
+ provider: fontProviders.fontsource(),
+ weights: [400, 500, 600],
+ styles: ["normal"],
+ subsets: ["latin", "latin-ext"],
+ },
+ {
+ name: "IBM Plex Mono",
+ cssVariable: "--font-ibm-plex-mono",
+ provider: fontProviders.fontsource(),
+ weights: [400, 500],
+ styles: ["normal"],
+ subsets: ["latin", "latin-ext"],
+ fallbacks: ["monospace"],
+ },
+ ],
+});
diff --git a/apps/landing/package.json b/apps/landing/package.json
new file mode 100644
index 0000000..274d4fe
--- /dev/null
+++ b/apps/landing/package.json
@@ -0,0 +1,29 @@
+{
+ "name": "landing",
+ "private": true,
+ "type": "module",
+ "license": "MIT",
+ "scripts": {
+ "dev": "astro dev",
+ "build": "astro build",
+ "preview": "astro preview",
+ "check-types": "tsc --noEmit",
+ "lint": "oxlint .",
+ "format": "oxfmt"
+ },
+ "dependencies": {
+ "@astrojs/react": "6.0.4",
+ "@bearstudio/ui-state": "workspace:*",
+ "astro": "6.4.8",
+ "react": "19.2.8",
+ "react-dom": "19.2.8"
+ },
+ "devDependencies": {
+ "@bearstudio/typescript-config": "workspace:*",
+ "@tailwindcss/vite": "4.3.3",
+ "@types/react": "19.2.18",
+ "@types/react-dom": "19.2.5",
+ "tailwindcss": "4.3.3",
+ "typescript": "7.0.2"
+ }
+}
diff --git a/apps/landing/public/favicon.svg b/apps/landing/public/favicon.svg
new file mode 100644
index 0000000..d2f32f1
--- /dev/null
+++ b/apps/landing/public/favicon.svg
@@ -0,0 +1,4 @@
+
diff --git a/apps/landing/src/env.d.ts b/apps/landing/src/env.d.ts
new file mode 100644
index 0000000..f964fe0
--- /dev/null
+++ b/apps/landing/src/env.d.ts
@@ -0,0 +1 @@
+///
+import {"{"} getUiState {"}"} from "@bearstudio/ui-state";
+
+const ui = getUiState((set) => {"{"}
+ if (bookQuery.status === "pending") return set("pending");
+ if (bookQuery.status === "error") return set("error");
+ return set("default", {"{"} book: bookQuery.data {"}"});
+{"}"});
+
+ui.match("pending", () => <>Loading...</>)
+ .match("error", () => <>Error</>)
+ .match("default", ({"{ "} book {"} "}) => <>{"{ "}book.title{"} "}</>)
+ .exhaustive();
return isLoading ? (
+ <Spinner />
+) : error ? (
+ <Error />
+) : data ? (
+ <Book book={"{ "}data{"} "} />
+) : (
+ <Empty />
+);
diff --git a/apps/landing/src/layouts/Layout.astro b/apps/landing/src/layouts/Layout.astro
new file mode 100644
index 0000000..a2d81ea
--- /dev/null
+++ b/apps/landing/src/layouts/Layout.astro
@@ -0,0 +1,65 @@
+---
+import { Font } from "astro:assets";
+import "../styles/global.css";
+
+type Props = {
+ title: string;
+ description: string;
+};
+
+const { title, description } = Astro.props;
+const canonical = "https://github.com/BearStudio/ui-state";
+const jsonLd = {
+ "@context": "https://schema.org",
+ "@graph": [
+ {
+ "@type": "Organization",
+ name: "BearStudio",
+ url: "https://www.bearstudio.fr",
+ },
+ {
+ "@type": "SoftwareApplication",
+ name: "@bearstudio/ui-state",
+ applicationCategory: "DeveloperApplication",
+ operatingSystem: "Web",
+ license: "https://opensource.org/licenses/MIT",
+ url: canonical,
+ },
+ {
+ "@type": "WebPage",
+ name: title,
+ description,
+ url: canonical,
+ },
+ ],
+};
+---
+
+
+
+
+
+
+ + bookQuery → getUiState → match + exhaustive + {pendingHint ? ( + {pendingHint} + ) : null} +
+Loading the book…
+Could not load the book.
+ )) + .match("default", ({ book }) => ( ++ default +
+{book.author}
++ React · TypeScript · MIT +
+
+ getUiState maps
+ pending, error, and the statuses you actually have onto one
+ match chain.
+ exhaustive() is
+ a type error until every status has a branch. For React screens that
+ already know if a query is loading — not a new store.
+
+ {install} +
+
+ MIT. exhaustive() fails the type check
+ if a status is unmatched.
+
+ Loading, error, data. Then empty. Then not-found. Each new status + is another branch to paste into every screen. Miss one and the UI + still typechecks. +
+
+ Same API as the README. match
+ + exhaustive() — not a runtime
+ type guard.
+
+ This island hydrates on view and calls
+ getUiState from
+ @bearstudio/ui-state. Flip
+ pending, error, and default. Each view is a
+ match branch; the chain ends
+ with exhaustive().
+
+ exhaustive() does not type
+ check until every inferred status has a
+ match. A new status is a
+ compile error, not a blank screen.
+
+ pending, error, default, empty, not-found, or
+ show-input. The helper
+ infers the union from set().
+
+ set("default", { book })
+ carries data on that branch. pending does not need a fake book.
+
+ ui.when("pending", …)
+ renders that status and returns null otherwise. Use
+ match when you want the
+ full set.
+
+ One function. No store, no context, no extra runtime. Wire it to + TanStack Query, fetch, or flags you already have. +
++ pending +
+ + +error
+Could not load the book.
+default
+The Left Hand of Darkness
+Ursula K. Le Guin
+
Date: Wed, 26 Aug 2026 04:04:56 -0700
Subject: [PATCH 07/46] fix(landing): escape Astro braces in payload example
---
apps/landing/src/pages/index.astro | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/apps/landing/src/pages/index.astro b/apps/landing/src/pages/index.astro
index f824f66..818eb64 100644
--- a/apps/landing/src/pages/index.astro
+++ b/apps/landing/src/pages/index.astro
@@ -141,7 +141,7 @@ const install = "pnpm add @bearstudio/ui-state";
- set("default", { book })
+ set("default", {"{"} book {")"}}
carries data on that branch. pending does not need a fake book.
- set("default", {"{"} book {")"}}
+ set("default", { book })
carries data on that branch. pending does not need a fake book.
Loading the book…
diff --git a/apps/landing/src/pages/index.astro b/apps/landing/src/pages/index.astro index 1fd12e9..d6d6f8b 100644 --- a/apps/landing/src/pages/index.astro +++ b/apps/landing/src/pages/index.astro @@ -5,8 +5,7 @@ import NestedTernary from "../components/NestedTernary.astro"; import { StateDemo } from "../components/StateDemo.tsx"; const title = "@bearstudio/ui-state — exhaustive UI states for React"; -const description = - "A small TypeScript helper that maps pending, error, and custom statuses onto match + exhaustive(). Miss a status, tsc fails."; +const description = "A small TypeScript helper that maps pending, error, and custom statuses onto match + exhaustive(). Miss a status, tsc fails."; const github = "https://github.com/BearStudio/ui-state"; const install = "pnpm add @bearstudio/ui-state"; --- @@ -16,9 +15,7 @@ const install = "pnpm add @bearstudio/ui-state"; From 581e9d7e4427e11b6c4d15673dd916bbd55086de Mon Sep 17 00:00:00 2001 From: prdHugo <48803115+HugoPerard@users.noreply.github.com> Date: Wed, 26 Aug 2026 04:07:10 -0700 Subject: [PATCH 10/46] fix(landing): render default-match sample with HTML entities --- apps/landing/src/components/HeroCode.astro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/landing/src/components/HeroCode.astro b/apps/landing/src/components/HeroCode.astro index 72fd8c2..cab3628 100644 --- a/apps/landing/src/components/HeroCode.astro +++ b/apps/landing/src/components/HeroCode.astro @@ -26,7 +26,7 @@ ui.match("pending", () => <>Loading...</>) .match("error", () => <>Error</>) - .match("default", ({"{ "}book{"} "}) => <>{"{ "}book.title{"} "}</>) + .match("default", ({ book }) => <>{book.title}</>) .exhaustive();return isLoading ? (
<Spinner />
) : error ? (
From 499534660e63b56a2c6b958c87b689428f80ccca Mon Sep 17 00:00:00 2001
From: prdHugo <48803115+HugoPerard@users.noreply.github.com>
Date: Wed, 26 Aug 2026 04:33:15 -0700
Subject: [PATCH 12/46] style(landing): restyle marketing page as two-column
editorial
---
apps/landing/src/components/HeroCode.astro | 33 +--
.../src/components/NestedTernary.astro | 31 ++-
apps/landing/src/components/StateDemo.tsx | 83 +++---
apps/landing/src/layouts/Layout.astro | 2 +-
apps/landing/src/pages/index.astro | 258 +++++++++---------
apps/landing/src/styles/global.css | 10 +
6 files changed, 204 insertions(+), 213 deletions(-)
diff --git a/apps/landing/src/components/HeroCode.astro b/apps/landing/src/components/HeroCode.astro
index cab3628..81d2f93 100644
--- a/apps/landing/src/components/HeroCode.astro
+++ b/apps/landing/src/components/HeroCode.astro
@@ -3,22 +3,17 @@
---
-
-
-
-
-
- book-screen.tsx
-
-
+
+ book-screen.tsx
+
import {"{"} getUiState {"}"} from "@bearstudio/ui-state";
-const ui = getUiState((set) => {"{"}
+const ui = getUiState((set) => {"{"}
if (bookQuery.status === "pending") return set("pending");
if (bookQuery.status === "error") return set("error");
return set("default", {"{"} book: bookQuery.data {"}"});
@@ -28,22 +23,4 @@ ui.match("pending"
.match("error", () => <>Error</>)
.match("default", ({ book }) => <>{book.title}</>)
.exhaustive();
-
- -
-
- pending
-
-
-
-
- -
-
error
- Could not load the book.
-
- -
-
default
- The Left Hand of Darkness
- Ursula K. Le Guin
-
-
diff --git a/apps/landing/src/components/NestedTernary.astro b/apps/landing/src/components/NestedTernary.astro
index a3dd866..aa90b29 100644
--- a/apps/landing/src/components/NestedTernary.astro
+++ b/apps/landing/src/components/NestedTernary.astro
@@ -1,9 +1,16 @@
---
-// Static before sample. Braces escaped so Astro does not evaluate them.
+// Editorial pair: nested ternaries vs match + exhaustive.
+// Braces escaped so Astro does not evaluate them.
---
-return isLoading ? (
+
+
+
+
+ Nested ternaries
+
+ return isLoading ? (
<Spinner />
) : error ? (
<Error />
@@ -12,3 +19,19 @@
) : (
<Empty />
);
+
+
+
+ match + exhaustive
+
+ ui.match("pending", () => <Spinner />)
+ .match("error", () => <Error />)
+ .match("default", ({ book }) =>
+ <Book book={book} />,
+ )
+ .match("empty", () => <Empty />)
+ .exhaustive();
+
+
diff --git a/apps/landing/src/components/StateDemo.tsx b/apps/landing/src/components/StateDemo.tsx
index 8912ebd..1a7aef5 100644
--- a/apps/landing/src/components/StateDemo.tsx
+++ b/apps/landing/src/components/StateDemo.tsx
@@ -36,64 +36,53 @@ export function StateDemo() {
[status],
);
- const pendingHint = ui.when("pending", () => "Fetching…");
+ const pendingLabel = ui.when("pending", () => "Fetching the book");
return (
-
-
-
- bookQuery → getUiState → match + exhaustive
- {pendingHint ? (
- {pendingHint}
- ) : null}
-
-
- {CONTROLS.map((control) => {
- const selected = status === control.id;
- return (
-
- );
- })}
-
+
+
+ {CONTROLS.map((control) => {
+ const selected = status === control.id;
+ return (
+
+ );
+ })}
-
+
{ui
.match("pending", () => (
-
-
- Loading the book…
-
+
+
+
+ {pendingLabel ? (
+ {pendingLabel}
+ ) : null}
+
))
.match("error", () => (
Could not load the book.
))
.match("default", ({ book }) => (
-
- default
-
- {book.title}
+ {book.title}
{book.author}
))
diff --git a/apps/landing/src/layouts/Layout.astro b/apps/landing/src/layouts/Layout.astro
index a2d81ea..17af0b4 100644
--- a/apps/landing/src/layouts/Layout.astro
+++ b/apps/landing/src/layouts/Layout.astro
@@ -56,7 +56,7 @@ const jsonLd = {
Skip to content
diff --git a/apps/landing/src/pages/index.astro b/apps/landing/src/pages/index.astro
index d6d6f8b..5496235 100644
--- a/apps/landing/src/pages/index.astro
+++ b/apps/landing/src/pages/index.astro
@@ -4,28 +4,49 @@ import HeroCode from "../components/HeroCode.astro";
import NestedTernary from "../components/NestedTernary.astro";
import { StateDemo } from "../components/StateDemo.tsx";
-const title = "@bearstudio/ui-state — exhaustive UI states for React";
-const description = "A small TypeScript helper that maps pending, error, and custom statuses onto match + exhaustive(). Miss a status, tsc fails.";
-const github = "https://github.com/BearStudio/ui-state";
-const install = "pnpm add @bearstudio/ui-state";
+const title = '@bearstudio/ui-state — exhaustive UI states for React';
+const description =
+ 'A small TypeScript helper that maps pending, error, and custom statuses onto match + exhaustive(). Miss a status, tsc fails.';
+const github = 'https://github.com/BearStudio/ui-state';
+const install = 'pnpm add @bearstudio/ui-state';
---
- @bearstudio/ui-state
+
+ @bearstudio/ui-state
+
@@ -33,164 +54,135 @@ const install = "pnpm add @bearstudio/ui-state";
-
-
- React · TypeScript · MIT
-
-
- UI states you can exhaust.
-
-
- getUiState maps
- pending, error, and the statuses you actually have onto one
- match chain.
- exhaustive() is
- a type error until every status has a branch. For React screens that
- already know if a query is loading — not a new store.
-
-
-
- GitHub
-
-
- {install}
-
-
-
- MIT. exhaustive() fails the type check
- if a status is unmatched.
-
-
-
-
-
-
-
-
-
- Nested ternaries do not scale.
-
- Loading, error, data. Then empty. Then not-found. Each new status
- is another branch to paste into every screen. Miss one and the UI
- still typechecks.
+
+
+
+
+ UI states you can exhaust.
+
+
+ getUiState maps
+ pending, error, and the statuses you actually have onto one
+ match chain.
+ exhaustive() is
+ a type error until every status has a branch. For React screens that
+ already know if a query is loading — not a new store.
+
+
+ Install
+
+
+ GitHub
+
+
+
+
+
-
-
- Declare the state once. Match it.
-
- Same API as the README. match
- + exhaustive() — not a runtime
- type guard.
-
-
-
+
+
+
+ Nested ternaries do not scale.
+
+
+ Loading, error, data. Then empty. Then not-found. Each new status is
+ another branch to paste into every screen. Miss one and the UI still
+ typechecks.
+
+
+
+
-
-
+
+
The package, running.
-
+
This island hydrates on view and calls
getUiState from
- @bearstudio/ui-state. Flip pending, error,
- and default. Each view is a
+ @bearstudio/ui-state. Flip
+ pending, error, and default. Each view is a
match branch; the chain ends
with exhaustive().
-
+
-
- What you get
-
- -
-
Exhaustive matching
-
- exhaustive() does not type
- check until every inferred status has a
- match. A new status is a
- compile error, not a blank screen.
-
-
- -
-
Your statuses, not a fixed enum
-
- pending, error, default, empty, not-found, or
- show-input. The helper
- infers the union from set().
-
-
- -
-
Payload per status
-
- set("default", {"{"} book {"}"})
- carries data on that branch. pending does not need a fake book.
-
-
- -
-
when() for a single branch
-
- ui.when("pending", …)
- renders that status and returns null otherwise. Use
- match when you want the
- full set.
-
-
- -
-
Small, React as a peer
-
- One function. No store, no context, no extra runtime. Wire it to
- TanStack Query, fetch, or flags you already have.
-
-
-
+
+
+ What you get
+
+
+ -
+
exhaustive()
+
+ -
+ Does not type-check until every inferred status has a
+
match. A new status is a
+ compile error, not a blank screen.
+
+
+
+ - Your statuses, with a payload
+ -
+ pending, error, empty, not-found, or
+
show-input —
+ set() infers the union.
+ Data lives on the branch that needs it.
+
+
+
+ -
+
when() for one branch
+
+ -
+
ui.when("pending", …)
+ renders that status and returns null otherwise. Use
+ match when you want the
+ full set.
+
+
+
+
-
-
+
+
-
-
+
{ui
.match("pending", () => (
-
-
-
+
+
+
+
{pendingLabel ? (
{pendingLabel}
) : null}
From 17fc4e8e29755819e74604a59e440555b825684b Mon Sep 17 00:00:00 2001
From: prdHugo <48803115+HugoPerard@users.noreply.github.com>
Date: Wed, 26 Aug 2026 04:36:27 -0700
Subject: [PATCH 15/46] Polish landing: drop fake chrome, equal tiles, and dark
invert
---
apps/landing/PRODUCT.md | 46 ++++++++++++++++++++++++++++++
apps/landing/src/styles/global.css | 17 +++++++++++
2 files changed, 63 insertions(+)
create mode 100644 apps/landing/PRODUCT.md
diff --git a/apps/landing/PRODUCT.md b/apps/landing/PRODUCT.md
new file mode 100644
index 0000000..8f0f212
--- /dev/null
+++ b/apps/landing/PRODUCT.md
@@ -0,0 +1,46 @@
+# Product
+
+
+
+## Platform
+
+web
+
+## Users
+
+TypeScript and React engineers drowning in nested loading / error / empty UI.
+
+## Product Purpose
+
+`@bearstudio/ui-state` is an OSS TypeScript helper. `getUiState` plus `match` plus `exhaustive()` map pending, error, and the statuses a screen already has onto one typed chain. Success is a compile error when a status is unmatched — not a new store.
+
+## Positioning
+
+exhaustive() is a type error until every status is matched. Statuses are inferred from set(), not a fixed enum. React is a peer. There is no store.
+
+## Operating Context
+
+Library landing (Persuade).
+Engineers arrive from GitHub, read a short example, and wire getUiState to query flags they already have.
+
+## Capabilities and Constraints
+
+- Surface API: getUiState, set(), match, exhaustive(), when().
+- Do not demo is() as a type guard; it does not narrow on current main (PR #5).
+- MIT. React peer. No store, no context, no extra runtime.
+- Do not invent download counts or testimonials.
+
+## Brand Commitments
+
+Voice: specific, technical, no hype. Anti-references: Relume/v0 indigo bento, fake browser chrome, equal feature cards, Unleash. Identity: cream/ink tokens, IBM Plex Sans and Mono.
+
+## Evidence on Hand
+
+No download counts, testimonials, or case studies. Do not fabricate them. Facts: MIT, React peer, no store, exhaustive() fails the type check until every status is matched.
+
+## Product Principles
+
+1. A missed status is a type error, not a blank screen.
+2. Statuses come from the app, not a library enum.
+3. No new store; wire to flags the screen already has.
+4. Marketing copy stays factual; no hype words.
diff --git a/apps/landing/src/styles/global.css b/apps/landing/src/styles/global.css
index ee7788c..c9fb777 100644
--- a/apps/landing/src/styles/global.css
+++ b/apps/landing/src/styles/global.css
@@ -26,6 +26,8 @@
html {
scroll-behavior: smooth;
+ color-scheme: light;
+ accent-color: var(--color-accent);
}
@media (prefers-reduced-motion: reduce) {
@@ -44,6 +46,7 @@ code,
pre,
.font-mono {
font-family: var(--font-mono);
+ font-variant-numeric: tabular-nums;
}
a:focus-visible,
@@ -51,3 +54,17 @@ button:focus-visible {
outline: 2px solid var(--color-accent);
outline-offset: 2px;
}
+
+::selection {
+ background: var(--color-ink);
+ color: var(--color-paper);
+}
+
+a {
+ text-underline-offset: 0.18em;
+}
+
+textarea,
+input {
+ caret-color: var(--color-accent);
+}
From 3ea1d594d4e71353bf07878c8752b7c13ac02f4a Mon Sep 17 00:00:00 2001
From: prdHugo <48803115+HugoPerard@users.noreply.github.com>
Date: Wed, 26 Aug 2026 04:36:30 -0700
Subject: [PATCH 16/46] style(landing): install command as primary CTA, POV
eyebrow, more section space
---
apps/landing/src/pages/index.astro | 117 ++++++++++++++++-------------
1 file changed, 63 insertions(+), 54 deletions(-)
diff --git a/apps/landing/src/pages/index.astro b/apps/landing/src/pages/index.astro
index 5496235..7a9ac5a 100644
--- a/apps/landing/src/pages/index.astro
+++ b/apps/landing/src/pages/index.astro
@@ -4,11 +4,11 @@ import HeroCode from "../components/HeroCode.astro";
import NestedTernary from "../components/NestedTernary.astro";
import { StateDemo } from "../components/StateDemo.tsx";
-const title = '@bearstudio/ui-state — exhaustive UI states for React';
+const title = "@bearstudio/ui-state — exhaustive UI states for React";
const description =
- 'A small TypeScript helper that maps pending, error, and custom statuses onto match + exhaustive(). Miss a status, tsc fails.';
-const github = 'https://github.com/BearStudio/ui-state';
-const install = 'pnpm add @bearstudio/ui-state';
+ "A small TypeScript helper that maps pending, error, and custom statuses onto match + exhaustive(). Miss a status, tsc fails.";
+const github = "https://github.com/BearStudio/ui-state";
+const install = "pnpm add @bearstudio/ui-state";
---
@@ -54,11 +54,14 @@ const install = 'pnpm add @bearstudio/ui-state';
-
-
+
+
+
+ Miss a status, tsc fails.
+
UI states you can exhaust.
@@ -70,15 +73,17 @@ const install = 'pnpm add @bearstudio/ui-state';
a type error until every status has a branch. For React screens that
already know if a query is loading — not a new store.
-
+
@@ -89,66 +94,62 @@ const install = 'pnpm add @bearstudio/ui-state';
-
-
- Nested ternaries do not scale.
-
-
- Loading, error, data. Then empty. Then not-found. Each new status is
- another branch to paste into every screen. Miss one and the UI still
- typechecks.
-
-
+
+
+ Nested ternaries do not scale.
+
+ Loading, error, data. Then empty. Then not-found. Each new status
+ is another branch to paste into every screen. Miss one and the UI
+ still typechecks.
+
+
+
-
+
The package, running.
This island hydrates on view and calls
getUiState from
- @bearstudio/ui-state. Flip
- pending, error, and default. Each view is a
+ @bearstudio/ui-state. Flip pending, error,
+ and default. Each view is a
match branch; the chain ends
with exhaustive().
-
+
-
-
+
+
What you get
-
-
- -
-
exhaustive()
-
- -
- Does not type-check until every inferred status has a
+
+
+ - exhaustive()
+ -
+ A type error until every status from
+
set() has a
match. A new status is a
compile error, not a blank screen.
-
- - Your statuses, with a payload
- -
- pending, error, empty, not-found, or
-
show-input —
- set() infers the union.
- Data lives on the branch that needs it.
+
+ - set()
+ -
+ Infers the union — pending, empty, not-found, or
+
show-input. Payload is
+ optional and typed on that branch.
-
- -
-
when() for one branch
-
- -
+
+
- when()
+ -
ui.when("pending", …)
renders that status and returns null otherwise. Use
match when you want the
@@ -159,16 +160,24 @@ const install = 'pnpm add @bearstudio/ui-state';
-
-
+
+
Install
+
+ Peer React. No store. Wire it to the query status you already have.
+
{install}
-
- MIT. GitHub
+
From b653674e86def5a2cbb6222f035181e24bb20f92 Mon Sep 17 00:00:00 2001
From: prdHugo <48803115+HugoPerard@users.noreply.github.com>
Date: Wed, 26 Aug 2026 04:37:50 -0700
Subject: [PATCH 17/46] Polish landing layout: cream theme-color
---
apps/landing/src/layouts/Layout.astro | 1 +
1 file changed, 1 insertion(+)
diff --git a/apps/landing/src/layouts/Layout.astro b/apps/landing/src/layouts/Layout.astro
index 17af0b4..1c4f8d9 100644
--- a/apps/landing/src/layouts/Layout.astro
+++ b/apps/landing/src/layouts/Layout.astro
@@ -40,6 +40,7 @@ const jsonLd = {
+
{title}
From 0b5d8d27789e54de61a582957ad8900004120953 Mon Sep 17 00:00:00 2001
From: prdHugo <48803115+HugoPerard@users.noreply.github.com>
Date: Wed, 26 Aug 2026 04:38:04 -0700
Subject: [PATCH 18/46] Polish StateDemo: skeleton pending, no spinner
---
apps/landing/src/components/StateDemo.tsx | 12 ++++--------
1 file changed, 4 insertions(+), 8 deletions(-)
diff --git a/apps/landing/src/components/StateDemo.tsx b/apps/landing/src/components/StateDemo.tsx
index 6fbd032..6ad4ad6 100644
--- a/apps/landing/src/components/StateDemo.tsx
+++ b/apps/landing/src/components/StateDemo.tsx
@@ -58,7 +58,7 @@ export function StateDemo() {
className={
selected
? "min-h-11 rounded-lg bg-ink px-3 font-mono text-sm text-paper"
- : "min-h-11 rounded-lg border border-line bg-paper px-3 font-mono text-sm text-ink"
+ : "min-h-11 rounded-lg border border-line bg-paper px-3 font-mono text-sm text-ink hover:border-ink"
}
>
{control.label}
@@ -69,13 +69,9 @@ export function StateDemo() {
{ui
.match("pending", () => (
-
-
-
-
+
+
+
{pendingLabel ? (
{pendingLabel}
) : null}
From 2944aea25bf8a5a6e62239b910ea966123d3defd Mon Sep 17 00:00:00 2001
From: prdHugo <48803115+HugoPerard@users.noreply.github.com>
Date: Wed, 26 Aug 2026 04:38:32 -0700
Subject: [PATCH 19/46] Polish landing: drop kicker, add peer React fact
---
apps/landing/src/pages/index.astro | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
diff --git a/apps/landing/src/pages/index.astro b/apps/landing/src/pages/index.astro
index 7a9ac5a..c707fa6 100644
--- a/apps/landing/src/pages/index.astro
+++ b/apps/landing/src/pages/index.astro
@@ -57,11 +57,8 @@ const install = "pnpm add @bearstudio/ui-state";
-
- Miss a status, tsc fails.
-
UI states you can exhaust.
@@ -118,7 +115,7 @@ const install = "pnpm add @bearstudio/ui-state";
@bearstudio/ui-state. Flip pending, error,
and default. Each view is a
match branch; the chain ends
- with exhaustive().
+ with exhaustive() — a type check, not a runtime type guard.
@@ -156,6 +153,13 @@ const install = "pnpm add @bearstudio/ui-state";
full set.
+
+ - React as a peer
+ -
+ One function. No store, no context, no extra runtime. Wire it to
+ TanStack Query, fetch, or flags you already have.
+
+
From 2bdb9892b4c36ebe3283210634ab4a11650ac0f0 Mon Sep 17 00:00:00 2001
From: prdHugo <48803115+HugoPerard@users.noreply.github.com>
Date: Wed, 26 Aug 2026 04:39:44 -0700
Subject: [PATCH 20/46] polish(landing): restore pending/error/default product
states on hero card
---
apps/landing/src/components/HeroCode.astro | 26 ++++++++++++++++++----
1 file changed, 22 insertions(+), 4 deletions(-)
diff --git a/apps/landing/src/components/HeroCode.astro b/apps/landing/src/components/HeroCode.astro
index 81d2f93..c5a73ea 100644
--- a/apps/landing/src/components/HeroCode.astro
+++ b/apps/landing/src/components/HeroCode.astro
@@ -13,14 +13,32 @@
class="overflow-x-auto p-5 font-mono text-[13px] leading-6 text-paper sm:text-sm"
>import {"{"} getUiState {"}"} from "@bearstudio/ui-state";
-const ui = getUiState((set) => {"{"}
+const ui = getUiState((set) => {"{"}
if (bookQuery.status === "pending") return set("pending");
if (bookQuery.status === "error") return set("error");
return set("default", {"{"} book: bookQuery.data {"}"});
{"}"});
-ui.match("pending", () => <>Loading...</>)
- .match("error", () => <>Error</>)
- .match("default", ({ book }) => <>{book.title}</>)
+ui.match("pending", () => <>Loading...</>)
+ .match("error", () => <>Error</>)
+ .match("default", ({ book }) => <>{book.title}</>)
.exhaustive();
+
+ -
+
+ pending
+
+
+
+
+ -
+
error
+ Could not load the book.
+
+ -
+
default
+ The Left Hand of Darkness
+ Ursula K. Le Guin
+
+
From c42ad6e2e811d7d8f11a3ecaa05730622a9f3838 Mon Sep 17 00:00:00 2001
From: prdHugo <48803115+HugoPerard@users.noreply.github.com>
Date: Wed, 26 Aug 2026 04:40:08 -0700
Subject: [PATCH 21/46] polish(landing): match-plus-exhaustive demo with
skeleton pending
---
apps/landing/src/components/StateDemo.tsx | 67 ++++++++++++-----------
1 file changed, 34 insertions(+), 33 deletions(-)
diff --git a/apps/landing/src/components/StateDemo.tsx b/apps/landing/src/components/StateDemo.tsx
index 6ad4ad6..09c512f 100644
--- a/apps/landing/src/components/StateDemo.tsx
+++ b/apps/landing/src/components/StateDemo.tsx
@@ -36,45 +36,46 @@ export function StateDemo() {
[status],
);
- const pendingLabel = ui.when("pending", () => "Fetching the book");
-
return (
-
- {CONTROLS.map((control) => {
- const selected = status === control.id;
- return (
-
- );
- })}
+
+ match + exhaustive
+
+ {CONTROLS.map((control) => {
+ const selected = status === control.id;
+ return (
+
+ );
+ })}
+
-
+
{ui
.match("pending", () => (
-
-
- {pendingLabel ? (
- {pendingLabel}
- ) : null}
+
+ pending
+
+
+
))
.match("error", () => (
From a45ed8a2726211b0e9595dafdd08a1c2726fe4e5 Mon Sep 17 00:00:00 2001
From: prdHugo <48803115+HugoPerard@users.noreply.github.com>
Date: Wed, 26 Aug 2026 04:40:48 -0700
Subject: [PATCH 22/46] polish(landing): two-column hero, text GitHub,
three-item definition list
---
apps/landing/src/pages/index.astro | 107 ++++++++++++-----------------
1 file changed, 44 insertions(+), 63 deletions(-)
diff --git a/apps/landing/src/pages/index.astro b/apps/landing/src/pages/index.astro
index c707fa6..5d86233 100644
--- a/apps/landing/src/pages/index.astro
+++ b/apps/landing/src/pages/index.astro
@@ -54,8 +54,8 @@ const install = "pnpm add @bearstudio/ui-state";
-
-
+
+
-
+
@@ -91,97 +88,81 @@ const install = "pnpm add @bearstudio/ui-state";
-
-
- Nested ternaries do not scale.
+
+
+
+ Nested ternaries do not scale.
+
- Loading, error, data. Then empty. Then not-found. Each new status
- is another branch to paste into every screen. Miss one and the UI
- still typechecks.
+ Loading, error, data. Then empty. Then not-found. Each new status is
+ another branch to paste into every screen. Miss one and the UI still
+ typechecks.
-
-
-
+
-
+
The package, running.
This island hydrates on view and calls
getUiState from
- @bearstudio/ui-state. Flip pending, error,
- and default. Each view is a
+ @bearstudio/ui-state. Flip
+ pending, error, and default. Each view is a
match branch; the chain ends
- with exhaustive() — a type check, not a runtime type guard.
+ with exhaustive().
-
+
-
-
+
+
What you get
-
-
- - exhaustive()
- -
- A type error until every status from
-
set() has a
+
+
+ -
+
exhaustive()
+
+ -
+ Does not type-check until every inferred status has a
match. A new status is a
compile error, not a blank screen.
-
- - set()
- -
- Infers the union — pending, empty, not-found, or
-
show-input. Payload is
- optional and typed on that branch.
+
+ - Your statuses, not a fixed enum
+ -
+ pending, error, default, empty, not-found, or
+
show-input. The helper
+ infers the union from set().
-
- - when()
- -
-
ui.when("pending", …)
- renders that status and returns null otherwise. Use
- match when you want the
- full set.
-
-
-
- - React as a peer
- -
- One function. No store, no context, no extra runtime. Wire it to
- TanStack Query, fetch, or flags you already have.
+
+
- Payload per status
+ -
+
set("default", {"{"} book {"}"})
+ carries data on that branch. pending does not need a fake book.
-
-
+
+
Install
-
- Peer React. No store. Wire it to the query status you already have.
-
{install}
From 8b0ceaaf69d81a01dc2f8296f737f9b8ced60013 Mon Sep 17 00:00:00 2001
From: prdHugo <48803115+HugoPerard@users.noreply.github.com>
Date: Wed, 26 Aug 2026 04:54:56 -0700
Subject: [PATCH 23/46] fix(landing): sell exhaustive() with the tsc error, not
a second match sample
---
.../src/components/NestedTernary.astro | 50 ++++++-------------
1 file changed, 16 insertions(+), 34 deletions(-)
diff --git a/apps/landing/src/components/NestedTernary.astro b/apps/landing/src/components/NestedTernary.astro
index aa90b29..ba131cc 100644
--- a/apps/landing/src/components/NestedTernary.astro
+++ b/apps/landing/src/components/NestedTernary.astro
@@ -1,37 +1,19 @@
---
-// Editorial pair: nested ternaries vs match + exhaustive.
-// Braces escaped so Astro does not evaluate them.
+// The sell: exhaustive() is a type error until every status is matched.
---
-
-
-
- Nested ternaries
-
- return isLoading ? (
- <Spinner />
-) : error ? (
- <Error />
-) : data ? (
- <Book book={"{ "}data{"} "} />
-) : (
- <Empty />
-);
-
-
-
- match + exhaustive
-
- ui.match("pending", () => <Spinner />)
- .match("error", () => <Error />)
- .match("default", ({ book }) =>
- <Book book={book} />,
- )
- .match("empty", () => <Empty />)
- .exhaustive();
-
-
+
+
+ tsc
+
+ book-screen.tsx:14:6 - error TS2349
+This expression is not callable.
+ Type 'Unmatched<"empty">' has no call signatures.
+
+ 12 .match("default", ({ book }) => <Book book={book} />)
+ 13 .match("error", () => <Error />)
+ 14 .exhaustive()
+ ~~~~~~~~~~
+
From ff62edc6bd069e89e212824c902efe3418f21e03 Mon Sep 17 00:00:00 2001
From: prdHugo <48803115+HugoPerard@users.noreply.github.com>
Date: Wed, 26 Aug 2026 04:55:20 -0700
Subject: [PATCH 24/46] fix(landing): rust accent on the selected demo control
---
apps/landing/src/components/StateDemo.tsx | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/apps/landing/src/components/StateDemo.tsx b/apps/landing/src/components/StateDemo.tsx
index 09c512f..802ef81 100644
--- a/apps/landing/src/components/StateDemo.tsx
+++ b/apps/landing/src/components/StateDemo.tsx
@@ -57,7 +57,7 @@ export function StateDemo() {
}}
className={
selected
- ? "min-h-11 rounded-lg bg-ink px-3 font-mono text-sm text-paper"
+ ? "min-h-11 rounded-lg bg-accent px-3 font-mono text-sm text-accent-ink"
: "min-h-11 rounded-lg border border-line bg-paper px-3 font-mono text-sm text-ink"
}
>
@@ -71,11 +71,9 @@ export function StateDemo() {
{ui
.match("pending", () => (
-
- pending
-
-
-
+ pending
+
+
))
.match("error", () => (
From d6b738da4e3c708c2797eac301eb1673a39b68f4 Mon Sep 17 00:00:00 2001
From: prdHugo <48803115+HugoPerard@users.noreply.github.com>
Date: Wed, 26 Aug 2026 04:55:50 -0700
Subject: [PATCH 25/46] fix(landing): install as pre, tsc miss in copy
---
apps/landing/src/pages/index.astro | 23 ++++++++++-------------
1 file changed, 10 insertions(+), 13 deletions(-)
diff --git a/apps/landing/src/pages/index.astro b/apps/landing/src/pages/index.astro
index 5d86233..b2e0894 100644
--- a/apps/landing/src/pages/index.astro
+++ b/apps/landing/src/pages/index.astro
@@ -71,11 +71,9 @@ const install = "pnpm add @bearstudio/ui-state";
already know if a query is loading — not a new store.
-
- {install}
-
+ {install}
GitHub
@@ -91,12 +89,13 @@ const install = "pnpm add @bearstudio/ui-state";
- Nested ternaries do not scale.
+ Miss a status, tsc fails.
Loading, error, data. Then empty. Then not-found. Each new status is
- another branch to paste into every screen. Miss one and the UI still
- typechecks.
+ another branch to paste into every screen. Miss one and a ternary
+ still typechecks. exhaustive()
+ does not.
@@ -156,11 +155,9 @@ const install = "pnpm add @bearstudio/ui-state";
Install
-
- {install}
-
+ {install}
From 0d8dc097383895627e68fe174c9975b34edb49eb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Hugo=20Pe=CC=81rard?=
Date: Wed, 26 Aug 2026 13:58:40 +0200
Subject: [PATCH 26/46] update astro
---
apps/landing/astro.config.ts | 1 +
apps/landing/package.json | 2 +-
packages/ui-state/package.json | 2 +-
packages/ui-state/turbo.json | 11 +
pnpm-lock.yaml | 2965 +++++++++++++++++++++++++++++++-
5 files changed, 2904 insertions(+), 77 deletions(-)
create mode 100644 packages/ui-state/turbo.json
diff --git a/apps/landing/astro.config.ts b/apps/landing/astro.config.ts
index 675aa50..6217a42 100644
--- a/apps/landing/astro.config.ts
+++ b/apps/landing/astro.config.ts
@@ -4,6 +4,7 @@ import { defineConfig, fontProviders } from "astro/config";
export default defineConfig({
output: "static",
+ compressHTML: true,
integrations: [react()],
vite: {
plugins: [tailwindcss()],
diff --git a/apps/landing/package.json b/apps/landing/package.json
index 274d4fe..50690f3 100644
--- a/apps/landing/package.json
+++ b/apps/landing/package.json
@@ -14,7 +14,7 @@
"dependencies": {
"@astrojs/react": "6.0.4",
"@bearstudio/ui-state": "workspace:*",
- "astro": "6.4.8",
+ "astro": "7.2.7",
"react": "19.2.8",
"react-dom": "19.2.8"
},
diff --git a/packages/ui-state/package.json b/packages/ui-state/package.json
index a3394b2..237947c 100644
--- a/packages/ui-state/package.json
+++ b/packages/ui-state/package.json
@@ -33,7 +33,7 @@
},
"scripts": {
"dev": "tsup src/index.ts --format esm,cjs --watch",
- "build": "tsup src/index.ts --format esm,cjs --minify && tsc -p tsconfig.build.json",
+ "build": "tsup src/index.ts --format esm,cjs --minify --clean && tsc -p tsconfig.build.json",
"lint": "oxlint .",
"check-types": "tsc --noEmit",
"test": "vitest run",
diff --git a/packages/ui-state/turbo.json b/packages/ui-state/turbo.json
new file mode 100644
index 0000000..2906c64
--- /dev/null
+++ b/packages/ui-state/turbo.json
@@ -0,0 +1,11 @@
+{
+ "$schema": "https://turborepo.com/schema.json",
+ "extends": ["//"],
+ "tasks": {
+ "dev": {
+ "dependsOn": ["build"],
+ "cache": false,
+ "persistent": true
+ }
+ }
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 1dd265a..54b1423 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -27,6 +27,43 @@ importers:
specifier: 7.0.2
version: 7.0.2
+ apps/landing:
+ dependencies:
+ '@astrojs/react':
+ specifier: 6.0.4
+ version: 6.0.4(@types/node@24.13.3)(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(esbuild@0.28.2)(jiti@2.7.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(yaml@2.9.0)
+ '@bearstudio/ui-state':
+ specifier: workspace:*
+ version: link:../../packages/ui-state
+ astro:
+ specifier: 7.2.7
+ version: 7.2.7(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.13.3)(jiti@2.7.0)(yaml@2.9.0)
+ react:
+ specifier: 19.2.8
+ version: 19.2.8
+ react-dom:
+ specifier: 19.2.8
+ version: 19.2.8(react@19.2.8)
+ devDependencies:
+ '@bearstudio/typescript-config':
+ specifier: workspace:*
+ version: link:../../packages/typescript-config
+ '@tailwindcss/vite':
+ specifier: 4.3.3
+ version: 4.3.3(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))
+ '@types/react':
+ specifier: 19.2.18
+ version: 19.2.18
+ '@types/react-dom':
+ specifier: 19.2.5
+ version: 19.2.5(@types/react@19.2.18)
+ tailwindcss:
+ specifier: 4.3.3
+ version: 4.3.3
+ typescript:
+ specifier: 7.0.2
+ version: 7.0.2
+
packages/typescript-config: {}
packages/ui-state:
@@ -55,16 +92,240 @@ importers:
version: 4.1.11(vitest@4.1.11)
tsup:
specifier: 8.5.1
- version: 8.5.1(postcss@8.5.26)(typescript@7.0.2)(yaml@2.9.0)
+ version: 8.5.1(jiti@2.7.0)(postcss@8.5.26)(typescript@7.0.2)(yaml@2.9.0)
typescript:
specifier: 7.0.2
version: 7.0.2
vitest:
specifier: 4.1.11
- version: 4.1.11(@types/node@24.13.3)(@vitest/ui@4.1.11)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.7)(yaml@2.9.0))
+ version: 4.1.11(@types/node@24.13.3)(@vitest/ui@4.1.11)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.7)(jiti@2.7.0)(yaml@2.9.0))
packages:
+ '@astrojs/compiler-binding-darwin-arm64@0.4.0':
+ resolution: {integrity: sha512-ZVUwHundaQyFNjE6uoa0usaC0WOCitDCLS/4mdb4rOiJXwVUuKJBMxI5WMzXLWmamsXtK/Z//ifLXvV5Yeh4Hw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@astrojs/compiler-binding-darwin-x64@0.4.0':
+ resolution: {integrity: sha512-FI6G8AY8u6fR1SI/QRR5yGMwtvZwP34CDmZpZ5HwJGa50UM1VISTLhqkhV4a476pmgd25X1Aur2dqw6hUnrlKA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [darwin]
+
+ '@astrojs/compiler-binding-linux-arm64-gnu@0.4.0':
+ resolution: {integrity: sha512-lB9gLFJK7m82EnjaU8nlRBEfcwGNeHidW3sSjODTUjMNaoewVuUz9fwwdY5M4jiSXIqWLH3yl6TX8FTDKA74Sw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@astrojs/compiler-binding-linux-arm64-musl@0.4.0':
+ resolution: {integrity: sha512-HPbvWqbxFxyaoQJhLxCaSjtYBx9KBo7JGVzEFZCmMl968a2PsSH0UfiODYgYPXofTOIsIH2aoCcrHXML0IA3ig==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@astrojs/compiler-binding-linux-x64-gnu@0.4.0':
+ resolution: {integrity: sha512-tQKolMxoJ/+0AmLWm1PmJ/i+z3i10ZU1bNuVjEDulCf48azEMtUNjTZgHJ5MPtpYRNc7dlETr8QujUfduzoC7Q==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@astrojs/compiler-binding-linux-x64-musl@0.4.0':
+ resolution: {integrity: sha512-5v5YymudsxMHp3NBLCS8BUlu5CRqeLtWD9cKS/4nIhIEHCbpz9okmVV6I0HWqmBAPhWYcDa3vw/vltYPrOQCTA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@astrojs/compiler-binding-wasm32-wasi@0.4.0':
+ resolution: {integrity: sha512-m/phuH3x3PREvv1OnkM44NoPh4MatUadix1fB1u5SvMLCyDTUZykDJbKnWf1cjnYmHdlB8HcjTjl6JrCqAIXcw==}
+ engines: {node: '>=14.0.0'}
+ cpu: [wasm32]
+
+ '@astrojs/compiler-binding-win32-arm64-msvc@0.4.0':
+ resolution: {integrity: sha512-B9zYf3okEY83kM8gydlpH2BHP00w4ifxPqlYlWrgTwuD6wnkrJDCwBlgy1q31cERjCJRXN1lrE2VmkLvFjv/6g==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [win32]
+
+ '@astrojs/compiler-binding-win32-x64-msvc@0.4.0':
+ resolution: {integrity: sha512-zB0Nrv0dGc0zZWPGDRmmETTPhDRqyZjAjk+gWMlVrJX5U89obpB3VUUE1ZiHxOCN5LQojeLK6O8L/dnoHolvNQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [win32]
+
+ '@astrojs/compiler-binding@0.4.0':
+ resolution: {integrity: sha512-x2RjDUuWfwLNtc3mjAdSRInwqh/rqbLar9cm/5FOMbHvmYZB7yfKewzSclAxWjIZsypJDXv1lhaP2WG+P8TK3g==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+
+ '@astrojs/compiler-rs@0.4.0':
+ resolution: {integrity: sha512-koVikeon1kreEy+/JzLQRy3vzHHQVOjycs4degg4vFufKApZOwMZvSSAEztYNhmcQVfNVsVZZI4cEge3cexAbQ==}
+ engines: {node: '>=22.12.0'}
+
+ '@astrojs/internal-helpers@0.10.4':
+ resolution: {integrity: sha512-nozZSy/mKYLqe4YrqbKtdOszedAfXYCtw3wZ0d+CAjz4GqQ4L9rl1ltIL5BlgwmYVinJg/RZ0MgGuWOdlyRZlA==}
+
+ '@astrojs/markdown-satteri@0.3.8':
+ resolution: {integrity: sha512-n8ItpFTCmlDsVR5+rwDmehSf+jFCYLWmZiisZNGuF7xILqYhsVeBfcha4qgS2Seq3fAc9Tm58ZVrvqFQ6RQgRQ==}
+
+ '@astrojs/prism@4.0.2':
+ resolution: {integrity: sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA==}
+ engines: {node: '>=22.12.0'}
+
+ '@astrojs/react@6.0.4':
+ resolution: {integrity: sha512-0PDs0gM00vbUnw84Dh+YaxYaZzlppyzJub0J8wOO8/8AG4gV8L8X1ttiRp8cbSBGiWcu3UuspCaqIDO31ta8Uw==}
+ engines: {node: '>=22.12.0'}
+ peerDependencies:
+ '@types/react': ^17.0.50 || ^18.0.21 || ^19.0.0
+ '@types/react-dom': ^17.0.17 || ^18.0.6 || ^19.0.0
+ react: ^17.0.2 || ^18.0.0 || ^19.0.0
+ react-dom: ^17.0.2 || ^18.0.0 || ^19.0.0
+
+ '@astrojs/telemetry@3.3.3':
+ resolution: {integrity: sha512-C1TLn5sPJr0x4vk56piHWKbnqlEB8BKyte5Y45V02U+D7BGO5eMqZDH5aPjnkXQWJggvmsTXxH03QMZ9NgWLzQ==}
+ engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0}
+
+ '@babel/code-frame@7.29.7':
+ resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/compat-data@7.29.7':
+ resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/core@7.29.7':
+ resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/generator@7.29.8':
+ resolution: {integrity: sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-compilation-targets@7.29.7':
+ resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-globals@7.29.7':
+ resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-imports@7.29.7':
+ resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-transforms@7.29.7':
+ resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-plugin-utils@7.29.7':
+ resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-string-parser@7.29.7':
+ resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-identifier@7.29.7':
+ resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-option@7.29.7':
+ resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helpers@7.29.7':
+ resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/parser@7.29.8':
+ resolution: {integrity: sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ '@babel/plugin-transform-react-jsx-self@7.29.7':
+ resolution: {integrity: sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-react-jsx-source@7.29.7':
+ resolution: {integrity: sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/template@7.29.7':
+ resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/traverse@7.29.8':
+ resolution: {integrity: sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/types@7.29.8':
+ resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==}
+ engines: {node: '>=6.9.0'}
+
+ '@bruits/satteri-darwin-arm64@0.10.5':
+ resolution: {integrity: sha512-27KTVl4TJkVahMy/ohyA7qd4938G5UNneFUz/PsScYfpIhj0IVAS23mpcJXdPF44sa6nva198lmV/cKIb2YPyA==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@bruits/satteri-darwin-x64@0.10.5':
+ resolution: {integrity: sha512-IjnLe3nKspq6qaeqGgjT7MT8VrTV74yWRlaag7ZdNsI8TDAYZ0iPxMCo+9KQZHUk5EyVB+reBI/PFWL5KuFw9Q==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@bruits/satteri-linux-arm64-gnu@0.10.5':
+ resolution: {integrity: sha512-glkYXZCJywjP13v67eAyAMSJdF+ncvEbYvgi/wOtffL9tQ27lr/zsyzUfgs+ovjJ9d8JNQKiXeiArJcX8PJL9w==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@bruits/satteri-linux-arm64-musl@0.10.5':
+ resolution: {integrity: sha512-yWdgG1g17Nh2QyGVlFUxGRa3FEFwiMcpZEyMNWkbM3deC94cmVc+/i9OuyFpdKuWo3GkgoCtYVOoxk1uCnCZIA==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@bruits/satteri-linux-x64-gnu@0.10.5':
+ resolution: {integrity: sha512-FVaLoPT1fBgGl0J+AYebyyXJYBachGl8Oyyrf1lye4RTqCB4S0Gwkj1uM9RJyThUOvx5VUmAT1CnNh1SFHA+kw==}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@bruits/satteri-linux-x64-musl@0.10.5':
+ resolution: {integrity: sha512-EHpVAx2bqW3GINHTKkljtxVfQmVDGWIuwOYOP5YghTj+0PkBa2o8oKPRtQ9Kbsr1Fye8jtUcDjhwj2jMNugZKg==}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@bruits/satteri-wasm32-wasi@0.10.5':
+ resolution: {integrity: sha512-ypz8c/Zmipxp4IoeDa228Gstv6TLzVmNs3yC6wKCoNSOjx1iwpgzu87Y3hTkXFdwChVGU85qeUDuOIarGUZQLw==}
+ engines: {node: '>=14.0.0'}
+ cpu: [wasm32]
+
+ '@bruits/satteri-win32-arm64-msvc@0.10.5':
+ resolution: {integrity: sha512-siTV88nb0LRqNpkL2gXboqCwVdq95sLtzMHS1/3eONV2gLbB3NAK46wmSMvCO/yquBvI2lvaFIfd8P12ecsxBw==}
+ cpu: [arm64]
+ os: [win32]
+
+ '@bruits/satteri-win32-x64-msvc@0.10.5':
+ resolution: {integrity: sha512-C3IfPvfvMXmlzBxaMPKFS1XiuV9pu2mC7YqkPk7PSvTgPZ8gbdASIpHpztDLvTTQjqZ0z1Ol8tK5X+V6XXC0wQ==}
+ cpu: [x64]
+ os: [win32]
+
+ '@capsizecss/unpack@4.0.1':
+ resolution: {integrity: sha512-CuNiSqg7+e1cO/GjffyMOm5Tt2jUF9CWHHnvQ/UkqvtkGfHdgwEC0wpmq7fkN3gxwpRnrAN0WzO3vREKmNolMQ==}
+ engines: {node: '>=18'}
+
'@changesets/apply-release-plan@8.0.0':
resolution: {integrity: sha512-kUd2pbf1w5/AYmBMb0Tt+rkIPCjFJdT0SZMrkOjJT/WV/QbtmvkyB5jkV0oaNPheavprZk+SfUiozUti7TIL2w==}
engines: {node: ^22.11 || ^24 || >=26}
@@ -134,165 +395,489 @@ packages:
resolution: {integrity: sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A==}
engines: {node: '>= 20.12.0'}
+ '@emnapi/core@1.11.1':
+ resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==}
+
+ '@emnapi/runtime@1.11.1':
+ resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==}
+
+ '@emnapi/runtime@1.11.3':
+ resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==}
+
+ '@emnapi/wasi-threads@1.2.2':
+ resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==}
+
'@esbuild/aix-ppc64@0.27.7':
resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [aix]
+ '@esbuild/aix-ppc64@0.28.2':
+ resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [aix]
+
'@esbuild/android-arm64@0.27.7':
resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==}
engines: {node: '>=18'}
cpu: [arm64]
os: [android]
+ '@esbuild/android-arm64@0.28.2':
+ resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [android]
+
'@esbuild/android-arm@0.27.7':
resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==}
engines: {node: '>=18'}
cpu: [arm]
os: [android]
+ '@esbuild/android-arm@0.28.2':
+ resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [android]
+
'@esbuild/android-x64@0.27.7':
resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==}
engines: {node: '>=18'}
cpu: [x64]
os: [android]
+ '@esbuild/android-x64@0.28.2':
+ resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [android]
+
'@esbuild/darwin-arm64@0.27.7':
resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==}
engines: {node: '>=18'}
cpu: [arm64]
os: [darwin]
+ '@esbuild/darwin-arm64@0.28.2':
+ resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [darwin]
+
'@esbuild/darwin-x64@0.27.7':
resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==}
engines: {node: '>=18'}
cpu: [x64]
os: [darwin]
+ '@esbuild/darwin-x64@0.28.2':
+ resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [darwin]
+
'@esbuild/freebsd-arm64@0.27.7':
resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==}
engines: {node: '>=18'}
cpu: [arm64]
os: [freebsd]
+ '@esbuild/freebsd-arm64@0.28.2':
+ resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [freebsd]
+
'@esbuild/freebsd-x64@0.27.7':
resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==}
engines: {node: '>=18'}
cpu: [x64]
os: [freebsd]
+ '@esbuild/freebsd-x64@0.28.2':
+ resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [freebsd]
+
'@esbuild/linux-arm64@0.27.7':
resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==}
engines: {node: '>=18'}
cpu: [arm64]
os: [linux]
+ '@esbuild/linux-arm64@0.28.2':
+ resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [linux]
+
'@esbuild/linux-arm@0.27.7':
resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==}
engines: {node: '>=18'}
cpu: [arm]
os: [linux]
+ '@esbuild/linux-arm@0.28.2':
+ resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [linux]
+
'@esbuild/linux-ia32@0.27.7':
resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==}
engines: {node: '>=18'}
cpu: [ia32]
os: [linux]
+ '@esbuild/linux-ia32@0.28.2':
+ resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [linux]
+
'@esbuild/linux-loong64@0.27.7':
resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==}
engines: {node: '>=18'}
cpu: [loong64]
os: [linux]
+ '@esbuild/linux-loong64@0.28.2':
+ resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==}
+ engines: {node: '>=18'}
+ cpu: [loong64]
+ os: [linux]
+
'@esbuild/linux-mips64el@0.27.7':
resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==}
engines: {node: '>=18'}
cpu: [mips64el]
os: [linux]
+ '@esbuild/linux-mips64el@0.28.2':
+ resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==}
+ engines: {node: '>=18'}
+ cpu: [mips64el]
+ os: [linux]
+
'@esbuild/linux-ppc64@0.27.7':
resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [linux]
+ '@esbuild/linux-ppc64@0.28.2':
+ resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [linux]
+
'@esbuild/linux-riscv64@0.27.7':
resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==}
engines: {node: '>=18'}
cpu: [riscv64]
os: [linux]
+ '@esbuild/linux-riscv64@0.28.2':
+ resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==}
+ engines: {node: '>=18'}
+ cpu: [riscv64]
+ os: [linux]
+
'@esbuild/linux-s390x@0.27.7':
resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==}
engines: {node: '>=18'}
cpu: [s390x]
os: [linux]
- '@esbuild/linux-x64@0.27.7':
- resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==}
- engines: {node: '>=18'}
+ '@esbuild/linux-s390x@0.28.2':
+ resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==}
+ engines: {node: '>=18'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.27.7':
+ resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.28.2':
+ resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/netbsd-arm64@0.27.7':
+ resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [netbsd]
+
+ '@esbuild/netbsd-arm64@0.28.2':
+ resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [netbsd]
+
+ '@esbuild/netbsd-x64@0.27.7':
+ resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/netbsd-x64@0.28.2':
+ resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/openbsd-arm64@0.27.7':
+ resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-arm64@0.28.2':
+ resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-x64@0.27.7':
+ resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-x64@0.28.2':
+ resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/openharmony-arm64@0.27.7':
+ resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@esbuild/openharmony-arm64@0.28.2':
+ resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@esbuild/sunos-x64@0.27.7':
+ resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/sunos-x64@0.28.2':
+ resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/win32-arm64@0.27.7':
+ resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-arm64@0.28.2':
+ resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.27.7':
+ resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.28.2':
+ resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-x64@0.27.7':
+ resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [win32]
+
+ '@esbuild/win32-x64@0.28.2':
+ resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [win32]
+
+ '@img/colour@1.1.0':
+ resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==}
+ engines: {node: '>=18'}
+
+ '@img/sharp-darwin-arm64@0.34.5':
+ resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@img/sharp-darwin-x64@0.34.5':
+ resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [darwin]
+
+ '@img/sharp-libvips-darwin-arm64@1.2.4':
+ resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@img/sharp-libvips-darwin-x64@1.2.4':
+ resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@img/sharp-libvips-linux-arm64@1.2.4':
+ resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-libvips-linux-arm@1.2.4':
+ resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==}
+ cpu: [arm]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-libvips-linux-ppc64@1.2.4':
+ resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-libvips-linux-riscv64@1.2.4':
+ resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-libvips-linux-s390x@1.2.4':
+ resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==}
+ cpu: [s390x]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-libvips-linux-x64@1.2.4':
+ resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-libvips-linuxmusl-arm64@1.2.4':
+ resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@img/sharp-libvips-linuxmusl-x64@1.2.4':
+ resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@img/sharp-linux-arm64@0.34.5':
+ resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-linux-arm@0.34.5':
+ resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-linux-ppc64@0.34.5':
+ resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-linux-riscv64@0.34.5':
+ resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-linux-s390x@0.34.5':
+ resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [s390x]
+ os: [linux]
+ libc: [glibc]
+
+ '@img/sharp-linux-x64@0.34.5':
+ resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [x64]
os: [linux]
+ libc: [glibc]
- '@esbuild/netbsd-arm64@0.27.7':
- resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [netbsd]
-
- '@esbuild/netbsd-x64@0.27.7':
- resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [netbsd]
-
- '@esbuild/openbsd-arm64@0.27.7':
- resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==}
- engines: {node: '>=18'}
+ '@img/sharp-linuxmusl-arm64@0.34.5':
+ resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm64]
- os: [openbsd]
+ os: [linux]
+ libc: [musl]
- '@esbuild/openbsd-x64@0.27.7':
- resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==}
- engines: {node: '>=18'}
+ '@img/sharp-linuxmusl-x64@0.34.5':
+ resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [x64]
- os: [openbsd]
-
- '@esbuild/openharmony-arm64@0.27.7':
- resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [openharmony]
+ os: [linux]
+ libc: [musl]
- '@esbuild/sunos-x64@0.27.7':
- resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [sunos]
+ '@img/sharp-wasm32@0.34.5':
+ resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [wasm32]
- '@esbuild/win32-arm64@0.27.7':
- resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==}
- engines: {node: '>=18'}
+ '@img/sharp-win32-arm64@0.34.5':
+ resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm64]
os: [win32]
- '@esbuild/win32-ia32@0.27.7':
- resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==}
- engines: {node: '>=18'}
+ '@img/sharp-win32-ia32@0.34.5':
+ resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [ia32]
os: [win32]
- '@esbuild/win32-x64@0.27.7':
- resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==}
- engines: {node: '>=18'}
+ '@img/sharp-win32-x64@0.34.5':
+ resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [x64]
os: [win32]
'@jridgewell/gen-mapping@0.3.13':
resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
+ '@jridgewell/remapping@2.3.5':
+ resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==}
+
'@jridgewell/resolve-uri@3.1.2':
resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
engines: {node: '>=6.0.0'}
@@ -322,6 +907,16 @@ packages:
os: [linux]
libc: [glibc]
+ '@napi-rs/wasm-runtime@1.2.3':
+ resolution: {integrity: sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0}
+ peerDependencies:
+ '@emnapi/core': ^1.7.1 || ^2.0.0-alpha.4
+ '@emnapi/runtime': ^1.7.1 || ^2.0.0-alpha.4
+
+ '@oslojs/encoding@1.1.0':
+ resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==}
+
'@oxc-project/types@0.146.0':
resolution: {integrity: sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==}
@@ -702,6 +1297,9 @@ packages:
cpu: [x64]
os: [win32]
+ '@rolldown/pluginutils@1.0.0-rc.3':
+ resolution: {integrity: sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==}
+
'@rolldown/pluginutils@1.0.1':
resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==}
@@ -843,9 +1441,134 @@ packages:
cpu: [x64]
os: [win32]
+ '@shikijs/core@4.4.3':
+ resolution: {integrity: sha512-QCR4q2ZO/ILJEuwiBMel4wdcTDb1JGwfjKTxPDF6x8ixOaluPrVqIn06C99AcRPhmYlBR56d/Fb+GN58GzExpg==}
+ engines: {node: '>=20'}
+
+ '@shikijs/engine-javascript@4.4.3':
+ resolution: {integrity: sha512-FbOjFJp9VLdo1Wevs10BBtVxiTWwNLqZh5Gkhjgda/ioL15YOgeSl9n+6XMa3qRlPQzfhFNe641SrynFHYG0nQ==}
+ engines: {node: '>=20'}
+
+ '@shikijs/engine-oniguruma@4.4.3':
+ resolution: {integrity: sha512-EcOQkxdxGQrc1Row/cC2c96/v1dbZqGnEVu1qTuT/MJmp6+cXCvQussowVmCv5Tqr3KuY3c7IbM6HTW3LJ1k9w==}
+ engines: {node: '>=20'}
+
+ '@shikijs/langs@4.4.3':
+ resolution: {integrity: sha512-ePic0yfAJGOF83D5wBHK/00EjK65oahBYxFk5epgq33WRv7X9UuxLEV8PtR0szC0z8dl7INIpIodB99JRFlR+A==}
+ engines: {node: '>=20'}
+
+ '@shikijs/primitive@4.4.3':
+ resolution: {integrity: sha512-m0wBeLDQDeIxRdUmrCPdQqfuUamDwRL5isCfYbguKD6NiaKpVbsv+3J81DyIKgNW5h4WAIIr8T4EkgQrBBxvaQ==}
+ engines: {node: '>=20'}
+
+ '@shikijs/themes@4.4.3':
+ resolution: {integrity: sha512-w8UHjeUnIR965KMWJHUPXOc2mNJUnK3vpVLYLvw5IYU2mnTTJ89E24OrJDBNiJDQ0qzb0tc4l7mrIXx5cFeIyw==}
+ engines: {node: '>=20'}
+
+ '@shikijs/types@4.4.3':
+ resolution: {integrity: sha512-UEJxmRR++MAGR6hugn0vgVS2W/6lWAts84FFSrnlH9sP0LNol7E5+NQ792pH8liWUhyMyjhTgSUH3k7iD7tc5g==}
+ engines: {node: '>=20'}
+
+ '@shikijs/vscode-textmate@10.0.2':
+ resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==}
+
'@standard-schema/spec@1.1.0':
resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==}
+ '@tailwindcss/node@4.3.3':
+ resolution: {integrity: sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==}
+
+ '@tailwindcss/oxide-android-arm64@4.3.3':
+ resolution: {integrity: sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==}
+ engines: {node: '>= 20'}
+ cpu: [arm64]
+ os: [android]
+
+ '@tailwindcss/oxide-darwin-arm64@4.3.3':
+ resolution: {integrity: sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==}
+ engines: {node: '>= 20'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@tailwindcss/oxide-darwin-x64@4.3.3':
+ resolution: {integrity: sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==}
+ engines: {node: '>= 20'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@tailwindcss/oxide-freebsd-x64@4.3.3':
+ resolution: {integrity: sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==}
+ engines: {node: '>= 20'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3':
+ resolution: {integrity: sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==}
+ engines: {node: '>= 20'}
+ cpu: [arm]
+ os: [linux]
+
+ '@tailwindcss/oxide-linux-arm64-gnu@4.3.3':
+ resolution: {integrity: sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==}
+ engines: {node: '>= 20'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@tailwindcss/oxide-linux-arm64-musl@4.3.3':
+ resolution: {integrity: sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==}
+ engines: {node: '>= 20'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@tailwindcss/oxide-linux-x64-gnu@4.3.3':
+ resolution: {integrity: sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==}
+ engines: {node: '>= 20'}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@tailwindcss/oxide-linux-x64-musl@4.3.3':
+ resolution: {integrity: sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==}
+ engines: {node: '>= 20'}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@tailwindcss/oxide-wasm32-wasi@4.3.3':
+ resolution: {integrity: sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==}
+ engines: {node: '>=14.0.0'}
+ cpu: [wasm32]
+ bundledDependencies:
+ - '@napi-rs/wasm-runtime'
+ - '@emnapi/core'
+ - '@emnapi/runtime'
+ - '@tybys/wasm-util'
+ - '@emnapi/wasi-threads'
+ - tslib
+
+ '@tailwindcss/oxide-win32-arm64-msvc@4.3.3':
+ resolution: {integrity: sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==}
+ engines: {node: '>= 20'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@tailwindcss/oxide-win32-x64-msvc@4.3.3':
+ resolution: {integrity: sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==}
+ engines: {node: '>= 20'}
+ cpu: [x64]
+ os: [win32]
+
+ '@tailwindcss/oxide@4.3.3':
+ resolution: {integrity: sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==}
+ engines: {node: '>= 20'}
+
+ '@tailwindcss/vite@4.3.3':
+ resolution: {integrity: sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==}
+ peerDependencies:
+ vite: ^5.2.0 || ^6 || ^7 || ^8
+
'@turbo/darwin-64@2.10.12':
resolution: {integrity: sha512-9nKgKoF6ZOUsM+or0OtNf+TTJSfGvDNP7ZFv/ZGWVwOSCkumyctQiTeHwB4UNljHTnC41AqylgbunLDHoccNrA==}
cpu: [x64]
@@ -876,15 +1599,42 @@ packages:
cpu: [arm64]
os: [win32]
+ '@tybys/wasm-util@0.10.3':
+ resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==}
+
+ '@types/babel__core@7.20.5':
+ resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
+
+ '@types/babel__generator@7.27.0':
+ resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==}
+
+ '@types/babel__template@7.4.4':
+ resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==}
+
+ '@types/babel__traverse@7.28.0':
+ resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==}
+
'@types/chai@5.2.3':
resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==}
'@types/deep-eql@4.0.2':
resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==}
+ '@types/estree-jsx@1.0.5':
+ resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==}
+
'@types/estree@1.0.9':
resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==}
+ '@types/hast@3.0.5':
+ resolution: {integrity: sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==}
+
+ '@types/mdast@4.0.4':
+ resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==}
+
+ '@types/nlcst@2.0.3':
+ resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==}
+
'@types/node@24.13.3':
resolution: {integrity: sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==}
@@ -896,6 +1646,9 @@ packages:
'@types/react@19.2.18':
resolution: {integrity: sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==}
+ '@types/unist@3.0.3':
+ resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
+
'@typescript/typescript-aix-ppc64@7.0.2':
resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==}
engines: {node: '>=16.20.0'}
@@ -1016,6 +1769,15 @@ packages:
cpu: [x64]
os: [win32]
+ '@ungap/structured-clone@1.3.4':
+ resolution: {integrity: sha512-JL+CF0GeLHyPWI0rXu7UnxgiuOm9UQWzadi0OYOJNhNO2q6EZElpwlgXkNkfU1PzANDHq3YcwKVZprdvS+BrbQ==}
+
+ '@vitejs/plugin-react@5.2.0':
+ resolution: {integrity: sha512-YmKkfhOAi3wsB1PhJq5Scj3GXMn3WvtQ/JC0xoopuHoXSdmtdStOpFrYaT1kie2YgFBcIe64ROzMYRjCrYOdYw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ peerDependencies:
+ vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0
+
'@vitest/expect@4.1.11':
resolution: {integrity: sha512-VX2x5vNJXET47KAFzwERI+KRMtTTCSWTfSMKsW7JsUsXV4psq++e3DvZpuTDOpHcxytiDs6p2nhVb2tVDiiUYw==}
@@ -1055,13 +1817,62 @@ packages:
engines: {node: '>=0.4.0'}
hasBin: true
+ am-i-vibing@0.4.0:
+ resolution: {integrity: sha512-MxT4XZL7pzLHpuvhDKdMaQHMGGkJDLluKBLsbstn+8wv9sWcFT6h+0ve9qkml95amVTZtZV83gQe2hY+ojgHLg==}
+ hasBin: true
+
+ ansi-styles@4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+
any-promise@1.3.0:
resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
+ anymatch@3.1.3:
+ resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+ engines: {node: '>= 8'}
+
+ argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+
+ aria-query@5.3.2:
+ resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
+ engines: {node: '>= 0.4'}
+
assertion-error@2.0.1:
resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
engines: {node: '>=12'}
+ astro@7.2.7:
+ resolution: {integrity: sha512-+XW7Z1x03hq/zV8tiEnvS8E7JYKo5iyYVPJFt5RhEj3dOE+zSwhVaUabcqNsEDVJcneQX2mqxo4fPgoSO+Jc2w==}
+ engines: {node: '>=22.12.0', npm: '>=9.6.5', pnpm: '>=7.1.0'}
+ hasBin: true
+ peerDependencies:
+ '@astrojs/markdown-remark': 7.2.4
+ peerDependenciesMeta:
+ '@astrojs/markdown-remark':
+ optional: true
+
+ axobject-query@4.1.0:
+ resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==}
+ engines: {node: '>= 0.4'}
+
+ bail@2.0.2:
+ resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==}
+
+ baseline-browser-mapping@2.11.19:
+ resolution: {integrity: sha512-Grytf1xOxOEMTGRwx6rLGKkTabd4vMg3VrKdj/7joCmV0qgh4QwMMO6xh34YEXQqirAuUdgQGa5orJQQ+69RBw==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ boolbase@1.0.0:
+ resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
+
+ browserslist@4.28.8:
+ resolution: {integrity: sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+
bundle-require@5.1.0:
resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@@ -1076,18 +1887,68 @@ packages:
resolution: {integrity: sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==}
engines: {node: '>=20.19.0'}
+ caniuse-lite@1.0.30001810:
+ resolution: {integrity: sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==}
+
+ ccount@2.0.1:
+ resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
+
chai@6.2.2:
resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==}
engines: {node: '>=18'}
+ chalk@4.1.2:
+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+ engines: {node: '>=10'}
+
+ character-entities-html4@2.1.0:
+ resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==}
+
+ character-entities-legacy@3.0.0:
+ resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==}
+
chokidar@4.0.3:
resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
engines: {node: '>= 14.16.0'}
+ chokidar@5.0.0:
+ resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==}
+ engines: {node: '>= 20.19.0'}
+
+ ci-info@4.4.0:
+ resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==}
+ engines: {node: '>=8'}
+
+ clsx@2.1.1:
+ resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
+ engines: {node: '>=6'}
+
+ color-convert@2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+
+ color-name@1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+ comma-separated-tokens@2.0.3:
+ resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
+
+ commander@11.1.0:
+ resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==}
+ engines: {node: '>=16'}
+
+ commander@14.0.3:
+ resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==}
+ engines: {node: '>=20'}
+
commander@4.1.1:
resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
engines: {node: '>= 6'}
+ common-ancestor-path@2.0.0:
+ resolution: {integrity: sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng==}
+ engines: {node: '>= 18'}
+
confbox@0.1.8:
resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
@@ -1098,6 +1959,35 @@ packages:
convert-source-map@2.0.0:
resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+ cookie-es@1.2.3:
+ resolution: {integrity: sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==}
+
+ cookie@2.0.1:
+ resolution: {integrity: sha512-yuToqVvRrj6pfDXREyQAAv8SkAEk/8GS3jQRTiUMm66TVtBYmqQeoEjL2Lmq8Rpo6271vH76InTChTitEAm65w==}
+ engines: {node: '>=22'}
+
+ crossws@0.3.5:
+ resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==}
+
+ css-select@6.0.0:
+ resolution: {integrity: sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==}
+
+ css-tree@2.2.1:
+ resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==}
+ engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
+
+ css-tree@3.2.1:
+ resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==}
+ engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
+
+ css-what@7.0.0:
+ resolution: {integrity: sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==}
+ engines: {node: '>= 6'}
+
+ csso@5.0.5:
+ resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==}
+ engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
+
csstype@3.2.3:
resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
@@ -1110,10 +2000,58 @@ packages:
supports-color:
optional: true
+ defu@6.1.7:
+ resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==}
+
+ dequal@2.0.3:
+ resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
+ engines: {node: '>=6'}
+
+ destr@2.0.5:
+ resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==}
+
detect-libc@2.1.2:
resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
engines: {node: '>=8'}
+ devalue@5.9.1:
+ resolution: {integrity: sha512-+17vil3EVQRzvtDJSFuTWEb8XJRvXqAiV3qZyQWD398QeXUa6CxsUyMdD1fxzEhUrd4FojitFz7lhIHBTlV4fw==}
+
+ devlop@1.1.0:
+ resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==}
+
+ diff@9.0.0:
+ resolution: {integrity: sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==}
+ engines: {node: '>=0.3.1'}
+
+ dom-serializer@2.0.0:
+ resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
+
+ domelementtype@2.3.0:
+ resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
+
+ domhandler@5.0.3:
+ resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
+ engines: {node: '>= 4'}
+
+ domutils@3.2.2:
+ resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==}
+
+ dset@3.1.4:
+ resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==}
+ engines: {node: '>=4'}
+
+ electron-to-chromium@1.5.415:
+ resolution: {integrity: sha512-958V+Kbhtgz+SxXeEVKBjrlKRBIDAYvUJfwhjxMZ5S6ut9jAl7l9ZKBkBrvjyjZE36PabLUo2L8kEeV5O4vgJg==}
+
+ enhanced-resolve@5.24.5:
+ resolution: {integrity: sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==}
+ engines: {node: '>=10.13.0'}
+
+ entities@4.5.0:
+ resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
+ engines: {node: '>=0.12'}
+
es-module-lexer@2.3.2:
resolution: {integrity: sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==}
@@ -1122,13 +2060,28 @@ packages:
engines: {node: '>=18'}
hasBin: true
+ esbuild@0.28.2:
+ resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ escalade@3.2.0:
+ resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
+ engines: {node: '>=6'}
+
estree-walker@3.0.3:
resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
+ eventemitter3@5.0.4:
+ resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==}
+
expect-type@1.4.0:
resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==}
engines: {node: '>=12.0.0'}
+ extend@3.0.2:
+ resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
+
fast-string-truncated-width@3.0.3:
resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==}
@@ -1150,17 +2103,68 @@ packages:
fflate@0.8.3:
resolution: {integrity: sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==}
+ find-process@2.1.1:
+ resolution: {integrity: sha512-SrQDx3QhlmHM90iqn9rdjCQcw/T+WlpOkHFsjoRgB+zTpDfltNA1VSNYeYELwhUTJy12UFxqjWhmhOrJc+o4sA==}
+ hasBin: true
+
fix-dts-default-cjs-exports@1.0.1:
resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==}
flatted@3.4.4:
resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==}
+ flattie@1.1.1:
+ resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==}
+ engines: {node: '>=8'}
+
+ fontace@0.4.1:
+ resolution: {integrity: sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==}
+
+ fontkitten@1.0.3:
+ resolution: {integrity: sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==}
+ engines: {node: '>=20'}
+
fsevents@2.3.3:
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
os: [darwin]
+ gensync@1.0.0-beta.2:
+ resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
+ engines: {node: '>=6.9.0'}
+
+ get-tsconfig@5.0.0-beta.4:
+ resolution: {integrity: sha512-7nF7C9fIPFEMHgEMEfgIlO9wDdZ8CyHw27rWciFZfHvHDReIiPhsYuzPRXsfvBCqFy1l8RRyyWV7QLM+ZhUJsQ==}
+ engines: {node: '>=20.20.0'}
+
+ github-slugger@2.0.0:
+ resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==}
+
+ graceful-fs@4.2.11:
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
+ h3@1.15.11:
+ resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==}
+
+ has-flag@4.0.0:
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+ engines: {node: '>=8'}
+
+ hast-util-to-html@9.0.5:
+ resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==}
+
+ hast-util-whitespace@3.0.0:
+ resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==}
+
+ html-escaper@3.0.3:
+ resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==}
+
+ html-void-elements@3.0.0:
+ resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==}
+
+ http-cache-semantics@4.2.0:
+ resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==}
+
human-id@4.2.1:
resolution: {integrity: sha512-zPGsiS+dWoTZtZ4AtpA9Y+BdSFSNWvnouNlWNoUFyAM6xHOHmdCvqO3k8AIbdamCOv4gUFUVNPf6rJFfc4UiJw==}
hasBin: true
@@ -1168,6 +2172,22 @@ packages:
import-meta-resolve@4.2.0:
resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==}
+ iron-webcrypto@1.2.1:
+ resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==}
+
+ is-docker@4.0.0:
+ resolution: {integrity: sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA==}
+ engines: {node: '>=20'}
+ hasBin: true
+
+ is-plain-obj@4.1.0:
+ resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
+ engines: {node: '>=12'}
+
+ jiti@2.7.0:
+ resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==}
+ hasBin: true
+
jju@1.4.0:
resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==}
@@ -1175,48 +2195,109 @@ packages:
resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==}
engines: {node: '>=10'}
+ js-tokens@4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
+ js-yaml@4.3.1:
+ resolution: {integrity: sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==}
+ hasBin: true
+
+ jsesc@3.1.0:
+ resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ json5@2.2.3:
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+ engines: {node: '>=6'}
+ hasBin: true
+
jsonc-parser@3.3.1:
resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==}
launch-editor@2.14.1:
resolution: {integrity: sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA==}
+ lightningcss-android-arm64@1.32.0:
+ resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [android]
+
lightningcss-android-arm64@1.33.0:
resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [android]
+ lightningcss-darwin-arm64@1.32.0:
+ resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [darwin]
+
lightningcss-darwin-arm64@1.33.0:
resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [darwin]
+ lightningcss-darwin-x64@1.32.0:
+ resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [darwin]
+
lightningcss-darwin-x64@1.33.0:
resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [darwin]
+ lightningcss-freebsd-x64@1.32.0:
+ resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [freebsd]
+
lightningcss-freebsd-x64@1.33.0:
resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [freebsd]
+ lightningcss-linux-arm-gnueabihf@1.32.0:
+ resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm]
+ os: [linux]
+
lightningcss-linux-arm-gnueabihf@1.33.0:
resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==}
engines: {node: '>= 12.0.0'}
cpu: [arm]
os: [linux]
- lightningcss-linux-arm64-gnu@1.33.0:
- resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==}
+ lightningcss-linux-arm64-gnu@1.32.0:
+ resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ lightningcss-linux-arm64-gnu@1.33.0:
+ resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ lightningcss-linux-arm64-musl@1.32.0:
+ resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [linux]
- libc: [glibc]
+ libc: [musl]
lightningcss-linux-arm64-musl@1.33.0:
resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==}
@@ -1225,6 +2306,13 @@ packages:
os: [linux]
libc: [musl]
+ lightningcss-linux-x64-gnu@1.32.0:
+ resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
lightningcss-linux-x64-gnu@1.33.0:
resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==}
engines: {node: '>= 12.0.0'}
@@ -1232,6 +2320,13 @@ packages:
os: [linux]
libc: [glibc]
+ lightningcss-linux-x64-musl@1.32.0:
+ resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
lightningcss-linux-x64-musl@1.33.0:
resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==}
engines: {node: '>= 12.0.0'}
@@ -1239,18 +2334,34 @@ packages:
os: [linux]
libc: [musl]
+ lightningcss-win32-arm64-msvc@1.32.0:
+ resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [win32]
+
lightningcss-win32-arm64-msvc@1.33.0:
resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [win32]
+ lightningcss-win32-x64-msvc@1.32.0:
+ resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [win32]
+
lightningcss-win32-x64-msvc@1.33.0:
resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [win32]
+ lightningcss@1.32.0:
+ resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==}
+ engines: {node: '>= 12.0.0'}
+
lightningcss@1.33.0:
resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==}
engines: {node: '>= 12.0.0'}
@@ -1266,9 +2377,50 @@ packages:
resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ loglevel@1.9.2:
+ resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==}
+ engines: {node: '>= 0.6.0'}
+
+ lru-cache@11.5.2:
+ resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==}
+ engines: {node: 20 || >=22}
+
+ lru-cache@5.1.1:
+ resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+
magic-string@0.30.21:
resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
+ magic-string@1.2.3:
+ resolution: {integrity: sha512-Bpb0W2TbLKOZ7vJnOUnVRGq3WL2p+ISV29M6hYPL1AFCpyKZpdr5ytiXoTSSxRVhg8YW7f65+6gbG8WG6PCa/g==}
+
+ magicast@0.5.4:
+ resolution: {integrity: sha512-llBEhWm1SacoRwgHUoQJYtwp4PBLF4faQi5TCpIGyGs9n4y5+juI0tDgyKIfpqxckRHaHzouUEph3THklWh03w==}
+
+ mdast-util-to-hast@13.2.1:
+ resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==}
+
+ mdn-data@2.0.28:
+ resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==}
+
+ mdn-data@2.27.1:
+ resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==}
+
+ micromark-util-character@2.1.1:
+ resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==}
+
+ micromark-util-encode@2.0.1:
+ resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==}
+
+ micromark-util-sanitize-uri@2.0.1:
+ resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==}
+
+ micromark-util-symbol@2.0.1:
+ resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==}
+
+ micromark-util-types@2.0.2:
+ resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==}
+
mlly@1.8.2:
resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==}
@@ -1287,6 +2439,30 @@ packages:
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
+ neotraverse@1.0.1:
+ resolution: {integrity: sha512-WmmLty1YWwJl9yZi77v2dVIV6X2kuYV8YYBI/G3LWGKdGHmHUvL1z7FW0iDvEvGAwNEoc5x1tOOOyDnf5jJw/w==}
+ engines: {node: '>= 10'}
+
+ nlcst-to-string@4.0.0:
+ resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==}
+
+ node-fetch-native@1.6.7:
+ resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==}
+
+ node-mock-http@1.0.5:
+ resolution: {integrity: sha512-KQyt/wLjG3TAc7DOUhpqWzgd4ERxR80JOlTK5VE5R1S12IaPVN5qkj4klBce9HPG1Njuup4Sb5bljaT34lIyjw==}
+
+ node-releases@2.0.53:
+ resolution: {integrity: sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==}
+ engines: {node: '>=18'}
+
+ normalize-path@3.0.0:
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+ engines: {node: '>=0.10.0'}
+
+ nth-check@2.1.1:
+ resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
+
object-assign@4.1.1:
resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
engines: {node: '>=0.10.0'}
@@ -1295,6 +2471,18 @@ packages:
resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==}
engines: {node: '>=12.20.0'}
+ ofetch@1.5.1:
+ resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==}
+
+ ohash@2.0.12:
+ resolution: {integrity: sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw==}
+
+ oniguruma-parser@0.12.2:
+ resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==}
+
+ oniguruma-to-es@4.3.6:
+ resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==}
+
oxfmt@0.65.0:
resolution: {integrity: sha512-SgS5VgnP42T0zl3zWD+xoH8FCqg1SAFnSRoOT/qeoa6gxcYIqrDMOmcXIg/EWSN92Du4ogB4riuKhKd6Y4CGhw==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -1325,15 +2513,34 @@ packages:
vite-plus:
optional: true
+ p-limit@7.3.1:
+ resolution: {integrity: sha512-0trZaiG7Y7kN/Egy9a8j47t9osC0Tch4PaIWd9yGF6bvmlk7muExRvGNYb8sXBwEKMoNKsbNN9P8EefuQekE4Q==}
+ engines: {node: '>=20'}
+
+ p-queue@9.3.3:
+ resolution: {integrity: sha512-NXAOdnEe5FsZJfT4oK84lE1Y5cFFdWlRuOo5tww8DyNMxyRXwn39fIkUtNLKppcPC+UYU/bXujNCUGDv01y7CA==}
+ engines: {node: '>=20'}
+
+ p-timeout@7.0.1:
+ resolution: {integrity: sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==}
+ engines: {node: '>=20'}
+
package-manager-detector@1.8.0:
resolution: {integrity: sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==}
pathe@2.0.3:
resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
+ piccolore@0.1.3:
+ resolution: {integrity: sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==}
+
picocolors@1.1.1:
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+ picomatch@2.3.2:
+ resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==}
+ engines: {node: '>=8.6'}
+
picomatch@4.0.7:
resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==}
engines: {node: '>=12'}
@@ -1367,11 +2574,29 @@ packages:
resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==}
engines: {node: ^10 || ^12 || >=14}
+ prismjs@1.30.0:
+ resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==}
+ engines: {node: '>=6'}
+
+ process-ancestry@0.1.0:
+ resolution: {integrity: sha512-tGqJW/UnclpYASFcM6Xh8D8l/BMtaQ9+CSG0vlJSJTcdMM4lDRv4c6H0Pdcsfted+bVczdYSfk2fdukg2gQkZg==}
+ engines: {node: '>=18.0.0'}
+
+ property-information@7.2.0:
+ resolution: {integrity: sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==}
+
+ radix3@1.1.2:
+ resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==}
+
react-dom@19.2.8:
resolution: {integrity: sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==}
peerDependencies:
react: ^19.2.8
+ react-refresh@0.18.0:
+ resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==}
+ engines: {node: '>=0.10.0'}
+
react@19.2.8:
resolution: {integrity: sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==}
engines: {node: '>=0.10.0'}
@@ -1380,10 +2605,29 @@ packages:
resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
engines: {node: '>= 14.18.0'}
+ readdirp@5.1.1:
+ resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==}
+ engines: {node: '>= 20.19.0'}
+
+ regex-recursion@6.0.2:
+ resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==}
+
+ regex-utilities@2.3.0:
+ resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==}
+
+ regex@6.1.0:
+ resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==}
+
resolve-from@5.0.0:
resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
engines: {node: '>=8'}
+ resolve-pkg-maps@1.0.0:
+ resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
+
+ retext-smartypants@6.2.0:
+ resolution: {integrity: sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==}
+
rolldown@1.2.5:
resolution: {integrity: sha512-VD2IE5PUG4Oj8zz2VGykiYd5wbnjdIiSsNQb8Qu5B+noEp+A78mu2iVvpp27g8es14Tk9rofNs5Tku9iQCS4fA==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -1394,18 +2638,37 @@ packages:
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
+ satteri@0.10.5:
+ resolution: {integrity: sha512-Ao1LKpAEa9Wdg0otgbVKViZHEq9ebdXe4DMrp3s9vQAU0HNIuHnFEuMuOcm0ZIXyV0Yzxj91NvhLpvXZJO/5ZQ==}
+
+ sax@1.6.1:
+ resolution: {integrity: sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==}
+ engines: {node: '>=11.0.0'}
+
scheduler@0.27.0:
resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==}
+ semver@6.3.1:
+ resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+ hasBin: true
+
semver@7.8.5:
resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==}
engines: {node: '>=10'}
hasBin: true
+ sharp@0.34.5:
+ resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+
shell-quote@1.10.0:
resolution: {integrity: sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==}
engines: {node: '>= 0.4'}
+ shiki@4.4.3:
+ resolution: {integrity: sha512-Mb/GvXPHBAXdgGIcnfU5L3ldpn1XcxrGkPHwqgRx17/I2XRfqlFKk2vGkHWINn1kdXvzJZeuO3is6I9KLPFm0g==}
+ engines: {node: '>=20'}
+
siginfo@2.0.0:
resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
@@ -1416,6 +2679,10 @@ packages:
sisteransi@1.0.5:
resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
+ smol-toml@1.8.0:
+ resolution: {integrity: sha512-kCZr2V3ch9i00x8zXRhjUNVcjG9ijES5dDudkXvUVCT5QlJNQWElSJdZqyPemffHoLNUYwOcou0Fy+ojN0uHSQ==}
+ engines: {node: '>= 18'}
+
source-map-js@1.2.1:
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
engines: {node: '>=0.10.0'}
@@ -1424,17 +2691,39 @@ packages:
resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==}
engines: {node: '>= 12'}
+ space-separated-tokens@2.0.2:
+ resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==}
+
stackback@0.0.2:
resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
std-env@4.2.0:
resolution: {integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==}
+ stringify-entities@4.0.4:
+ resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==}
+
sucrase@3.35.1:
resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==}
engines: {node: '>=16 || 14 >=14.17'}
hasBin: true
+ supports-color@7.2.0:
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+ engines: {node: '>=8'}
+
+ svgo@4.1.0:
+ resolution: {integrity: sha512-bkxnTg1kSU0guhIBmibA6UUhrQmPVA1XsQLN+ylCd+UWzbnLkySOcXpyk1mrl05f+pcaCx2eHb+sp6BgMZWX+Q==}
+ engines: {node: '>=16'}
+ hasBin: true
+
+ tailwindcss@4.3.3:
+ resolution: {integrity: sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==}
+
+ tapable@2.3.3:
+ resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==}
+ engines: {node: '>=6'}
+
thenify-all@1.6.0:
resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
engines: {node: '>=0.8'}
@@ -1442,9 +2731,16 @@ packages:
thenify@3.3.1:
resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
+ tiny-inflate@1.0.3:
+ resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==}
+
tinybench@2.9.0:
resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
+ tinyclip@0.1.15:
+ resolution: {integrity: sha512-uo33abH+Ays0xYaDysoBt494Hb3hsEczMpcC0MwFl773pazORx4fmvKhclhR1wonUbB6vvpRsvVMwnhfqeMc+A==}
+ engines: {node: ^16.14.0 || >= 17.3.0}
+
tinyexec@0.3.2:
resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==}
@@ -1472,9 +2768,18 @@ packages:
resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==}
hasBin: true
+ trim-lines@3.0.1:
+ resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
+
+ trough@2.2.0:
+ resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==}
+
ts-interface-checker@0.1.13:
resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
+ tslib@2.8.1:
+ resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
tsup@8.5.1:
resolution: {integrity: sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==}
engines: {node: '>=18'}
@@ -1506,9 +2811,114 @@ packages:
ufo@1.6.4:
resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==}
+ ultrahtml@1.7.0:
+ resolution: {integrity: sha512-2xRd0VHoAQE4M+vF/DvFFB7pUV0ZxTW1TLi7lHQWnF/Sb5TPeEUV/l+hxcNnGO00ZXGnR0voCMmYRKQf+rvJ2g==}
+
+ uncrypto@0.1.3:
+ resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==}
+
undici-types@7.18.2:
resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==}
+ undici@8.10.0:
+ resolution: {integrity: sha512-HvltHd7avK13QIw/oLe4qoOLyoVSoafqJ2jYOrtMRBkbYT31eiBQ8O0ehRKZiEZCMEyLFQNIADpgCWC5fALvYQ==}
+ engines: {node: '>=22.19.0'}
+
+ unified@11.0.5:
+ resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==}
+
+ unifont@0.7.5:
+ resolution: {integrity: sha512-ULe/Cs+ZIsq+dcFofNkhqielCrUJnb5mr+Yc4EBM2VlL+6OZR6+cjtI2mT1bJvRBrVncqHAbLURxmPLcCXzWMg==}
+
+ unist-util-is@6.0.1:
+ resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==}
+
+ unist-util-position@5.0.0:
+ resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==}
+
+ unist-util-stringify-position@4.0.0:
+ resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==}
+
+ unist-util-visit-parents@6.0.2:
+ resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==}
+
+ unist-util-visit@5.1.0:
+ resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==}
+
+ unstorage@1.17.5:
+ resolution: {integrity: sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==}
+ peerDependencies:
+ '@azure/app-configuration': ^1.8.0
+ '@azure/cosmos': ^4.2.0
+ '@azure/data-tables': ^13.3.0
+ '@azure/identity': ^4.6.0
+ '@azure/keyvault-secrets': ^4.9.0
+ '@azure/storage-blob': ^12.26.0
+ '@capacitor/preferences': ^6 || ^7 || ^8
+ '@deno/kv': '>=0.9.0'
+ '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0
+ '@planetscale/database': ^1.19.0
+ '@upstash/redis': ^1.34.3
+ '@vercel/blob': '>=0.27.1'
+ '@vercel/functions': ^2.2.12 || ^3.0.0
+ '@vercel/kv': ^1 || ^2 || ^3
+ aws4fetch: ^1.0.20
+ db0: '>=0.2.1'
+ idb-keyval: ^6.2.1
+ ioredis: ^5.4.2
+ uploadthing: ^7.4.4
+ peerDependenciesMeta:
+ '@azure/app-configuration':
+ optional: true
+ '@azure/cosmos':
+ optional: true
+ '@azure/data-tables':
+ optional: true
+ '@azure/identity':
+ optional: true
+ '@azure/keyvault-secrets':
+ optional: true
+ '@azure/storage-blob':
+ optional: true
+ '@capacitor/preferences':
+ optional: true
+ '@deno/kv':
+ optional: true
+ '@netlify/blobs':
+ optional: true
+ '@planetscale/database':
+ optional: true
+ '@upstash/redis':
+ optional: true
+ '@vercel/blob':
+ optional: true
+ '@vercel/functions':
+ optional: true
+ '@vercel/kv':
+ optional: true
+ aws4fetch:
+ optional: true
+ db0:
+ optional: true
+ idb-keyval:
+ optional: true
+ ioredis:
+ optional: true
+ uploadthing:
+ optional: true
+
+ update-browserslist-db@1.3.1:
+ resolution: {integrity: sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+
+ vfile-message@4.0.3:
+ resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==}
+
+ vfile@6.0.3:
+ resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
+
vite@8.2.2:
resolution: {integrity: sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -1552,6 +2962,14 @@ packages:
yaml:
optional: true
+ vitefu@1.1.3:
+ resolution: {integrity: sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==}
+ peerDependencies:
+ vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0
+ peerDependenciesMeta:
+ vite:
+ optional: true
+
vitest@4.1.11:
resolution: {integrity: sha512-fhACrNXUidIbGSBr5FlbuBkO7VWC1ZyLl0DO4CU2DrQoAPxX84Ysxs+HeGQpii5lZWV1Q4gBZTTu49mF+A6Edw==}
engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0}
@@ -1593,17 +3011,293 @@ packages:
jsdom:
optional: true
- why-is-node-running@2.3.0:
- resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==}
- engines: {node: '>=8'}
- hasBin: true
+ why-is-node-running@2.3.0:
+ resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==}
+ engines: {node: '>=8'}
+ hasBin: true
+
+ xxhash-wasm@1.1.0:
+ resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==}
+
+ yallist@3.1.1:
+ resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+
+ yaml@2.9.0:
+ resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==}
+ engines: {node: '>= 14.6'}
+ hasBin: true
+
+ yargs-parser@22.0.0:
+ resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==}
+ engines: {node: ^20.19.0 || ^22.12.0 || >=23}
+
+ yocto-queue@1.2.2:
+ resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==}
+ engines: {node: '>=12.20'}
+
+ zod@4.4.3:
+ resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==}
+
+ zwitch@2.0.4:
+ resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
+
+snapshots:
+
+ '@astrojs/compiler-binding-darwin-arm64@0.4.0':
+ optional: true
+
+ '@astrojs/compiler-binding-darwin-x64@0.4.0':
+ optional: true
+
+ '@astrojs/compiler-binding-linux-arm64-gnu@0.4.0':
+ optional: true
+
+ '@astrojs/compiler-binding-linux-arm64-musl@0.4.0':
+ optional: true
+
+ '@astrojs/compiler-binding-linux-x64-gnu@0.4.0':
+ optional: true
+
+ '@astrojs/compiler-binding-linux-x64-musl@0.4.0':
+ optional: true
+
+ '@astrojs/compiler-binding-wasm32-wasi@0.4.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)':
+ dependencies:
+ '@napi-rs/wasm-runtime': 1.2.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)
+ transitivePeerDependencies:
+ - '@emnapi/core'
+ - '@emnapi/runtime'
+ optional: true
+
+ '@astrojs/compiler-binding-win32-arm64-msvc@0.4.0':
+ optional: true
+
+ '@astrojs/compiler-binding-win32-x64-msvc@0.4.0':
+ optional: true
+
+ '@astrojs/compiler-binding@0.4.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)':
+ optionalDependencies:
+ '@astrojs/compiler-binding-darwin-arm64': 0.4.0
+ '@astrojs/compiler-binding-darwin-x64': 0.4.0
+ '@astrojs/compiler-binding-linux-arm64-gnu': 0.4.0
+ '@astrojs/compiler-binding-linux-arm64-musl': 0.4.0
+ '@astrojs/compiler-binding-linux-x64-gnu': 0.4.0
+ '@astrojs/compiler-binding-linux-x64-musl': 0.4.0
+ '@astrojs/compiler-binding-wasm32-wasi': 0.4.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)
+ '@astrojs/compiler-binding-win32-arm64-msvc': 0.4.0
+ '@astrojs/compiler-binding-win32-x64-msvc': 0.4.0
+ transitivePeerDependencies:
+ - '@emnapi/core'
+ - '@emnapi/runtime'
+
+ '@astrojs/compiler-rs@0.4.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)':
+ dependencies:
+ '@astrojs/compiler-binding': 0.4.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)
+ transitivePeerDependencies:
+ - '@emnapi/core'
+ - '@emnapi/runtime'
+
+ '@astrojs/internal-helpers@0.10.4':
+ dependencies:
+ '@types/hast': 3.0.5
+ '@types/mdast': 4.0.4
+ js-yaml: 4.3.1
+ picomatch: 4.0.7
+ retext-smartypants: 6.2.0
+ shiki: 4.4.3
+ smol-toml: 1.8.0
+ unified: 11.0.5
+
+ '@astrojs/markdown-satteri@0.3.8':
+ dependencies:
+ '@astrojs/internal-helpers': 0.10.4
+ '@astrojs/prism': 4.0.2
+ github-slugger: 2.0.0
+ satteri: 0.10.5
+
+ '@astrojs/prism@4.0.2':
+ dependencies:
+ prismjs: 1.30.0
+
+ '@astrojs/react@6.0.4(@types/node@24.13.3)(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(esbuild@0.28.2)(jiti@2.7.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(yaml@2.9.0)':
+ dependencies:
+ '@astrojs/internal-helpers': 0.10.4
+ '@types/react': 19.2.18
+ '@types/react-dom': 19.2.5(@types/react@19.2.18)
+ '@vitejs/plugin-react': 5.2.0(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))
+ devalue: 5.9.1
+ react: 19.2.8
+ react-dom: 19.2.8(react@19.2.8)
+ ultrahtml: 1.7.0
+ vite: 8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)
+ transitivePeerDependencies:
+ - '@types/node'
+ - '@vitejs/devtools'
+ - esbuild
+ - jiti
+ - less
+ - sass
+ - sass-embedded
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+ - tsx
+ - yaml
+
+ '@astrojs/telemetry@3.3.3':
+ dependencies:
+ ci-info: 4.4.0
+ dset: 3.1.4
+ is-docker: 4.0.0
+ package-manager-detector: 1.8.0
+
+ '@babel/code-frame@7.29.7':
+ dependencies:
+ '@babel/helper-validator-identifier': 7.29.7
+ js-tokens: 4.0.0
+ picocolors: 1.1.1
+
+ '@babel/compat-data@7.29.7': {}
+
+ '@babel/core@7.29.7':
+ dependencies:
+ '@babel/code-frame': 7.29.7
+ '@babel/generator': 7.29.8
+ '@babel/helper-compilation-targets': 7.29.7
+ '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7)
+ '@babel/helpers': 7.29.7
+ '@babel/parser': 7.29.8
+ '@babel/template': 7.29.7
+ '@babel/traverse': 7.29.8
+ '@babel/types': 7.29.8
+ '@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.29.8':
+ dependencies:
+ '@babel/parser': 7.29.8
+ '@babel/types': 7.29.8
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+ jsesc: 3.1.0
+
+ '@babel/helper-compilation-targets@7.29.7':
+ dependencies:
+ '@babel/compat-data': 7.29.7
+ '@babel/helper-validator-option': 7.29.7
+ browserslist: 4.28.8
+ lru-cache: 5.1.1
+ semver: 6.3.1
+
+ '@babel/helper-globals@7.29.7': {}
+
+ '@babel/helper-module-imports@7.29.7':
+ dependencies:
+ '@babel/traverse': 7.29.8
+ '@babel/types': 7.29.8
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)':
+ dependencies:
+ '@babel/core': 7.29.7
+ '@babel/helper-module-imports': 7.29.7
+ '@babel/helper-validator-identifier': 7.29.7
+ '@babel/traverse': 7.29.8
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-plugin-utils@7.29.7': {}
+
+ '@babel/helper-string-parser@7.29.7': {}
+
+ '@babel/helper-validator-identifier@7.29.7': {}
+
+ '@babel/helper-validator-option@7.29.7': {}
+
+ '@babel/helpers@7.29.7':
+ dependencies:
+ '@babel/template': 7.29.7
+ '@babel/types': 7.29.8
+
+ '@babel/parser@7.29.8':
+ dependencies:
+ '@babel/types': 7.29.8
+
+ '@babel/plugin-transform-react-jsx-self@7.29.7(@babel/core@7.29.7)':
+ dependencies:
+ '@babel/core': 7.29.7
+ '@babel/helper-plugin-utils': 7.29.7
+
+ '@babel/plugin-transform-react-jsx-source@7.29.7(@babel/core@7.29.7)':
+ dependencies:
+ '@babel/core': 7.29.7
+ '@babel/helper-plugin-utils': 7.29.7
+
+ '@babel/template@7.29.7':
+ dependencies:
+ '@babel/code-frame': 7.29.7
+ '@babel/parser': 7.29.8
+ '@babel/types': 7.29.8
+
+ '@babel/traverse@7.29.8':
+ dependencies:
+ '@babel/code-frame': 7.29.7
+ '@babel/generator': 7.29.8
+ '@babel/helper-globals': 7.29.7
+ '@babel/parser': 7.29.8
+ '@babel/template': 7.29.7
+ '@babel/types': 7.29.8
+ debug: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/types@7.29.8':
+ dependencies:
+ '@babel/helper-string-parser': 7.29.7
+ '@babel/helper-validator-identifier': 7.29.7
+
+ '@bruits/satteri-darwin-arm64@0.10.5':
+ optional: true
+
+ '@bruits/satteri-darwin-x64@0.10.5':
+ optional: true
+
+ '@bruits/satteri-linux-arm64-gnu@0.10.5':
+ optional: true
+
+ '@bruits/satteri-linux-arm64-musl@0.10.5':
+ optional: true
+
+ '@bruits/satteri-linux-x64-gnu@0.10.5':
+ optional: true
+
+ '@bruits/satteri-linux-x64-musl@0.10.5':
+ optional: true
+
+ '@bruits/satteri-wasm32-wasi@0.10.5':
+ dependencies:
+ '@emnapi/core': 1.11.1
+ '@emnapi/runtime': 1.11.1
+ '@napi-rs/wasm-runtime': 1.2.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)
+ optional: true
+
+ '@bruits/satteri-win32-arm64-msvc@0.10.5':
+ optional: true
- yaml@2.9.0:
- resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==}
- engines: {node: '>= 14.6'}
- hasBin: true
+ '@bruits/satteri-win32-x64-msvc@0.10.5':
+ optional: true
-snapshots:
+ '@capsizecss/unpack@4.0.1':
+ dependencies:
+ fontkitten: 1.0.3
'@changesets/apply-release-plan@8.0.0':
dependencies:
@@ -1721,89 +3415,290 @@ snapshots:
fast-wrap-ansi: 0.2.2
sisteransi: 1.0.5
+ '@emnapi/core@1.11.1':
+ dependencies:
+ '@emnapi/wasi-threads': 1.2.2
+ tslib: 2.8.1
+ optional: true
+
+ '@emnapi/runtime@1.11.1':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
+ '@emnapi/runtime@1.11.3':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
+ '@emnapi/wasi-threads@1.2.2':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
'@esbuild/aix-ppc64@0.27.7':
optional: true
+ '@esbuild/aix-ppc64@0.28.2':
+ optional: true
+
'@esbuild/android-arm64@0.27.7':
optional: true
+ '@esbuild/android-arm64@0.28.2':
+ optional: true
+
'@esbuild/android-arm@0.27.7':
optional: true
+ '@esbuild/android-arm@0.28.2':
+ optional: true
+
'@esbuild/android-x64@0.27.7':
optional: true
+ '@esbuild/android-x64@0.28.2':
+ optional: true
+
'@esbuild/darwin-arm64@0.27.7':
optional: true
+ '@esbuild/darwin-arm64@0.28.2':
+ optional: true
+
'@esbuild/darwin-x64@0.27.7':
optional: true
+ '@esbuild/darwin-x64@0.28.2':
+ optional: true
+
'@esbuild/freebsd-arm64@0.27.7':
optional: true
+ '@esbuild/freebsd-arm64@0.28.2':
+ optional: true
+
'@esbuild/freebsd-x64@0.27.7':
optional: true
+ '@esbuild/freebsd-x64@0.28.2':
+ optional: true
+
'@esbuild/linux-arm64@0.27.7':
optional: true
+ '@esbuild/linux-arm64@0.28.2':
+ optional: true
+
'@esbuild/linux-arm@0.27.7':
optional: true
+ '@esbuild/linux-arm@0.28.2':
+ optional: true
+
'@esbuild/linux-ia32@0.27.7':
optional: true
+ '@esbuild/linux-ia32@0.28.2':
+ optional: true
+
'@esbuild/linux-loong64@0.27.7':
optional: true
+ '@esbuild/linux-loong64@0.28.2':
+ optional: true
+
'@esbuild/linux-mips64el@0.27.7':
optional: true
+ '@esbuild/linux-mips64el@0.28.2':
+ optional: true
+
'@esbuild/linux-ppc64@0.27.7':
optional: true
+ '@esbuild/linux-ppc64@0.28.2':
+ optional: true
+
'@esbuild/linux-riscv64@0.27.7':
optional: true
+ '@esbuild/linux-riscv64@0.28.2':
+ optional: true
+
'@esbuild/linux-s390x@0.27.7':
optional: true
+ '@esbuild/linux-s390x@0.28.2':
+ optional: true
+
'@esbuild/linux-x64@0.27.7':
optional: true
+ '@esbuild/linux-x64@0.28.2':
+ optional: true
+
'@esbuild/netbsd-arm64@0.27.7':
optional: true
+ '@esbuild/netbsd-arm64@0.28.2':
+ optional: true
+
'@esbuild/netbsd-x64@0.27.7':
optional: true
+ '@esbuild/netbsd-x64@0.28.2':
+ optional: true
+
'@esbuild/openbsd-arm64@0.27.7':
optional: true
+ '@esbuild/openbsd-arm64@0.28.2':
+ optional: true
+
'@esbuild/openbsd-x64@0.27.7':
optional: true
+ '@esbuild/openbsd-x64@0.28.2':
+ optional: true
+
'@esbuild/openharmony-arm64@0.27.7':
optional: true
+ '@esbuild/openharmony-arm64@0.28.2':
+ optional: true
+
'@esbuild/sunos-x64@0.27.7':
optional: true
+ '@esbuild/sunos-x64@0.28.2':
+ optional: true
+
'@esbuild/win32-arm64@0.27.7':
optional: true
+ '@esbuild/win32-arm64@0.28.2':
+ optional: true
+
'@esbuild/win32-ia32@0.27.7':
optional: true
+ '@esbuild/win32-ia32@0.28.2':
+ optional: true
+
'@esbuild/win32-x64@0.27.7':
optional: true
+ '@esbuild/win32-x64@0.28.2':
+ optional: true
+
+ '@img/colour@1.1.0':
+ optional: true
+
+ '@img/sharp-darwin-arm64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-arm64': 1.2.4
+ optional: true
+
+ '@img/sharp-darwin-x64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-x64': 1.2.4
+ optional: true
+
+ '@img/sharp-libvips-darwin-arm64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-darwin-x64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-arm64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-arm@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-ppc64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-riscv64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-s390x@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-x64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linuxmusl-arm64@1.2.4':
+ optional: true
+
+ '@img/sharp-libvips-linuxmusl-x64@1.2.4':
+ optional: true
+
+ '@img/sharp-linux-arm64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm64': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-arm@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-ppc64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-ppc64': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-riscv64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-riscv64': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-s390x@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-s390x': 1.2.4
+ optional: true
+
+ '@img/sharp-linux-x64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-x64': 1.2.4
+ optional: true
+
+ '@img/sharp-linuxmusl-arm64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-arm64': 1.2.4
+ optional: true
+
+ '@img/sharp-linuxmusl-x64@0.34.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-x64': 1.2.4
+ optional: true
+
+ '@img/sharp-wasm32@0.34.5':
+ dependencies:
+ '@emnapi/runtime': 1.11.3
+ optional: true
+
+ '@img/sharp-win32-arm64@0.34.5':
+ optional: true
+
+ '@img/sharp-win32-ia32@0.34.5':
+ optional: true
+
+ '@img/sharp-win32-x64@0.34.5':
+ optional: true
+
'@jridgewell/gen-mapping@0.3.13':
dependencies:
'@jridgewell/sourcemap-codec': 1.5.5
'@jridgewell/trace-mapping': 0.3.31
+ '@jridgewell/remapping@2.3.5':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+
'@jridgewell/resolve-uri@3.1.2': {}
'@jridgewell/sourcemap-codec@1.5.5': {}
@@ -1831,6 +3726,22 @@ snapshots:
'@napi-rs/lzma-linux-x64-gnu@1.5.1':
optional: true
+ '@napi-rs/wasm-runtime@1.2.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)':
+ dependencies:
+ '@emnapi/core': 1.11.1
+ '@emnapi/runtime': 1.11.1
+ '@tybys/wasm-util': 0.10.3
+ optional: true
+
+ '@napi-rs/wasm-runtime@1.2.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)':
+ dependencies:
+ '@emnapi/core': 1.11.1
+ '@emnapi/runtime': 1.11.3
+ '@tybys/wasm-util': 0.10.3
+ optional: true
+
+ '@oslojs/encoding@1.1.0': {}
+
'@oxc-project/types@0.146.0': {}
'@oxfmt/binding-android-arm-eabi@0.65.0':
@@ -2014,6 +3925,8 @@ snapshots:
'@rolldown/binding-win32-x64-msvc@1.2.5':
optional: true
+ '@rolldown/pluginutils@1.0.0-rc.3': {}
+
'@rolldown/pluginutils@1.0.1': {}
'@rollup/rollup-android-arm-eabi@4.63.0':
@@ -2091,8 +4004,116 @@ snapshots:
'@rollup/rollup-win32-x64-msvc@4.63.0':
optional: true
+ '@shikijs/core@4.4.3':
+ dependencies:
+ '@shikijs/primitive': 4.4.3
+ '@shikijs/types': 4.4.3
+ '@shikijs/vscode-textmate': 10.0.2
+ '@types/hast': 3.0.5
+ hast-util-to-html: 9.0.5
+
+ '@shikijs/engine-javascript@4.4.3':
+ dependencies:
+ '@shikijs/types': 4.4.3
+ '@shikijs/vscode-textmate': 10.0.2
+ oniguruma-to-es: 4.3.6
+
+ '@shikijs/engine-oniguruma@4.4.3':
+ dependencies:
+ '@shikijs/types': 4.4.3
+ '@shikijs/vscode-textmate': 10.0.2
+
+ '@shikijs/langs@4.4.3':
+ dependencies:
+ '@shikijs/types': 4.4.3
+
+ '@shikijs/primitive@4.4.3':
+ dependencies:
+ '@shikijs/types': 4.4.3
+ '@shikijs/vscode-textmate': 10.0.2
+ '@types/hast': 3.0.5
+
+ '@shikijs/themes@4.4.3':
+ dependencies:
+ '@shikijs/types': 4.4.3
+
+ '@shikijs/types@4.4.3':
+ dependencies:
+ '@shikijs/vscode-textmate': 10.0.2
+ '@types/hast': 3.0.5
+
+ '@shikijs/vscode-textmate@10.0.2': {}
+
'@standard-schema/spec@1.1.0': {}
+ '@tailwindcss/node@4.3.3':
+ dependencies:
+ '@jridgewell/remapping': 2.3.5
+ enhanced-resolve: 5.24.5
+ jiti: 2.7.0
+ lightningcss: 1.32.0
+ magic-string: 0.30.21
+ source-map-js: 1.2.1
+ tailwindcss: 4.3.3
+
+ '@tailwindcss/oxide-android-arm64@4.3.3':
+ optional: true
+
+ '@tailwindcss/oxide-darwin-arm64@4.3.3':
+ optional: true
+
+ '@tailwindcss/oxide-darwin-x64@4.3.3':
+ optional: true
+
+ '@tailwindcss/oxide-freebsd-x64@4.3.3':
+ optional: true
+
+ '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3':
+ optional: true
+
+ '@tailwindcss/oxide-linux-arm64-gnu@4.3.3':
+ optional: true
+
+ '@tailwindcss/oxide-linux-arm64-musl@4.3.3':
+ optional: true
+
+ '@tailwindcss/oxide-linux-x64-gnu@4.3.3':
+ optional: true
+
+ '@tailwindcss/oxide-linux-x64-musl@4.3.3':
+ optional: true
+
+ '@tailwindcss/oxide-wasm32-wasi@4.3.3':
+ optional: true
+
+ '@tailwindcss/oxide-win32-arm64-msvc@4.3.3':
+ optional: true
+
+ '@tailwindcss/oxide-win32-x64-msvc@4.3.3':
+ optional: true
+
+ '@tailwindcss/oxide@4.3.3':
+ optionalDependencies:
+ '@tailwindcss/oxide-android-arm64': 4.3.3
+ '@tailwindcss/oxide-darwin-arm64': 4.3.3
+ '@tailwindcss/oxide-darwin-x64': 4.3.3
+ '@tailwindcss/oxide-freebsd-x64': 4.3.3
+ '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.3
+ '@tailwindcss/oxide-linux-arm64-gnu': 4.3.3
+ '@tailwindcss/oxide-linux-arm64-musl': 4.3.3
+ '@tailwindcss/oxide-linux-x64-gnu': 4.3.3
+ '@tailwindcss/oxide-linux-x64-musl': 4.3.3
+ '@tailwindcss/oxide-wasm32-wasi': 4.3.3
+ '@tailwindcss/oxide-win32-arm64-msvc': 4.3.3
+ '@tailwindcss/oxide-win32-x64-msvc': 4.3.3
+
+ '@tailwindcss/vite@4.3.3(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))':
+ dependencies:
+ '@tailwindcss/node': 4.3.3
+ '@tailwindcss/oxide': 4.3.3
+ tailwindcss: 4.3.3
+ vite: 8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)
+
'@turbo/darwin-64@2.10.12':
optional: true
@@ -2111,6 +4132,32 @@ snapshots:
'@turbo/windows-arm64@2.10.12':
optional: true
+ '@tybys/wasm-util@0.10.3':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
+ '@types/babel__core@7.20.5':
+ dependencies:
+ '@babel/parser': 7.29.8
+ '@babel/types': 7.29.8
+ '@types/babel__generator': 7.27.0
+ '@types/babel__template': 7.4.4
+ '@types/babel__traverse': 7.28.0
+
+ '@types/babel__generator@7.27.0':
+ dependencies:
+ '@babel/types': 7.29.8
+
+ '@types/babel__template@7.4.4':
+ dependencies:
+ '@babel/parser': 7.29.8
+ '@babel/types': 7.29.8
+
+ '@types/babel__traverse@7.28.0':
+ dependencies:
+ '@babel/types': 7.29.8
+
'@types/chai@5.2.3':
dependencies:
'@types/deep-eql': 4.0.2
@@ -2118,8 +4165,24 @@ snapshots:
'@types/deep-eql@4.0.2': {}
+ '@types/estree-jsx@1.0.5':
+ dependencies:
+ '@types/estree': 1.0.9
+
'@types/estree@1.0.9': {}
+ '@types/hast@3.0.5':
+ dependencies:
+ '@types/unist': 3.0.3
+
+ '@types/mdast@4.0.4':
+ dependencies:
+ '@types/unist': 3.0.3
+
+ '@types/nlcst@2.0.3':
+ dependencies:
+ '@types/unist': 3.0.3
+
'@types/node@24.13.3':
dependencies:
undici-types: 7.18.2
@@ -2132,6 +4195,8 @@ snapshots:
dependencies:
csstype: 3.2.3
+ '@types/unist@3.0.3': {}
+
'@typescript/typescript-aix-ppc64@7.0.2':
optional: true
@@ -2192,6 +4257,20 @@ snapshots:
'@typescript/typescript-win32-x64@7.0.2':
optional: true
+ '@ungap/structured-clone@1.3.4': {}
+
+ '@vitejs/plugin-react@5.2.0(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))':
+ dependencies:
+ '@babel/core': 7.29.7
+ '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7)
+ '@babel/plugin-transform-react-jsx-source': 7.29.7(@babel/core@7.29.7)
+ '@rolldown/pluginutils': 1.0.0-rc.3
+ '@types/babel__core': 7.20.5
+ react-refresh: 0.18.0
+ vite: 8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)
+ transitivePeerDependencies:
+ - supports-color
+
'@vitest/expect@4.1.11':
dependencies:
'@standard-schema/spec': 1.1.0
@@ -2201,13 +4280,13 @@ snapshots:
chai: 6.2.2
tinyrainbow: 3.1.1
- '@vitest/mocker@4.1.11(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.7)(yaml@2.9.0))':
+ '@vitest/mocker@4.1.11(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.7)(jiti@2.7.0)(yaml@2.9.0))':
dependencies:
'@vitest/spy': 4.1.11
estree-walker: 3.0.3
magic-string: 0.30.21
optionalDependencies:
- vite: 8.2.2(@types/node@24.13.3)(esbuild@0.27.7)(yaml@2.9.0)
+ vite: 8.2.2(@types/node@24.13.3)(esbuild@0.27.7)(jiti@2.7.0)(yaml@2.9.0)
'@vitest/pretty-format@4.1.11':
dependencies:
@@ -2236,19 +4315,143 @@ snapshots:
sirv: 3.0.2
tinyglobby: 0.2.17
tinyrainbow: 3.1.1
- vitest: 4.1.11(@types/node@24.13.3)(@vitest/ui@4.1.11)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.7)(yaml@2.9.0))
+ vitest: 4.1.11(@types/node@24.13.3)(@vitest/ui@4.1.11)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.7)(jiti@2.7.0)(yaml@2.9.0))
+
+ '@vitest/utils@4.1.11':
+ dependencies:
+ '@vitest/pretty-format': 4.1.11
+ convert-source-map: 2.0.0
+ tinyrainbow: 3.1.1
+
+ acorn@8.18.0: {}
+
+ am-i-vibing@0.4.0:
+ dependencies:
+ process-ancestry: 0.1.0
+
+ ansi-styles@4.3.0:
+ dependencies:
+ color-convert: 2.0.1
+
+ any-promise@1.3.0: {}
+
+ anymatch@3.1.3:
+ dependencies:
+ normalize-path: 3.0.0
+ picomatch: 2.3.2
+
+ argparse@2.0.1: {}
+
+ aria-query@5.3.2: {}
+
+ assertion-error@2.0.1: {}
+
+ astro@7.2.7(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.13.3)(jiti@2.7.0)(yaml@2.9.0):
+ dependencies:
+ '@astrojs/compiler-rs': 0.4.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)
+ '@astrojs/internal-helpers': 0.10.4
+ '@astrojs/markdown-satteri': 0.3.8
+ '@astrojs/telemetry': 3.3.3
+ '@capsizecss/unpack': 4.0.1
+ '@clack/prompts': 1.7.0
+ '@oslojs/encoding': 1.1.0
+ am-i-vibing: 0.4.0
+ aria-query: 5.3.2
+ axobject-query: 4.1.0
+ ci-info: 4.4.0
+ clsx: 2.1.1
+ common-ancestor-path: 2.0.0
+ cookie: 2.0.1
+ devalue: 5.9.1
+ diff: 9.0.0
+ dset: 3.1.4
+ es-module-lexer: 2.3.2
+ esbuild: 0.28.2
+ find-process: 2.1.1
+ flattie: 1.1.1
+ fontace: 0.4.1
+ get-tsconfig: 5.0.0-beta.4
+ github-slugger: 2.0.0
+ html-escaper: 3.0.3
+ http-cache-semantics: 4.2.0
+ js-yaml: 4.3.1
+ jsonc-parser: 3.3.1
+ magic-string: 1.2.3
+ magicast: 0.5.4
+ mrmime: 2.0.1
+ neotraverse: 1.0.1
+ obug: 2.1.4
+ p-limit: 7.3.1
+ p-queue: 9.3.3
+ package-manager-detector: 1.8.0
+ piccolore: 0.1.3
+ picomatch: 4.0.7
+ semver: 7.8.5
+ shiki: 4.4.3
+ smol-toml: 1.8.0
+ svgo: 4.1.0
+ tinyclip: 0.1.15
+ tinyexec: 1.3.0
+ tinyglobby: 0.2.17
+ ultrahtml: 1.7.0
+ unifont: 0.7.5
+ unstorage: 1.17.5
+ vite: 8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)
+ vitefu: 1.1.3(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0))
+ xxhash-wasm: 1.1.0
+ yargs-parser: 22.0.0
+ zod: 4.4.3
+ optionalDependencies:
+ sharp: 0.34.5
+ transitivePeerDependencies:
+ - '@azure/app-configuration'
+ - '@azure/cosmos'
+ - '@azure/data-tables'
+ - '@azure/identity'
+ - '@azure/keyvault-secrets'
+ - '@azure/storage-blob'
+ - '@capacitor/preferences'
+ - '@deno/kv'
+ - '@emnapi/core'
+ - '@emnapi/runtime'
+ - '@netlify/blobs'
+ - '@planetscale/database'
+ - '@types/node'
+ - '@upstash/redis'
+ - '@vercel/blob'
+ - '@vercel/functions'
+ - '@vercel/kv'
+ - '@vitejs/devtools'
+ - aws4fetch
+ - db0
+ - idb-keyval
+ - ioredis
+ - jiti
+ - less
+ - sass
+ - sass-embedded
+ - stylus
+ - sugarss
+ - terser
+ - tsx
+ - uploadthing
+ - yaml
- '@vitest/utils@4.1.11':
- dependencies:
- '@vitest/pretty-format': 4.1.11
- convert-source-map: 2.0.0
- tinyrainbow: 3.1.1
+ axobject-query@4.1.0: {}
- acorn@8.18.0: {}
+ bail@2.0.2: {}
- any-promise@1.3.0: {}
+ baseline-browser-mapping@2.11.19: {}
- assertion-error@2.0.1: {}
+ boolbase@1.0.0: {}
+
+ browserslist@4.28.8:
+ dependencies:
+ baseline-browser-mapping: 2.11.19
+ caniuse-lite: 1.0.30001810
+ electron-to-chromium: 1.5.415
+ node-releases: 2.0.53
+ update-browserslist-db: 1.3.1(browserslist@4.28.8)
bundle-require@5.1.0(esbuild@0.27.7):
dependencies:
@@ -2259,28 +4462,138 @@ snapshots:
cac@7.0.0: {}
+ caniuse-lite@1.0.30001810: {}
+
+ ccount@2.0.1: {}
+
chai@6.2.2: {}
+ chalk@4.1.2:
+ dependencies:
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
+
+ character-entities-html4@2.1.0: {}
+
+ character-entities-legacy@3.0.0: {}
+
chokidar@4.0.3:
dependencies:
readdirp: 4.1.2
+ chokidar@5.0.0:
+ dependencies:
+ readdirp: 5.1.1
+
+ ci-info@4.4.0: {}
+
+ clsx@2.1.1: {}
+
+ color-convert@2.0.1:
+ dependencies:
+ color-name: 1.1.4
+
+ color-name@1.1.4: {}
+
+ comma-separated-tokens@2.0.3: {}
+
+ commander@11.1.0: {}
+
+ commander@14.0.3: {}
+
commander@4.1.1: {}
+ common-ancestor-path@2.0.0: {}
+
confbox@0.1.8: {}
consola@3.4.2: {}
convert-source-map@2.0.0: {}
+ cookie-es@1.2.3: {}
+
+ cookie@2.0.1: {}
+
+ crossws@0.3.5:
+ dependencies:
+ uncrypto: 0.1.3
+
+ css-select@6.0.0:
+ dependencies:
+ boolbase: 1.0.0
+ css-what: 7.0.0
+ domhandler: 5.0.3
+ domutils: 3.2.2
+ nth-check: 2.1.1
+
+ css-tree@2.2.1:
+ dependencies:
+ mdn-data: 2.0.28
+ source-map-js: 1.2.1
+
+ css-tree@3.2.1:
+ dependencies:
+ mdn-data: 2.27.1
+ source-map-js: 1.2.1
+
+ css-what@7.0.0: {}
+
+ csso@5.0.5:
+ dependencies:
+ css-tree: 2.2.1
+
csstype@3.2.3: {}
debug@4.4.3:
dependencies:
ms: 2.1.3
+ defu@6.1.7: {}
+
+ dequal@2.0.3: {}
+
+ destr@2.0.5: {}
+
detect-libc@2.1.2: {}
+ devalue@5.9.1: {}
+
+ devlop@1.1.0:
+ dependencies:
+ dequal: 2.0.3
+
+ diff@9.0.0: {}
+
+ dom-serializer@2.0.0:
+ dependencies:
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+ entities: 4.5.0
+
+ domelementtype@2.3.0: {}
+
+ domhandler@5.0.3:
+ dependencies:
+ domelementtype: 2.3.0
+
+ domutils@3.2.2:
+ dependencies:
+ dom-serializer: 2.0.0
+ domelementtype: 2.3.0
+ domhandler: 5.0.3
+
+ dset@3.1.4: {}
+
+ electron-to-chromium@1.5.415: {}
+
+ enhanced-resolve@5.24.5:
+ dependencies:
+ graceful-fs: 4.2.11
+ tapable: 2.3.3
+
+ entities@4.5.0: {}
+
es-module-lexer@2.3.2: {}
esbuild@0.27.7:
@@ -2312,12 +4625,47 @@ snapshots:
'@esbuild/win32-ia32': 0.27.7
'@esbuild/win32-x64': 0.27.7
+ esbuild@0.28.2:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.28.2
+ '@esbuild/android-arm': 0.28.2
+ '@esbuild/android-arm64': 0.28.2
+ '@esbuild/android-x64': 0.28.2
+ '@esbuild/darwin-arm64': 0.28.2
+ '@esbuild/darwin-x64': 0.28.2
+ '@esbuild/freebsd-arm64': 0.28.2
+ '@esbuild/freebsd-x64': 0.28.2
+ '@esbuild/linux-arm': 0.28.2
+ '@esbuild/linux-arm64': 0.28.2
+ '@esbuild/linux-ia32': 0.28.2
+ '@esbuild/linux-loong64': 0.28.2
+ '@esbuild/linux-mips64el': 0.28.2
+ '@esbuild/linux-ppc64': 0.28.2
+ '@esbuild/linux-riscv64': 0.28.2
+ '@esbuild/linux-s390x': 0.28.2
+ '@esbuild/linux-x64': 0.28.2
+ '@esbuild/netbsd-arm64': 0.28.2
+ '@esbuild/netbsd-x64': 0.28.2
+ '@esbuild/openbsd-arm64': 0.28.2
+ '@esbuild/openbsd-x64': 0.28.2
+ '@esbuild/openharmony-arm64': 0.28.2
+ '@esbuild/sunos-x64': 0.28.2
+ '@esbuild/win32-arm64': 0.28.2
+ '@esbuild/win32-ia32': 0.28.2
+ '@esbuild/win32-x64': 0.28.2
+
+ escalade@3.2.0: {}
+
estree-walker@3.0.3:
dependencies:
'@types/estree': 1.0.9
+ eventemitter3@5.0.4: {}
+
expect-type@1.4.0: {}
+ extend@3.0.2: {}
+
fast-string-truncated-width@3.0.3: {}
fast-string-width@3.0.2:
@@ -2334,6 +4682,12 @@ snapshots:
fflate@0.8.3: {}
+ find-process@2.1.1:
+ dependencies:
+ chalk: 4.1.2
+ commander: 14.0.3
+ loglevel: 1.9.2
+
fix-dts-default-cjs-exports@1.0.1:
dependencies:
magic-string: 0.30.21
@@ -2342,17 +4696,93 @@ snapshots:
flatted@3.4.4: {}
+ flattie@1.1.1: {}
+
+ fontace@0.4.1:
+ dependencies:
+ fontkitten: 1.0.3
+
+ fontkitten@1.0.3:
+ dependencies:
+ tiny-inflate: 1.0.3
+
fsevents@2.3.3:
optional: true
+ gensync@1.0.0-beta.2: {}
+
+ get-tsconfig@5.0.0-beta.4:
+ dependencies:
+ resolve-pkg-maps: 1.0.0
+
+ github-slugger@2.0.0: {}
+
+ graceful-fs@4.2.11: {}
+
+ h3@1.15.11:
+ dependencies:
+ cookie-es: 1.2.3
+ crossws: 0.3.5
+ defu: 6.1.7
+ destr: 2.0.5
+ iron-webcrypto: 1.2.1
+ node-mock-http: 1.0.5
+ radix3: 1.1.2
+ ufo: 1.6.4
+ uncrypto: 0.1.3
+
+ has-flag@4.0.0: {}
+
+ hast-util-to-html@9.0.5:
+ dependencies:
+ '@types/hast': 3.0.5
+ '@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.2.0
+ space-separated-tokens: 2.0.2
+ stringify-entities: 4.0.4
+ zwitch: 2.0.4
+
+ hast-util-whitespace@3.0.0:
+ dependencies:
+ '@types/hast': 3.0.5
+
+ html-escaper@3.0.3: {}
+
+ html-void-elements@3.0.0: {}
+
+ http-cache-semantics@4.2.0: {}
+
human-id@4.2.1: {}
import-meta-resolve@4.2.0: {}
+ iron-webcrypto@1.2.1: {}
+
+ is-docker@4.0.0: {}
+
+ is-plain-obj@4.1.0: {}
+
+ jiti@2.7.0: {}
+
jju@1.4.0: {}
joycon@3.1.1: {}
+ js-tokens@4.0.0: {}
+
+ js-yaml@4.3.1:
+ dependencies:
+ argparse: 2.0.1
+
+ jsesc@3.1.0: {}
+
+ json5@2.2.3: {}
+
jsonc-parser@3.3.1: {}
launch-editor@2.14.1:
@@ -2360,39 +4790,88 @@ snapshots:
picocolors: 1.1.1
shell-quote: 1.10.0
+ lightningcss-android-arm64@1.32.0:
+ optional: true
+
lightningcss-android-arm64@1.33.0:
optional: true
+ lightningcss-darwin-arm64@1.32.0:
+ optional: true
+
lightningcss-darwin-arm64@1.33.0:
optional: true
+ lightningcss-darwin-x64@1.32.0:
+ optional: true
+
lightningcss-darwin-x64@1.33.0:
optional: true
+ lightningcss-freebsd-x64@1.32.0:
+ optional: true
+
lightningcss-freebsd-x64@1.33.0:
optional: true
+ lightningcss-linux-arm-gnueabihf@1.32.0:
+ optional: true
+
lightningcss-linux-arm-gnueabihf@1.33.0:
optional: true
+ lightningcss-linux-arm64-gnu@1.32.0:
+ optional: true
+
lightningcss-linux-arm64-gnu@1.33.0:
optional: true
+ lightningcss-linux-arm64-musl@1.32.0:
+ optional: true
+
lightningcss-linux-arm64-musl@1.33.0:
optional: true
+ lightningcss-linux-x64-gnu@1.32.0:
+ optional: true
+
lightningcss-linux-x64-gnu@1.33.0:
optional: true
+ lightningcss-linux-x64-musl@1.32.0:
+ optional: true
+
lightningcss-linux-x64-musl@1.33.0:
optional: true
+ lightningcss-win32-arm64-msvc@1.32.0:
+ optional: true
+
lightningcss-win32-arm64-msvc@1.33.0:
optional: true
+ lightningcss-win32-x64-msvc@1.32.0:
+ optional: true
+
lightningcss-win32-x64-msvc@1.33.0:
optional: true
+ lightningcss@1.32.0:
+ dependencies:
+ detect-libc: 2.1.2
+ optionalDependencies:
+ lightningcss-android-arm64: 1.32.0
+ lightningcss-darwin-arm64: 1.32.0
+ lightningcss-darwin-x64: 1.32.0
+ lightningcss-freebsd-x64: 1.32.0
+ lightningcss-linux-arm-gnueabihf: 1.32.0
+ lightningcss-linux-arm64-gnu: 1.32.0
+ lightningcss-linux-arm64-musl: 1.32.0
+ lightningcss-linux-x64-gnu: 1.32.0
+ lightningcss-linux-x64-musl: 1.32.0
+ lightningcss-win32-arm64-msvc: 1.32.0
+ lightningcss-win32-x64-msvc: 1.32.0
+
lightningcss@1.33.0:
dependencies:
detect-libc: 2.1.2
@@ -2415,10 +4894,61 @@ snapshots:
load-tsconfig@0.2.5: {}
+ loglevel@1.9.2: {}
+
+ lru-cache@11.5.2: {}
+
+ lru-cache@5.1.1:
+ dependencies:
+ yallist: 3.1.1
+
magic-string@0.30.21:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.5
+ magic-string@1.2.3:
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+
+ magicast@0.5.4:
+ dependencies:
+ '@babel/parser': 7.29.8
+ '@babel/types': 7.29.8
+ source-map-js: 1.2.1
+
+ mdast-util-to-hast@13.2.1:
+ dependencies:
+ '@types/hast': 3.0.5
+ '@types/mdast': 4.0.4
+ '@ungap/structured-clone': 1.3.4
+ 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.1.0
+ vfile: 6.0.3
+
+ mdn-data@2.0.28: {}
+
+ mdn-data@2.27.1: {}
+
+ micromark-util-character@2.1.1:
+ dependencies:
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-util-encode@2.0.1: {}
+
+ micromark-util-sanitize-uri@2.0.1:
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-encode: 2.0.1
+ micromark-util-symbol: 2.0.1
+
+ micromark-util-symbol@2.0.1: {}
+
+ micromark-util-types@2.0.2: {}
+
mlly@1.8.2:
dependencies:
acorn: 8.18.0
@@ -2438,10 +4968,44 @@ snapshots:
nanoid@3.3.18: {}
+ neotraverse@1.0.1: {}
+
+ nlcst-to-string@4.0.0:
+ dependencies:
+ '@types/nlcst': 2.0.3
+
+ node-fetch-native@1.6.7: {}
+
+ node-mock-http@1.0.5: {}
+
+ node-releases@2.0.53: {}
+
+ normalize-path@3.0.0: {}
+
+ nth-check@2.1.1:
+ dependencies:
+ boolbase: 1.0.0
+
object-assign@4.1.1: {}
obug@2.1.4: {}
+ ofetch@1.5.1:
+ dependencies:
+ destr: 2.0.5
+ node-fetch-native: 1.6.7
+ ufo: 1.6.4
+
+ ohash@2.0.12: {}
+
+ oniguruma-parser@0.12.2: {}
+
+ oniguruma-to-es@4.3.6:
+ dependencies:
+ oniguruma-parser: 0.12.2
+ regex: 6.1.0
+ regex-recursion: 6.0.2
+
oxfmt@0.65.0:
dependencies:
tinypool: 2.1.0
@@ -2498,12 +5062,27 @@ snapshots:
'@oxlint/binding-win32-x64-msvc': 1.80.0
oxlint-tsgolint: 7.0.2001
+ p-limit@7.3.1:
+ dependencies:
+ yocto-queue: 1.2.2
+
+ p-queue@9.3.3:
+ dependencies:
+ eventemitter3: 5.0.4
+ p-timeout: 7.0.1
+
+ p-timeout@7.0.1: {}
+
package-manager-detector@1.8.0: {}
pathe@2.0.3: {}
+ piccolore@0.1.3: {}
+
picocolors@1.1.1: {}
+ picomatch@2.3.2: {}
+
picomatch@4.0.7: {}
pirates@4.0.7: {}
@@ -2514,10 +5093,11 @@ snapshots:
mlly: 1.8.2
pathe: 2.0.3
- postcss-load-config@6.0.1(postcss@8.5.26)(yaml@2.9.0):
+ postcss-load-config@6.0.1(jiti@2.7.0)(postcss@8.5.26)(yaml@2.9.0):
dependencies:
lilconfig: 3.1.3
optionalDependencies:
+ jiti: 2.7.0
postcss: 8.5.26
yaml: 2.9.0
@@ -2527,17 +5107,47 @@ snapshots:
picocolors: 1.1.1
source-map-js: 1.2.1
+ prismjs@1.30.0: {}
+
+ process-ancestry@0.1.0: {}
+
+ property-information@7.2.0: {}
+
+ radix3@1.1.2: {}
+
react-dom@19.2.8(react@19.2.8):
dependencies:
react: 19.2.8
scheduler: 0.27.0
+ react-refresh@0.18.0: {}
+
react@19.2.8: {}
readdirp@4.1.2: {}
+ readdirp@5.1.1: {}
+
+ regex-recursion@6.0.2:
+ dependencies:
+ regex-utilities: 2.3.0
+
+ regex-utilities@2.3.0: {}
+
+ regex@6.1.0:
+ dependencies:
+ regex-utilities: 2.3.0
+
resolve-from@5.0.0: {}
+ resolve-pkg-maps@1.0.0: {}
+
+ retext-smartypants@6.2.0:
+ dependencies:
+ '@types/nlcst': 2.0.3
+ nlcst-to-string: 4.0.0
+ unist-util-visit: 5.1.0
+
rolldown@1.2.5:
dependencies:
'@oxc-project/types': 0.146.0
@@ -2591,12 +5201,76 @@ snapshots:
'@rollup/rollup-win32-x64-msvc': 4.63.0
fsevents: 2.3.3
+ satteri@0.10.5:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.5
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ optionalDependencies:
+ '@bruits/satteri-darwin-arm64': 0.10.5
+ '@bruits/satteri-darwin-x64': 0.10.5
+ '@bruits/satteri-linux-arm64-gnu': 0.10.5
+ '@bruits/satteri-linux-arm64-musl': 0.10.5
+ '@bruits/satteri-linux-x64-gnu': 0.10.5
+ '@bruits/satteri-linux-x64-musl': 0.10.5
+ '@bruits/satteri-wasm32-wasi': 0.10.5
+ '@bruits/satteri-win32-arm64-msvc': 0.10.5
+ '@bruits/satteri-win32-x64-msvc': 0.10.5
+
+ sax@1.6.1: {}
+
scheduler@0.27.0: {}
+ semver@6.3.1: {}
+
semver@7.8.5: {}
+ sharp@0.34.5:
+ dependencies:
+ '@img/colour': 1.1.0
+ detect-libc: 2.1.2
+ semver: 7.8.5
+ 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
+ optional: true
+
shell-quote@1.10.0: {}
+ shiki@4.4.3:
+ dependencies:
+ '@shikijs/core': 4.4.3
+ '@shikijs/engine-javascript': 4.4.3
+ '@shikijs/engine-oniguruma': 4.4.3
+ '@shikijs/langs': 4.4.3
+ '@shikijs/themes': 4.4.3
+ '@shikijs/types': 4.4.3
+ '@shikijs/vscode-textmate': 10.0.2
+ '@types/hast': 3.0.5
+
siginfo@2.0.0: {}
sirv@3.0.2:
@@ -2607,14 +5281,23 @@ snapshots:
sisteransi@1.0.5: {}
+ smol-toml@1.8.0: {}
+
source-map-js@1.2.1: {}
source-map@0.7.6: {}
+ space-separated-tokens@2.0.2: {}
+
stackback@0.0.2: {}
std-env@4.2.0: {}
+ stringify-entities@4.0.4:
+ dependencies:
+ character-entities-html4: 2.1.0
+ character-entities-legacy: 3.0.0
+
sucrase@3.35.1:
dependencies:
'@jridgewell/gen-mapping': 0.3.13
@@ -2625,6 +5308,24 @@ snapshots:
tinyglobby: 0.2.17
ts-interface-checker: 0.1.13
+ supports-color@7.2.0:
+ dependencies:
+ has-flag: 4.0.0
+
+ svgo@4.1.0:
+ dependencies:
+ commander: 11.1.0
+ css-select: 6.0.0
+ css-tree: 3.2.1
+ css-what: 7.0.0
+ csso: 5.0.5
+ picocolors: 1.1.1
+ sax: 1.6.1
+
+ tailwindcss@4.3.3: {}
+
+ tapable@2.3.3: {}
+
thenify-all@1.6.0:
dependencies:
thenify: 3.3.1
@@ -2633,8 +5334,12 @@ snapshots:
dependencies:
any-promise: 1.3.0
+ tiny-inflate@1.0.3: {}
+
tinybench@2.9.0: {}
+ tinyclip@0.1.15: {}
+
tinyexec@0.3.2: {}
tinyexec@1.3.0: {}
@@ -2652,9 +5357,16 @@ snapshots:
tree-kill@1.2.2: {}
+ trim-lines@3.0.1: {}
+
+ trough@2.2.0: {}
+
ts-interface-checker@0.1.13: {}
- tsup@8.5.1(postcss@8.5.26)(typescript@7.0.2)(yaml@2.9.0):
+ tslib@2.8.1:
+ optional: true
+
+ tsup@8.5.1(jiti@2.7.0)(postcss@8.5.26)(typescript@7.0.2)(yaml@2.9.0):
dependencies:
bundle-require: 5.1.0(esbuild@0.27.7)
cac: 6.7.14
@@ -2665,7 +5377,7 @@ snapshots:
fix-dts-default-cjs-exports: 1.0.1
joycon: 3.1.1
picocolors: 1.1.1
- postcss-load-config: 6.0.1(postcss@8.5.26)(yaml@2.9.0)
+ postcss-load-config: 6.0.1(jiti@2.7.0)(postcss@8.5.26)(yaml@2.9.0)
resolve-from: 5.0.0
rollup: 4.63.0
source-map: 0.7.6
@@ -2716,9 +5428,81 @@ snapshots:
ufo@1.6.4: {}
+ ultrahtml@1.7.0: {}
+
+ uncrypto@0.1.3: {}
+
undici-types@7.18.2: {}
- vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.7)(yaml@2.9.0):
+ undici@8.10.0: {}
+
+ unified@11.0.5:
+ 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
+
+ unifont@0.7.5:
+ dependencies:
+ css-tree: 3.2.1
+ ohash: 2.0.12
+ undici: 8.10.0
+
+ unist-util-is@6.0.1:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-position@5.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-stringify-position@4.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-visit-parents@6.0.2:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.1
+
+ unist-util-visit@5.1.0:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.1
+ unist-util-visit-parents: 6.0.2
+
+ unstorage@1.17.5:
+ dependencies:
+ anymatch: 3.1.3
+ chokidar: 5.0.0
+ destr: 2.0.5
+ h3: 1.15.11
+ lru-cache: 11.5.2
+ node-fetch-native: 1.6.7
+ ofetch: 1.5.1
+ ufo: 1.6.4
+
+ update-browserslist-db@1.3.1(browserslist@4.28.8):
+ dependencies:
+ browserslist: 4.28.8
+ escalade: 3.2.0
+ picocolors: 1.1.1
+
+ vfile-message@4.0.3:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-stringify-position: 4.0.0
+
+ vfile@6.0.3:
+ dependencies:
+ '@types/unist': 3.0.3
+ vfile-message: 4.0.3
+
+ vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.7)(jiti@2.7.0)(yaml@2.9.0):
dependencies:
lightningcss: 1.33.0
picomatch: 4.0.7
@@ -2729,12 +5513,31 @@ snapshots:
'@types/node': 24.13.3
esbuild: 0.27.7
fsevents: 2.3.3
+ jiti: 2.7.0
+ yaml: 2.9.0
+
+ vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0):
+ dependencies:
+ lightningcss: 1.33.0
+ picomatch: 4.0.7
+ postcss: 8.5.26
+ rolldown: 1.2.5
+ tinyglobby: 0.2.17
+ optionalDependencies:
+ '@types/node': 24.13.3
+ esbuild: 0.28.2
+ fsevents: 2.3.3
+ jiti: 2.7.0
yaml: 2.9.0
- vitest@4.1.11(@types/node@24.13.3)(@vitest/ui@4.1.11)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.7)(yaml@2.9.0)):
+ vitefu@1.1.3(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)):
+ optionalDependencies:
+ vite: 8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.0)
+
+ vitest@4.1.11(@types/node@24.13.3)(@vitest/ui@4.1.11)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.7)(jiti@2.7.0)(yaml@2.9.0)):
dependencies:
'@vitest/expect': 4.1.11
- '@vitest/mocker': 4.1.11(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.7)(yaml@2.9.0))
+ '@vitest/mocker': 4.1.11(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.7)(jiti@2.7.0)(yaml@2.9.0))
'@vitest/pretty-format': 4.1.11
'@vitest/runner': 4.1.11
'@vitest/snapshot': 4.1.11
@@ -2751,7 +5554,7 @@ snapshots:
tinyexec: 1.3.0
tinyglobby: 0.2.17
tinyrainbow: 3.1.1
- vite: 8.2.2(@types/node@24.13.3)(esbuild@0.27.7)(yaml@2.9.0)
+ vite: 8.2.2(@types/node@24.13.3)(esbuild@0.27.7)(jiti@2.7.0)(yaml@2.9.0)
why-is-node-running: 2.3.0
optionalDependencies:
'@types/node': 24.13.3
@@ -2764,4 +5567,16 @@ snapshots:
siginfo: 2.0.0
stackback: 0.0.2
+ xxhash-wasm@1.1.0: {}
+
+ yallist@3.1.1: {}
+
yaml@2.9.0: {}
+
+ yargs-parser@22.0.0: {}
+
+ yocto-queue@1.2.2: {}
+
+ zod@4.4.3: {}
+
+ zwitch@2.0.4: {}
From 82f84f9de6cdfed2c2fcb97e139364e9daba8b03 Mon Sep 17 00:00:00 2001
From: prdHugo <48803115+HugoPerard@users.noreply.github.com>
Date: Wed, 26 Aug 2026 05:05:02 -0700
Subject: [PATCH 27/46] feat(landing): without column as nested ternaries
---
.../src/components/NestedTernary.astro | 23 +++++++++----------
1 file changed, 11 insertions(+), 12 deletions(-)
diff --git a/apps/landing/src/components/NestedTernary.astro b/apps/landing/src/components/NestedTernary.astro
index ba131cc..eba3957 100644
--- a/apps/landing/src/components/NestedTernary.astro
+++ b/apps/landing/src/components/NestedTernary.astro
@@ -1,19 +1,18 @@
---
-// The sell: exhaustive() is a type error until every status is matched.
+// Painful alternative: nested ternaries still typecheck when empty is missing.
---
-
- tsc
+
+ Without
book-screen.tsx:14:6 - error TS2349
-This expression is not callable.
- Type 'Unmatched<"empty">' has no call signatures.
-
- 12 .match("default", ({ book }) => <Book book={book} />)
- 13 .match("error", () => <Error />)
- 14 .exhaustive()
- ~~~~~~~~~~
+ class="overflow-x-auto rounded-lg border border-line bg-code p-5 font-mono text-[13px] leading-6 text-paper sm:text-sm"
+ >return isPending ? (
+ <Loading />
+) : isError ? (
+ <Error />
+) : data ? (
+ <Book book={data} />
+) : null;
From fe7e3e2f04674240ae3de3058e3bc1ebd594f48e Mon Sep 17 00:00:00 2001
From: prdHugo <48803115+HugoPerard@users.noreply.github.com>
Date: Wed, 26 Aug 2026 05:06:08 -0700
Subject: [PATCH 28/46] feat(landing): with column plus tsc miss
---
apps/landing/src/components/HeroCode.astro | 71 +++++++++++-----------
1 file changed, 35 insertions(+), 36 deletions(-)
diff --git a/apps/landing/src/components/HeroCode.astro b/apps/landing/src/components/HeroCode.astro
index c5a73ea..059f5ff 100644
--- a/apps/landing/src/components/HeroCode.astro
+++ b/apps/landing/src/components/HeroCode.astro
@@ -1,44 +1,43 @@
---
-// Static product UI — zero JS. LCP is this card, not a photo.
+// With the helper: match + exhaustive. Miss a status, tsc fails.
---
-
-
- book-screen.tsx
-
- import {"{"} getUiState {"}"} from "@bearstudio/ui-state";
-
-const ui = getUiState((set) => {"{"}
+
+
+
+ With
+
+ const ui = getUiState((set) => {"{"}
if (bookQuery.status === "pending") return set("pending");
if (bookQuery.status === "error") return set("error");
+ if (!bookQuery.data) return set("empty");
return set("default", {"{"} book: bookQuery.data {"}"});
-{"}"});
+{"} "});
-ui.match("pending", () => <>Loading...</>)
- .match("error", () => <>Error</>)
- .match("default", ({ book }) => <>{book.title}</>)
+ui.match("pending", () => <Loading />)
+ .match("error", () => <Error />)
+ .match("default", ({ book }) => <Book book={book} />)
.exhaustive();
-
- -
-
- pending
-
-
-
-
- -
-
error
- Could not load the book.
-
- -
-
default
- The Left Hand of Darkness
- Ursula K. Le Guin
-
-
-
+
+
+
+
+ tsc
+
+ book-screen.tsx:14:6 - error TS2349
+This expression is not callable.
+ Type 'Unmatched<"empty">' has no call signatures.
+
+ 12 .match("default", ({ book }) => <Book book={book} />)
+ 13 .match("error", () => <Error />)
+ 14 .exhaustive()
+ ~~~~~~~~~~
+
+
From 4b74f458ba8d82e9ed186290eb4b200d74df40eb Mon Sep 17 00:00:00 2001
From: prdHugo <48803115+HugoPerard@users.noreply.github.com>
Date: Wed, 26 Aug 2026 05:06:36 -0700
Subject: [PATCH 29/46] feat(landing): presentational header and with/without
compare
---
apps/landing/src/pages/index.astro | 81 ++++++++++++++----------------
1 file changed, 37 insertions(+), 44 deletions(-)
diff --git a/apps/landing/src/pages/index.astro b/apps/landing/src/pages/index.astro
index b2e0894..ba6ae4a 100644
--- a/apps/landing/src/pages/index.astro
+++ b/apps/landing/src/pages/index.astro
@@ -26,18 +26,18 @@ const install = "pnpm add @bearstudio/ui-state";
-
- Demo
+ Compare
-
- Install
+ Demo
-
@@ -54,51 +54,44 @@ const install = "pnpm add @bearstudio/ui-state";
-
-
-
-
- UI states you can exhaust.
-
-
- getUiState maps
- pending, error, and the statuses you actually have onto one
- match chain.
- exhaustive() is
- a type error until every status has a branch. For React screens that
- already know if a query is loading — not a new store.
-
-
- {install}
-
- GitHub
-
-
-
-
-
+
+
+
+ UI states you can exhaust.
+
+
+ getUiState maps
+ pending, error, and the statuses you actually have onto one
+ match chain.
+ Miss a status,
+ exhaustive() is a
+ type error. For React screens that already know if a query is loading
+ — not a new store.
+
+
+ {install}
+
+ GitHub
+
-
-
-
-
- Miss a status, tsc fails.
-
-
- Loading, error, data. Then empty. Then not-found. Each new status is
- another branch to paste into every screen. Miss one and a ternary
- still typechecks. exhaustive()
- does not.
-
+
+
+ Same screen, with and without.
+
+ Nested ternaries swallow empty and still typecheck.
+ exhaustive() does not.
+
+
+
+
-
From 78bf4945582c4b9d058873b33b6ecdc5e7a63a0c Mon Sep 17 00:00:00 2001
From: prdHugo <48803115+HugoPerard@users.noreply.github.com>
Date: Wed, 26 Aug 2026 05:06:57 -0700
Subject: [PATCH 30/46] fix(landing): restore getUiState braces in with sample
From ac167c0aedb256d2c6f5bfca071b52bd2fb7d763 Mon Sep 17 00:00:00 2001
From: prdHugo <48803115+HugoPerard@users.noreply.github.com>
Date: Wed, 26 Aug 2026 05:07:15 -0700
Subject: [PATCH 31/46] fix(landing): close getUiState sample without a stray
space
Co-authored-by: Cursor
---
apps/landing/src/components/HeroCode.astro | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/apps/landing/src/components/HeroCode.astro b/apps/landing/src/components/HeroCode.astro
index 059f5ff..204349b 100644
--- a/apps/landing/src/components/HeroCode.astro
+++ b/apps/landing/src/components/HeroCode.astro
@@ -17,7 +17,7 @@
if (bookQuery.status === "error") return set("error");
if (!bookQuery.data) return set("empty");
return set("default", {"{"} book: bookQuery.data {"}"});
-{"} "});
+{"} "}{");"}
ui.match("pending", () => <Loading />)
.match("error", () => <Error />)
From e28675b75eb9603183153787f5366b77ade70e8a Mon Sep 17 00:00:00 2001
From: prdHugo <48803115+HugoPerard@users.noreply.github.com>
Date: Wed, 26 Aug 2026 05:07:37 -0700
Subject: [PATCH 32/46] fix(landing): with sample closes as });
From 2eab1f143a94f0b35208e38758447202df586bb7 Mon Sep 17 00:00:00 2001
From: prdHugo <48803115+HugoPerard@users.noreply.github.com>
Date: Wed, 26 Aug 2026 05:11:19 -0700
Subject: [PATCH 33/46] fix(landing): without column on paper, no figcaption
---
apps/landing/src/components/NestedTernary.astro | 15 +++++----------
1 file changed, 5 insertions(+), 10 deletions(-)
diff --git a/apps/landing/src/components/NestedTernary.astro b/apps/landing/src/components/NestedTernary.astro
index eba3957..55dccbf 100644
--- a/apps/landing/src/components/NestedTernary.astro
+++ b/apps/landing/src/components/NestedTernary.astro
@@ -1,18 +1,13 @@
---
-// Painful alternative: nested ternaries still typecheck when empty is missing.
+// Nested ternaries still typecheck when empty is missing.
---
-
-
- Without
-
- return isPending ? (
+return isPending ? (
<Loading />
) : isError ? (
<Error />
) : data ? (
<Book book={data} />
-) : null;
-
+) : null;
From 0dbb489b842c91bd54e3c8fbfbd2b5a6a70271c1 Mon Sep 17 00:00:00 2001
From: prdHugo <48803115+HugoPerard@users.noreply.github.com>
Date: Wed, 26 Aug 2026 05:11:28 -0700
Subject: [PATCH 34/46] fix(landing): with column is incomplete match plus tsc
---
apps/landing/src/components/HeroCode.astro | 45 ++++------------------
1 file changed, 8 insertions(+), 37 deletions(-)
diff --git a/apps/landing/src/components/HeroCode.astro b/apps/landing/src/components/HeroCode.astro
index 204349b..6af0ec0 100644
--- a/apps/landing/src/components/HeroCode.astro
+++ b/apps/landing/src/components/HeroCode.astro
@@ -1,43 +1,14 @@
---
-// With the helper: match + exhaustive. Miss a status, tsc fails.
+// One sample: incomplete match + the tsc miss. No getUiState dump.
---
-
-
-
- With
-
- const ui = getUiState((set) => {"{"}
- if (bookQuery.status === "pending") return set("pending");
- if (bookQuery.status === "error") return set("error");
- if (!bookQuery.data) return set("empty");
- return set("default", {"{"} book: bookQuery.data {"}"});
-{"} "}{");"}
-
-ui.match("pending", () => <Loading />)
+ui.match("pending", () => <Loading />)
.match("error", () => <Error />)
.match("default", ({ book }) => <Book book={book} />)
- .exhaustive();
-
-
-
-
- tsc
-
- book-screen.tsx:14:6 - error TS2349
-This expression is not callable.
- Type 'Unmatched<"empty">' has no call signatures.
+ .exhaustive()
+ ~~~~~~~~~~
- 12 .match("default", ({ book }) => <Book book={book} />)
- 13 .match("error", () => <Error />)
- 14 .exhaustive()
- ~~~~~~~~~~
-
-
+error TS2349
+Type 'Unmatched<"empty">' has no call signatures.
From 884a28c28861ddeeeeebdd6cc9712cec94798455 Mon Sep 17 00:00:00 2001
From: prdHugo <48803115+HugoPerard@users.noreply.github.com>
Date: Wed, 26 Aug 2026 05:11:48 -0700
Subject: [PATCH 35/46] feat(landing): status option-wheel demo island
---
apps/landing/src/components/StateDemo.tsx | 196 ++++++++++++++++------
1 file changed, 148 insertions(+), 48 deletions(-)
diff --git a/apps/landing/src/components/StateDemo.tsx b/apps/landing/src/components/StateDemo.tsx
index 802ef81..2cefb65 100644
--- a/apps/landing/src/components/StateDemo.tsx
+++ b/apps/landing/src/components/StateDemo.tsx
@@ -1,7 +1,13 @@
import { useMemo, useState } from "react";
import { getUiState } from "@bearstudio/ui-state";
-type DemoStatus = "pending" | "error" | "success";
+type DemoStatus =
+ | "pending"
+ | "error"
+ | "empty"
+ | "not-found"
+ | "show-input"
+ | "success";
type Book = {
title: string;
@@ -13,14 +19,26 @@ const DEMO_BOOK: Book = {
author: "Ursula K. Le Guin",
};
-const CONTROLS: ReadonlyArray<{ id: DemoStatus; label: string }> = [
+const STATUSES: ReadonlyArray<{ id: DemoStatus; label: string }> = [
{ id: "pending", label: "pending" },
{ id: "error", label: "error" },
+ { id: "empty", label: "empty" },
+ { id: "not-found", label: "not-found" },
+ { id: "show-input", label: "show-input" },
{ id: "success", label: "default" },
];
+const ITEM_PX = 44;
+const WINDOW = 5;
+const PAD = 2;
+
+function isDemoStatus(value: string): value is DemoStatus {
+ return STATUSES.some((item) => item.id === value);
+}
+
export function StateDemo() {
const [status, setStatus] = useState("success");
+ const selectedIndex = STATUSES.findIndex((item) => item.id === status);
const ui = useMemo(
() =>
@@ -31,62 +49,144 @@ export function StateDemo() {
if (status === "error") {
return set("error");
}
+ if (status === "empty") {
+ return set("empty");
+ }
+ if (status === "not-found") {
+ return set("not-found");
+ }
+ if (status === "show-input") {
+ return set("show-input");
+ }
return set("default", { book: DEMO_BOOK });
}),
[status],
);
+ function step(delta: number) {
+ const next = Math.min(
+ STATUSES.length - 1,
+ Math.max(0, selectedIndex + delta),
+ );
+ const item = STATUSES[next];
+ if (item) {
+ setStatus(item.id);
+ }
+ }
+
+ const view = ui
+ .match("pending", () => (
+
+ pending
+
+
+
+ ))
+ .match("error", () => (
+ Could not load the book.
+ ))
+ .match("empty", () => (
+ No books on this shelf.
+ ))
+ .match("not-found", () => (
+ That book is not in the catalogue.
+ ))
+ .match("show-input", () => (
+
+ ))
+ .match("default", ({ book }) => (
+
+ {book.title}
+ {book.author}
+
+ ))
+ .exhaustive();
+
return (
-
-
- match + exhaustive
+
+
+
+
+ {
+ if (event.key === "ArrowDown") {
+ event.preventDefault();
+ step(1);
+ }
+ if (event.key === "ArrowUp") {
+ event.preventDefault();
+ step(-1);
+ }
+ }}
>
- {CONTROLS.map((control) => {
- const selected = status === control.id;
- return (
-
- );
- })}
+
+ {STATUSES.map((item) => {
+ const selected = item.id === status;
+ return (
+
+ );
+ })}
+
-
- {ui
- .match("pending", () => (
-
- pending
-
-
-
- ))
- .match("error", () => (
- Could not load the book.
- ))
- .match("default", ({ book }) => (
-
- {book.title}
- {book.author}
-
- ))
- .exhaustive()}
-
+
+ {view}
);
}
From 80011afeb99235970a6989b292b05fccb8415c0b Mon Sep 17 00:00:00 2001
From: prdHugo <48803115+HugoPerard@users.noreply.github.com>
Date: Wed, 26 Aug 2026 05:12:12 -0700
Subject: [PATCH 36/46] fix(landing): slim hero, compare headings, demo copy
---
apps/landing/src/pages/index.astro | 35 ++++++++++++++----------------
1 file changed, 16 insertions(+), 19 deletions(-)
diff --git a/apps/landing/src/pages/index.astro b/apps/landing/src/pages/index.astro
index ba6ae4a..bccad01 100644
--- a/apps/landing/src/pages/index.astro
+++ b/apps/landing/src/pages/index.astro
@@ -61,15 +61,6 @@ const install = "pnpm add @bearstudio/ui-state";
>
UI states you can exhaust.
-
- getUiState maps
- pending, error, and the statuses you actually have onto one
- match chain.
- Miss a status,
- exhaustive() is a
- type error. For React screens that already know if a query is loading
- — not a new store.
-
Same screen, with and without.
- Nested ternaries swallow empty and still typecheck.
+ getUiState maps pending,
+ error, and the statuses you actually have onto one
+ match chain. Nested ternaries
+ swallow empty and still typecheck.
exhaustive() does not.
-
-
+
+ Without
+
+
+
+ With
+
+
@@ -99,14 +99,11 @@ const install = "pnpm add @bearstudio/ui-state";
The package, running.
- This island hydrates on view and calls
- getUiState from
- @bearstudio/ui-state. Flip
- pending, error, and default. Each view is a
- match branch; the chain ends
- with exhaustive().
+ Spin a custom status. The view next to it is the matching
+ match branch; the chain still
+ ends with exhaustive().
-
+
From f3a44cb760d71e286bb622990255b576c725d82a Mon Sep 17 00:00:00 2001
From: prdHugo <48803115+HugoPerard@users.noreply.github.com>
Date: Wed, 26 Aug 2026 05:17:57 -0700
Subject: [PATCH 37/46] feat(landing): BearStudio tokens, drop rust and Plex
Sans
---
apps/landing/src/styles/global.css | 43 ++++++++++++++++--------------
1 file changed, 23 insertions(+), 20 deletions(-)
diff --git a/apps/landing/src/styles/global.css b/apps/landing/src/styles/global.css
index c9fb777..bba122d 100644
--- a/apps/landing/src/styles/global.css
+++ b/apps/landing/src/styles/global.css
@@ -1,23 +1,25 @@
@import "tailwindcss";
@theme inline {
- --font-sans: var(--font-ibm-plex-sans), ui-sans-serif, system-ui,
- sans-serif;
+ --font-sans: var(--font-inter), ui-sans-serif, system-ui, sans-serif;
+ --font-heading: var(--font-roboto-slab), ui-serif, Georgia, serif;
--font-mono: var(--font-ibm-plex-mono), ui-monospace, monospace;
- --color-paper: #f3eee4;
- --color-paper-2: #e7dfd0;
- --color-ink: #1c1915;
- --color-ink-soft: #4f4a41;
- --color-line: #d5ccba;
- --color-accent: #b5521f;
- --color-accent-ink: #fff7ee;
- --color-code: #171512;
- --color-code-muted: #9a9084;
- --color-code-kw: #e08a55;
- --color-code-str: #8fb58a;
- --color-code-fn: #d4b56a;
- --color-ok: #2f6f4e;
- --color-err: #a33b2b;
+ --color-paper: #ffffff;
+ --color-paper-2: #e4eef0;
+ --color-ink: #0a2f39;
+ --color-ink-soft: #135d71;
+ --color-line: #c8e1e4;
+ --color-accent: #ffbf0f;
+ --color-accent-ink: #0a2f39;
+ --color-hero: #0a2f39;
+ --color-hero-fg: #e4eef0;
+ --color-code: #08242b;
+ --color-code-muted: #67a7b6;
+ --color-code-kw: #9ac8d1;
+ --color-code-str: #c8e1e4;
+ --color-code-fn: #ffed4d;
+ --color-ok: #207588;
+ --color-err: #b42318;
--radius-sm: 0.5rem;
--radius-md: 0.5rem;
--radius-lg: 0.5rem;
@@ -50,14 +52,15 @@ pre,
}
a:focus-visible,
-button:focus-visible {
+button:focus-visible,
+select:focus-visible {
outline: 2px solid var(--color-accent);
outline-offset: 2px;
}
::selection {
- background: var(--color-ink);
- color: var(--color-paper);
+ background: var(--color-accent);
+ color: var(--color-ink);
}
a {
@@ -66,5 +69,5 @@ a {
textarea,
input {
- caret-color: var(--color-accent);
+ caret-color: var(--color-ink);
}
From f55a1497f70b2f3f61bbd7cb67018302b9b952b1 Mon Sep 17 00:00:00 2001
From: prdHugo <48803115+HugoPerard@users.noreply.github.com>
Date: Wed, 26 Aug 2026 05:18:07 -0700
Subject: [PATCH 38/46] feat(landing): self-host Roboto Slab and Inter
---
apps/landing/astro.config.ts | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/apps/landing/astro.config.ts b/apps/landing/astro.config.ts
index 6217a42..c8aed20 100644
--- a/apps/landing/astro.config.ts
+++ b/apps/landing/astro.config.ts
@@ -11,8 +11,16 @@ export default defineConfig({
},
fonts: [
{
- name: "IBM Plex Sans",
- cssVariable: "--font-ibm-plex-sans",
+ name: "Roboto Slab",
+ cssVariable: "--font-roboto-slab",
+ provider: fontProviders.fontsource(),
+ weights: [700],
+ styles: ["normal"],
+ subsets: ["latin", "latin-ext"],
+ },
+ {
+ name: "Inter",
+ cssVariable: "--font-inter",
provider: fontProviders.fontsource(),
weights: [400, 500, 600],
styles: ["normal"],
From 830fabd6b01d95b3bb2ae78c3e24f003c467e929 Mon Sep 17 00:00:00 2001
From: prdHugo <48803115+HugoPerard@users.noreply.github.com>
Date: Wed, 26 Aug 2026 05:18:22 -0700
Subject: [PATCH 39/46] feat(landing): load Slab and Inter, theme-color
brand-900
---
apps/landing/src/layouts/Layout.astro | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/apps/landing/src/layouts/Layout.astro b/apps/landing/src/layouts/Layout.astro
index 1c4f8d9..7f05e29 100644
--- a/apps/landing/src/layouts/Layout.astro
+++ b/apps/landing/src/layouts/Layout.astro
@@ -40,7 +40,7 @@ const jsonLd = {
-
+
{title}
@@ -50,14 +50,15 @@ const jsonLd = {
-
+
+
Skip to content
From 7e570193e489884f433f4e7af0b1da7ffc9f5bc7 Mon Sep 17 00:00:00 2001
From: prdHugo <48803115+HugoPerard@users.noreply.github.com>
Date: Wed, 26 Aug 2026 05:18:46 -0700
Subject: [PATCH 40/46] feat(landing): brand-900 hero, Slab H1 in accent yellow
---
apps/landing/src/pages/index.astro | 42 ++++++++++++++----------------
1 file changed, 20 insertions(+), 22 deletions(-)
diff --git a/apps/landing/src/pages/index.astro b/apps/landing/src/pages/index.astro
index bccad01..a98218c 100644
--- a/apps/landing/src/pages/index.astro
+++ b/apps/landing/src/pages/index.astro
@@ -12,13 +12,13 @@ const install = "pnpm add @bearstudio/ui-state";
---
-
+
@bearstudio/ui-state
@@ -27,7 +27,7 @@ const install = "pnpm add @bearstudio/ui-state";
-
Compare
@@ -35,7 +35,7 @@ const install = "pnpm add @bearstudio/ui-state";
-
Demo
@@ -43,7 +43,7 @@ const install = "pnpm add @bearstudio/ui-state";
-
GitHub
@@ -51,27 +51,25 @@ const install = "pnpm add @bearstudio/ui-state";
-
-
-
-
-
- UI states you can exhaust.
-
-
- {install}
-
- GitHub
-
-
+
+
+ UI states you can exhaust.
+
+
+ {install}
+
+ GitHub
+
+
+
Same screen, with and without.
From b3dc6e9f2994988a0004e8fbbc2e1e4178fa13f1 Mon Sep 17 00:00:00 2001
From: prdHugo <48803115+HugoPerard@users.noreply.github.com>
Date: Wed, 26 Aug 2026 05:18:56 -0700
Subject: [PATCH 41/46] feat(landing): favicon in brand-900 and accent
---
apps/landing/public/favicon.svg | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/apps/landing/public/favicon.svg b/apps/landing/public/favicon.svg
index d2f32f1..3033405 100644
--- a/apps/landing/public/favicon.svg
+++ b/apps/landing/public/favicon.svg
@@ -1,4 +1,4 @@
From 2e0330bf8b079159a44172226b1871f308acef53 Mon Sep 17 00:00:00 2001
From: prdHugo <48803115+HugoPerard@users.noreply.github.com>
Date: Wed, 26 Aug 2026 05:19:19 -0700
Subject: [PATCH 42/46] feat(landing): yellow wheel selected with ink text
---
apps/landing/src/components/StateDemo.tsx | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/apps/landing/src/components/StateDemo.tsx b/apps/landing/src/components/StateDemo.tsx
index 2cefb65..ed03bd1 100644
--- a/apps/landing/src/components/StateDemo.tsx
+++ b/apps/landing/src/components/StateDemo.tsx
@@ -136,7 +136,7 @@ export function StateDemo() {
>
{
From ead5207417323f0a7bd59c4c5e86f698f5637c2f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Hugo=20Pe=CC=81rard?=
Date: Wed, 26 Aug 2026 15:16:24 +0200
Subject: [PATCH 43/46] clean and improve
---
apps/landing/package.json | 2 +-
apps/landing/public/apple-touch-icon.png | Bin 0 -> 4312 bytes
apps/landing/public/favicon-96x96.png | Bin 0 -> 2881 bytes
apps/landing/public/favicon.ico | Bin 0 -> 15086 bytes
apps/landing/public/favicon.svg | 9 +-
apps/landing/public/sounds/click-soft.wav | Bin 0 -> 2028 bytes
apps/landing/src/components/BearMascot.tsx | 258 ++++++++++++
apps/landing/src/components/CopyCommand.tsx | 110 +++++
apps/landing/src/components/HeroCode.astro | 24 +-
.../src/components/NestedTernary.astro | 15 +-
apps/landing/src/components/OptionWheel.tsx | 391 ++++++++++++++++++
apps/landing/src/components/StateDemo.tsx | 197 +++------
apps/landing/src/layouts/Layout.astro | 3 +
apps/landing/src/pages/index.astro | 150 +++----
14 files changed, 918 insertions(+), 241 deletions(-)
create mode 100644 apps/landing/public/apple-touch-icon.png
create mode 100644 apps/landing/public/favicon-96x96.png
create mode 100644 apps/landing/public/favicon.ico
create mode 100644 apps/landing/public/sounds/click-soft.wav
create mode 100644 apps/landing/src/components/BearMascot.tsx
create mode 100644 apps/landing/src/components/CopyCommand.tsx
create mode 100644 apps/landing/src/components/OptionWheel.tsx
diff --git a/apps/landing/package.json b/apps/landing/package.json
index 50690f3..4fda846 100644
--- a/apps/landing/package.json
+++ b/apps/landing/package.json
@@ -1,8 +1,8 @@
{
"name": "landing",
"private": true,
- "type": "module",
"license": "MIT",
+ "type": "module",
"scripts": {
"dev": "astro dev",
"build": "astro build",
diff --git a/apps/landing/public/apple-touch-icon.png b/apps/landing/public/apple-touch-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..11644b6e85c410097733323695b4bcfa9ff26cdc
GIT binary patch
literal 4312
zcmYjVc{tSV_nyU!$XXc2TDEL4){uNcmTZ&k>o7?6GS;!ov`N{bGL|$&nrN)a&QuJN
zOtOrYi!??(M_O%O-`WMy{VF%Han(o!(lC}_Snfxf5r7;?c*!f-xg&sXS-clR$QQR+_3
z3SXv>E8RsNcOq9k_}TZ#f!Je}t}MQKFrx5F^Wz(a1VBhapjIPvaZUzR5-GhI6-y3;clq!`z
z*ZKQ?N@y+O9-;WV%S4${Bo`U>P3*OpH(0~Aa-S+@4=D24fM=?HIt=&{H&4JR@`AyV
zF0?+Cr<}N*xLPCbo?I{UH%C^+IlO4~2~|q
zZY<+dSsi%gIt>k<(;JI-Xv*_g$gdTYFO4D
z>m>q{E6?Q;OHItM#B@Gg^jh~3Kb@;>Q`Nxz-}HFW
zL+q=krHK;Yjjf1-b8A?N9Cq}|{F#Y6CfzdKzt8F@p{Ue1+*7^*Z20rnc1}&{?n!lv
z;9R6VB`KOLs3b&^r~vDunh?324hxstGncQ4-OyE=F{*&JaptJ?Y;E&wJh(QD;nwW!os&HD4y%VgtR0AR{{No5{<$l_-{|grbP>lUBl4?B{excyUWhbIt
zrtUN7Z(q=vwzHuMIG-@(WNQUs3ch?Ki1B@}M454g%jCidFf9Y@msZoIcu+lDA+yRZ
z(}8N;ukTPm34BCMzQ~hs1m*|CQyII{4^7o
z`hKkRk+K(WQ00OM(NLvKqT0jr#+#f0WuR{I+sHo!JG%!8F(Qs?>A6tdVI;2yi4&FW
za&Bfk-l7~7=6yirId*b$d-X2`Iy76f!3CA07|4P}-myvlK(ffHM})2$%C?hs8md_o
z2rm81Al-Gl%d%MX_tEu4h*4UXjW1Iy7xg>CD%2uz30$~MIuu+f-EK`uXdbQ{?1xIK
zP-?#Ay0UyLj6i;J$Rns+E`xT|Xhdk@t3{CEi|=BFDc?2oqiizj>Nh`t+T>o>q`^&W
z07Q?i`D*`tADQod?;iUx@e-8F9YwyG7M;foQy<>f7`bw>#=zpSk5VMi7HNXgwaBex&=B<1rQ~I7xdb
z*2}aZb5eih5gbo-H)iEr>AXl4ZWgGZ-Fy`3!p)9kbduf6To5XMG0Tf^k;cnxebVEF
zJwEDiwuIfI9-`KVaGB6w{idH9>Fw8{tYhdkHEhtQ2V`fmso3;2p5G=@9HAKZ@|i3b#|Ll$(T6`f0INqc~+X}L|)Gv-3=wezp2V-N1mb{jX^
zB`Pu0oaWJq>Bd<`S%~1e7#>Pg#fHR(ExiwC4N{wt3=iSOj6p?-#)+eM&F+IGtL@cO
z-t+d1zSj_U8edkKMbRHebg1tU`c1J5jq6>aPiyv%B07p@Lh!R=hQ$+ANJh8-H6k~T
zC;`#{btZ~#euf=>*Xw#&!=J(L;S}}wL~fg@CL%3qbLUb_%kFEq_Vef$4-u*$Kbnk8
zf^E#=J$ujxzb9y?C~}}@?AcY*jV#HTFbkj9!%vIBfRFqiirKzOv0&P?2URSjc7Ugrg^IDtU8tB_
zyW~U;v1_$hAgYOkk^_4&F_W;SuQoAWYUo)NSTI)ohWoBFta+pqFRdpMN=xuRtFc5J
zXEhQo&awX}x_56`El9rW>;wW+H`g^nx1&~9s*^J#F(6p086BM-DKL
z-kZ4EbLOWzC1nu{WPqQj3Ywt6vQa!wCJYn~u3B_i9DnQahW&l7pZ4XBZl2IP-YHO<
z+UC_l7w1T?SBkt_pN%0$Ra~`{nzQ_a|K4Sc;7$H=YaknCKELhOT@DRnseNQB$B*1H
zoqg@}7LCVZ6|VWoiK45=v!T-?H)U4}BnxKuIENxS;>KpRN+UkkEC4?_e99wwJ7Shi
zmz>ueR_NQ{cAaWs!F_dl-UPe@2xDDX-1xa#p{M_B5CrYdvX1BS%Xc@}B<}8y%`D*8cN7S^o56aD@@M4crz%TKyR*&&vOKN+
ze5f1%OOUH&>BpXe8Xc)=0R!9Hr4CzqIHA_UZl@$8)0u`7S@Y
z(R1E4`rSwI7>o3q_A*695n%m0sDt8bD_hWo+4c>2x@!o09!&%8Ga$-V-IQ=YIjGj#
z)h3bE(OuLW5oIx#WY!vs*DGK(5D4?TS3GesSzVz}odKEktg9)w!axGtJm)S&P6*GO
z&@{QmXXu{(_>WeEHgNnkE|hR4ei)hYrDNUo%5DfeNWu1);G?j5H?a0Qj-{QT{HI$$
zy?F{brWkA|!Y!VDZRSZM>RgdR#{rS0Z3YaYw$
z-bxn~So)i6s(0vS_xdkhGU2nFs-TGE`0-CSMHlDRB32GtXZJCl%jgX+n868{KBMP0
zNQ3GBj1w1HTMZR_%ZVf7%}xvYl^J$#?Qe7heMkvflE_+#4HSnNoDaiR;7r!$%VO~@
zoF_vQz)9C-vZ6UKFGiT1+GDPbJ)(!c>Y}rgF!$G=J6{1MCZ$hy^g@^Tek2Rea5u;?
zJ^fEm#IP!v$e+UV9K-$Rg$)!qq$6cMjO;?Z((WyqPOY{C!^ThC*r*5r%@%%bT~NsO
z4d3wQK2jZ(cO+eBEIwfW!XQ>lJ-taYRy(pA#A+KZNM4WK
zuYYSK#E^?v{U+Z8+^<(S__Ct0_0JCEU`P5k$44VJ$D+IFS4RjLELy1A=~&vUz#m!T
z>1)1_B}L0HcMQuHCpbh0q%79`&3RsLX^9|0P&~Tg52jm^43(z5ooSrn6yoriWzzmM
z5TV@u*UGHh#4=wH*!6_B^{-8RL?|YSscr`vUB0S14=hVZ1RcIaH$w}8SHJS$6s^IC
zP};_`IoA=8V(b!M5H=#IeO@s{_eUf|H#e8l9A_Spx#2ej&Zu_e?F{swzJ?I`Z^|OE
z0d3ODRBQ4BSWSl4Obyl987$S>mvDB#qXCc=Hwj41`
z$DSzJGPx6j3n{bS0!m6vGPrl>;&NE&<~5_?H4P3%&r5X4`{daZEwQBheGNcM>^4$(
zke7t_3GR8F3MsGx>u~vbgn5A9AYp-lh7t^$dmIl=y&ZlmjOkBz?o-<})RJSA63wW9
zZLYPrMpkv;X6_kPhK&%#N@60o4nj{B>tZXJwFa@Z(CGsSWKfy)cT2MKuZezFQal~V
zyA&2jmcQosOU1N*(jqnA(}&$~M~7T0MxvY!w*T1QdG>BTMu{w+Pq6LE*}r6*FY7eM
z)9lUn_o5o(nKM)hx^StYKHgi!=cRH>oVQ4jps#jymFpwQ!4>3%Q&4{6zJ(kTD-ZRBX@WRJ1fWdXeT`1!$HdX`$*M0O1fj1
zYAyb{7Pdk|7y4&~-bkkt0WBQF7O~9_%z{J%gwW)^
zd5Smk56GWPeu~n_6L3y4z8xXfLyXlJ)%YjSi2`-<=%`9H!)=C7teVKlkWHUs|Ff~}jgg2!LFvEK$>E+HM;P)#u?aO
z0CT}`?%}}C?S6*==!qT#mng989N^c(2|xhmK0tN_ups)*dgr+71GzSgT>wPk#fBC^
zi$MlLqoNJaQ8h++Ui{F}D=z-RXG84yJPzOVRwBIkn01_1Ff+_;*S{|~B1!{JW9
zb3kMR(B}1zHm!>2A8(Qw^bgWCQk+gM5(whBi8>oVR70EBZ*OHVd>W>W>7vIw90`G2
zDNl?7`Dl(?t+@Y34nhdKcn5+jrVC*G&NW1@WSmweXrW{X9Q&
z?(qKb#4>!J+;;=eFOC;Bw($Ow<@1^}%ifNDLI@AO2W`&i5CE}MUes673dpA^gBSBV
z`N*9B?!01Xs?YgQ0QJQZxeo}(d7&D@WdTSC_W)53;Y0vI(aOX1LDWIG4S>jvAOr&x
zENjUtr-t&Kg4+S0o`8V2@)wqZmwSic#9XvGngGC_Pyb&aR8KAx>SzN9yp>;W#RLfX
z?+FtCV*g5kUC9hH`~yoZn*X*6K)XSKFN3`m6hX+Ph9#H%vNi)i7J>o!5`6ddUy}BM
z!oqgG7BYW(8xSrwEU{kCw~ciGfGzTEO$QMsP|#znr@YO0;KnYzFAw*L@!f6~{{e^#
z4NI)kdKCr$)}v-Uh49SO0YqxmxR;f-7s;Uur}R}Y2tsTNTs|2%AFS4YZvdmpPGA&@
zY3UP;k@L5ggrMmg#@pxzMR2RDq7eZ1bx@F>w75x<7Fyw>10mJGdgb@Ha
zDR>xSE3VQk>p%nu_%bI&n}f13gyf6EPy&Dncrj9Na2tdF}sRe}dU*Mqc?C_fa
zK;4@GK#A>F1p;E64S~Jh3OxAJ2QYYWzl$;u=naH`-f&(`(F-Pxd<1~4qHn_Sk|y^F
z`5*v+Lz2pA6ZEtfBmgK3USM7$Ya4CM6vt#JFj|h%up_B3Atah?2uM#~v<+TT(jpM-
z4Xj5>ebC9|y&wT7$x!Xz2))pHUICavYSgc}$6&HuYm@w`_*MxhvN7a=VBX^MlruvW
zfVBdmB4aStbHplVtvgFp_yJr48)3+{KoINOB+OH6Q%?>I!(nK5081rj<-GMpH6Tk#
z(*2N*AVTj-j|xv%d53M1<-I24g$C3jFUe{sQXU2q@o50Y_swR^k0p-qc2$srK>tD%npkX}$fr(h!N-F$P3GzL(*p-svIL9F!#
zLa2qDSDH%z$Sdl6tXUBAQ5WtKg5PWAnlNH@f&X0AhtGmbVrYX)y?h?+9Ts9MY#4T-h~zI{qx^8%P+sGWnEv)cf`p1Q;8q3R=krEn165duW-l&kdBIT)SY1^~*9C87Hgd_(BL
zfJk_f@uP5B-5Z80CEc+n6azpjwEc{nV}>ppq8JRc&0C1F1!BqAmP7<8ZTVjj0%9fSSKtL$M?ZjFt
zG<+iuE$9t|(ESgY^7LIv5`b{)(-1;2;-N3(!^OL0M-$6nuBD@hYP~^nHNaeGfYERS
zd#GHZN^V+-VGJPNuQ*;kNiK*Mn{Y+F!G=!O9srS6av-EQBLF2C%T2?35L!I0)2AQm
z)F$_JX%w4}F~$f$y!{i76wQVZjQ`X6LL}_Awu&dIwc>o`M}HoIU_g@PFz`13fJ_Gu
zmwjx0!hFWI*=d~v3bzKL#juh)GSJr(;9jVkBHdhxG_8R6bO3-iU`UL=2mTb@bjIw{
zCGMluDGIMxl|+-n%f#ikUwu6%Jwlro?y)SA5e5)YhxH^g0CF>0cf9tLFMVszQQ`3A
z>&4atYa7K1g(kKmX=OYJ3I%+miB&>S4*?A$+*m!(#}nm#O~83SUE&D`Z9EjQ@pgA0SXz1!r5DsDPpyC;K~J6ZhzS7MFN93z9CCd>cfb4|MS%fI0)k3T
zD_ZWEDG1>)c!xk<=$)F6#gs#SgimvhB1yAT7)LkFjU~!z|y!r
zI!F9af}IcAya0nnk#r{*UdaB?sZEPI(Eqy%SYtzv(ne9XaqL+Dh!_NxaAe{(iU~(8
zjFmJ)i+ClI3kB3;1Y=9#D5M+A4fHQIC&`<@wDVDB0Wd0^Ym
zHJN=J0ywNz3>qLMK#VW%0tM1)5QM;dpTE?E9zz&k4@+}70I0<5SUD{A>J>!q-~=!c
z3Z5;eMcx>mT9xHSAj`p79`qr-^!{2F!{q>kl5T|%+@u49Hz*K^t@VMU^%C4qangww
z&020@Ih;+>nU}AIKC2MO3T;rPrDzD|8UF;k>Y(
z=oA1H6~+k@#@3fCj@$U!&4#tsY8Aaz2brL3}H}2EuJ5o^@N;K?hXJ#
zhnD68{AJ!{a2a2lJ8)S8EP=h5|p$dQ({ec$359QxR@D;(vAlj9EAkFM0KD#OaXyso>
zjuwKypZI+&&klrdA?-jG-vQxj#UBBq7M@}
z#kgyn4uljhSH(gV0HzEOet1uy65hNX{=DRGH2`LUOwr}6`|<)lV0Rb;1t>S!j&jinJ^xI#2R=xlLqnDXh?WdRJaYAe~B5kyJzqemgmO}xsK)&G0
zAqf@XojaLgjo(uI!^(a*0Ll#r9FhP*@ABph!Ii?}MUyo+&Q1Xkiw_VRK6*zlM<4a@
zR^P9|sQ_Ze7X@)ztB*SH_z?iin065mLHJ|Gde(Q&J_;ZfXb3{jm?xs>{0GMz>v0`R
zbMEmH0AiIrh*z8^;-tNYIP?Kih~0i%^jKdWF9m=FiUt^1IT?&7nu=(EqUV3?>?}U&!jm?Gx^xJ+SQkqIcyWB
zxO3KOZqv=!=v&O8otWV0+K-L&!q#+XK9{4>9`*Q7#&cO}pf+jBS?P?v-umQpQM>g)pZK8>BiC{`O>>G*IBL4$TBtd37?b)(oFe7H
ze5yZ(ZRc8l--#FbSpyr_*r&gAA?75G>%x?uY|g)pS6H$!o}4GVZ8%&bhIF9MI-Xz{
z9?uy0%XV?hv2Jx!2gf;{sJ(VRY%KbK*+>7j4u{G~m_sR8huX8o;
z(#yomy=TMq>2Jvqg8;_puQlm{sl1r~&aeP5aQK
z`%J#TX=@+xde?%wls|2%zfJc9+WEU!r208db!bdIv7N*bi+=LS;cAXP!aT#)&b_c{
zfyr-iqgLxXq%X`fG*|Dz5Z)<#C#reS53FJeO?@z?)Xjanl=i80PpzH$a$TedYkeOc=e*x9c`NGi
z`Ff^(b8bz0!2j)N_s-qWZk=1wmiW6OS|)^l;O^YBbFZ}PI9?t7Z)p+ubQkQhJlZ#R
zX0aiEU!>Sj;7{c5#!(Dw(65p*LmSQKJSzFo-Ee+B|v
zJpSH_^}uSV5A$DP%zA|Su}t*aVwv`U^3uk-^Y64C&o|GJn5R@WnLCLaLfM;ev4UY6mKSH&o#7KoyE_!sFS$07UM#!{Ao>IAt$>Q@oKtK
zZq|TvHf~5i>Z--3yyD1lYi$T;lWzlWN&hD9q5Q;QBc`4lZ^SL>)3i<>HsPc;a&gaf
zE`mSDYQnIVYr=}L)fupUu^--P`0-3`GV5)zwKdC2{vO=5v)7aRL}P}Rxzw~Zja4UF
z_++t(k5rI@RPvawYc#qK!e8jX5=hHZ@D^}P&Z1pX-_+$E!yH~xVu1UB@
z@KWO-ZgQ~Mx{T!IS+C((%(S0!aGcKd*yCzXhHz60>of$v$#*EPt;4zbBEGPAWBbJE
zQ4hVh{%wt`2VBvV;X2_N_Y7;?Ijqp`a5Zzs`whRpUi$rhxm|BR
zm5=VFbXSYgeOQ!VesunIhdYNC=l{IIg~tcngnY!>Zdrc6UH$P0nX^7Bx>k<)Ro_&a-dUtC}#54LDwY?AsRCPres6mO3z|R$|e&YQ`_jnXxy1
zo!?L5M~y*mf^!m2|L7x|%^Mo1gYnWI#+tX5cvgd5GxMxPX?z2&SwF#-FMV>4@GPJD
zxmfwj$~U#SSn_i|^|j-OTjaEA4nE8~&m%3?oW5TOT|6w9$%WDUjFrb
WL-dZrPtJXTwO8Kp(w8yM&iw;de>XY+
literal 0
HcmV?d00001
diff --git a/apps/landing/public/favicon.svg b/apps/landing/public/favicon.svg
index 3033405..70183f3 100644
--- a/apps/landing/public/favicon.svg
+++ b/apps/landing/public/favicon.svg
@@ -1,4 +1,5 @@
-
+
\ No newline at end of file
diff --git a/apps/landing/public/sounds/click-soft.wav b/apps/landing/public/sounds/click-soft.wav
new file mode 100644
index 0000000000000000000000000000000000000000..d621c0f8e96c8ee12ffa004ee9e429f92f3ab639
GIT binary patch
literal 2028
zcmWNSc~n)`6~_0u_r81I1U%q@3`$Tyj43!oYhzZeiXdV%7MEC!;BvxgNi;~Tic_LV
zYpT{^S+!uriY6LSS`Brm8pH_|aiC~a!~uNBgU91N-gM77yLX-c_W8c^+uz=Qoa_l1
z8E+JT>0@%z^OvoRw*UaqPQM(0aX$hGV1fB_R?fMiX#kpnzKo{vSqZ`Mk9u{P(z(B@
zZ|jm5Po5unnfy-Y`AiJ6q{PI=`{GaZZVQjq$E)Bt)Kb_yx>;@sbe#5Q$qzzT$F#?-
zkDC-d*is_p`~KLmrRDm|+E=-@{Z5J9(yo!rr_t+yeNHCS9rDguqXx=IQzDz+5)!O9Y@_qnNyAosk4skg%Q(2
zxgn7Z@_pSkwS94$slD5g?FA^+*N3dLwnwyu-wj@(bnp|NPDgcn?YqQ|g6_NiNI^A>
zwK&7qSnERb%m$sGuIM@FSZL3*k8;$xt<)xlnpRkbg*(HlLV}IYgiLjvd%I&~$J35%
zXRtSkuhzXb6kS3+xTosaN(Fb2P_{36H;qB$x-c{6fyF1m}My=vGeUCXIq$7B)
z*{+NcGHIvB=o;qyx3j?Q@@?f)q&$P&ye#;Kpc>hdqy6KfCtz
znEgB1GND=iwXxGwW4dY>CEp-n>=)myp6Tuj?pK~K0#A6pI9C~DoNcNx7VF_y=e_4YMgg+L82PPIq_0rU>YfREF`wS`5Aogip7+%RN?0BI
zBBslgN~_W&Uz41qfp@4C{uRCjzCZgLE)Y>Qa&yR$s46H!bu#+`lwI*
z+x+7K&1xJ!3%!O5?!_UClZ0RRHvE(Bw!2dr}y|^k}HC)QCF?IAq9&~u#<13
zpiT@F2ezu2Y&jk$r6QGf>e6+|(gGm^`tmGlR`&+fKr*#!bc;|c+N9CCYtmoD>*NyF
zu>LezZ4azfuh7kWBg_|C#2b=L8Yg*#VPrh6X5n|Fu@Ts3)U@D6vS)5cdeh?e($NoERWF-_Ex
z2{EJ*OL+-n^f4XERA$9bp_nWce465@&`2)BHZ0(OWsxkDeZ_M4QrrXO=E?BuSh?L#6f&Fo5{Xoahz&&fjlJ(gqp
z(qJcc@wI#$pUTU53O3*-h$fp!B{@LS$a#o>{?r;Ggj|yn)Zw=!YPgtS9?OA+c(E
zvtu?k@Nan$FXJL^!~Sp{25B#^C!dg3$c3BuG2Y|5`A&Y555_9YggO{X^2r>ML@vN^
z_#Ovh9Y4$~xP#BcCd`NDFoaCg*c^6gzuR`~gZ2Cjzr(G#Nu#d^8>Eo2TCyjw44k+M
zt=PzK@pk?ZmSddeaX^wbRUJ7CS?~xKphfHd1vla>yn!FVVQ@kWi6n1fHw=UeI2}XK
z&OQ8nT!$?<1uC@rAdP(!3LyxN;v@`3l?P)6mT2^OPz4>pp%qTRG;re{tsaRc?2q&C
z97buLi||%c)WHrI3D5BxOw;=BjiYb_KExE*2$!G
+
+
+ {filled ? null : }
+
+ );
+}
+
+function BearFace({ mood }: { mood: BearMood }) {
+ switch (mood) {
+ case "loading":
+ return (
+ <>
+
+
+
+
+
+
+
+ >
+ );
+ case "sad":
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+ >
+ );
+ case "empty":
+ return (
+ <>
+
+
+
+
+
+
+ >
+ );
+ case "lost":
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+ >
+ );
+ case "hungry":
+ return (
+ <>
+
+
+
+
+
+
+
+ >
+ );
+ case "happy":
+ return (
+ <>
+
+
+
+
+
+
+
+ >
+ );
+ default: {
+ const exhaustiveMood: never = mood;
+ return exhaustiveMood;
+ }
+ }
+}
+
+export function BearMascot({ mood, className = "", spin }: BearMascotProps) {
+ const shouldSpin = spin ?? mood === "loading";
+
+ return (
+
+
+
+ );
+}
+
+export type { BearMood };
diff --git a/apps/landing/src/components/CopyCommand.tsx b/apps/landing/src/components/CopyCommand.tsx
new file mode 100644
index 0000000..953ca3d
--- /dev/null
+++ b/apps/landing/src/components/CopyCommand.tsx
@@ -0,0 +1,110 @@
+import { useEffect, useRef, useState } from "react";
+
+type CopyCommandProps = {
+ command: string;
+};
+
+function CopyIcon() {
+ return (
+
+ );
+}
+
+function CheckIcon() {
+ return (
+
+ );
+}
+
+async function copyText(text: string): Promise {
+ if (navigator.clipboard?.writeText) {
+ try {
+ await navigator.clipboard.writeText(text);
+ return true;
+ } catch {
+ // Fall through to execCommand.
+ }
+ }
+
+ try {
+ const textarea = document.createElement("textarea");
+ textarea.value = text;
+ textarea.setAttribute("readonly", "");
+ textarea.style.position = "fixed";
+ textarea.style.left = "-9999px";
+ document.body.appendChild(textarea);
+ textarea.select();
+ const ok = document.execCommand("copy");
+ document.body.removeChild(textarea);
+ return ok;
+ } catch {
+ return false;
+ }
+}
+
+export function CopyCommand({ command }: CopyCommandProps) {
+ const [copied, setCopied] = useState(false);
+ const timeoutRef = useRef(undefined);
+
+ useEffect(() => {
+ return () => {
+ window.clearTimeout(timeoutRef.current);
+ };
+ }, []);
+
+ async function copy() {
+ const ok = await copyText(command);
+ if (!ok) {
+ return;
+ }
+ setCopied(true);
+ window.clearTimeout(timeoutRef.current);
+ timeoutRef.current = window.setTimeout(() => {
+ setCopied(false);
+ }, 2000);
+ }
+
+ return (
+
+ );
+}
diff --git a/apps/landing/src/components/HeroCode.astro b/apps/landing/src/components/HeroCode.astro
index 6af0ec0..e677cd7 100644
--- a/apps/landing/src/components/HeroCode.astro
+++ b/apps/landing/src/components/HeroCode.astro
@@ -1,14 +1,20 @@
---
-// One sample: incomplete match + the tsc miss. No getUiState dump.
+// Same screen as NestedTernary, with empty on the chain.
---
ui.match("pending", () => <Loading />)
- .match("error", () => <Error />)
- .match("default", ({ book }) => <Book book={book} />)
- .exhaustive()
- ~~~~~~~~~~
+ class="h-full min-h-60 w-full min-w-0 flex-1 overflow-x-auto rounded-lg border border-line bg-code p-4 font-mono text-[13px] leading-6 text-paper sm:text-sm"
+>const ui = getUiState((set) => {
+ if (query.isPending) return set("pending");
+ if (query.isError) return set("error");
+ if (!query.data) return set("empty");
+ return set("default", { bear: query.data });
+});
-error TS2349
-Type 'Unmatched<"empty">' has no call signatures.
+ui.match("pending", () => <Loading />)
+ .match("error", () => <Error />)
+ .match("empty", () => <Empty />)
+ .match("default", ({ bear }) => (
+ <Bear bear={bear} />
+ ))
+ .exhaustive()
diff --git a/apps/landing/src/components/NestedTernary.astro b/apps/landing/src/components/NestedTernary.astro
index 55dccbf..0fe430f 100644
--- a/apps/landing/src/components/NestedTernary.astro
+++ b/apps/landing/src/components/NestedTernary.astro
@@ -1,13 +1,20 @@
---
-// Nested ternaries still typecheck when empty is missing.
+// Nested ternaries still typecheck when a later status is missing.
---
return isPending ? (
+ class="h-full min-h-60 w-full min-w-0 flex-1 overflow-x-auto rounded-lg border border-line bg-paper p-4 font-mono text-[13px] leading-6 text-ink-soft sm:text-sm"
+>const isPending = query.isPending;
+const isError = query.isError;
+const data = query.data;
+const isEmpty = !data;
+
+return isPending ? (
<Loading />
) : isError ? (
<Error />
+) : isEmpty ? (
+ <Empty />
) : data ? (
- <Book book={data} />
+ <Bear bear={data} />
) : null;
diff --git a/apps/landing/src/components/OptionWheel.tsx b/apps/landing/src/components/OptionWheel.tsx
new file mode 100644
index 0000000..4b769b2
--- /dev/null
+++ b/apps/landing/src/components/OptionWheel.tsx
@@ -0,0 +1,391 @@
+import {
+ useCallback,
+ useEffect,
+ useRef,
+ useState,
+ type CSSProperties,
+ type KeyboardEvent,
+ type PointerEvent,
+} from "react";
+
+type Side = "left" | "right";
+
+export interface OptionWheelProps {
+ items?: string[];
+ defaultSelected?: number;
+ onChange?: (index: number, item: string) => void;
+ textColor?: string;
+ activeColor?: string;
+ side?: Side;
+ fontSize?: number;
+ spacing?: number;
+ curve?: number;
+ tilt?: number;
+ blur?: number;
+ fade?: number;
+ minOpacity?: number;
+ smoothing?: number;
+ inset?: number;
+ loop?: boolean;
+ draggable?: boolean;
+ soundUrl?: string;
+ soundVolume?: number;
+ className?: string;
+}
+
+interface WheelConfig {
+ count: number;
+ items: string[];
+ rowH: number;
+ curve: number;
+ tilt: number;
+ blur: number;
+ fade: number;
+ minOpacity: number;
+ side: Side;
+ loop: boolean;
+ smoothing: number;
+ draggable: boolean;
+ soundUrl: string;
+ soundVolume: number;
+}
+
+const DEFAULT_ITEMS = [
+ "Ambient",
+ "House",
+ "Techno",
+ "Jazz",
+ "Lo-Fi",
+ "Synthwave",
+ "Trance",
+ "Funk",
+ "Disco",
+ "Hip-Hop",
+ "Chillwave",
+ "Drum & Bass",
+];
+
+const OptionWheel = ({
+ items = DEFAULT_ITEMS,
+ defaultSelected = 3,
+ onChange,
+ textColor = "#a6a6a6",
+ activeColor = "#ffffff",
+ side = "left",
+ fontSize = 3,
+ spacing = 1.4,
+ curve = 1,
+ tilt = 6,
+ blur = 2,
+ fade = 0.25,
+ minOpacity = 0.05,
+ smoothing = 200,
+ inset = 80,
+ loop = false,
+ draggable = true,
+ soundUrl = "",
+ soundVolume = 0.5,
+ className = "",
+}: OptionWheelProps) => {
+ const rootRef = useRef(null);
+ const itemRefs = useRef<(HTMLDivElement | null)[]>([]);
+ const posRef = useRef(defaultSelected);
+ const targetRef = useRef(defaultSelected);
+ const rafRef = useRef(null);
+ const lastRef = useRef(0);
+ const cfgRef = useRef({} as WheelConfig);
+ const onChangeRef = useRef(onChange);
+ const selectedRef = useRef(defaultSelected);
+ const wheelTimerRef = useRef | null>(null);
+ const dragRef = useRef<{ y: number; start: number; id: number } | null>(null);
+ const dragMovedRef = useRef(false);
+ const audioRef = useRef(null);
+ const audioUrlRef = useRef("");
+ const lastTickRef = useRef(0);
+ const [selectedIndex, setSelectedIndex] = useState(defaultSelected);
+ const [isDragging, setIsDragging] = useState(false);
+
+ const remPx =
+ typeof window !== "undefined"
+ ? parseFloat(getComputedStyle(document.documentElement).fontSize) || 16
+ : 16;
+
+ onChangeRef.current = onChange;
+ cfgRef.current = {
+ count: items.length,
+ items,
+ rowH: Math.max(fontSize * spacing * remPx, 1),
+ curve,
+ tilt,
+ blur,
+ fade,
+ minOpacity,
+ side,
+ loop,
+ smoothing,
+ draggable,
+ soundUrl,
+ soundVolume,
+ };
+
+ // Single rAF loop that eases the wheel position toward its target with
+ // frame-rate independent exponential smoothing, then lays every option out
+ // along the curve based on its distance from the current position.
+ const runFrame = useCallback((now: number) => {
+ const dt = Math.min((now - lastRef.current) / 1000, 0.05);
+ lastRef.current = now;
+ const cfg = cfgRef.current;
+ const tau = Math.max(cfg.smoothing, 1) / 1000;
+ const k = 1 - Math.exp(-dt / tau);
+
+ const target = targetRef.current;
+ const cur = posRef.current;
+ let next = cur + (target - cur) * k;
+ const settled = Math.abs(target - next) < 0.001;
+ if (settled) next = target;
+ posRef.current = next;
+
+ const els = itemRefs.current;
+ const n = cfg.count;
+ const mirror = cfg.side === "right" ? -1 : 1;
+ // Options sit on a circle whose radius keeps the arc length between two
+ // neighbors equal to one row height, so tilt controls how tightly it curls.
+ const tiltRad = (cfg.tilt * Math.PI) / 180;
+ const R = tiltRad > 0.0005 ? cfg.rowH / tiltRad : 0;
+ for (let i = 0; i < n; i++) {
+ const el = els[i];
+ if (!el) continue;
+ let d = i - next;
+ if (cfg.loop && n > 1) {
+ d = ((d % n) + n) % n;
+ if (d > n / 2) d -= n;
+ }
+ const dist = Math.abs(d);
+ let x = 0;
+ let y = d * cfg.rowH;
+ let rot = 0;
+ if (R > 0) {
+ const ang = Math.max(-Math.PI / 2, Math.min(Math.PI / 2, d * tiltRad));
+ y = R * Math.sin(ang);
+ x = -mirror * R * (1 - Math.cos(ang)) * cfg.curve;
+ rot = (mirror * ang * 180) / Math.PI;
+ }
+ el.style.transform = `translate(${x.toFixed(2)}px, calc(${y.toFixed(2)}px - 50%)) rotate(${rot.toFixed(3)}deg)`;
+ el.style.opacity = String(Math.max(cfg.minOpacity, 1 - dist * cfg.fade));
+ el.style.filter =
+ cfg.blur > 0 ? `blur(${(dist * cfg.blur).toFixed(2)}px)` : "none";
+ el.style.setProperty(
+ "--ow-p",
+ Math.max(0, 1 - Math.min(dist, 1)).toFixed(4),
+ );
+ }
+
+ rafRef.current = settled ? null : requestAnimationFrame(runFrame);
+ }, []);
+
+ const startLoop = useCallback(() => {
+ if (rafRef.current != null) {
+ cancelAnimationFrame(rafRef.current);
+ }
+ lastRef.current = performance.now();
+ rafRef.current = requestAnimationFrame(runFrame);
+ }, [runFrame]);
+
+ // Optional tick on selection change, throttled so fast scrolling can't spam
+ // it, and with playback failures (e.g. autoplay policies) silently ignored.
+ const playTick = useCallback(() => {
+ const { soundUrl: url, soundVolume: volume } = cfgRef.current;
+ if (!url) return;
+ const now = performance.now();
+ if (now - lastTickRef.current < 70) return;
+ lastTickRef.current = now;
+ if (!audioRef.current || audioUrlRef.current !== url) {
+ audioRef.current = new Audio(url);
+ audioRef.current.preload = "auto";
+ audioUrlRef.current = url;
+ }
+ const audio = audioRef.current;
+ audio.volume = Math.min(Math.max(volume, 0), 1);
+ audio.currentTime = 0;
+ audio.play()?.catch(() => {});
+ }, []);
+
+ const applyTarget = useCallback(
+ (value: number, snap: boolean) => {
+ const cfg = cfgRef.current;
+ let v = value;
+ if (!cfg.loop) v = Math.min(Math.max(v, 0), Math.max(cfg.count - 1, 0));
+ if (snap) v = Math.round(v);
+ targetRef.current = v;
+ const idx = ((Math.round(v) % cfg.count) + cfg.count) % cfg.count;
+ const item = cfg.items[idx];
+ if (idx !== selectedRef.current && item !== undefined) {
+ selectedRef.current = idx;
+ setSelectedIndex(idx);
+ onChangeRef.current?.(idx, item);
+ playTick();
+ }
+ startLoop();
+ },
+ [startLoop, playTick],
+ );
+
+ // Wheel / touchpad scrolling, registered manually so it can be non-passive.
+ useEffect(() => {
+ const el = rootRef.current;
+ if (!el) {
+ return () => {};
+ }
+ const onWheel = (e: WheelEvent) => {
+ e.preventDefault();
+ const cfg = cfgRef.current;
+ const delta = e.deltaMode === 1 ? e.deltaY * 24 : e.deltaY;
+ // Cap each event at one step so notchy mouse wheels move exactly one
+ // option per click, while touchpads still scroll continuously.
+ const step = Math.max(-1, Math.min(1, delta / cfg.rowH));
+ applyTarget(targetRef.current + step, false);
+ if (wheelTimerRef.current) clearTimeout(wheelTimerRef.current);
+ wheelTimerRef.current = setTimeout(
+ () => applyTarget(targetRef.current, true),
+ 140,
+ );
+ };
+ el.addEventListener("wheel", onWheel, { passive: false });
+ return () => {
+ el.removeEventListener("wheel", onWheel);
+ if (wheelTimerRef.current) clearTimeout(wheelTimerRef.current);
+ };
+ }, [applyTarget]);
+
+ const handlePointerDown = useCallback((e: PointerEvent) => {
+ if (!cfgRef.current.draggable) return;
+ dragRef.current = {
+ y: e.clientY,
+ start: targetRef.current,
+ id: e.pointerId,
+ };
+ dragMovedRef.current = false;
+ setIsDragging(true);
+ }, []);
+
+ const handlePointerMove = useCallback(
+ (e: PointerEvent) => {
+ const drag = dragRef.current;
+ if (!drag) return;
+ const dy = e.clientY - drag.y;
+ if (!dragMovedRef.current && Math.abs(dy) > 4) {
+ dragMovedRef.current = true;
+ // Capture only once a real drag starts, so plain clicks still reach
+ // the items and navigate to them.
+ rootRef.current?.setPointerCapture(drag.id);
+ }
+ if (dragMovedRef.current)
+ applyTarget(drag.start - dy / cfgRef.current.rowH, false);
+ },
+ [applyTarget],
+ );
+
+ const handlePointerEnd = useCallback(() => {
+ if (!dragRef.current) return;
+ dragRef.current = null;
+ setIsDragging(false);
+ if (dragMovedRef.current) applyTarget(targetRef.current, true);
+ }, [applyTarget]);
+
+ const handleItemClick = useCallback(
+ (index: number) => {
+ if (dragMovedRef.current) return;
+ const cfg = cfgRef.current;
+ const cur = targetRef.current;
+ let d = index - (((cur % cfg.count) + cfg.count) % cfg.count);
+ if (cfg.loop && cfg.count > 1) {
+ if (d > cfg.count / 2) d -= cfg.count;
+ else if (d < -cfg.count / 2) d += cfg.count;
+ }
+ applyTarget(cur + d, true);
+ },
+ [applyTarget],
+ );
+
+ const handleKeyDown = useCallback(
+ (e: KeyboardEvent) => {
+ let delta: number | null = null;
+ if (e.key === "ArrowUp" || e.key === "ArrowLeft") delta = -1;
+ else if (e.key === "ArrowDown" || e.key === "ArrowRight") delta = 1;
+ if (delta == null) return;
+ e.preventDefault();
+ applyTarget(Math.round(targetRef.current) + delta, true);
+ },
+ [applyTarget],
+ );
+
+ useEffect(() => {
+ applyTarget(targetRef.current, false);
+ }, [
+ items,
+ fontSize,
+ spacing,
+ curve,
+ tilt,
+ blur,
+ fade,
+ minOpacity,
+ side,
+ loop,
+ smoothing,
+ applyTarget,
+ ]);
+
+ useEffect(
+ () => () => {
+ if (rafRef.current != null) cancelAnimationFrame(rafRef.current);
+ rafRef.current = null;
+ audioRef.current?.pause();
+ },
+ [],
+ );
+
+ return (
+
+ {items.map((label, index) => (
+ {
+ itemRefs.current[index] = el;
+ }}
+ role="option"
+ aria-selected={selectedIndex === index}
+ className={`absolute top-1/2 cursor-pointer whitespace-nowrap leading-none will-change-[transform,opacity,filter] [font-size:var(--ow-font-size)] text-[color-mix(in_srgb,var(--ow-active-color)_calc(var(--ow-p,0)*100%),var(--ow-text-color))] ${
+ side === "right"
+ ? "right-(--ow-inset) origin-right"
+ : "left-(--ow-inset) origin-left"
+ } ${selectedIndex === index ? "font-medium" : "font-normal"}`}
+ onClick={() => handleItemClick(index)}
+ >
+ {label}
+
+ ))}
+
+ );
+};
+
+export default OptionWheel;
diff --git a/apps/landing/src/components/StateDemo.tsx b/apps/landing/src/components/StateDemo.tsx
index ed03bd1..63edebc 100644
--- a/apps/landing/src/components/StateDemo.tsx
+++ b/apps/landing/src/components/StateDemo.tsx
@@ -1,37 +1,22 @@
import { useMemo, useState } from "react";
import { getUiState } from "@bearstudio/ui-state";
+import { BearMascot, type BearMood } from "./BearMascot";
+import OptionWheel from "./OptionWheel";
-type DemoStatus =
- | "pending"
- | "error"
- | "empty"
- | "not-found"
- | "show-input"
- | "success";
+type DemoStatus = "pending" | "error" | "empty" | "not-found" | "success";
-type Book = {
- title: string;
- author: string;
-};
-
-const DEMO_BOOK: Book = {
- title: "The Left Hand of Darkness",
- author: "Ursula K. Le Guin",
-};
-
-const STATUSES: ReadonlyArray<{ id: DemoStatus; label: string }> = [
- { id: "pending", label: "pending" },
- { id: "error", label: "error" },
- { id: "empty", label: "empty" },
- { id: "not-found", label: "not-found" },
- { id: "show-input", label: "show-input" },
- { id: "success", label: "default" },
+const STATUSES: ReadonlyArray<{
+ id: DemoStatus;
+ label: string;
+ mood: BearMood;
+}> = [
+ { id: "pending", label: "loading bear", mood: "loading" },
+ { id: "error", label: "sad bear", mood: "sad" },
+ { id: "empty", label: "empty bear", mood: "empty" },
+ { id: "not-found", label: "lost bear", mood: "lost" },
+ { id: "success", label: "happy bear", mood: "happy" },
];
-const ITEM_PX = 44;
-const WINDOW = 5;
-const PAD = 2;
-
function isDemoStatus(value: string): value is DemoStatus {
return STATUSES.some((item) => item.id === value);
}
@@ -55,62 +40,14 @@ export function StateDemo() {
if (status === "not-found") {
return set("not-found");
}
- if (status === "show-input") {
- return set("show-input");
- }
- return set("default", { book: DEMO_BOOK });
+ return set("default");
}),
[status],
);
- function step(delta: number) {
- const next = Math.min(
- STATUSES.length - 1,
- Math.max(0, selectedIndex + delta),
- );
- const item = STATUSES[next];
- if (item) {
- setStatus(item.id);
- }
- }
-
- const view = ui
- .match("pending", () => (
-
- pending
-
-
-
- ))
- .match("error", () => (
- Could not load the book.
- ))
- .match("empty", () => (
- No books on this shelf.
- ))
- .match("not-found", () => (
- That book is not in the catalogue.
- ))
- .match("show-input", () => (
-
- ))
- .match("default", ({ book }) => (
-
- {book.title}
- {book.author}
-
- ))
- .exhaustive();
-
return (
-
-