From 35af2d2602b02605db8b061a32dccdfe5392f4a6 Mon Sep 17 00:00:00 2001 From: Sutu Sebastian Date: Sat, 18 Jul 2026 11:20:50 +0300 Subject: [PATCH 1/3] feat: polish Layers DevTools UI and add playground Ship docs-aligned panel branding with host-owned theme, TanStack UI primitives, a private Vite demo harness, and a patch changeset. --- .agents/lessons.md | 1 - .changeset/devtools-brand-polish.md | 6 + apps/devtools-playground/README.md | 18 + apps/devtools-playground/index.html | 17 + apps/devtools-playground/package.json | 28 + apps/devtools-playground/src/App.tsx | 24 + apps/devtools-playground/src/DemoPage.tsx | 466 ++++++++++++ apps/devtools-playground/src/client.ts | 16 + apps/devtools-playground/src/index.css | 99 +++ apps/devtools-playground/src/layers.tsx | 683 ++++++++++++++++++ apps/devtools-playground/src/main.tsx | 12 + apps/devtools-playground/src/portal.tsx | 7 + apps/devtools-playground/src/ui.tsx | 235 ++++++ apps/devtools-playground/src/vite-env.d.ts | 1 + apps/devtools-playground/tsconfig.app.json | 22 + apps/devtools-playground/tsconfig.json | 7 + apps/devtools-playground/tsconfig.node.json | 20 + apps/devtools-playground/vite.config.ts | 14 + bun.lock | 191 ++++- knip.json | 2 +- package.json | 3 + packages/devtools/src/brand.ts | 37 + .../devtools/src/components/LayersLogo.tsx | 34 + packages/devtools/src/components/Shell.tsx | 252 +++++-- .../devtools/src/components/StackActions.tsx | 81 +-- .../devtools/src/components/StackTable.tsx | 241 ++++-- packages/devtools/src/components/index.tsx | 2 +- .../src/ReactLayersDevtools.tsx | 4 +- packages/react-devtools/src/plugin.test.ts | 6 +- packages/react-devtools/src/plugin.tsx | 4 +- .../src/resolveDefaultTheme.test.ts | 61 ++ .../react-devtools/src/resolveDefaultTheme.ts | 12 + 32 files changed, 2422 insertions(+), 184 deletions(-) create mode 100644 .changeset/devtools-brand-polish.md create mode 100644 apps/devtools-playground/README.md create mode 100644 apps/devtools-playground/index.html create mode 100644 apps/devtools-playground/package.json create mode 100644 apps/devtools-playground/src/App.tsx create mode 100644 apps/devtools-playground/src/DemoPage.tsx create mode 100644 apps/devtools-playground/src/client.ts create mode 100644 apps/devtools-playground/src/index.css create mode 100644 apps/devtools-playground/src/layers.tsx create mode 100644 apps/devtools-playground/src/main.tsx create mode 100644 apps/devtools-playground/src/portal.tsx create mode 100644 apps/devtools-playground/src/ui.tsx create mode 100644 apps/devtools-playground/src/vite-env.d.ts create mode 100644 apps/devtools-playground/tsconfig.app.json create mode 100644 apps/devtools-playground/tsconfig.json create mode 100644 apps/devtools-playground/tsconfig.node.json create mode 100644 apps/devtools-playground/vite.config.ts create mode 100644 packages/devtools/src/brand.ts create mode 100644 packages/devtools/src/components/LayersLogo.tsx create mode 100644 packages/react-devtools/src/resolveDefaultTheme.test.ts create mode 100644 packages/react-devtools/src/resolveDefaultTheme.ts diff --git a/.agents/lessons.md b/.agents/lessons.md index 70eae2c..04f4e14 100644 --- a/.agents/lessons.md +++ b/.agents/lessons.md @@ -19,7 +19,6 @@ alwaysApply: true - npm trusted publishing (OIDC) needs npm ≥ 11.5.1 + Node ≥ 22.14; oven-sh/setup-bun leaves npm 10.x in PATH, so a release job running `changeset publish`/`npm publish` must also run actions/setup-node (Node 24 → npm 11) or OIDC isn't detected → ENEEDAUTH. - Don't pin a GitHub action to a moving major tag's commit SHA (e.g. setup-node@) — the tag moves and orphans/GCs the commit → "unable to find version"; pin to an immutable release-tag commit or use the moving @vN tag. -- Subagent model choice: use `composer-2.5-fast` for fast implementation, `glm-5.2-high` for deeper exploration/design/debate; mix or run both for hard findings. - Format `apps/docs` non-content files at `printWidth: 80` — oxfmt uses **nearest-config-wins per file**, so the nested `apps/docs/.oxfmtrc.json` (ignore-only → default printWidth 100) shadows root `.oxfmtrc.json` (80) for every `apps/docs/*` file regardless of CLI scope; fix by adding `"printWidth": 80` to `apps/docs/.oxfmtrc.json` (or `-c .oxfmtrc.json --disable-nested-config`). `content/**` stays excluded by the nested ignore so writes won't collapse `:::note` callouts. - The layers repo has tracked `.oxlintrc.json` + root `.oxfmtrc.json` (since the initial commit) with real plugins/rules/ignorePatterns (`.oxlintrc.json` ignores `**/*.svelte` and `**/*.vue`); merge additions into them — never overwrite/replace. Verify tracked lint/format configs via `git ls-files '*.oxlintrc*' '*oxfmt*'` before touching (3 tracked today: `.oxlintrc.json`, `.oxfmtrc.json`, `apps/docs/.oxfmtrc.json`); the "no oxlint config" explore report was wrong. - A blume version bump needs `rm -rf .blume .blume-verify` (or a dev-server restart) before trusting build/preview output — `blume build --isolated` always regenerates the runtime, but incremental `writeIfChanged` skips, `ensureDepsLink` no-ops, `blume preview` serving an existing build, and `.blume/.astro` caches can persist stale output and silently mask new markdown/transformer features (e.g. 1.0.4 `blume:table-wrap`), reading as a false upstream regression. diff --git a/.changeset/devtools-brand-polish.md b/.changeset/devtools-brand-polish.md new file mode 100644 index 0000000..4f4b37c --- /dev/null +++ b/.changeset/devtools-brand-polish.md @@ -0,0 +1,6 @@ +--- +"@stainless-code/layers-devtools": patch +"@stainless-code/react-layers-devtools": patch +--- + +Polish Layers DevTools panel branding (docs-aligned tokens/logo, TanStack UI primitives) and follow the host theme; React doorbell defaults to OS `prefers-color-scheme` when the host omits `theme`. Plugin label is "Layers". diff --git a/apps/devtools-playground/README.md b/apps/devtools-playground/README.md new file mode 100644 index 0000000..d69b325 --- /dev/null +++ b/apps/devtools-playground/README.md @@ -0,0 +1,18 @@ +# Layers DevTools Playground + +Private local app (not published). Demo + visual harness for `@stainless-code/react-layers` and the Layers DevTools plugin. + +## Run + +Build workspace packages first, then: + +```bash +bun run playground:dev +``` + +→ http://localhost:5177 — TanStack DevTools → **Layers**. Theme via host Settings. + +```bash +bun run playground:build +bun run playground:preview +``` diff --git a/apps/devtools-playground/index.html b/apps/devtools-playground/index.html new file mode 100644 index 0000000..b02658e --- /dev/null +++ b/apps/devtools-playground/index.html @@ -0,0 +1,17 @@ + + + + + + Layers DevTools Playground + + + + +
+ + + diff --git a/apps/devtools-playground/package.json b/apps/devtools-playground/package.json new file mode 100644 index 0000000..3ec1889 --- /dev/null +++ b/apps/devtools-playground/package.json @@ -0,0 +1,28 @@ +{ + "name": "@stainless-code/layers-devtools-playground", + "private": true, + "description": "Local Vite playground for Layers + TanStack DevTools demos and UI polish.", + "type": "module", + "scripts": { + "build": "tsc -b && vite build", + "dev": "vite", + "preview": "vite preview", + "typecheck": "bun run --filter '@stainless-code/layers' --filter '@stainless-code/react-layers' --filter '@stainless-code/react-layers-devtools' build && tsc -b --noEmit" + }, + "dependencies": { + "@stainless-code/react-layers": "workspace:*", + "@stainless-code/react-layers-devtools": "workspace:*", + "@tanstack/react-devtools": "0.10.8", + "react": "19.2.7", + "react-dom": "19.2.7" + }, + "devDependencies": { + "@tailwindcss/vite": "4.1.11", + "@types/react": "19.2.17", + "@types/react-dom": "19.2.3", + "@vitejs/plugin-react": "6.0.1", + "tailwindcss": "4.1.11", + "typescript": "6.0.3", + "vite": "8.1.5" + } +} diff --git a/apps/devtools-playground/src/App.tsx b/apps/devtools-playground/src/App.tsx new file mode 100644 index 0000000..d9a9695 --- /dev/null +++ b/apps/devtools-playground/src/App.tsx @@ -0,0 +1,24 @@ +import { StackOutlet, StackProvider } from "@stainless-code/react-layers"; +import { layersDevtoolsPlugin } from "@stainless-code/react-layers-devtools"; +import { TanStackDevtools } from "@tanstack/react-devtools"; + +import { layerClient, MODAL_STACK, TOAST_STACK, WIZARD_STACK } from "./client"; +import { DemoPage } from "./DemoPage"; + +export function App() { + return ( + + + + + +
+ +
+ + {import.meta.env.DEV ? ( + + ) : null} +
+ ); +} diff --git a/apps/devtools-playground/src/DemoPage.tsx b/apps/devtools-playground/src/DemoPage.tsx new file mode 100644 index 0000000..29b0647 --- /dev/null +++ b/apps/devtools-playground/src/DemoPage.tsx @@ -0,0 +1,466 @@ +import { + useLayer, + useLayerClient, + useQueuedStack, +} from "@stainless-code/react-layers"; +import { useEffect, useState } from "react"; + +import { WIZARD_STACK } from "./client"; +import { + animatedLayer, + blockedEditLayer, + confirmLayer, + deployLayer, + drawerLayer, + formatValidationError, + inviteLayer, + nestedParentLayer, + profileLayer, + progressLayer, + toastLayer, + wizardPayloads, + wizardSteps, +} from "./layers"; +import { Btn } from "./ui"; + +interface FeedItem { + id: number; + label: string; + detail: string; + tone: "neutral" | "ok" | "warn"; +} + +let feedSeq = 0; + +function pushFeed( + setFeed: React.Dispatch>, + label: string, + detail: string, + tone: FeedItem["tone"] = "neutral", +) { + setFeed((prev) => [ + { id: ++feedSeq, label, detail, tone }, + ...prev.slice(0, 7), + ]); +} + +function QueueBadge() { + const client = useLayerClient(); + const stack = client.getStack(WIZARD_STACK); + const [queued, setQueued] = useState(0); + + useEffect(() => { + const sync = () => setQueued(stack.getQueuedSnapshot().length); + sync(); + return stack.subscribe(sync); + }, [stack]); + + if (queued === 0) return null; + + return ( + + {queued} queued + + ); +} + +function Capability({ + title, + description, + children, +}: { + title: string; + description: string; + children: React.ReactNode; +}) { + return ( +
+

+ {title} +

+

+ {description} +

+ {children} +
+ ); +} + +export function DemoPage() { + const confirm = useLayer(confirmLayer); + const nested = useLayer(nestedParentLayer); + const blocked = useLayer(blockedEditLayer); + const profile = useLayer(profileLayer); + const animated = useLayer(animatedLayer); + const drawer = useLayer(drawerLayer); + const toast = useLayer(toastLayer); + const progress = useLayer(progressLayer); + const deploy = useLayer(deployLayer); + const invite = useLayer(inviteLayer); + const w1 = useLayer(wizardSteps[0]); + const w2 = useLayer(wizardSteps[1]); + const w3 = useLayer(wizardSteps[2]); + + const toastCount = useQueuedStack({ + stack: "toast", + select: (s) => s.length, + }); + + const [feed, setFeed] = useState([]); + const [validationError, setValidationError] = useState(null); + + return ( +
+
+
+

+ DevTools playground +

+

+ Layers orchestrates every overlay in your app. +

+

+ Headless stack manager — await confirms, queue wizards, nest + dialogs, block dismissals, load async data, animate enter/exit, and + inspect live state in TanStack DevTools. One cohesive surface, zero + UI library lock-in. +

+
+ +
+

+ Live signals +

+
+ + stacks:{" "} + + modal · toast · wizard + + + + toasts mounted: {toastCount} + + +
+

+ Open TanStack DevTools (bottom) → Layers panel. +

+
+
+ +
+
+ + { + const ok = await confirm.open({ + title: "Delete production deployment?", + detail: + "Traffic will fail over immediately. This cannot be undone.", + }); + pushFeed( + setFeed, + "Confirm", + ok ? "User confirmed delete" : "User cancelled", + ok ? "warn" : "neutral", + ); + }} + > + Delete deployment + + + + + { + void w1.open(wizardPayloads[0]); + void w2.open(wizardPayloads[1]); + void w3.open(wizardPayloads[2]); + pushFeed(setFeed, "Wizard", "Queued 3 onboarding steps"); + }} + > + Launch onboarding + + + + + { + void nested.open({ title: "Edit deployment" }); + pushFeed(setFeed, "Nested", "Parent opened"); + }} + > + Edit with nested confirm + + + + + { + const saved = await blocked.open({ title: "Edit runbook" }); + pushFeed( + setFeed, + "Blockers", + saved ? "Force-closed" : "Closed cleanly", + ); + }} + > + Dirty form dialog + + + + + { + void profile.open({ userId: "ada" }); + pushFeed(setFeed, "Async", "Profile layer opened"); + }} + > + Load profile + + + + + { + void animated.open({ title: "Animated handoff" }); + pushFeed(setFeed, "Transitions", "Animated dialog opened"); + }} + > + Animated dialog + + + + + { + const saved = await drawer.open({ title: "Stack settings" }); + pushFeed( + setFeed, + "Drawer", + saved ? "Settings saved" : "Drawer dismissed", + ); + }} + > + Open drawer + + + + +
+ { + void toast.open({ message: "Changes saved", tone: "ok" }); + pushFeed(setFeed, "Toast", "Success toast fired", "ok"); + }} + > + Success toast + + { + void toast.open({ + message: "Rate limit approaching", + tone: "warn", + }); + pushFeed(setFeed, "Toast", "Warning toast fired", "warn"); + }} + > + Warn toast + +
+
+ + + { + void progress.open({ percent: 0, label: "Uploading bundle…" }); + const layer = progress.stack.find(["playground", "progress"]); + if (!layer) return; + + let percent = 0; + const interval = setInterval(() => { + percent = Math.min(100, percent + 8); + progress.stack.update(layer, { percent }); + if (percent >= 100) { + clearInterval(interval); + void progress.stack + .dismiss(layer, undefined as void) + .then(() => { + pushFeed(setFeed, "Progress", "Upload complete", "ok"); + }); + } + }, 140); + }} + > + Simulate upload + + + + + { + const ok = await deploy.open({ target: "production" }); + pushFeed( + setFeed, + "Deploy", + ok ? "Deploy succeeded" : "Deploy cancelled", + ok ? "ok" : "neutral", + ); + }} + > + Deploy with mutation flow + + + + +
+ { + setValidationError(null); + try { + await invite.open({ email: "ops@layers.dev" }); + pushFeed(setFeed, "Validation", "Invite sent", "ok"); + } catch (err) { + setValidationError(formatValidationError(err)); + } + }} + > + Valid invite + + { + setValidationError(null); + try { + await invite.open({ email: "not-an-email" }); + } catch (err) { + const msg = formatValidationError(err); + setValidationError(msg); + pushFeed(setFeed, "Validation", msg, "warn"); + } + }} + > + Reject bad payload + + {validationError ? ( +

+ {validationError} +

+ ) : null} +
+
+
+ + +
+
+ ); +} diff --git a/apps/devtools-playground/src/client.ts b/apps/devtools-playground/src/client.ts new file mode 100644 index 0000000..7df0497 --- /dev/null +++ b/apps/devtools-playground/src/client.ts @@ -0,0 +1,16 @@ +import { LayerClient } from "@stainless-code/react-layers"; + +export const MODAL_STACK = "modal"; +export const TOAST_STACK = "toast"; +export const WIZARD_STACK = "wizard"; + +export const layerClient = new LayerClient({ + defaultStackOptions: { + [WIZARD_STACK]: { scope: { strategy: "serial" } }, + }, +}); + +// Seed stacks so the DevTools panel lists them before the first open. +layerClient.ensureStack(MODAL_STACK); +layerClient.ensureStack(TOAST_STACK); +layerClient.ensureStack(WIZARD_STACK); diff --git a/apps/devtools-playground/src/index.css b/apps/devtools-playground/src/index.css new file mode 100644 index 0000000..9cf30d8 --- /dev/null +++ b/apps/devtools-playground/src/index.css @@ -0,0 +1,99 @@ +@import "tailwindcss"; + +/* Palette from `apps/docs/theme.css`. */ +:root { + color-scheme: light; + --ink: #faf8f5; + --ink-raised: #f0ede8; + --ink-panel: #ffffff; + --ink-border: #e2ddd6; + --ink-muted: #6b6863; + --ink-text: #1c1b19; + --teal: #0d9488; + --teal-dim: #0f766e; + --teal-glow: rgb(13 148 136 / 0.16); + --danger: #dc2626; + --success: #059669; + --radius: 12px; + --radius-sm: 8px; + --shadow: 0 24px 80px rgb(28 27 25 / 0.12); + --font-display: "Inter Tight", Inter, ui-sans-serif, system-ui, sans-serif; + --font-body: + Inter, ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, + Helvetica, Arial, sans-serif; + --font-mono: + "IBM Plex Mono", ui-monospace, "SF Mono", Menlo, Consolas, monospace; +} + +@media (prefers-color-scheme: dark) { + :root { + color-scheme: dark; + --ink: #18181b; + --ink-raised: #27272a; + --ink-panel: #1f1f23; + --ink-border: #3f3f46; + --ink-muted: #a1a1aa; + --ink-text: #f5f0e8; + --teal: #2dd4bf; + --teal-dim: #14b8a6; + --teal-glow: rgb(45 212 191 / 0.18); + --danger: #f87171; + --success: #34d399; + --shadow: 0 24px 80px rgb(0 0 0 / 0.45); + } +} + +*, +*::before, +*::after { + box-sizing: border-box; +} + +html, +body, +#root { + min-height: 100%; +} + +body { + margin: 0; + font-family: var(--font-body); + background: + radial-gradient(1200px 600px at 10% -10%, var(--teal-glow), transparent), + radial-gradient(900px 500px at 90% 0%, var(--teal-glow), transparent), + var(--ink); + color: var(--ink-text); + -webkit-font-smoothing: antialiased; +} + +button, +input { + font: inherit; +} + +@keyframes fade-up { + from { + opacity: 0; + transform: translateY(8px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +@keyframes pulse-ring { + 0%, + 100% { + box-shadow: 0 0 0 0 var(--teal-glow); + } + 50% { + box-shadow: 0 0 0 10px transparent; + } +} + +@keyframes spin { + to { + transform: rotate(360deg); + } +} diff --git a/apps/devtools-playground/src/layers.tsx b/apps/devtools-playground/src/layers.tsx new file mode 100644 index 0000000..7cb9e43 --- /dev/null +++ b/apps/devtools-playground/src/layers.tsx @@ -0,0 +1,683 @@ +import { + isPayloadValidationError, + layerOptions, + useLayerGroup, + useMutationFlow, +} from "@stainless-code/react-layers"; +import type { + LayerComponentProps, + LayerKey, + LayerOptions, + LayerTransition, +} from "@stainless-code/react-layers"; +import type { ReactNode } from "react"; +import { useEffect, useState } from "react"; + +import { MODAL_STACK, TOAST_STACK, WIZARD_STACK } from "./client"; +import { overlayPortal } from "./portal"; +import { + ANIM_MS, + Backdrop, + Btn, + DialogActions, + DialogTitle, + DrawerShell, + Field, + ModalShell, + Spinner, + TextInput, + ToastShell, +} from "./ui"; + +type LayerProps = LayerComponentProps; + +interface TitlePayload { + title: string; +} + +interface ConfirmPayload { + title: string; + detail?: string; +} + +interface DiscardPayload { + title: string; + message: string; +} + +interface WizardPayload { + step: number; + title: string; + body: string; +} + +interface ProfilePayload { + userId: string; +} + +interface Profile { + name: string; + role: string; + initials: string; +} + +interface ToastPayload { + message: string; + tone?: "ok" | "warn"; +} + +interface ProgressPayload { + percent: number; + label: string; +} + +interface DeployPayload { + target: string; +} + +interface InvitePayload { + email: string; +} + +function playgroundKey(...parts: Array): LayerKey { + return ["playground", ...parts]; +} + +function playgroundLayer< + P, + R = void, + E = never, + D = unknown, + RootProps = unknown, + const Key extends LayerKey = LayerKey, +>(options: LayerOptions & { key: Key }) { + return layerOptions({ + stack: MODAL_STACK, + enteringDelay: ANIM_MS, + exitingDelay: ANIM_MS, + ...options, + }); +} + +function delay(ms: number, signal?: AbortSignal): Promise { + return new Promise((resolve, reject) => { + const timer = setTimeout(resolve, ms); + signal?.addEventListener( + "abort", + () => { + clearTimeout(timer); + reject(new DOMException("Aborted", "AbortError")); + }, + { once: true }, + ); + }); +} + +function useSettleOnTransition( + call: { settle: () => void }, + transition: LayerTransition, +) { + useEffect(() => { + if (transition !== "entering" && transition !== "exiting") { + return; + } + const timer = setTimeout(() => call.settle(), ANIM_MS); + return () => clearTimeout(timer); + }, [transition, call]); +} + +function ModalOverlay(props: { + transition: LayerTransition; + role?: "dialog" | "alertdialog" | "status"; + onBackdropClick?: () => void; + children: ReactNode; +}) { + return overlayPortal( + <> + + + {props.children} + + , + ); +} + +function Muted({ + children, + className = "", +}: { + children: ReactNode; + className?: string; +}) { + return ( +

+ {children} +

+ ); +} + +function BooleanActions(props: { + onCancel: () => void; + onConfirm: () => void; + cancelLabel?: string; + confirmLabel?: string; + confirmVariant?: "danger" | "primary"; +}) { + return ( + + {props.cancelLabel ?? "Cancel"} + + {props.confirmLabel ?? "Confirm"} + + + ); +} + +function ConfirmDialog({ + call, + payload, + transition, +}: LayerProps) { + return ( + call.end(false)} + > + {payload.title} + + {payload.detail ?? + "This action cannot be undone. Proceed only if you are certain."} + + call.end(false)} + onConfirm={() => call.end(true)} + /> + + ); +} + +export const confirmLayer = playgroundLayer({ + key: playgroundKey("confirm"), + component: ConfirmDialog, +}); + +function WizardStep({ call, payload, transition }: LayerProps) { + return ( + + + {payload.title} + + {payload.body} +
+
+
+ + call.end()}> + {payload.step < 3 ? "Continue" : "Finish"} + + + + ); +} + +export const wizardPayloads = [ + { + step: 1, + title: "Welcome to Layers", + body: "Serial scope queues overlays — only one wizard step mounts at a time.", + }, + { + step: 2, + title: "Compose stacks", + body: "Modal, toast, and wizard stacks run in parallel across the app surface.", + }, + { + step: 3, + title: "Ship with confidence", + body: "Await results, block dismissals, and inspect everything in DevTools.", + }, +] as const satisfies readonly WizardPayload[]; + +export const wizardSteps = wizardPayloads.map((step) => + playgroundLayer({ + stack: WIZARD_STACK, + key: playgroundKey("wizard", step.step), + component: WizardStep, + }), +); + +function NestedChildConfirm({ + call, + payload, + transition, +}: LayerProps) { + return ( + + {payload.title} + + Child overlay on a scoped stack — parent stays mounted underneath. + + call.end(false)} + onConfirm={() => call.end(true)} + /> + + ); +} + +const nestedChild = playgroundLayer({ + key: playgroundKey("nested", "child"), + component: NestedChildConfirm, +}); + +function NestedParentDialog({ + call, + payload, + transition, +}: LayerProps) { + const group = useLayerGroup(call); + const [childResult, setChildResult] = useState(null); + + return ( + + {payload.title} + + Open a nested confirm without tearing down this dialog. + + {childResult !== null ? ( +

+ Child returned: {String(childResult)} +

+ ) : null} + + { + setChildResult(null); + const ok = await group.open({ + ...nestedChild, + payload: { title: "Really delete deployment?" }, + }); + setChildResult(ok); + }} + > + Delete deployment + + call.dismiss()}>Close + + +
+ ); +} + +export const nestedParentLayer = playgroundLayer({ + key: playgroundKey("nested", "parent"), + component: NestedParentDialog, +}); + +function DiscardConfirm({ + call, + payload, + transition, +}: LayerProps) { + return ( + + {payload.title} + {payload.message} + call.end(false)} + onConfirm={() => call.end(true)} + /> + + ); +} + +const discardConfirm = playgroundLayer({ + key: playgroundKey("blockers", "discard"), + component: DiscardConfirm, +}); + +function BlockedEditDialog({ + call, + payload, + transition, + dismissing, +}: LayerProps) { + const group = useLayerGroup(call, { name: "discard" }); + const [text, setText] = useState(""); + const dirty = text.trim().length > 0; + + useEffect(() => call.addBlocker(() => !dirty), [call, dirty]); + + const attemptClose = async () => { + if (!dirty) { + call.end(false); + return; + } + const discard = await group.open({ + ...discardConfirm, + payload: { + title: "Discard changes?", + message: "Unsaved edits will be lost.", + }, + }); + if (discard) call.end(false, { force: true }); + }; + + return ( + + {payload.title} + + setText(e.target.value)} + placeholder="Type to mark the form dirty…" + autoFocus + /> + + {dismissing ? ( +

+ Blocker consulted — dismiss vetoed until you confirm or force close. +

+ ) : null} + + void attemptClose()}>Close + call.end(true, { force: true })}> + Force close + + + +
+ ); +} + +export const blockedEditLayer = playgroundLayer({ + key: playgroundKey("blockers", "edit"), + component: BlockedEditDialog, +}); + +function ProfileDialog({ + call, + payload, + data, + phase, + transition, +}: LayerProps) { + return ( + + + Profile · {payload.userId} + + {phase === "pending" ? ( +
+ + Loading profile before mount settles… +
+ ) : ( +
+
+ {data?.initials} +
+
+

{data?.name}

+

{data?.role}

+
+
+ )} + + call.dismiss()}>Close + +
+ ); +} + +export const profileLayer = playgroundLayer< + ProfilePayload, + void, + never, + Profile +>({ + key: playgroundKey("async-profile"), + component: ProfileDialog, + loadFn: async ({ signal }) => { + await delay(900, signal); + return { + name: "Ada Lovelace", + role: "Founding Engineer", + initials: "AL", + }; + }, +}); + +function AnimatedDialog({ + call, + payload, + transition, +}: LayerProps) { + useSettleOnTransition(call, transition); + + return ( + + {payload.title} + + enteringDelay / exitingDelay hold the layer until{" "} + call.settle() runs. + +

+ transition:{" "} + {transition} +

+ + call.dismiss()}>Close + +
+ ); +} + +export const animatedLayer = playgroundLayer({ + key: playgroundKey("animated"), + component: AnimatedDialog, +}); + +function SettingsDrawer({ + call, + payload, + transition, +}: LayerProps) { + return overlayPortal( + +
+ {payload.title} + call.end(false)}> + ✕ + +
+
+

+ Side-panel layer on the modal stack — backdrop + sheet chrome you own. +

+ + + + + + +
+
+ call.end(false)}>Cancel + call.end(true)}> + Save + +
+
, + ); +} + +export const drawerLayer = playgroundLayer({ + key: playgroundKey("drawer"), + component: SettingsDrawer, +}); + +function ToastLayer({ call, payload, transition }: LayerProps) { + useEffect(() => { + const timer = setTimeout(() => call.dismiss(), 3200); + return () => clearTimeout(timer); + }, [call]); + + const tone = payload.tone ?? "ok"; + + return ( + + +
+

+ {payload.message} +

+

Parallel toast stack

+
+ call.dismiss()} + > + ✕ + +
+ ); +} + +export const toastLayer = playgroundLayer({ + stack: TOAST_STACK, + key: playgroundKey("toast"), + component: ToastLayer, +}); + +function ProgressOverlay({ payload, transition }: LayerProps) { + return ( + + {payload.label} +
+
+
+
+ {payload.percent}% complete +
+ + ); +} + +export const progressLayer = playgroundLayer({ + key: playgroundKey("progress"), + component: ProgressOverlay, +}); + +function DeployDialog({ + call, + payload, + transition, +}: LayerProps) { + const flow = useMutationFlow(call); + + return ( + + + Deploy to {payload.target} + + + Mutation flow sets running state while the async action completes. + + + call.end(false)} disabled={flow.pending}> + Cancel + + + void flow + .run(async () => { + await delay(1200); + }) + .orEnd(true) + } + > + {flow.pending ? ( + <> + Deploying… + + ) : ( + "Deploy" + )} + + + + ); +} + +export const deployLayer = playgroundLayer({ + key: playgroundKey("deploy"), + component: DeployDialog, +}); + +function InviteDialog({ + call, + payload, + transition, +}: LayerProps) { + return ( + + Send invite + Opening with a valid email parsed at the boundary: +

+ {payload.email} +

+ + call.dismiss()}>Close + call.end()}> + Send + + +
+ ); +} + +export const inviteLayer = playgroundLayer({ + key: playgroundKey("invite"), + component: InviteDialog, + validate: (input: unknown) => { + const email = + typeof input === "object" && input !== null && "email" in input + ? (input as { email: unknown }).email + : undefined; + if ( + typeof email !== "string" || + !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email) + ) { + throw new Error("Valid email required"); + } + return { email: email.trim().toLowerCase() }; + }, +}); + +export function formatValidationError(err: unknown): string { + if (isPayloadValidationError(err)) { + return err.issues.map((i) => i.message).join("; ") || "Invalid payload"; + } + if (err instanceof Error) return err.message; + return "Unknown validation error"; +} diff --git a/apps/devtools-playground/src/main.tsx b/apps/devtools-playground/src/main.tsx new file mode 100644 index 0000000..2595601 --- /dev/null +++ b/apps/devtools-playground/src/main.tsx @@ -0,0 +1,12 @@ +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; + +import { App } from "./App"; + +import "./index.css"; + +createRoot(document.getElementById("root")!).render( + + + , +); diff --git a/apps/devtools-playground/src/portal.tsx b/apps/devtools-playground/src/portal.tsx new file mode 100644 index 0000000..11a8b6f --- /dev/null +++ b/apps/devtools-playground/src/portal.tsx @@ -0,0 +1,7 @@ +import type { ReactNode } from "react"; +import { createPortal } from "react-dom"; + +export function overlayPortal(node: ReactNode): ReactNode { + if (typeof document === "undefined") return node; + return createPortal(node, document.body); +} diff --git a/apps/devtools-playground/src/ui.tsx b/apps/devtools-playground/src/ui.tsx new file mode 100644 index 0000000..7d79998 --- /dev/null +++ b/apps/devtools-playground/src/ui.tsx @@ -0,0 +1,235 @@ +import type { LayerTransition } from "@stainless-code/react-layers"; +import type { ButtonHTMLAttributes, CSSProperties, ReactNode } from "react"; +import { useEffect, useState } from "react"; + +/** Keep in sync with `playgroundLayer` delays in `layers.tsx`. */ +export const ANIM_MS = 220; + +const baseBtn = + "inline-flex items-center justify-center gap-2 rounded-[var(--radius-sm)] px-4 py-2.5 text-sm font-medium transition-all duration-200 disabled:cursor-not-allowed disabled:opacity-45"; + +const variants = { + primary: `${baseBtn} bg-[var(--teal)] text-[var(--ink)] hover:brightness-110`, + ghost: `${baseBtn} border border-[var(--ink-border)] bg-transparent text-[var(--ink-text)] hover:border-[var(--teal-dim)] hover:bg-[var(--teal-glow)]`, + danger: `${baseBtn} bg-[var(--danger)] text-white hover:brightness-110`, + subtle: `${baseBtn} bg-[var(--ink-raised)] text-[var(--ink-muted)] hover:text-[var(--ink-text)]`, +} as const; + +export function Btn({ + variant = "ghost", + className = "", + ...props +}: ButtonHTMLAttributes & { + variant?: keyof typeof variants; +}) { + return ( + - + Run +
); } diff --git a/packages/devtools/src/components/StackTable.tsx b/packages/devtools/src/components/StackTable.tsx index 97a8229..6d9b672 100644 --- a/packages/devtools/src/components/StackTable.tsx +++ b/packages/devtools/src/components/StackTable.tsx @@ -1,7 +1,70 @@ -import type { LayerNotifyView } from "@stainless-code/layers"; -import { For, Show } from "solid-js"; +import type { + LayerActionStatus, + LayerNotifyView, + LayerPhase, + LayerTransition, +} from "@stainless-code/layers"; +import { + JsonTree, + Section, + SectionDescription, + SectionTitle, + Tag, + useTheme, +} from "@tanstack/devtools-ui"; +import type { ComponentProps } from "solid-js"; +import { createMemo, For, Show } from "solid-js"; -function formatPayload(layer: LayerNotifyView): string { +import { brandTokens } from "../brand"; + +type TagColor = ComponentProps["color"]; + +function phaseTagColor(phase: LayerPhase): TagColor { + switch (phase) { + case "active": { + return "green"; + } + case "queued": { + return "yellow"; + } + case "pending": { + return "blue"; + } + case "dismissed": { + return "gray"; + } + case "error": { + return "red"; + } + } +} + +function transitionTagColor(transition: LayerTransition): TagColor { + switch (transition) { + case "entering": { + return "cyan"; + } + case "settled": { + return "gray"; + } + case "exiting": { + return "purple"; + } + } +} + +function actionStatusTagColor(status: LayerActionStatus): TagColor { + switch (status) { + case "running": { + return "pink"; + } + case "idle": { + return "gray"; + } + } +} + +function formatPayloadFallback(layer: LayerNotifyView): string { if (layer.payloadTruncated) { return "[truncated]"; } @@ -15,19 +78,31 @@ function formatPayload(layer: LayerNotifyView): string { } } +function canShowJsonTree(layer: LayerNotifyView): boolean { + if (layer.payloadTruncated || layer.payload === undefined) { + return false; + } + return typeof layer.payload === "object" && layer.payload !== null; +} + function LayerTable(props: { title: string; rows: LayerNotifyView[] }) { + const { theme } = useTheme(); + const tableStyles = createMemo(() => { + const t = brandTokens(theme()); + return { + border: t.border, + headerBg: t.headerBg, + }; + }); + return ( -
-

- {props.title} ({props.rows.length}) -

+
+ + {props.title} + 0} - fallback={ -

- Empty -

- } + fallback={Empty} >
- - + - - - - + - @@ -60,38 +173,86 @@ function LayerTable(props: { title: string; rows: LayerNotifyView[] }) { {(layer) => ( - - + - - - )} @@ -100,7 +261,7 @@ function LayerTable(props: { title: string; rows: LayerNotifyView[] }) {
+
phase + transition + actionStatus id + + id + key + payload
- {layer.phase} +
+ - {layer.transition} + + - {layer.actionStatus} + + {layer.id} + {layer.key} - {formatPayload(layer)} + + {formatPayloadFallback(layer)} + + } + > + +
-
+
); } @@ -113,16 +274,10 @@ export function StackTable(props: { return (
-

- Last action: {props.action} + + Last action: · seq {props.seq} -

+
diff --git a/packages/devtools/src/components/index.tsx b/packages/devtools/src/components/index.tsx index 1d4dfd1..b261035 100644 --- a/packages/devtools/src/components/index.tsx +++ b/packages/devtools/src/components/index.tsx @@ -12,7 +12,7 @@ export default function LayersDevtools(props: DevtoolsProps) { return ( - + ); diff --git a/packages/react-devtools/src/ReactLayersDevtools.tsx b/packages/react-devtools/src/ReactLayersDevtools.tsx index 9728272..8ba1d44 100644 --- a/packages/react-devtools/src/ReactLayersDevtools.tsx +++ b/packages/react-devtools/src/ReactLayersDevtools.tsx @@ -9,6 +9,8 @@ import type { DevtoolsPanelProps } from "@tanstack/devtools-utils/react"; import type { JSX } from "react"; import { useEffect } from "react"; +import { resolveDefaultTheme } from "./resolveDefaultTheme"; + export interface LayersDevtoolsReactInit extends Partial { /** When set, skips {@link useLayerClient} for attach. */ client?: LayerClient; @@ -24,7 +26,7 @@ function resolvePanelProps( props?: LayersDevtoolsReactInit, ): DevtoolsPanelProps { return { - theme: props?.theme ?? "dark", + theme: props?.theme ?? resolveDefaultTheme(), devtoolsOpen: props?.devtoolsOpen ?? false, }; } diff --git a/packages/react-devtools/src/plugin.test.ts b/packages/react-devtools/src/plugin.test.ts index 5259001..49271d6 100644 --- a/packages/react-devtools/src/plugin.test.ts +++ b/packages/react-devtools/src/plugin.test.ts @@ -5,7 +5,7 @@ import { layersDevtoolsNoOpPlugin, layersDevtoolsPlugin } from "./plugin"; describe("layersDevtoolsPlugin", () => { it("returns a TanStack plugin descriptor", () => { const plugin = layersDevtoolsPlugin(); - expect(plugin.name).toBe("TanStack Layers"); + expect(plugin.name).toBe("Layers"); expect(typeof plugin.render).toBe("function"); }); @@ -13,13 +13,13 @@ describe("layersDevtoolsPlugin", () => { const plugin = layersDevtoolsPlugin({ client: { getStackIds: () => [] } as never, }); - expect(plugin.name).toBe("TanStack Layers"); + expect(plugin.name).toBe("Layers"); expect(typeof plugin.render).toBe("function"); }); it("exposes a no-op plugin factory", () => { const plugin = layersDevtoolsNoOpPlugin(); - expect(plugin.name).toBe("TanStack Layers"); + expect(plugin.name).toBe("Layers"); expect(typeof plugin.render).toBe("function"); }); }); diff --git a/packages/react-devtools/src/plugin.tsx b/packages/react-devtools/src/plugin.tsx index 8fae04c..b0efaa4 100644 --- a/packages/react-devtools/src/plugin.tsx +++ b/packages/react-devtools/src/plugin.tsx @@ -11,7 +11,7 @@ export interface LayersDevtoolsPluginOptions { type LayersDevtoolsPluginFactory = ReturnType[0]; const defaultLayersPlugins = createReactPlugin({ - name: "TanStack Layers", + name: "Layers", Component: LayersDevtoolsPanel, }); @@ -23,7 +23,7 @@ export function layersDevtoolsPlugin( return defaultLayersPlugins[0](); } const withClient = createReactPlugin({ - name: "TanStack Layers", + name: "Layers", Component: (panelProps) => ( ), diff --git a/packages/react-devtools/src/resolveDefaultTheme.test.ts b/packages/react-devtools/src/resolveDefaultTheme.test.ts new file mode 100644 index 0000000..590da42 --- /dev/null +++ b/packages/react-devtools/src/resolveDefaultTheme.test.ts @@ -0,0 +1,61 @@ +import { afterEach, describe, expect, it } from "bun:test"; + +import { resolveDefaultTheme } from "./resolveDefaultTheme"; + +function stubWindowMatchMedia(matches: boolean) { + const previous = (globalThis as { window?: Window }).window; + const matchMedia = (query: string) => + ({ + matches, + media: query, + onchange: null, + addListener() {}, + removeListener() {}, + addEventListener() {}, + removeEventListener() {}, + dispatchEvent() { + return false; + }, + }) as MediaQueryList; + + Object.defineProperty(globalThis, "window", { + configurable: true, + writable: true, + value: { matchMedia }, + }); + + return () => { + if (previous === undefined) { + Reflect.deleteProperty(globalThis, "window"); + } else { + Object.defineProperty(globalThis, "window", { + configurable: true, + writable: true, + value: previous, + }); + } + }; +} + +describe("resolveDefaultTheme", () => { + let restore: (() => void) | undefined; + + afterEach(() => { + restore?.(); + restore = undefined; + }); + + it("returns dark when window is unavailable", () => { + expect(resolveDefaultTheme()).toBe("dark"); + }); + + it("returns dark when prefers-color-scheme: dark matches", () => { + restore = stubWindowMatchMedia(true); + expect(resolveDefaultTheme()).toBe("dark"); + }); + + it("returns light when prefers-color-scheme: dark does not match", () => { + restore = stubWindowMatchMedia(false); + expect(resolveDefaultTheme()).toBe("light"); + }); +}); diff --git a/packages/react-devtools/src/resolveDefaultTheme.ts b/packages/react-devtools/src/resolveDefaultTheme.ts new file mode 100644 index 0000000..df510e1 --- /dev/null +++ b/packages/react-devtools/src/resolveDefaultTheme.ts @@ -0,0 +1,12 @@ +/** OS preference when the host does not pass `theme`. */ +export function resolveDefaultTheme(): "light" | "dark" { + if ( + typeof window !== "undefined" && + typeof window.matchMedia === "function" + ) { + return window.matchMedia("(prefers-color-scheme: dark)").matches + ? "dark" + : "light"; + } + return "dark"; +} From b2ea6201129e8c3002a02ca1ccf133a101fb138e Mon Sep 17 00:00:00 2001 From: Sutu Sebastian Date: Sat, 18 Jul 2026 11:23:04 +0300 Subject: [PATCH 2/3] fix: bump playground Tailwind/Vite plugins for audit @tailwindcss/vite@4.1.11 nested vite@7.3.1 (high advisories); align with 4.3.3 + plugin-react 6.0.3. --- apps/devtools-playground/package.json | 6 +- bun.lock | 188 ++++---------------------- 2 files changed, 33 insertions(+), 161 deletions(-) diff --git a/apps/devtools-playground/package.json b/apps/devtools-playground/package.json index 3ec1889..517835b 100644 --- a/apps/devtools-playground/package.json +++ b/apps/devtools-playground/package.json @@ -17,11 +17,11 @@ "react-dom": "19.2.7" }, "devDependencies": { - "@tailwindcss/vite": "4.1.11", + "@tailwindcss/vite": "4.3.3", "@types/react": "19.2.17", "@types/react-dom": "19.2.3", - "@vitejs/plugin-react": "6.0.1", - "tailwindcss": "4.1.11", + "@vitejs/plugin-react": "6.0.3", + "tailwindcss": "4.3.3", "typescript": "6.0.3", "vite": "8.1.5" } diff --git a/bun.lock b/bun.lock index 6de38c0..5a8766a 100644 --- a/bun.lock +++ b/bun.lock @@ -38,11 +38,11 @@ "react-dom": "19.2.7", }, "devDependencies": { - "@tailwindcss/vite": "4.1.11", + "@tailwindcss/vite": "4.3.3", "@types/react": "19.2.17", "@types/react-dom": "19.2.3", - "@vitejs/plugin-react": "6.0.1", - "tailwindcss": "4.1.11", + "@vitejs/plugin-react": "6.0.3", + "tailwindcss": "4.3.3", "typescript": "6.0.3", "vite": "8.1.5", }, @@ -1089,7 +1089,7 @@ "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.2.0", "", { "os": "win32", "cpu": "x64" }, "sha512-WfFv6/qGufotqBSBzBYwgpCkJBk8Nj7697LL9vTz/XWc67e0r3oewu8iMRwQj3AUL45GVD7wVsPjCsAAtW66Wg=="], - "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.7", "", {}, "sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA=="], + "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.1", "", {}, "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw=="], "@rollup/pluginutils": ["@rollup/pluginutils@5.4.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg=="], @@ -1243,37 +1243,37 @@ "@swc/helpers": ["@swc/helpers@0.5.23", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw=="], - "@tailwindcss/node": ["@tailwindcss/node@4.1.11", "", { "dependencies": { "@ampproject/remapping": "^2.3.0", "enhanced-resolve": "^5.18.1", "jiti": "^2.4.2", "lightningcss": "1.30.1", "magic-string": "^0.30.17", "source-map-js": "^1.2.1", "tailwindcss": "4.1.11" } }, "sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q=="], + "@tailwindcss/node": ["@tailwindcss/node@4.3.3", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "^5.24.1", "jiti": "^2.7.0", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.3.3" } }, "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg=="], - "@tailwindcss/oxide": ["@tailwindcss/oxide@4.1.11", "", { "dependencies": { "detect-libc": "^2.0.4", "tar": "^7.4.3" }, "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.1.11", "@tailwindcss/oxide-darwin-arm64": "4.1.11", "@tailwindcss/oxide-darwin-x64": "4.1.11", "@tailwindcss/oxide-freebsd-x64": "4.1.11", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.11", "@tailwindcss/oxide-linux-arm64-gnu": "4.1.11", "@tailwindcss/oxide-linux-arm64-musl": "4.1.11", "@tailwindcss/oxide-linux-x64-gnu": "4.1.11", "@tailwindcss/oxide-linux-x64-musl": "4.1.11", "@tailwindcss/oxide-wasm32-wasi": "4.1.11", "@tailwindcss/oxide-win32-arm64-msvc": "4.1.11", "@tailwindcss/oxide-win32-x64-msvc": "4.1.11" } }, "sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg=="], + "@tailwindcss/oxide": ["@tailwindcss/oxide@4.3.3", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.3.3", "@tailwindcss/oxide-darwin-arm64": "4.3.3", "@tailwindcss/oxide-darwin-x64": "4.3.3", "@tailwindcss/oxide-freebsd-x64": "4.3.3", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3", "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3", "@tailwindcss/oxide-linux-arm64-musl": "4.3.3", "@tailwindcss/oxide-linux-x64-gnu": "4.3.3", "@tailwindcss/oxide-linux-x64-musl": "4.3.3", "@tailwindcss/oxide-wasm32-wasi": "4.3.3", "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3", "@tailwindcss/oxide-win32-x64-msvc": "4.3.3" } }, "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA=="], - "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.1.11", "", { "os": "android", "cpu": "arm64" }, "sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg=="], + "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.3.3", "", { "os": "android", "cpu": "arm64" }, "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw=="], - "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.1.11", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ=="], + "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.3.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw=="], - "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.1.11", "", { "os": "darwin", "cpu": "x64" }, "sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw=="], + "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.3.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw=="], - "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.1.11", "", { "os": "freebsd", "cpu": "x64" }, "sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA=="], + "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.3.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw=="], - "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11", "", { "os": "linux", "cpu": "arm" }, "sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg=="], + "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3", "", { "os": "linux", "cpu": "arm" }, "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ=="], - "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.1.11", "", { "os": "linux", "cpu": "arm64" }, "sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ=="], + "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.3.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w=="], - "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.1.11", "", { "os": "linux", "cpu": "arm64" }, "sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ=="], + "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.3.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA=="], - "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.1.11", "", { "os": "linux", "cpu": "x64" }, "sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg=="], + "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.3.3", "", { "os": "linux", "cpu": "x64" }, "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w=="], - "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.1.11", "", { "os": "linux", "cpu": "x64" }, "sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q=="], + "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.3.3", "", { "os": "linux", "cpu": "x64" }, "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img=="], - "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.1.11", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@emnapi/wasi-threads": "^1.0.2", "@napi-rs/wasm-runtime": "^0.2.11", "@tybys/wasm-util": "^0.9.0", "tslib": "^2.8.0" }, "cpu": "none" }, "sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g=="], + "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.3.3", "", { "dependencies": { "@emnapi/core": "^1.11.1", "@emnapi/runtime": "^1.11.1", "@emnapi/wasi-threads": "^1.2.2", "@napi-rs/wasm-runtime": "^1.1.4", "@tybys/wasm-util": "^0.10.2", "tslib": "^2.8.1" }, "cpu": "none" }, "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ=="], - "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.1.11", "", { "os": "win32", "cpu": "arm64" }, "sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w=="], + "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.3.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ=="], - "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.1.11", "", { "os": "win32", "cpu": "x64" }, "sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg=="], + "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.3.3", "", { "os": "win32", "cpu": "x64" }, "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw=="], "@tailwindcss/typography": ["@tailwindcss/typography@0.5.20", "", { "dependencies": { "postcss-selector-parser": "6.0.10" }, "peerDependencies": { "tailwindcss": ">=3.0.0 || >=4.0.0 || insiders" } }, "sha512-hwbzQuNUfcPvbegQFatVPl/MY/tcM9KLl963hQ5laJKPh81TEZ1+dNG9PirGvcaDBkp+BCshExAyKVPW91dozw=="], - "@tailwindcss/vite": ["@tailwindcss/vite@4.1.11", "", { "dependencies": { "@tailwindcss/node": "4.1.11", "@tailwindcss/oxide": "4.1.11", "tailwindcss": "4.1.11" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7" } }, "sha512-RHYhrR3hku0MJFRV+fN2gNbDNEh3dwKvY8XJvTxCSXeMOsCRSr+uKvDWQcbizrHgjML6ZmTE5OwMrl5wKcujCw=="], + "@tailwindcss/vite": ["@tailwindcss/vite@4.3.3", "", { "dependencies": { "@tailwindcss/node": "4.3.3", "@tailwindcss/oxide": "4.3.3", "tailwindcss": "4.3.3" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7 || ^8" } }, "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw=="], "@takumi-rs/core": ["@takumi-rs/core@1.8.7", "", { "dependencies": { "@takumi-rs/helpers": "1.8.7" }, "optionalDependencies": { "@takumi-rs/core-darwin-arm64": "1.8.7", "@takumi-rs/core-darwin-x64": "1.8.7", "@takumi-rs/core-linux-arm64-gnu": "1.8.7", "@takumi-rs/core-linux-arm64-musl": "1.8.7", "@takumi-rs/core-linux-x64-gnu": "1.8.7", "@takumi-rs/core-linux-x64-musl": "1.8.7", "@takumi-rs/core-win32-arm64-msvc": "1.8.7", "@takumi-rs/core-win32-x64-msvc": "1.8.7" } }, "sha512-Ia8I3vg0VAQPnzHiYRrd18UgZbIj3X0zMwWMjuTm3yb2TBH1988lPwnnlf+eAfYMwZrutNiXLLtgEnkzsm2gMw=="], @@ -1453,7 +1453,7 @@ "@vitejs/plugin-basic-ssl": ["@vitejs/plugin-basic-ssl@2.3.0", "", { "peerDependencies": { "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-bdyo8rB3NnQbikdMpHaML9Z1OZPBu6fFOBo+OtxsBlvMJtysWskmBcnbIDhUqgC8tcxNv/a+BcV5U+2nQMm1OQ=="], - "@vitejs/plugin-react": ["@vitejs/plugin-react@6.0.1", "", { "dependencies": { "@rolldown/pluginutils": "1.0.0-rc.7" }, "peerDependencies": { "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", "babel-plugin-react-compiler": "^1.0.0", "vite": "^8.0.0" }, "optionalPeers": ["@rolldown/plugin-babel", "babel-plugin-react-compiler"] }, "sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ=="], + "@vitejs/plugin-react": ["@vitejs/plugin-react@6.0.3", "", { "dependencies": { "@rolldown/pluginutils": "^1.0.1" }, "peerDependencies": { "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", "babel-plugin-react-compiler": "^1.0.0", "vite": "^8.0.0" }, "optionalPeers": ["@rolldown/plugin-babel", "babel-plugin-react-compiler"] }, "sha512-vmFvco5/QuC2f9Oj+wTk0+9XeDFkHxSamwZKYc7MxYwKICfvUvlMhqKI0VuICPltGqh1neqBKDvO4kes1ya8vg=="], "@vitejs/plugin-vue": ["@vitejs/plugin-vue@6.0.8", "", { "dependencies": { "@rolldown/pluginutils": "^1.0.1" }, "peerDependencies": { "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", "vue": "^3.2.25" } }, "sha512-0ZjgOg7oO6farnNGup7yvoM/YXZV84OZxHAwtflItNa/6zzQyVb5LNxyea3FEKEX2XlagIKzrlH7wwxkKgtiew=="], @@ -1725,7 +1725,7 @@ "chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="], - "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], + "chownr": ["chownr@1.1.4", "", {}, "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="], "ci-info": ["ci-info@4.4.0", "", {}, "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg=="], @@ -3125,7 +3125,7 @@ "tagged-tag": ["tagged-tag@1.0.0", "", {}, "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng=="], - "tailwindcss": ["tailwindcss@4.1.11", "", {}, "sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA=="], + "tailwindcss": ["tailwindcss@4.3.3", "", {}, "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ=="], "tapable": ["tapable@2.3.3", "", {}, "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A=="], @@ -3387,7 +3387,7 @@ "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], - "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], + "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], "yaml": ["yaml@2.9.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA=="], @@ -3517,7 +3517,7 @@ "@stainless-code/codemap/package-manager-detector": ["package-manager-detector@1.7.0", "", {}, "sha512-xg1eHpwYL/D/HEdWw2goFZP6vV0FH7W+PZ5rFkGjdIDLtxq7EkzBUeT3m+lndYCt8wKbmofUu1MUdMCXkCk9ZQ=="], - "@tailwindcss/node/lightningcss": ["lightningcss@1.30.1", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-darwin-arm64": "1.30.1", "lightningcss-darwin-x64": "1.30.1", "lightningcss-freebsd-x64": "1.30.1", "lightningcss-linux-arm-gnueabihf": "1.30.1", "lightningcss-linux-arm64-gnu": "1.30.1", "lightningcss-linux-arm64-musl": "1.30.1", "lightningcss-linux-x64-gnu": "1.30.1", "lightningcss-linux-x64-musl": "1.30.1", "lightningcss-win32-arm64-msvc": "1.30.1", "lightningcss-win32-x64-msvc": "1.30.1" } }, "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg=="], + "@stainless-code/react-layers-devtools/@vitejs/plugin-react": ["@vitejs/plugin-react@6.0.1", "", { "dependencies": { "@rolldown/pluginutils": "1.0.0-rc.7" }, "peerDependencies": { "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", "babel-plugin-react-compiler": "^1.0.0", "vite": "^8.0.0" }, "optionalPeers": ["@rolldown/plugin-babel", "babel-plugin-react-compiler"] }, "sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ=="], "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.11.2", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" }, "bundled": true }, "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA=="], @@ -3525,14 +3525,12 @@ "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.2", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA=="], - "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.12", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.10.0" }, "bundled": true }, "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ=="], + "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.6", "", { "dependencies": { "@tybys/wasm-util": "^0.10.3" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" }, "bundled": true }, "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg=="], - "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.9.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw=="], + "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.3", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg=="], "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@tailwindcss/vite/vite": ["vite@7.3.1", "", { "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA=="], - "@tanstack/devtools/@tanstack/devtools-ui": ["@tanstack/devtools-ui@0.6.0", "", { "dependencies": { "clsx": "^2.1.1", "dayjs": "^1.11.19", "goober": "^2.1.16", "solid-js": "^1.9.9" } }, "sha512-CVaM6rT6Nl5ijo83vJYFa2SjofvpuOl/uOvbYGhBrRgUhhelNHhx8zZX+hnZCHmIr0/lzM65hsocnZ72592Rvg=="], "@tanstack/intent/semver": ["semver@7.8.5", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="], @@ -3553,10 +3551,6 @@ "@vercel/routing-utils/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - "@vitejs/plugin-vue/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.1", "", {}, "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw=="], - - "@vitejs/plugin-vue-jsx/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.1", "", {}, "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw=="], - "@vitest/utils/convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], "@vscode/emmet-helper/jsonc-parser": ["jsonc-parser@2.3.1", "", {}, "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg=="], @@ -3591,12 +3585,8 @@ "bl/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - "blume/@tailwindcss/vite": ["@tailwindcss/vite@4.3.3", "", { "dependencies": { "@tailwindcss/node": "4.3.3", "@tailwindcss/oxide": "4.3.3", "tailwindcss": "4.3.3" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7 || ^8" } }, "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw=="], - "blume/marked": ["marked@18.0.6", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-MrV5puXBfuiy6wl6DLaq3BtIJQAJToAd5zt/ZKhRfGRAuFPALE7/4Y7jnxRQoEgK/pBgurGqLyAuRgZ2xOjr6w=="], - "blume/tailwindcss": ["tailwindcss@4.3.3", "", {}, "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ=="], - "blume/undici": ["undici@8.7.0", "", {}, "sha512-N7iQtfyLhIMOFgQubvmLV26svHpO0bqKnAiWotTQCVKCmWrcGbBotPuW1x+xwYZ2VHdSTVUfPQQnlEt1/LouTQ=="], "blume/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], @@ -3729,8 +3719,6 @@ "rolldown/@oxc-project/types": ["@oxc-project/types@0.140.0", "", {}, "sha512-h5LUOzGArYemnW1NMz/DuuQhBi96J6JL2Bk8zE4kvqxB5Sg3jxmCiH4uyOWHDkiKSt5vWlG4FIwCR/DbstcNRQ=="], - "rolldown/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.1", "", {}, "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw=="], - "rolldown-plugin-dts/get-tsconfig": ["get-tsconfig@5.0.0-beta.5", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-/6gFNr0N04nob252sTQxyFLi3eKFRqIg1I87YcqAMT1i6SQrSF6KujUEQrtrjMV0H/eejTCltLdDSTEMzHbnsQ=="], "rollup/@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], @@ -3763,7 +3751,9 @@ "svgo/css-what": ["css-what@6.2.2", "", {}, "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA=="], - "tar-fs/chownr": ["chownr@1.1.4", "", {}, "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="], + "tar/chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], + + "tar/yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], "tar-stream/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], @@ -3865,8 +3855,6 @@ "@astrojs/react/@vitejs/plugin-react/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.3", "", {}, "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q=="], - "@babel/helper-compilation-targets/lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], - "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], "@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], @@ -3879,29 +3867,7 @@ "@prefresh/vite/@rollup/pluginutils/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], - "@tailwindcss/node/lightningcss/lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.30.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ=="], - - "@tailwindcss/node/lightningcss/lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.30.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA=="], - - "@tailwindcss/node/lightningcss/lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.30.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig=="], - - "@tailwindcss/node/lightningcss/lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.30.1", "", { "os": "linux", "cpu": "arm" }, "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q=="], - - "@tailwindcss/node/lightningcss/lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.30.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw=="], - - "@tailwindcss/node/lightningcss/lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.30.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ=="], - - "@tailwindcss/node/lightningcss/lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.30.1", "", { "os": "linux", "cpu": "x64" }, "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw=="], - - "@tailwindcss/node/lightningcss/lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.30.1", "", { "os": "linux", "cpu": "x64" }, "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ=="], - - "@tailwindcss/node/lightningcss/lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.30.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA=="], - - "@tailwindcss/node/lightningcss/lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.30.1", "", { "os": "win32", "cpu": "x64" }, "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg=="], - - "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime/@tybys/wasm-util": ["@tybys/wasm-util@0.10.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg=="], - - "@tailwindcss/vite/vite/esbuild": ["esbuild@0.27.7", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.7", "@esbuild/android-arm": "0.27.7", "@esbuild/android-arm64": "0.27.7", "@esbuild/android-x64": "0.27.7", "@esbuild/darwin-arm64": "0.27.7", "@esbuild/darwin-x64": "0.27.7", "@esbuild/freebsd-arm64": "0.27.7", "@esbuild/freebsd-x64": "0.27.7", "@esbuild/linux-arm": "0.27.7", "@esbuild/linux-arm64": "0.27.7", "@esbuild/linux-ia32": "0.27.7", "@esbuild/linux-loong64": "0.27.7", "@esbuild/linux-mips64el": "0.27.7", "@esbuild/linux-ppc64": "0.27.7", "@esbuild/linux-riscv64": "0.27.7", "@esbuild/linux-s390x": "0.27.7", "@esbuild/linux-x64": "0.27.7", "@esbuild/netbsd-arm64": "0.27.7", "@esbuild/netbsd-x64": "0.27.7", "@esbuild/openbsd-arm64": "0.27.7", "@esbuild/openbsd-x64": "0.27.7", "@esbuild/openharmony-arm64": "0.27.7", "@esbuild/sunos-x64": "0.27.7", "@esbuild/win32-arm64": "0.27.7", "@esbuild/win32-ia32": "0.27.7", "@esbuild/win32-x64": "0.27.7" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w=="], + "@stainless-code/react-layers-devtools/@vitejs/plugin-react/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.7", "", {}, "sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA=="], "@testing-library/preact/@testing-library/dom/aria-query": ["aria-query@5.1.3", "", { "dependencies": { "deep-equal": "^2.0.5" } }, "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ=="], @@ -3913,10 +3879,6 @@ "babel-plugin-jsx-dom-expressions/parse5/entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], - "blume/@tailwindcss/vite/@tailwindcss/node": ["@tailwindcss/node@4.3.3", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "^5.24.1", "jiti": "^2.7.0", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.3.3" } }, "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg=="], - - "blume/@tailwindcss/vite/@tailwindcss/oxide": ["@tailwindcss/oxide@4.3.3", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.3.3", "@tailwindcss/oxide-darwin-arm64": "4.3.3", "@tailwindcss/oxide-darwin-x64": "4.3.3", "@tailwindcss/oxide-freebsd-x64": "4.3.3", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3", "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3", "@tailwindcss/oxide-linux-arm64-musl": "4.3.3", "@tailwindcss/oxide-linux-x64-gnu": "4.3.3", "@tailwindcss/oxide-linux-x64-musl": "4.3.3", "@tailwindcss/oxide-wasm32-wasi": "4.3.3", "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3", "@tailwindcss/oxide-win32-x64-msvc": "4.3.3" } }, "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA=="], - "cli-highlight/yargs/cliui": ["cliui@7.0.4", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" } }, "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ=="], "cli-highlight/yargs/yargs-parser": ["yargs-parser@20.2.9", "", {}, "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="], @@ -4095,8 +4057,6 @@ "vite/rolldown/@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.1.5", "", { "os": "win32", "cpu": "x64" }, "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA=="], - "vite/rolldown/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.1", "", {}, "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw=="], - "vscode-languageserver/vscode-languageserver-protocol/vscode-jsonrpc": ["vscode-jsonrpc@8.2.0", "", {}, "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA=="], "vscode-languageserver/vscode-languageserver-protocol/vscode-languageserver-types": ["vscode-languageserver-types@3.17.5", "", {}, "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg=="], @@ -4159,84 +4119,8 @@ "@astrojs/check/yargs/cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], - "@tailwindcss/vite/vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.7", "", { "os": "aix", "cpu": "ppc64" }, "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg=="], - - "@tailwindcss/vite/vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.27.7", "", { "os": "android", "cpu": "arm" }, "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ=="], - - "@tailwindcss/vite/vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.7", "", { "os": "android", "cpu": "arm64" }, "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ=="], - - "@tailwindcss/vite/vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.27.7", "", { "os": "android", "cpu": "x64" }, "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg=="], - - "@tailwindcss/vite/vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw=="], - - "@tailwindcss/vite/vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ=="], - - "@tailwindcss/vite/vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.7", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w=="], - - "@tailwindcss/vite/vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.7", "", { "os": "freebsd", "cpu": "x64" }, "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ=="], - - "@tailwindcss/vite/vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.7", "", { "os": "linux", "cpu": "arm" }, "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA=="], - - "@tailwindcss/vite/vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A=="], - - "@tailwindcss/vite/vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.7", "", { "os": "linux", "cpu": "ia32" }, "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg=="], - - "@tailwindcss/vite/vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q=="], - - "@tailwindcss/vite/vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw=="], - - "@tailwindcss/vite/vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.7", "", { "os": "linux", "cpu": "ppc64" }, "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ=="], - - "@tailwindcss/vite/vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ=="], - - "@tailwindcss/vite/vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.7", "", { "os": "linux", "cpu": "s390x" }, "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw=="], - - "@tailwindcss/vite/vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.7", "", { "os": "linux", "cpu": "x64" }, "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA=="], - - "@tailwindcss/vite/vite/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w=="], - - "@tailwindcss/vite/vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.7", "", { "os": "none", "cpu": "x64" }, "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw=="], - - "@tailwindcss/vite/vite/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.7", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A=="], - - "@tailwindcss/vite/vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.7", "", { "os": "openbsd", "cpu": "x64" }, "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg=="], - - "@tailwindcss/vite/vite/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw=="], - - "@tailwindcss/vite/vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.7", "", { "os": "sunos", "cpu": "x64" }, "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA=="], - - "@tailwindcss/vite/vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA=="], - - "@tailwindcss/vite/vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.7", "", { "os": "win32", "cpu": "ia32" }, "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw=="], - - "@tailwindcss/vite/vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.7", "", { "os": "win32", "cpu": "x64" }, "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg=="], - "@ts-morph/common/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], - "blume/@tailwindcss/vite/@tailwindcss/oxide/@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.3.3", "", { "os": "android", "cpu": "arm64" }, "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw=="], - - "blume/@tailwindcss/vite/@tailwindcss/oxide/@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.3.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw=="], - - "blume/@tailwindcss/vite/@tailwindcss/oxide/@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.3.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw=="], - - "blume/@tailwindcss/vite/@tailwindcss/oxide/@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.3.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw=="], - - "blume/@tailwindcss/vite/@tailwindcss/oxide/@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3", "", { "os": "linux", "cpu": "arm" }, "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ=="], - - "blume/@tailwindcss/vite/@tailwindcss/oxide/@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.3.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w=="], - - "blume/@tailwindcss/vite/@tailwindcss/oxide/@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.3.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA=="], - - "blume/@tailwindcss/vite/@tailwindcss/oxide/@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.3.3", "", { "os": "linux", "cpu": "x64" }, "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w=="], - - "blume/@tailwindcss/vite/@tailwindcss/oxide/@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.3.3", "", { "os": "linux", "cpu": "x64" }, "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img=="], - - "blume/@tailwindcss/vite/@tailwindcss/oxide/@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.3.3", "", { "dependencies": { "@emnapi/core": "^1.11.1", "@emnapi/runtime": "^1.11.1", "@emnapi/wasi-threads": "^1.2.2", "@napi-rs/wasm-runtime": "^1.1.4", "@tybys/wasm-util": "^0.10.2", "tslib": "^2.8.1" }, "cpu": "none" }, "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ=="], - - "blume/@tailwindcss/vite/@tailwindcss/oxide/@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.3.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ=="], - - "blume/@tailwindcss/vite/@tailwindcss/oxide/@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.3.3", "", { "os": "win32", "cpu": "x64" }, "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw=="], - "cli-highlight/yargs/cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], "editorconfig/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], @@ -4250,17 +4134,5 @@ "knip/oxc-resolver/@oxc-resolver/binding-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.11.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-55coeOFKHv1ywEcUXJtWU5f+Jr/W5tZDvZig8DLKSwUN1JpROQ4rk/SNOQiFWmaR/VKF4zuFyW1B8JduOSv6Pg=="], "log-update/wrap-ansi/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], - - "blume/@tailwindcss/vite/@tailwindcss/oxide/@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.11.2", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" }, "bundled": true }, "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA=="], - - "blume/@tailwindcss/vite/@tailwindcss/oxide/@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.11.2", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA=="], - - "blume/@tailwindcss/vite/@tailwindcss/oxide/@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.2", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA=="], - - "blume/@tailwindcss/vite/@tailwindcss/oxide/@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.6", "", { "dependencies": { "@tybys/wasm-util": "^0.10.3" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" }, "bundled": true }, "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg=="], - - "blume/@tailwindcss/vite/@tailwindcss/oxide/@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.3", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg=="], - - "blume/@tailwindcss/vite/@tailwindcss/oxide/@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], } } From 2a90512e2e036abfe3ccf7edae3d3531e2737505 Mon Sep 17 00:00:00 2001 From: Sutu Sebastian Date: Sat, 18 Jul 2026 11:25:19 +0300 Subject: [PATCH 3/3] fix: align @vitejs/plugin-react to 6.0.3 for sherif --- bun.lock | 6 +----- packages/react-devtools/package.json | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/bun.lock b/bun.lock index 5a8766a..43627bf 100644 --- a/bun.lock +++ b/bun.lock @@ -211,7 +211,7 @@ "@testing-library/react": "16.3.2", "@types/react": "19.2.17", "@types/react-dom": "19.2.3", - "@vitejs/plugin-react": "6.0.1", + "@vitejs/plugin-react": "6.0.3", "jsdom": "29.1.1", "react": "19.2.7", "react-dom": "19.2.7", @@ -3517,8 +3517,6 @@ "@stainless-code/codemap/package-manager-detector": ["package-manager-detector@1.7.0", "", {}, "sha512-xg1eHpwYL/D/HEdWw2goFZP6vV0FH7W+PZ5rFkGjdIDLtxq7EkzBUeT3m+lndYCt8wKbmofUu1MUdMCXkCk9ZQ=="], - "@stainless-code/react-layers-devtools/@vitejs/plugin-react": ["@vitejs/plugin-react@6.0.1", "", { "dependencies": { "@rolldown/pluginutils": "1.0.0-rc.7" }, "peerDependencies": { "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", "babel-plugin-react-compiler": "^1.0.0", "vite": "^8.0.0" }, "optionalPeers": ["@rolldown/plugin-babel", "babel-plugin-react-compiler"] }, "sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ=="], - "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.11.2", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" }, "bundled": true }, "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA=="], "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.11.2", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA=="], @@ -3867,8 +3865,6 @@ "@prefresh/vite/@rollup/pluginutils/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], - "@stainless-code/react-layers-devtools/@vitejs/plugin-react/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.7", "", {}, "sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA=="], - "@testing-library/preact/@testing-library/dom/aria-query": ["aria-query@5.1.3", "", { "dependencies": { "deep-equal": "^2.0.5" } }, "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ=="], "@ts-morph/common/minimatch/brace-expansion": ["brace-expansion@2.1.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA=="], diff --git a/packages/react-devtools/package.json b/packages/react-devtools/package.json index 48f243a..6866280 100644 --- a/packages/react-devtools/package.json +++ b/packages/react-devtools/package.json @@ -70,7 +70,7 @@ "@testing-library/react": "16.3.2", "@types/react": "19.2.17", "@types/react-dom": "19.2.3", - "@vitejs/plugin-react": "6.0.1", + "@vitejs/plugin-react": "6.0.3", "jsdom": "29.1.1", "react": "19.2.7", "react-dom": "19.2.7",