diff --git a/.githooks/pre-commit b/.githooks/pre-commit index c6ae8da1..f0c040b2 100755 --- a/.githooks/pre-commit +++ b/.githooks/pre-commit @@ -80,16 +80,16 @@ if [ -n "$CMD_FORMAT" ]; then git add -u fi -# --- Sync pnpm lockfiles for Railway (if package.json changed) --- -if git diff --cached --name-only | grep -q 'package.json'; then - for app in apps/homepage apps/dashboard; do - if [ -f "$app/pnpm-lock.yaml" ]; then - echo "→ Syncing $app/pnpm-lock.yaml" - (cd "$app" && COREPACK_ENABLE_PROJECT_SPEC=0 pnpm install --no-frozen-lockfile --silent 2>/dev/null) - git add "$app/pnpm-lock.yaml" - fi - done -fi +# --- Sync pnpm lockfiles for apps with a staged own manifest --- +while IFS= read -r lockfile; do + [ -f "$lockfile" ] || continue + app="${lockfile%/pnpm-lock.yaml}" + if git diff --cached --name-only -- "$app/package.json" \ + | grep -Fxq "$app/package.json"; then + (cd "$app" && COREPACK_ENABLE_PROJECT_SPEC=0 pnpm install --no-frozen-lockfile --silent) + git add "$lockfile" + fi +done < <(printf '%s\n' apps/*/pnpm-lock.yaml) # --- Code quality: lint + build (all branches) --- if [ -n "$CMD_QUALITY" ]; then diff --git a/apps/dashboard/.env.example b/apps/dashboard/.env.example index cc9375fe..d7440778 100644 --- a/apps/dashboard/.env.example +++ b/apps/dashboard/.env.example @@ -1,5 +1,6 @@ -# API mode: "remote" (fetch from server) or "fixture" (use hardcoded data) -VITE_API_MODE=remote +# API mode is not used by the Receipt SDK journey; leave it unset/non-fixture. +# VITE_API_MODE=remote -# API base URL (defaults to Railway staging if not set) -# VITE_API_URL=http://localhost:8000 +# Required server-side API base URL for dashboard loaders and actions. +# There is no default destination. +# API_URL=http://127.0.0.1:8787 diff --git a/apps/dashboard/README.md b/apps/dashboard/README.md index 26033462..9ccb8266 100644 --- a/apps/dashboard/README.md +++ b/apps/dashboard/README.md @@ -6,94 +6,71 @@ Vektor dashboard web app built for internal team members of Vektorprogrammet. ### Programs needed to run project -- [node](https://nodejs.org/en) -- [pnpm](https://pnpm.io/) +- [Bun](https://bun.sh/) 1.3.10 +- [Node.js](https://nodejs.org/en) 22 or newer for tools that require Node + +The repository root is the package-manager and workspace authority. Run the +commands in this document from the repository root, not from `apps/dashboard`. ### Installation -Install the required external dependencies: +Install the workspace dependencies from the repository root: ```sh -pnpm install +bunx --bun bun@1.3.10 install ``` ### Run locally -Run the dev server: +Run the dashboard dev server through the root Turbo workspace: ```sh -pnpm dev +bun turbo -F @monoweb/dashboard dev ``` ### Linting and formatting -Check for linting errors and apply safe fixes: +Check the dashboard for linting errors and apply the repository's safe linting +workflow: ```sh -pnpm lint +bun turbo -F @monoweb/dashboard lint ``` -Check for formatting errors and apply safe fixes: +Format dashboard files from the repository root: ```sh -pnpm format +bun --cwd apps/dashboard run format ``` -Do both in one check: +Run the repository check: ```sh -pnpm check +bun run check ``` -### Testing - -Install required browsers for running e2e tests: +`bun run check` writes formatting with `oxfmt --write`; it is not a read-only +proof. -```sh -pnpm e2e:install -``` +### Type checking -Run all tests: +Run dashboard type generation and TypeScript checking from the repository root: ```sh -pnpm e2e:test +bun --cwd apps/dashboard run typecheck ``` -Use the `ui` flag to watch the tests: - -```sh -pnpm exec playwright test --ui -``` - -Run tests for individual browsers: - -| Google Chrome | Firefox | Safari | -| --- | --- | --- | -|`pnpm e2e:test:chromium`|`pnpm e2e:test:firefox`|`pnpm e2e:test:webkit`| - -Generate tests interactively: - -```sh -pnpm e2e:test:generate -``` +### Testing -Read more in the [docs](https://playwright.dev/docs/codegen). +The exact dashboard browser reachability command is intentionally not documented +yet. Wave 0 (W0) must first observe a Bun or explicit Node 22 Playwright +invocation that reaches a browser and exercises the SDK-backed login path. No +browser-install command is authoritative until W0 records the command that was +actually observed. ### Deployment -First, build your app for production: - -```sh -pnpm build -``` - -Then run the app in production mode: - -```sh -pnpm start -``` - -Now you'll need to pick a host to deploy it to. +Dashboard Railway configuration is retired by operator decision; provider/service state is unobserved; this README has no deployment command. ## File structure @@ -112,7 +89,7 @@ Now you'll need to pick a host to deploy it to. - `globals.css`: Style variables accessable throughout the whole app. Mainly configuration of Tailwind and CSS variables. - `root.tsx`: Root HTML rendered for ALL pages. Contains global metadata, styles and providers. - `routes.ts`: Routing declared through the React Router routes API. Check out the [docs](https://reactrouter.com/start/framework/routing) for an in-depth explanation of the API. - - `build/`: Build artifacts for deploying the app to servers + - `build/`: Build artifacts for the application - `public/`: Assets requiring no processing, clients download these files as is. ## Improve your workflow @@ -140,31 +117,17 @@ Read more about [Intellisense](https://code.visualstudio.com/docs/editor/intelli [`vitest.explorer`](https://marketplace.visualstudio.com/items?itemName=vitest.explorer) -#### Run and record e2e tests in VSCode +#### Run and record browser tests in VSCode [`ms-playwright.playwright`](https://marketplace.visualstudio.com/items?itemName=ms-playwright.playwright) #### Format files automatically -Install the official Biome extension [`biomejs.biome`](https://marketplace.visualstudio.com/items?itemName=biomejs.biome) - -Configure the VSCode workspace settings: - -```jsonc -// .vscode/settings.json -{ - // Set default formatter to Biome - "editor.defaultFormatter": "biomejs.biome", - // Format on save - "editor.formatOnSave": true, - // On save: - "editor.codeActionsOnSave": { - // add missing imports - "source.addMissingImports.ts": "always", - // organise imports - "source.organizeImports": "always" - }, -} +The repository uses Oxfmt for formatting. Run the root-authority command when +you want to write formatting, or configure an Oxfmt-compatible VSCode extension. + +```sh +bun --cwd apps/dashboard run format ``` ### Write HTML blazingly fast with Emmet @@ -212,18 +175,17 @@ When choosing what technologies to work with we evaluate: | Router/Meta-framework: | [React Router v7](https://reactrouter.com/dev/guides) | [expands our app over multiple pages](#react-router-expands-our-app-over-multiple-pages) | | Style system: | [Tailwind](https://tailwindcss.com/) | [simplifies styling and makes everything pretty](#tailwind-simplifies-styling-and-makes-everything-pretty) | | Icon library: | [Iconify](https://iconify.design/) | [does for icons what Tailwind did for CSS](#iconify-centralises-icons-and-eliminates-the-need-for-any-more-icon-dependencies) | -| Linter, Formatter: | [Biome](https://biomejs.dev/) | [eliminates bugs pre-emptively and keeps code consistent](#biome-eliminates-bugs-preemptively-and-keeps-code-consistent) | +| Linter, Formatter: | [Oxlint and Oxfmt](https://oxc.rs/) | [keep code consistent with fast repository tools](#oxlint-and-oxfmt-keep-code-consistent) | | Component collection: | [Shadcn/ui](https://ui.shadcn.com/) | [starts us off on the right foot](#shadcnui-starts-us-off-on-the-right-foot) | | Headless components: | [Radix UI](https://www.radix-ui.com/) | [provides functional and accessible primitives](#radix-primitives-provides-functional-and-accessible-primitives) | -| e2e test runner | [Playwright](https://playwright.dev/) | [makes sure everything works as intended](#playwright-makes-sure-everything-works-as-intended) -| Package manager: | [pnpm](https://pnpm.io/) | [reduces the black hole that is node_modules](#pnpm-reduces-the-black-hole-that-is-node_modules) | +| Browser test runner | [Playwright](https://playwright.dev/) | [provides controlled browser reachability evidence](#playwright-provides-controlled-browser-reachability-evidence) | +| Package manager: | [Bun](https://bun.sh/) 1.3.10 | Root Bun workspaces and Turbo tasks are the dashboard authority. | | All-in-one component library: | [Mantine](https://mantine.dev/) | [fills in the remaining holes](#mantine-fills-in-the-remaining-holes) | ### External Services | Use case | Official docs | Our reasoning | | --- | --- | --- | -| Deployment | [DigitalOcean](https://www.digitalocean.com/) | [provides an all-in-one hosting solution with predictable prices](#digitalocean-provides-an-all-in-one-hosting-solution-with-predictable-prices) | | Auth management | [Clerk](https://clerk.com/) | [makes setting up auth fast and secure](#clerk-makes-setting-up-auth-fast-and-secure) | | Analytics and Feature flags | [Posthog](https://posthog.com/) | [gives insight into our users behavior](#posthog-gives-insight-into-our-users-behavior) | @@ -273,13 +235,11 @@ It is incredibly efficient, only bundling the classes used within the applicatio It is included in NTNU's curriculum. -### Biome eliminates bugs preemptively and keeps code consistent +### Oxlint and Oxfmt keep code consistent -Biome was chosen over Prettier and ESlint because configuring ESlint -takes an ungodly amount of time.\ -ESlint might have extensible configuration, -but Biome ships with great defaults and incredible performance.\ -Using 1 tool for 2 problems also reduces the amount of packages we depend on, which reduces the surface area for attack and accidental bugs. +Oxlint and Oxfmt provide the repository's linting and formatting commands. +The root scripts keep those checks consistent across the workspace, while the +dashboard-specific Turbo and Bun commands make the intended scope explicit. ### Iconify centralises icons and eliminates the need for any more icon dependencies @@ -307,17 +267,21 @@ Radix Primitives adhere to the Radix Primitives is used in the component collection shadcn/ui provides.\ In house UI components should use Radix Primitives when possible. -### Playwright makes sure everything works as intended +### Playwright provides controlled browser reachability evidence -Playwright does e2e testing by running all tests in the different major browsers. -This is our most important way of testing as functionality is tested in the -same environment users interact with the application in. +Playwright is the browser test runner used for dashboard reachability work. +W0 must observe a real browser launch and SDK-backed login progress before an +exact dashboard invocation or browser-install command is documented here. -### pnpm reduces the black hole that is node_modules +### Bun and root Turbo define workspace authority -pnpm install and manages packages globally while reducing unnecessary -merge conflicts and providing a readable lock file when they eventually do happen. -pnpm is essentially npm but better at the cost of one character +Bun 1.3.10 is the repository's package-manager authority. The root workspace +owns dependency resolution, and Turbo scopes dashboard development tasks without +creating a second application-level authority. + +Use the root installation and task commands above. `bun run check` writes +formatting with `oxfmt --write`, so it is a mutating convenience command rather +than read-only proof. ### Mantine fills in the remaining holes @@ -331,14 +295,6 @@ a major disadvantage for why we might step away from it in the future.\ But as of now, it provides good general use defaults until a more specialised tool is needed. -### DigitalOcean provides an all-in-one hosting solution with predictable prices - -DigitalOcean might not have a generous free tier, -but it does have a platform for deploying web apps, -websites, web workers, serverless functions and managed databases at predictable prices. -Predictable prices makes sure our organisation doesn't overspend and -protects us from being billed by DDOS. - ### Clerk makes setting up auth fast and secure TODO diff --git a/apps/dashboard/app/components/receipts/DeleteReceiptDialog.tsx b/apps/dashboard/app/components/receipts/DeleteReceiptDialog.tsx index e096a407..7ee30e0e 100644 --- a/apps/dashboard/app/components/receipts/DeleteReceiptDialog.tsx +++ b/apps/dashboard/app/components/receipts/DeleteReceiptDialog.tsx @@ -10,6 +10,10 @@ import { } from "@/components/ui/alert-dialog"; import { useFetcher } from "react-router"; +type DeleteReceiptActionData = + | { success: true } + | { error: string }; + type Props = { open: boolean; onOpenChange: (open: boolean) => void; @@ -18,10 +22,13 @@ type Props = { // biome-ignore lint/style/noDefaultExport: component export export default function DeleteReceiptDialog({ open, onOpenChange, receiptId }: Props) { - const fetcher = useFetcher(); + const fetcher = useFetcher(); + const error = fetcher.data && "error" in fetcher.data ? fetcher.data.error : undefined; + const succeeded = fetcher.data !== undefined && "success" in fetcher.data; + const dialogOpen = open && fetcher.state === "idle" && !succeeded; return ( - + Slett utlegg @@ -29,15 +36,20 @@ export default function DeleteReceiptDialog({ open, onOpenChange, receiptId }: P Er du sikker? Utlegget vil bli slettet permanent. + {error && ( +

+ {error} +

+ )} Avbryt { + onClick={(event) => { + event.preventDefault(); fetcher.submit( { _intent: "delete", receiptId: String(receiptId) }, { method: "post" }, ); - onOpenChange(false); }} > Slett diff --git a/apps/dashboard/app/components/receipts/ReceiptFormDialog.tsx b/apps/dashboard/app/components/receipts/ReceiptFormDialog.tsx index a85505e1..21641a83 100644 --- a/apps/dashboard/app/components/receipts/ReceiptFormDialog.tsx +++ b/apps/dashboard/app/components/receipts/ReceiptFormDialog.tsx @@ -6,19 +6,13 @@ import { DialogHeader, DialogTitle, } from "@/components/ui/dialog"; +import type { ReceiptView } from "../../lib/receipt-view"; import { Form } from "react-router"; -type Receipt = { - id: number; - description: string; - sum: number; - receiptDate: string | null; -}; - type Props = { open: boolean; onOpenChange: (open: boolean) => void; - receipt?: Receipt; // undefined = create mode + receipt?: ReceiptView; // undefined = create mode error?: string; }; @@ -39,7 +33,9 @@ export default function ReceiptFormDialog({ open, onOpenChange, receipt, error }
{error && ( -

{error}

+

+ {error} +

)}
diff --git a/apps/dashboard/app/lib/api.server.ts b/apps/dashboard/app/lib/api.server.ts index 6c0c9629..14eb102f 100644 --- a/apps/dashboard/app/lib/api.server.ts +++ b/apps/dashboard/app/lib/api.server.ts @@ -1,6 +1,10 @@ -import { createClient } from "@vektorprogrammet/sdk" -import { apiUrl } from "@vektorprogrammet/sdk" +import { createClient, type ClientOptions } from "@vektorprogrammet/sdk"; -export function createAuthenticatedClient(token: string) { - return createClient(apiUrl, { auth: token }) +export type AuthOption = NonNullable; + +const serverApiUrl = + typeof process !== "undefined" ? process.env?.API_URL : undefined; + +export function createAuthenticatedClient(auth: AuthOption) { + return createClient(serverApiUrl, { auth }); } diff --git a/apps/dashboard/app/lib/receipt-view.ts b/apps/dashboard/app/lib/receipt-view.ts new file mode 100644 index 00000000..50a84ca8 --- /dev/null +++ b/apps/dashboard/app/lib/receipt-view.ts @@ -0,0 +1,120 @@ +import { + ConflictError, + ConfigurationError, + NetworkError, + NotFoundError, + RateLimitedError, + SdkError, + UnauthorizedError, + ValidationError, +} from "@vektorprogrammet/sdk"; +import type { AdminReceipt, Receipt } from "@vektorprogrammet/sdk"; + +export type ReceiptStatus = Receipt["status"]; + +export type ReceiptView = { + id: number; + visualId: string; + description: string; + sum: number; + receiptDate: string | null; + submitDate: string | null; + status: ReceiptStatus; + refundDate: string | null; +}; + +export type AdminReceiptView = { + id: number; + visualId: string; + userName: string; + description: string; + sum: number; + receiptDate: string | null; + submitDate: string | null; + status: ReceiptStatus; + refundDate: string | null; +}; + +const statusLabels: Record = { + pending: "Venter", + refunded: "Refundert", + rejected: "Avvist", +}; + +function toStableDate(date: Date | null): string | null { + if (date === null || Number.isNaN(date.getTime())) return null; + return date.toISOString().slice(0, 10); +} + +export function mapReceiptView(receipt: Receipt): ReceiptView { + return { + id: receipt.id, + visualId: receipt.visualId, + description: receipt.description, + sum: receipt.sum, + receiptDate: toStableDate(receipt.receiptDate), + submitDate: toStableDate(receipt.submitDate), + status: receipt.status, + refundDate: toStableDate(receipt.refundDate), + }; +} + +export function mapAdminReceiptView(receipt: AdminReceipt): AdminReceiptView { + return { + id: receipt.id, + visualId: receipt.visualId, + userName: receipt.userName, + description: receipt.description, + sum: receipt.sum, + receiptDate: toStableDate(receipt.receiptDate), + submitDate: toStableDate(receipt.submitDate), + status: receipt.status, + refundDate: toStableDate(receipt.refundDate), + }; +} + +export function mapReceiptStatus(status: ReceiptStatus): string { + return statusLabels[status]; +} + +export function isUnauthorizedError(error: unknown): error is UnauthorizedError { + return ( + error instanceof UnauthorizedError || + (error instanceof SdkError && error.type === "unauthorized") + ); +} + +export function mapReceiptError(error: unknown): string { + if (error instanceof ConfigurationError) { + return "API-konfigurasjon mangler eller er ugyldig."; + } + + if (error instanceof ValidationError) { + const fields = Object.keys(error.fields); + return fields.length > 0 + ? `Kontroller feltene: ${fields.join(", ")}.` + : "Kontroller feltene og prøv igjen."; + } + + if (error instanceof ConflictError) { + return "Utlegget er endret et annet sted. Last inn siden på nytt og prøv igjen."; + } + + if (error instanceof NotFoundError) { + return "Utlegget ble ikke funnet."; + } + + if (error instanceof RateLimitedError) { + return "For mange forespørsler. Prøv igjen senere."; + } + + if (error instanceof NetworkError) { + return "Kunne ikke nå API-et. Prøv igjen senere."; + } + + if (error instanceof SdkError) { + return "Kunne ikke fullføre forespørselen."; + } + + return "Kunne ikke fullføre forespørselen."; +} diff --git a/apps/dashboard/app/routes/dashboard.mine-utlegg._index.tsx b/apps/dashboard/app/routes/dashboard.mine-utlegg._index.tsx index cc7988f0..b6427687 100644 --- a/apps/dashboard/app/routes/dashboard.mine-utlegg._index.tsx +++ b/apps/dashboard/app/routes/dashboard.mine-utlegg._index.tsx @@ -2,34 +2,82 @@ import DeleteReceiptDialog from "@/components/receipts/DeleteReceiptDialog"; import ReceiptFormDialog from "@/components/receipts/ReceiptFormDialog"; import { DataTable } from "@/components/data-table"; import { Button } from "@/components/ui/button"; +import type { ReceiptInput } from "@vektorprogrammet/sdk"; import type { ColumnDef } from "@tanstack/react-table"; -import { apiUrl, isFixtureMode } from "@vektorprogrammet/sdk"; +import { redirect, useActionData, useLoaderData } from "react-router"; import { useState } from "react"; -import { useActionData, useLoaderData } from "react-router"; +import { + isUnauthorizedError, + mapReceiptError, + mapReceiptStatus, + mapReceiptView, + type ReceiptStatus, + type ReceiptView, +} from "../lib/receipt-view"; import { createAuthenticatedClient } from "../lib/api.server"; import { requireAuth } from "../lib/auth.server"; import type { Route } from "./+types/dashboard.mine-utlegg._index"; -type Receipt = { - id: number; - visualId: string; - description: string; - sum: number; - receiptDate: string | null; - submitDate: string | null; - status: "pending" | "refunded" | "rejected"; - refundDate: string | null; +type ParseResult = { value: T } | { error: string }; + +type ParsedReceipt = { + input: ReceiptInput; + file?: File; }; -const mockReceipts: Receipt[] = [ - { id: 1, visualId: "1a2b3c", description: "Bussreise til skolen", sum: 150, receiptDate: "2025-01-10", submitDate: "2025-01-10", status: "pending", refundDate: null }, - { id: 2, visualId: "4d5e6f", description: "Materiell til undervisning", sum: 320, receiptDate: "2025-01-12", submitDate: "2025-01-12", status: "refunded", refundDate: "2025-02-01" }, - { id: 3, visualId: "7a8b9c", description: "Lunsj teamsamling", sum: 200, receiptDate: "2025-01-14", submitDate: "2025-01-14", status: "rejected", refundDate: null }, -]; +function readFormText(form: FormData, name: string): string | null { + const value = form.get(name); + return typeof value === "string" ? value : null; +} -export async function loader({ request }: Route.LoaderArgs) { - if (isFixtureMode) return { receipts: mockReceipts }; +function parseReceiptId(value: string | null): number | null { + if (value === null || !/^\d+$/.test(value)) return null; + const id = Number(value); + return Number.isSafeInteger(id) && id > 0 ? id : null; +} + +function parseReceiptForm(form: FormData, requireFile: boolean): ParseResult { + const descriptionValue = readFormText(form, "description"); + if (descriptionValue === null || descriptionValue.trim().length === 0) { + return { error: "Beskrivelse er påkrevd." }; + } + + const sumValue = readFormText(form, "sum"); + if (sumValue === null || sumValue.trim().length === 0) { + return { error: "Beløp må være et positivt tall." }; + } + const sum = Number(sumValue.trim()); + if (!Number.isFinite(sum) || sum <= 0) { + return { error: "Beløp må være et positivt tall." }; + } + + const receiptDate = readFormText(form, "receiptDate"); + if (receiptDate === null || !/^\d{4}-\d{2}-\d{2}$/.test(receiptDate)) { + return { error: "Dato må ha formatet YYYY-MM-DD." }; + } + + const fileValue = form.get("picture"); + if (fileValue !== null && !(fileValue instanceof File)) { + return { error: "Kvitteringsbilde må være en fil." }; + } + const file = fileValue instanceof File && fileValue.size > 0 ? fileValue : undefined; + if (requireFile && file === undefined) { + return { error: "Kvitteringsbilde er påkrevd." }; + } + return { + value: { + input: { + description: descriptionValue.trim(), + sum, + receiptDate, + }, + file, + }, + }; +} + +export async function loader({ request }: Route.LoaderArgs) { const token = requireAuth(request); const client = createAuthenticatedClient(token); const url = new URL(request.url); @@ -37,9 +85,11 @@ export async function loader({ request }: Route.LoaderArgs) { try { const result = await client.receipts.list(status ? { status } : undefined); - return { receipts: result.items as Receipt[] }; - } catch { - return { receipts: [] }; + return { receipts: result.items.map(mapReceiptView), error: undefined }; + } catch (error) { + if (isUnauthorizedError(error)) throw redirect("/login?expired=true"); + const receipts: ReceiptView[] = []; + return { receipts, error: mapReceiptError(error) }; } } @@ -47,64 +97,56 @@ export async function action({ request }: Route.ActionArgs) { const token = requireAuth(request); const client = createAuthenticatedClient(token); const form = await request.formData(); - const intent = form.get("_intent")?.toString(); + const intent = readFormText(form, "_intent"); if (intent === "delete") { - const id = form.get("receiptId")?.toString(); - if (!id) return { error: "Manglende ID" }; + const receiptId = parseReceiptId(readFormText(form, "receiptId")); + if (receiptId === null) return { error: "Manglende eller ugyldig ID." }; try { - await client.receipts.delete(Number(id)); + await client.receipts.delete(receiptId); return { success: true }; - } catch { - return { error: "Sletting feilet" }; + } catch (error) { + if (isUnauthorizedError(error)) throw redirect("/login?expired=true"); + return { error: mapReceiptError(error) }; } } if (intent === "create" || intent === "edit") { - const method = intent === "create" ? "POST" : "PUT"; - const id = form.get("receiptId")?.toString(); - const urlPath = intent === "create" - ? "/api/receipts" - : `/api/receipts/${id}`; - - const body = new FormData(); - body.append("description", form.get("description")?.toString() ?? ""); - body.append("sum", form.get("sum")?.toString() ?? ""); - const receiptDate = form.get("receiptDate")?.toString(); - if (receiptDate) body.append("receiptDate", receiptDate); - const file = form.get("picture"); - if (file instanceof File && file.size > 0) body.append("picture", file); - - const res = await fetch(`${apiUrl}${urlPath}`, { - method, - headers: { Authorization: `Bearer ${token}` }, - body, - }); - - if (!res.ok) return { error: "Lagring feilet" }; - return { success: true }; + const parsed = parseReceiptForm(form, intent === "create"); + if ("error" in parsed) return parsed; + + const receiptId = parseReceiptId(readFormText(form, "receiptId")); + + try { + if (intent === "create") { + await client.receipts.create(parsed.value.input, parsed.value.file); + } else { + if (receiptId === null) return { error: "Manglende eller ugyldig ID." }; + await client.receipts.update(receiptId, parsed.value.input, parsed.value.file); + } + return { success: true }; + } catch (error) { + if (isUnauthorizedError(error)) throw redirect("/login?expired=true"); + return { error: mapReceiptError(error) }; + } } - return { error: "Ukjent handling" }; + return { error: "Ukjent handling." }; } -const statusLabels: Record = { - pending: "Venter", - refunded: "Refundert", - rejected: "Avvist", -}; - -const statusColors: Record = { +const statusColors: Record = { pending: "bg-yellow-100 text-yellow-800", refunded: "bg-green-100 text-green-800", rejected: "bg-red-100 text-red-800", }; -function StatusBadge({ status }: { status: string }) { +function StatusBadge({ status }: { status: ReceiptStatus }) { return ( - - {statusLabels[status] ?? status} + + {mapReceiptStatus(status)} ); } @@ -114,8 +156,8 @@ function ActionsCell({ onEdit, onDelete, }: { - receipt: Receipt; - onEdit: (receipt: Receipt) => void; + receipt: ReceiptView; + onEdit: (receipt: ReceiptView) => void; onDelete: (id: number) => void; }) { if (receipt.status !== "pending") return null; @@ -137,29 +179,30 @@ const statusFilters = [ { value: "pending", label: "Venter" }, { value: "refunded", label: "Refundert" }, { value: "rejected", label: "Avvist" }, -] as const; +] satisfies Array<{ value: ReceiptStatus | null; label: string }>; // biome-ignore lint/style/noDefaultExport: Route Modules require default export export default function MineUtlegg() { - const { receipts } = useLoaderData(); + const loaderData = useLoaderData(); const actionData = useActionData(); + const { receipts } = loaderData; const [createOpen, setCreateOpen] = useState(false); - const [editReceipt, setEditReceipt] = useState(null); + const [editReceipt, setEditReceipt] = useState(null); const [deleteId, setDeleteId] = useState(null); - const [statusFilter, setStatusFilter] = useState(null); + const [statusFilter, setStatusFilter] = useState(null); const filteredReceipts = statusFilter - ? receipts.filter((r) => r.status === statusFilter) + ? receipts.filter((receipt) => receipt.status === statusFilter) : receipts; - const columns: ColumnDef[] = [ + const columns: ColumnDef[] = [ { accessorKey: "visualId", header: "ID" }, { accessorKey: "description", header: "Beskrivelse", cell: ({ row }) => ( - + {row.original.description} ), @@ -198,6 +241,7 @@ export default function MineUtlegg() { ]; const actionError = actionData && "error" in actionData ? actionData.error : undefined; + const loaderError = loaderData.error; return (
@@ -207,8 +251,16 @@ export default function MineUtlegg() {
+ {loaderError && ( +

+ {loaderError} +

+ )} + {actionError && ( -

{actionError}

+

+ {actionError} +

)}
@@ -224,7 +276,7 @@ export default function MineUtlegg() { ))}
- +
{ if (!open) setEditReceipt(null); }} + onOpenChange={(open) => { + if (!open) setEditReceipt(null); + }} receipt={editReceipt} error={actionError} /> )} - {deleteId !== null && ( + {deleteId !== null && receipts.some((receipt) => receipt.id === deleteId) && ( { if (!open) setDeleteId(null); }} + onOpenChange={(open) => { + if (!open) setDeleteId(null); + }} receiptId={deleteId} /> )} diff --git a/apps/dashboard/app/routes/dashboard.utlegg._index.tsx b/apps/dashboard/app/routes/dashboard.utlegg._index.tsx index ec706223..72daaa35 100644 --- a/apps/dashboard/app/routes/dashboard.utlegg._index.tsx +++ b/apps/dashboard/app/routes/dashboard.utlegg._index.tsx @@ -12,33 +12,41 @@ import { } from "@/components/ui/alert-dialog"; import { Button } from "@/components/ui/button"; import type { ColumnDef } from "@tanstack/react-table"; -import { isFixtureMode } from "@vektorprogrammet/sdk"; import { Check, RotateCcw, X } from "lucide-react"; -import { useFetcher, useLoaderData, useSearchParams } from "react-router"; +import { redirect, useFetcher, useLoaderData, useSearchParams } from "react-router"; +import type { ReactNode } from "react"; +import { + isUnauthorizedError, + mapAdminReceiptView, + mapReceiptError, + mapReceiptStatus, + type AdminReceiptView, + type ReceiptStatus, +} from "../lib/receipt-view"; import { createAuthenticatedClient } from "../lib/api.server"; import { requireAuth } from "../lib/auth.server"; import type { Route } from "./+types/dashboard.utlegg._index"; -type Receipt = { - id: number; - visualId: string; - userName: string; - description: string; - sum: number; - receiptDate: string; - submitDate: string | null; - status: "pending" | "refunded" | "rejected"; -}; +type AdminStatusActionData = + | { success: true } + | { error: string }; -const mockReceipts: Receipt[] = [ - { id: 1, visualId: "1a2b3c", userName: "Kari Nordmann", description: "Bussreise til skolen", sum: 150, receiptDate: "2025-01-10", submitDate: "2025-01-10", status: "pending" }, - { id: 2, visualId: "4d5e6f", userName: "Ola Hansen", description: "Materiell til undervisning", sum: 320, receiptDate: "2025-01-12", submitDate: "2025-01-12", status: "refunded" }, - { id: 3, visualId: "7a8b9c", userName: "Lise Berg", description: "Lunsj teamsamling", sum: 200, receiptDate: "2025-01-14", submitDate: "2025-01-14", status: "rejected" }, -]; +function readFormText(form: FormData, name: string): string | null { + const value = form.get(name); + return typeof value === "string" ? value : null; +} -export async function loader({ request }: Route.LoaderArgs) { - if (isFixtureMode) return { receipts: mockReceipts }; +function parseReceiptId(value: string | null): number | null { + if (value === null || !/^\d+$/.test(value)) return null; + const id = Number(value); + return Number.isSafeInteger(id) && id > 0 ? id : null; +} +function isReceiptStatus(value: string | null): value is ReceiptStatus { + return value === "pending" || value === "refunded" || value === "rejected"; +} + +export async function loader({ request }: Route.LoaderArgs) { const token = requireAuth(request); const client = createAuthenticatedClient(token); const url = new URL(request.url); @@ -46,9 +54,11 @@ export async function loader({ request }: Route.LoaderArgs) { try { const result = await client.admin.receipts.list(status ? { status } : undefined); - return { receipts: result.items as Receipt[] }; - } catch { - return { receipts: [] }; + return { receipts: result.items.map(mapAdminReceiptView), error: undefined }; + } catch (error) { + if (isUnauthorizedError(error)) throw redirect("/login?expired=true"); + const receipts: AdminReceiptView[] = []; + return { receipts, error: mapReceiptError(error) }; } } @@ -56,90 +66,102 @@ export async function action({ request }: Route.ActionArgs) { const token = requireAuth(request); const client = createAuthenticatedClient(token); const form = await request.formData(); + const receiptId = parseReceiptId(readFormText(form, "receiptId")); + const newStatus = readFormText(form, "status"); - const receiptId = form.get("receiptId")?.toString(); - const newStatus = form.get("status")?.toString(); - - if (!receiptId || !newStatus) { - return { error: "Manglende felt" }; + if (receiptId === null || !isReceiptStatus(newStatus)) { + return { error: "Manglende eller ugyldig felt." }; } try { if (newStatus === "refunded") { - await client.admin.receipts.approve(Number(receiptId)); + await client.admin.receipts.approve(receiptId); } else if (newStatus === "rejected") { - await client.admin.receipts.reject(Number(receiptId)); - } else if (newStatus === "pending") { - await client.admin.receipts.reopen(Number(receiptId)); + await client.admin.receipts.reject(receiptId); + } else { + await client.admin.receipts.reopen(receiptId); } return { success: true }; - } catch { - return { error: "Kunne ikke oppdatere status" }; + } catch (error) { + if (isUnauthorizedError(error)) throw redirect("/login?expired=true"); + return { error: mapReceiptError(error) }; } } -const statusLabels: Record = { - pending: "Venter", - refunded: "Refundert", - rejected: "Avvist", -}; -const statusColors: Record = { +const statusColors: Record = { pending: "bg-yellow-100 text-yellow-800", refunded: "bg-green-100 text-green-800", rejected: "bg-red-100 text-red-800", }; -function StatusBadge({ status }: { status: string }) { +function StatusBadge({ status }: { status: ReceiptStatus }) { return ( - - {statusLabels[status] ?? status} + + {mapReceiptStatus(status)} ); } -function StatusAction({ receiptId, newStatus, label, description, icon, variant }: { +function StatusAction({ + receiptId, + newStatus, + label, + description, + icon, + variant, +}: { receiptId: number; - newStatus: string; + newStatus: ReceiptStatus; label: string; description: string; - icon: React.ReactNode; + icon: ReactNode; variant?: "default" | "destructive" | "outline"; }) { - const fetcher = useFetcher(); + const fetcher = useFetcher(); + const error = fetcher.data && "error" in fetcher.data ? fetcher.data.error : undefined; return ( - - - - - - - {label} - {description} - - - Avbryt - { - fetcher.submit( - { receiptId: String(receiptId), status: newStatus }, - { method: "post" }, - ); - }} - > - {label} - - - - + <> + + + + + + + {label} + {description} + + + Avbryt + { + fetcher.submit( + { receiptId: String(receiptId), status: newStatus }, + { method: "post" }, + ); + }} + > + {label} + + + + + {error && ( +

+ {error} +

+ )} + ); } -function ActionsCell({ receipt }: { receipt: Receipt }) { +function ActionsCell({ receipt }: { receipt: AdminReceiptView }) { if (receipt.status === "pending") { return (
@@ -177,14 +199,14 @@ function ActionsCell({ receipt }: { receipt: Receipt }) { return null; } -const columns: ColumnDef[] = [ +const columns: ColumnDef[] = [ { accessorKey: "visualId", header: "ID" }, { accessorKey: "userName", header: "Bruker" }, { accessorKey: "description", header: "Beskrivelse", cell: ({ row }) => ( - + {row.original.description} ), @@ -194,8 +216,16 @@ const columns: ColumnDef[] = [ header: "Beløp", cell: ({ row }) => `${row.original.sum} kr`, }, - { accessorKey: "receiptDate", header: "Dato" }, - { accessorKey: "submitDate", header: "Innsendt" }, + { + accessorKey: "receiptDate", + header: "Dato", + cell: ({ row }) => row.original.receiptDate ?? "—", + }, + { + accessorKey: "submitDate", + header: "Innsendt", + cell: ({ row }) => row.original.submitDate ?? "—", + }, { accessorKey: "status", header: "Status", @@ -213,11 +243,12 @@ const statusFilters = [ { value: "pending", label: "Venter" }, { value: "refunded", label: "Refundert" }, { value: "rejected", label: "Avvist" }, -] as const; +] satisfies Array<{ value: ReceiptStatus | null; label: string }>; // biome-ignore lint/style/noDefaultExport: Route Modules require default export export default function Utlegg() { - const { receipts } = useLoaderData(); + const loaderData = useLoaderData(); + const { receipts } = loaderData; const [searchParams, setSearchParams] = useSearchParams(); const currentStatus = searchParams.get("status"); @@ -226,6 +257,12 @@ export default function Utlegg() {

Utlegg

+ {loaderData.error && ( +

+ {loaderData.error} +

+ )} +
{statusFilters.map((filter) => (
); diff --git a/apps/dashboard/e2e/fixtures/receipt-api.ts b/apps/dashboard/e2e/fixtures/receipt-api.ts new file mode 100644 index 00000000..0764e221 --- /dev/null +++ b/apps/dashboard/e2e/fixtures/receipt-api.ts @@ -0,0 +1,685 @@ +type BunReceiptServer = { + hostname: string; + port: number; + stop(): Promise; +}; + +declare const Bun: { + serve(options: { + hostname: string; + port: number; + fetch(request: Request): Response | Promise; + }): BunReceiptServer; +}; +type ReceiptStatus = "pending" | "refunded" | "rejected"; +type Operation = + | "profile" + | "personal-list" + | "personal-create" + | "personal-update" + | "personal-delete" + | "admin-list" + | "admin-status"; +type MalformedMode = "receipt-date" | "admin-shape" | "create-response"; + +type ReceiptWire = { + id: number; + visualId: string; + description: string; + sum: number; + receiptDate: string; + submitDate: string; + status: ReceiptStatus; + refundDate: string | null; +}; + +type AdminReceiptWire = { + id: number; + visualId: string; + description: string; + sum: number; + receiptDate: string; + submitDate: string; + status: ReceiptStatus; + refundDate: string | null; + userName: string; +}; + +type Fault = { + status?: number; + malformed?: MalformedMode; +}; + +type BodyShape = + | { kind: "empty" } + | { kind: "json"; keys: string[] } + | { kind: "multipart"; fields: string[]; filePresent: boolean }; + +type Evidence = { + method: string; + path: string; + query: Record; + selectedHeaders: { + authorization: "bearer" | "missing"; + contentType: string | null; + }; + bodyShape: BodyShape; + status: number; +}; + +const operations: Record = { + profile: true, + "personal-list": true, + "personal-create": true, + "personal-update": true, + "personal-delete": true, + "admin-list": true, + "admin-status": true, +}; +const malformedModes: Record = { + "receipt-date": true, + "admin-shape": true, + "create-response": true, +}; + +let personalReceipts: ReceiptWire[] = []; +let adminReceipts: AdminReceiptWire[] = []; +let faults = new Map(); +let evidence: Evidence[] = []; +let transitions: string[] = []; + +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null; +} + +function isOperation(value: string): value is Operation { + return value in operations; +} + +function isMalformedMode(value: string): value is MalformedMode { + return value in malformedModes; +} + +function resetState() { + personalReceipts = [ + { + id: 1, + visualId: "personal-1", + description: "Course travel", + sum: 75, + receiptDate: "2026-08-08T00:00:00.000Z", + submitDate: "2026-08-09T00:00:00.000Z", + status: "pending", + refundDate: null, + }, + ]; + adminReceipts = [ + { + id: 10, + visualId: "admin-10", + description: "Approval receipt", + sum: 150, + receiptDate: "2026-08-05T00:00:00.000Z", + submitDate: "2026-08-06T00:00:00.000Z", + status: "pending", + refundDate: null, + userName: "Kari Nordmann", + }, + { + id: 11, + visualId: "admin-11", + description: "Rejection receipt", + sum: 200, + receiptDate: "2026-08-06T00:00:00.000Z", + submitDate: "2026-08-07T00:00:00.000Z", + status: "pending", + refundDate: null, + userName: "Ola Hansen", + }, + { + id: 12, + visualId: "admin-12", + description: "Reopen receipt", + sum: 225, + receiptDate: "2026-08-07T00:00:00.000Z", + submitDate: "2026-08-08T00:00:00.000Z", + status: "rejected", + refundDate: null, + userName: "Lise Berg", + }, + { + id: 13, + visualId: "admin-13", + description: "Already refunded", + sum: 300, + receiptDate: "2026-08-04T00:00:00.000Z", + submitDate: "2026-08-05T00:00:00.000Z", + status: "refunded", + refundDate: "2026-08-09T00:00:00.000Z", + userName: "Per Hansen", + }, + ]; + faults = new Map(); + evidence = []; + transitions = []; +} + +function jsonResponse(body: unknown, status = 200): Response { + return new Response(JSON.stringify(body), { + status, + headers: { "content-type": "application/json" }, + }); +} + +function noContent(status = 204): Response { + return new Response(null, { status }); +} + +function queryValues(url: URL): Record { + const query: Record = {}; + url.searchParams.forEach((value, key) => { + query[key] = value; + }); + return query; +} + +function authKind(request: Request): "bearer" | "missing" { + return request.headers.get("authorization")?.startsWith("Bearer ") + ? "bearer" + : "missing"; +} + +function record( + request: Request, + url: URL, + bodyShape: BodyShape, + status: number, +): void { + evidence.push({ + method: request.method, + path: url.pathname, + query: queryValues(url), + selectedHeaders: { + authorization: authKind(request), + contentType: request.headers.get("content-type"), + }, + bodyShape, + status, + }); +} + +function unauthorized(request: Request, url: URL): Response | null { + if (authKind(request) === "bearer") return null; + record(request, url, { kind: "empty" }, 401); + return jsonResponse({ error: "unauthorized" }, 401); +} + +function malformedBody(operation: Operation, mode: MalformedMode): unknown { + if (operation === "personal-list" && mode === "receipt-date") { + return { + "hydra:member": [ + { + id: 1, + visualId: "malformed", + description: "Malformed receipt", + sum: 20, + receiptDate: "not-a-date", + submitDate: "2026-08-09T00:00:00.000Z", + status: "pending", + refundDate: null, + }, + ], + "hydra:totalItems": 1, + }; + } + + if (operation === "admin-list" && mode === "admin-shape") { + return { + "hydra:member": [ + { + id: 10, + visualId: "malformed-admin", + description: "Malformed admin receipt", + sum: 20, + receiptDate: "2026-08-09T00:00:00.000Z", + submitDate: "2026-08-09T00:00:00.000Z", + status: "pending", + }, + ], + "hydra:totalItems": 1, + }; + } + + return { id: "not-a-number" }; +} + +function faultResponse( + operation: Operation, + request: Request, + url: URL, +): Response | null { + const fault = faults.get(operation); + if (fault === undefined) return null; + + const status = fault.status ?? 200; + const body = fault.malformed + ? malformedBody(operation, fault.malformed) + : { error: "synthetic fault" }; + const bodyShape: BodyShape = { + kind: "json", + keys: isRecord(body) ? Object.keys(body).sort() : [], + }; + record(request, url, bodyShape, status); + return jsonResponse(body, status); +} + +function parseId(pathname: string, prefix: string): number | null { + const match = pathname.match(new RegExp(`^${prefix}/(\\d+)$`)); + if (match === null) return null; + const id = Number(match[1]); + return Number.isSafeInteger(id) && id > 0 ? id : null; +} + + +async function handleProfile(request: Request, url: URL): Promise { + const authFailure = unauthorized(request, url); + if (authFailure !== null) return authFailure; + const fault = faultResponse("profile", request, url); + if (fault !== null) return fault; + record(request, url, { kind: "empty" }, 200); + return jsonResponse({ + id: 7, + firstName: "Trace", + lastName: "User", + email: "trace@example.test", + phone: null, + department: "Trondheim", + fieldOfStudy: null, + profilePhoto: null, + }); +} + +async function handlePersonalList(request: Request, url: URL): Promise { + const authFailure = unauthorized(request, url); + if (authFailure !== null) return authFailure; + const fault = faultResponse("personal-list", request, url); + if (fault !== null) return fault; + + const status = url.searchParams.get("status"); + const rows = status === null + ? personalReceipts + : personalReceipts.filter((receipt) => receipt.status === status); + record(request, url, { kind: "empty" }, 200); + return jsonResponse({ + "hydra:member": rows, + "hydra:totalItems": rows.length, + }); +} + +async function parseMultipart(request: Request): Promise<{ + form: FormData | null; + bodyShape: Extract; +}> { + try { + const form = await request.formData(); + const fields: string[] = []; + let filePresent = false; + for (const [name, value] of form.entries()) { + fields.push(name); + if (name === "file" && value instanceof File && value.size > 0) { + filePresent = true; + } + } + return { + form, + bodyShape: { kind: "multipart", fields: fields.sort(), filePresent }, + }; + } catch { + return { + form: null, + bodyShape: { kind: "multipart", fields: [], filePresent: false }, + }; + } +} + +function updateReceiptFromForm(form: FormData, receipt: ReceiptWire): boolean { + const description = form.get("description"); + const sum = form.get("sum"); + const receiptDate = form.get("receiptDate"); + if ( + typeof description !== "string" || + typeof sum !== "string" || + typeof receiptDate !== "string" || + !form.has("file") + ) { + return false; + } + const numericSum = Number(sum); + if (description.length === 0 || !Number.isFinite(numericSum) || numericSum <= 0) { + return false; + } + receipt.description = description; + receipt.sum = numericSum; + receipt.receiptDate = `${receiptDate}T00:00:00.000Z`; + return true; +} + +async function handlePersonalCreate(request: Request, url: URL): Promise { + const authFailure = unauthorized(request, url); + if (authFailure !== null) return authFailure; + const fault = faultResponse("personal-create", request, url); + if (fault !== null) return fault; + + const parsed = await parseMultipart(request); + if ( + parsed.form === null || + !parsed.bodyShape.fields.includes("description") || + !parsed.bodyShape.fields.includes("sum") || + !parsed.bodyShape.fields.includes("receiptDate") || + !parsed.bodyShape.fields.includes("file") || + parsed.bodyShape.fields.includes("picture") || + !parsed.bodyShape.filePresent + ) { + record(request, url, parsed.bodyShape, 422); + return jsonResponse({ error: "invalid multipart shape" }, 422); + } + + const existing = personalReceipts.find((receipt) => receipt.id === 99); + const receipt: ReceiptWire = existing ?? { + id: 99, + visualId: "personal-99", + description: "", + sum: 1, + receiptDate: "2026-08-10T00:00:00.000Z", + submitDate: "2026-08-10T00:00:00.000Z", + status: "pending", + refundDate: null, + }; + if (!updateReceiptFromForm(parsed.form, receipt)) { + record(request, url, parsed.bodyShape, 422); + return jsonResponse({ error: "invalid receipt input" }, 422); + } + if (existing === undefined) personalReceipts.push(receipt); + transitions.push("personal:create:99"); + record(request, url, parsed.bodyShape, 201); + return jsonResponse({ id: 99 }, 201); +} + +async function handlePersonalUpdate( + request: Request, + url: URL, + id: number, +): Promise { + const authFailure = unauthorized(request, url); + if (authFailure !== null) return authFailure; + const fault = faultResponse("personal-update", request, url); + if (fault !== null) return fault; + + const receipt = personalReceipts.find((item) => item.id === id); + if (receipt === undefined) { + record(request, url, { kind: "empty" }, 404); + return jsonResponse({ error: "not found" }, 404); + } + + if (request.method === "PUT") { + let body: unknown; + try { + body = await request.json(); + } catch { + record(request, url, { kind: "json", keys: [] }, 422); + return jsonResponse({ error: "invalid json" }, 422); + } + if (!isRecord(body)) { + record(request, url, { kind: "json", keys: [] }, 422); + return jsonResponse({ error: "invalid json" }, 422); + } + const description = body.description; + const sum = body.sum; + const receiptDate = body.receiptDate; + if ( + typeof description !== "string" || + typeof sum !== "number" || + !Number.isFinite(sum) || + sum <= 0 || + typeof receiptDate !== "string" + ) { + record(request, url, { kind: "json", keys: Object.keys(body).sort() }, 422); + return jsonResponse({ error: "invalid receipt input" }, 422); + } + receipt.description = description; + receipt.sum = sum; + receipt.receiptDate = `${receiptDate}T00:00:00.000Z`; + transitions.push(`personal:update:${id}`); + record(request, url, { kind: "json", keys: Object.keys(body).sort() }, 204); + return noContent(); + } + + const parsed = await parseMultipart(request); + if (parsed.form === null || !updateReceiptFromForm(parsed.form, receipt)) { + record(request, url, parsed.bodyShape, 422); + return jsonResponse({ error: "invalid multipart shape" }, 422); + } + transitions.push(`personal:update-file:${id}`); + record(request, url, parsed.bodyShape, 204); + return noContent(); +} + +async function handlePersonalDelete( + request: Request, + url: URL, + id: number, +): Promise { + const authFailure = unauthorized(request, url); + if (authFailure !== null) return authFailure; + const fault = faultResponse("personal-delete", request, url); + if (fault !== null) return fault; + + const before = personalReceipts.length; + personalReceipts = personalReceipts.filter((receipt) => receipt.id !== id); + if (personalReceipts.length === before) { + record(request, url, { kind: "empty" }, 404); + return jsonResponse({ error: "not found" }, 404); + } + transitions.push(`personal:delete:${id}`); + record(request, url, { kind: "empty" }, 204); + return noContent(); +} + +async function handleAdminList(request: Request, url: URL): Promise { + const authFailure = unauthorized(request, url); + if (authFailure !== null) return authFailure; + const fault = faultResponse("admin-list", request, url); + if (fault !== null) return fault; + + const status = url.searchParams.get("status"); + const rows = status === null + ? adminReceipts + : adminReceipts.filter((receipt) => receipt.status === status); + record(request, url, { kind: "empty" }, 200); + return jsonResponse({ + "hydra:member": rows, + "hydra:totalItems": rows.length, + }); +} + +async function handleAdminStatus( + request: Request, + url: URL, + id: number, +): Promise { + const authFailure = unauthorized(request, url); + if (authFailure !== null) return authFailure; + const fault = faultResponse("admin-status", request, url); + if (fault !== null) return fault; + + let body: unknown; + try { + body = await request.json(); + } catch { + record(request, url, { kind: "json", keys: [] }, 422); + return jsonResponse({ error: "invalid json" }, 422); + } + if (!isRecord(body)) { + record(request, url, { kind: "json", keys: [] }, 422); + return jsonResponse({ error: "invalid status" }, 422); + } + const bodyKeys = Object.keys(body).sort(); + const status = typeof body.status === "string" ? body.status : null; + if (status !== "pending" && status !== "refunded" && status !== "rejected") { + record(request, url, { kind: "json", keys: bodyKeys }, 422); + return jsonResponse({ error: "invalid status" }, 422); + } + + const receipt = adminReceipts.find((item) => item.id === id); + if (receipt === undefined) { + record(request, url, { kind: "json", keys: bodyKeys }, 404); + return jsonResponse({ error: "not found" }, 404); + } + receipt.status = status; + receipt.refundDate = status === "refunded" ? "2026-08-10T00:00:00.000Z" : null; + transitions.push(`admin:${id}:${status}`); + record(request, url, { kind: "json", keys: bodyKeys }, 204); + return noContent(); +} + +async function handleApi(request: Request, url: URL): Promise { + if (url.pathname === "/api/me/profile" && request.method === "GET") { + return handleProfile(request, url); + } + if (url.pathname === "/api/receipts" && request.method === "GET") { + return handlePersonalList(request, url); + } + if (url.pathname === "/api/receipts" && request.method === "POST") { + return handlePersonalCreate(request, url); + } + + const personalId = parseId(url.pathname, "/api/receipts"); + if (personalId !== null && request.method === "PUT") { + return handlePersonalUpdate(request, url, personalId); + } + if (personalId !== null && request.method === "POST") { + return handlePersonalUpdate(request, url, personalId); + } + if (personalId !== null && request.method === "DELETE") { + return handlePersonalDelete(request, url, personalId); + } + + if (url.pathname === "/api/admin/receipts" && request.method === "GET") { + return handleAdminList(request, url); + } + + const adminMatch = url.pathname.match(/^\/api\/admin\/receipts\/(\d+)\/status$/); + const adminId = adminMatch === null ? null : Number(adminMatch[1]); + if ( + adminId !== null && + url.pathname.endsWith("/status") && + request.method === "PUT" + ) { + return handleAdminStatus(request, url, adminId); + } + + return jsonResponse({ error: "not found" }, 404); +} + +async function control(request: Request): Promise { + let body: unknown; + try { + body = await request.json(); + } catch { + return noContent(400); + } + if (!isRecord(body) || typeof body.operation !== "string" || !isOperation(body.operation)) { + return noContent(400); + } + if (body.clear === true) { + faults.delete(body.operation); + return noContent(); + } + const fault: Fault = {}; + if (body.status !== undefined) { + if ( + typeof body.status !== "number" || + !Number.isInteger(body.status) || + body.status < 400 || + body.status > 599 + ) { + return noContent(400); + } + fault.status = body.status; + } + if (body.malformed !== undefined) { + if (typeof body.malformed !== "string" || !isMalformedMode(body.malformed)) { + return noContent(400); + } + fault.malformed = body.malformed; + } + if (fault.status === undefined && fault.malformed === undefined) { + return noContent(400); + } + faults.set(body.operation, fault); + return noContent(); +} + +async function handleRequest(request: Request): Promise { + const url = new URL(request.url); + if (url.pathname === "/__receipt_stub/ready" && request.method === "GET") { + return jsonResponse({ ready: true }); + } + if (url.pathname === "/__receipt_stub/reset" && request.method === "POST") { + resetState(); + return noContent(); + } + if (url.pathname === "/__receipt_stub/control" && request.method === "POST") { + return control(request); + } + if (url.pathname === "/__receipt_stub/evidence" && request.method === "GET") { + return jsonResponse({ requests: evidence, transitions }); + } + if (url.pathname.startsWith("/api/")) { + return handleApi(request, url); + } + return jsonResponse({ error: "not found" }, 404); +} + +const args = process.argv.slice(2); +if (args.length !== 2 || args[0] !== "--port" || args[1] !== "8787") { + throw new Error("receipt stub requires --port 8787"); +} + +resetState(); +let inFlight = 0; +let drained: (() => void) | undefined; +let shuttingDown = false; + +const server = Bun.serve({ + hostname: "127.0.0.1", + port: 8787, + fetch(request) { + inFlight += 1; + return handleRequest(request) + .catch(() => jsonResponse({ error: "stub failure" }, 500)) + .finally(() => { + inFlight -= 1; + if (inFlight === 0 && drained !== undefined) { + drained(); + drained = undefined; + } + }); + }, +}); + +async function shutdown(): Promise { + if (shuttingDown) return; + shuttingDown = true; + await server.stop(); + if (inFlight > 0) { + await new Promise((resolve) => { + drained = resolve; + }); + } + process.exit(0); +} + +process.once("SIGINT", () => void shutdown()); +process.once("SIGTERM", () => void shutdown()); +console.log(`receipt stub ready on http://${server.hostname}:${server.port}`); diff --git a/apps/dashboard/e2e/receipts.spec.ts b/apps/dashboard/e2e/receipts.spec.ts new file mode 100644 index 00000000..1d172ea0 --- /dev/null +++ b/apps/dashboard/e2e/receipts.spec.ts @@ -0,0 +1,324 @@ +import { + expect, + test, + type APIRequestContext, + type Page, +} from "@playwright/test"; +import { z } from "zod"; + +const APP_URL = "http://127.0.0.1:5174"; +const STUB_URL = "http://127.0.0.1:8787"; +const TOKEN = "trace-token"; +const isConfigPrecheck = process.env.RECEIPT_CONFIG_PRECHECK === "1"; + +type FaultOptions = { + status?: number; + malformed?: "receipt-date" | "admin-shape" | "create-response"; +}; + +async function resetStub(request: APIRequestContext): Promise { + const response = await request.post(`${STUB_URL}/__receipt_stub/reset`); + expect(response.status()).toBe(204); +} + +async function setFault( + request: APIRequestContext, + operation: + | "personal-list" + | "personal-create" + | "personal-update" + | "personal-delete" + | "admin-list" + | "admin-status" + | "profile", + options: FaultOptions, +): Promise { + const response = await request.post(`${STUB_URL}/__receipt_stub/control`, { + data: { operation, ...options }, + }); + expect(response.status()).toBe(204); +} + +async function clearFault( + request: APIRequestContext, + operation: + | "personal-list" + | "personal-create" + | "personal-update" + | "personal-delete" + | "admin-list" + | "admin-status" + | "profile", +): Promise { + const response = await request.post(`${STUB_URL}/__receipt_stub/control`, { + data: { operation, clear: true }, + }); + expect(response.status()).toBe(204); +} + +const receiptStubEvidenceSchema = z.object({ + requests: z.array( + z.object({ + method: z.string(), + path: z.string(), + status: z.number().int(), + bodyShape: z.discriminatedUnion("kind", [ + z.object({ kind: z.literal("empty") }), + z.object({ kind: z.literal("json"), keys: z.array(z.string()) }), + z.object({ + kind: z.literal("multipart"), + fields: z.array(z.string()), + filePresent: z.boolean(), + }), + ]), + }), + ), + transitions: z.array(z.string()), +}); + +async function readEvidence(request: APIRequestContext): Promise { + const response = await request.get(`${STUB_URL}/__receipt_stub/evidence`); + expect(response.status()).toBe(200); + return response.text(); +} + +async function authenticate(page: Page): Promise { + await page.context().addCookies([ + { + name: "jwt_token", + value: TOKEN, + url: APP_URL, + httpOnly: true, + sameSite: "Lax", + }, + ]); +} + +test.describe("Receipt SDK consumer seam", () => { + // Preflight intentionally runs without the fixture: + // env -u API_URL -u VITE_API_URL CI=1 RECEIPT_CONFIG_PRECHECK=1 node ./node_modules/@playwright/test/cli.js test e2e/receipts.spec.ts -g "isolated SSR configuration preflight" --project=chromium --retries=0 + // Journey starts `bun e2e/fixtures/receipt-api.ts --port 8787` first, then uses: + // API_URL=http://127.0.0.1:8787 VITE_API_URL=http://127.0.0.1:8787 node ./node_modules/@playwright/test/cli.js test e2e/receipts.spec.ts -g "runs the personal and admin Receipt journey against the loopback stub" --project=chromium --retries=0 + test("isolated SSR configuration preflight", async ({ page }) => { + test.skip(!isConfigPrecheck, "requires the isolated SSR config preflight command"); + await authenticate(page); + const preflight = await page.request.get( + `${APP_URL}/dashboard/mine-utlegg.data?_routes=routes%2Fdashboard.mine-utlegg._index`, + ); + expect(preflight.status()).toBe(200); + expect(await preflight.text()).toContain( + "API-konfigurasjon mangler eller er ugyldig.", + ); + }); + + test("runs the personal and admin Receipt journey against the loopback stub", async ({ + page, + request, + }) => { + test.skip(isConfigPrecheck, "separate isolated SSR config preflight"); + await resetStub(request); + await authenticate(page); + + await page.goto("/dashboard/mine-utlegg"); + await expect(page.getByRole("heading", { name: "Mine Utlegg" })).toBeVisible(); + // Cold Vite route prebundle stabilization: dependency optimization can reload the DOM. + await page.reload(); + await expect(page.getByRole("heading", { name: "Mine Utlegg" })).toBeVisible(); + await expect(page.getByText("2026-08-08", { exact: true })).toBeVisible(); + await expect(page.getByText("Venter", { exact: true }).first()).toBeVisible(); + + await page.getByRole("button", { name: "Legg til utlegg", exact: true }).click(); + const createDialog = page.getByRole("dialog"); + await createDialog.getByLabel(/Beskrivelse/).fill("Travel to course"); + await createDialog.getByLabel(/Beløp/).fill("125.50"); + await createDialog.getByLabel(/Dato/).fill("2026-08-08"); + await createDialog.getByLabel(/Kvitteringsbilde/).setInputFiles({ + name: "receipt.png", + mimeType: "image/png", + buffer: Buffer.from("synthetic receipt"), + }); + await createDialog.getByRole("button", { name: "Legg til", exact: true }).click(); + await expect(page.getByText("Travel to course", { exact: true })).toBeVisible(); + await createDialog.getByRole("button", { name: "Avbryt", exact: true }).click(); + await expect( + page.getByRole("row").filter({ hasText: "Travel to course" }), + ).toContainText("2026-08-08"); + + let createdRow = page.getByRole("row").filter({ hasText: "Travel to course" }); + await createdRow.getByRole("button", { name: "Rediger", exact: true }).click(); + const editDialog = page.getByRole("dialog"); + await editDialog.getByLabel(/Beskrivelse/).fill("Travel updated"); + await editDialog.getByLabel(/Beløp/).fill("140.75"); + await editDialog.getByLabel(/Dato/).fill("2026-08-09"); + await editDialog + .getByRole("button", { name: "Lagre endringer", exact: true }) + .click(); + await expect(page.getByText("Travel updated", { exact: true })).toBeVisible(); + await editDialog.getByRole("button", { name: "Avbryt", exact: true }).click(); + await expect( + page.getByRole("row").filter({ hasText: "Travel updated" }), + ).toContainText("2026-08-09"); + + createdRow = page.getByRole("row").filter({ hasText: "Travel updated" }); + await createdRow.getByRole("button", { name: "Slett", exact: true }).click(); + const deleteDialog = page.getByRole("alertdialog"); + await deleteDialog.getByRole("button", { name: "Slett", exact: true }).click(); + await expect(page.getByText("Travel updated", { exact: true })).toHaveCount(0); + + await page.getByRole("button", { name: "Refundert", exact: true }).click(); + await expect(page.getByText("Course travel", { exact: true })).toHaveCount(0); + await page.getByRole("button", { name: "Alle", exact: true }).click(); + await expect(page.getByText("Course travel", { exact: true })).toBeVisible(); + + await page.goto("/dashboard/utlegg"); + await expect(page.getByRole("heading", { name: "Utlegg" })).toBeVisible(); + await expect(page.getByText("Kari Nordmann", { exact: true })).toBeVisible(); + await expect( + page.getByRole("row").filter({ hasText: "Approval receipt" }), + ).toContainText("2026-08-05"); + + await page.getByRole("button", { name: "Refundert", exact: true }).click(); + await expect(page).toHaveURL(/\/dashboard\/utlegg\?status=refunded/); + await expect(page.getByText("Already refunded", { exact: true })).toBeVisible(); + await page.getByRole("button", { name: "Alle", exact: true }).click(); + + let adminRow = page.getByRole("row").filter({ hasText: "Approval receipt" }); + await adminRow.getByRole("button", { name: "Godkjenn", exact: true }).click(); + await page.getByRole("alertdialog").getByRole("button", { name: "Godkjenn", exact: true }).click(); + await expect(adminRow).toContainText("Refundert"); + + adminRow = page.getByRole("row").filter({ hasText: "Rejection receipt" }); + await adminRow.getByRole("button", { name: "Avvis", exact: true }).click(); + await page.getByRole("alertdialog").getByRole("button", { name: "Avvis", exact: true }).click(); + await expect(adminRow).toContainText("Avvist"); + + adminRow = page.getByRole("row").filter({ hasText: "Reopen receipt" }); + await adminRow.getByRole("button", { name: "Gjenåpne", exact: true }).click(); + await page.getByRole("alertdialog").getByRole("button", { name: "Gjenåpne", exact: true }).click(); + await expect(adminRow).toContainText("Venter"); + + for (const status of [422, 404, 429, 500]) { + await setFault(request, "personal-list", { status }); + await page.goto("/dashboard/mine-utlegg"); + await expect(page.getByRole("alert").first()).toBeVisible(); + await clearFault(request, "personal-list"); + } + + await page.goto("/dashboard/mine-utlegg"); + await setFault(request, "personal-create", { status: 422 }); + await page.getByRole("button", { name: "Legg til utlegg", exact: true }).click(); + const createErrorDialog = page.getByRole("dialog"); + await createErrorDialog.getByLabel(/Beskrivelse/).fill("Fault create"); + await createErrorDialog.getByLabel(/Beløp/).fill("10"); + await createErrorDialog.getByLabel(/Dato/).fill("2026-08-08"); + await createErrorDialog.getByLabel(/Kvitteringsbilde/).setInputFiles({ + name: "receipt.png", + mimeType: "image/png", + buffer: Buffer.from("synthetic receipt"), + }); + await createErrorDialog.getByRole("button", { name: "Legg til", exact: true }).click(); + await expect(createErrorDialog.getByRole("alert")).toBeVisible(); + await clearFault(request, "personal-create"); + await createErrorDialog.getByRole("button", { name: "Avbryt", exact: true }).click(); + + await page.goto("/dashboard/mine-utlegg"); + await setFault(request, "personal-update", { status: 409 }); + const updateErrorRow = page.getByRole("row").filter({ hasText: "Course travel" }); + await updateErrorRow.getByRole("button", { name: "Rediger", exact: true }).click(); + const updateErrorDialog = page.getByRole("dialog"); + await updateErrorDialog.getByLabel(/Beskrivelse/).fill("Fault update"); + await updateErrorDialog.getByLabel(/Beløp/).fill("11"); + await updateErrorDialog.getByLabel(/Dato/).fill("2026-08-08"); + await updateErrorDialog + .getByRole("button", { name: "Lagre endringer", exact: true }) + .click(); + await expect(updateErrorDialog.getByRole("alert")).toBeVisible(); + await clearFault(request, "personal-update"); + await updateErrorDialog.getByRole("button", { name: "Avbryt", exact: true }).click(); + + await setFault(request, "personal-list", { malformed: "receipt-date" }); + await page.goto("/dashboard/mine-utlegg"); + await expect(page.getByRole("alert").first()).toBeVisible(); + await clearFault(request, "personal-list"); + + await page.goto("/dashboard/mine-utlegg"); + const initialRow = page.getByRole("row").filter({ hasText: "Course travel" }); + await setFault(request, "personal-delete", { status: 409 }); + await initialRow.getByRole("button", { name: "Slett", exact: true }).click(); + await page.getByRole("alertdialog").getByRole("button", { name: "Slett", exact: true }).click(); + await expect(page.getByRole("alertdialog").getByRole("alert")).toBeVisible(); + await clearFault(request, "personal-delete"); + await page.getByRole("alertdialog").getByRole("button", { name: "Avbryt", exact: true }).click(); + + await page.goto("/dashboard/utlegg"); + await setFault(request, "admin-status", { status: 409 }); + const statusErrorRow = page.getByRole("row").filter({ hasText: "Rejection receipt" }); + await statusErrorRow.getByRole("button", { name: "Gjenåpne", exact: true }).click(); + await page.getByRole("alertdialog").getByRole("button", { name: "Gjenåpne", exact: true }).click(); + await expect(statusErrorRow.getByRole("alert")).toBeVisible(); + await clearFault(request, "admin-status"); + + await setFault(request, "admin-list", { malformed: "admin-shape" }); + await page.goto("/dashboard/utlegg"); + await expect(page.getByRole("alert").first()).toBeVisible(); + await clearFault(request, "admin-list"); + + await setFault(request, "personal-list", { status: 401 }); + const expired = await page.request.get(`${APP_URL}/dashboard/mine-utlegg`, { + maxRedirects: 0, + }); + expect(expired.status()).toBe(302); + expect(expired.headers().location).toContain("/login?expired=true"); + await clearFault(request, "personal-list"); + + const rawEvidence = await readEvidence(request); + expect(rawEvidence).not.toContain(TOKEN); + expect(rawEvidence).not.toContain("Travel to course"); + await test.info().attach("receipt-stub-evidence.json", { + body: Buffer.from(rawEvidence), + contentType: "application/json", + }); + const stubEvidence = receiptStubEvidenceSchema.parse(JSON.parse(rawEvidence)); + + expect(stubEvidence.transitions).toEqual( + expect.arrayContaining([ + "personal:create:99", + "personal:update:99", + "personal:delete:99", + "admin:10:refunded", + "admin:11:rejected", + "admin:12:pending", + ]), + ); + expect(stubEvidence.requests).toEqual( + expect.arrayContaining([ + expect.objectContaining({ method: "POST", path: "/api/receipts", status: 201 }), + expect.objectContaining({ method: "PUT", path: "/api/receipts/99", status: 204 }), + expect.objectContaining({ method: "DELETE", path: "/api/receipts/99", status: 204 }), + expect.objectContaining({ method: "GET", path: "/api/admin/receipts" }), + expect.objectContaining({ + method: "PUT", + path: "/api/admin/receipts/10/status", + status: 204, + }), + ]), + ); + + const createRequest = stubEvidence.requests.find( + (request) => + request.method === "POST" && + request.path === "/api/receipts" && + request.status === 201, + ); + expect(createRequest).toBeDefined(); + if (createRequest === undefined || createRequest.bodyShape.kind !== "multipart") { + throw new Error("Receipt create evidence is not multipart"); + } + expect(createRequest.bodyShape.filePresent).toBe(true); + expect(createRequest.bodyShape.fields).toEqual( + expect.arrayContaining(["description", "sum", "receiptDate", "file"]), + ); + expect(createRequest.bodyShape.fields).not.toContain("picture"); + + }); +}); diff --git a/apps/dashboard/package.json b/apps/dashboard/package.json index c9cd6462..fa04415d 100644 --- a/apps/dashboard/package.json +++ b/apps/dashboard/package.json @@ -60,7 +60,7 @@ "tanstack": "^1.0.0", "vaul": "^1.1.2", "zod": "^3.24.2", - "@vektorprogrammet/sdk": "^0.1.2", + "@vektorprogrammet/sdk": "workspace:*", "@tanstack/react-query": "^5" }, "devDependencies": { diff --git a/apps/dashboard/pnpm-lock.yaml b/apps/dashboard/pnpm-lock.yaml deleted file mode 100644 index b3cd12a6..00000000 --- a/apps/dashboard/pnpm-lock.yaml +++ /dev/null @@ -1,6251 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@axe-core/playwright': - specifier: ^4.10.1 - version: 4.11.1(playwright-core@1.58.2) - '@hookform/resolvers': - specifier: ^4.1.3 - version: 4.1.3(react-hook-form@7.71.2(react@19.2.4)) - '@mantine/hooks': - specifier: ^7.17.3 - version: 7.17.8(react@19.2.4) - '@radix-ui/react-avatar': - specifier: ^1.1.3 - version: 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-checkbox': - specifier: ^1.1.4 - version: 1.3.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-collapsible': - specifier: ^1.1.3 - version: 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-dialog': - specifier: ^1.1.6 - version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-dropdown-menu': - specifier: ^2.1.6 - version: 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-label': - specifier: ^2.1.2 - version: 2.1.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-popover': - specifier: ^1.1.6 - version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-select': - specifier: ^2.1.6 - version: 2.2.6(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-separator': - specifier: ^1.1.2 - version: 1.1.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-slot': - specifier: ^1.1.2 - version: 1.2.4(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-tabs': - specifier: ^1.1.3 - version: 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-tooltip': - specifier: ^1.1.8 - version: 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@react-router/fs-routes': - specifier: ^7.4.1 - version: 7.13.1(@react-router/dev@7.13.1(@react-router/serve@7.13.1(react-router@7.13.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3))(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(react-router@7.13.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)))(typescript@5.9.3) - '@react-router/node': - specifier: ^7.4.1 - version: 7.13.1(react-router@7.13.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3) - '@react-router/serve': - specifier: ^7.4.1 - version: 7.13.1(react-router@7.13.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3) - '@tailwindcss/vite': - specifier: ^4.0.17 - version: 4.2.1(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)) - '@tanstack/react-query': - specifier: ^5 - version: 5.90.21(react@19.2.4) - '@tanstack/react-table': - specifier: ^8.21.2 - version: 8.21.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@vektorprogrammet/sdk': - specifier: ^0.1.2 - version: 0.1.2(@tanstack/react-query@5.90.21(react@19.2.4))(react@19.2.4) - class-variance-authority: - specifier: ^0.7.1 - version: 0.7.1 - clsx: - specifier: ^2.1.1 - version: 2.1.1 - cmdk: - specifier: ^1.1.1 - version: 1.1.1(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - isbot: - specifier: ^5.1.25 - version: 5.1.35 - lucide-react: - specifier: ^0.486.0 - version: 0.486.0(react@19.2.4) - react: - specifier: ^19.1.0 - version: 19.2.4 - react-dom: - specifier: ^19.1.0 - version: 19.2.4(react@19.2.4) - react-hook-form: - specifier: ^7.55.0 - version: 7.71.2(react@19.2.4) - react-router: - specifier: ^7.4.1 - version: 7.13.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - react-router-dom: - specifier: ^7.4.0 - version: 7.13.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - tailwind-merge: - specifier: ^3.0.2 - version: 3.5.0 - tailwindcss: - specifier: ^4.0.17 - version: 4.2.1 - tailwindcss-animate: - specifier: ^1.0.7 - version: 1.0.7(tailwindcss@4.2.1) - tanstack: - specifier: ^1.0.0 - version: 1.0.3(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/extension-code-block@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(highlight.js@11.11.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(video.js@8.23.7)(zod@3.25.76) - vaul: - specifier: ^1.1.2 - version: 1.1.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - zod: - specifier: ^3.24.2 - version: 3.25.76 - devDependencies: - '@playwright/test': - specifier: ^1.51.1 - version: 1.58.2 - '@react-router/dev': - specifier: ^7.4.1 - version: 7.13.1(@react-router/serve@7.13.1(react-router@7.13.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3))(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(react-router@7.13.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)) - '@tailwindcss/postcss': - specifier: ^4.0.17 - version: 4.2.1 - '@types/node': - specifier: ^22.13.14 - version: 22.19.15 - '@types/react': - specifier: ^19.0.12 - version: 19.2.14 - '@types/react-dom': - specifier: ^19.0.4 - version: 19.2.3(@types/react@19.2.14) - typescript: - specifier: ^5.8.2 - version: 5.9.3 - vite: - specifier: ^6.2.4 - version: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1) - -packages: - - '@ai-sdk/provider-utils@2.2.8': - resolution: {integrity: sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.23.8 - - '@ai-sdk/provider@1.1.3': - resolution: {integrity: sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==} - engines: {node: '>=18'} - - '@ai-sdk/react@1.2.12': - resolution: {integrity: sha512-jK1IZZ22evPZoQW3vlkZ7wvjYGYF+tRBKXtrcolduIkQ/m/sOAVcVeVDUDvh1T91xCnWCdUGCPZg2avZ90mv3g==} - engines: {node: '>=18'} - peerDependencies: - react: ^18 || ^19 || ^19.0.0-rc - zod: ^3.23.8 - peerDependenciesMeta: - zod: - optional: true - - '@ai-sdk/ui-utils@1.2.11': - resolution: {integrity: sha512-3zcwCc8ezzFlwp3ZD15wAPjf2Au4s3vAbKsXQVyhxODHcmu0iyPO2Eua6D/vicq/AUm/BAo60r97O6HU+EI0+w==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.23.8 - - '@alloc/quick-lru@5.2.0': - resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} - engines: {node: '>=10'} - - '@axe-core/playwright@4.11.1': - resolution: {integrity: sha512-mKEfoUIB1MkVTht0BGZFXtSAEKXMJoDkyV5YZ9jbBmZCcWDz71tegNsdTkIN8zc/yMi5Gm2kx7Z5YQ9PfWNAWw==} - peerDependencies: - playwright-core: '>= 1.0.0' - - '@babel/code-frame@7.29.0': - resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.29.0': - resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.29.0': - resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.29.1': - resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-annotate-as-pure@7.27.3': - resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-compilation-targets@7.28.6': - resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-create-class-features-plugin@7.28.6': - resolution: {integrity: sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-globals@7.28.0': - resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-member-expression-to-functions@7.28.5': - resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-imports@7.28.6': - resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-transforms@7.28.6': - resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-optimise-call-expression@7.27.1': - resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-plugin-utils@7.28.6': - resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} - engines: {node: '>=6.9.0'} - - '@babel/helper-replace-supers@7.28.6': - resolution: {integrity: sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': - resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.28.5': - resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-option@7.27.1': - resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} - engines: {node: '>=6.9.0'} - - '@babel/helpers@7.28.6': - resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.29.0': - resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/plugin-syntax-jsx@7.28.6': - resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-typescript@7.28.6': - resolution: {integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-modules-commonjs@7.28.6': - resolution: {integrity: sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-typescript@7.28.6': - resolution: {integrity: sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/preset-typescript@7.28.5': - resolution: {integrity: sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/runtime@7.28.6': - resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} - engines: {node: '>=6.9.0'} - - '@babel/template@7.28.6': - resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.29.0': - resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.29.0': - resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} - engines: {node: '>=6.9.0'} - - '@discoveryjs/json-ext@0.5.7': - resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} - engines: {node: '>=10.0.0'} - - '@emnapi/runtime@1.8.1': - resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} - - '@esbuild/aix-ppc64@0.25.12': - resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.25.12': - resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.25.12': - resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.25.12': - resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.25.12': - resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.25.12': - resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.25.12': - resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.25.12': - resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.25.12': - resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm@0.25.12': - resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.25.12': - resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-loong64@0.25.12': - resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.25.12': - resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-ppc64@0.25.12': - resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.25.12': - resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-s390x@0.25.12': - resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.25.12': - resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-arm64@0.25.12': - resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.25.12': - resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.25.12': - resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.25.12': - resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openharmony-arm64@0.25.12': - resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - - '@esbuild/sunos-x64@0.25.12': - resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.25.12': - resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-ia32@0.25.12': - resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-x64@0.25.12': - resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - - '@floating-ui/core@1.7.5': - resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} - - '@floating-ui/dom@1.7.6': - resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==} - - '@floating-ui/react-dom@2.1.8': - resolution: {integrity: sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - '@floating-ui/utils@0.2.11': - resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} - - '@hookform/resolvers@4.1.3': - resolution: {integrity: sha512-Jsv6UOWYTrEFJ/01ZrnwVXs7KDvP8XIo115i++5PWvNkNvkrsTfGiLS6w+eJ57CYtUtDQalUWovCZDHFJ8u1VQ==} - peerDependencies: - react-hook-form: ^7.0.0 - - '@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] - - '@img/sharp-libvips-linux-arm@1.2.4': - resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} - cpu: [arm] - os: [linux] - - '@img/sharp-libvips-linux-ppc64@1.2.4': - resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} - cpu: [ppc64] - os: [linux] - - '@img/sharp-libvips-linux-riscv64@1.2.4': - resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} - cpu: [riscv64] - os: [linux] - - '@img/sharp-libvips-linux-s390x@1.2.4': - resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} - cpu: [s390x] - os: [linux] - - '@img/sharp-libvips-linux-x64@1.2.4': - resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} - cpu: [x64] - os: [linux] - - '@img/sharp-libvips-linuxmusl-arm64@1.2.4': - resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} - cpu: [arm64] - os: [linux] - - '@img/sharp-libvips-linuxmusl-x64@1.2.4': - resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} - cpu: [x64] - os: [linux] - - '@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] - - '@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] - - '@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] - - '@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] - - '@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] - - '@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] - - '@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: [linux] - - '@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: [linux] - - '@img/sharp-wasm32@0.34.5': - resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - cpu: [wasm32] - - '@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] - - '@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] - - '@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'} - - '@jridgewell/sourcemap-codec@1.5.5': - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - - '@jridgewell/trace-mapping@0.3.31': - resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - - '@mantine/hooks@7.17.8': - resolution: {integrity: sha512-96qygbkTjRhdkzd5HDU8fMziemN/h758/EwrFu7TlWrEP10Vw076u+Ap/sG6OT4RGPZYYoHrTlT+mkCZblWHuw==} - peerDependencies: - react: ^18.x || ^19.x - - '@mjackson/node-fetch-server@0.2.0': - resolution: {integrity: sha512-EMlH1e30yzmTpGLQjlFmaDAjyOeZhng1/XCd7DExR8PNAnG/G1tyruZxEoUe11ClnwGhGrtsdnyyUx1frSzjng==} - - '@next/bundle-analyzer@15.5.12': - resolution: {integrity: sha512-tDkdfvuKz9JlH+B/CEIY0+XqQ5gymVZZWvDer5HJI68rPI0EYfbSadbvIUvHTugYnMkyxSBf8u0P2yGOSQ4h+w==} - - '@next/env@15.5.12': - resolution: {integrity: sha512-pUvdJN1on574wQHjaBfNGDt9Mz5utDSZFsIIQkMzPgNS8ZvT4H2mwOrOIClwsQOb6EGx5M76/CZr6G8i6pSpLg==} - - '@next/swc-darwin-arm64@15.5.12': - resolution: {integrity: sha512-RnRjBtH8S8eXCpUNkQ+543DUc7ys8y15VxmFU9HRqlo9BG3CcBUiwNtF8SNoi2xvGCVJq1vl2yYq+3oISBS0Zg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@next/swc-darwin-x64@15.5.12': - resolution: {integrity: sha512-nqa9/7iQlboF1EFtNhWxQA0rQstmYRSBGxSM6g3GxvxHxcoeqVXfGNr9stJOme674m2V7r4E3+jEhhGvSQhJRA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@next/swc-linux-arm64-gnu@15.5.12': - resolution: {integrity: sha512-dCzAjqhDHwmoB2M4eYfVKqXs99QdQxNQVpftvP1eGVppamXh/OkDAwV737Zr0KPXEqRUMN4uCjh6mjO+XtF3Mw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@next/swc-linux-arm64-musl@15.5.12': - resolution: {integrity: sha512-+fpGWvQiITgf7PUtbWY1H7qUSnBZsPPLyyq03QuAKpVoTy/QUx1JptEDTQMVvQhvizCEuNLEeghrQUyXQOekuw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@next/swc-linux-x64-gnu@15.5.12': - resolution: {integrity: sha512-jSLvgdRRL/hrFAPqEjJf1fFguC719kmcptjNVDJl26BnJIpjL3KH5h6mzR4mAweociLQaqvt4UyzfbFjgAdDcw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@next/swc-linux-x64-musl@15.5.12': - resolution: {integrity: sha512-/uaF0WfmYqQgLfPmN6BvULwxY0dufI2mlN2JbOKqqceZh1G4hjREyi7pg03zjfyS6eqNemHAZPSoP84x17vo6w==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@next/swc-win32-arm64-msvc@15.5.12': - resolution: {integrity: sha512-xhsL1OvQSfGmlL5RbOmU+FV120urrgFpYLq+6U8C6KIym32gZT6XF/SDE92jKzzlPWskkbjOKCpqk5m4i8PEfg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@next/swc-win32-x64-msvc@15.5.12': - resolution: {integrity: sha512-Z1Dh6lhFkxvBDH1FoW6OU/L6prYwPSlwjLiZkExIAh8fbP6iI/M7iGTQAJPYJ9YFlWobCZ1PHbchFhFYb2ADkw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@opentelemetry/api@1.9.0': - resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} - engines: {node: '>=8.0.0'} - - '@playwright/test@1.58.2': - resolution: {integrity: sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA==} - engines: {node: '>=18'} - hasBin: true - - '@polka/url@1.0.0-next.29': - resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} - - '@popperjs/core@2.11.8': - resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - - '@radix-ui/number@1.1.1': - resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} - - '@radix-ui/primitive@1.1.3': - resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} - - '@radix-ui/react-arrow@1.1.7': - resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-avatar@1.1.11': - resolution: {integrity: sha512-0Qk603AHGV28BOBO34p7IgD5m+V5Sg/YovfayABkoDDBM5d3NCx0Mp4gGrjzLGes1jV5eNOE1r3itqOR33VC6Q==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-checkbox@1.3.3': - resolution: {integrity: sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-collapsible@1.1.12': - resolution: {integrity: sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-collection@1.1.7': - resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-compose-refs@1.1.2': - resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-context@1.1.2': - resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-context@1.1.3': - resolution: {integrity: sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-dialog@1.1.15': - resolution: {integrity: sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-direction@1.1.1': - resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-dismissable-layer@1.1.11': - resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-dropdown-menu@2.1.16': - resolution: {integrity: sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-focus-guards@1.1.3': - resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-focus-scope@1.1.7': - resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-id@1.1.1': - resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-label@2.1.8': - resolution: {integrity: sha512-FmXs37I6hSBVDlO4y764TNz1rLgKwjJMQ0EGte6F3Cb3f4bIuHB/iLa/8I9VKkmOy+gNHq8rql3j686ACVV21A==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-menu@2.1.16': - resolution: {integrity: sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-popover@1.1.15': - resolution: {integrity: sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-popper@1.2.8': - resolution: {integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-portal@1.1.9': - resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-presence@1.1.5': - resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-primitive@2.1.3': - resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-primitive@2.1.4': - resolution: {integrity: sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-roving-focus@1.1.11': - resolution: {integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-select@2.2.6': - resolution: {integrity: sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-separator@1.1.8': - resolution: {integrity: sha512-sDvqVY4itsKwwSMEe0jtKgfTh+72Sy3gPmQpjqcQneqQ4PFmr/1I0YA+2/puilhggCe2gJcx5EBAYFkWkdpa5g==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-slot@1.2.3': - resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-slot@1.2.4': - resolution: {integrity: sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-tabs@1.1.13': - resolution: {integrity: sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-tooltip@1.2.8': - resolution: {integrity: sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-use-callback-ref@1.1.1': - resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-controllable-state@1.2.2': - resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-effect-event@0.0.2': - resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-escape-keydown@1.1.1': - resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-is-hydrated@0.1.0': - resolution: {integrity: sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-layout-effect@1.1.1': - resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-previous@1.1.1': - resolution: {integrity: sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-rect@1.1.1': - resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-size@1.1.1': - resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-visually-hidden@1.2.3': - resolution: {integrity: sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/rect@1.1.1': - resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} - - '@react-router/dev@7.13.1': - resolution: {integrity: sha512-H+kEvbbOaWGaitOyL6CgqPsHqRUh66HuVRvIEaZEqdoAY/1xChdhmmq6ZumMHzcFHgHlfOcoXgNHlz6ZO4NWcg==} - engines: {node: '>=20.0.0'} - hasBin: true - peerDependencies: - '@react-router/serve': ^7.13.1 - '@vitejs/plugin-rsc': ~0.5.7 - react-router: ^7.13.1 - react-server-dom-webpack: ^19.2.3 - typescript: ^5.1.0 - vite: ^5.1.0 || ^6.0.0 || ^7.0.0 - wrangler: ^3.28.2 || ^4.0.0 - peerDependenciesMeta: - '@react-router/serve': - optional: true - '@vitejs/plugin-rsc': - optional: true - react-server-dom-webpack: - optional: true - typescript: - optional: true - wrangler: - optional: true - - '@react-router/express@7.13.1': - resolution: {integrity: sha512-ujHom4LiEWsbnohNArwNT86QP3WRB5p+rY8AAll6s4gdrzgOXIy3FHDc3up5Lz8juUrZKh0d+B+PZa/IdDSK3A==} - engines: {node: '>=20.0.0'} - peerDependencies: - express: ^4.17.1 || ^5 - react-router: 7.13.1 - typescript: ^5.1.0 - peerDependenciesMeta: - typescript: - optional: true - - '@react-router/fs-routes@7.13.1': - resolution: {integrity: sha512-3TbBVq1xBv32iWCjr7ZxdLeXyLNIWVfkISpVO0745/VWNgIN1SL1UAXsYPdrfF2lhGhCi+jXTCQbGxGl2gTHvA==} - engines: {node: '>=20.0.0'} - peerDependencies: - '@react-router/dev': ^7.13.1 - typescript: ^5.1.0 - peerDependenciesMeta: - typescript: - optional: true - - '@react-router/node@7.13.1': - resolution: {integrity: sha512-IWPPf+Q3nJ6q4bwyTf5leeGUfg8GAxSN1RKj5wp9SK915zKK+1u4TCOfOmr8hmC6IW1fcjKV0WChkM0HkReIiw==} - engines: {node: '>=20.0.0'} - peerDependencies: - react-router: 7.13.1 - typescript: ^5.1.0 - peerDependenciesMeta: - typescript: - optional: true - - '@react-router/serve@7.13.1': - resolution: {integrity: sha512-vh5lr41rioXLz/zNLTYo0zq4yh97AkgEkJK7bhPeXnNbLNtI36WCZ2AeBtSJ4sdx4gx5LZvcjP8zoWFfSbNupA==} - engines: {node: '>=20.0.0'} - hasBin: true - peerDependencies: - react-router: 7.13.1 - - '@remirror/core-constants@3.0.0': - resolution: {integrity: sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==} - - '@remix-run/node-fetch-server@0.13.0': - resolution: {integrity: sha512-1EsNo0ZpgXu/90AWoRZf/oE3RVTUS80tiTUpt+hv5pjtAkw7icN4WskDwz/KdAw5ARbJLMhZBrO1NqThmy/McA==} - - '@rollup/rollup-android-arm-eabi@4.59.0': - resolution: {integrity: sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==} - cpu: [arm] - os: [android] - - '@rollup/rollup-android-arm64@4.59.0': - resolution: {integrity: sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==} - cpu: [arm64] - os: [android] - - '@rollup/rollup-darwin-arm64@4.59.0': - resolution: {integrity: sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==} - cpu: [arm64] - os: [darwin] - - '@rollup/rollup-darwin-x64@4.59.0': - resolution: {integrity: sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==} - cpu: [x64] - os: [darwin] - - '@rollup/rollup-freebsd-arm64@4.59.0': - resolution: {integrity: sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==} - cpu: [arm64] - os: [freebsd] - - '@rollup/rollup-freebsd-x64@4.59.0': - resolution: {integrity: sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==} - cpu: [x64] - os: [freebsd] - - '@rollup/rollup-linux-arm-gnueabihf@4.59.0': - resolution: {integrity: sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm-musleabihf@4.59.0': - resolution: {integrity: sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm64-gnu@4.59.0': - resolution: {integrity: sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-arm64-musl@4.59.0': - resolution: {integrity: sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-loong64-gnu@4.59.0': - resolution: {integrity: sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==} - cpu: [loong64] - os: [linux] - - '@rollup/rollup-linux-loong64-musl@4.59.0': - resolution: {integrity: sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==} - cpu: [loong64] - os: [linux] - - '@rollup/rollup-linux-ppc64-gnu@4.59.0': - resolution: {integrity: sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==} - cpu: [ppc64] - os: [linux] - - '@rollup/rollup-linux-ppc64-musl@4.59.0': - resolution: {integrity: sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==} - cpu: [ppc64] - os: [linux] - - '@rollup/rollup-linux-riscv64-gnu@4.59.0': - resolution: {integrity: sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-riscv64-musl@4.59.0': - resolution: {integrity: sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-s390x-gnu@4.59.0': - resolution: {integrity: sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==} - cpu: [s390x] - os: [linux] - - '@rollup/rollup-linux-x64-gnu@4.59.0': - resolution: {integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-linux-x64-musl@4.59.0': - resolution: {integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-openbsd-x64@4.59.0': - resolution: {integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==} - cpu: [x64] - os: [openbsd] - - '@rollup/rollup-openharmony-arm64@4.59.0': - resolution: {integrity: sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==} - cpu: [arm64] - os: [openharmony] - - '@rollup/rollup-win32-arm64-msvc@4.59.0': - resolution: {integrity: sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==} - cpu: [arm64] - os: [win32] - - '@rollup/rollup-win32-ia32-msvc@4.59.0': - resolution: {integrity: sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==} - cpu: [ia32] - os: [win32] - - '@rollup/rollup-win32-x64-gnu@4.59.0': - resolution: {integrity: sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==} - cpu: [x64] - os: [win32] - - '@rollup/rollup-win32-x64-msvc@4.59.0': - resolution: {integrity: sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==} - cpu: [x64] - os: [win32] - - '@standard-schema/utils@0.3.0': - resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} - - '@swc/helpers@0.5.15': - resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - - '@tailwindcss/node@4.2.1': - resolution: {integrity: sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg==} - - '@tailwindcss/oxide-android-arm64@4.2.1': - resolution: {integrity: sha512-eZ7G1Zm5EC8OOKaesIKuw77jw++QJ2lL9N+dDpdQiAB/c/B2wDh0QPFHbkBVrXnwNugvrbJFk1gK2SsVjwWReg==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [android] - - '@tailwindcss/oxide-darwin-arm64@4.2.1': - resolution: {integrity: sha512-q/LHkOstoJ7pI1J0q6djesLzRvQSIfEto148ppAd+BVQK0JYjQIFSK3JgYZJa+Yzi0DDa52ZsQx2rqytBnf8Hw==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [darwin] - - '@tailwindcss/oxide-darwin-x64@4.2.1': - resolution: {integrity: sha512-/f/ozlaXGY6QLbpvd/kFTro2l18f7dHKpB+ieXz+Cijl4Mt9AI2rTrpq7V+t04nK+j9XBQHnSMdeQRhbGyt6fw==} - engines: {node: '>= 20'} - cpu: [x64] - os: [darwin] - - '@tailwindcss/oxide-freebsd-x64@4.2.1': - resolution: {integrity: sha512-5e/AkgYJT/cpbkys/OU2Ei2jdETCLlifwm7ogMC7/hksI2fC3iiq6OcXwjibcIjPung0kRtR3TxEITkqgn0TcA==} - engines: {node: '>= 20'} - cpu: [x64] - os: [freebsd] - - '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.1': - resolution: {integrity: sha512-Uny1EcVTTmerCKt/1ZuKTkb0x8ZaiuYucg2/kImO5A5Y/kBz41/+j0gxUZl+hTF3xkWpDmHX+TaWhOtba2Fyuw==} - engines: {node: '>= 20'} - cpu: [arm] - os: [linux] - - '@tailwindcss/oxide-linux-arm64-gnu@4.2.1': - resolution: {integrity: sha512-CTrwomI+c7n6aSSQlsPL0roRiNMDQ/YzMD9EjcR+H4f0I1SQ8QqIuPnsVp7QgMkC1Qi8rtkekLkOFjo7OlEFRQ==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [linux] - - '@tailwindcss/oxide-linux-arm64-musl@4.2.1': - resolution: {integrity: sha512-WZA0CHRL/SP1TRbA5mp9htsppSEkWuQ4KsSUumYQnyl8ZdT39ntwqmz4IUHGN6p4XdSlYfJwM4rRzZLShHsGAQ==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [linux] - - '@tailwindcss/oxide-linux-x64-gnu@4.2.1': - resolution: {integrity: sha512-qMFzxI2YlBOLW5PhblzuSWlWfwLHaneBE0xHzLrBgNtqN6mWfs+qYbhryGSXQjFYB1Dzf5w+LN5qbUTPhW7Y5g==} - engines: {node: '>= 20'} - cpu: [x64] - os: [linux] - - '@tailwindcss/oxide-linux-x64-musl@4.2.1': - resolution: {integrity: sha512-5r1X2FKnCMUPlXTWRYpHdPYUY6a1Ar/t7P24OuiEdEOmms5lyqjDRvVY1yy9Rmioh+AunQ0rWiOTPE8F9A3v5g==} - engines: {node: '>= 20'} - cpu: [x64] - os: [linux] - - '@tailwindcss/oxide-wasm32-wasi@4.2.1': - resolution: {integrity: sha512-MGFB5cVPvshR85MTJkEvqDUnuNoysrsRxd6vnk1Lf2tbiqNlXpHYZqkqOQalydienEWOHHFyyuTSYRsLfxFJ2Q==} - 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.2.1': - resolution: {integrity: sha512-YlUEHRHBGnCMh4Nj4GnqQyBtsshUPdiNroZj8VPkvTZSoHsilRCwXcVKnG9kyi0ZFAS/3u+qKHBdDc81SADTRA==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [win32] - - '@tailwindcss/oxide-win32-x64-msvc@4.2.1': - resolution: {integrity: sha512-rbO34G5sMWWyrN/idLeVxAZgAKWrn5LiR3/I90Q9MkA67s6T1oB0xtTe+0heoBvHSpbU9Mk7i6uwJnpo4u21XQ==} - engines: {node: '>= 20'} - cpu: [x64] - os: [win32] - - '@tailwindcss/oxide@4.2.1': - resolution: {integrity: sha512-yv9jeEFWnjKCI6/T3Oq50yQEOqmpmpfzG1hcZsAOaXFQPfzWprWrlHSdGPEF3WQTi8zu8ohC9Mh9J470nT5pUw==} - engines: {node: '>= 20'} - - '@tailwindcss/postcss@4.2.1': - resolution: {integrity: sha512-OEwGIBnXnj7zJeonOh6ZG9woofIjGrd2BORfvE5p9USYKDCZoQmfqLcfNiRWoJlRWLdNPn2IgVZuWAOM4iTYMw==} - - '@tailwindcss/vite@4.2.1': - resolution: {integrity: sha512-TBf2sJjYeb28jD2U/OhwdW0bbOsxkWPwQ7SrqGf9sVcoYwZj7rkXljroBO9wKBut9XnmQLXanuDUeqQK0lGg/w==} - peerDependencies: - vite: ^5.2.0 || ^6 || ^7 - - '@tanstack/query-core@5.90.20': - resolution: {integrity: sha512-OMD2HLpNouXEfZJWcKeVKUgQ5n+n3A2JFmBaScpNDUqSrQSjiveC7dKMe53uJUg1nDG16ttFPz2xfilz6i2uVg==} - - '@tanstack/react-query@5.90.21': - resolution: {integrity: sha512-0Lu6y5t+tvlTJMTO7oh5NSpJfpg/5D41LlThfepTixPYkJ0sE2Jj0m0f6yYqujBwIXlId87e234+MxG3D3g7kg==} - peerDependencies: - react: ^18 || ^19 - - '@tanstack/react-table@8.21.3': - resolution: {integrity: sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww==} - engines: {node: '>=12'} - peerDependencies: - react: '>=16.8' - react-dom: '>=16.8' - - '@tanstack/table-core@8.21.3': - resolution: {integrity: sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==} - engines: {node: '>=12'} - - '@tiptap/core@2.27.2': - resolution: {integrity: sha512-ABL1N6eoxzDzC1bYvkMbvyexHacszsKdVPYqhl5GwHLOvpZcv9VE9QaKwDILTyz5voCA0lGcAAXZp+qnXOk5lQ==} - peerDependencies: - '@tiptap/pm': ^2.7.0 - - '@tiptap/extension-blockquote@2.27.2': - resolution: {integrity: sha512-oIGZgiAeA4tG3YxbTDfrmENL4/CIwGuP3THtHsNhwRqwsl9SfMk58Ucopi2GXTQSdYXpRJ0ahE6nPqB5D6j/Zw==} - peerDependencies: - '@tiptap/core': ^2.7.0 - - '@tiptap/extension-bold@2.27.2': - resolution: {integrity: sha512-bR7J5IwjCGQ0s3CIxyMvOCnMFMzIvsc5OVZKscTN5UkXzFsaY6muUAIqtKxayBUucjtUskm5qZowJITCeCb1/A==} - peerDependencies: - '@tiptap/core': ^2.7.0 - - '@tiptap/extension-bubble-menu@2.27.2': - resolution: {integrity: sha512-VkwlCOcr0abTBGzjPXklJ92FCowG7InU8+Od9FyApdLNmn0utRYGRhw0Zno6VgE9EYr1JY4BRnuSa5f9wlR72w==} - peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 - - '@tiptap/extension-bullet-list@2.27.2': - resolution: {integrity: sha512-gmFuKi97u5f8uFc/GQs+zmezjiulZmFiDYTh3trVoLRoc2SAHOjGEB7qxdx7dsqmMN7gwiAWAEVurLKIi1lnnw==} - peerDependencies: - '@tiptap/core': ^2.7.0 - - '@tiptap/extension-code-block-lowlight@2.27.2': - resolution: {integrity: sha512-v6NKStBbQ/XCc1NnCi3ObsL1DsxadSIBtUQNA/B+urkPgn5LEy72HAGlf0xwjRaNkAGSaTASLKmc84L5q5zlGQ==} - peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/extension-code-block': ^2.7.0 - '@tiptap/pm': ^2.7.0 - highlight.js: ^11 - lowlight: ^2 || ^3 - - '@tiptap/extension-code-block@2.27.2': - resolution: {integrity: sha512-KgvdQHS4jXr79aU3wZOGBIZYYl9vCB7uDEuRFV4so2rYrfmiYMw3T8bTnlNEEGe4RUeAms1i4fdwwvQp9nR1Dw==} - peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 - - '@tiptap/extension-code@2.27.2': - resolution: {integrity: sha512-7X9AgwqiIGXoZX7uvdHQsGsjILnN/JaEVtqfXZnPECzKGaWHeK/Ao4sYvIIIffsyZJA8k5DC7ny2/0sAgr2TuA==} - peerDependencies: - '@tiptap/core': ^2.7.0 - - '@tiptap/extension-document@2.27.2': - resolution: {integrity: sha512-CFhAYsPnyYnosDC4639sCJnBUnYH4Cat9qH5NZWHVvdgtDwu8GZgZn2eSzaKSYXWH1vJ9DSlCK+7UyC3SNXIBA==} - peerDependencies: - '@tiptap/core': ^2.7.0 - - '@tiptap/extension-dropcursor@2.27.2': - resolution: {integrity: sha512-oEu/OrktNoQXq1x29NnH/GOIzQZm8ieTQl3FK27nxfBPA89cNoH4mFEUmBL5/OFIENIjiYG3qWpg6voIqzswNw==} - peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 - - '@tiptap/extension-floating-menu@2.27.2': - resolution: {integrity: sha512-GUN6gPIGXS7ngRJOwdSmtBRBDt9Kt9CM/9pSwKebhLJ+honFoNA+Y6IpVyDvvDMdVNgBchiJLs6qA5H97gAePQ==} - peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 - - '@tiptap/extension-gapcursor@2.27.2': - resolution: {integrity: sha512-/c9VF1HBxj+AP54XGVgCmD9bEGYc5w5OofYCFQgM7l7PB1J00A4vOke0oPkHJnqnOOyPlFaxO/7N6l3XwFcnKA==} - peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 - - '@tiptap/extension-hard-break@2.27.2': - resolution: {integrity: sha512-kSRVGKlCYK6AGR0h8xRkk0WOFGXHIIndod3GKgWU49APuIGDiXd8sziXsSlniUsWmqgDmDXcNnSzPcV7AQ8YNg==} - peerDependencies: - '@tiptap/core': ^2.7.0 - - '@tiptap/extension-heading@2.27.2': - resolution: {integrity: sha512-iM3yeRWuuQR/IRQ1djwNooJGfn9Jts9zF43qZIUf+U2NY8IlvdNsk2wTOdBgh6E0CamrStPxYGuln3ZS4fuglw==} - peerDependencies: - '@tiptap/core': ^2.7.0 - - '@tiptap/extension-history@2.27.2': - resolution: {integrity: sha512-+hSyqERoFNTWPiZx4/FCyZ/0eFqB9fuMdTB4AC/q9iwu3RNWAQtlsJg5230bf/qmyO6bZxRUc0k8p4hrV6ybAw==} - peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 - - '@tiptap/extension-horizontal-rule@2.27.2': - resolution: {integrity: sha512-WGWUSgX+jCsbtf9Y9OCUUgRZYuwjVoieW5n6mAUohJ9/6gc6sGIOrUpBShf+HHo6WD+gtQjRd+PssmX3NPWMpg==} - peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 - - '@tiptap/extension-image@2.27.2': - resolution: {integrity: sha512-5zL/BY41FIt72azVrCrv3n+2YJ/JyO8wxCcA4Dk1eXIobcgVyIdo4rG39gCqIOiqziAsqnqoj12QHTBtHsJ6mQ==} - peerDependencies: - '@tiptap/core': ^2.7.0 - - '@tiptap/extension-italic@2.27.2': - resolution: {integrity: sha512-1OFsw2SZqfaqx5Fa5v90iNlPRcqyt+lVSjBwTDzuPxTPFY4Q0mL89mKgkq2gVHYNCiaRkXvFLDxaSvBWbmthgg==} - peerDependencies: - '@tiptap/core': ^2.7.0 - - '@tiptap/extension-link@2.27.2': - resolution: {integrity: sha512-bnP61qkr0Kj9Cgnop1hxn2zbOCBzNtmawxr92bVTOE31fJv6FhtCnQiD6tuPQVGMYhcmAj7eihtvuEMFfqEPcQ==} - peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 - - '@tiptap/extension-list-item@2.27.2': - resolution: {integrity: sha512-eJNee7IEGXMnmygM5SdMGDC8m/lMWmwNGf9fPCK6xk0NxuQRgmZHL6uApKcdH6gyNcRPHCqvTTkhEP7pbny/fg==} - peerDependencies: - '@tiptap/core': ^2.7.0 - - '@tiptap/extension-ordered-list@2.27.2': - resolution: {integrity: sha512-M7A4tLGJcLPYdLC4CI2Gwl8LOrENQW59u3cMVa+KkwG1hzSJyPsbDpa1DI6oXPC2WtYiTf22zrbq3gVvH+KA2w==} - peerDependencies: - '@tiptap/core': ^2.7.0 - - '@tiptap/extension-paragraph@2.27.2': - resolution: {integrity: sha512-elYVn2wHJJ+zB9LESENWOAfI4TNT0jqEN34sMA/hCtA4im1ZG2DdLHwkHIshj/c4H0dzQhmsS/YmNC5Vbqab/A==} - peerDependencies: - '@tiptap/core': ^2.7.0 - - '@tiptap/extension-placeholder@2.27.2': - resolution: {integrity: sha512-IjsgSVYJRjpAKmIoapU0E2R4E2FPY3kpvU7/1i7PUYisylqejSJxmtJPGYw0FOMQY9oxnEEvfZHMBA610tqKpg==} - peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 - - '@tiptap/extension-strike@2.27.2': - resolution: {integrity: sha512-HHIjhafLhS2lHgfAsCwC1okqMsQzR4/mkGDm4M583Yftyjri1TNA7lzhzXWRFWiiMfJxKtdjHjUAQaHuteRTZw==} - peerDependencies: - '@tiptap/core': ^2.7.0 - - '@tiptap/extension-table-cell@2.27.2': - resolution: {integrity: sha512-9Lk46MjZMFzVZfOj9Kd7VgC6Odt6vmEhlCYVumErShUY7EkFqCw3b2IYoUtQkntfOEx/Afnhff/okNQwPsJeUA==} - peerDependencies: - '@tiptap/core': ^2.7.0 - - '@tiptap/extension-table-header@2.27.2': - resolution: {integrity: sha512-ZEb6lbG0NbbodWLV0b4BS/QrDIPlUbCcuOsUxzqVvlMUY1Vg6Fj6fKwLaBcsIUDHi8sxZDBEgYEDw3BR/zcO6A==} - peerDependencies: - '@tiptap/core': ^2.7.0 - - '@tiptap/extension-table-row@2.27.2': - resolution: {integrity: sha512-Nw9+tA56Y5HtLVP01NGCZSUuTQhJPtfK9OfmDgGgcxynn2cRVdEtj+9FNZqRhQ1iRVaAI+Rd4xRvX9qYePMOxw==} - peerDependencies: - '@tiptap/core': ^2.7.0 - - '@tiptap/extension-table@2.27.2': - resolution: {integrity: sha512-pDbhOpT5phZkcsyPjGBQlXv0+0hmdrvqHJ+dJjkGcCtlfy2pHiEIhmIItOFagc7wXy8G9iUFZ9Jie4zvDf+brg==} - peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 - - '@tiptap/extension-text-style@2.27.2': - resolution: {integrity: sha512-Omk+uxjJLyEY69KStpCw5fA9asvV+MGcAX2HOxyISDFoLaL49TMrNjhGAuz09P1L1b0KGXo4ml7Q3v/Lfy4WPA==} - peerDependencies: - '@tiptap/core': ^2.7.0 - - '@tiptap/extension-text@2.27.2': - resolution: {integrity: sha512-Xk7nYcigljAY0GO9hAQpZ65ZCxqOqaAlTPDFcKerXmlkQZP/8ndx95OgUb1Xf63kmPOh3xypurGS2is3v0MXSA==} - peerDependencies: - '@tiptap/core': ^2.7.0 - - '@tiptap/pm@2.27.2': - resolution: {integrity: sha512-kaEg7BfiJPDQMKbjVIzEPO3wlcA+pZb2tlcK9gPrdDnEFaec2QTF1sXz2ak2IIb2curvnIrQ4yrfHgLlVA72wA==} - - '@tiptap/react@2.27.2': - resolution: {integrity: sha512-0EAs8Cpkfbvben1PZ34JN2Nd79Dhioynm2jML27DBbf1VWPk+FFWFGTMLUT0bu+Np5iVxio8fqV9t0mc4D6thA==} - peerDependencies: - '@tiptap/core': ^2.7.0 - '@tiptap/pm': ^2.7.0 - react: ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 - - '@tiptap/starter-kit@2.27.2': - resolution: {integrity: sha512-bb0gJvPoDuyRUQ/iuN52j1//EtWWttw+RXAv1uJxfR0uKf8X7uAqzaOOgwjknoCIDC97+1YHwpGdnRjpDkOBxw==} - - '@types/diff-match-patch@1.0.36': - resolution: {integrity: sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==} - - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - - '@types/linkify-it@5.0.0': - resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} - - '@types/markdown-it@14.1.2': - resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} - - '@types/mdurl@2.0.0': - resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} - - '@types/node-fetch@2.6.13': - resolution: {integrity: sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==} - - '@types/node@18.19.130': - resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} - - '@types/node@22.19.15': - resolution: {integrity: sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==} - - '@types/react-dom@19.2.3': - resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} - peerDependencies: - '@types/react': ^19.2.0 - - '@types/react@19.2.14': - resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} - - '@types/use-sync-external-store@0.0.6': - resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==} - - '@vektorprogrammet/sdk@0.1.2': - resolution: {integrity: sha512-3dBn7iwynA6YfkbdhmB+3so2ZLFOJxEv98EFjAtRng7nUJIa3odQVcXT6T6xSVvbWVhU85d64Khsu/O1OMAQXA==} - peerDependencies: - '@tanstack/react-query': ^5 - react: ^18 || ^19 - - '@videojs/http-streaming@3.17.4': - resolution: {integrity: sha512-XAvdG2dolBuV2Fx8bu1kjmQ2D4TonGzZH68Pgv/O9xMSFWdZtITSMFismeQLEAtMmGwze8qNJp3RgV+jStrJqg==} - engines: {node: '>=8', npm: '>=5'} - peerDependencies: - video.js: ^8.19.0 - - '@videojs/vhs-utils@4.1.1': - resolution: {integrity: sha512-5iLX6sR2ownbv4Mtejw6Ax+naosGvoT9kY+gcuHzANyUZZ+4NpeNdKMUhb6ag0acYej1Y7cmr/F2+4PrggMiVA==} - engines: {node: '>=8', npm: '>=5'} - - '@videojs/xhr@2.7.0': - resolution: {integrity: sha512-giab+EVRanChIupZK7gXjHy90y3nncA2phIOyG3Ne5fvpiMJzvqYwiTOnEVW2S4CoYcuKJkomat7bMXA/UoUZQ==} - - '@xmldom/xmldom@0.8.11': - resolution: {integrity: sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==} - engines: {node: '>=10.0.0'} - - abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - - accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} - - acorn-walk@8.3.5: - resolution: {integrity: sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==} - engines: {node: '>=0.4.0'} - - acorn@8.16.0: - resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} - engines: {node: '>=0.4.0'} - hasBin: true - - aes-decrypter@4.0.2: - resolution: {integrity: sha512-lc+/9s6iJvuaRe5qDlMTpCFjnwpkeOXp8qP3oiZ5jsj1MRg+SBVUmmICrhxHvc8OELSmc+fEyyxAuppY6hrWzw==} - - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - ai@4.3.19: - resolution: {integrity: sha512-dIE2bfNpqHN3r6IINp9znguYdhIOheKW2LDigAMrgt/upT3B8eBGPSCblENvaZGoq+hxaN9fSMzjWpbqloP+7Q==} - engines: {node: '>=18'} - peerDependencies: - react: ^18 || ^19 || ^19.0.0-rc - zod: ^3.23.8 - peerDependenciesMeta: - react: - optional: true - - arg@5.0.2: - resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - aria-hidden@1.2.6: - resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} - engines: {node: '>=10'} - - array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - - axe-core@4.11.1: - resolution: {integrity: sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A==} - engines: {node: '>=4'} - - babel-dead-code-elimination@1.0.12: - resolution: {integrity: sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - barbe@2.2.1: - resolution: {integrity: sha512-yx9qVTYLHqoglkWensOg8lBe/OPiFhcttEsQhs8d4tYvZoQbkGwDQ1R6I2uLijTCCylQXX4nIGVIlcaKf0fO4Q==} - - baseline-browser-mapping@2.10.0: - resolution: {integrity: sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==} - engines: {node: '>=6.0.0'} - hasBin: true - - basic-auth@2.0.1: - resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} - engines: {node: '>= 0.8'} - - bcp-47-match@1.0.3: - resolution: {integrity: sha512-LggQ4YTdjWQSKELZF5JwchnBa1u0pIQSZf5lSdOHEdbVP55h0qICA/FUp3+W99q0xqxYa1ZQizTUH87gecII5w==} - - bcp-47-normalize@1.1.1: - resolution: {integrity: sha512-jWZ1Jdu3cs0EZdfCkS0UE9Gg01PtxnChjEBySeB+Zo6nkqtFfnvtoQQgP1qU1Oo4qgJgxhTI6Sf9y/pZIhPs0A==} - - bcp-47@1.0.8: - resolution: {integrity: sha512-Y9y1QNBBtYtv7hcmoX0tR+tUNSFZGZ6OL6vKPObq8BbOhkCoyayF6ogfLTgAli/KuAEbsYHYUNq2AQuY6IuLag==} - - body-parser@1.20.4: - resolution: {integrity: sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - - brace-expansion@2.0.2: - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} - - browserslist@4.28.1: - resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - - cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - - call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} - - call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} - - caniuse-lite@1.0.30001776: - resolution: {integrity: sha512-sg01JDPzZ9jGshqKSckOQthXnYwOEP50jeVFhaSFbZcOy05TiuuaffDOfcwtCisJ9kNQuLBFibYywv2Bgm9osw==} - - chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - chokidar@4.0.3: - resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} - engines: {node: '>= 14.16.0'} - - class-variance-authority@0.7.1: - resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} - - client-only@0.0.1: - resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} - - clsx@2.1.1: - resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} - engines: {node: '>=6'} - - cmdk@1.1.1: - resolution: {integrity: sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==} - peerDependencies: - react: ^18 || ^19 || ^19.0.0-rc - react-dom: ^18 || ^19 || ^19.0.0-rc - - codem-isoboxer@0.3.9: - resolution: {integrity: sha512-4XOTqEzBWrGOZaMd+sTED2hLpzfBbiQCf1W6OBGkIHqk1D8uwy8WFLazVbdQwfDpQ+vf39lqTGPa9IhWW0roTA==} - - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - - commander@11.1.0: - resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} - engines: {node: '>=16'} - - commander@7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} - - commander@8.3.0: - resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} - engines: {node: '>= 12'} - - commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} - - compressible@2.0.18: - resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} - engines: {node: '>= 0.6'} - - compression@1.8.1: - resolution: {integrity: sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==} - engines: {node: '>= 0.8.0'} - - confbox@0.2.4: - resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} - - content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} - - content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - - convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - - cookie-signature@1.0.7: - resolution: {integrity: sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==} - - cookie@0.7.2: - resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} - engines: {node: '>= 0.6'} - - cookie@1.1.1: - resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} - engines: {node: '>=18'} - - create-gi@1.0.4: - resolution: {integrity: sha512-mjVUIrg+sNv9lrVr+zirmlPX7dr4ExChW5RbKgH1GsSUFDfMJ2NFPTtwdVDGm1YygTfNkbSwrvF8e7XmN09D2w==} - hasBin: true - - crelt@1.0.6: - resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} - - csstype@3.2.3: - resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} - - dashjs@4.7.4: - resolution: {integrity: sha512-+hldo25QPP3H/NOwqUrvt4uKdMse60/Gsz9AUAnoYfhga8qHWq4nWiojUosOiigbigkDTCAn9ORcvUaKCvmfCA==} - - debounce@1.2.1: - resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} - - debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.4.3: - resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - dedent@1.7.2: - resolution: {integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==} - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true - - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - - depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - - dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - - destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - - detect-libc@2.1.2: - resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} - engines: {node: '>=8'} - - detect-node-es@1.1.0: - resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} - - diff-match-patch@1.0.5: - resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} - - dom-walk@0.1.2: - resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} - - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} - - duplexer@0.1.2: - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - - ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - - electron-to-chromium@1.5.307: - resolution: {integrity: sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg==} - - emojer@1.1.6: - resolution: {integrity: sha512-0rNJBx2tBbao/1PIZMWk5Ym2oIlGUUkFOM2ldyWcJkxGr2qGJ+AcY6o+LdAfgEti6jTKTHoq/8Lnx9Ic+dtlNQ==} - - encodeurl@2.0.0: - resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} - engines: {node: '>= 0.8'} - - encriptorjs@1.0.2: - resolution: {integrity: sha512-+gnlMVYUAWnmX60CPkyeCoBLiYOLgkbljATUpNFeIUHA6x8O6XdPRprCBc+cnfnqjCtSNA7ozgAHmukbXzaF+Q==} - - enhanced-resolve@5.20.0: - resolution: {integrity: sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ==} - engines: {node: '>=10.13.0'} - - entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - - es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-module-lexer@1.7.0: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} - - es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.1.0: - resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} - engines: {node: '>= 0.4'} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - esbuild@0.25.12: - resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} - engines: {node: '>=18'} - hasBin: true - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - - event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - - exit-hook@2.2.1: - resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} - engines: {node: '>=6'} - - express@4.22.1: - resolution: {integrity: sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==} - engines: {node: '>= 0.10.0'} - - exsolve@1.0.8: - resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} - - fast-deep-equal@2.0.1: - resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==} - - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - fault@1.0.4: - resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==} - - fdir@6.5.0: - resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} - engines: {node: '>=12.0.0'} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - - finalhandler@1.3.2: - resolution: {integrity: sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==} - engines: {node: '>= 0.8'} - - form-data-encoder@1.7.2: - resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} - - form-data@4.0.5: - resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} - engines: {node: '>= 6'} - - format@0.2.2: - resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} - engines: {node: '>=0.4.x'} - - formdata-node@4.4.1: - resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} - engines: {node: '>= 12.20'} - - forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - - fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} - - fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - - get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} - - get-nonce@1.0.1: - resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} - engines: {node: '>=6'} - - get-port@5.1.1: - resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} - engines: {node: '>=8'} - - get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} - - github-api-emojis@1.0.4: - resolution: {integrity: sha512-KOIHyYLdixrDCGTn2j4P+q0RVxOEhKMGUiqKZmCL+c6/yjIqpCkNitcubxq0H5oOt/I9ZeBrv3zOvjT8st/rKg==} - - glijs@1.0.1: - resolution: {integrity: sha512-2D+bFTAm3egMVmaV9ZG/KK8MaWuJq2wVOZu1RY8lZ7l16iB7lihiz8h9TBiHymOm2aatOTVFSOYCmDpp1Kscug==} - - global@4.4.0: - resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} - - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - gzip-size@6.0.0: - resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} - engines: {node: '>=10'} - - has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - highlight.js@10.7.3: - resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} - - highlight.js@11.11.1: - resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} - engines: {node: '>=12.0.0'} - - hls.js@1.6.15: - resolution: {integrity: sha512-E3a5VwgXimGHwpRGV+WxRTKeSp2DW5DI5MWv34ulL3t5UNmyJWCQ1KmLEHbYzcfThfXG8amBL+fCYPneGHC4VA==} - - html-encoder-decoder@1.3.11: - resolution: {integrity: sha512-bDRaOgwtv7trc7YsBoMOPqaFSmI11iPilcPXE1i/blBHe42z8dXQ7yw2Sh9KdmE3CF4fQcIXih69zuFmZi8HoA==} - - html-entities@1.4.0: - resolution: {integrity: sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==} - - html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - - htmled@1.0.1: - resolution: {integrity: sha512-GfE2GsFY8rpmwdn5PQutIDwel5yeTBdlvKn6mQRSBWzyAgx946UT5K/qD9Fq8Ei5Cw4rqES8TRfSFYbxq+/CDw==} - - http-errors@2.0.1: - resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} - engines: {node: '>= 0.8'} - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - - immediate@3.0.6: - resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} - - imsc@1.1.5: - resolution: {integrity: sha512-V8je+CGkcvGhgl2C1GlhqFFiUOIEdwXbXLiu1Fcubvvbo+g9inauqT3l0pNYXGoLPBj3jxtZz9t+wCopMkwadQ==} - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - - is-alphabetical@1.0.4: - resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} - - is-alphanumerical@1.0.4: - resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} - - is-decimal@1.0.4: - resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} - - is-function@1.0.2: - resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==} - - is-plain-object@5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} - engines: {node: '>=0.10.0'} - - isbot@5.1.35: - resolution: {integrity: sha512-waFfC72ZNfwLLuJ2iLaoVaqcNo+CAaLR7xCpAn0Y5WfGzkNHv7ZN39Vbi1y+kb+Zs46XHOX3tZNExroFUPX+Kg==} - engines: {node: '>=18'} - - iterate-object@1.3.5: - resolution: {integrity: sha512-eL23u8oFooYTq6TtJKjp2RYjZnCkUYQvC0T/6fJfWykXJ3quvdDdzKZ3CEjy8b3JGOvLTjDYMEMIp5243R906A==} - - jiti@2.6.1: - resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} - hasBin: true - - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} - engines: {node: '>=6'} - hasBin: true - - json-schema@0.4.0: - resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} - - json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - - jsondiffpatch@0.6.0: - resolution: {integrity: sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - - lie@3.1.1: - resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} - - lightningcss-android-arm64@1.31.1: - resolution: {integrity: sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [android] - - lightningcss-darwin-arm64@1.31.1: - resolution: {integrity: sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [darwin] - - lightningcss-darwin-x64@1.31.1: - resolution: {integrity: sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [darwin] - - lightningcss-freebsd-x64@1.31.1: - resolution: {integrity: sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [freebsd] - - lightningcss-linux-arm-gnueabihf@1.31.1: - resolution: {integrity: sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==} - engines: {node: '>= 12.0.0'} - cpu: [arm] - os: [linux] - - lightningcss-linux-arm64-gnu@1.31.1: - resolution: {integrity: sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] - - lightningcss-linux-arm64-musl@1.31.1: - resolution: {integrity: sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] - - lightningcss-linux-x64-gnu@1.31.1: - resolution: {integrity: sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - - lightningcss-linux-x64-musl@1.31.1: - resolution: {integrity: sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - - lightningcss-win32-arm64-msvc@1.31.1: - resolution: {integrity: sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [win32] - - lightningcss-win32-x64-msvc@1.31.1: - resolution: {integrity: sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [win32] - - lightningcss@1.31.1: - resolution: {integrity: sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==} - engines: {node: '>= 12.0.0'} - - linkify-it@5.0.0: - resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} - - linkifyjs@4.3.2: - resolution: {integrity: sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA==} - - localforage@1.10.0: - resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} - - lodash@4.17.23: - resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} - - lowlight@1.20.0: - resolution: {integrity: sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==} - - lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - - lucide-react@0.294.0: - resolution: {integrity: sha512-V7o0/VECSGbLHn3/1O67FUgBwWB+hmzshrgDVRJQhMh8uj5D3HBuIvhuAmQTtlupILSplwIZg5FTc4tTKMA2SA==} - peerDependencies: - react: ^16.5.1 || ^17.0.0 || ^18.0.0 - - lucide-react@0.486.0: - resolution: {integrity: sha512-xWop/wMsC1ikiEVLZrxXjPKw4vU/eAip33G2mZHgbWnr4Nr5Rt4Vx4s/q1D3B/rQVbxjOuqASkEZcUxDEKzecw==} - peerDependencies: - react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 - - lucide-react@0.513.0: - resolution: {integrity: sha512-CJZKq2g8Y8yN4Aq002GahSXbG2JpFv9kXwyiOAMvUBv7pxeOFHUWKB0mO7MiY4ZVFCV4aNjv2BJFq/z3DgKPQg==} - peerDependencies: - react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 - - m3u8-parser@7.2.0: - resolution: {integrity: sha512-CRatFqpjVtMiMaKXxNvuI3I++vUumIXVVT/JpCpdU/FynV/ceVw1qpPyyBNindL+JlPMSesx+WX1QJaZEJSaMQ==} - - magic-string@0.30.21: - resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - - markdown-it@14.1.1: - resolution: {integrity: sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==} - hasBin: true - - markmind-editor@0.1.0: - resolution: {integrity: sha512-7XSEuRtr03OVvjdyEWs2eBpfPcC6s3yirogTb8q4Eem4IUf2UWyF8GTiDslo3K0AV3H4QPRCHgIfbJByMbiiyA==} - peerDependencies: - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - - match-all@1.2.7: - resolution: {integrity: sha512-qSpsBKarh55r9KyXzFC3xBLRf2GlGasba2em9kbpRsSlGvdTAqjx3QD0r3FKSARiW+OE4iMHYsolM3aX9n5djw==} - - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} - - mdurl@2.0.0: - resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} - - media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} - - merge-descriptors@1.0.3: - resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} - - methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} - - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-db@1.54.0: - resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - - mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - - min-document@2.19.2: - resolution: {integrity: sha512-8S5I8db/uZN8r9HSLFVWPdJCvYOejMcEC82VIzNUc6Zkklf/d1gg2psfE79/vyhWOj4+J8MtwmoOz3TmvaGu5A==} - - minimatch@9.0.9: - resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} - engines: {node: '>=16 || 14 >=14.17'} - - morgan@1.10.1: - resolution: {integrity: sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==} - engines: {node: '>= 0.8.0'} - - mpd-parser@1.3.1: - resolution: {integrity: sha512-1FuyEWI5k2HcmhS1HkKnUAQV7yFPfXPht2DnRRGtoiiAAW+ESTbtEXIDpRkwdU+XyrQuwrIym7UkoPKsZ0SyFw==} - hasBin: true - - mrmime@2.0.1: - resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} - engines: {node: '>=10'} - - ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - mux.js@7.1.0: - resolution: {integrity: sha512-NTxawK/BBELJrYsZThEulyUMDVlLizKdxyAsMuzoCD1eFj97BVaA8D/CvKsKu6FOLYkFojN5CbM9h++ZTZtknA==} - engines: {node: '>=8', npm: '>=5'} - hasBin: true - - nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - - negotiator@0.6.4: - resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} - engines: {node: '>= 0.6'} - - next-themes@0.4.6: - resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==} - peerDependencies: - react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - - next@15.5.12: - resolution: {integrity: sha512-Fi/wQ4Etlrn60rz78bebG1i1SR20QxvV8tVp6iJspjLUSHcZoeUXCt+vmWoEcza85ElZzExK/jJ/F6SvtGktjA==} - engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} - hasBin: true - peerDependencies: - '@opentelemetry/api': ^1.1.0 - '@playwright/test': ^1.51.1 - babel-plugin-react-compiler: '*' - react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 - react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 - sass: ^1.3.0 - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - '@playwright/test': - optional: true - babel-plugin-react-compiler: - optional: true - sass: - optional: true - - niva-ui@0.1.0: - resolution: {integrity: sha512-bE6bYBdY6aUoYaMmuxzCQ0hyAXkkv4OYN1KBaP9mAQwO6oc3AJ5DRh8ABGtziL/1rNAS9JF4l72yvlanMFnBIg==} - engines: {node: '>=16.0.0'} - hasBin: true - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} - deprecated: Use your platform's native DOMException instead - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-releases@2.0.36: - resolution: {integrity: sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==} - - notion-design-system@1.0.0: - resolution: {integrity: sha512-nvaCI/tutdotKFH7MAFH7Xf1/pM9D7QYSYihG8o/hbBg8ZGI/lgiswmjjTU4qxjIQ8mbdII9priR9HlTeoovvA==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} - - on-finished@2.3.0: - resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} - engines: {node: '>= 0.8'} - - on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - - on-headers@1.1.0: - resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==} - engines: {node: '>= 0.8'} - - openai@4.104.0: - resolution: {integrity: sha512-p99EFNsA/yX6UhVO93f5kJsDRLAg+CTA2RBqdHK4RtK8u5IJw32Hyb2dTGKbnnFmnuoBv5r7Z2CURI9sGZpSuA==} - hasBin: true - peerDependencies: - ws: ^8.18.0 - zod: ^3.23.8 - peerDependenciesMeta: - ws: - optional: true - zod: - optional: true - - openapi-fetch@0.13.8: - resolution: {integrity: sha512-yJ4QKRyNxE44baQ9mY5+r/kAzZ8yXMemtNAOFwOzRXJscdjSxxzWSNlyBAr+o5JjkUw9Lc3W7OIoca0cY3PYnQ==} - - openapi-react-query@0.3.2: - resolution: {integrity: sha512-nJq1Fpt0PwO0KeJf+pL5s5m9ecIaWmaFqkfrxwMOKMEEP2yLuOW4pb0UzSxkYIAq9dlQHiHpYCHu0tb7F0kSkA==} - peerDependencies: - '@tanstack/react-query': ^5.25.0 - openapi-fetch: ^0.13.6 - - openapi-typescript-helpers@0.0.15: - resolution: {integrity: sha512-opyTPaunsklCBpTK8JGef6mfPhLSnyy5a0IN9vKtx3+4aExf+KxEqYwIy3hqkedXIB97u357uLMJsOnm3GVjsw==} - - opener@1.5.2: - resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} - hasBin: true - - orderedmap@2.1.1: - resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==} - - p-map@7.0.4: - resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==} - engines: {node: '>=18'} - - parsemarkjs@1.0.1: - resolution: {integrity: sha512-7q9JNgiXGlMTr/CmBsNnW4+AmDSC+682izfsrIm4bm56NIv6PnynWy0U/8QIvWgsojqdIMcTbrcHvLUPhhl5FA==} - - parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - - path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - - path-to-regexp@0.1.12: - resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} - - pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - - pathe@2.0.3: - resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - - picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - - picomatch@4.0.3: - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} - engines: {node: '>=12'} - - pkcs7@1.0.4: - resolution: {integrity: sha512-afRERtHn54AlwaF2/+LFszyAANTCggGilmcmILUzEjvs3XgFZT+xE6+QWQcAGmu4xajy+Xtj7acLOPdx5/eXWQ==} - hasBin: true - - pkg-types@2.3.0: - resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} - - playwright-core@1.58.2: - resolution: {integrity: sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==} - engines: {node: '>=18'} - hasBin: true - - playwright@1.58.2: - resolution: {integrity: sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==} - engines: {node: '>=18'} - hasBin: true - - postcss@8.4.31: - resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} - engines: {node: ^10 || ^12 || >=14} - - postcss@8.5.8: - resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} - engines: {node: ^10 || ^12 || >=14} - - prettier@3.8.1: - resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} - engines: {node: '>=14'} - hasBin: true - - process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - - prosemirror-changeset@2.4.0: - resolution: {integrity: sha512-LvqH2v7Q2SF6yxatuPP2e8vSUKS/L+xAU7dPDC4RMyHMhZoGDfBC74mYuyYF4gLqOEG758wajtyhNnsTkuhvng==} - - prosemirror-collab@1.3.1: - resolution: {integrity: sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==} - - prosemirror-commands@1.7.1: - resolution: {integrity: sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==} - - prosemirror-dropcursor@1.8.2: - resolution: {integrity: sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw==} - - prosemirror-gapcursor@1.4.0: - resolution: {integrity: sha512-z00qvurSdCEWUIulij/isHaqu4uLS8r/Fi61IbjdIPJEonQgggbJsLnstW7Lgdk4zQ68/yr6B6bf7sJXowIgdQ==} - - prosemirror-history@1.5.0: - resolution: {integrity: sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==} - - prosemirror-inputrules@1.5.1: - resolution: {integrity: sha512-7wj4uMjKaXWAQ1CDgxNzNtR9AlsuwzHfdFH1ygEHA2KHF2DOEaXl1CJfNPAKCg9qNEh4rum975QLaCiQPyY6Fw==} - - prosemirror-keymap@1.2.3: - resolution: {integrity: sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==} - - prosemirror-markdown@1.13.4: - resolution: {integrity: sha512-D98dm4cQ3Hs6EmjK500TdAOew4Z03EV71ajEFiWra3Upr7diytJsjF4mPV2dW+eK5uNectiRj0xFxYI9NLXDbw==} - - prosemirror-menu@1.3.0: - resolution: {integrity: sha512-TImyPXCHPcDsSka2/lwJ6WjTASr4re/qWq1yoTTuLOqfXucwF6VcRa2LWCkM/EyTD1UO3CUwiH8qURJoWJRxwg==} - - prosemirror-model@1.25.4: - resolution: {integrity: sha512-PIM7E43PBxKce8OQeezAs9j4TP+5yDpZVbuurd1h5phUxEKIu+G2a+EUZzIC5nS1mJktDJWzbqS23n1tsAf5QA==} - - prosemirror-schema-basic@1.2.4: - resolution: {integrity: sha512-ELxP4TlX3yr2v5rM7Sb70SqStq5NvI15c0j9j/gjsrO5vaw+fnnpovCLEGIcpeGfifkuqJwl4fon6b+KdrODYQ==} - - prosemirror-schema-list@1.5.1: - resolution: {integrity: sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==} - - prosemirror-state@1.4.4: - resolution: {integrity: sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==} - - prosemirror-tables@1.8.5: - resolution: {integrity: sha512-V/0cDCsHKHe/tfWkeCmthNUcEp1IVO3p6vwN8XtwE9PZQLAZJigbw3QoraAdfJPir4NKJtNvOB8oYGKRl+t0Dw==} - - prosemirror-trailing-node@3.0.0: - resolution: {integrity: sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==} - peerDependencies: - prosemirror-model: ^1.22.1 - prosemirror-state: ^1.4.2 - prosemirror-view: ^1.33.8 - - prosemirror-transform@1.11.0: - resolution: {integrity: sha512-4I7Ce4KpygXb9bkiPS3hTEk4dSHorfRw8uI0pE8IhxlK2GXsqv5tIA7JUSxtSu7u8APVOTtbUBxTmnHIxVkIJw==} - - prosemirror-view@1.41.6: - resolution: {integrity: sha512-mxpcDG4hNQa/CPtzxjdlir5bJFDlm0/x5nGBbStB2BWX+XOQ9M8ekEG+ojqB5BcVu2Rc80/jssCMZzSstJuSYg==} - - proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} - - punycode.js@2.3.1: - resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} - engines: {node: '>=6'} - - qs@6.14.2: - resolution: {integrity: sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==} - engines: {node: '>=0.6'} - - queryxjs@1.0.0: - resolution: {integrity: sha512-N+I3rq6nRcO5wurtYV7kOnjDqKGM/2Nh6yLufeTuB434Jyo9DZTy/IL4b7+bbAk0bulzXyUVyo0z9zWPV4XdYw==} - - range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - - raw-body@2.5.3: - resolution: {integrity: sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==} - engines: {node: '>= 0.8'} - - react-dom@19.2.4: - resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==} - peerDependencies: - react: ^19.2.4 - - react-hook-form@7.71.2: - resolution: {integrity: sha512-1CHvcDYzuRUNOflt4MOq3ZM46AronNJtQ1S7tnX6YN4y72qhgiUItpacZUAQ0TyWYci3yz1X+rXaSxiuEm86PA==} - engines: {node: '>=18.0.0'} - peerDependencies: - react: ^16.8.0 || ^17 || ^18 || ^19 - - react-refresh@0.14.2: - resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} - engines: {node: '>=0.10.0'} - - react-remove-scroll-bar@2.3.8: - resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - react-remove-scroll@2.7.2: - resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - react-router-dom@7.13.1: - resolution: {integrity: sha512-UJnV3Rxc5TgUPJt2KJpo1Jpy0OKQr0AjgbZzBFjaPJcFOb2Y8jA5H3LT8HUJAiRLlWrEXWHbF1Z4SCZaQjWDHw==} - engines: {node: '>=20.0.0'} - peerDependencies: - react: '>=18' - react-dom: '>=18' - - react-router@7.13.1: - resolution: {integrity: sha512-td+xP4X2/6BJvZoX6xw++A2DdEi++YypA69bJUV5oVvqf6/9/9nNlD70YO1e9d3MyamJEBQFEzk6mbfDYbqrSA==} - engines: {node: '>=20.0.0'} - peerDependencies: - react: '>=18' - react-dom: '>=18' - peerDependenciesMeta: - react-dom: - optional: true - - react-style-singleton@2.2.3: - resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - react@19.2.4: - resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} - engines: {node: '>=0.10.0'} - - readdirp@4.1.2: - resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} - engines: {node: '>= 14.18.0'} - - regex-emoji@2.0.9: - resolution: {integrity: sha512-jtCSFzaIL/MbesSo9BDhYbJGOss/Eqb7U4uLhEDCST7eVIHmON+y6bkEWTCGgmZOERNOyIvrRr/rDMZAAuS9iA==} - - regex-escape@3.4.11: - resolution: {integrity: sha512-051l4Hl/0HoJwTvNztrWVjoxLiseSfCrDgWqwR1cnGM/nyQSeIjmvti5zZ7HzOmsXDPaJ2k0iFxQ6/WNpJD5wQ==} - - rollup@4.59.0: - resolution: {integrity: sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - - rope-sequence@1.3.4: - resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} - - safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - - safestore@1.0.0-beta.1: - resolution: {integrity: sha512-5m9MYHW5s/ixVbKxYN86Mor6ysPwAgmysk/IJur+r+UH+sKH5puGBmGRlCY2RBaRUcL4JZhcUudKIblVIfF3yQ==} - engines: {node: '>=12.0.0'} - hasBin: true - - sanskrit-lang@0.1.1: - resolution: {integrity: sha512-zen2c1tJ+sW6vmQ2/bBOD5dmoaWbiiUPv6JdPaXOym7e/Vwyhl2ovuI5QiPg/hvwNq+1WF4iqvKT69sRCMLFuw==} - engines: {node: '>=14.0.0'} - hasBin: true - - sax@1.2.1: - resolution: {integrity: sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==} - - scheduler@0.27.0: - resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} - - secure-json-parse@2.7.0: - resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} - - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - - semver@7.7.4: - resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} - engines: {node: '>=10'} - hasBin: true - - send@0.19.2: - resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} - engines: {node: '>= 0.8.0'} - - serve-static@1.16.3: - resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==} - engines: {node: '>= 0.8.0'} - - set-cookie-parser@2.7.2: - resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} - - setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - - sharp@0.34.5: - resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - - showdown-emoji@3.0.0: - resolution: {integrity: sha512-ZSEmtkMLJmm+2V0kjHwD6lgZM+t3X69+7fwAmKrthxO9CsyMDQ6cFb0wpLQX+LTDNb+HlCszpBLfBo/RG/l5Hw==} - - showdown-extensions@1.0.1: - resolution: {integrity: sha512-0Phk3NdjCHhG5bh9R8z7yA2UtcI5tD+OzlngXYprp9884QZSdDGwAvFFvsl2j2CpeJI8W218JQ4l6JLbvRLKNA==} - - showdown-highlight@3.1.0: - resolution: {integrity: sha512-wrTxtE63L/bpW5A2Uy/AO1gblXnNHK/cDL6LszECOoCdMJKWTj0/4n4I/pmqub+3H3KCPVDDvtXpCArnT/heFA==} - - showdown-target-blank@1.0.2: - resolution: {integrity: sha512-Yxvg/ixZ34Wwk5iaY/ZPzxnc0f1oQxzhg4lLezavHfhPZumIMQilRlfFTaIKW1tv3nIzA+FNBktuAjCgCQ242w==} - - showdown@1.1.0: - resolution: {integrity: sha512-qg3WJ40tVdXoEnccka5R+denlJyb+0iv24z6v99y2G7Ew5mrskYUrR7YYqf3Z3dV/4bZbNWcCJhAas7u1vKMTA==} - - showdown@2.1.0: - resolution: {integrity: sha512-/6NVYu4U819R2pUIk79n67SYgJHWCce0a5xTP979WbNp0FL9MN1I1QK662IDU1b6JzKTvmhgI7T7JYIxBi3kMQ==} - hasBin: true - - side-channel-list@1.0.0: - resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} - engines: {node: '>= 0.4'} - - side-channel-map@1.0.1: - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} - engines: {node: '>= 0.4'} - - side-channel-weakmap@1.0.2: - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} - engines: {node: '>= 0.4'} - - side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} - engines: {node: '>= 0.4'} - - sirv@2.0.4: - resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} - engines: {node: '>= 10'} - - sopplayer@1.0.0: - resolution: {integrity: sha512-lgbWHqQdbsAy7WEEWyi6ciYaPXCa80pprTZxIRN5pdm3OSZBnC2GacNwZ4allmw7AcwHgcyO+D7uPKhwsLiIQQ==} - - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - statuses@2.0.2: - resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} - engines: {node: '>= 0.8'} - - steamlit@1.0.0: - resolution: {integrity: sha512-HrUNAseHT82W/8OCL1wAAwPlpDglGbdWmKn27Aejc7QFh9JZGn6OTulLSTKw179FOwX5MQTWy+yl8nZUqVjEww==} - - styled-jsx@5.1.6: - resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} - engines: {node: '>= 12.0.0'} - peerDependencies: - '@babel/core': '*' - babel-plugin-macros: '*' - react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' - peerDependenciesMeta: - '@babel/core': - optional: true - babel-plugin-macros: - optional: true - - swr@2.4.1: - resolution: {integrity: sha512-2CC6CiKQtEwaEeNiqWTAw9PGykW8SR5zZX8MZk6TeAvEAnVS7Visz8WzphqgtQ8v2xz/4Q5K+j+SeMaKXeeQIA==} - peerDependencies: - react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - - tailwind-merge@2.6.1: - resolution: {integrity: sha512-Oo6tHdpZsGpkKG88HJ8RR1rg/RdnEkQEfMoEk2x1XRI3F1AxeU+ijRXpiVUF4UbLfcxxRGw6TbUINKYdWVsQTQ==} - - tailwind-merge@3.5.0: - resolution: {integrity: sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==} - - tailwindcss-animate@1.0.7: - resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} - peerDependencies: - tailwindcss: '>=3.0.0 || insiders' - - tailwindcss@4.2.1: - resolution: {integrity: sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw==} - - tanstack@1.0.3: - resolution: {integrity: sha512-5+Iy3/oQd3u81Sg+x2pt3fI+GAt02vqtKzO2hdWQDSFG2rnvY3yNr17xFhDRmg9iYoOgfWHRzhm34qFLpWWR6A==} - engines: {node: '>=14.0.0'} - hasBin: true - - tapable@2.3.0: - resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} - engines: {node: '>=6'} - - terabox@1.0.0: - resolution: {integrity: sha512-SCqf1fVF/cHfW4MkvcUP7vN7i1YikmyaVNWin/fOJdFzhJmQ16tcQjsJaHQ7X5pizGVkX5ZorlDZPriLqxFHmg==} - - throttleit@2.1.0: - resolution: {integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==} - engines: {node: '>=18'} - - tinyglobby@0.2.15: - resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} - engines: {node: '>=12.0.0'} - - tippy.js@6.3.7: - resolution: {integrity: sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==} - - toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - - totalist@3.0.1: - resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} - engines: {node: '>=6'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} - - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} - engines: {node: '>=14.17'} - hasBin: true - - ua-parser-js@1.0.41: - resolution: {integrity: sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug==} - hasBin: true - - uc.micro@2.1.0: - resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} - - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - - unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - - update-browserslist-db@1.2.3: - resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - - use-callback-ref@1.3.3: - resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - use-sidecar@1.1.3: - resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - use-sync-external-store@1.6.0: - resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - - utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} - - valibot@1.2.0: - resolution: {integrity: sha512-mm1rxUsmOxzrwnX5arGS+U4T25RdvpPjPN4yR0u9pUBov9+zGVtO84tif1eY4r6zWxVxu3KzIyknJy3rxfRZZg==} - peerDependencies: - typescript: '>=5' - peerDependenciesMeta: - typescript: - optional: true - - vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - - vaul@1.1.2: - resolution: {integrity: sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA==} - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc - - vibly@0.1.2: - resolution: {integrity: sha512-hPjBbQOD6NtZ6pI1MbppwKcY4DiJLh4zxu8aEGM9Icgttzzbhc2DesjHKrFPGtThX1FcMRKnrSqnRnFMTJARzw==} - peerDependencies: - video.js: ^7.0.0 || ^8.0.0 - - video.js@8.23.7: - resolution: {integrity: sha512-cG4HOygYt+Z8j6Sf5DuK6OgEOoM+g9oGP6vpqoZRaD13aHE4PMITbyjJUXZcIQbgB0wJEadBRaVm5lJIzo2jAA==} - - videojs-contrib-quality-levels@4.1.0: - resolution: {integrity: sha512-TfrXJJg1Bv4t6TOCMEVMwF/CoS8iENYsWNKip8zfhB5kTcegiFYezEA0eHAJPU64ZC8NQbxQgOwAsYU8VXbOWA==} - engines: {node: '>=16', npm: '>=8'} - peerDependencies: - video.js: ^8 - - videojs-font@4.2.0: - resolution: {integrity: sha512-YPq+wiKoGy2/M7ccjmlvwi58z2xsykkkfNMyIg4xb7EZQQNwB71hcSsB3o75CqQV7/y5lXkXhI/rsGAS7jfEmQ==} - - videojs-vtt.js@0.15.5: - resolution: {integrity: sha512-yZbBxvA7QMYn15Lr/ZfhhLPrNpI/RmCSCqgIff57GC2gIrV5YfyzLfLyZMj0NnZSAz8syB4N0nHXpZg9MyrMOQ==} - - vite-node@3.2.4: - resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - - vite@6.4.1: - resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - jiti: '>=1.21.0' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - - w3c-keyname@2.2.8: - resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} - - web-streams-polyfill@4.0.0-beta.3: - resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} - engines: {node: '>= 14'} - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - webpack-bundle-analyzer@4.10.1: - resolution: {integrity: sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ==} - engines: {node: '>= 10.13.0'} - hasBin: true - - webscrapperjs@1.0.0: - resolution: {integrity: sha512-weNg8xp7bgX2WVh2lc8e2mp1X7NguEI04v+jNbjyMI4TCg+f2qhziqpfVvPi+nGqDrYeIx+5srN+Xz2dB7ALYw==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - - zod-to-json-schema@3.25.1: - resolution: {integrity: sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==} - peerDependencies: - zod: ^3.25 || ^4 - - zod@3.25.76: - resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} - -snapshots: - - '@ai-sdk/provider-utils@2.2.8(zod@3.25.76)': - dependencies: - '@ai-sdk/provider': 1.1.3 - nanoid: 3.3.11 - secure-json-parse: 2.7.0 - zod: 3.25.76 - - '@ai-sdk/provider@1.1.3': - dependencies: - json-schema: 0.4.0 - - '@ai-sdk/react@1.2.12(react@19.2.4)(zod@3.25.76)': - dependencies: - '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) - '@ai-sdk/ui-utils': 1.2.11(zod@3.25.76) - react: 19.2.4 - swr: 2.4.1(react@19.2.4) - throttleit: 2.1.0 - optionalDependencies: - zod: 3.25.76 - - '@ai-sdk/ui-utils@1.2.11(zod@3.25.76)': - dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) - zod: 3.25.76 - zod-to-json-schema: 3.25.1(zod@3.25.76) - - '@alloc/quick-lru@5.2.0': {} - - '@axe-core/playwright@4.11.1(playwright-core@1.58.2)': - dependencies: - axe-core: 4.11.1 - playwright-core: 1.58.2 - - '@babel/code-frame@7.29.0': - dependencies: - '@babel/helper-validator-identifier': 7.28.5 - js-tokens: 4.0.0 - picocolors: 1.1.1 - - '@babel/compat-data@7.29.0': {} - - '@babel/core@7.29.0': - dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helpers': 7.28.6 - '@babel/parser': 7.29.0 - '@babel/template': 7.28.6 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 - '@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.1': - dependencies: - '@babel/parser': 7.29.0 - '@babel/types': 7.29.0 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - jsesc: 3.0.2 - - '@babel/helper-annotate-as-pure@7.27.3': - dependencies: - '@babel/types': 7.29.0 - - '@babel/helper-compilation-targets@7.28.6': - dependencies: - '@babel/compat-data': 7.29.0 - '@babel/helper-validator-option': 7.27.1 - browserslist: 4.28.1 - lru-cache: 5.1.1 - semver: 6.3.1 - - '@babel/helper-create-class-features-plugin@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-member-expression-to-functions': 7.28.5 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0) - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.29.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/helper-globals@7.28.0': {} - - '@babel/helper-member-expression-to-functions@7.28.5': - dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-imports@7.28.6': - dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.29.0 - transitivePeerDependencies: - - supports-color - - '@babel/helper-optimise-call-expression@7.27.1': - dependencies: - '@babel/types': 7.29.0 - - '@babel/helper-plugin-utils@7.28.6': {} - - '@babel/helper-replace-supers@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-member-expression-to-functions': 7.28.5 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.29.0 - transitivePeerDependencies: - - supports-color - - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': - dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 - transitivePeerDependencies: - - supports-color - - '@babel/helper-string-parser@7.27.1': {} - - '@babel/helper-validator-identifier@7.28.5': {} - - '@babel/helper-validator-option@7.27.1': {} - - '@babel/helpers@7.28.6': - dependencies: - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 - - '@babel/parser@7.29.0': - dependencies: - '@babel/types': 7.29.0 - - '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-modules-commonjs@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-typescript@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) - transitivePeerDependencies: - - supports-color - - '@babel/preset-typescript@7.28.5(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.29.0) - transitivePeerDependencies: - - supports-color - - '@babel/runtime@7.28.6': {} - - '@babel/template@7.28.6': - dependencies: - '@babel/code-frame': 7.29.0 - '@babel/parser': 7.29.0 - '@babel/types': 7.29.0 - - '@babel/traverse@7.29.0': - dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.29.0 - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - - '@babel/types@7.29.0': - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 - - '@discoveryjs/json-ext@0.5.7': {} - - '@emnapi/runtime@1.8.1': - dependencies: - tslib: 2.8.1 - optional: true - - '@esbuild/aix-ppc64@0.25.12': - optional: true - - '@esbuild/android-arm64@0.25.12': - optional: true - - '@esbuild/android-arm@0.25.12': - optional: true - - '@esbuild/android-x64@0.25.12': - optional: true - - '@esbuild/darwin-arm64@0.25.12': - optional: true - - '@esbuild/darwin-x64@0.25.12': - optional: true - - '@esbuild/freebsd-arm64@0.25.12': - optional: true - - '@esbuild/freebsd-x64@0.25.12': - optional: true - - '@esbuild/linux-arm64@0.25.12': - optional: true - - '@esbuild/linux-arm@0.25.12': - optional: true - - '@esbuild/linux-ia32@0.25.12': - optional: true - - '@esbuild/linux-loong64@0.25.12': - optional: true - - '@esbuild/linux-mips64el@0.25.12': - optional: true - - '@esbuild/linux-ppc64@0.25.12': - optional: true - - '@esbuild/linux-riscv64@0.25.12': - optional: true - - '@esbuild/linux-s390x@0.25.12': - optional: true - - '@esbuild/linux-x64@0.25.12': - optional: true - - '@esbuild/netbsd-arm64@0.25.12': - optional: true - - '@esbuild/netbsd-x64@0.25.12': - optional: true - - '@esbuild/openbsd-arm64@0.25.12': - optional: true - - '@esbuild/openbsd-x64@0.25.12': - optional: true - - '@esbuild/openharmony-arm64@0.25.12': - optional: true - - '@esbuild/sunos-x64@0.25.12': - optional: true - - '@esbuild/win32-arm64@0.25.12': - optional: true - - '@esbuild/win32-ia32@0.25.12': - optional: true - - '@esbuild/win32-x64@0.25.12': - optional: true - - '@floating-ui/core@1.7.5': - dependencies: - '@floating-ui/utils': 0.2.11 - - '@floating-ui/dom@1.7.6': - dependencies: - '@floating-ui/core': 1.7.5 - '@floating-ui/utils': 0.2.11 - - '@floating-ui/react-dom@2.1.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@floating-ui/dom': 1.7.6 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@floating-ui/utils@0.2.11': {} - - '@hookform/resolvers@4.1.3(react-hook-form@7.71.2(react@19.2.4))': - dependencies: - '@standard-schema/utils': 0.3.0 - react-hook-form: 7.71.2(react@19.2.4) - - '@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.8.1 - 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': {} - - '@jridgewell/trace-mapping@0.3.31': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 - - '@mantine/hooks@7.17.8(react@19.2.4)': - dependencies: - react: 19.2.4 - - '@mjackson/node-fetch-server@0.2.0': {} - - '@next/bundle-analyzer@15.5.12': - dependencies: - webpack-bundle-analyzer: 4.10.1 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - '@next/env@15.5.12': {} - - '@next/swc-darwin-arm64@15.5.12': - optional: true - - '@next/swc-darwin-x64@15.5.12': - optional: true - - '@next/swc-linux-arm64-gnu@15.5.12': - optional: true - - '@next/swc-linux-arm64-musl@15.5.12': - optional: true - - '@next/swc-linux-x64-gnu@15.5.12': - optional: true - - '@next/swc-linux-x64-musl@15.5.12': - optional: true - - '@next/swc-win32-arm64-msvc@15.5.12': - optional: true - - '@next/swc-win32-x64-msvc@15.5.12': - optional: true - - '@opentelemetry/api@1.9.0': {} - - '@playwright/test@1.58.2': - dependencies: - playwright: 1.58.2 - - '@polka/url@1.0.0-next.29': {} - - '@popperjs/core@2.11.8': {} - - '@radix-ui/number@1.1.1': {} - - '@radix-ui/primitive@1.1.3': {} - - '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) - - '@radix-ui/react-avatar@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@radix-ui/react-context': 1.1.3(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) - - '@radix-ui/react-checkbox@1.3.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.14)(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) - - '@radix-ui/react-collapsible@1.1.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) - - '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) - - '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.14)(react@19.2.4)': - dependencies: - react: 19.2.4 - optionalDependencies: - '@types/react': 19.2.14 - - '@radix-ui/react-context@1.1.2(@types/react@19.2.14)(react@19.2.4)': - dependencies: - react: 19.2.4 - optionalDependencies: - '@types/react': 19.2.14 - - '@radix-ui/react-context@1.1.3(@types/react@19.2.14)(react@19.2.4)': - dependencies: - react: 19.2.4 - optionalDependencies: - '@types/react': 19.2.14 - - '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) - aria-hidden: 1.2.6 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - react-remove-scroll: 2.7.2(@types/react@19.2.14)(react@19.2.4) - optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) - - '@radix-ui/react-direction@1.1.1(@types/react@19.2.14)(react@19.2.4)': - dependencies: - react: 19.2.4 - optionalDependencies: - '@types/react': 19.2.14 - - '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.14)(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) - - '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) - - '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.14)(react@19.2.4)': - dependencies: - react: 19.2.4 - optionalDependencies: - '@types/react': 19.2.14 - - '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) - - '@radix-ui/react-id@1.1.1(@types/react@19.2.14)(react@19.2.4)': - dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) - react: 19.2.4 - optionalDependencies: - '@types/react': 19.2.14 - - '@radix-ui/react-label@2.1.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) - - '@radix-ui/react-menu@2.1.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) - aria-hidden: 1.2.6 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - react-remove-scroll: 2.7.2(@types/react@19.2.14)(react@19.2.4) - optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) - - '@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) - aria-hidden: 1.2.6 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - react-remove-scroll: 2.7.2(@types/react@19.2.14)(react@19.2.4) - optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) - - '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@floating-ui/react-dom': 2.1.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/rect': 1.1.1 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) - - '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) - - '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) - - '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) - - '@radix-ui/react-primitive@2.1.4(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@radix-ui/react-slot': 1.2.4(@types/react@19.2.14)(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) - - '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) - - '@radix-ui/react-select@2.2.6(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@radix-ui/number': 1.1.1 - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - aria-hidden: 1.2.6 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - react-remove-scroll: 2.7.2(@types/react@19.2.14)(react@19.2.4) - optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) - - '@radix-ui/react-separator@1.1.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) - - '@radix-ui/react-slot@1.2.3(@types/react@19.2.14)(react@19.2.4)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) - react: 19.2.4 - optionalDependencies: - '@types/react': 19.2.14 - - '@radix-ui/react-slot@1.2.4(@types/react@19.2.14)(react@19.2.4)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) - react: 19.2.4 - optionalDependencies: - '@types/react': 19.2.14 - - '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) - - '@radix-ui/react-tooltip@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) - - '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.14)(react@19.2.4)': - dependencies: - react: 19.2.4 - optionalDependencies: - '@types/react': 19.2.14 - - '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.14)(react@19.2.4)': - dependencies: - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) - react: 19.2.4 - optionalDependencies: - '@types/react': 19.2.14 - - '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.14)(react@19.2.4)': - dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) - react: 19.2.4 - optionalDependencies: - '@types/react': 19.2.14 - - '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.14)(react@19.2.4)': - dependencies: - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.4) - react: 19.2.4 - optionalDependencies: - '@types/react': 19.2.14 - - '@radix-ui/react-use-is-hydrated@0.1.0(@types/react@19.2.14)(react@19.2.4)': - dependencies: - react: 19.2.4 - use-sync-external-store: 1.6.0(react@19.2.4) - optionalDependencies: - '@types/react': 19.2.14 - - '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.14)(react@19.2.4)': - dependencies: - react: 19.2.4 - optionalDependencies: - '@types/react': 19.2.14 - - '@radix-ui/react-use-previous@1.1.1(@types/react@19.2.14)(react@19.2.4)': - dependencies: - react: 19.2.4 - optionalDependencies: - '@types/react': 19.2.14 - - '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.14)(react@19.2.4)': - dependencies: - '@radix-ui/rect': 1.1.1 - react: 19.2.4 - optionalDependencies: - '@types/react': 19.2.14 - - '@radix-ui/react-use-size@1.1.1(@types/react@19.2.14)(react@19.2.4)': - dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) - react: 19.2.4 - optionalDependencies: - '@types/react': 19.2.14 - - '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) - - '@radix-ui/rect@1.1.1': {} - - '@react-router/dev@7.13.1(@react-router/serve@7.13.1(react-router@7.13.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3))(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(react-router@7.13.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1))': - dependencies: - '@babel/core': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/parser': 7.29.0 - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) - '@babel/preset-typescript': 7.28.5(@babel/core@7.29.0) - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 - '@react-router/node': 7.13.1(react-router@7.13.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3) - '@remix-run/node-fetch-server': 0.13.0 - arg: 5.0.2 - babel-dead-code-elimination: 1.0.12 - chokidar: 4.0.3 - dedent: 1.7.2 - es-module-lexer: 1.7.0 - exit-hook: 2.2.1 - isbot: 5.1.35 - jsesc: 3.0.2 - lodash: 4.17.23 - p-map: 7.0.4 - pathe: 1.1.2 - picocolors: 1.1.1 - pkg-types: 2.3.0 - prettier: 3.8.1 - react-refresh: 0.14.2 - react-router: 7.13.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - semver: 7.7.4 - tinyglobby: 0.2.15 - valibot: 1.2.0(typescript@5.9.3) - vite: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1) - vite-node: 3.2.4(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1) - optionalDependencies: - '@react-router/serve': 7.13.1(react-router@7.13.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - jiti - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - - '@react-router/express@7.13.1(express@4.22.1)(react-router@7.13.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)': - dependencies: - '@react-router/node': 7.13.1(react-router@7.13.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3) - express: 4.22.1 - react-router: 7.13.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - optionalDependencies: - typescript: 5.9.3 - - '@react-router/fs-routes@7.13.1(@react-router/dev@7.13.1(@react-router/serve@7.13.1(react-router@7.13.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3))(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(react-router@7.13.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)))(typescript@5.9.3)': - dependencies: - '@react-router/dev': 7.13.1(@react-router/serve@7.13.1(react-router@7.13.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3))(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)(react-router@7.13.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1)) - minimatch: 9.0.9 - optionalDependencies: - typescript: 5.9.3 - - '@react-router/node@7.13.1(react-router@7.13.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)': - dependencies: - '@mjackson/node-fetch-server': 0.2.0 - react-router: 7.13.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - optionalDependencies: - typescript: 5.9.3 - - '@react-router/serve@7.13.1(react-router@7.13.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3)': - dependencies: - '@mjackson/node-fetch-server': 0.2.0 - '@react-router/express': 7.13.1(express@4.22.1)(react-router@7.13.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3) - '@react-router/node': 7.13.1(react-router@7.13.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(typescript@5.9.3) - compression: 1.8.1 - express: 4.22.1 - get-port: 5.1.1 - morgan: 1.10.1 - react-router: 7.13.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - source-map-support: 0.5.21 - transitivePeerDependencies: - - supports-color - - typescript - - '@remirror/core-constants@3.0.0': {} - - '@remix-run/node-fetch-server@0.13.0': {} - - '@rollup/rollup-android-arm-eabi@4.59.0': - optional: true - - '@rollup/rollup-android-arm64@4.59.0': - optional: true - - '@rollup/rollup-darwin-arm64@4.59.0': - optional: true - - '@rollup/rollup-darwin-x64@4.59.0': - optional: true - - '@rollup/rollup-freebsd-arm64@4.59.0': - optional: true - - '@rollup/rollup-freebsd-x64@4.59.0': - optional: true - - '@rollup/rollup-linux-arm-gnueabihf@4.59.0': - optional: true - - '@rollup/rollup-linux-arm-musleabihf@4.59.0': - optional: true - - '@rollup/rollup-linux-arm64-gnu@4.59.0': - optional: true - - '@rollup/rollup-linux-arm64-musl@4.59.0': - optional: true - - '@rollup/rollup-linux-loong64-gnu@4.59.0': - optional: true - - '@rollup/rollup-linux-loong64-musl@4.59.0': - optional: true - - '@rollup/rollup-linux-ppc64-gnu@4.59.0': - optional: true - - '@rollup/rollup-linux-ppc64-musl@4.59.0': - optional: true - - '@rollup/rollup-linux-riscv64-gnu@4.59.0': - optional: true - - '@rollup/rollup-linux-riscv64-musl@4.59.0': - optional: true - - '@rollup/rollup-linux-s390x-gnu@4.59.0': - optional: true - - '@rollup/rollup-linux-x64-gnu@4.59.0': - optional: true - - '@rollup/rollup-linux-x64-musl@4.59.0': - optional: true - - '@rollup/rollup-openbsd-x64@4.59.0': - optional: true - - '@rollup/rollup-openharmony-arm64@4.59.0': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.59.0': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.59.0': - optional: true - - '@rollup/rollup-win32-x64-gnu@4.59.0': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.59.0': - optional: true - - '@standard-schema/utils@0.3.0': {} - - '@swc/helpers@0.5.15': - dependencies: - tslib: 2.8.1 - - '@tailwindcss/node@4.2.1': - dependencies: - '@jridgewell/remapping': 2.3.5 - enhanced-resolve: 5.20.0 - jiti: 2.6.1 - lightningcss: 1.31.1 - magic-string: 0.30.21 - source-map-js: 1.2.1 - tailwindcss: 4.2.1 - - '@tailwindcss/oxide-android-arm64@4.2.1': - optional: true - - '@tailwindcss/oxide-darwin-arm64@4.2.1': - optional: true - - '@tailwindcss/oxide-darwin-x64@4.2.1': - optional: true - - '@tailwindcss/oxide-freebsd-x64@4.2.1': - optional: true - - '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.1': - optional: true - - '@tailwindcss/oxide-linux-arm64-gnu@4.2.1': - optional: true - - '@tailwindcss/oxide-linux-arm64-musl@4.2.1': - optional: true - - '@tailwindcss/oxide-linux-x64-gnu@4.2.1': - optional: true - - '@tailwindcss/oxide-linux-x64-musl@4.2.1': - optional: true - - '@tailwindcss/oxide-wasm32-wasi@4.2.1': - optional: true - - '@tailwindcss/oxide-win32-arm64-msvc@4.2.1': - optional: true - - '@tailwindcss/oxide-win32-x64-msvc@4.2.1': - optional: true - - '@tailwindcss/oxide@4.2.1': - optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.2.1 - '@tailwindcss/oxide-darwin-arm64': 4.2.1 - '@tailwindcss/oxide-darwin-x64': 4.2.1 - '@tailwindcss/oxide-freebsd-x64': 4.2.1 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.2.1 - '@tailwindcss/oxide-linux-arm64-gnu': 4.2.1 - '@tailwindcss/oxide-linux-arm64-musl': 4.2.1 - '@tailwindcss/oxide-linux-x64-gnu': 4.2.1 - '@tailwindcss/oxide-linux-x64-musl': 4.2.1 - '@tailwindcss/oxide-wasm32-wasi': 4.2.1 - '@tailwindcss/oxide-win32-arm64-msvc': 4.2.1 - '@tailwindcss/oxide-win32-x64-msvc': 4.2.1 - - '@tailwindcss/postcss@4.2.1': - dependencies: - '@alloc/quick-lru': 5.2.0 - '@tailwindcss/node': 4.2.1 - '@tailwindcss/oxide': 4.2.1 - postcss: 8.5.8 - tailwindcss: 4.2.1 - - '@tailwindcss/vite@4.2.1(vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1))': - dependencies: - '@tailwindcss/node': 4.2.1 - '@tailwindcss/oxide': 4.2.1 - tailwindcss: 4.2.1 - vite: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1) - - '@tanstack/query-core@5.90.20': {} - - '@tanstack/react-query@5.90.21(react@19.2.4)': - dependencies: - '@tanstack/query-core': 5.90.20 - react: 19.2.4 - - '@tanstack/react-table@8.21.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@tanstack/table-core': 8.21.3 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - '@tanstack/table-core@8.21.3': {} - - '@tiptap/core@2.27.2(@tiptap/pm@2.27.2)': - dependencies: - '@tiptap/pm': 2.27.2 - - '@tiptap/extension-blockquote@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': - dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - - '@tiptap/extension-bold@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': - dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - - '@tiptap/extension-bubble-menu@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': - dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - '@tiptap/pm': 2.27.2 - tippy.js: 6.3.7 - - '@tiptap/extension-bullet-list@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': - dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - - '@tiptap/extension-code-block-lowlight@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/extension-code-block@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)(highlight.js@11.11.1)(lowlight@1.20.0)': - dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - '@tiptap/extension-code-block': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) - '@tiptap/pm': 2.27.2 - highlight.js: 11.11.1 - lowlight: 1.20.0 - - '@tiptap/extension-code-block@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': - dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - '@tiptap/pm': 2.27.2 - - '@tiptap/extension-code@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': - dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - - '@tiptap/extension-document@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': - dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - - '@tiptap/extension-dropcursor@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': - dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - '@tiptap/pm': 2.27.2 - - '@tiptap/extension-floating-menu@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': - dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - '@tiptap/pm': 2.27.2 - tippy.js: 6.3.7 - - '@tiptap/extension-gapcursor@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': - dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - '@tiptap/pm': 2.27.2 - - '@tiptap/extension-hard-break@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': - dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - - '@tiptap/extension-heading@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': - dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - - '@tiptap/extension-history@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': - dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - '@tiptap/pm': 2.27.2 - - '@tiptap/extension-horizontal-rule@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': - dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - '@tiptap/pm': 2.27.2 - - '@tiptap/extension-image@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': - dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - - '@tiptap/extension-italic@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': - dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - - '@tiptap/extension-link@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': - dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - '@tiptap/pm': 2.27.2 - linkifyjs: 4.3.2 - - '@tiptap/extension-list-item@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': - dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - - '@tiptap/extension-ordered-list@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': - dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - - '@tiptap/extension-paragraph@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': - dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - - '@tiptap/extension-placeholder@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': - dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - '@tiptap/pm': 2.27.2 - - '@tiptap/extension-strike@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': - dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - - '@tiptap/extension-table-cell@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': - dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - - '@tiptap/extension-table-header@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': - dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - - '@tiptap/extension-table-row@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': - dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - - '@tiptap/extension-table@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)': - dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - '@tiptap/pm': 2.27.2 - - '@tiptap/extension-text-style@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': - dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - - '@tiptap/extension-text@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))': - dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - - '@tiptap/pm@2.27.2': - dependencies: - prosemirror-changeset: 2.4.0 - prosemirror-collab: 1.3.1 - prosemirror-commands: 1.7.1 - prosemirror-dropcursor: 1.8.2 - prosemirror-gapcursor: 1.4.0 - prosemirror-history: 1.5.0 - prosemirror-inputrules: 1.5.1 - prosemirror-keymap: 1.2.3 - prosemirror-markdown: 1.13.4 - prosemirror-menu: 1.3.0 - prosemirror-model: 1.25.4 - prosemirror-schema-basic: 1.2.4 - prosemirror-schema-list: 1.5.1 - prosemirror-state: 1.4.4 - prosemirror-tables: 1.8.5 - prosemirror-trailing-node: 3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6) - prosemirror-transform: 1.11.0 - prosemirror-view: 1.41.6 - - '@tiptap/react@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': - dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - '@tiptap/extension-bubble-menu': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) - '@tiptap/extension-floating-menu': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) - '@tiptap/pm': 2.27.2 - '@types/use-sync-external-store': 0.0.6 - fast-deep-equal: 3.1.3 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - use-sync-external-store: 1.6.0(react@19.2.4) - - '@tiptap/starter-kit@2.27.2': - dependencies: - '@tiptap/core': 2.27.2(@tiptap/pm@2.27.2) - '@tiptap/extension-blockquote': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) - '@tiptap/extension-bold': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) - '@tiptap/extension-bullet-list': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) - '@tiptap/extension-code': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) - '@tiptap/extension-code-block': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) - '@tiptap/extension-document': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) - '@tiptap/extension-dropcursor': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) - '@tiptap/extension-gapcursor': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) - '@tiptap/extension-hard-break': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) - '@tiptap/extension-heading': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) - '@tiptap/extension-history': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) - '@tiptap/extension-horizontal-rule': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) - '@tiptap/extension-italic': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) - '@tiptap/extension-list-item': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) - '@tiptap/extension-ordered-list': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) - '@tiptap/extension-paragraph': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) - '@tiptap/extension-strike': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) - '@tiptap/extension-text': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) - '@tiptap/extension-text-style': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) - '@tiptap/pm': 2.27.2 - - '@types/diff-match-patch@1.0.36': {} - - '@types/estree@1.0.8': {} - - '@types/linkify-it@5.0.0': {} - - '@types/markdown-it@14.1.2': - dependencies: - '@types/linkify-it': 5.0.0 - '@types/mdurl': 2.0.0 - - '@types/mdurl@2.0.0': {} - - '@types/node-fetch@2.6.13': - dependencies: - '@types/node': 22.19.15 - form-data: 4.0.5 - - '@types/node@18.19.130': - dependencies: - undici-types: 5.26.5 - - '@types/node@22.19.15': - dependencies: - undici-types: 6.21.0 - - '@types/react-dom@19.2.3(@types/react@19.2.14)': - dependencies: - '@types/react': 19.2.14 - - '@types/react@19.2.14': - dependencies: - csstype: 3.2.3 - - '@types/use-sync-external-store@0.0.6': {} - - '@vektorprogrammet/sdk@0.1.2(@tanstack/react-query@5.90.21(react@19.2.4))(react@19.2.4)': - dependencies: - '@tanstack/react-query': 5.90.21(react@19.2.4) - openapi-fetch: 0.13.8 - openapi-react-query: 0.3.2(@tanstack/react-query@5.90.21(react@19.2.4))(openapi-fetch@0.13.8) - react: 19.2.4 - - '@videojs/http-streaming@3.17.4(video.js@8.23.7)': - dependencies: - '@babel/runtime': 7.28.6 - '@videojs/vhs-utils': 4.1.1 - aes-decrypter: 4.0.2 - global: 4.4.0 - m3u8-parser: 7.2.0 - mpd-parser: 1.3.1 - mux.js: 7.1.0 - video.js: 8.23.7 - - '@videojs/vhs-utils@4.1.1': - dependencies: - '@babel/runtime': 7.28.6 - global: 4.4.0 - - '@videojs/xhr@2.7.0': - dependencies: - '@babel/runtime': 7.28.6 - global: 4.4.0 - is-function: 1.0.2 - - '@xmldom/xmldom@0.8.11': {} - - abort-controller@3.0.0: - dependencies: - event-target-shim: 5.0.1 - - accepts@1.3.8: - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - - acorn-walk@8.3.5: - dependencies: - acorn: 8.16.0 - - acorn@8.16.0: {} - - aes-decrypter@4.0.2: - dependencies: - '@babel/runtime': 7.28.6 - '@videojs/vhs-utils': 4.1.1 - global: 4.4.0 - pkcs7: 1.0.4 - - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - - ai@4.3.19(react@19.2.4)(zod@3.25.76): - dependencies: - '@ai-sdk/provider': 1.1.3 - '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) - '@ai-sdk/react': 1.2.12(react@19.2.4)(zod@3.25.76) - '@ai-sdk/ui-utils': 1.2.11(zod@3.25.76) - '@opentelemetry/api': 1.9.0 - jsondiffpatch: 0.6.0 - zod: 3.25.76 - optionalDependencies: - react: 19.2.4 - - arg@5.0.2: {} - - argparse@2.0.1: {} - - aria-hidden@1.2.6: - dependencies: - tslib: 2.8.1 - - array-flatten@1.1.1: {} - - asynckit@0.4.0: {} - - axe-core@4.11.1: {} - - babel-dead-code-elimination@1.0.12: - dependencies: - '@babel/core': 7.29.0 - '@babel/parser': 7.29.0 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 - transitivePeerDependencies: - - supports-color - - balanced-match@1.0.2: {} - - barbe@2.2.1: - dependencies: - regex-escape: 3.4.11 - - baseline-browser-mapping@2.10.0: {} - - basic-auth@2.0.1: - dependencies: - safe-buffer: 5.1.2 - - bcp-47-match@1.0.3: {} - - bcp-47-normalize@1.1.1: - dependencies: - bcp-47: 1.0.8 - bcp-47-match: 1.0.3 - - bcp-47@1.0.8: - dependencies: - is-alphabetical: 1.0.4 - is-alphanumerical: 1.0.4 - is-decimal: 1.0.4 - - body-parser@1.20.4: - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.1 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.14.2 - raw-body: 2.5.3 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - - brace-expansion@2.0.2: - dependencies: - balanced-match: 1.0.2 - - browserslist@4.28.1: - dependencies: - baseline-browser-mapping: 2.10.0 - caniuse-lite: 1.0.30001776 - electron-to-chromium: 1.5.307 - node-releases: 2.0.36 - update-browserslist-db: 1.2.3(browserslist@4.28.1) - - buffer-from@1.1.2: {} - - bytes@3.1.2: {} - - cac@6.7.14: {} - - call-bind-apply-helpers@1.0.2: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - - call-bound@1.0.4: - dependencies: - call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.3.0 - - caniuse-lite@1.0.30001776: {} - - chalk@5.6.2: {} - - chokidar@4.0.3: - dependencies: - readdirp: 4.1.2 - - class-variance-authority@0.7.1: - dependencies: - clsx: 2.1.1 - - client-only@0.0.1: {} - - clsx@2.1.1: {} - - cmdk@1.1.1(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): - dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.4) - '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - codem-isoboxer@0.3.9: {} - - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - - commander@11.1.0: {} - - commander@7.2.0: {} - - commander@8.3.0: {} - - commander@9.5.0: {} - - compressible@2.0.18: - dependencies: - mime-db: 1.54.0 - - compression@1.8.1: - dependencies: - bytes: 3.1.2 - compressible: 2.0.18 - debug: 2.6.9 - negotiator: 0.6.4 - on-headers: 1.1.0 - safe-buffer: 5.2.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - - confbox@0.2.4: {} - - content-disposition@0.5.4: - dependencies: - safe-buffer: 5.2.1 - - content-type@1.0.5: {} - - convert-source-map@2.0.0: {} - - cookie-signature@1.0.7: {} - - cookie@0.7.2: {} - - cookie@1.1.1: {} - - create-gi@1.0.4: {} - - crelt@1.0.6: {} - - csstype@3.2.3: {} - - dashjs@4.7.4: - dependencies: - bcp-47-match: 1.0.3 - bcp-47-normalize: 1.1.1 - codem-isoboxer: 0.3.9 - es6-promise: 4.2.8 - fast-deep-equal: 2.0.1 - html-entities: 1.4.0 - imsc: 1.1.5 - localforage: 1.10.0 - path-browserify: 1.0.1 - ua-parser-js: 1.0.41 - - debounce@1.2.1: {} - - debug@2.6.9: - dependencies: - ms: 2.0.0 - - debug@4.4.3: - dependencies: - ms: 2.1.3 - - dedent@1.7.2: {} - - delayed-stream@1.0.0: {} - - depd@2.0.0: {} - - dequal@2.0.3: {} - - destroy@1.2.0: {} - - detect-libc@2.1.2: {} - - detect-node-es@1.1.0: {} - - diff-match-patch@1.0.5: {} - - dom-walk@0.1.2: {} - - dunder-proto@1.0.1: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 - - duplexer@0.1.2: {} - - ee-first@1.1.1: {} - - electron-to-chromium@1.5.307: {} - - emojer@1.1.6: - dependencies: - barbe: 2.2.1 - match-all: 1.2.7 - regex-emoji: 2.0.9 - - encodeurl@2.0.0: {} - - encriptorjs@1.0.2: {} - - enhanced-resolve@5.20.0: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.3.0 - - entities@4.5.0: {} - - es-define-property@1.0.1: {} - - es-errors@1.3.0: {} - - es-module-lexer@1.7.0: {} - - es-object-atoms@1.1.1: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.1.0: - dependencies: - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - es6-promise@4.2.8: {} - - esbuild@0.25.12: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.12 - '@esbuild/android-arm': 0.25.12 - '@esbuild/android-arm64': 0.25.12 - '@esbuild/android-x64': 0.25.12 - '@esbuild/darwin-arm64': 0.25.12 - '@esbuild/darwin-x64': 0.25.12 - '@esbuild/freebsd-arm64': 0.25.12 - '@esbuild/freebsd-x64': 0.25.12 - '@esbuild/linux-arm': 0.25.12 - '@esbuild/linux-arm64': 0.25.12 - '@esbuild/linux-ia32': 0.25.12 - '@esbuild/linux-loong64': 0.25.12 - '@esbuild/linux-mips64el': 0.25.12 - '@esbuild/linux-ppc64': 0.25.12 - '@esbuild/linux-riscv64': 0.25.12 - '@esbuild/linux-s390x': 0.25.12 - '@esbuild/linux-x64': 0.25.12 - '@esbuild/netbsd-arm64': 0.25.12 - '@esbuild/netbsd-x64': 0.25.12 - '@esbuild/openbsd-arm64': 0.25.12 - '@esbuild/openbsd-x64': 0.25.12 - '@esbuild/openharmony-arm64': 0.25.12 - '@esbuild/sunos-x64': 0.25.12 - '@esbuild/win32-arm64': 0.25.12 - '@esbuild/win32-ia32': 0.25.12 - '@esbuild/win32-x64': 0.25.12 - - escalade@3.2.0: {} - - escape-html@1.0.3: {} - - escape-string-regexp@4.0.0: {} - - etag@1.8.1: {} - - event-target-shim@5.0.1: {} - - exit-hook@2.2.1: {} - - express@4.22.1: - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.4 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.7.2 - cookie-signature: 1.0.7 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.3.2 - fresh: 0.5.2 - http-errors: 2.0.1 - merge-descriptors: 1.0.3 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.12 - proxy-addr: 2.0.7 - qs: 6.14.2 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.19.2 - serve-static: 1.16.3 - setprototypeof: 1.2.0 - statuses: 2.0.2 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - - exsolve@1.0.8: {} - - fast-deep-equal@2.0.1: {} - - fast-deep-equal@3.1.3: {} - - fault@1.0.4: - dependencies: - format: 0.2.2 - - fdir@6.5.0(picomatch@4.0.3): - optionalDependencies: - picomatch: 4.0.3 - - finalhandler@1.3.2: - dependencies: - debug: 2.6.9 - encodeurl: 2.0.0 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.2 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - - form-data-encoder@1.7.2: {} - - form-data@4.0.5: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - es-set-tostringtag: 2.1.0 - hasown: 2.0.2 - mime-types: 2.1.35 - - format@0.2.2: {} - - formdata-node@4.4.1: - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 4.0.0-beta.3 - - forwarded@0.2.0: {} - - fresh@0.5.2: {} - - fsevents@2.3.2: - optional: true - - fsevents@2.3.3: - optional: true - - function-bind@1.1.2: {} - - gensync@1.0.0-beta.2: {} - - get-intrinsic@1.3.0: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - function-bind: 1.1.2 - get-proto: 1.0.1 - gopd: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - math-intrinsics: 1.1.0 - - get-nonce@1.0.1: {} - - get-port@5.1.1: {} - - get-proto@1.0.1: - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 - - github-api-emojis@1.0.4: {} - - glijs@1.0.1: {} - - global@4.4.0: - dependencies: - min-document: 2.19.2 - process: 0.11.10 - - gopd@1.2.0: {} - - graceful-fs@4.2.11: {} - - gzip-size@6.0.0: - dependencies: - duplexer: 0.1.2 - - has-symbols@1.1.0: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.1.0 - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - - he@1.2.0: {} - - highlight.js@10.7.3: {} - - highlight.js@11.11.1: {} - - hls.js@1.6.15: {} - - html-encoder-decoder@1.3.11: - dependencies: - he: 1.2.0 - iterate-object: 1.3.5 - regex-escape: 3.4.11 - - html-entities@1.4.0: {} - - html-escaper@2.0.2: {} - - htmled@1.0.1: {} - - http-errors@2.0.1: - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.2 - toidentifier: 1.0.1 - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - iconv-lite@0.4.24: - dependencies: - safer-buffer: 2.1.2 - - immediate@3.0.6: {} - - imsc@1.1.5: - dependencies: - sax: 1.2.1 - - inherits@2.0.4: {} - - ipaddr.js@1.9.1: {} - - is-alphabetical@1.0.4: {} - - is-alphanumerical@1.0.4: - dependencies: - is-alphabetical: 1.0.4 - is-decimal: 1.0.4 - - is-decimal@1.0.4: {} - - is-function@1.0.2: {} - - is-plain-object@5.0.0: {} - - isbot@5.1.35: {} - - iterate-object@1.3.5: {} - - jiti@2.6.1: {} - - js-tokens@4.0.0: {} - - jsesc@3.0.2: {} - - json-schema@0.4.0: {} - - json5@2.2.3: {} - - jsondiffpatch@0.6.0: - dependencies: - '@types/diff-match-patch': 1.0.36 - chalk: 5.6.2 - diff-match-patch: 1.0.5 - - lie@3.1.1: - dependencies: - immediate: 3.0.6 - - lightningcss-android-arm64@1.31.1: - optional: true - - lightningcss-darwin-arm64@1.31.1: - optional: true - - lightningcss-darwin-x64@1.31.1: - optional: true - - lightningcss-freebsd-x64@1.31.1: - optional: true - - lightningcss-linux-arm-gnueabihf@1.31.1: - optional: true - - lightningcss-linux-arm64-gnu@1.31.1: - optional: true - - lightningcss-linux-arm64-musl@1.31.1: - optional: true - - lightningcss-linux-x64-gnu@1.31.1: - optional: true - - lightningcss-linux-x64-musl@1.31.1: - optional: true - - lightningcss-win32-arm64-msvc@1.31.1: - optional: true - - lightningcss-win32-x64-msvc@1.31.1: - optional: true - - lightningcss@1.31.1: - dependencies: - detect-libc: 2.1.2 - optionalDependencies: - lightningcss-android-arm64: 1.31.1 - lightningcss-darwin-arm64: 1.31.1 - lightningcss-darwin-x64: 1.31.1 - lightningcss-freebsd-x64: 1.31.1 - lightningcss-linux-arm-gnueabihf: 1.31.1 - lightningcss-linux-arm64-gnu: 1.31.1 - lightningcss-linux-arm64-musl: 1.31.1 - lightningcss-linux-x64-gnu: 1.31.1 - lightningcss-linux-x64-musl: 1.31.1 - lightningcss-win32-arm64-msvc: 1.31.1 - lightningcss-win32-x64-msvc: 1.31.1 - - linkify-it@5.0.0: - dependencies: - uc.micro: 2.1.0 - - linkifyjs@4.3.2: {} - - localforage@1.10.0: - dependencies: - lie: 3.1.1 - - lodash@4.17.23: {} - - lowlight@1.20.0: - dependencies: - fault: 1.0.4 - highlight.js: 10.7.3 - - lru-cache@5.1.1: - dependencies: - yallist: 3.1.1 - - lucide-react@0.294.0(react@19.2.4): - dependencies: - react: 19.2.4 - - lucide-react@0.486.0(react@19.2.4): - dependencies: - react: 19.2.4 - - lucide-react@0.513.0(react@19.2.4): - dependencies: - react: 19.2.4 - - m3u8-parser@7.2.0: - dependencies: - '@babel/runtime': 7.28.6 - '@videojs/vhs-utils': 4.1.1 - global: 4.4.0 - - magic-string@0.30.21: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - - markdown-it@14.1.1: - dependencies: - argparse: 2.0.1 - entities: 4.5.0 - linkify-it: 5.0.0 - mdurl: 2.0.0 - punycode.js: 2.3.1 - uc.micro: 2.1.0 - - markmind-editor@0.1.0(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/extension-code-block@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(highlight.js@11.11.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76): - dependencies: - '@tiptap/extension-bubble-menu': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) - '@tiptap/extension-code-block-lowlight': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/extension-code-block@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)(highlight.js@11.11.1)(lowlight@1.20.0) - '@tiptap/extension-floating-menu': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) - '@tiptap/extension-image': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) - '@tiptap/extension-link': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) - '@tiptap/extension-placeholder': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) - '@tiptap/extension-table': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2) - '@tiptap/extension-table-cell': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) - '@tiptap/extension-table-header': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) - '@tiptap/extension-table-row': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) - '@tiptap/react': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@tiptap/starter-kit': 2.27.2 - ai: 4.3.19(react@19.2.4)(zod@3.25.76) - cmdk: 1.1.1(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - lowlight: 1.20.0 - openai: 4.104.0(zod@3.25.76) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - transitivePeerDependencies: - - '@tiptap/core' - - '@tiptap/extension-code-block' - - '@tiptap/pm' - - '@types/react' - - '@types/react-dom' - - encoding - - highlight.js - - ws - - zod - - match-all@1.2.7: {} - - math-intrinsics@1.1.0: {} - - mdurl@2.0.0: {} - - media-typer@0.3.0: {} - - merge-descriptors@1.0.3: {} - - methods@1.1.2: {} - - mime-db@1.52.0: {} - - mime-db@1.54.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - - mime@1.6.0: {} - - min-document@2.19.2: - dependencies: - dom-walk: 0.1.2 - - minimatch@9.0.9: - dependencies: - brace-expansion: 2.0.2 - - morgan@1.10.1: - dependencies: - basic-auth: 2.0.1 - debug: 2.6.9 - depd: 2.0.0 - on-finished: 2.3.0 - on-headers: 1.1.0 - transitivePeerDependencies: - - supports-color - - mpd-parser@1.3.1: - dependencies: - '@babel/runtime': 7.28.6 - '@videojs/vhs-utils': 4.1.1 - '@xmldom/xmldom': 0.8.11 - global: 4.4.0 - - mrmime@2.0.1: {} - - ms@2.0.0: {} - - ms@2.1.3: {} - - mux.js@7.1.0: - dependencies: - '@babel/runtime': 7.28.6 - global: 4.4.0 - - nanoid@3.3.11: {} - - negotiator@0.6.3: {} - - negotiator@0.6.4: {} - - next-themes@0.4.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4): - dependencies: - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - next@15.5.12(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): - dependencies: - '@next/env': 15.5.12 - '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001776 - postcss: 8.4.31 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - styled-jsx: 5.1.6(@babel/core@7.29.0)(react@19.2.4) - optionalDependencies: - '@next/swc-darwin-arm64': 15.5.12 - '@next/swc-darwin-x64': 15.5.12 - '@next/swc-linux-arm64-gnu': 15.5.12 - '@next/swc-linux-arm64-musl': 15.5.12 - '@next/swc-linux-x64-gnu': 15.5.12 - '@next/swc-linux-x64-musl': 15.5.12 - '@next/swc-win32-arm64-msvc': 15.5.12 - '@next/swc-win32-x64-msvc': 15.5.12 - '@opentelemetry/api': 1.9.0 - '@playwright/test': 1.58.2 - sharp: 0.34.5 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros - - niva-ui@0.1.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): - dependencies: - '@next/bundle-analyzer': 15.5.12 - '@radix-ui/react-dropdown-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-slot': 1.2.4(@types/react@19.2.14)(react@19.2.4) - class-variance-authority: 0.7.1 - clsx: 2.1.1 - commander: 11.1.0 - lucide-react: 0.513.0(react@19.2.4) - next: 15.5.12(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - next-themes: 0.4.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - tailwind-merge: 2.6.1 - transitivePeerDependencies: - - '@babel/core' - - '@opentelemetry/api' - - '@playwright/test' - - '@types/react' - - '@types/react-dom' - - babel-plugin-macros - - babel-plugin-react-compiler - - bufferutil - - sass - - utf-8-validate - - node-domexception@1.0.0: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-releases@2.0.36: {} - - notion-design-system@1.0.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4): - dependencies: - clsx: 2.1.1 - lucide-react: 0.294.0(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - - object-inspect@1.13.4: {} - - on-finished@2.3.0: - dependencies: - ee-first: 1.1.1 - - on-finished@2.4.1: - dependencies: - ee-first: 1.1.1 - - on-headers@1.1.0: {} - - openai@4.104.0(zod@3.25.76): - dependencies: - '@types/node': 18.19.130 - '@types/node-fetch': 2.6.13 - abort-controller: 3.0.0 - agentkeepalive: 4.6.0 - form-data-encoder: 1.7.2 - formdata-node: 4.4.1 - node-fetch: 2.7.0 - optionalDependencies: - zod: 3.25.76 - transitivePeerDependencies: - - encoding - - openapi-fetch@0.13.8: - dependencies: - openapi-typescript-helpers: 0.0.15 - - openapi-react-query@0.3.2(@tanstack/react-query@5.90.21(react@19.2.4))(openapi-fetch@0.13.8): - dependencies: - '@tanstack/react-query': 5.90.21(react@19.2.4) - openapi-fetch: 0.13.8 - openapi-typescript-helpers: 0.0.15 - - openapi-typescript-helpers@0.0.15: {} - - opener@1.5.2: {} - - orderedmap@2.1.1: {} - - p-map@7.0.4: {} - - parsemarkjs@1.0.1: {} - - parseurl@1.3.3: {} - - path-browserify@1.0.1: {} - - path-to-regexp@0.1.12: {} - - pathe@1.1.2: {} - - pathe@2.0.3: {} - - picocolors@1.1.1: {} - - picomatch@4.0.3: {} - - pkcs7@1.0.4: - dependencies: - '@babel/runtime': 7.28.6 - - pkg-types@2.3.0: - dependencies: - confbox: 0.2.4 - exsolve: 1.0.8 - pathe: 2.0.3 - - playwright-core@1.58.2: {} - - playwright@1.58.2: - dependencies: - playwright-core: 1.58.2 - optionalDependencies: - fsevents: 2.3.2 - - postcss@8.4.31: - dependencies: - nanoid: 3.3.11 - picocolors: 1.1.1 - source-map-js: 1.2.1 - - postcss@8.5.8: - dependencies: - nanoid: 3.3.11 - picocolors: 1.1.1 - source-map-js: 1.2.1 - - prettier@3.8.1: {} - - process@0.11.10: {} - - prosemirror-changeset@2.4.0: - dependencies: - prosemirror-transform: 1.11.0 - - prosemirror-collab@1.3.1: - dependencies: - prosemirror-state: 1.4.4 - - prosemirror-commands@1.7.1: - dependencies: - prosemirror-model: 1.25.4 - prosemirror-state: 1.4.4 - prosemirror-transform: 1.11.0 - - prosemirror-dropcursor@1.8.2: - dependencies: - prosemirror-state: 1.4.4 - prosemirror-transform: 1.11.0 - prosemirror-view: 1.41.6 - - prosemirror-gapcursor@1.4.0: - dependencies: - prosemirror-keymap: 1.2.3 - prosemirror-model: 1.25.4 - prosemirror-state: 1.4.4 - prosemirror-view: 1.41.6 - - prosemirror-history@1.5.0: - dependencies: - prosemirror-state: 1.4.4 - prosemirror-transform: 1.11.0 - prosemirror-view: 1.41.6 - rope-sequence: 1.3.4 - - prosemirror-inputrules@1.5.1: - dependencies: - prosemirror-state: 1.4.4 - prosemirror-transform: 1.11.0 - - prosemirror-keymap@1.2.3: - dependencies: - prosemirror-state: 1.4.4 - w3c-keyname: 2.2.8 - - prosemirror-markdown@1.13.4: - dependencies: - '@types/markdown-it': 14.1.2 - markdown-it: 14.1.1 - prosemirror-model: 1.25.4 - - prosemirror-menu@1.3.0: - dependencies: - crelt: 1.0.6 - prosemirror-commands: 1.7.1 - prosemirror-history: 1.5.0 - prosemirror-state: 1.4.4 - - prosemirror-model@1.25.4: - dependencies: - orderedmap: 2.1.1 - - prosemirror-schema-basic@1.2.4: - dependencies: - prosemirror-model: 1.25.4 - - prosemirror-schema-list@1.5.1: - dependencies: - prosemirror-model: 1.25.4 - prosemirror-state: 1.4.4 - prosemirror-transform: 1.11.0 - - prosemirror-state@1.4.4: - dependencies: - prosemirror-model: 1.25.4 - prosemirror-transform: 1.11.0 - prosemirror-view: 1.41.6 - - prosemirror-tables@1.8.5: - dependencies: - prosemirror-keymap: 1.2.3 - prosemirror-model: 1.25.4 - prosemirror-state: 1.4.4 - prosemirror-transform: 1.11.0 - prosemirror-view: 1.41.6 - - prosemirror-trailing-node@3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6): - dependencies: - '@remirror/core-constants': 3.0.0 - escape-string-regexp: 4.0.0 - prosemirror-model: 1.25.4 - prosemirror-state: 1.4.4 - prosemirror-view: 1.41.6 - - prosemirror-transform@1.11.0: - dependencies: - prosemirror-model: 1.25.4 - - prosemirror-view@1.41.6: - dependencies: - prosemirror-model: 1.25.4 - prosemirror-state: 1.4.4 - prosemirror-transform: 1.11.0 - - proxy-addr@2.0.7: - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - - punycode.js@2.3.1: {} - - qs@6.14.2: - dependencies: - side-channel: 1.1.0 - - queryxjs@1.0.0: {} - - range-parser@1.2.1: {} - - raw-body@2.5.3: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.1 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - - react-dom@19.2.4(react@19.2.4): - dependencies: - react: 19.2.4 - scheduler: 0.27.0 - - react-hook-form@7.71.2(react@19.2.4): - dependencies: - react: 19.2.4 - - react-refresh@0.14.2: {} - - react-remove-scroll-bar@2.3.8(@types/react@19.2.14)(react@19.2.4): - dependencies: - react: 19.2.4 - react-style-singleton: 2.2.3(@types/react@19.2.14)(react@19.2.4) - tslib: 2.8.1 - optionalDependencies: - '@types/react': 19.2.14 - - react-remove-scroll@2.7.2(@types/react@19.2.14)(react@19.2.4): - dependencies: - react: 19.2.4 - react-remove-scroll-bar: 2.3.8(@types/react@19.2.14)(react@19.2.4) - react-style-singleton: 2.2.3(@types/react@19.2.14)(react@19.2.4) - tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.2.14)(react@19.2.4) - use-sidecar: 1.1.3(@types/react@19.2.14)(react@19.2.4) - optionalDependencies: - '@types/react': 19.2.14 - - react-router-dom@7.13.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4): - dependencies: - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - react-router: 7.13.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - - react-router@7.13.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4): - dependencies: - cookie: 1.1.1 - react: 19.2.4 - set-cookie-parser: 2.7.2 - optionalDependencies: - react-dom: 19.2.4(react@19.2.4) - - react-style-singleton@2.2.3(@types/react@19.2.14)(react@19.2.4): - dependencies: - get-nonce: 1.0.1 - react: 19.2.4 - tslib: 2.8.1 - optionalDependencies: - '@types/react': 19.2.14 - - react@19.2.4: {} - - readdirp@4.1.2: {} - - regex-emoji@2.0.9: {} - - regex-escape@3.4.11: {} - - rollup@4.59.0: - dependencies: - '@types/estree': 1.0.8 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.59.0 - '@rollup/rollup-android-arm64': 4.59.0 - '@rollup/rollup-darwin-arm64': 4.59.0 - '@rollup/rollup-darwin-x64': 4.59.0 - '@rollup/rollup-freebsd-arm64': 4.59.0 - '@rollup/rollup-freebsd-x64': 4.59.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.59.0 - '@rollup/rollup-linux-arm-musleabihf': 4.59.0 - '@rollup/rollup-linux-arm64-gnu': 4.59.0 - '@rollup/rollup-linux-arm64-musl': 4.59.0 - '@rollup/rollup-linux-loong64-gnu': 4.59.0 - '@rollup/rollup-linux-loong64-musl': 4.59.0 - '@rollup/rollup-linux-ppc64-gnu': 4.59.0 - '@rollup/rollup-linux-ppc64-musl': 4.59.0 - '@rollup/rollup-linux-riscv64-gnu': 4.59.0 - '@rollup/rollup-linux-riscv64-musl': 4.59.0 - '@rollup/rollup-linux-s390x-gnu': 4.59.0 - '@rollup/rollup-linux-x64-gnu': 4.59.0 - '@rollup/rollup-linux-x64-musl': 4.59.0 - '@rollup/rollup-openbsd-x64': 4.59.0 - '@rollup/rollup-openharmony-arm64': 4.59.0 - '@rollup/rollup-win32-arm64-msvc': 4.59.0 - '@rollup/rollup-win32-ia32-msvc': 4.59.0 - '@rollup/rollup-win32-x64-gnu': 4.59.0 - '@rollup/rollup-win32-x64-msvc': 4.59.0 - fsevents: 2.3.3 - - rope-sequence@1.3.4: {} - - safe-buffer@5.1.2: {} - - safe-buffer@5.2.1: {} - - safer-buffer@2.1.2: {} - - safestore@1.0.0-beta.1: {} - - sanskrit-lang@0.1.1: - dependencies: - commander: 8.3.0 - - sax@1.2.1: {} - - scheduler@0.27.0: {} - - secure-json-parse@2.7.0: {} - - semver@6.3.1: {} - - semver@7.7.4: {} - - send@0.19.2: - dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.1 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.2 - transitivePeerDependencies: - - supports-color - - serve-static@1.16.3: - dependencies: - encodeurl: 2.0.0 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.19.2 - transitivePeerDependencies: - - supports-color - - set-cookie-parser@2.7.2: {} - - setprototypeof@1.2.0: {} - - sharp@0.34.5: - dependencies: - '@img/colour': 1.1.0 - detect-libc: 2.1.2 - semver: 7.7.4 - 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 - - showdown-emoji@3.0.0: - dependencies: - emojer: 1.1.6 - github-api-emojis: 1.0.4 - - showdown-extensions@1.0.1: - dependencies: - showdown-emoji: 3.0.0 - showdown-highlight: 3.1.0 - showdown-target-blank: 1.0.2 - - showdown-highlight@3.1.0: - dependencies: - highlight.js: 11.11.1 - html-encoder-decoder: 1.3.11 - showdown: 2.1.0 - - showdown-target-blank@1.0.2: - dependencies: - showdown: 1.1.0 - - showdown@1.1.0: {} - - showdown@2.1.0: - dependencies: - commander: 9.5.0 - - side-channel-list@1.0.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - - side-channel-map@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - - side-channel-weakmap@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - side-channel-map: 1.0.1 - - side-channel@1.1.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - side-channel-list: 1.0.0 - side-channel-map: 1.0.1 - side-channel-weakmap: 1.0.2 - - sirv@2.0.4: - dependencies: - '@polka/url': 1.0.0-next.29 - mrmime: 2.0.1 - totalist: 3.0.1 - - sopplayer@1.0.0: {} - - source-map-js@1.2.1: {} - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - statuses@2.0.2: {} - - steamlit@1.0.0: {} - - styled-jsx@5.1.6(@babel/core@7.29.0)(react@19.2.4): - dependencies: - client-only: 0.0.1 - react: 19.2.4 - optionalDependencies: - '@babel/core': 7.29.0 - - swr@2.4.1(react@19.2.4): - dependencies: - dequal: 2.0.3 - react: 19.2.4 - use-sync-external-store: 1.6.0(react@19.2.4) - - tailwind-merge@2.6.1: {} - - tailwind-merge@3.5.0: {} - - tailwindcss-animate@1.0.7(tailwindcss@4.2.1): - dependencies: - tailwindcss: 4.2.1 - - tailwindcss@4.2.1: {} - - tanstack@1.0.3(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/extension-code-block@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(highlight.js@11.11.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(video.js@8.23.7)(zod@3.25.76): - dependencies: - create-gi: 1.0.4 - encriptorjs: 1.0.2 - glijs: 1.0.1 - htmled: 1.0.1 - markmind-editor: 0.1.0(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/extension-code-block@2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2))(@tiptap/pm@2.27.2)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(highlight.js@11.11.1)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.25.76) - niva-ui: 0.1.0(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.58.2)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - notion-design-system: 1.0.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - parsemarkjs: 1.0.1 - queryxjs: 1.0.0 - safestore: 1.0.0-beta.1 - sanskrit-lang: 0.1.1 - showdown-extensions: 1.0.1 - sopplayer: 1.0.0 - steamlit: 1.0.0 - terabox: 1.0.0 - vibly: 0.1.2(video.js@8.23.7) - webscrapperjs: 1.0.0 - transitivePeerDependencies: - - '@babel/core' - - '@opentelemetry/api' - - '@playwright/test' - - '@tiptap/core' - - '@tiptap/extension-code-block' - - '@tiptap/pm' - - '@types/react' - - '@types/react-dom' - - babel-plugin-macros - - babel-plugin-react-compiler - - bufferutil - - encoding - - highlight.js - - react - - react-dom - - sass - - utf-8-validate - - video.js - - ws - - zod - - tapable@2.3.0: {} - - terabox@1.0.0: {} - - throttleit@2.1.0: {} - - tinyglobby@0.2.15: - dependencies: - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - - tippy.js@6.3.7: - dependencies: - '@popperjs/core': 2.11.8 - - toidentifier@1.0.1: {} - - totalist@3.0.1: {} - - tr46@0.0.3: {} - - tslib@2.8.1: {} - - type-is@1.6.18: - dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 - - typescript@5.9.3: {} - - ua-parser-js@1.0.41: {} - - uc.micro@2.1.0: {} - - undici-types@5.26.5: {} - - undici-types@6.21.0: {} - - unpipe@1.0.0: {} - - update-browserslist-db@1.2.3(browserslist@4.28.1): - dependencies: - browserslist: 4.28.1 - escalade: 3.2.0 - picocolors: 1.1.1 - - use-callback-ref@1.3.3(@types/react@19.2.14)(react@19.2.4): - dependencies: - react: 19.2.4 - tslib: 2.8.1 - optionalDependencies: - '@types/react': 19.2.14 - - use-sidecar@1.1.3(@types/react@19.2.14)(react@19.2.4): - dependencies: - detect-node-es: 1.1.0 - react: 19.2.4 - tslib: 2.8.1 - optionalDependencies: - '@types/react': 19.2.14 - - use-sync-external-store@1.6.0(react@19.2.4): - dependencies: - react: 19.2.4 - - utils-merge@1.0.1: {} - - valibot@1.2.0(typescript@5.9.3): - optionalDependencies: - typescript: 5.9.3 - - vary@1.1.2: {} - - vaul@1.1.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): - dependencies: - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - vibly@0.1.2(video.js@8.23.7): - dependencies: - dashjs: 4.7.4 - hls.js: 1.6.15 - video.js: 8.23.7 - - video.js@8.23.7: - dependencies: - '@babel/runtime': 7.28.6 - '@videojs/http-streaming': 3.17.4(video.js@8.23.7) - '@videojs/vhs-utils': 4.1.1 - '@videojs/xhr': 2.7.0 - aes-decrypter: 4.0.2 - global: 4.4.0 - m3u8-parser: 7.2.0 - mpd-parser: 1.3.1 - mux.js: 7.1.0 - videojs-contrib-quality-levels: 4.1.0(video.js@8.23.7) - videojs-font: 4.2.0 - videojs-vtt.js: 0.15.5 - - videojs-contrib-quality-levels@4.1.0(video.js@8.23.7): - dependencies: - global: 4.4.0 - video.js: 8.23.7 - - videojs-font@4.2.0: {} - - videojs-vtt.js@0.15.5: - dependencies: - global: 4.4.0 - - vite-node@3.2.4(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1): - dependencies: - cac: 6.7.14 - debug: 4.4.3 - es-module-lexer: 1.7.0 - pathe: 2.0.3 - vite: 6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1) - transitivePeerDependencies: - - '@types/node' - - jiti - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - - vite@6.4.1(@types/node@22.19.15)(jiti@2.6.1)(lightningcss@1.31.1): - dependencies: - esbuild: 0.25.12 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.8 - rollup: 4.59.0 - tinyglobby: 0.2.15 - optionalDependencies: - '@types/node': 22.19.15 - fsevents: 2.3.3 - jiti: 2.6.1 - lightningcss: 1.31.1 - - w3c-keyname@2.2.8: {} - - web-streams-polyfill@4.0.0-beta.3: {} - - webidl-conversions@3.0.1: {} - - webpack-bundle-analyzer@4.10.1: - dependencies: - '@discoveryjs/json-ext': 0.5.7 - acorn: 8.16.0 - acorn-walk: 8.3.5 - commander: 7.2.0 - debounce: 1.2.1 - escape-string-regexp: 4.0.0 - gzip-size: 6.0.0 - html-escaper: 2.0.2 - is-plain-object: 5.0.0 - opener: 1.5.2 - picocolors: 1.1.1 - sirv: 2.0.4 - ws: 7.5.10 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - webscrapperjs@1.0.0: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - ws@7.5.10: {} - - yallist@3.1.1: {} - - zod-to-json-schema@3.25.1(zod@3.25.76): - dependencies: - zod: 3.25.76 - - zod@3.25.76: {} diff --git a/apps/dashboard/railway.toml b/apps/dashboard/railway.toml deleted file mode 100644 index 356baeb2..00000000 --- a/apps/dashboard/railway.toml +++ /dev/null @@ -1,10 +0,0 @@ -[build] -buildCommand = "pnpm install && pnpm run build" -watchPatterns = ["apps/dashboard/**", "packages/**", "package.json", "bun.lock"] - -[deploy] -startCommand = "npx react-router-serve build/server/index.js" -healthcheckPath = "/" -healthcheckTimeout = 120 -restartPolicyType = "ON_FAILURE" -restartPolicyMaxRetries = 3 diff --git a/bun.lock b/bun.lock index b9da78de..38deb042 100644 --- a/bun.lock +++ b/bun.lock @@ -44,7 +44,7 @@ "@tailwindcss/vite": "^4.0.17", "@tanstack/react-query": "^5", "@tanstack/react-table": "^8.21.2", - "@vektorprogrammet/sdk": "^0.1.2", + "@vektorprogrammet/sdk": "workspace:*", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.1.1", @@ -155,9 +155,6 @@ "packages/domain": { "name": "@vektorprogrammet/domain", "version": "0.1.0", - "dependencies": { - "effect": "4.0.0-beta.107", - }, "devDependencies": { "@types/node": "^22", "oxlint": "^1.41.0", @@ -2612,8 +2609,6 @@ "@manypkg/get-packages/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], - "@monoweb/dashboard/@vektorprogrammet/sdk": ["@vektorprogrammet/sdk@0.1.2", "", { "dependencies": { "openapi-fetch": "^0.13", "openapi-react-query": "^0.3" }, "peerDependencies": { "@tanstack/react-query": "^5", "react": "^18 || ^19" } }, "sha512-3dBn7iwynA6YfkbdhmB+3so2ZLFOJxEv98EFjAtRng7nUJIa3odQVcXT6T6xSVvbWVhU85d64Khsu/O1OMAQXA=="], - "@monoweb/homepage/@types/react": ["@types/react@18.3.28", "", { "dependencies": { "@types/prop-types": "*", "csstype": "^3.2.2" } }, "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw=="], "@monoweb/homepage/@types/react-dom": ["@types/react-dom@18.3.7", "", { "peerDependencies": { "@types/react": "^18.0.0" } }, "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ=="], diff --git a/design-specs/0010-dashboard-bun-sdk-resolution.md b/design-specs/0010-dashboard-bun-sdk-resolution.md new file mode 100644 index 00000000..555f5e7a --- /dev/null +++ b/design-specs/0010-dashboard-bun-sdk-resolution.md @@ -0,0 +1,645 @@ +# Live design spec 0010 — Dashboard Effect v4 SDK cutover + +> **Summary:** One atomic, whole-dashboard cutover that makes the canonical local `@vektorprogrammet/sdk` Effect v4 Promise surface executable for every dashboard consumer. The accepted maintainer journey is complete at exact implementation HEAD `4c63580`: dashboard dependency authority, root lock, README, hook, ignored SDK `dist/`, Receipt0008 lineage, consumer migration, and bounded local evidence are recorded below. Provider, backend, production, and broad dashboard typecheck behavior remain outside this conformance claim. + +## Metadata + +| Field | Value | +|---|---| +| Stable ID | `0010` | +| Title | `Dashboard Effect v4 SDK cutover` | +| Status | `accepted` — conformance recorded at implementation HEAD `4c63580f0fc19354556923980542f5b91a810802`; independent final code PASS (`agent://DashboardW0FinalCodeReview`) and cold final runtime PASS (`agent://DashboardW0FinalRuntimeVerifier`); lifecycle `Conforming` current | +| Owner | Whole-dashboard dependency and consumer cutover lane | +| Intended lane | One atomic umbrella PR with non-overlapping felt slices | +| Draft revision | Replaces the narrow dependency-only draft committed as `96ecd83` | +| Base checkpoint | `39579d9` clean repository base; implementation lineage completed at exact HEAD `4c63580f0fc19354556923980542f5b91a810802` | +| Spec worktree | `/tmp/mono-web-dashboard-sdk-resolution-spec-0010-20260810` | +| Spec branch | `spec/0010-dashboard-sdk-resolution` | +| Runtime authority | `agent://DashboardW0FinalRuntimeVerifier` | +| Discovery authority | `agent://DashboardSdkCutoverScout` | +| Review inputs | `agent://DashboardSdkResolutionFeasibilityReview`; `agent://DashboardSdkResolutionSpecReview`; `agent://DashboardW0FinalCodeReview` | +| Predecessors | Accepted `design-specs/0003-effect-v4-receipt-sdk-compatibility.md`; accepted `design-specs/0008-dashboard-receipt-sdk-consumer-seam.md` | +| Journey count | One completed umbrella maintainer journey; one implementation lineage ending at `4c63580f0fc19354556923980542f5b91a810802` | +| Product boundary | Product lead is read-only; Railway dashboard configuration removal is authorized by operator decision; provider/service state is unobserved | +| Implementation lineage | `8fa0ec5` W0 merge; S5 Receipt commits `61212b2`, `37cacd2`, `c70128e`, `fcd3122`, `52d0481`, `e995513`, `a22bb2c`, `e579d26`, `8b502e0`, `4c63580` | +| Final evidence | Cold install/SDK build/W0/Receipt PASS and cleanup recorded in `EVIDENCE-0010`, `TYPECHECK-0010`, `CLEAN-0010` | + +This file records final conformance for exact implementation HEAD `4c63580f0fc19354556923980542f5b91a810802`. Independent final code review and cold runtime verification both passed. The implementation consumed the capsule, recorded exact cold install/SDK/W0/Receipt evidence, disclosed nine external typecheck diagnostics without a broad-green claim, and cleaned capsule-local artifacts. No provider, production, deployment, publication, credential, remote-state, or other external effect is claimed or authorized. + +### 1.1 Goal + +A clean root install and one complete dashboard migration must produce one coherent dependency and consumer boundary: + +```text +root package.json (Bun 1.3.10 + apps/*/packages/* workspaces) + → apps/dashboard/package.json: @vektorprogrammet/sdk = workspace:* + → root bun.lock regenerated by exact Bun 1.3.10 + → local packages/sdk 0.2.0, Effect 4.0.0-beta.107 + → SDK dist/ built before any consumer check + → every dashboard SDK caller uses the accepted Promise surface + → no dashboard apiClient alias or raw API transport remains + → accepted schemas own paths, query, auth, forms, errors, and decoding + → typed failures remain visible; mocks/empty-success fallbacks are gone + → one local loopback browser journey exercises shell, public, admin, applicants, and Receipt + → full dashboard typecheck/build evidence is recorded without backend/provider/production claims +``` + +The cutover is atomic at the product boundary: a published SDK link, an unmigrated caller, a raw `/api` fetch, a stale mock-success fallback, or a hidden schema cast is a failed checkpoint. Felt slices may be developed in parallel in isolated worktrees, but the umbrella is not complete until all slices are merged into one PR and the final journey passes. + +### 1.2 Required authority changes + +1. Change only the dashboard SDK dependency edge to `"@vektorprogrammet/sdk": "workspace:*"`. +2. Regenerate the one root `bun.lock` with exact Bun `1.3.10`; do not hand-edit generated lock content. +3. Delete `apps/dashboard/pnpm-lock.yaml`. The hook may continue to sync **extant** pnpm locks for other apps, but it must never recreate this dashboard lock or stage an unrelated app lock from a dashboard-only change. +4. Delete retired `apps/dashboard/railway.toml`. No provider command, deployment, Railway API call, or production claim is part of this spec. +5. Rewrite every dashboard README pnpm command, package-manager statement, rationale, and anchor into executable Bun/root-Turbo guidance. The README must not retain a dangling `#pnpm-...` link or a pnpm authority statement. +6. Update the tracked `.githooks/pre-commit` lock-sync block so it derives only extant `apps/*/pnpm-lock.yaml` paths and runs/stages pnpm only when that lock's own `apps/*/package.json` is staged. The block must be exactly equivalent to: + + ```sh + while IFS= read -r lockfile; do + [ -f "$lockfile" ] || continue + app="${lockfile%/pnpm-lock.yaml}" + if git diff --cached --name-only -- "$app/package.json" \ + | grep -Fxq "$app/package.json"; then + (cd "$app" && COREPACK_ENABLE_PROJECT_SPEC=0 pnpm install --no-frozen-lockfile --silent) + git add "$lockfile" + fi + done < <(printf '%s\n' apps/*/pnpm-lock.yaml) + ``` + + No hard-coded app list is allowed. Because `apps/dashboard/pnpm-lock.yaml` is deleted, a dashboard-only manifest change cannot run pnpm for dashboard, recreate its lock, or stage `apps/homepage/pnpm-lock.yaml`. Partial slices explicitly bypass this external whole-repository gate; the final integrator runs hook-equivalent lint/build/test gates with the updated hook active. Any mismatch is `Drift`. +7. Build `packages/sdk/dist/**` from the accepted SDK source before any dashboard typecheck/build/browser check. `dist/` is ignored and must not be committed. +8. Migrate every dashboard SDK caller and raw API transport listed in §5. Remove `apiClient`, active route `fetch`, route-owned API `FormData`, casts hiding wire mismatches, and mock/empty-success fallbacks. Do not add aliases or compatibility shims. +9. Keep accepted Receipt0008 implementation paths unchanged except for independently genuine fixture/harness type repairs required to integrate and run the umbrella journey. Its accepted route behavior and evidence contract are not rewritten by this umbrella. +10. Preserve accepted labels, route URLs, form intents, and behavior where the accepted SDK schema still provides the same meaning. When a current UI field has no accepted source field, remove the invented field rather than fabricate a value. + +### 1.3 Explicit non-goals + +This cutover does **not** change: + +- `packages/sdk/**` source, schemas, transports, Effect implementation, exports, version, or API names; +- Symfony/API Platform/OpenAPI/backend code, database/persistence/domain laws, Workers, Cloudflare/Alchemy/Wrangler, providers, credentials, production data, or public API contracts; +- route URLs, Norwegian labels, form intents, or Receipt0008's accepted personal/admin implementation except narrow fixture/harness repairs; +- homepage dependency/consumer semantics, its own pnpm lock, or homepage Railway configuration; +- deployment, Railway state, DNS, publication, release, production traffic, or operating status; +- a compatibility layer for old published SDK `0.1.2`, `apiClient`, generic status methods, local duplicate schemas, or raw transport; +- an inference that a green local build means backend parity, production health, or deployment success. + +## 2. Frozen facts and authority + +The following are baseline observations. They are not a green result. Causal or future-resolution statements are marked `[INFERENCE]`. + +| ID | Frozen observation | Evidence | +|---|---|---| +| `O-0010-1` | Root workspaces are `apps/*` and `packages/*`; root package authority declares Bun `1.3.10`. | `package.json:4,38`; `CLAUDE.md:35-38,55-58`. | +| `O-0010-2` | Dashboard manifest declares `@vektorprogrammet/sdk` as `^0.1.2`. | `apps/dashboard/package.json:63`. | +| `O-0010-3` | Root Bun lock dashboard importer also requests `^0.1.2`; the local workspace record is `packages/sdk`, `@vektorprogrammet/sdk` `0.2.0`, and the lock contains both workspace and per-importer published records. | `bun.lock:22-47,155-175,1254,2612,2618`. | +| `O-0010-4` | Local SDK package is version `0.2.0`, exact Effect dependency `4.0.0-beta.107`, default Promise export `.` and Effect export `./effect`. | `packages/sdk/package.json:1-23`. | + +| `O-0010-5` | `packages/sdk` exports only `dist/promise.*` and `dist/effect-client.*`; `files` is `["dist"]`, build is `tsc -b`, and no `dist/` is present in the clean checkout because `dist` is ignored. | `packages/sdk/package.json:5-19`; `.gitignore:6-9`; `.github/workflows/release-sdk.yml:25-30`. | +| `O-0010-6` | Dashboard pnpm importer requests and pins published SDK `0.1.2` with a registry integrity entry. | `apps/dashboard/pnpm-lock.yaml:74-76,1719-1723`. | +| `O-0010-7` | Frozen Bun `1.3.10` runtime install exited `0` and resolved `apps/dashboard/node_modules/@vektorprogrammet/sdk` to `node_modules/.bun/@vektorprogrammet+sdk@0.1.2+d1096969542f45a5/node_modules/@vektorprogrammet/sdk`; installed version was `0.1.2`, not workspace `0.2.0`. This resolution-only observation needed no local SDK `dist/`. | `agent://ReceiptConsumerRuntimeVerifier` (`install`: exit `0`; `dependency_resolution`: `0.1.2`); temporary install was cleaned. | +| `O-0010-8` | `[INFERENCE]` The `^0.1.2` range excludes local `0.2.0`, so the frozen install selects published SDK `0.1.2` for the dashboard. | Causal classification in `agent://ReceiptConsumerRuntimeVerifier` and `agent://DashboardSdkCutoverScout`; symlink/version are observed. | +| `O-0010-9` | Receipt0008 changed-path typecheck against published SDK exited `2` with `33` changed-path diagnostics, including missing `ClientOptions`, v4 errors/types, Receipt types, and personal/admin methods. | `agent://ReceiptConsumerRuntimeVerifier`, `typecheck.changed_path_diagnostics`; not a green result for this draft. | +| `O-0010-10` | Receipt0008 also reported independent fixture defects (BodyShape fields/file errors, missing Bun type, implicit-any request) and `23` unrelated known `apiClient` diagnostics. | `agent://ReceiptConsumerRuntimeVerifier`; `agent://DashboardSdkCutoverScout`. | +| `O-0010-11` | Receipt0008 has no browser proof: config preflight exited `1` before tests because Playwright could not find `playwright.config.ts.esm.preflight`; stub was not started and Chromium count was `0`. | `agent://ReceiptConsumerRuntimeVerifier`, `config_preflight` and `fixed_port_stub_and_browser`. | +| `O-0010-12` | CI installs root Bun frozen and runs `bun turbo lint`, `bun turbo build`, and `bun turbo test` on push/PR to `main`; Turbo build depends on upstream package builds. | `.github/workflows/ci.yml:3-36`; `turbo.json:5-9`. | +| `O-0010-13` | SDK release workflow explicitly builds `packages/sdk` after install, confirming ignored `dist/` is a generated prerequisite. | `.github/workflows/release-sdk.yml:25-30`; `packages/sdk/package.json:15-19`. | +| `O-0010-14` | `.githooks/pre-commit` currently loops hard-coded `apps/homepage apps/dashboard`, runs pnpm for every extant app lock when any `package.json` is staged, stages both locks, and separately runs quality commands from root scripts. | `.githooks/pre-commit:42-56,76-98`; `.havn.json:1-5`. In this clone `core.hooksPath` is unset and shared hooks are samples; tracked hook remains an intended consumer. | +| `O-0010-15` | Dashboard README contains pnpm in required programs, install/dev/lint/format/check/e2e/build/start blocks, browser table/e2e install, package-manager row/anchor, and rationale section. | `apps/dashboard/README.md:7-18,24-78,82-96,203-220,315-320`. | +| `O-0010-16` | `apps/dashboard/railway.toml` exists at the base with a pnpm build command and per-app relative start command. | `apps/dashboard/railway.toml:1-10`. Operator decision for this draft: removal of the dashboard Railway configuration is authorized; provider/service state is unobserved, and no provider or deployment claim follows. | +| `O-0010-17` | Existing e2e scripts include `test:e2e: "playwright test"` but `e2e:test`, UI/browser variants, codegen, report, and install scripts are prefixed with `exec`; Playwright uses `bun run dev`, `http://localhost:5174`, and `reuseExistingServer: !process.env.CI`. | `apps/dashboard/package.json:16-24`; `apps/dashboard/playwright.config.ts:14-82`. `exec` behavior under Bun and a Node CLI invocation remain unresolved observations. | +| `O-0010-18` | Accepted Promise API exports `createClient`, `ClientOptions`, config, typed errors, schemas, `context`, `me`, receipts, admin, and public domains; transport owns auth, URL/query, JSON/multipart, status/error mapping, decode, and void operations. | `packages/sdk/src/promise.ts:25-126`; `packages/sdk/src/transport.ts:21-183`; accepted 0003. | +| `O-0010-19` | Stale `apiClient` imports, shape assumptions, direct browser fetches, and fallback/mock semantics are whole-dashboard consumer Drift. | `agent://DashboardSdkCutoverScout`; accepted 0008: `design-specs/0008-dashboard-receipt-sdk-consumer-seam.md:58-60,97-99,289-306`. | + +### Authority rules + +| Concern | Authority | Cutover rule | +|---|---|---| +| Package manager/workspace graph | Root `package.json`, `CLAUDE.md`, root `bun.lock` | Bun `1.3.10` from repository root is the only dashboard install authority. | +| SDK API/schemas | Accepted `0003`, read-only `packages/sdk/**` | Use existing Promise exports/domain methods; do not weaken or extend SDK. | +| Data meaning | Accepted SDK `Schema` classes | UI projects fields that exist; it never invents legacy fields. | +| Transport | SDK `transport.ts` and domain modules | SDK owns URL paths, query names, auth, JSON/multipart, errors, decoding, and void responses. | +| SSR config/auth | `API_URL`, `createAuthenticatedClient`, `requireAuth`, accepted `AuthOption` | Loaders/actions pass cookie auth; missing/invalid config is typed and visible. | +| CI/build graph | `.github/workflows/ci.yml`, `turbo.json` | SDK build precedes dashboard consumers; final evidence includes CI-equivalent commands. | +| Lock sync | `.githooks/pre-commit` | Extant app pnpm locks only; per-app staged manifest gate; dashboard deletion cannot be recreated. | +| Dashboard deployment | Operator decision | Railway config is retired and deleted; no provider state is inferred. | +| Receipt consumer | Accepted `0008` implementation/evidence contract | Consume unchanged; only genuine fixture/harness integration repairs. | + +### Dependency graph + +```mermaid +graph TD + A[Accepted 0003 SDK v4] --> B[packages/sdk 0.2.0 + Effect beta.107] + C[root package.json
Bun 1.3.10 + workspaces] --> D[root bun.lock] + B --> D + D --> E[dashboard workspace:*] + E --> F[clean root install] + F --> G[build ignored SDK dist] + G --> H[dashboard consumers] + H --> I[shell/auth/config] + H --> J[public lists] + H --> K[admin collections] + H --> L[applicants/assignment] + H --> M[accepted Receipt0008] + I --> N[loopback browser journey] + J --> N + K --> N + L --> N + M --> N + N --> O[typecheck + Turbo build/test evidence] + P[CI/Turbo] -. shared gate .-> O + Q[retired Railway file] -. removed; no provider action .-> O +``` + +**Legend:** Solid arrows are required local dependencies. Dotted arrows are authority/cleanup boundaries, not deployment or production edges. + +## 3. Product and representation decisions + +Accepted SDK schemas are the only wire-to-view authority. A route may parse browser form input and map an accepted value to a display value, but may not cast, default, rename into an invented field, or turn a typed failure into an empty/mock success. + +| UI area | Accepted source | Required projection | Forbidden invention | +|---|---|---|---| +| Field studies/profile edit | `public.fieldOfStudies()` → `{ id, name }` | Display `name`; use `id`. | `shortName`, abbreviations, mock rows. | +| Sponsors | `public.sponsors()` → `{ id, name, logoUrl, url }` | Display name; render non-null logo/link. | `size` or fabricated logo/link. | +| Teams | `public.teams()` → `{ id, name }` | Display `name`. | `description`. | +| Shell/profile role | `client.context.role`; `UserProfile` has no role | Use context for UI visibility only. | Profile-derived role, default admin, raw `ROLE_*`. | +| Profile/summary | `me.profile()` / `me.dashboard()` | Render accepted fields and visible errors. | Fallback user/dashboard. | +| Assistants | `admin.scheduling.assistants()` | id/name/email/doublePosition/preferredGroup/availability/score/suitability/previousParticipation/language. | `school`, `phone`. | +| Schools | `admin.scheduling.schools()` | name and actual `capacity[]`. | `assistantCount`, invented scalar capacity. | +| Substitutes | `admin.scheduling.substitutes()` | name/email/yearOfStudy/language/weekdays. | `phone`, fabricated status. | +| `Users` | `admin.users.list()` → active/inactive `User[]` | Real active/inactive groups, id/firstName/lastName/email/role. | Mock users, ignored loader data, local lower-case shape. | +| Mailing lists | `admin.mailingLists()` → `{ name, emails[] }` | List name and real email members. | One invented `email`. | +| Interviews | `admin.interviews.list()` → accepted `Interview` | applicationId/interviewerName/schedulingStatus/interviewTime/room/campus/schemaId with explicit mapping. | `applicant`, invented date/status fields. | +| Statistics | `admin.admissionStats()` | totalApplicants/accepted/rejected/interviewed/assignedAssistants. | Mock statistics. | +| Team interest | `admin.teams.interest()` → `{ id, userName, teamName }` | `userName` and `teamName`. | `name`, `team`, `semester`. | +| Applicants | `admin.applications.list`, `admin.users.list`, `admin.interviews.schemas` | SSR loader passes real options to assignment dialog; action calls SDK. | Browser raw fetch, mock applications, fabricated options. | +| Receipts | Accepted 0008 `Receipt`/`AdminReceipt` | Preserve accepted Date/input/status/void/error mappings and Norwegian labels. | Rewriting 0008 semantics. | + +Schema references: `packages/sdk/src/schemas/common.ts:3-63`; `scheduling.ts:3-33`; `user.ts:11-28`; `interview.ts:9-99`; `application.ts:9-139`; `packages/sdk/src/context.ts:6-80`; domain methods in `packages/sdk/src/domains/**` as listed in `agent://DashboardSdkCutoverScout`. + +### Error/transport law + +- `API_URL` is the SSR authority. An absent/invalid URL yields typed `ConfigurationError` before fetch; no Railway/default fallback. +- `requireAuth` handles missing-cookie `/login`; a cookie token passes through `AuthOption`; no token logging/persistence/URL copying. +- SDK `UnauthorizedError` maps to `/login?expired=true`. Configuration, validation, conflict, not-found, rate-limit, network, and other HTTP errors remain safe visible errors. +- Routes parse browser forms and map accepted views. SDK owns URL/query, auth headers, JSON/multipart, form field names, status mapping, schema decode, and 204/void handling. +- Remove active route `fetch`, URL interpolation, hand-built API `FormData`, and `apiClient`. `auth.server.ts:createAuthHeaders` may be deleted only after reference proof. +- Applicant options are SSR-loaded through SDK; browser never fetches `/api/admin/users` or `/api/admin/interview-schemas`. + +## 4. Exact dashboard caller and transport inventory + +This is the frozen source map. Each listed symbol has an owner in §6. A caller is not omitted because it currently uses fixture mode or catches an error. + +### 4.1 Shared helpers, shell, profile, and auth + +| Path and symbol | Baseline evidence | Required cutover | +|---|---|---| +| `apps/dashboard/app/lib/api.server.ts:createAuthenticatedClient` | Imports `createClient`/`apiUrl`; creates a client with URL and cookie auth (`:1-5`). | Receipt0008's accepted helper is the shared read-only seam; all SSR authenticated loaders/actions use it. | +| `apps/dashboard/app/lib/auth.server.ts:createAuthHeaders` | Dead/legacy `:11-13`; no current caller observed. | Delete only if a reference search proves dead; SDK owns auth headers. | +| `apps/dashboard/app/routes/dashboard.tsx:loader`, `Layout`, `UserMenu` | `loader:78-100`; profile call plus fallback/legacy role presentation. | Use accepted profile fields and `client.context.role`; typed errors visible; no fallback user/admin role. | +| `apps/dashboard/app/routes/dashboard._index.tsx:loader`, `Index` | `loader:29-41`; `mockDashboard` and `me.dashboard()`. | Remove fixture/mock success path and casts; project accepted `DashboardStats`; visible error state. | +| `apps/dashboard/app/routes/dashboard.profile._index.tsx:loader`, `Profile` | `loader:18-40`; fixture `getProfileData()` and `me.profile()`. | Use accepted `UserProfile`; no mock profile or empty success. | +| `apps/dashboard/app/routes/dashboard.profile.rediger._index.tsx:loader`, `RedigerProfil` | `loader:38-48`; direct `createClient(apiUrl)`, `public.fieldOfStudies() as FieldOfStudy[]`, and mock `linjer`. | Use explicit public client/config boundary; remove cast/mock; project only `FieldOfStudy.name`. | +| `apps/dashboard/app/routes/login.tsx:loader`, `action`, `Login` | `loader:12-16`, `action:18-40`; direct `createClient(apiUrl)`, login/rate-limit handling. | Keep SDK auth operation; typed configuration/network/validation/rate errors; preserve cookie/redirect behavior. | +| `apps/dashboard/app/routes/glemt-passord.tsx:action`, `GlemtPassord` | `action:7-23`; direct `auth.resetPassword`. | Keep SDK operation with visible typed failures; no fallback success. | +| `apps/dashboard/app/routes/tilbakestill-passord.$code.tsx:action`, `TilbakestillPassord` | `action:7-34`; direct `auth.setPassword`. | Keep SDK operation with visible typed failures; no fallback success. | + +### 4.2 Public consumers + +| Path and symbol | Baseline mismatch | Required cutover | +|---|---|---| +| `apps/dashboard/app/routes/dashboard.linjer._index.tsx:loader`, `Linjer` | `:17-26`; named `apiClient`, mock `{ name, shortName }`, `catch → null`. | Call `public.fieldOfStudies()`; render `{ id, name }`; remove `apiClient`, `shortName`, mock, and empty-success catch. | +| `apps/dashboard/app/routes/dashboard.sponsorer._index.tsx:loader`, `Sponsorer` | `:17-26`; named `apiClient`, mock `{ name, size }`, `result.items`, `catch → null`. | Call `public.sponsors()`; render accepted name/logo/link; remove `size`, Page assumption, mock, and empty-success catch. | +| `apps/dashboard/app/routes/dashboard.team._index.tsx:loader`, `Team` | `:17-26`; named `apiClient`, mock `{ name, description }`, `result.items`, `catch → null`. | Call `public.teams()`; render id/name; remove `description`, Page assumption, mock, and empty-success catch. | + +### 4.3 Authenticated admin collections + +| Path and symbol | Baseline mismatch | Required cutover | +|---|---|---| +| `apps/dashboard/app/routes/dashboard.assistenter._index.tsx:loader`, `Assistenter` | `:22-34`; mock/local school/phone shape. | `client.admin.scheduling.assistants()`; unwrap accepted page and map accepted scheduling fields only. | +| `apps/dashboard/app/routes/dashboard.skoler._index.tsx:loader`, `Skoler` | `:21-34`; mock scalar capacity/assistantCount. | `client.admin.scheduling.schools()`; render actual capacity records, no assistant-count invention. | +| `apps/dashboard/app/routes/dashboard.vikarer._index.tsx:loader`, `Vikarer` | `:22-34`; mock phone/status shape. | `client.admin.scheduling.substitutes()`; render accepted email/year/language/weekdays. | +| `apps/dashboard/app/routes/dashboard.brukere._index.tsx:loader`, `columns`, `Brukere` | `:12-33,35-65`; loader returns fixture/null while component reads `mock/api/data-brukere`. | `client.admin.users.list()`; render real active/inactive groups; remove mock imports and ignored loader. | +| `apps/dashboard/app/routes/dashboard.epostliste._index.tsx:loader`, `Epostliste` | `:20-33`; mock has one email per row. | `client.admin.mailingLists()`; render each list and real `emails[]`. | +| `apps/dashboard/app/routes/dashboard.intervjuer._index.tsx:loader`, `Intervjuer` | `:22-35`; local applicant/interviewer/date/status and mock rows. | `client.admin.interviews.list()`; render accepted fields with explicit status/date mapping. | +| `apps/dashboard/app/routes/dashboard.statistikk._index.tsx:loader`, `Statistikk` | `:29-41`; mock and fallback cast. | `client.admin.admissionStats()`; render accepted stats; typed failure, no fallback. | +| `apps/dashboard/app/routes/dashboard.teaminteresse._index.tsx:loader`, `Teaminteresse` | `:21-34`; local name/team/semester and missing `admin.teamInterest`. | `client.admin.teams.interest()`; unwrap `userName/teamName`; remove semester and mock. | + +### 4.4 Applicant assignment and active raw transport + +| Path and symbol | Baseline evidence | Required cutover | +|---|---|---| +| `apps/dashboard/app/routes/dashboard.sokere._index.tsx:loader`, `action`, `AssignInterviewDialog`, `ActionsCell`, `Sokere` | `loader:63-82`, `action:84-117`, dialog `:142-265`; mock applications and browser `fetch("/api/admin/users")` / `fetch("/api/admin/interview-schemas")` at `:165-167`. | Loader uses authenticated `admin.applications.list`, `admin.users.list`, `admin.interviews.schemas`; dialog receives typed options; action uses `admin.interviews.assign` and application verbs. Remove browser fetch, mock, casts, and swallowed failures. | +| `apps/dashboard/app/mock/api/data-sokere.ts` | Applicant mock source. | Delete only after a reference search proves no remaining consumer. | + +The applicant loader is SSR-only for all three data/option calls. The browser receives serialized options from the loader; it never becomes a second transport owner. + +### 4.5 Accepted Receipt0008 boundary + +Receipt0008 is accepted as a separate bounded implementation. Its runtime authority is `agent://ReceiptConsumerRuntimeVerifier`, whose observed result is `BLOCKED/DRIFT`: changed-path diagnostics and no browser proof. That result is not inherited as green evidence. The accepted source seam must be replayed in the future implementation worktree before any Receipt evidence is resumed. + +#### Replay lineage and nine-path split + +The accepted source lineage is the exact ordered commit chain: + +1. `9b14ed5` — `feat(dashboard): migrate Receipt flows to Effect SDK`. +2. `7b86275` — `fix(dashboard): close Receipt SDK journey gaps`. +3. `b1491d4` — `fix(dashboard): make Receipt preflight reachable`. + +After `S0` and `W0`, the `ReceiptConsumerIntegrator` replays those commits in that order with no source substitution; this establishes the shared `apps/dashboard/app/lib/api.server.ts` seam before Wave A. + +```sh +git cherry-pick 9b14ed5 7b86275 b1491d4 +git show -s --format='%H %P %s' 9b14ed5 7b86275 b1491d4 +git merge-base --is-ancestor 9b14ed5 7b86275 +git merge-base --is-ancestor 7b86275 b1491d4 +git diff --name-only 9b14ed5^ b1491d4 | sort +``` + +The final command must yield exactly these nine paths, split as follows: + +| Classification relative to clean base `39579d9` | Paths | +|---|---| +| Introduced by the accepted Receipt lineage | `apps/dashboard/app/lib/receipt-view.ts`; `apps/dashboard/e2e/fixtures/receipt-api.ts`; `apps/dashboard/e2e/receipts.spec.ts`. | +| Already present in the clean base and edited by the lineage | `apps/dashboard/.env.example`; `apps/dashboard/app/components/receipts/DeleteReceiptDialog.tsx`; `apps/dashboard/app/components/receipts/ReceiptFormDialog.tsx`; `apps/dashboard/app/lib/api.server.ts`; `apps/dashboard/app/routes/dashboard.mine-utlegg._index.tsx`; `apps/dashboard/app/routes/dashboard.utlegg._index.tsx`. | + +The integrator verifies the nine-path set and commit ancestry before repairing anything. Only genuine fixture/harness defects may then be repaired: BodyShape/Bun-type/request diagnostics or the exact Playwright reachability issue proven by `W0`. No Receipt route semantic rewrite, alias, mock fallback, or broad dashboard repair may hide behind this exception. New runtime evidence must be produced from the final post-replay integration worktree; no `BLOCKED/DRIFT` verifier result or prior fixture output may be reported as browser proof. + +The umbrella consumes its accepted personal list/create/update/delete and admin list/approve/reject/reopen seam without redesigning it. The nine paths remain the complete Receipt ownership boundary. +Feasibility nonblocker: the lineage base `1ddfefa` is not an ancestor of clean base `39579d9` (39 commits apart), but the six pre-existing touched paths in the table above are byte-identical at the required preimage. Replay must stop on any conflict or non-identical preimage; never auto-resolve. Evidence: `agent://DashboardSdkResolutionFeasibilityReview`. + +### 4.6 Mock/fallback file inventory + +Current non-Receipt mock sources are `apps/dashboard/app/mock/api/data-profile.ts`, `data-sokere.ts`, `data-brukere.ts`, and `linjer.ts`; route-local mock constants appear in dashboard summary, public lists, admin collections, applicants, and the pre-accepted Receipt baseline. Remove non-Receipt mocks and `catch` branches returning `null`, `[]`, or fixture data only after each slice proves no remaining reference. Accepted Receipt loopback fixture state is evidence instrumentation, not a production success fallback, and remains governed by 0008. + +## 5. SDK-owned boundary and route behavior + +### 5.1 One client boundary + +`apps/dashboard/app/lib/api.server.ts:createAuthenticatedClient` is the only shared authenticated factory. It accepts the cookie token in the SDK's `AuthOption` shape and uses SSR `API_URL`. Public/auth routes may construct the accepted client for explicit operations, but no route may create a second transport abstraction. `apiClient` is removed rather than re-exported. + +### 5.2 Domain ownership + +| Boundary | SDK/core owns | Dashboard route owns | +|---|---|---| +| URL/config | Base URL validation, no fallback, path joining | Select SSR `API_URL`; render configuration error | +| Auth | Bearer header, static/async `AuthOption`, auth error mapping | Read current cookie; never log/store token | +| Query | Query key names, pagination, status encoding | Read route/search params and pass typed params | +| Forms | JSON/multipart encoding, `file` field, method/path, schema/void decode | Parse browser `FormData`, validate input, call domain verb | +| Errors | HTTP/network/schema/config classes | Redirect unauthorized; render all other typed failures | +| Data | Schema decode, Date/enum/status transformations | Project accepted values into existing labels/columns | +| Termination | Abort signal, request ownership, 204/void | Stop local stub/process; no unbounded retry | + +### 5.3 No fake success + +Migrated loaders/actions must return typed errors or the accepted redirect on failure. They must not return mock records, fallback users/roles, empty tables, `null`, `[]`, legacy casts, invented fields, or suppressed `ConfigurationError`, `UnauthorizedError`, `ValidationError`, `ConflictError`, `NotFoundError`, `RateLimitedError`, or `NetworkError`. + + +## 6. Parallel slices, ownership, and merge order + +### 6.1 Isolation rules + +- One integrator owns the umbrella branch/PR. Every writer works in a dedicated worktree; no writer edits another worktree or the shared base. +- Root `bun.lock`, dashboard manifest, README, Railway deletion, and `.githooks/pre-commit` have one owner. No concurrent lock writer. +- No more than **three** implementation slices run concurrently. Slices deliver isolated commits/patches; none is a partial green umbrella. +- Partial slice commits explicitly use `git commit --no-verify` because the repository pre-commit quality hook is an external whole-repository gate that cannot validate an incomplete assembly. This bypass is not validation and is not a green claim. After every slice is merged, the final integrator runs the hook-equivalent lint/build/test gates on the complete artifact and commits with the installed hook active; any hook-created lock or unrelated staged path is `Drift`, not a reason to edit this spec's authority boundary. +- Receipt0008 is not reimplemented by a parallel writer. Its accepted paths are consumed; only permitted fixture/harness repairs enter the umbrella. +- Generated `packages/sdk/dist/**`, `node_modules`, caches, Playwright output, and logs are local artifacts, never shared source. + +### 6.2 Ownership slices + +| Slice | Owner | Exact files/symbols | Boundary | +|---|---|---|---| +| `W-1` Clean-base visual baseline | `DashboardCutoverEvidenceWriter` | Capsule-local `agent-browser` baseline scope/capture and provenance only; no tracked source | From either exact clean pre-cutover `39579d9` or the accepted 0010 spec commit whose only tree differences are under `design-specs/` and whose executable app/package/lock blobs are byte-identical to `39579d9`; before S0, use deterministic loopback/fixture inputs with all external network denied; fixed `1440x900`; attempt public routes first; retain reachable before artifacts and record exact failure/`Drift` for unreachable states. | +| `S0` Dependency/repository authority | `DashboardCutoverAuthorityWriter` | `apps/dashboard/package.json` SDK edge; delete `apps/dashboard/pnpm-lock.yaml`; delete `apps/dashboard/railway.toml`; full `apps/dashboard/README.md`; update `.githooks/pre-commit`; root `bun.lock` | Only package-manager/config authority owner; no route/SDK source. | +| `W0` Harness reachability gate | `DashboardCutoverEvidenceWriter` | Capsule-local Playwright login runner probe only; no tracked source | After S0 dist build, must prove one exact Bun script or explicit Node 22 Playwright CLI reaches a browser/test with login importing the SDK before S5/Wave A; Playwright is automation authority; no baseline capture or product/e2e pass claim. | +| `S5` Receipt0008 integration | `ReceiptConsumerIntegrator` | The exact nine Receipt paths in §4.5; only genuine fixture/harness repairs | Runs immediately after S0/W0; replays `9b14ed5`, `7b86275`, `b1491d4` and establishes the shared `api.server.ts` seam before Wave A; no Receipt route/API semantic redesign. | +| `S1` Shell/auth/config | `DashboardShellConsumerWriter` | `app/lib/auth.server.ts:createAuthHeaders` if dead; `routes/dashboard.tsx`; `dashboard._index.tsx`; `dashboard.profile._index.tsx`; `dashboard.profile.rediger._index.tsx`; `login.tsx`; `glemt-passord.tsx`; `tilbakestill-passord.$code.tsx`; related mocks after reference proof | Reads the replayed Receipt0008 `api.server.ts`; owns profile/context/config/error UX. | +| `S2` Public projections | `DashboardPublicConsumerWriter` | `dashboard.linjer._index.tsx`; `dashboard.sponsorer._index.tsx`; `dashboard.team._index.tsx` | Accepted public arrays and field projection. | +| `S3` Admin collections | `DashboardAdminConsumerWriter` | `dashboard.assistenter._index.tsx`; `dashboard.skoler._index.tsx`; `dashboard.vikarer._index.tsx`; `dashboard.brukere._index.tsx`; `dashboard.epostliste._index.tsx`; `dashboard.intervjuer._index.tsx`; `dashboard.statistikk._index.tsx`; `dashboard.teaminteresse._index.tsx`; `data-brukere.ts` if unreferenced | Accepted admin page/array unwrap and view mapping. | +| `S4` Applicants/assignment | `DashboardApplicantsConsumerWriter` | `dashboard.sokere._index.tsx`; `data-sokere.ts` if unreferenced | SSR applications/users/schemas, dialog options, assignment action, raw-fetch removal. | +| `S6` Browser/evidence | `DashboardCutoverEvidenceWriter` | Owned `apps/dashboard/playwright.config.ts` test/evidence settings; new `e2e/fixtures/dashboard-api.ts` and `e2e/dashboard-cutover.spec.ts` only if needed; deterministic sanitized after/video paths; no production source | S6 captures matched AFTER screenshots and successful Playwright video at fixed viewport using loopback data; Playwright is automation authority. Foldkit stories are not available in this app; do not invent them. | + +### 6.3 Merge order + +1. Fresh review and product acceptance move this draft toward `Ready`; no writer starts before that gate. +2. `W-1` runs first on either exact clean pre-cutover `39579d9` or the accepted 0010 spec commit with only `design-specs/` differences and byte-identical executable app/package/lock blobs: before network denial, run the frozen resolution baseline in §7.1.1; then deny all external network, use deterministic loopback/fixture inputs, attempt public routes before any `apiClient` removal, retain reachable baseline/provenance, and record exact failure/`Drift` for any unreachable route. +3. `S0` lands after W-1: workspace edge, dashboard lock/Railway deletion, README, updated hook, root lock. No consumer usability claim yet. +4. In the integration worktree, build ignored `packages/sdk/dist/**` with exact Bun immediately after `S0`; this build is mandatory before the W0 login/browser gate. +5. **Wave 0:** run the bounded Playwright login reachability spike in §7.2.2. W0 login imports the built SDK; if no exact runner reaches a browser/test, stop in `Drift`. +6. `S5` runs immediately after `S0`/`W0`: cherry-pick `9b14ed5`, `7b86275`, and `b1491d4` in order; verify the nine-path set, byte-identical preimages, and ancestry. The replayed `api.server.ts` is authoritative for every later consumer slice. +7. **Wave A:** `S1 || S2 || S3` (three isolated writers, distinct files, consuming the replayed shared seam). +8. **Wave B:** `S4` (applicant/assignment consumer). +9. **Wave C:** `S6` captures matched after screenshots and successful video, then adds only neutral fixture/test support. +10. Integrator merges all slices into one clean worktree, rebuilds SDK dist, runs full evidence and hook-equivalent gates, cleans artifacts, and creates the one implementation PR. No shared-tree writes or partial-slice green claims. + +## 7. Exact future maintainer journey + +This is the one journey the future umbrella writer consumes. It is a plan, not execution evidence for this draft. + +### 7.1 Freeze and isolate + +1. Start from the accepted spec commit in a dedicated worktree. Record base, branch, writer, and ownership. +2. Confirm accepted 0003/0008, product read-only boundary, and retired Railway decision. +3. Confirm exact Bun: + + ```sh + bunx --bun bun@1.3.10 --version + ``` + + Output must be `1.3.10`; another version is `Drift`. +4. Pin a capsule-local cache before install/test: + + ```sh + export BUN_INSTALL_CACHE_DIR=/tmp/dashboard-effect-v4-sdk-cutover-0010-bun-cache + ``` +5. Verify installed hook behavior cannot run dashboard pnpm or stage homepage from a dashboard-only change. If installed hook differs from tracked `.githooks/pre-commit`, stop before commit. + +### 7.1.1 W-1 clean-base visual baseline + +Run W-1 in a dedicated worktree at either exact clean pre-cutover `39579d9` or the accepted 0010 spec commit whose only tree differences are under `design-specs/`; before installing, verify root `bun.lock` and all executable app/package blobs are byte-identical to `39579d9`. Run before S0 and before any `apiClient` removal: + +1. Before enabling external network denial, set an isolated cache and run this exact frozen install from the repository root: + + ```sh + export BUN_INSTALL_CACHE_DIR=/tmp/dashboard-effect-v4-sdk-cutover-0010-bun-cache + bunx --bun bun@1.3.10 install --frozen-lockfile + ``` + + This is a resolution-only baseline; do not build or require local SDK `dist/`. Record the observed Receipt verifier result: exit `0`, dashboard SDK resolution `0.1.2` (O-0010-7). Retain the install for W-1 route attempts; clean temporary install artifacts only under §9.3 after evidence and provenance are recorded. +2. After the install completes, enable a network-deny policy that rejects every non-loopback connection; start only deterministic loopback inputs: `API_URL=http://127.0.0.1:8787` and fixture seed `DASHBOARD_CUTOVER_FIXTURE_SEED=dashboard-cutover-0010`. Record the denial policy in provenance. +3. Set the fixed viewport to `1440x900` and use `agent-browser` to attempt route-group states in this order: public first (field studies, sponsors, teams), then shell/auth, admin, applicants, and Receipt. Public attempts are mandatory before any `apiClient` removal. +4. For every currently reachable changed route-group/state, capture the matched BEFORE image at `artifacts/dashboard-cutover/0010/before//.png`. Retain `artifacts/dashboard-cutover/0010/before/provenance.json` with the selected base, executable blob-equality check against `39579d9`, route/state, viewport, fixture seed, loopback URL, network-deny result, and observed outcome. +5. If a baseline route is truly unreachable on the selected pre-cutover base, record the exact observed failure and mark that state `Drift`; never fabricate a screenshot or silently skip the public attempt. A route introduced or newly reachable only after S5 receives its before capture after replay and before S1–S4, as specified in §7.5/§7.6. +6. Keep sanitized BEFORE artifacts and provenance until attached or linked in the one PR. Agent-browser logs/reports are disposable and separate; never retain or commit credentials, raw payloads, or PII. + +Only after W-1's route attempts, artifacts, and provenance are recorded may the maintainer proceed to S0. + + +### 7.2 Apply authority spine + +1. Set only dashboard SDK dependency to `workspace:*`. +2. Delete `apps/dashboard/pnpm-lock.yaml`; never invoke pnpm for dashboard and never create a nested Bun lock. +3. Delete retired `apps/dashboard/railway.toml`; do not invoke Railway. +4. Rewrite all README pnpm regions: `:7-18`, `:20-46`, `:48-78`, `:82-96`, `:203-220`, and `:315-320`. Replace deployment text with “Dashboard Railway configuration is retired by operator decision; provider/service state is unobserved; this README has no deployment command.” Remove the old pnpm anchor and rationale. Do not claim provider retirement was observed. +5. Target executable root guidance: + + ```sh + # from repository root + bunx --bun bun@1.3.10 install + bun turbo -F @monoweb/dashboard dev + bun turbo -F @monoweb/dashboard lint + bun --cwd apps/dashboard run format + bun --cwd apps/dashboard run typecheck + bun run check + ``` + + `bun run check` writes formatting (`oxfmt --write`); it is not a read-only proof. Do not add an e2e command or browser-install command to README until `W0` proves it. Then freeze the exact observed command—either the Bun manifest script or an explicit Node 22 Playwright CLI—and document only the browser-install command actually observed, if one is needed. Never turn the unverified `exec` variants or `bunx playwright install` into evidence. +6. Update only the `.githooks/pre-commit` lock-sync block using the exact extant-lock/staged-own-manifest implementation in §1.2.6. Verify before final commit that a dashboard-only staged manifest cannot recreate the deleted dashboard lock or stage the homepage lock; if the installed hook differs from the tracked updated hook, stop in `Drift`. +7. Generate root lock once and reproduce frozen: + + ```sh + bunx --bun bun@1.3.10 install + bunx --bun bun@1.3.10 install --frozen-lockfile + ``` + + `test:e2e` and `e2e:test:*` remain runtime observations for `W0`; no README command is authoritative until one exact invocation reaches a browser/test. + +### 7.2.1 Build SDK dist before Wave 0 + +Immediately after `S0` and before the W0 login/browser gate: + +```sh +bunx --bun bun@1.3.10 --cwd packages/sdk run build +``` + +Assert `packages/sdk/dist/promise.js`, `promise.d.ts`, `effect-client.js`, and `effect-client.d.ts` exist. Keep ignored dist through W0 and all consumer checks; do not commit it. W0 login imports this built SDK, so a missing export is `Drift` before browser reachability is assessed. + +### 7.2.2 Wave 0: bounded Playwright login reachability + +Run this gate after `S0` and the mandatory SDK dist build, and before `S5`/Wave A in a dedicated capsule worktree. W0 is a post-cutover login runner probe, not a baseline capture, product result, Receipt result, or regression suite: + +1. Use the deterministic loopback fixture inputs and fixed `1440x900` viewport. Keep external network denied; do not use agent-browser for W0 evidence. +2. Use `apps/dashboard/e2e/auth.spec.ts` as the single reachability probe. Its login path must import and exercise the freshly built SDK. `e2e/password-reset.spec.ts` remains a separate regression suite and is not silently included in this gate or the dashboard cutover DoD. +3. Try the existing Bun manifest runner first, with one named login test/project. The manifest's `test:e2e` script is observed, but its ability to reach a browser is not yet proven. +4. If Bun cannot reach the browser, try an explicit Node 22 Playwright CLI using the installed package/config. Do not infer `exec` compatibility, `bunx`, or a browser-install command. +5. Success requires observed browser launch, SDK-backed login assertion progress, Playwright control of the test, and sanitized output. Record runtime versions, exact command, config, project, fixed viewport, and fixture provenance; only then may the exact invocation be frozen in README/package evidence. +6. If browser binaries are missing, record and run only the installation command actually observed during this spike; never document `bunx playwright install` merely as a candidate. +7. Any runner, fixture, bind, install, viewport, or evidence ambiguity stops the journey in `Drift`; no `S5` or Wave A writer may proceed on inferred reachability. + +### 7.2.3 Replay Receipt0008 before Wave A + +Immediately after the successful `W0` gate and before any Wave A consumer writer: + +```sh +git cherry-pick 9b14ed5 7b86275 b1491d4 +git show -s --format='%H %P %s' 9b14ed5 7b86275 b1491d4 +git merge-base --is-ancestor 9b14ed5 7b86275 +git merge-base --is-ancestor 7b86275 b1491d4 +git diff --name-only 9b14ed5^ b1491d4 | sort +``` + +Verify the exact nine-path split and the six byte-identical preimages in §4.5. Stop on any cherry-pick conflict or non-identical preimage; never auto-resolve. The replayed `apps/dashboard/app/lib/api.server.ts` is the authoritative shared seam for S1–S4. Only after this checkpoint may those consumer slices start. + + + + +### 7.3 Resolution checks + +| Check | Required observation | +|---|---| +| Bun | Exact `1.3.10`. | +| Locks | One root `bun.lock`; no dashboard pnpm lock/nested lock. Homepage lock is not silently removed. | +| Importer | Manifest and root dashboard importer use `workspace:*`; no dashboard `^0.1.2`. | +| Link/version | Dashboard SDK realpath equals `packages/sdk`; resolved version `0.2.0`; exact Effect beta.107. | +| Registry absence | No dashboard node-module or dashboard-specific lock/package record names published `0.1.2`; no global absence claim while homepage is out of scope. | +| Dist | Promise/Effect JS and declaration files exist before consumer checks. | +| Hook | Dashboard-only staged manifest creates no dashboard lock and stages no homepage lock; explicit homepage change may sync extant homepage lock. | +| Retired Railway | `apps/dashboard/railway.toml` absent; no provider command. | +| README | No pnpm text, old pnpm anchor, dangling package-manager link, or deployment command. | + +### 7.4 Full consumer and CI-equivalent checks + +Only after all slices merge and SDK dist exists: + +```sh +bunx --bun bun@1.3.10 --cwd apps/dashboard run typecheck +bun turbo lint +bun turbo build +bun turbo test +``` + +Dashboard typecheck must resolve local v4 exports. `turbo build` must follow `turbo.json:5-9` and build SDK before dashboard; CI uses the same root frozen install and Turbo commands (`.github/workflows/ci.yml:26-36`). Any red check is `Drift`, not a cast/mock/route exclusion. + +### 7.5 Visual evidence contract + +`S6` is explicitly authorized to edit only owned test/evidence configuration and use settings in `apps/dashboard/playwright.config.ts`, plus the named dashboard fixture/spec files. Playwright is the automation authority: `W-1` owns clean-base BEFORE scope/capture, while `S6` owns matched AFTER screenshots and the successful full-journey video. Agent-browser does not replace Playwright evidence. + +Use the fixed `1440x900` viewport and sanitized loopback data for every capture. Maintain this route-group/state ledger: + +| Route group | Required journey states | +|---|---| +| Shell/auth | Login, shell/profile/context, dashboard summary. | +| Public | Field studies, sponsors, teams. | +| Admin | Assistants, schools, substitutes, users, mailing lists, interviews, statistics, team interest. | +| Applicants | Applications list, assignment dialog/options, assignment success and typed failure. | +| Receipt | Personal list/create/update/delete and admin list/approve/reject/reopen. | + +For every state changed by S1–S5, `W-1` captures the BEFORE image and `S6` captures the AFTER image at the matched paths: `artifacts/dashboard-cutover/0010/before//.png` and `artifacts/dashboard-cutover/0010/after//.png`. If W-1 records a clean-base failure/`Drift`, retain that exact provenance; for a route introduced or newly reachable only after S5, capture its before image after replay and before S1–S4 changes. Missing either pair side, provenance, or fixed-viewport generation is `Drift`. + +Configure Playwright's owned evidence settings to produce explicit successful screenshots and video, including at least one successful full-journey recording from `e2e/dashboard-cutover.spec.ts` at `artifacts/dashboard-cutover/0010/journeys/dashboard-cutover.webm`. The test must assert the named journey states and verify the retained files exist; a report-only pass is not visual evidence. + +The existing app is not Foldkit; record `Foldkit stories: not available` and do not invent Foldkit stories. Playwright reports, traces, raw agent-browser session logs, and test-results are disposable. Retained sanitized screenshots/video stay at the deterministic paths until attached or linked in the one PR, then may be removed locally. Never commit secrets, credentials, raw payloads, or PII. The PR description maps each §7.6 journey step to its screenshot pair and, where applicable, the full-journey recording. + +### 7.6 One loopback browser journey + +Use only synthetic data and fixed loopback fixtures at the fixed `1440x900` viewport. No Symfony, Worker, Railway, Cloudflare, Alchemy, provider, or production host. + +1. Start a bounded neutral dashboard API fixture with readiness/reset/sanitized evidence, covering accepted shell/profile/dashboard, public, admin, users/schemas, applications/assignment, and typed error responses. Reject non-loopback binds and nested fetch. +2. Run missing-`API_URL` SSR preflight: typed visible configuration failure and zero fixture request; keep missing-cookie `/login` separate from API expiry. +3. With inherited `API_URL` and synthetic cookie, drive shell/profile/context role and dashboard summary; assert accepted fields only. +4. Drive public field studies/sponsors/teams; assert name/logo/link projections and no invented fields/mocks. +5. Drive admin assistants/schools/substitutes/users/mailings/interviews/statistics/team-interest; assert accepted unwrap/mapping/errors. +6. Drive applicants: SSR applications/users/schemas, real dialog options, SDK assignment, no browser `/api` fetch; exercise typed failure matrix. +7. Run `S6` only for the named `e2e/dashboard-cutover.spec.ts` and `e2e/receipts.spec.ts` journeys. `e2e/auth.spec.ts` is the W0 login reachability probe and `e2e/password-reset.spec.ts` is a separate regression suite; neither is silently included in the cutover visual DoD. +8. For every route-group/state changed by S1–S5, retain matched `W-1` BEFORE and `S6` AFTER screenshots at `artifacts/dashboard-cutover/0010/before//.png` and `artifacts/dashboard-cutover/0010/after//.png`; for a route introduced by S5, capture its before state after replay and before S1–S4 changes. Missing either side or W-1 provenance is `Drift`. +9. Produce at least one successful full-journey Playwright recording from S6 at `artifacts/dashboard-cutover/0010/journeys/dashboard-cutover.webm`; screenshot/video files must be explicit successful outputs, not report-only claims. +10. Run accepted Receipt0008 personal/admin journeys only after the three-commit replay and its nine-path/ancestry check. Repair only genuine fixture/harness defects; do not rewrite Receipt semantics. +11. Use the exact invocation frozen by `W0`; if `W0` did not reach a browser/test, stop in `Drift`. Keep retained visual evidence until attached or linked in the one PR, map each journey step to its artifacts in the PR description, then stop fixtures, await shutdown, and clean only capsule-local artifacts. + + +## 8. Falsifiers and definition of done + +### 8.1 Falsifiers + +Any one of these fails the umbrella, even if a happy-path page renders: + +- Dashboard manifest/root importer is not `workspace:*`, or dashboard resolves published `0.1.2`. +- Root lock is absent/duplicated/hand-edited, Bun is not exact `1.3.10`, or dashboard pnpm lock is recreated. +- SDK `dist` is absent before consumers, generated dist is committed, or Effect is not exact beta.107. +- Hook can recreate dashboard lock or stage homepage from a dashboard-only package change. +- Any README pnpm text/anchor/deployment command remains, or README documents unproven `exec`/Node/browser-install invocation as executable. +- Retired `apps/dashboard/railway.toml` remains or a provider/Railway command is run. +- Any dashboard `apiClient`, active raw `/api` fetch, URL interpolation, route-owned API FormData, or compatibility alias remains. +- Any route casts wire values into legacy shapes, invents `shortName`, `size`, `description`, `phone`, `status`, `semester`, or profile `role`, or derives a value without an accepted source. +- Any loader/action catches typed errors into mocks, `null`, `[]`, empty tables, generic success, or silent fallback. +- Applicant options are fetched in the browser rather than SSR through authenticated SDK. +- Receipt0008 accepted paths are semantically rewritten, or prior absence of browser proof is reported as a pass. +- CI/Turbo build graph is excluded, SDK build is skipped, or full dashboard typecheck/build is claimed without local dist. +- Browser evidence contacts a non-loopback host, uses real credentials/data, runs provider/deploy, or relies only on fixture-mode arrays. +- W-1 does not run on exact clean pre-cutover `39579d9` or the accepted 0010 spec commit with only `design-specs/` differences and byte-identical executable app/package/lock blobs, before S0; the frozen install is not run before network denial; external network is not denied after install; deterministic loopback/fixture provenance is absent; public routes are not attempted before `apiClient` removal; or an unreachable baseline route lacks its exact observed failure/`Drift` record. +- Any changed route-group/state lacks a matched fixed-viewport `W-1` BEFORE/`S6` AFTER screenshot pair, W-1 provenance, the successful full-journey Playwright recording, deterministic retained evidence path, or PR artifact mapping; any invented Foldkit story is also `Drift`. +- Any backend/SDK/provider/production change, unrelated homepage lock mutation, source outside ownership, or shared-tree concurrent write occurs. + +### 8.2 Definition of done + +The one implementation PR is done only when: + +1. Fresh review and product acceptance preceded implementation; one base, integrator, slice owners, and merge order are recorded. +2. Dashboard dependency, root lock, dashboard pnpm lock deletion, retired Railway deletion, complete README rewrite, and the tracked `.githooks/pre-commit` extant-lock/staged-own-manifest update match §1/§7; no unrelated hook behavior or lock mutation exists. +3. Exact Bun `1.3.10` frozen install resolves dashboard to local SDK `0.2.0`; SDK dist is built before consumers and remains uncommitted. +4. Every inventory item in §4 uses accepted Promise methods/schemas/transport/error semantics or accepted Receipt0008 behavior; no `apiClient`, raw transport, mismatch cast, or mock-success fallback remains. +5. Product projections show only accepted fields and preserve labels/intents only where meaning is equivalent. +6. Applicants use SSR authenticated SDK loading for applications/users/schemas and pass options to the dialog; browser raw fetch is absent. +7. W-1 captured sanitized clean-base BEFORE states on exact clean pre-cutover `39579d9` or the accepted 0010 spec commit with only `design-specs/` differences and byte-identical executable app/package/lock blobs, after the observed resolution-only install and before network denial, with fixed `1440x900`, deterministic loopback inputs, external network denied, public attempts first, and provenance; no local SDK `dist/` was needed for W-1; S6 captured matched AFTER states and at least one successful full-journey Playwright recording. Exact Playwright invocation is observed, not inferred. +8. SDK build, dashboard typecheck, `bun turbo lint`, `bun turbo build`, and `bun turbo test` evidence is recorded. No green claim precedes these checks. +9. Deterministic retained BEFORE/AFTER screenshots, W-1 provenance, and successful video stay available until attached or linked in the one PR; afterward disposable reports/traces/raw agent-browser logs/test-results, generated dist, fixture processes, logs, and browser artifacts are cleaned. No secrets, credentials, raw payloads, or PII are committed; only intended tracked changes and one PR remain. +10. No backend, provider, Railway, production, deploy, publication, or remote-state claim is made. + +## 9. Rollback, cleanup, and retired Railway + +### 9.1 Local rollback + +- The contract is frozen at reviewed spec commit `edc8836`; changes to this spec require a new accepted spec rather than an in-place implementation edit. +- If a slice fails, stop in `Drift`, preserve evidence, and revert only that isolated slice. +- If the atomic PR is rejected before publication, revert the one PR/commit. Restore the dashboard pnpm lock or Railway file only as a deliberate rollback to the pre-cutover baseline, not as a new authority or deployment action. +- A rollback restores dependency edge and all source callers together. Reintroducing `^0.1.2` without its old lock, or restoring the lock while retaining v4-only callers, is an invalid half-rollback. + +### 9.2 Provider boundary + +`apps/dashboard/railway.toml` is config-as-code, and the historical ADR describes per-app Railway deployment (`docs/adr/0000-migrate-tech-stack-to-typescript-from-php.md:18-26`). The current operator decision authorizes removal of the dashboard Railway configuration. This spec does not know whether a provider watches this branch or whether the provider service still exists; no provider command is run, no deployment state is asserted, and the README must not claim provider retirement was observed. If a provider reports an active dashboard service or reacts to deletion, stop in `Drift` and obtain a separate operator-scoped decision. Restoring the file would require explicit reactivation authority. + +### 9.3 Cleanup + +Use only capsule-local paths: + +- preserve `artifacts/dashboard-cutover/0010/before/**` including `before/provenance.json`, `after/**`, and `journeys/**` at deterministic paths until the sanitized screenshots/video and provenance are attached or linked in the one PR; +- after the PR link is recorded, remove retained visual evidence locally, plus worktree `node_modules`, ignored `packages/sdk/dist`, generated route artifacts, and temporary fixtures; +- remove disposable `playwright-report/**`, `test-results/**`, traces, raw agent-browser session logs, and other reports after evidence is attached; +- stop loopback fixtures and await listener/process shutdown; +- after the one PR's checks and evidence are attached or linked, remove capsule-local `/tmp/dashboard-effect-v4-sdk-cutover-0010-bun-cache`; +- never clear a shared global Bun cache, kill unrelated processes, remove homepage lock, or record/commit secrets, credentials, raw payloads, or PII. + +## 10. Lifecycle and Drift + +### 10.1 Lifecycle gates + +| Gate | State for 0010 | Meaning | +|---|---|---| +| `Draft` | Passed | Drafting complete; independent review and product acceptance are recorded below. | +| `Specified` | Passed | Review confirms authority, inventory, product mappings, ownership, and falsifiers; no build has started. | +| `Ready` | Passed | Independent review PASS and product-lead acceptance on `2026-08-10` authorized the exact capsule and one-to-one implementation PR. | +| `Building` | Passed | Integrator consumed W0 and S5 lineage through exact HEAD `4c63580f0fc19354556923980542f5b91a810802`; no shared-tree or out-of-scope source changes remain. | +| `Experienceable` | Passed | Cold loopback W0 and the named Receipt browser journey passed with exact transitions/raw evidence at fixed local fixture boundaries; no provider/product behavior is inferred. | +| `Conforming` | **Current** | Independent final code PASS and cold final runtime PASS confirm the accepted capsule at exact HEAD; typecheck has nine external diagnostics and is not claimed broadly green. | +| `Release-ready` / `Operating` | Not entered/out of scope | No deployment, production, publication, or operation is authorized. | + +### 10.2 Drift log + +| ID | Observation/conflict | Owner and return path | +|---|---|---| +| `D-0010-1` | Dashboard resolves registry SDK `0.1.2` while workspace SDK is `0.2.0`/Effect beta.107. | `S0`; resolve with `workspace:*`, one root lock, realpath/version evidence. | +| `D-0010-2` | Workspace package has no tracked `dist/`; exports point only at ignored generated files. | Integrator; build dist before consumers, never edit SDK source. | +| `D-0010-3` | CI/Turbo builds dashboard against workspace SDK; stale `apiClient` and shape semantics are shared-gate blockers. | `S1`–`S4`; migrate inventory before CI-equivalent checks; no CI edit. | +| `D-0010-4` | Hook runs pnpm lock sync for hard-coded apps and can stage homepage on dashboard manifest change. | `S0` replaces the hard-coded loop with the tracked extant-lock/staged-own-manifest block; final integrator proves dashboard-only changes cannot recreate/stage unrelated locks. | +| `D-0010-5` | README pnpm exists outside initial command ranges, including browser table/e2e install, package-manager anchor, rationale. | `S0`; rewrite full ranges and preserve no dangling anchors. | +| `D-0010-6` | `e2e:test:*` has `exec`; prior Bun preflight failed before browser; Node invocation is unverified inference. | `W-1` owns clean-base agent-browser scope/provenance; Playwright W0 must prove one SDK-backed login invocation and S6 must produce after pairs/video, or remain in `Drift`. | +| `D-0010-7` | Railway file is retired by operator decision but historical ADR describes Railway deployment. | Operator boundary; delete file locally, make no provider claim, require new decision for reactivation. | +| `D-0010-8` | Homepage retains SDK range/pnpm lock and may leave published records in root lock. | Whole-repository successor; no homepage mutation/global absence claim. | +| `D-0010-9` | Receipt0008 changed-path diagnostics include published-SDK cascade and independent fixture defects; no browser proof. | `S5`; consume accepted implementation and repair only genuine fixture/harness defects. | +| `D-0010-10` | Current routes use legacy fields and mock/empty fallbacks with no accepted schema source. | `S1`–`S4`; apply product projection table and typed errors. | +| `D-0010-11` | Route reachability and visual state may differ between exact clean base and the post-S5 consumer surface. | `W-1` records reachable/unavailable baseline states and public attempts before `apiClient` removal; `S6` captures any missing before state after S5 and before S1–S4, then requires matched fixed-viewport pairs and a successful full-journey recording. | + +Any new conflict among SDK authority, product decisions, route meaning, CI/Turbo, hook behavior, dependency resolution, fixture evidence, or provider status enters `Drift` with owner, evidence, and return path. A writer must not solve an authority conflict by editing the easiest file. + +## 11. Consumed-once implementation capsule + +This is the exact handoff and authorization boundary for lifecycle `Ready`. It was consumed by the one implementation lineage ending at `4c63580f0fc19354556923980542f5b91a810802`; later changes require a new accepted spec. + +| Field | Capsule content | +|---|---| +| Capsule ID | `0010-dashboard-effect-v4-sdk-cutover` | +| One PR | One integrator implementation lineage, W0 merge `8fa0ec5` through exact final HEAD `4c63580`; no partial-green PRs | +| Start gate | Fresh independent review pass + product-lead acceptance; lifecycle `Ready` | +| Base/worktree | Integration: `/tmp/mono-web-dashboard-effect-v4-sdk-cutover-impl-0010-20260810` at exact HEAD `4c63580f0fc19354556923980542f5b91a810802` | +| Integrator | `DashboardEffectV4CutoverIntegrator`; records every owner/merge | +| Concurrent width | Maximum three isolated writers; no shared-tree writes | +| Authority slice | Dashboard `workspace:*`; delete dashboard pnpm lock/Railway file; full README; update `.githooks/pre-commit` lock-sync block; root lock | +| Consumer slices | Shell/auth/config; public; admin; applicants; accepted Receipt0008 integration | +| Evidence slice | W0 exact login pass; cold loopback Receipt journey with fixed `1440x900` evidence; no provider/backend | +| SDK boundary | Read-only accepted 0003 `packages/sdk/**`; cold build of ignored dist before consumers; no SDK source/API change | +| Required checks | Cold Bun `1.3.10` frozen install; SDK `tsc -b`; W0 exact Playwright login pass; two consecutive cold Receipt passes with `--retries=0`; exact six transitions/raw evidence; cleanup; independent code/runtime PASS | +| README target | No pnpm text/anchor/command; root Bun/Turbo commands; executable/proven e2e command; retired deployment statement | +| Hook target | `.githooks/pre-commit` derives extant app locks and runs/stages only the app whose own manifest is staged; dashboard-only changes cannot recreate/stage dashboard or homepage lock | +| Receipt boundary | Accepted nine paths unchanged except genuine fixture/harness repairs | +| Forbidden effects | Backend/API/provider/production/deploy/publication/credentials/remote state; no Railway CLI | +| Evidence destination | One implementation PR description maps each §7.6 journey step to deterministic sanitized BEFORE/AFTER screenshot pairs, W-1 provenance, and S6 video; disposable reports/traces are not retained; no evidence file from this spec | +| Stop condition | Any falsifier, unresolved W-1/W0 browser invocation, missing baseline failure/provenance, missing before/after pair or full-journey recording, red CI/Turbo check, ownership collision, registry link, dist failure, or provider ambiguity returns to Drift | +| Consumption | **Consumed** after the one implementation lineage recorded final journey/evidence and cleanup at exact HEAD `4c63580f0fc19354556923980542f5b91a810802`; later changes require a new accepted spec. | + +## 12. Acceptance and freeze + +| Marker | Frozen record | +|---|---| +| `REVIEW-0010` | Independent review PASS: `agent://DashboardSdkResolutionSpecReview` reviewed commit `edc8836`; final code PASS: `agent://DashboardW0FinalCodeReview`. | +| `PRODUCT-0010` | Product lead accepted this exact umbrella on `2026-08-10`; product remains read-only during implementation. | +| `CAPSULE-0010` | **Consumed** by the exact implementation lineage ending at `4c63580f0fc19354556923980542f5b91a810802`; lifecycle `Conforming` current. | +| `PR-0010` | One-to-one implementation lineage: W0 merge `8fa0ec5`, S5 through `4c63580`; no partial-green PR, second umbrella, or scope expansion. | +| `EVIDENCE-0010` | Cold exact Bun `1.3.10` frozen install passed (`2318 packages`, `10.65s`); SDK `tsc -b` passed; direct Node 22/Playwright 1.58.2 W0 passed (`1 passed`, `4.2s`); Receipt fixture on `127.0.0.1:8787` passed twice from cold state with retries `0` (`16.9s`, `15.7s`), six required transitions, `62` requests, statuses `200×47/201×1/204×5/401×1/404×1/409×3/422×2/429×1/500×1`, multipart/file true, privacy false; runtime `agent://DashboardW0FinalRuntimeVerifier`. | +| `TYPECHECK-0010` | Dashboard typecheck exited `2` with exactly nine diagnostics outside S5: assistenter, epostliste, intervjuer, linjer, skoler, sponsorer, team, teaminteresse, vikarer. No whole-dashboard typecheck green claim. | +| `CLEAN-0010` | Exact HEAD clean; status empty; ports `8787/8788/5174` free; verifier processes exited; installs, dist, reports, caches, fixtures, and logs removed. | +| `FREEZE-0010` | Preserve the exact dependency/lock/README/hook/route ownership, merge order, evidence gates, and forbidden effects; changes outside the consumed capsule require a new accepted spec. | +| `OPERATOR-0010` | Backend/API/provider/production/deploy/publication/credentials/remote state remain forbidden; no Railway CLI or external effect is authorized. | +| `CONFORMANCE-0010` | Final independent code PASS (`agent://DashboardW0FinalCodeReview`) and cold runtime PASS (`agent://DashboardW0FinalRuntimeVerifier`) at exact HEAD `4c63580f0fc19354556923980542f5b91a810802`; first detached-DOM cold failures were fixed by `4c63580`, with no unresolved cold flake. | +| `SCOPE-0010` | Conformance is limited to the accepted Receipt seam and recorded local evidence; no provider, product, backend, production, or broad dashboard typecheck claim. |