History

Add shadcn UI components, fix Tailwind monorepo scanning, improve secret selector UX

- Add shadcn/ui component library (button, card, input, popover, command, dialog, etc.) - Fix Tailwind CSS not scanning workspace packages by adding correct @source directives in globals.css (root cause: paths needed ../../../ not ../../ from apps/web/src/) - Improve secret selector: replace trigger button + separate search with single search input that expands into results on focus - Update auth sections across plugins to use rounded bordered containers

Rhys Sullivan committed 7 months ago

Commit 05b2c841 parent 3fea5fb46 files · +1905 −792Browse files

Unified · Split

46 files
  1. apps/web/components.json +21 −0
  2. apps/web/package.json +4 −1
  3. apps/web/src/components/code-block.tsx +6 −3
  4. apps/web/src/components/local-mcp-install-card.tsx +6 −8
  5. apps/web/src/components/shell.tsx +15 −10
  6. apps/web/src/components/source-plugins-reset-state.tsx +1 −1
  7. apps/web/src/components/source-recovery-state.tsx +1 −2
  8. apps/web/src/components/ui/badge.tsx +0 −43
  9. apps/web/src/components/ui/button.tsx +0 −34
  10. apps/web/src/globals.css +49 −2
  11. apps/web/src/lib/utils.ts +4 −4
  12. apps/web/src/plugins/pages.tsx +12 −11
  13. apps/web/src/views/home.tsx +5 −6
  14. apps/web/src/views/secrets.tsx +99 −106
  15. apps/web/tsconfig.json +5 −1
  16. apps/web/vite.config.ts +6 −0
  17. bun.lock +355 −4
  18. packages/clients/react/components.json +21 −0
  19. packages/clients/react/package.json +8 −3
  20. packages/clients/react/src/components/secret-reference-field.tsx +35 −44
  21. packages/clients/react/src/plugins/components/badge.tsx +0 −44
  22. packages/clients/react/src/plugins/components/code-block.tsx +6 −3
  23. packages/clients/react/src/plugins/components/source-tool-explorer.tsx +1 −1
  24. packages/clients/react/src/plugins/components/source-tool-workbench.tsx +37 −29
  25. packages/clients/react/src/plugins/components/ui/alert.tsx +80 −0
  26. packages/clients/react/src/plugins/components/ui/badge.tsx +57 −0
  27. packages/clients/react/src/plugins/components/ui/button.tsx +63 −0
  28. packages/clients/react/src/plugins/components/ui/card.tsx +103 −0
  29. packages/clients/react/src/plugins/components/ui/command.tsx +144 −0
  30. packages/clients/react/src/plugins/components/ui/dialog.tsx +159 −0
  31. packages/clients/react/src/plugins/components/ui/input.tsx +26 −0
  32. packages/clients/react/src/plugins/components/ui/label.tsx +18 −0
  33. packages/clients/react/src/plugins/components/ui/popover.tsx +48 −0
  34. packages/clients/react/src/plugins/components/ui/select.tsx +24 −0
  35. packages/clients/react/src/plugins/components/ui/separator.tsx +23 −0
  36. packages/clients/react/src/plugins/components/ui/textarea.tsx +18 −0
  37. packages/clients/react/src/plugins/index.ts +13 −4
  38. packages/clients/react/src/plugins/lib/utils.ts +6 −0
  39. packages/clients/react/tsconfig.json +5 −1
  40. plugins/execution-history/react/components.tsx +15 −10
  41. plugins/google-discovery/react/components.tsx +92 −91
  42. plugins/graphql/react/components.tsx +60 −57
  43. plugins/local-tools/react/components.tsx +12 −9
  44. plugins/mcp/react/components.tsx +127 −140
  45. plugins/onepassword/react/components.tsx +46 −59
  46. plugins/openapi/react/components.tsx +69 −61
apps/web/components.json+21−0
@@ -0,0 +1,21 @@
1+{
2+ "$schema": "https://ui.shadcn.com/schema.json",
3+ "style": "base-nova",
4+ "rsc": false,
5+ "tsx": true,
6+ "tailwind": {
7+ "config": "",
8+ "css": "src/globals.css",
9+ "baseColor": "neutral",
10+ "cssVariables": true,
11+ "prefix": ""
12+ },
13+ "iconLibrary": "lucide",
14+ "aliases": {
15+ "components": "@/components",
16+ "hooks": "@/hooks",
17+ "lib": "@/lib",
18+ "utils": "@/lib/utils",
19+ "ui": "@/components/ui"
20+ }
21+}
apps/web/package.json+4−1
@@ -9,13 +9,14 @@ · 8 unmodified lines
99 "start": "NODE_ENV=production bun src/server.ts"
1010 },
1111 "dependencies": {
12+ "@base-ui/react": "^1.3.0",
1213 "@executor/plugin-execution-history-react": "workspace:*",
1314 "@executor/plugin-google-discovery-react": "workspace:*",
1415 "@executor/plugin-graphql-react": "workspace:*",
1516 "@executor/plugin-local-tools-react": "workspace:*",
1617 "@executor/plugin-mcp-react": "workspace:*",
17− "@executor/plugin-openapi-react": "workspace:*",
1818 "@executor/plugin-onepassword-react": "workspace:*",
19+ "@executor/plugin-openapi-react": "workspace:*",
1920 "@executor/react": "workspace:*",
2021 "@executor/server": "workspace:*",
2122 "@shikijs/langs": "^4.0.1",
@@ -24,9 +25,11 @@ · 2 unmodified lines
2425 "class-variance-authority": "^0.7.1",
2526 "clsx": "^2.1.1",
2627 "effect": "catalog:",
28+ "lucide-react": "^1.7.0",
2729 "react": "^19.2.0",
2830 "react-dom": "^19.2.0",
2931 "react-grab": "^0.1.26",
32+ "shadcn": "^4.1.1",
3033 "shiki": "^4.0.1",
3134 "streamdown": "^2.3.0",
3235 "tailwind-merge": "^3.5.0",
apps/web/src/components/code-block.tsx+6−3
@@ -1,4 +1,5 @@
11 import { useEffect, useState, useRef, useCallback } from "react";
2+import { Button } from "@executor/react/plugins";
23 import { codeToHtml, resolveLang } from "../lib/shiki";
34 import { cn } from "../lib/utils";
45 import { IconCopy, IconCheck } from "./icons";
@@ -68,14 +69,16 @@ export function CodeBlock(props: { · 63 unmodified lines
6869 return (
6970 <div className={cn("group relative overflow-auto", className)}>
7071 {/* Copy button */}
71− <button
72+ <Button
7273 type="button"
74+ variant="ghost"
75+ size="icon"
7376 onClick={handleCopy}
74− className="absolute right-2 top-2 z-10 rounded-md border border-border bg-card/90 p-1.5 text-muted-foreground/40 opacity-0 backdrop-blur-sm transition-all hover:text-foreground group-hover:opacity-100"
77+ className="absolute right-2 top-2 z-10 size-7 rounded-md border border-border bg-card/90 text-muted-foreground/40 opacity-0 backdrop-blur-sm transition-all hover:text-foreground group-hover:opacity-100"
7578 title="Copy to clipboard"
7679 >
7780 {copied ? <IconCheck className="size-3" /> : <IconCopy className="size-3" />}
78− </button>
81+ </Button>
7982
8083 {html ? (
8184 <div
apps/web/src/components/local-mcp-install-card.tsx+6−8
@@ -1,4 +1,5 @@
11 import { useEffect, useState } from "react";
2+import { Button } from "@executor/react/plugins";
23 import { CodeBlock } from "./code-block";
34 import { cn } from "../lib/utils";
45
@@ -44,19 +45,16 @@ export function LocalMcpInstallCard(props: { · 39 unmodified lines
4445 { key: "stdio" as const, label: "Standard I/O" },
4546 { key: "http" as const, label: "Remote HTTP" },
4647 ].map((option) => (
47− <button
48+ <Button
4849 key={option.key}
4950 type="button"
51+ variant={mode === option.key ? "default" : "ghost"}
52+ size="sm"
5053 onClick={() => setMode(option.key)}
51− className={cn(
52− "rounded-md px-3 py-1.5 text-xs font-medium transition-colors",
53− mode === option.key
54− ? "bg-primary text-primary-foreground"
55− : "text-muted-foreground hover:bg-accent hover:text-accent-foreground",
56− )}
54+ className="rounded-md px-3 py-1.5"
5755 >
5856 {option.label}
59− </button>
57+ </Button>
6058 ))}
6159 </div>
6260 <CodeBlock code={command} lang="bash" className="rounded-xl border border-border bg-background/70" />
apps/web/src/components/shell.tsx+15−10
@@ -1,7 +1,7 @@
11 import { Link, Outlet, useLocation, useMatchRoute } from "@tanstack/react-router";
22 import { useCallback, useEffect, useState } from "react";
33 import { useSources, type Source } from "@executor/react";
4−import { sourcePluginsIndexPath } from "@executor/react/plugins";
4+import { Button, sourcePluginsIndexPath } from "@executor/react/plugins";
55 import { cn } from "../lib/utils";
66 import { IconPlus, IconCopy, IconCheck, IconClose, IconMenu } from "./icons";
77 import { LoadableBlock } from "./loadable";
@@ -199,10 +199,11 @@ function UpdateCard(props: { latestVersion: string; channel: UpdateChannel }) { · 191 unmodified lines
199199 </p>
200200 </div>
201201 </div>
202− <button
202+ <Button
203203 type="button"
204+ variant="outline"
204205 onClick={handleCopy}
205− className="mt-2.5 flex w-full items-center justify-between gap-2 rounded-lg border border-border/60 bg-background/50 px-2.5 py-1.5 text-left transition-colors hover:bg-background/80"
206+ className="mt-2.5 flex w-full items-center justify-between gap-2 rounded-lg border-border/60 bg-background/50 px-2.5 py-1.5 text-left hover:bg-background/80"
206207 >
207208 <code className="truncate font-mono text-[10px] text-sidebar-foreground">
208209 {command}
@@ -214,7 +215,7 @@ function UpdateCard(props: { latestVersion: string; channel: UpdateChannel }) { · 5 unmodified lines
214215 <IconCopy className="size-3" />
215216 )}
216217 </span>
217− </button>
218+ </Button>
218219 </div>
219220 );
220221 }
@@ -285,14 +286,16 @@ export function AppShell() { · 64 unmodified lines
285286 v3
286287 </span>
287288 </Link>
288− <button
289+ <Button
289290 type="button"
291+ variant="ghost"
292+ size="icon"
290293 aria-label="Close navigation"
291294 onClick={() => setMobileSidebarOpen(false)}
292− className="inline-flex size-8 items-center justify-center rounded-md text-sidebar-foreground transition-colors hover:bg-sidebar-active hover:text-foreground"
295+ className="size-8 text-sidebar-foreground hover:bg-sidebar-active hover:text-foreground"
293296 >
294297 <IconClose className="size-3.5" />
295− </button>
298+ </Button>
296299 </div>
297300 <SidebarContent
298301 isHome={!!isHome}
@@ -314,14 +317,16 @@ export function AppShell() { · 15 unmodified lines
314317 {/* Main content */}
315318 <main className="flex min-h-0 flex-1 flex-col min-w-0 overflow-hidden">
316319 <div className="flex h-12 shrink-0 items-center justify-between border-b border-border bg-background px-4 md:hidden">
317− <button
320+ <Button
318321 type="button"
322+ variant="outline"
323+ size="icon"
319324 aria-label="Open navigation"
320325 onClick={() => setMobileSidebarOpen(true)}
321− className="inline-flex size-8 items-center justify-center rounded-md border border-border bg-card text-foreground transition-colors hover:bg-accent/50"
326+ className="size-8 bg-card hover:bg-accent/50"
322327 >
323328 <IconMenu className="size-4" />
324− </button>
329+ </Button>
325330 <Link to="/" className="flex items-center gap-1.5">
326331 <span className="font-display text-base tracking-tight text-foreground">
327332 executor
apps/web/src/components/source-plugins-reset-state.tsx+1−1
@@ -10,7 +10,7 @@ export function SourcePluginsResetState( · 9 unmodified lines
1010 input: SourcePluginsResetStateProps,
1111 ) {
1212 return (
13− <div className="min-h-0 flex-1 overflow-y-auto max-w-[300px]">
13+ <div className="min-h-0 flex-1 overflow-y-auto">
1414 <div className="mx-auto max-w-3xl px-6 py-10 lg:px-10 lg:py-14">
1515 <div className="rounded-2xl border border-border bg-card p-8">
1616 <h2 className="font-display text-xl tracking-tight text-foreground">
apps/web/src/components/source-recovery-state.tsx+1−2
@@ -1,8 +1,7 @@
11 import type { Source } from "@executor/react";
22
3+import { Badge, Button } from "@executor/react/plugins";
34 import { cn } from "../lib/utils";
4−import { Button } from "./ui/button";
5−import { Badge } from "./ui/badge";
65 import { IconSpinner, IconTool } from "./icons";
76
87 export function SourceRecoveryState(props: {
apps/web/src/components/ui/badge.tsx+0−43
@@ -1,43 +0,0 @@
1−import type { HTMLAttributes } from "react";
2−import { cva, type VariantProps } from "class-variance-authority";
3−import { cn } from "../../lib/utils";
4−
5−const badgeVariants = cva(
6− "inline-flex items-center rounded-full border px-2 py-0.5 text-[10px] font-medium tracking-wide uppercase",
7− {
8− variants: {
9− variant: {
10− default: "border-transparent bg-primary/15 text-primary",
11− secondary: "border-transparent bg-secondary text-secondary-foreground",
12− outline: "border-border text-muted-foreground",
13− muted: "border-transparent bg-muted text-muted-foreground",
14− get: "border-[var(--method-get)]/20 bg-[var(--method-get)]/10 text-[var(--method-get)]",
15− post: "border-[var(--method-post)]/20 bg-[var(--method-post)]/10 text-[var(--method-post)]",
16− put: "border-[var(--method-put)]/20 bg-[var(--method-put)]/10 text-[var(--method-put)]",
17− delete: "border-[var(--method-delete)]/20 bg-[var(--method-delete)]/10 text-[var(--method-delete)]",
18− destructive: "border-destructive/20 bg-destructive/10 text-destructive",
19− },
20− },
21− defaultVariants: {
22− variant: "default",
23− },
24− },
25−);
26−
27−export type BadgeProps = HTMLAttributes<HTMLSpanElement> & VariantProps<typeof badgeVariants>;
28−
29−export function Badge({ className, variant, ...props }: BadgeProps) {
30− return <span className={cn(badgeVariants({ variant }), className)} {...props} />;
31−}
32−
33−export function MethodBadge({ method }: { method: string }) {
34− const variant = ({
35− GET: "get",
36− POST: "post",
37− PUT: "put",
38− PATCH: "put",
39− DELETE: "delete",
40− } as const)[method.toUpperCase()] ?? "outline";
41−
42− return <Badge variant={variant}>{method}</Badge>;
43−}
apps/web/src/components/ui/button.tsx+0−34
@@ -1,34 +0,0 @@
1−import type { ButtonHTMLAttributes } from "react";
2−import { cva, type VariantProps } from "class-variance-authority";
3−import { cn } from "../../lib/utils";
4−
5−const buttonVariants = cva(
6− "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 outline-none focus-visible:ring-2 focus-visible:ring-ring/50 focus-visible:ring-offset-1 focus-visible:ring-offset-background cursor-pointer",
7− {
8− variants: {
9− variant: {
10− default: "bg-primary text-primary-foreground hover:bg-primary/90",
11− secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
12− outline: "border border-input bg-transparent hover:bg-accent hover:text-accent-foreground",
13− ghost: "hover:bg-accent hover:text-accent-foreground",
14− destructive: "bg-destructive text-white hover:bg-destructive/90",
15− },
16− size: {
17− default: "h-9 px-4 py-2",
18− sm: "h-7 rounded-md px-2.5 text-xs",
19− lg: "h-10 rounded-md px-6",
20− icon: "h-8 w-8",
21− },
22− },
23− defaultVariants: {
24− variant: "default",
25− size: "default",
26− },
27− },
28−);
29−
30−type ButtonProps = ButtonHTMLAttributes<HTMLButtonElement> & VariantProps<typeof buttonVariants>;
31−
32−export function Button({ className, variant, size, ...props }: ButtonProps) {
33− return <button className={cn(buttonVariants({ variant, size }), className)} {...props} />;
34−}
apps/web/src/globals.css+49−2
@@ -1,7 +1,10 @@
11 @import "tailwindcss";
22 @import "tw-animate-css";
3+@import "shadcn/tailwind.css";
34
4−@source "../../node_modules/streamdown/dist/*.js";
5+@source "../../../packages/clients/react/src/**/*.{ts,tsx}";
6+@source "../../../plugins/*/react/**/*.{ts,tsx}";
7+@source "../node_modules/streamdown/dist/*.js";
58
69 @custom-variant dark (&:is(.dark *));
710
@@ -9,6 +12,7 @@ · 1 unmodified line
912 --font-sans: "DM Sans", ui-sans-serif, system-ui, sans-serif;
1013 --font-mono: "JetBrains Mono", "IBM Plex Mono", ui-monospace, monospace;
1114 --font-display: "Instrument Serif", Georgia, serif;
15+ --font-heading: var(--font-sans);
1216
1317 --color-background: var(--background);
1418 --color-foreground: var(--foreground);
@@ -33,6 +37,25 @@ · 18 unmodified lines
3337 --color-sidebar-foreground: var(--sidebar-foreground);
3438 --color-sidebar-border: var(--sidebar-border);
3539 --color-sidebar-active: var(--sidebar-active);
40+ --color-sidebar-ring: var(--sidebar-ring);
41+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
42+ --color-sidebar-accent: var(--sidebar-accent);
43+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
44+ --color-sidebar-primary: var(--sidebar-primary);
45+
46+ --color-chart-5: var(--chart-5);
47+ --color-chart-4: var(--chart-4);
48+ --color-chart-3: var(--chart-3);
49+ --color-chart-2: var(--chart-2);
50+ --color-chart-1: var(--chart-1);
51+
52+ --radius-sm: calc(var(--radius) * 0.6);
53+ --radius-md: calc(var(--radius) * 0.8);
54+ --radius-lg: var(--radius);
55+ --radius-xl: calc(var(--radius) * 1.4);
56+ --radius-2xl: calc(var(--radius) * 1.8);
57+ --radius-3xl: calc(var(--radius) * 2.2);
58+ --radius-4xl: calc(var(--radius) * 2.6);
3659 }
3760
3861 /*
@@ -44,6 +67,8 @@ · 5 unmodified lines
4467 /* ——— Light theme (default) ——— */
4568 :root {
4669 color-scheme: light dark;
70+ --radius: 0.625rem;
71+
4772 --background: oklch(0.985 0.002 260);
4873 --foreground: oklch(0.145 0.005 260);
4974 --card: oklch(0.99 0.001 260);
@@ -67,6 +92,17 @@ · 17 unmodified lines
6792 --sidebar-foreground: oklch(0.32 0.008 260);
6893 --sidebar-border: oklch(0.90 0.005 260);
6994 --sidebar-active: oklch(0.935 0.006 260);
95+ --sidebar-primary: oklch(0.55 0.17 175);
96+ --sidebar-primary-foreground: oklch(0.98 0.005 175);
97+ --sidebar-accent: oklch(0.94 0.006 260);
98+ --sidebar-accent-foreground: oklch(0.145 0.005 260);
99+ --sidebar-ring: oklch(0.55 0.17 175);
100+
101+ --chart-1: oklch(0.55 0.17 175);
102+ --chart-2: oklch(0.52 0.16 230);
103+ --chart-3: oklch(0.58 0.16 85);
104+ --chart-4: oklch(0.55 0.22 25);
105+ --chart-5: oklch(0.50 0.01 250);
70106
71107 /* Method colors */
72108 --method-get: oklch(0.55 0.18 155);
@@ -104,6 +140,17 @@ · 31 unmodified lines
104140 --sidebar-foreground: oklch(0.72 0.008 250);
105141 --sidebar-border: oklch(0.20 0.006 260);
106142 --sidebar-active: oklch(0.18 0.008 260);
143+ --sidebar-primary: oklch(0.72 0.15 175);
144+ --sidebar-primary-foreground: oklch(0.12 0.01 175);
145+ --sidebar-accent: oklch(0.195 0.008 260);
146+ --sidebar-accent-foreground: oklch(0.90 0.008 250);
147+ --sidebar-ring: oklch(0.72 0.15 175);
148+
149+ --chart-1: oklch(0.72 0.15 175);
150+ --chart-2: oklch(0.72 0.14 230);
151+ --chart-3: oklch(0.78 0.14 85);
152+ --chart-4: oklch(0.70 0.18 25);
153+ --chart-5: oklch(0.56 0.01 250);
107154
108155 /* Method colors */
109156 --method-get: oklch(0.75 0.16 155);
@@ -118,7 +165,7 @@ · 8 unmodified lines
118165
119166 @layer base {
120167 * {
121− @apply border-border;
168+ @apply border-border outline-ring/50;
122169 }
123170
124171 html,
apps/web/src/lib/utils.ts+4−4
@@ -1,6 +1,6 @@
1−import { clsx, type ClassValue } from "clsx";
2−import { twMerge } from "tailwind-merge";
1+import { clsx, type ClassValue } from "clsx"
2+import { twMerge } from "tailwind-merge"
33
4−export function cn(...inputs: ReadonlyArray<ClassValue>): string {
5− return twMerge(clsx(inputs));
4+export function cn(...inputs: ClassValue[]) {
5+ return twMerge(clsx(inputs))
66 }
apps/web/src/plugins/pages.tsx+12−11
@@ -1,6 +1,10 @@
11 import { useState, type FormEvent } from "react";
22 import { Link, useNavigate } from "@tanstack/react-router";
33 import {
4+ Alert,
5+ Button,
6+ Card,
7+ Input,
48 ExecutorPluginRouteProvider,
59 createSourcePluginPaths,
610 type ExecutorPluginNavigation,
@@ -61,7 +65,7 @@ const SourceQuickEntry = () => { · 54 unmodified lines
6165 };
6266
6367 return (
64− <div className="rounded-2xl border border-border bg-card p-6">
68+ <Card className="rounded-2xl">
6569 <h2 className="font-display text-lg font-semibold tracking-tight text-foreground">
6670 Quick add
6771 </h2>
@@ -71,27 +75,24 @@ const SourceQuickEntry = () => { · 3 unmodified lines
7175
7276 <form onSubmit={handleSubmit} className="mt-4">
7377 <div className="flex flex-col gap-3 sm:flex-row">
74− <input
78+ <Input
7579 value={value}
7680 onChange={(event) => setValue(event.target.value)}
7781 placeholder="https://api.github.com/graphql or npx -y chrome-devtools-mcp@latest"
78− className="h-10 flex-1 rounded-lg border border-input bg-background px-3.5 text-sm text-foreground outline-none transition-colors placeholder:text-muted-foreground/45 focus:border-ring focus:ring-1 focus:ring-ring/25"
82+ className="h-10 flex-1 px-3.5 text-sm"
7983 />
80− <button
81− type="submit"
82− className="inline-flex h-10 items-center justify-center rounded-lg bg-primary px-4 text-sm font-medium text-primary-foreground transition-opacity hover:opacity-90"
83− >
84+ <Button type="submit" className="h-10">
8485 Add source
85− </button>
86+ </Button>
8687 </div>
8788
8889 {error && (
89− <div className="mt-3 rounded-lg border border-destructive/30 bg-destructive/8 px-4 py-2.5 text-sm text-destructive">
90+ <Alert variant="destructive" className="mt-3">
9091 {error}
91− </div>
92+ </Alert>
9293 )}
9394 </form>
94− </div>
95+ </Card>
9596 );
9697 };
9798
apps/web/src/views/home.tsx+5−6
@@ -4,8 +4,7 @@ import { sourcePluginsIndexPath } from "@executor/react/plugins"; · 3 unmodified lines
44 import { LoadableBlock } from "../components/loadable";
55 import { LocalMcpInstallCard } from "../components/local-mcp-install-card";
66 import { SourceFavicon } from "../components/source-favicon";
7−import { Badge } from "../components/ui/badge";
8−import { Button } from "../components/ui/button";
7+import { Alert, Badge, Button, Card } from "@executor/react/plugins";
98 import { IconSources, IconPlus } from "../components/icons";
109 import {
1110 getSourceFrontendPaths,
@@ -48,9 +47,9 @@ export function HomePage() { · 36 unmodified lines
4847 <LoadableBlock loadable={sources} loading="Loading sources...">
4948 {(items) =>
5049 !Array.isArray(items) ? (
51− <div className="rounded-xl border border-destructive/20 bg-destructive/5 px-5 py-4 text-sm text-destructive">
50+ <Alert variant="destructive" className="px-5 py-4">
5251 Sources returned an unexpected payload.
53− </div>
52+ </Alert>
5453 ) : items.length === 0 ? (
5554 <div className="flex flex-col items-center justify-center rounded-2xl border border-dashed border-border py-20">
5655 <div className="flex size-12 items-center justify-center rounded-2xl bg-muted text-muted-foreground mb-4">
@@ -74,7 +73,7 @@ export function HomePage() { · 17 unmodified lines
7473 {items.map((source) => {
7574 const paths = getSourceFrontendPaths(source.kind);
7675 const card = (
77− <div className="flex h-full flex-col rounded-2xl border border-border bg-card px-5 py-4 transition-colors hover:border-primary/25 hover:bg-card/90">
76+ <Card className="flex h-full flex-col rounded-2xl px-5 py-4 transition-colors hover:border-primary/25 hover:bg-card/90">
7877 <div className="flex items-start gap-3">
7978 <div className="flex size-9 shrink-0 items-center justify-center rounded-lg bg-muted text-muted-foreground">
8079 <SourceFavicon source={source} className="size-4" />
@@ -93,7 +92,7 @@ export function HomePage() { · 12 unmodified lines
9392 </div>
9493 </div>
9594 </div>
96− </div>
95+ </Card>
9796 );
9897
9998 if (!paths) {
apps/web/src/views/secrets.tsx+99−106
@@ -19,8 +19,15 @@ import { · 18 unmodified lines
1919 } from "@executor/react";
2020
2121 import { LoadableBlock } from "../components/loadable";
22−import { Badge } from "../components/ui/badge";
23−import { Button } from "../components/ui/button";
22+import { Badge } from "@executor/react/plugins";
23+import {
24+ Alert,
25+ Button,
26+ Card,
27+ Input,
28+ Label,
29+ Select,
30+} from "@executor/react/plugins";
2431 import {
2532 IconPencil,
2633 IconPlus,
@@ -194,7 +201,7 @@ export function SecretsPage() { · 167 unmodified lines
194201 }}
195202 />
196203 ) : (
197− <div className="overflow-hidden rounded-xl border border-border bg-card/80">
204+ <Card className="overflow-hidden p-0">
198205 {items.map((secret, index) => (
199206 <div
200207 key={secret.id}
@@ -212,7 +219,7 @@ export function SecretsPage() { · 11 unmodified lines
212219 />
213220 </div>
214221 ))}
215− </div>
222+ </Card>
216223 )
217224 }
218225 </LoadableBlock>
@@ -283,29 +290,29 @@ function CreateSecretStoreForm(props: { · 64 unmodified lines
283290 ) : (
284291 <>
285292 <div className="grid gap-4 sm:grid-cols-2">
286− <FieldLabel label="Store type">
287− <select
293+ <div className="grid gap-2">
294+ <Label>Store type</Label>
295+ <Select
288296 value={kind}
289297 onChange={(event) => setKind(event.target.value)}
290− className="h-9 w-full rounded-lg border border-input bg-background px-3 text-[13px] text-foreground outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
291298 >
292299 {props.pluginOptions.map((plugin) => (
293300 <option key={plugin.kind} value={plugin.kind}>
294301 {plugin.displayName}
295302 </option>
296303 ))}
297− </select>
298− </FieldLabel>
304+ </Select>
305+ </div>
299306 {!StoreCreateForm && (
300− <FieldLabel label="Name">
301− <input
307+ <div className="grid gap-2">
308+ <Label>Name</Label>
309+ <Input
302310 value={name}
303311 onChange={(event) => setName(event.target.value)}
304312 placeholder="Secret store"
305− className="h-9 w-full rounded-lg border border-input bg-background px-3 text-[13px] text-foreground outline-none transition-colors placeholder:text-muted-foreground/35 focus:border-ring focus:ring-1 focus:ring-ring/25"
306313 autoFocus
307314 />
308− </FieldLabel>
315+ </div>
309316 )}
310317 </div>
311318
@@ -582,50 +589,51 @@ function CreateSecretForm(props: { · 270 unmodified lines
582589 >
583590 {error && <ErrorBanner>{error}</ErrorBanner>}
584591 <div className="grid gap-4 sm:grid-cols-2">
585− <FieldLabel label="Store">
586− <select
592+ <div className="grid gap-2">
593+ <Label>Store</Label>
594+ <Select
587595 value={storeId}
588596 onChange={(event) => setStoreId(event.target.value)}
589− className="h-9 w-full rounded-lg border border-input bg-background px-3 text-[13px] text-foreground outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
590597 >
591598 {props.storeOptions.map((store) => (
592599 <option key={store.id} value={store.id}>
593600 {store.name}
594601 </option>
595602 ))}
596− </select>
597− </FieldLabel>
603+ </Select>
604+ </div>
598605 {canImportSecrets && canCreateSecrets && (
599− <FieldLabel label="Mode">
600− <select
606+ <div className="grid gap-2">
607+ <Label>Mode</Label>
608+ <Select
601609 value={mode}
602610 onChange={(event) => setMode(event.target.value as "create" | "import")}
603− className="h-9 w-full rounded-lg border border-input bg-background px-3 text-[13px] text-foreground outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
604611 >
605612 <option value="import">Import from store</option>
606613 <option value="create">Create new secret</option>
607− </select>
608− </FieldLabel>
614+ </Select>
615+ </div>
609616 )}
610− <FieldLabel label="Name">
611− <input
617+ <div className="grid gap-2">
618+ <Label>Name</Label>
619+ <Input
612620 value={name}
613621 onChange={(event) => setName(event.target.value)}
614622 placeholder={mode === "import" ? "Optional override name" : "GitHub PAT"}
615− className="h-9 w-full rounded-lg border border-input bg-background px-3 text-[13px] text-foreground outline-none transition-colors placeholder:text-muted-foreground/35 focus:border-ring focus:ring-1 focus:ring-ring/25"
616623 autoFocus
617624 />
618− </FieldLabel>
625+ </div>
619626 {mode === "create" && (
620− <FieldLabel label="Value">
621− <input
627+ <div className="grid gap-2">
628+ <Label>Value</Label>
629+ <Input
622630 type="password"
623631 value={value}
624632 onChange={(event) => setValue(event.target.value)}
625633 placeholder="ghp_..."
626− className="h-9 w-full rounded-lg border border-input bg-background px-3 font-mono text-[12px] text-foreground outline-none transition-colors placeholder:text-muted-foreground/35 focus:border-ring focus:ring-1 focus:ring-ring/25"
634+ className="font-mono text-[12px]"
627635 />
628− </FieldLabel>
636+ </div>
629637 )}
630638 </div>
631639 {mode === "import" && canImportSecrets && (
@@ -644,11 +652,11 @@ function CreateSecretForm(props: { · 12 unmodified lines
644652 Back
645653 </Button>
646654 )}
647− <input
655+ <Input
648656 value={browserQuery}
649657 onChange={(event) => setBrowserQuery(event.target.value)}
650658 placeholder="Search this store"
651− className="h-9 min-w-0 flex-1 rounded-lg border border-input bg-background px-3 text-[13px] text-foreground outline-none transition-colors placeholder:text-muted-foreground/35 focus:border-ring focus:ring-1 focus:ring-ring/25"
659+ className="min-w-0 flex-1"
652660 />
653661 </div>
654662 {browserStack.length > 0 && (
@@ -673,12 +681,12 @@ function CreateSecretForm(props: { · 18 unmodified lines
673681 </div>
674682 ) : (
675683 browserEntries.map((entry, index) => (
676− <button
684+ <Button
677685 key={entry.key}
678− type="button"
686+ variant="ghost"
679687 onClick={() => handleBrowserEntryClick(entry)}
680688 className={cn(
681− "flex w-full items-center justify-between gap-3 px-4 py-3 text-left transition-colors hover:bg-accent/50",
689+ "flex h-auto w-full items-center justify-between gap-3 rounded-none px-4 py-3 text-left",
682690 index > 0 && "border-t border-border",
683691 selectedImportKey === entry.key && "bg-accent/60",
684692 )}
@@ -696,7 +704,7 @@ function CreateSecretForm(props: { · 11 unmodified lines
696704 <Badge variant="outline">
697705 {entry.kind === "group" ? "Open" : "Secret"}
698706 </Badge>
699− </button>
707+ </Button>
700708 ))
701709 )}
702710 </div>
@@ -742,7 +750,7 @@ function SecretStoreCard(props: { · 39 unmodified lines
742750 };
743751
744752 return (
745− <div className="rounded-xl border border-border bg-card/80 p-4">
753+ <Card className="p-4">
746754 <div className="flex items-start justify-between gap-3">
747755 <div className="min-w-0">
748756 <div className="flex flex-wrap items-center gap-2">
@@ -764,40 +772,41 @@ function SecretStoreCard(props: { · 15 unmodified lines
764772 {props.canManage ? (
765773 confirmDelete ? (
766774 <div className="flex items-center gap-1">
767− <button
768− type="button"
775+ <Button
776+ variant="ghost"
777+ size="sm"
769778 onClick={() => setConfirmDelete(false)}
770779 disabled={isDeleting}
771− className="rounded-md px-2 py-1 text-[11px] font-medium text-muted-foreground transition-colors hover:bg-accent/50 hover:text-foreground disabled:opacity-50"
772780 >
773781 Cancel
774− </button>
775− <button
776− type="button"
782+ </Button>
783+ <Button
784+ variant="destructive-outline"
785+ size="sm"
777786 onClick={() => {
778787 void handleDelete();
779788 }}
780789 disabled={isDeleting}
781− className="inline-flex items-center gap-1 rounded-md px-2 py-1 text-[11px] font-medium text-destructive transition-colors hover:bg-destructive/8 disabled:opacity-50"
782790 >
783791 {isDeleting
784792 ? <IconSpinner className="size-3" />
785793 : <IconTrash className="size-3" />}
786794 Delete
787− </button>
795+ </Button>
788796 </div>
789797 ) : (
790− <button
791− type="button"
798+ <Button
799+ variant="ghost"
800+ size="sm"
792801 onClick={() => setConfirmDelete(true)}
793802 disabled={isDeleting}
794− className="inline-flex items-center gap-1 rounded-md px-2 py-1 text-[11px] font-medium text-muted-foreground transition-colors hover:bg-destructive/8 hover:text-destructive disabled:opacity-50"
803+ className="text-muted-foreground hover:bg-destructive/8 hover:text-destructive"
795804 >
796805 {isDeleting
797806 ? <IconSpinner className="size-3" />
798807 : <IconTrash className="size-3" />}
799808 Remove
800− </button>
809+ </Button>
801810 )
802811 ) : (
803812 <span className="text-[10px] font-medium uppercase tracking-[0.12em] text-muted-foreground/45">
@@ -805,7 +814,7 @@ function SecretStoreCard(props: { · 1 unmodified line
805814 </span>
806815 )}
807816 </div>
808− </div>
817+ </Card>
809818 );
810819 }
811820
@@ -868,11 +877,11 @@ function SecretRow(props: { · 56 unmodified lines
868877 )}
869878 </div>
870879 <div className="flex shrink-0 items-center gap-1.5">
871− <button
872− type="button"
880+ <Button
881+ variant="ghost"
882+ size="sm"
873883 onClick={props.onEdit}
874884 className={cn(
875− "inline-flex items-center gap-1 rounded-md px-2 py-1.5 text-[11px] font-medium transition-colors",
876885 props.isEditing
877886 ? "bg-primary/10 text-primary"
878887 : "text-muted-foreground hover:bg-accent/50 hover:text-foreground",
@@ -880,43 +889,44 @@ function SecretRow(props: { · 1 unmodified line
880889 >
881890 <IconPencil className="size-3" />
882891 Edit
883− </button>
892+ </Button>
884893 {confirmDelete ? (
885894 <>
886− <button
887− type="button"
895+ <Button
896+ variant="ghost"
897+ size="sm"
888898 onClick={() => setConfirmDelete(false)}
889899 disabled={isDeleting}
890− className="rounded-md px-2 py-1.5 text-[11px] font-medium text-muted-foreground transition-colors hover:bg-accent/50 hover:text-foreground disabled:opacity-50"
891900 >
892901 Cancel
893− </button>
894− <button
895− type="button"
902+ </Button>
903+ <Button
904+ variant="destructive-outline"
905+ size="sm"
896906 onClick={() => {
897907 void handleDelete();
898908 }}
899909 disabled={isDeleting}
900− className="inline-flex items-center gap-1 rounded-md px-2 py-1.5 text-[11px] font-medium text-destructive transition-colors hover:bg-destructive/8 disabled:opacity-50"
901910 >
902911 {isDeleting
903912 ? <IconSpinner className="size-3" />
904913 : <IconTrash className="size-3" />}
905914 Delete
906− </button>
915+ </Button>
907916 </>
908917 ) : (
909− <button
910− type="button"
918+ <Button
919+ variant="ghost"
920+ size="sm"
911921 onClick={() => setConfirmDelete(true)}
912922 disabled={isDeleting}
913− className="inline-flex items-center gap-1 rounded-md px-2 py-1.5 text-[11px] font-medium text-muted-foreground transition-colors hover:bg-destructive/8 hover:text-destructive disabled:opacity-50"
923+ className="text-muted-foreground hover:bg-destructive/8 hover:text-destructive"
914924 >
915925 {isDeleting
916926 ? <IconSpinner className="size-3" />
917927 : <IconTrash className="size-3" />}
918928 Delete
919− </button>
929+ </Button>
920930 )}
921931 </div>
922932 </div>
@@ -968,33 +978,35 @@ function EditSecretForm(props: { · 45 unmodified lines
968978 <div className="mt-3 border-t border-border/50 pt-3">
969979 {error && <ErrorBanner className="mb-3">{error}</ErrorBanner>}
970980 <div className="grid gap-3 sm:grid-cols-2">
971− <FieldLabel label="Name">
972− <input
981+ <div className="grid gap-2">
982+ <Label>Name</Label>
983+ <Input
973984 value={name}
974985 onChange={(event) => setName(event.target.value)}
975986 placeholder="Secret name"
976− className="h-8 w-full rounded-lg border border-input bg-background px-3 text-[12px] text-foreground outline-none transition-colors placeholder:text-muted-foreground/35 focus:border-ring focus:ring-1 focus:ring-ring/25"
987+ className="h-8 text-[12px]"
977988 autoFocus
978989 />
979− </FieldLabel>
980− <FieldLabel label="New value">
981− <input
990+ </div>
991+ <div className="grid gap-2">
992+ <Label>New value</Label>
993+ <Input
982994 type="password"
983995 value={value}
984996 onChange={(event) => setValue(event.target.value)}
985997 placeholder="Leave empty to keep existing"
986− className="h-8 w-full rounded-lg border border-input bg-background px-3 font-mono text-[11px] text-foreground outline-none transition-colors placeholder:text-muted-foreground/35 focus:border-ring focus:ring-1 focus:ring-ring/25"
998+ className="h-8 font-mono text-[11px]"
987999 />
988− </FieldLabel>
1000+ </div>
9891001 </div>
9901002 <div className="mt-3 flex items-center justify-end gap-2">
991− <button
992− type="button"
1003+ <Button
1004+ variant="ghost"
1005+ size="sm"
9931006 onClick={props.onClose}
994− className="rounded-md px-3 py-1.5 text-[12px] font-medium text-muted-foreground transition-colors hover:text-foreground"
9951007 >
9961008 Cancel
997− </button>
1009+ </Button>
9981010 <Button
9991011 size="sm"
10001012 onClick={handleSubmit}
@@ -1015,19 +1027,19 @@ function FormCard(props: { · 14 unmodified lines
10151027 children: ReactNode;
10161028 }) {
10171029 return (
1018− <div className={cn("rounded-xl border border-primary/20 bg-card/80", props.className)}>
1030+ <Card className={cn("border-primary/20 p-0", props.className)}>
10191031 <div className="flex items-center justify-between border-b border-border px-5 py-3">
10201032 <h3 className="text-sm font-semibold text-foreground">{props.title}</h3>
1021− <button
1022− type="button"
1033+ <Button
1034+ variant="ghost"
1035+ size="sm"
10231036 onClick={props.onClose}
1024− className="text-[12px] text-muted-foreground transition-colors hover:text-foreground"
10251037 >
10261038 Cancel
1027− </button>
1039+ </Button>
10281040 </div>
10291041 <div className="space-y-4 p-5">{props.children}</div>
1030− </div>
1042+ </Card>
10311043 );
10321044 }
10331045
@@ -1036,14 +1048,9 @@ function ErrorBanner(props: { · 2 unmodified lines
10361048 className?: string;
10371049 }) {
10381050 return (
1039− <div
1040− className={cn(
1041− "rounded-lg border border-destructive/30 bg-destructive/8 px-4 py-2.5 text-[13px] text-destructive",
1042− props.className,
1043− )}
1044− >
1051+ <Alert variant="destructive" className={cn("text-[13px]", props.className)}>
10451052 {props.children}
1046− </div>
1053+ </Alert>
10471054 );
10481055 }
10491056
@@ -1069,20 +1076,6 @@ function SectionEmptyState(props: { · 19 unmodified lines
10691076 );
10701077 }
10711078
1072−function FieldLabel(props: {
1073− label: string;
1074− children: ReactNode;
1075−}) {
1076− return (
1077− <label className="block space-y-1">
1078− <span className="text-[11px] font-medium text-muted-foreground">
1079− {props.label}
1080− </span>
1081− {props.children}
1082− </label>
1083− );
1084−}
1085−
10861079 const formatDate = (value: number): string =>
10871080 new Date(value).toLocaleDateString(undefined, {
10881081 month: "short",
apps/web/tsconfig.json+5−1
@@ -8,7 +8,11 @@ · 7 unmodified lines
88 "noEmit": true,
99 "lib": ["ES2022", "DOM", "DOM.Iterable"],
1010 "jsx": "react-jsx",
11− "types": ["bun-types"]
11+ "types": ["bun-types"],
12+ "baseUrl": ".",
13+ "paths": {
14+ "@/*": ["./src/*"]
15+ }
1216 },
1317 "include": [
1418 "src/**/*.ts",
apps/web/vite.config.ts+6−0
@@ -1,4 +1,5 @@
11 import { readFileSync } from "node:fs";
2+import path from "node:path";
23 import { defineConfig } from "vite";
34 import react from "@vitejs/plugin-react";
45 import tailwindcss from "@tailwindcss/vite";
@@ -35,6 +36,11 @@ const workspaceExecutorPackages = Object.keys(webPackage.dependencies ?? {}).fil · 30 unmodified lines
3536
3637 export default defineConfig({
3738 root: "src",
39+ resolve: {
40+ alias: {
41+ "@": path.resolve(import.meta.dirname, "./src"),
42+ },
43+ },
3844 plugins: [
3945 tailwindcss(),
4046 react(),
bun.lock+355−4
@@ -57,6 +57,7 @@ · 56 unmodified lines
5757 "name": "@executor/web",
5858 "version": "0.0.0",
5959 "dependencies": {
60+ "@base-ui/react": "^1.3.0",
6061 "@executor/plugin-execution-history-react": "workspace:*",
6162 "@executor/plugin-google-discovery-react": "workspace:*",
6263 "@executor/plugin-graphql-react": "workspace:*",
@@ -72,9 +73,11 @@ · 9 unmodified lines
7273 "class-variance-authority": "^0.7.1",
7374 "clsx": "^2.1.1",
7475 "effect": "catalog:",
76+ "lucide-react": "^1.7.0",
7577 "react": "^19.2.0",
7678 "react-dom": "^19.2.0",
7779 "react-grab": "^0.1.26",
80+ "shadcn": "^4.1.1",
7881 "shiki": "^4.0.1",
7982 "streamdown": "^2.3.0",
8083 "tailwind-merge": "^3.5.0",
@@ -132,6 +135,7 @@ · 51 unmodified lines
132135 "name": "@executor/react",
133136 "version": "0.0.0",
134137 "dependencies": {
138+ "@base-ui/react": "^1.3.0",
135139 "@effect-atom/atom": "0.5.3",
136140 "@effect-atom/atom-react": "0.5.0",
137141 "@effect/platform": "catalog:",
@@ -141,6 +145,7 @@ · 3 unmodified lines
141145 "@shikijs/themes": "^4.0.1",
142146 "class-variance-authority": "^0.7.1",
143147 "clsx": "^2.1.1",
148+ "cmdk": "^1.1.1",
144149 "effect": "catalog:",
145150 "shiki": "^4.0.1",
146151 "streamdown": "^2.3.0",
@@ -833,16 +838,28 @@ · 686 unmodified lines
833838
834839 "@babel/generator": ["@babel/generator@7.29.1", "", { "dependencies": { "@babel/parser": "^7.29.0", "@babel/types": "^7.29.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw=="],
835840
841+ "@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.27.3", "", { "dependencies": { "@babel/types": "^7.27.3" } }, "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg=="],
842+
836843 "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.28.6", "", { "dependencies": { "@babel/compat-data": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA=="],
837844
845+ "@babel/helper-create-class-features-plugin": ["@babel/helper-create-class-features-plugin@7.28.6", "", { "dependencies": { "@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/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/traverse": "^7.28.6", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow=="],
846+
838847 "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="],
839848
849+ "@babel/helper-member-expression-to-functions": ["@babel/helper-member-expression-to-functions@7.28.5", "", { "dependencies": { "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5" } }, "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg=="],
850+
840851 "@babel/helper-module-imports": ["@babel/helper-module-imports@7.28.6", "", { "dependencies": { "@babel/traverse": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw=="],
841852
842853 "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.28.6", "", { "dependencies": { "@babel/helper-module-imports": "^7.28.6", "@babel/helper-validator-identifier": "^7.28.5", "@babel/traverse": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA=="],
843854
855+ "@babel/helper-optimise-call-expression": ["@babel/helper-optimise-call-expression@7.27.1", "", { "dependencies": { "@babel/types": "^7.27.1" } }, "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw=="],
856+
844857 "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.28.6", "", {}, "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug=="],
845858
859+ "@babel/helper-replace-supers": ["@babel/helper-replace-supers@7.28.6", "", { "dependencies": { "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/traverse": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg=="],
860+
861+ "@babel/helper-skip-transparent-expression-wrappers": ["@babel/helper-skip-transparent-expression-wrappers@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg=="],
862+
846863 "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="],
847864
848865 "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="],
@@ -853,10 +870,20 @@ · 4 unmodified lines
853870
854871 "@babel/parser": ["@babel/parser@7.29.0", "", { "dependencies": { "@babel/types": "^7.29.0" }, "bin": "./bin/babel-parser.js" }, "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww=="],
855872
873+ "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w=="],
874+
875+ "@babel/plugin-syntax-typescript": ["@babel/plugin-syntax-typescript@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A=="],
876+
877+ "@babel/plugin-transform-modules-commonjs": ["@babel/plugin-transform-modules-commonjs@7.28.6", "", { "dependencies": { "@babel/helper-module-transforms": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA=="],
878+
856879 "@babel/plugin-transform-react-jsx-self": ["@babel/plugin-transform-react-jsx-self@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw=="],
857880
858881 "@babel/plugin-transform-react-jsx-source": ["@babel/plugin-transform-react-jsx-source@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw=="],
859882
883+ "@babel/plugin-transform-typescript": ["@babel/plugin-transform-typescript@7.28.6", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-create-class-features-plugin": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw=="],
884+
885+ "@babel/preset-typescript": ["@babel/preset-typescript@7.28.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.27.1", "@babel/plugin-transform-typescript": "^7.28.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g=="],
886+
860887 "@babel/runtime": ["@babel/runtime@7.28.6", "", {}, "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA=="],
861888
862889 "@babel/template": ["@babel/template@7.28.6", "", { "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/parser": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ=="],
@@ -865,6 +892,10 @@ · 2 unmodified lines
865892
866893 "@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="],
867894
895+ "@base-ui/react": ["@base-ui/react@1.3.0", "", { "dependencies": { "@babel/runtime": "^7.28.6", "@base-ui/utils": "0.2.6", "@floating-ui/react-dom": "^2.1.8", "@floating-ui/utils": "^0.2.11", "tabbable": "^6.4.0", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "@types/react": "^17 || ^18 || ^19", "react": "^17 || ^18 || ^19", "react-dom": "^17 || ^18 || ^19" }, "optionalPeers": ["@types/react"] }, "sha512-FwpKqZbPz14AITp1CVgf4AjhKPe1OeeVKSBMdgD10zbFlj3QSWelmtCMLi2+/PFZZcIm3l87G7rwtCZJwHyXWA=="],
896+
897+ "@base-ui/utils": ["@base-ui/utils@0.2.6", "", { "dependencies": { "@babel/runtime": "^7.28.6", "@floating-ui/utils": "^0.2.11", "reselect": "^5.1.1", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "@types/react": "^17 || ^18 || ^19", "react": "^17 || ^18 || ^19", "react-dom": "^17 || ^18 || ^19" }, "optionalPeers": ["@types/react"] }, "sha512-yQ+qeuqohwhsNpoYDqqXaLllYAkPCP4vYdDrVo8FQXaAPfHWm1pG/Vm+jmGTA5JFS0BAIjookyapuJFY8F9PIw=="],
898+
868899 "@changesets/apply-release-plan": ["@changesets/apply-release-plan@7.1.0", "", { "dependencies": { "@changesets/config": "^3.1.3", "@changesets/get-version-range-type": "^0.4.0", "@changesets/git": "^3.0.4", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "detect-indent": "^6.0.0", "fs-extra": "^7.0.1", "lodash.startcase": "^4.4.0", "outdent": "^0.5.0", "prettier": "^2.7.1", "resolve-from": "^5.0.0", "semver": "^7.5.3" } }, "sha512-yq8ML3YS7koKQ/9bk1PqO0HMzApIFNwjlwCnwFEXMzNe8NpzeeYYKCmnhWJGkN8g7E51MnWaSbqRcTcdIxUgnQ=="],
869900
870901 "@changesets/assemble-release-plan": ["@changesets/assemble-release-plan@6.0.9", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.3", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "semver": "^7.5.3" } }, "sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ=="],
@@ -909,6 +940,10 @@ · 38 unmodified lines
909940
910941 "@csstools/css-tokenizer": ["@csstools/css-tokenizer@3.0.4", "", {}, "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw=="],
911942
943+ "@dotenvx/dotenvx": ["@dotenvx/dotenvx@1.59.1", "", { "dependencies": { "commander": "^11.1.0", "dotenv": "^17.2.1", "eciesjs": "^0.4.10", "execa": "^5.1.1", "fdir": "^6.2.0", "ignore": "^5.3.0", "object-treeify": "1.1.33", "picomatch": "^4.0.2", "which": "^4.0.0" }, "bin": { "dotenvx": "src/cli/dotenvx.js" } }, "sha512-Qg+meC+XFxliuVSDlEPkKnaUjdaJKK6FNx/Wwl2UxhQR8pyPIuLhMavsF7ePdB9qFZUWV1jEK3ckbJir/WmF4w=="],
944+
945+ "@ecies/ciphers": ["@ecies/ciphers@0.2.5", "", { "peerDependencies": { "@noble/ciphers": "^1.0.0" } }, "sha512-GalEZH4JgOMHYYcYmVqnFirFsjZHeoGMDt9IxEnM9F7GRUUyUksJ7Ou53L83WHJq3RWKD3AcBpo0iQh0oMpf8A=="],
946+
912947 "@effect-atom/atom": ["@effect-atom/atom@0.5.3", "", { "peerDependencies": { "@effect/experimental": "^0.58.0", "@effect/platform": "^0.94.2", "@effect/rpc": "^0.73.0", "effect": "^3.19.15" } }, "sha512-TRZv/i+YT3TtnN0oFORJqXdxSs1fc7lrJlH+1xZvDFyjC9hgoVnrcKbeZsDFmr6r0wYRqVo7U3IftxiQNjpNZA=="],
913948
914949 "@effect-atom/atom-react": ["@effect-atom/atom-react@0.5.0", "", { "dependencies": { "@effect-atom/atom": "^0.5.0" }, "peerDependencies": { "effect": "^3.19", "react": ">=18 <20", "scheduler": "*" } }, "sha512-aFfjWi4rEJCqfM12Oi36/EKaDm/W6n4/N6yM5vL0t/QozKhJhK05rQL/GY4XMxlH2eqkQ4ih8jBQa3Yyp0Fiqw=="],
@@ -1095,6 +1130,14 @@ · 180 unmodified lines
10951130
10961131 "@executor/web": ["@executor/web@workspace:apps/web"],
10971132
1133+ "@floating-ui/core": ["@floating-ui/core@1.7.5", "", { "dependencies": { "@floating-ui/utils": "^0.2.11" } }, "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ=="],
1134+
1135+ "@floating-ui/dom": ["@floating-ui/dom@1.7.6", "", { "dependencies": { "@floating-ui/core": "^1.7.5", "@floating-ui/utils": "^0.2.11" } }, "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ=="],
1136+
1137+ "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.8", "", { "dependencies": { "@floating-ui/dom": "^1.7.6" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A=="],
1138+
1139+ "@floating-ui/utils": ["@floating-ui/utils@0.2.11", "", {}, "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg=="],
1140+
10981141 "@grpc/grpc-js": ["@grpc/grpc-js@1.14.3", "", { "dependencies": { "@grpc/proto-loader": "^0.8.0", "@js-sdsl/ordered-map": "^4.4.2" } }, "sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA=="],
10991142
11001143 "@grpc/proto-loader": ["@grpc/proto-loader@0.8.0", "", { "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", "protobufjs": "^7.5.3", "yargs": "^17.7.2" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" } }, "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ=="],
@@ -1103,8 +1146,18 @@ · 2 unmodified lines
11031146
11041147 "@hono/vite-dev-server": ["@hono/vite-dev-server@0.25.0", "", { "dependencies": { "@hono/node-server": "^1.14.2", "minimatch": "^9.0.3" }, "peerDependencies": { "hono": "*", "miniflare": "*", "wrangler": "*" }, "optionalPeers": ["miniflare", "wrangler"] }, "sha512-4j5rs7yUTOObU2/yCEHeWbf3C8m95SD9lhdUUE6CJ462Emp9vS94yiza2dsA8+ly5pdaIQW0cd4nhNVcwYL5tA=="],
11051148
1149+ "@inquirer/ansi": ["@inquirer/ansi@1.0.2", "", {}, "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ=="],
1150+
1151+ "@inquirer/confirm": ["@inquirer/confirm@5.1.21", "", { "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ=="],
1152+
1153+ "@inquirer/core": ["@inquirer/core@10.3.2", "", { "dependencies": { "@inquirer/ansi": "^1.0.2", "@inquirer/figures": "^1.0.15", "@inquirer/type": "^3.0.10", "cli-width": "^4.1.0", "mute-stream": "^2.0.0", "signal-exit": "^4.1.0", "wrap-ansi": "^6.2.0", "yoctocolors-cjs": "^2.1.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A=="],
1154+
11061155 "@inquirer/external-editor": ["@inquirer/external-editor@1.0.3", "", { "dependencies": { "chardet": "^2.1.1", "iconv-lite": "^0.7.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA=="],
11071156
1157+ "@inquirer/figures": ["@inquirer/figures@1.0.15", "", {}, "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g=="],
1158+
1159+ "@inquirer/type": ["@inquirer/type@3.0.10", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA=="],
1160+
11081161 "@jitl/quickjs-ffi-types": ["@jitl/quickjs-ffi-types@0.31.0", "", {}, "sha512-1yrgvXlmXH2oNj3eFTrkwacGJbmM0crwipA3ohCrjv52gBeDaD7PsTvFYinlAnqU8iPME3LGP437yk05a2oejw=="],
11091162
11101163 "@jitl/quickjs-wasmfile-debug-asyncify": ["@jitl/quickjs-wasmfile-debug-asyncify@0.31.0", "", { "dependencies": { "@jitl/quickjs-ffi-types": "0.31.0" } }, "sha512-YkdzQdr1uaftFhgEnTRjTTZHk2SFZdpWO7XhOmRVbi6CEVsH9g5oNF8Ta1q3OuSJHRwwT8YsuR1YzEiEIJEk6w=="],
@@ -1147,14 +1200,28 @@ · 36 unmodified lines
11471200
11481201 "@msgpackr-extract/msgpackr-extract-win32-x64": ["@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3", "", { "os": "win32", "cpu": "x64" }, "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ=="],
11491202
1203+ "@mswjs/interceptors": ["@mswjs/interceptors@0.41.3", "", { "dependencies": { "@open-draft/deferred-promise": "^2.2.0", "@open-draft/logger": "^0.3.0", "@open-draft/until": "^2.0.0", "is-node-process": "^1.2.0", "outvariant": "^1.4.3", "strict-event-emitter": "^0.5.1" } }, "sha512-cXu86tF4VQVfwz8W1SPbhoRyHJkti6mjH/XJIxp40jhO4j2k1m4KYrEykxqWPkFF3vrK4rgQppBh//AwyGSXPA=="],
1204+
11501205 "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.1", "", { "dependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" } }, "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A=="],
11511206
1207+ "@noble/ciphers": ["@noble/ciphers@1.3.0", "", {}, "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw=="],
1208+
1209+ "@noble/curves": ["@noble/curves@1.9.7", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="],
1210+
1211+ "@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="],
1212+
11521213 "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="],
11531214
11541215 "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="],
11551216
11561217 "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="],
11571218
1219+ "@open-draft/deferred-promise": ["@open-draft/deferred-promise@2.2.0", "", {}, "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA=="],
1220+
1221+ "@open-draft/logger": ["@open-draft/logger@0.3.0", "", { "dependencies": { "is-node-process": "^1.2.0", "outvariant": "^1.4.0" } }, "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ=="],
1222+
1223+ "@open-draft/until": ["@open-draft/until@2.1.0", "", {}, "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg=="],
1224+
11581225 "@opentelemetry/api": ["@opentelemetry/api@1.9.0", "", {}, "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg=="],
11591226
11601227 "@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.213.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-zRM5/Qj6G84Ej3F1yt33xBVY/3tnMxtL1fiDIxYbDWYaZ/eudVw3/PBiZ8G7JwUxXxjW8gU4g6LnOyfGKYHYgw=="],
@@ -1311,6 +1378,40 @@ · 150 unmodified lines
13111378
13121379 "@protobufjs/utf8": ["@protobufjs/utf8@1.1.0", "", {}, "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="],
13131380
1381+ "@radix-ui/primitive": ["@radix-ui/primitive@1.1.3", "", {}, "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg=="],
1382+
1383+ "@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg=="],
1384+
1385+ "@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="],
1386+
1387+ "@radix-ui/react-dialog": ["@radix-ui/react-dialog@1.1.15", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-controllable-state": "1.2.2", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw=="],
1388+
1389+ "@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-escape-keydown": "1.1.1" }, "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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg=="],
1390+
1391+ "@radix-ui/react-focus-guards": ["@radix-ui/react-focus-guards@1.1.3", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw=="],
1392+
1393+ "@radix-ui/react-focus-scope": ["@radix-ui/react-focus-scope@1.1.7", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1" }, "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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw=="],
1394+
1395+ "@radix-ui/react-id": ["@radix-ui/react-id@1.1.1", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg=="],
1396+
1397+ "@radix-ui/react-portal": ["@radix-ui/react-portal@1.1.9", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-layout-effect": "1.1.1" }, "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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ=="],
1398+
1399+ "@radix-ui/react-presence": ["@radix-ui/react-presence@1.1.5", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ=="],
1400+
1401+ "@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.4", "", { "dependencies": { "@radix-ui/react-slot": "1.2.4" }, "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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg=="],
1402+
1403+ "@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="],
1404+
1405+ "@radix-ui/react-use-callback-ref": ["@radix-ui/react-use-callback-ref@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg=="],
1406+
1407+ "@radix-ui/react-use-controllable-state": ["@radix-ui/react-use-controllable-state@1.2.2", "", { "dependencies": { "@radix-ui/react-use-effect-event": "0.0.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg=="],
1408+
1409+ "@radix-ui/react-use-effect-event": ["@radix-ui/react-use-effect-event@0.0.2", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA=="],
1410+
1411+ "@radix-ui/react-use-escape-keydown": ["@radix-ui/react-use-escape-keydown@1.1.1", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g=="],
1412+
1413+ "@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ=="],
1414+
13141415 "@react-grab/cli": ["@react-grab/cli@0.1.26", "", { "dependencies": { "@antfu/ni": "^0.23.0", "commander": "^14.0.0", "ignore": "^7.0.5", "jsonc-parser": "^3.3.1", "ora": "^8.2.0", "picocolors": "^1.1.1", "prompts": "^2.4.2", "smol-toml": "^1.6.0" }, "bin": { "react-grab": "dist/cli.js" } }, "sha512-nNOBdrJ2K7jji6L/X9ARCpU1o/CQ33KYZUtW7vAtrfDM2hyvAIA224ps+Syl97FxhS7pO8b59Bnhc7YLG6h3nA=="],
13151416
13161417 "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.3", "", {}, "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q=="],
@@ -1365,6 +1466,8 @@ · 48 unmodified lines
13651466
13661467 "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.59.0", "", { "os": "win32", "cpu": "x64" }, "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA=="],
13671468
1469+ "@sec-ant/readable-stream": ["@sec-ant/readable-stream@0.4.1", "", {}, "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg=="],
1470+
13681471 "@shikijs/core": ["@shikijs/core@4.0.1", "", { "dependencies": { "@shikijs/primitive": "4.0.1", "@shikijs/types": "4.0.1", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-vWvqi9JNgz1dRL9Nvog5wtx7RuNkf7MEPl2mU/cyUUxJeH1CAr3t+81h8zO8zs7DK6cKLMoU9TvukWIDjP4Lzg=="],
13691472
13701473 "@shikijs/engine-javascript": ["@shikijs/engine-javascript@4.0.1", "", { "dependencies": { "@shikijs/types": "4.0.1", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.4" } }, "sha512-DJK9NiwtGYqMuKCRO4Ip0FKNDQpmaiS+K5bFjJ7DWFn4zHueDWgaUG8kAofkrnXF6zPPYYQY7J5FYVW9MbZyBg=="],
@@ -1381,6 +1484,8 @@ · 10 unmodified lines
13811484
13821485 "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="],
13831486
1487+ "@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@4.0.0", "", {}, "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ=="],
1488+
13841489 "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
13851490
13861491 "@tailwindcss/node": ["@tailwindcss/node@4.2.1", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "^5.19.0", "jiti": "^2.6.1", "lightningcss": "1.31.1", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.2.1" } }, "sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg=="],
@@ -1423,6 +1528,8 @@ · 36 unmodified lines
14231528
14241529 "@tanstack/store": ["@tanstack/store@0.9.2", "", {}, "sha512-K013lUJEFJK2ofFQ/hZKJUmCnpcV00ebLyOyFOWQvyQHUOZp/iYO84BM6aOGiV81JzwbX0APTVmW8YI7yiG5oA=="],
14251530
1531+ "@ts-morph/common": ["@ts-morph/common@0.27.0", "", { "dependencies": { "fast-glob": "^3.3.3", "minimatch": "^10.0.1", "path-browserify": "^1.0.1" } }, "sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ=="],
1532+
14261533 "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="],
14271534
14281535 "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="],
@@ -1459,10 +1566,14 @@ · 30 unmodified lines
14591566
14601567 "@types/react-reconciler": ["@types/react-reconciler@0.28.9", "", { "peerDependencies": { "@types/react": "*" } }, "sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg=="],
14611568
1569+ "@types/statuses": ["@types/statuses@2.0.6", "", {}, "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA=="],
1570+
14621571 "@types/tough-cookie": ["@types/tough-cookie@4.0.5", "", {}, "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA=="],
14631572
14641573 "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="],
14651574
1575+ "@types/validate-npm-package-name": ["@types/validate-npm-package-name@4.0.2", "", {}, "sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw=="],
1576+
14661577 "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="],
14671578
14681579 "@vercel/oidc": ["@vercel/oidc@3.1.0", "", {}, "sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w=="],
@@ -1501,10 +1612,14 @@ · 32 unmodified lines
15011612
15021613 "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
15031614
1615+ "aria-hidden": ["aria-hidden@1.2.6", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA=="],
1616+
15041617 "array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="],
15051618
15061619 "assertion-error": ["assertion-error@2.0.1", "", {}, "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA=="],
15071620
1621+ "ast-types": ["ast-types@0.16.1", "", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg=="],
1622+
15081623 "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="],
15091624
15101625 "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
@@ -1525,6 +1640,8 @@ · 14 unmodified lines
15251640
15261641 "bun-types": ["bun-types@1.3.10", "", { "dependencies": { "@types/node": "*" } }, "sha512-tcpfCCl6XWo6nCVnpcVrxQ+9AYN1iqMIzgrSKYMB/fjLtV2eyAVEg7AxQJuCq/26R6HpKWykQXuSOq/21RYcbg=="],
15271642
1643+ "bundle-name": ["bundle-name@4.1.0", "", { "dependencies": { "run-applescript": "^7.0.0" } }, "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q=="],
1644+
15281645 "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="],
15291646
15301647 "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="],
@@ -1533,6 +1650,8 @@ · 2 unmodified lines
15331650
15341651 "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="],
15351652
1653+ "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="],
1654+
15361655 "caniuse-lite": ["caniuse-lite@1.0.30001777", "", {}, "sha512-tmN+fJxroPndC74efCdp12j+0rk0RHwV5Jwa1zWaFVyw2ZxAuPeG8ZgWC3Wz7uSjT3qMRQ5XHZ4COgQmsCMJAQ=="],
15371656
15381657 "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="],
@@ -1559,10 +1678,16 @@ · 20 unmodified lines
15591678
15601679 "cli-spinners": ["cli-spinners@2.9.2", "", {}, "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg=="],
15611680
1681+ "cli-width": ["cli-width@4.1.0", "", {}, "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ=="],
1682+
15621683 "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="],
15631684
15641685 "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="],
15651686
1687+ "cmdk": ["cmdk@1.1.1", "", { "dependencies": { "@radix-ui/react-compose-refs": "^1.1.1", "@radix-ui/react-dialog": "^1.1.6", "@radix-ui/react-id": "^1.1.0", "@radix-ui/react-primitive": "^2.0.2" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "react-dom": "^18 || ^19 || ^19.0.0-rc" } }, "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg=="],
1688+
1689+ "code-block-writer": ["code-block-writer@13.0.3", "", {}, "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg=="],
1690+
15661691 "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
15671692
15681693 "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
@@ -1585,12 +1710,18 @@ · 16 unmodified lines
15851710
15861711 "cors": ["cors@2.8.6", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw=="],
15871712
1713+ "cosmiconfig": ["cosmiconfig@9.0.1", "", { "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ=="],
1714+
15881715 "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
15891716
1717+ "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="],
1718+
15901719 "cssstyle": ["cssstyle@4.6.0", "", { "dependencies": { "@asamuzakjp/css-color": "^3.2.0", "rrweb-cssom": "^0.8.0" } }, "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg=="],
15911720
15921721 "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="],
15931722
1723+ "data-uri-to-buffer": ["data-uri-to-buffer@4.0.1", "", {}, "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A=="],
1724+
15941725 "data-urls": ["data-urls@5.0.0", "", { "dependencies": { "whatwg-mimetype": "^4.0.0", "whatwg-url": "^14.0.0" } }, "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg=="],
15951726
15961727 "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
@@ -1599,8 +1730,18 @@ · 2 unmodified lines
15991730
16001731 "decode-named-character-reference": ["decode-named-character-reference@1.3.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q=="],
16011732
1733+ "dedent": ["dedent@1.7.2", "", { "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, "optionalPeers": ["babel-plugin-macros"] }, "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA=="],
1734+
16021735 "deep-eql": ["deep-eql@5.0.2", "", {}, "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q=="],
16031736
1737+ "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="],
1738+
1739+ "default-browser": ["default-browser@5.5.0", "", { "dependencies": { "bundle-name": "^4.1.0", "default-browser-id": "^5.0.0" } }, "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw=="],
1740+
1741+ "default-browser-id": ["default-browser-id@5.0.1", "", {}, "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q=="],
1742+
1743+ "define-lazy-prop": ["define-lazy-prop@3.0.0", "", {}, "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg=="],
1744+
16041745 "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="],
16051746
16061747 "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="],
@@ -1609,14 +1750,22 @@ · 2 unmodified lines
16091750
16101751 "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
16111752
1753+ "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="],
1754+
16121755 "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="],
16131756
1757+ "diff": ["diff@8.0.4", "", {}, "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw=="],
1758+
16141759 "dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="],
16151760
1761+ "dotenv": ["dotenv@17.3.1", "", {}, "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA=="],
1762+
16161763 "drizzle-orm": ["drizzle-orm@0.44.7", "", { "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", "@cloudflare/workers-types": ">=4", "@electric-sql/pglite": ">=0.2.0", "@libsql/client": ">=0.10.0", "@libsql/client-wasm": ">=0.10.0", "@neondatabase/serverless": ">=0.10.0", "@op-engineering/op-sqlite": ">=2", "@opentelemetry/api": "^1.4.1", "@planetscale/database": ">=1.13", "@prisma/client": "*", "@tidbcloud/serverless": "*", "@types/better-sqlite3": "*", "@types/pg": "*", "@types/sql.js": "*", "@upstash/redis": ">=1.34.7", "@vercel/postgres": ">=0.8.0", "@xata.io/client": "*", "better-sqlite3": ">=7", "bun-types": "*", "expo-sqlite": ">=14.0.0", "gel": ">=2", "knex": "*", "kysely": "*", "mysql2": ">=2", "pg": ">=8", "postgres": ">=3", "sql.js": ">=1", "sqlite3": ">=5" }, "optionalPeers": ["@aws-sdk/client-rds-data", "@cloudflare/workers-types", "@electric-sql/pglite", "@libsql/client", "@libsql/client-wasm", "@neondatabase/serverless", "@op-engineering/op-sqlite", "@opentelemetry/api", "@planetscale/database", "@prisma/client", "@tidbcloud/serverless", "@types/better-sqlite3", "@types/pg", "@types/sql.js", "@upstash/redis", "@vercel/postgres", "@xata.io/client", "better-sqlite3", "bun-types", "expo-sqlite", "gel", "knex", "kysely", "mysql2", "pg", "postgres", "sql.js", "sqlite3"] }, "sha512-quIpnYznjU9lHshEOAYLoZ9s3jweleHlZIAWR/jX9gAWNg/JhQ1wj0KGRf7/Zm+obRrYd9GjPVJg790QY9N5AQ=="],
16171764
16181765 "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="],
16191766
1767+ "eciesjs": ["eciesjs@0.4.18", "", { "dependencies": { "@ecies/ciphers": "^0.2.5", "@noble/ciphers": "^1.3.0", "@noble/curves": "^1.9.7", "@noble/hashes": "^1.8.0" } }, "sha512-wG99Zcfcys9fZux7Cft8BAX/YrOJLJSZ3jyYPfhZHqN2E+Ffx+QXBDsv3gubEgPtV6dTzJMSQUwk1H98/t/0wQ=="],
1768+
16201769 "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="],
16211770
16221771 "effect": ["effect@3.19.19", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-Yc8U/SVXo2dHnaP7zNBlAo83h/nzSJpi7vph6Hzyl4ulgMBIgPmz3UzOjb9sBgpFE00gC0iETR244sfXDNLHRg=="],
@@ -1633,6 +1782,10 @@ · 10 unmodified lines
16331782
16341783 "entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="],
16351784
1785+ "env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="],
1786+
1787+ "error-ex": ["error-ex@1.3.4", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ=="],
1788+
16361789 "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="],
16371790
16381791 "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="],
@@ -1661,6 +1814,8 @@ · 22 unmodified lines
16611814
16621815 "eventsource-parser": ["eventsource-parser@3.0.6", "", {}, "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg=="],
16631816
1817+ "execa": ["execa@9.6.1", "", { "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", "cross-spawn": "^7.0.6", "figures": "^6.1.0", "get-stream": "^9.0.0", "human-signals": "^8.0.1", "is-plain-obj": "^4.1.0", "is-stream": "^4.0.1", "npm-run-path": "^6.0.0", "pretty-ms": "^9.2.0", "signal-exit": "^4.1.0", "strip-final-newline": "^4.0.0", "yoctocolors": "^2.1.1" } }, "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA=="],
1818+
16641819 "executor": ["executor@workspace:apps/executor"],
16651820
16661821 "expect-type": ["expect-type@1.3.0", "", {}, "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA=="],
@@ -1687,6 +1842,10 @@ · 20 unmodified lines
16871842
16881843 "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
16891844
1845+ "fetch-blob": ["fetch-blob@3.2.0", "", { "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" } }, "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ=="],
1846+
1847+ "figures": ["figures@6.1.0", "", { "dependencies": { "is-unicode-supported": "^2.0.0" } }, "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg=="],
1848+
16901849 "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="],
16911850
16921851 "finalhandler": ["finalhandler@2.1.1", "", { "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "on-finished": "^2.4.1", "parseurl": "^1.3.3", "statuses": "^2.0.1" } }, "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA=="],
@@ -1697,6 +1856,8 @@ · 4 unmodified lines
16971856
16981857 "formatly": ["formatly@0.3.0", "", { "dependencies": { "fd-package-json": "^2.0.0" }, "bin": { "formatly": "bin/index.mjs" } }, "sha512-9XNj/o4wrRFyhSMJOvsuyMwy8aUfBaZ1VrqHVfohyXf0Sw0e+yfKG+xZaY3arGCOMdwFsqObtzVOc1gU9KiT9w=="],
16991858
1859+ "formdata-polyfill": ["formdata-polyfill@4.0.10", "", { "dependencies": { "fetch-blob": "^3.1.2" } }, "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g=="],
1860+
17001861 "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="],
17011862
17021863 "fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="],
@@ -1707,6 +1868,8 @@ · 4 unmodified lines
17071868
17081869 "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],
17091870
1871+ "fuzzysort": ["fuzzysort@3.1.0", "", {}, "sha512-sR9BNCjBg6LNgwvxlBd0sBABvQitkLzoVY9MYYROQVX/FvfJ4Mai9LsGhDgd8qYdds0bY77VzYd5iuB+v5rwQQ=="],
1872+
17101873 "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="],
17111874
17121875 "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="],
@@ -1715,8 +1878,14 @@ · 2 unmodified lines
17151878
17161879 "get-intrinsic": ["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" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="],
17171880
1881+ "get-nonce": ["get-nonce@1.0.1", "", {}, "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="],
1882+
1883+ "get-own-enumerable-keys": ["get-own-enumerable-keys@1.0.0", "", {}, "sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA=="],
1884+
17181885 "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="],
17191886
1887+ "get-stream": ["get-stream@9.0.1", "", { "dependencies": { "@sec-ant/readable-stream": "^0.4.1", "is-stream": "^4.0.1" } }, "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA=="],
1888+
17201889 "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
17211890
17221891 "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="],
@@ -1749,6 +1918,8 @@ · 26 unmodified lines
17491918
17501919 "hastscript": ["hastscript@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" } }, "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w=="],
17511920
1921+ "headers-polyfill": ["headers-polyfill@4.0.3", "", {}, "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ=="],
1922+
17521923 "hono": ["hono@4.12.5", "", {}, "sha512-3qq+FUBtlTHhtYxbxheZgY8NIFnkkC/MR8u5TTsr7YZ3wixryQ3cCwn3iZbg8p8B88iDBBAYSfZDS75t8MN7Vg=="],
17531924
17541925 "html-encoding-sniffer": ["html-encoding-sniffer@4.0.0", "", { "dependencies": { "whatwg-encoding": "^3.1.1" } }, "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ=="],
@@ -1765,10 +1936,14 @@ · 10 unmodified lines
17651936
17661937 "human-id": ["human-id@4.1.3", "", { "bin": { "human-id": "dist/cli.js" } }, "sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q=="],
17671938
1939+ "human-signals": ["human-signals@8.0.1", "", {}, "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ=="],
1940+
17681941 "iconv-lite": ["iconv-lite@0.7.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="],
17691942
17701943 "ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="],
17711944
1945+ "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="],
1946+
17721947 "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="],
17731948
17741949 "ini": ["ini@4.1.3", "", {}, "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg=="],
@@ -1783,8 +1958,12 @@ · 8 unmodified lines
17831958
17841959 "is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="],
17851960
1961+ "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="],
1962+
17861963 "is-decimal": ["is-decimal@2.0.1", "", {}, "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A=="],
17871964
1965+ "is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="],
1966+
17881967 "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="],
17891968
17901969 "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="],
@@ -1793,22 +1972,36 @@ · 2 unmodified lines
17931972
17941973 "is-hexadecimal": ["is-hexadecimal@2.0.1", "", {}, "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg=="],
17951974
1975+ "is-in-ssh": ["is-in-ssh@1.0.0", "", {}, "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw=="],
1976+
1977+ "is-inside-container": ["is-inside-container@1.0.0", "", { "dependencies": { "is-docker": "^3.0.0" }, "bin": { "is-inside-container": "cli.js" } }, "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="],
1978+
17961979 "is-interactive": ["is-interactive@2.0.0", "", {}, "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ=="],
17971980
1981+ "is-node-process": ["is-node-process@1.2.0", "", {}, "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw=="],
1982+
17981983 "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
17991984
1985+ "is-obj": ["is-obj@3.0.0", "", {}, "sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ=="],
1986+
18001987 "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="],
18011988
18021989 "is-potential-custom-element-name": ["is-potential-custom-element-name@1.0.1", "", {}, "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ=="],
18031990
18041991 "is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="],
18051992
1993+ "is-regexp": ["is-regexp@3.1.0", "", {}, "sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA=="],
1994+
1995+ "is-stream": ["is-stream@4.0.1", "", {}, "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A=="],
1996+
18061997 "is-subdir": ["is-subdir@1.2.0", "", { "dependencies": { "better-path-resolve": "1.0.0" } }, "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw=="],
18071998
18081999 "is-unicode-supported": ["is-unicode-supported@2.1.0", "", {}, "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ=="],
18092000
18102001 "is-windows": ["is-windows@1.0.2", "", {}, "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="],
18112002
2003+ "is-wsl": ["is-wsl@3.1.1", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw=="],
2004+
18122005 "isbot": ["isbot@5.1.35", "", {}, "sha512-waFfC72ZNfwLLuJ2iLaoVaqcNo+CAaLR7xCpAn0Y5WfGzkNHv7ZN39Vbi1y+kb+Zs46XHOX3tZNExroFUPX+Kg=="],
18132006
18142007 "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
@@ -1825,6 +2018,8 @@ · 10 unmodified lines
18252018
18262019 "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="],
18272020
2021+ "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="],
2022+
18282023 "json-schema": ["json-schema@0.4.0", "", {}, "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="],
18292024
18302025 "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
@@ -1837,7 +2032,7 @@ · 6 unmodified lines
18372032
18382033 "jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="],
18392034
1840− "kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="],
2035+ "kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="],
18412036
18422037 "knip": ["knip@5.85.0", "", { "dependencies": { "@nodelib/fs.walk": "^1.2.3", "fast-glob": "^3.3.3", "formatly": "^0.3.0", "jiti": "^2.6.0", "js-yaml": "^4.1.1", "minimist": "^1.2.8", "oxc-resolver": "^11.15.0", "picocolors": "^1.1.1", "picomatch": "^4.0.1", "smol-toml": "^1.5.2", "strip-json-comments": "5.0.3", "zod": "^4.1.11" }, "peerDependencies": { "@types/node": ">=18", "typescript": ">=5.0.4 <7" }, "bin": { "knip": "bin/knip.js", "knip-bun": "bin/knip-bun.js" } }, "sha512-V2kyON+DZiYdNNdY6GALseiNCwX7dYdpz9Pv85AUn69Gk0UKCts+glOKWfe5KmaMByRjM9q17Mzj/KinTVOyxg=="],
18432038
@@ -1867,6 +2062,8 @@ · 23 unmodified lines
18672062
18682063 "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.31.1", "", { "os": "win32", "cpu": "x64" }, "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw=="],
18692064
2065+ "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="],
2066+
18702067 "locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="],
18712068
18722069 "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="],
@@ -1883,6 +2080,8 @@ · 10 unmodified lines
18832080
18842081 "lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],
18852082
2083+ "lucide-react": ["lucide-react@1.7.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-yI7BeItCLZJTXikmK4KNUGCKoGzSvbKlfCvw44bU4fXAL6v3gYS4uHD1jzsLkfwODYwI6Drw5Tu9Z5ulDe0TSg=="],
2084+
18862085 "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
18872086
18882087 "markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="],
@@ -1925,6 +2124,8 @@ · 36 unmodified lines
19252124
19262125 "merge-descriptors": ["merge-descriptors@2.0.0", "", {}, "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g=="],
19272126
2127+ "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="],
2128+
19282129 "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="],
19292130
19302131 "micromark": ["micromark@4.0.2", "", { "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA=="],
@@ -1991,6 +2192,8 @@ · 60 unmodified lines
19912192
19922193 "mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="],
19932194
2195+ "mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="],
2196+
19942197 "mimic-function": ["mimic-function@5.0.1", "", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="],
19952198
19962199 "minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="],
@@ -2005,38 +2208,54 @@ · 8 unmodified lines
20052208
20062209 "msgpackr-extract": ["msgpackr-extract@3.0.3", "", { "dependencies": { "node-gyp-build-optional-packages": "5.2.2" }, "optionalDependencies": { "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" }, "bin": { "download-msgpackr-prebuilds": "bin/download-prebuilds.js" } }, "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA=="],
20072210
2211+ "msw": ["msw@2.12.14", "", { "dependencies": { "@inquirer/confirm": "^5.0.0", "@mswjs/interceptors": "^0.41.2", "@open-draft/deferred-promise": "^2.2.0", "@types/statuses": "^2.0.6", "cookie": "^1.0.2", "graphql": "^16.12.0", "headers-polyfill": "^4.0.2", "is-node-process": "^1.2.0", "outvariant": "^1.4.3", "path-to-regexp": "^6.3.0", "picocolors": "^1.1.1", "rettime": "^0.10.1", "statuses": "^2.0.2", "strict-event-emitter": "^0.5.1", "tough-cookie": "^6.0.0", "type-fest": "^5.2.0", "until-async": "^3.0.2", "yargs": "^17.7.2" }, "peerDependencies": { "typescript": ">= 4.8.x" }, "optionalPeers": ["typescript"], "bin": { "msw": "cli/index.js" } }, "sha512-4KXa4nVBIBjbDbd7vfQNuQ25eFxug0aropCQFoI0JdOBuJWamkT1yLVIWReFI8SiTRc+H1hKzaNk+cLk2N9rtQ=="],
2212+
20082213 "multipasta": ["multipasta@0.2.7", "", {}, "sha512-KPA58d68KgGil15oDqXjkUBEBYc00XvbPj5/X+dyzeo/lWm9Nc25pQRlf1D+gv4OpK7NM0J1odrbu9JNNGvynA=="],
20092214
2215+ "mute-stream": ["mute-stream@2.0.0", "", {}, "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA=="],
2216+
20102217 "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
20112218
20122219 "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="],
20132220
20142221 "node-addon-api": ["node-addon-api@7.1.1", "", {}, "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ=="],
20152222
2223+ "node-domexception": ["node-domexception@1.0.0", "", {}, "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="],
2224+
2225+ "node-fetch": ["node-fetch@3.3.2", "", { "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" } }, "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA=="],
2226+
20162227 "node-gyp-build-optional-packages": ["node-gyp-build-optional-packages@5.2.2", "", { "dependencies": { "detect-libc": "^2.0.1" }, "bin": { "node-gyp-build-optional-packages": "bin.js", "node-gyp-build-optional-packages-optional": "optional.js", "node-gyp-build-optional-packages-test": "build-test.js" } }, "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw=="],
20172228
20182229 "node-releases": ["node-releases@2.0.36", "", {}, "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA=="],
20192230
2231+ "npm-run-path": ["npm-run-path@6.0.0", "", { "dependencies": { "path-key": "^4.0.0", "unicorn-magic": "^0.3.0" } }, "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA=="],
2232+
20202233 "nwsapi": ["nwsapi@2.2.23", "", {}, "sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ=="],
20212234
20222235 "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="],
20232236
20242237 "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="],
20252238
2239+ "object-treeify": ["object-treeify@1.1.33", "", {}, "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A=="],
2240+
20262241 "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="],
20272242
20282243 "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="],
20292244
2030− "onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="],
2245+ "onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="],
20312246
20322247 "oniguruma-parser": ["oniguruma-parser@0.12.1", "", {}, "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w=="],
20332248
20342249 "oniguruma-to-es": ["oniguruma-to-es@4.3.4", "", { "dependencies": { "oniguruma-parser": "^0.12.1", "regex": "^6.0.1", "regex-recursion": "^6.0.2" } }, "sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA=="],
20352250
2251+ "open": ["open@11.0.0", "", { "dependencies": { "default-browser": "^5.4.0", "define-lazy-prop": "^3.0.0", "is-in-ssh": "^1.0.0", "is-inside-container": "^1.0.0", "powershell-utils": "^0.1.0", "wsl-utils": "^0.3.0" } }, "sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw=="],
2252+
20362253 "ora": ["ora@8.2.0", "", { "dependencies": { "chalk": "^5.3.0", "cli-cursor": "^5.0.0", "cli-spinners": "^2.9.2", "is-interactive": "^2.0.0", "is-unicode-supported": "^2.0.0", "log-symbols": "^6.0.0", "stdin-discarder": "^0.2.2", "string-width": "^7.2.0", "strip-ansi": "^7.1.0" } }, "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw=="],
20372254
20382255 "outdent": ["outdent@0.5.0", "", {}, "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q=="],
20392256
2257+ "outvariant": ["outvariant@1.4.3", "", {}, "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA=="],
2258+
20402259 "oxc-resolver": ["oxc-resolver@11.19.1", "", { "optionalDependencies": { "@oxc-resolver/binding-android-arm-eabi": "11.19.1", "@oxc-resolver/binding-android-arm64": "11.19.1", "@oxc-resolver/binding-darwin-arm64": "11.19.1", "@oxc-resolver/binding-darwin-x64": "11.19.1", "@oxc-resolver/binding-freebsd-x64": "11.19.1", "@oxc-resolver/binding-linux-arm-gnueabihf": "11.19.1", "@oxc-resolver/binding-linux-arm-musleabihf": "11.19.1", "@oxc-resolver/binding-linux-arm64-gnu": "11.19.1", "@oxc-resolver/binding-linux-arm64-musl": "11.19.1", "@oxc-resolver/binding-linux-ppc64-gnu": "11.19.1", "@oxc-resolver/binding-linux-riscv64-gnu": "11.19.1", "@oxc-resolver/binding-linux-riscv64-musl": "11.19.1", "@oxc-resolver/binding-linux-s390x-gnu": "11.19.1", "@oxc-resolver/binding-linux-x64-gnu": "11.19.1", "@oxc-resolver/binding-linux-x64-musl": "11.19.1", "@oxc-resolver/binding-openharmony-arm64": "11.19.1", "@oxc-resolver/binding-wasm32-wasi": "11.19.1", "@oxc-resolver/binding-win32-arm64-msvc": "11.19.1", "@oxc-resolver/binding-win32-ia32-msvc": "11.19.1", "@oxc-resolver/binding-win32-x64-msvc": "11.19.1" } }, "sha512-qE/CIg/spwrTBFt5aKmwe3ifeDdLfA2NESN30E42X/lII5ClF8V7Wt6WIJhcGZjp0/Q+nQ+9vgxGk//xZNX2hg=="],
20412260
20422261 "oxlint": ["oxlint@1.56.0", "", { "optionalDependencies": { "@oxlint/binding-android-arm-eabi": "1.56.0", "@oxlint/binding-android-arm64": "1.56.0", "@oxlint/binding-darwin-arm64": "1.56.0", "@oxlint/binding-darwin-x64": "1.56.0", "@oxlint/binding-freebsd-x64": "1.56.0", "@oxlint/binding-linux-arm-gnueabihf": "1.56.0", "@oxlint/binding-linux-arm-musleabihf": "1.56.0", "@oxlint/binding-linux-arm64-gnu": "1.56.0", "@oxlint/binding-linux-arm64-musl": "1.56.0", "@oxlint/binding-linux-ppc64-gnu": "1.56.0", "@oxlint/binding-linux-riscv64-gnu": "1.56.0", "@oxlint/binding-linux-riscv64-musl": "1.56.0", "@oxlint/binding-linux-s390x-gnu": "1.56.0", "@oxlint/binding-linux-x64-gnu": "1.56.0", "@oxlint/binding-linux-x64-musl": "1.56.0", "@oxlint/binding-openharmony-arm64": "1.56.0", "@oxlint/binding-win32-arm64-msvc": "1.56.0", "@oxlint/binding-win32-ia32-msvc": "1.56.0", "@oxlint/binding-win32-x64-msvc": "1.56.0" }, "peerDependencies": { "oxlint-tsgolint": ">=0.15.0" }, "optionalPeers": ["oxlint-tsgolint"], "bin": { "oxlint": "bin/oxlint" } }, "sha512-Q+5Mj5PVaH/R6/fhMMFzw4dT+KPB+kQW4kaL8FOIq7tfhlnEVp6+3lcWqFruuTNlUo9srZUW3qH7Id4pskeR6g=="],
@@ -2053,17 +2272,25 @@ · 10 unmodified lines
20532272
20542273 "package-manager-detector": ["package-manager-detector@0.2.11", "", { "dependencies": { "quansync": "^0.2.7" } }, "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ=="],
20552274
2275+ "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="],
2276+
20562277 "parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="],
20572278
2279+ "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="],
2280+
2281+ "parse-ms": ["parse-ms@4.0.0", "", {}, "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw=="],
2282+
20582283 "parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="],
20592284
20602285 "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="],
20612286
2287+ "path-browserify": ["path-browserify@1.0.1", "", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="],
2288+
20622289 "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="],
20632290
20642291 "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
20652292
2066− "path-to-regexp": ["path-to-regexp@8.3.0", "", {}, "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA=="],
2293+ "path-to-regexp": ["path-to-regexp@6.3.0", "", {}, "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ=="],
20672294
20682295 "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="],
20692296
@@ -2081,8 +2308,14 @@ · 11 unmodified lines
20812308
20822309 "postcss": ["postcss@8.5.8", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg=="],
20832310
2311+ "postcss-selector-parser": ["postcss-selector-parser@7.1.1", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg=="],
2312+
2313+ "powershell-utils": ["powershell-utils@0.1.0", "", {}, "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A=="],
2314+
20842315 "prettier": ["prettier@3.8.1", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg=="],
20852316
2317+ "pretty-ms": ["pretty-ms@9.3.0", "", { "dependencies": { "parse-ms": "^4.0.0" } }, "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ=="],
2318+
20862319 "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="],
20872320
20882321 "property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="],
@@ -2117,8 +2350,16 @@ · 28 unmodified lines
21172350
21182351 "react-refresh": ["react-refresh@0.18.0", "", {}, "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw=="],
21192352
2353+ "react-remove-scroll": ["react-remove-scroll@2.7.2", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q=="],
2354+
2355+ "react-remove-scroll-bar": ["react-remove-scroll-bar@2.3.8", "", { "dependencies": { "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q=="],
2356+
2357+ "react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="],
2358+
21202359 "read-yaml-file": ["read-yaml-file@1.1.0", "", { "dependencies": { "graceful-fs": "^4.1.5", "js-yaml": "^3.6.1", "pify": "^4.0.1", "strip-bom": "^3.0.0" } }, "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA=="],
21212360
2361+ "recast": ["recast@0.23.11", "", { "dependencies": { "ast-types": "^0.16.1", "esprima": "~4.0.0", "source-map": "~0.6.1", "tiny-invariant": "^1.3.3", "tslib": "^2.0.1" } }, "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA=="],
2362+
21222363 "regex": ["regex@6.1.0", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg=="],
21232364
21242365 "regex-recursion": ["regex-recursion@6.0.2", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg=="],
@@ -2145,10 +2386,14 @@ · 20 unmodified lines
21452386
21462387 "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="],
21472388
2389+ "reselect": ["reselect@5.1.1", "", {}, "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w=="],
2390+
21482391 "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="],
21492392
21502393 "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="],
21512394
2395+ "rettime": ["rettime@0.10.1", "", {}, "sha512-uyDrIlUEH37cinabq0AX4QbgV4HbFZ/gqoiunWQ1UqBtRvTTytwhNYjE++pO/MjPTZL5KQCf2bEoJ/BJNVQ5Kw=="],
2396+
21522397 "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="],
21532398
21542399 "rollup": ["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.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg=="],
@@ -2157,6 +2402,8 @@ · 2 unmodified lines
21572402
21582403 "rrweb-cssom": ["rrweb-cssom@0.8.0", "", {}, "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw=="],
21592404
2405+ "run-applescript": ["run-applescript@7.1.0", "", {}, "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q=="],
2406+
21602407 "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="],
21612408
21622409 "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
@@ -2179,6 +2426,8 @@ · 16 unmodified lines
21792426
21802427 "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="],
21812428
2429+ "shadcn": ["shadcn@4.1.1", "", { "dependencies": { "@babel/core": "^7.28.0", "@babel/parser": "^7.28.0", "@babel/plugin-transform-typescript": "^7.28.0", "@babel/preset-typescript": "^7.27.1", "@dotenvx/dotenvx": "^1.48.4", "@modelcontextprotocol/sdk": "^1.26.0", "@types/validate-npm-package-name": "^4.0.2", "browserslist": "^4.26.2", "commander": "^14.0.0", "cosmiconfig": "^9.0.0", "dedent": "^1.6.0", "deepmerge": "^4.3.1", "diff": "^8.0.2", "execa": "^9.6.0", "fast-glob": "^3.3.3", "fs-extra": "^11.3.1", "fuzzysort": "^3.1.0", "https-proxy-agent": "^7.0.6", "kleur": "^4.1.5", "msw": "^2.10.4", "node-fetch": "^3.3.2", "open": "^11.0.0", "ora": "^8.2.0", "postcss": "^8.5.6", "postcss-selector-parser": "^7.1.0", "prompts": "^2.4.2", "recast": "^0.23.11", "stringify-object": "^5.0.0", "tailwind-merge": "^3.0.1", "ts-morph": "^26.0.0", "tsconfig-paths": "^4.2.0", "validate-npm-package-name": "^7.0.1", "zod": "^3.24.1", "zod-to-json-schema": "^3.24.6" }, "bin": { "shadcn": "dist/index.js" } }, "sha512-nBj+7LYC9kzV9v9QmRPpoOhfW4KctJVQejywdAt/K+K+z4RYlJOcO2a4AaF7elrRWkfCbgXeGK02liV0KB9HvQ=="],
2430+
21822431 "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
21832432
21842433 "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
@@ -2205,6 +2454,8 @@ · 20 unmodified lines
22052454
22062455 "solid-js": ["solid-js@1.9.11", "", { "dependencies": { "csstype": "^3.1.0", "seroval": "~1.5.0", "seroval-plugins": "~1.5.0" } }, "sha512-WEJtcc5mkh/BnHA6Yrg4whlF8g6QwpmXXRg4P2ztPmcKeHHlH4+djYecBLhSpecZY2RRECXYUwIc/C2r3yzQ4Q=="],
22072456
2457+ "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="],
2458+
22082459 "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
22092460
22102461 "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="],
@@ -2223,14 +2474,20 @@ · 12 unmodified lines
22232474
22242475 "streamdown": ["streamdown@2.4.0", "", { "dependencies": { "clsx": "^2.1.1", "hast-util-to-jsx-runtime": "^2.3.6", "html-url-attributes": "^3.0.1", "marked": "^17.0.1", "rehype-harden": "^1.1.8", "rehype-raw": "^7.0.0", "rehype-sanitize": "^6.0.0", "remark-gfm": "^4.0.1", "remark-parse": "^11.0.0", "remark-rehype": "^11.1.2", "remend": "1.2.2", "tailwind-merge": "^3.4.0", "unified": "^11.0.5", "unist-util-visit": "^5.0.0", "unist-util-visit-parents": "^6.0.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-fRk4HEYNznRLmxoVeT8wsGBwHF6/Yrdey6k+ZrE1Qtp4NyKwm7G/6e2Iw8penY4yLx31TlAHWT5Bsg1weZ9FZg=="],
22252476
2477+ "strict-event-emitter": ["strict-event-emitter@0.5.1", "", {}, "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ=="],
2478+
22262479 "string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="],
22272480
22282481 "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="],
22292482
2483+ "stringify-object": ["stringify-object@5.0.0", "", { "dependencies": { "get-own-enumerable-keys": "^1.0.0", "is-obj": "^3.0.0", "is-regexp": "^3.1.0" } }, "sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg=="],
2484+
22302485 "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
22312486
22322487 "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="],
22332488
2489+ "strip-final-newline": ["strip-final-newline@4.0.0", "", {}, "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw=="],
2490+
22342491 "strip-json-comments": ["strip-json-comments@5.0.3", "", {}, "sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw=="],
22352492
22362493 "strip-literal": ["strip-literal@3.1.0", "", { "dependencies": { "js-tokens": "^9.0.1" } }, "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg=="],
@@ -2241,6 +2498,10 @@ · 4 unmodified lines
22412498
22422499 "symbol-tree": ["symbol-tree@3.2.4", "", {}, "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="],
22432500
2501+ "tabbable": ["tabbable@6.4.0", "", {}, "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg=="],
2502+
2503+ "tagged-tag": ["tagged-tag@1.0.0", "", {}, "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng=="],
2504+
22442505 "tailwind-merge": ["tailwind-merge@3.5.0", "", {}, "sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A=="],
22452506
22462507 "tailwindcss": ["tailwindcss@4.2.1", "", {}, "sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw=="],
@@ -2283,6 +2544,10 @@ · 36 unmodified lines
22832544
22842545 "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="],
22852546
2547+ "ts-morph": ["ts-morph@26.0.0", "", { "dependencies": { "@ts-morph/common": "~0.27.0", "code-block-writer": "^13.0.3" } }, "sha512-ztMO++owQnz8c/gIENcM9XfCEzgoGphTv+nKpYNM1bgsdOVC/jRZuEBf6N+mLLDNg68Kl+GgUZfOySaRiG1/Ug=="],
2548+
2549+ "tsconfig-paths": ["tsconfig-paths@4.2.0", "", { "dependencies": { "json5": "^2.2.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg=="],
2550+
22862551 "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
22872552
22882553 "turbo": ["turbo@2.8.14", "", { "optionalDependencies": { "turbo-darwin-64": "2.8.14", "turbo-darwin-arm64": "2.8.14", "turbo-linux-64": "2.8.14", "turbo-linux-arm64": "2.8.14", "turbo-windows-64": "2.8.14", "turbo-windows-arm64": "2.8.14" }, "bin": { "turbo": "bin/turbo" } }, "sha512-UCTxeMNYT1cKaHiIFdLCQ7ulI+jw5i5uOnJOrRXsgUD7G3+OjlUjwVd7JfeVt2McWSVGjYA3EVW/v1FSsJ5DtA=="],
@@ -2301,6 +2566,8 @@ · 12 unmodified lines
23012566
23022567 "tw-animate-css": ["tw-animate-css@1.4.0", "", {}, "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ=="],
23032568
2569+ "type-fest": ["type-fest@5.5.0", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-PlBfpQwiUvGViBNX84Yxwjsdhd1TUlXr6zjX7eoirtCPIr08NAmxwa+fcYBTeRQxHo9YC9wwF3m9i700sHma8g=="],
2570+
23042571 "type-is": ["type-is@2.0.1", "", { "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw=="],
23052572
23062573 "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
@@ -2309,6 +2576,8 @@ · 2 unmodified lines
23092576
23102577 "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="],
23112578
2579+ "unicorn-magic": ["unicorn-magic@0.3.0", "", {}, "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA=="],
2580+
23122581 "unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="],
23132582
23142583 "unist-util-is": ["unist-util-is@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="],
@@ -2325,12 +2594,22 @@ · 10 unmodified lines
23252594
23262595 "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="],
23272596
2597+ "until-async": ["until-async@3.0.2", "", {}, "sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw=="],
2598+
23282599 "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="],
23292600
2601+ "use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="],
2602+
2603+ "use-sidecar": ["use-sidecar@1.1.3", "", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="],
2604+
23302605 "use-sync-external-store": ["use-sync-external-store@1.6.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w=="],
23312606
2607+ "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="],
2608+
23322609 "uuid": ["uuid@11.1.0", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A=="],
23332610
2611+ "validate-npm-package-name": ["validate-npm-package-name@7.0.2", "", {}, "sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A=="],
2612+
23342613 "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="],
23352614
23362615 "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="],
@@ -2351,6 +2630,8 @@ · 14 unmodified lines
23512630
23522631 "web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="],
23532632
2633+ "web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="],
2634+
23542635 "webidl-conversions": ["webidl-conversions@7.0.0", "", {}, "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g=="],
23552636
23562637 "whatwg-encoding": ["whatwg-encoding@3.1.1", "", { "dependencies": { "iconv-lite": "0.6.3" } }, "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ=="],
@@ -2363,12 +2644,14 @@ · 6 unmodified lines
23632644
23642645 "why-is-node-running": ["why-is-node-running@2.3.0", "", { "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": { "why-is-node-running": "cli.js" } }, "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w=="],
23652646
2366− "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=="],
2647+ "wrap-ansi": ["wrap-ansi@6.2.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="],
23672648
23682649 "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="],
23692650
23702651 "ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="],
23712652
2653+ "wsl-utils": ["wsl-utils@0.3.1", "", { "dependencies": { "is-wsl": "^3.1.0", "powershell-utils": "^0.1.0" } }, "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg=="],
2654+
23722655 "xml-name-validator": ["xml-name-validator@5.0.0", "", {}, "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg=="],
23732656
23742657 "xmlchars": ["xmlchars@2.2.0", "", {}, "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="],
@@ -2383,6 +2666,10 @@ · 8 unmodified lines
23832666
23842667 "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="],
23852668
2669+ "yoctocolors": ["yoctocolors@2.1.2", "", {}, "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug=="],
2670+
2671+ "yoctocolors-cjs": ["yoctocolors-cjs@2.1.3", "", {}, "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw=="],
2672+
23862673 "zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="],
23872674
23882675 "zod-to-json-schema": ["zod-to-json-schema@3.25.1", "", { "peerDependencies": { "zod": "^3.25 || ^4" } }, "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA=="],
@@ -2397,10 +2684,20 @@ · 8 unmodified lines
23972684
23982685 "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
23992686
2687+ "@babel/helper-create-class-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
2688+
24002689 "@changesets/apply-release-plan/prettier": ["prettier@2.8.8", "", { "bin": { "prettier": "bin-prettier.js" } }, "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q=="],
24012690
24022691 "@changesets/write/prettier": ["prettier@2.8.8", "", { "bin": { "prettier": "bin-prettier.js" } }, "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q=="],
24032692
2693+ "@dotenvx/dotenvx/commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="],
2694+
2695+ "@dotenvx/dotenvx/execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="],
2696+
2697+ "@dotenvx/dotenvx/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
2698+
2699+ "@dotenvx/dotenvx/which": ["which@4.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="],
2700+
24042701 "@manypkg/find-root/@types/node": ["@types/node@12.20.55", "", {}, "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ=="],
24052702
24062703 "@manypkg/find-root/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=="],
@@ -2409,6 +2706,16 @@ · 2 unmodified lines
24092706
24102707 "@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=="],
24112708
2709+ "@radix-ui/react-dialog/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="],
2710+
2711+ "@radix-ui/react-dismissable-layer/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="],
2712+
2713+ "@radix-ui/react-focus-scope/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="],
2714+
2715+ "@radix-ui/react-portal/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "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" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="],
2716+
2717+ "@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.4", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA=="],
2718+
24122719 "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.8.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" }, "bundled": true }, "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg=="],
24132720
24142721 "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="],
@@ -2421,20 +2728,42 @@ · 6 unmodified lines
24212728
24222729 "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
24232730
2731+ "@ts-morph/common/minimatch": ["minimatch@10.2.4", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg=="],
2732+
24242733 "cliui/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
24252734
2735+ "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=="],
2736+
24262737 "globby/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
24272738
2739+ "import-fresh/resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="],
2740+
24282741 "log-symbols/is-unicode-supported": ["is-unicode-supported@1.3.0", "", {}, "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ=="],
24292742
24302743 "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
24312744
2745+ "msw/cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="],
2746+
2747+ "msw/tough-cookie": ["tough-cookie@6.0.1", "", { "dependencies": { "tldts": "^7.0.5" } }, "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw=="],
2748+
2749+ "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="],
2750+
24322751 "ora/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="],
24332752
24342753 "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
24352754
2755+ "prompts/kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="],
2756+
24362757 "read-yaml-file/js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="],
24372758
2759+ "restore-cursor/onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="],
2760+
2761+ "router/path-to-regexp": ["path-to-regexp@8.3.0", "", {}, "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA=="],
2762+
2763+ "shadcn/fs-extra": ["fs-extra@11.3.4", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA=="],
2764+
2765+ "shadcn/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="],
2766+
24382767 "string-width/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="],
24392768
24402769 "tough-cookie/tldts": ["tldts@6.1.86", "", { "dependencies": { "tldts-core": "^6.1.86" }, "bin": { "tldts": "bin/cli.js" } }, "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ=="],
@@ -2445,12 +2774,32 @@ · 4 unmodified lines
24452774
24462775 "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
24472776
2777+ "@dotenvx/dotenvx/execa/get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="],
2778+
2779+ "@dotenvx/dotenvx/execa/human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="],
2780+
2781+ "@dotenvx/dotenvx/execa/is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="],
2782+
2783+ "@dotenvx/dotenvx/execa/npm-run-path": ["npm-run-path@4.0.1", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="],
2784+
2785+ "@dotenvx/dotenvx/execa/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="],
2786+
2787+ "@dotenvx/dotenvx/execa/strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="],
2788+
2789+ "@dotenvx/dotenvx/which/isexe": ["isexe@3.1.5", "", {}, "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w=="],
2790+
2791+ "@ts-morph/common/minimatch/brace-expansion": ["brace-expansion@5.0.5", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ=="],
2792+
24482793 "cliui/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
24492794
24502795 "ora/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
24512796
24522797 "read-yaml-file/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="],
24532798
2799+ "shadcn/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="],
2800+
2801+ "shadcn/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="],
2802+
24542803 "string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
24552804
24562805 "tough-cookie/tldts/tldts-core": ["tldts-core@6.1.86", "", {}, "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA=="],
@@ -2458,5 +2807,7 @@ · 1 unmodified line
24582807 "wrap-ansi/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
24592808
24602809 "yargs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
2810+
2811+ "@ts-morph/common/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="],
24612812 }
24622813 }
packages/clients/react/components.json+21−0
@@ -0,0 +1,21 @@
1+{
2+ "$schema": "https://ui.shadcn.com/schema.json",
3+ "style": "base-nova",
4+ "rsc": false,
5+ "tsx": true,
6+ "tailwind": {
7+ "config": "",
8+ "css": "../../apps/web/src/globals.css",
9+ "baseColor": "neutral",
10+ "cssVariables": true,
11+ "prefix": ""
12+ },
13+ "iconLibrary": "lucide",
14+ "aliases": {
15+ "components": "@/components/ui",
16+ "utils": "@/lib/utils",
17+ "hooks": "@/hooks",
18+ "lib": "@/lib",
19+ "ui": "@/components/ui"
20+ }
21+}
packages/clients/react/package.json+8−3
@@ -5,7 +5,10 @@ · 4 unmodified lines
55 "exports": {
66 ".": "./src/index.ts",
77 "./plugins": "./src/plugins/index.ts",
8− "./source-plugins": "./src/source-plugins/index.ts"
8+ "./source-plugins": "./src/source-plugins/index.ts",
9+ "./components/*": "./src/plugins/components/ui/*.tsx",
10+ "./lib/*": "./src/plugins/lib/*.ts",
11+ "./hooks/*": "./src/hooks/*.ts"
912 },
1013 "scripts": {
1114 "typecheck": "bunx tsc --noEmit -p tsconfig.json",
@@ -13,15 +16,17 @@ · 1 unmodified line
1316 "test:watch": "bunx vitest"
1417 },
1518 "dependencies": {
16− "@shikijs/langs": "^4.0.1",
17− "@shikijs/themes": "^4.0.1",
19+ "@base-ui/react": "^1.3.0",
1820 "@effect-atom/atom": "0.5.3",
1921 "@effect-atom/atom-react": "0.5.0",
2022 "@effect/platform": "catalog:",
2123 "@executor/platform-api": "workspace:*",
2224 "@executor/platform-sdk": "workspace:*",
25+ "@shikijs/langs": "^4.0.1",
26+ "@shikijs/themes": "^4.0.1",
2327 "class-variance-authority": "^0.7.1",
2428 "clsx": "^2.1.1",
29+ "cmdk": "^1.1.1",
2530 "effect": "catalog:",
2631 "shiki": "^4.0.1",
2732 "streamdown": "^2.3.0",
packages/clients/react/src/components/secret-reference-field.tsx+35−44
@@ -290,53 +290,33 @@ export function SecretReferenceField(props: SecretReferenceFieldProps) { · 289 unmodified lines
290290 <div className="grid gap-2">
291291 <span className="text-xs font-medium text-foreground">{props.label}</span>
292292
293− <button
294− type="button"
295− onClick={() => {
296− setShowCreate(false);
297− setShowFinder((current) => !current);
293+ <input
294+ value={showFinder ? finderQuery : (selectedSecret ? (selectedSecret.name ?? selectedSecret.id) : "")}
295+ onChange={(event) => {
296+ setFinderQuery(event.target.value);
297+ if (!showFinder) {
298+ setShowFinder(true);
299+ setShowCreate(false);
300+ }
298301 }}
299− className="flex min-h-9 w-full items-center justify-between gap-3 rounded-lg border border-input bg-background px-3 py-2 text-left text-sm text-foreground outline-none transition-colors hover:bg-accent/30 focus:border-ring focus:ring-1 focus:ring-ring/25"
300− >
301− <div className="min-w-0">
302− <div className="truncate">
303− {selectedSecret
304− ? (selectedSecret.name ?? selectedSecret.id)
305− : props.emptyLabel}
306− </div>
307− {selectedSecret && (
308− <div className="truncate text-[11px] text-muted-foreground">
309− {selectedSecret.storeName} · {selectedSecret.storeKind}
310− </div>
311− )}
312− </div>
313− <div className="shrink-0 text-[11px] font-medium text-muted-foreground">
314− {showFinder ? "Close" : "Choose"}
315− </div>
316− </button>
317−
318− <div className="flex flex-wrap items-center gap-2">
319− <button
320− type="button"
321− onClick={() => {
322− setShowFinder(false);
323− setShowCreate((current) => !current);
324− }}
325− className={buttonClassName}
326− >
327− {showCreate ? "Hide create" : "Create new secret"}
328− </button>
329− </div>
302+ onFocus={() => {
303+ if (!showFinder) {
304+ setShowFinder(true);
305+ setShowCreate(false);
306+ }
307+ }}
308+ onBlur={(event) => {
309+ // Don't close if clicking inside the results
310+ if (event.relatedTarget?.closest("[data-secret-results]")) return;
311+ setShowFinder(false);
312+ setFinderQuery("");
313+ }}
314+ placeholder={selectedSecret ? (selectedSecret.name ?? selectedSecret.id) : props.emptyLabel}
315+ className="h-9 w-full rounded-lg border border-input bg-background px-3 text-sm outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
316+ />
330317
331318 {showFinder && (
332− <div className="space-y-3 border-l-2 border-border pl-4">
333− <input
334− value={finderQuery}
335− onChange={(event) => setFinderQuery(event.target.value)}
336− placeholder="Search all secrets"
337− className="h-9 w-full rounded-lg border border-input bg-background px-3 text-sm outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
338− autoFocus
339− />
319+ <div className="space-y-3" data-secret-results>
340320
341321 {finderError && (
342322 <div className="rounded-lg border border-destructive/30 bg-destructive/8 px-3 py-2 text-xs text-destructive">
@@ -345,6 +325,17 @@ export function SecretReferenceField(props: SecretReferenceFieldProps) { · 2 unmodified lines
345325 )}
346326
347327 <div className="max-h-64 space-y-2 overflow-y-auto pr-1">
328+ <button
329+ type="button"
330+ onClick={() => {
331+ setShowFinder(false);
332+ setShowCreate(true);
333+ }}
334+ className="flex w-full items-start justify-between gap-3 rounded-lg border border-input bg-background px-3 py-2 text-left transition-colors hover:bg-accent/40"
335+ >
336+ <span className="text-sm text-foreground">Create new secret</span>
337+ </button>
338+
348339 {finderStatus === "pending" && (
349340 <div className="rounded-lg border border-border px-3 py-2 text-xs text-muted-foreground">
350341 Loading secrets...
packages/clients/react/src/plugins/components/badge.tsx+0−44
@@ -1,44 +0,0 @@
1−import type { HTMLAttributes } from "react";
2−import { cva, type VariantProps } from "class-variance-authority";
3−
4−import { cn } from "../lib/cn";
5−
6−const badgeVariants = cva(
7− "inline-flex items-center rounded-full border px-2 py-0.5 text-[10px] font-medium tracking-wide uppercase",
8− {
9− variants: {
10− variant: {
11− default: "border-transparent bg-primary/15 text-primary",
12− secondary: "border-transparent bg-secondary text-secondary-foreground",
13− outline: "border-border text-muted-foreground",
14− muted: "border-transparent bg-muted text-muted-foreground",
15− get: "border-[var(--method-get)]/20 bg-[var(--method-get)]/10 text-[var(--method-get)]",
16− post: "border-[var(--method-post)]/20 bg-[var(--method-post)]/10 text-[var(--method-post)]",
17− put: "border-[var(--method-put)]/20 bg-[var(--method-put)]/10 text-[var(--method-put)]",
18− delete: "border-[var(--method-delete)]/20 bg-[var(--method-delete)]/10 text-[var(--method-delete)]",
19− destructive: "border-destructive/20 bg-destructive/10 text-destructive",
20− },
21− },
22− defaultVariants: {
23− variant: "default",
24− },
25− },
26−);
27−
28−export type BadgeProps = HTMLAttributes<HTMLSpanElement> & VariantProps<typeof badgeVariants>;
29−
30−export function Badge({ className, variant, ...props }: BadgeProps) {
31− return <span className={cn(badgeVariants({ variant }), className)} {...props} />;
32−}
33−
34−export function MethodBadge({ method }: { method: string }) {
35− const variant = ({
36− GET: "get",
37− POST: "post",
38− PUT: "put",
39− PATCH: "put",
40− DELETE: "delete",
41− } as const)[method.toUpperCase()] ?? "outline";
42−
43− return <Badge variant={variant}>{method}</Badge>;
44−}
packages/clients/react/src/plugins/components/code-block.tsx+6−3
@@ -2,6 +2,7 @@ import { useCallback, useEffect, useRef, useState } from "react"; · 1 unmodified line
22
33 import { codeToHtml, resolveLang } from "../lib/shiki";
44 import { cn } from "../lib/cn";
5+import { Button } from "./ui/button";
56 import { IconCheck, IconCopy } from "./icons";
67
78 const highlightCache = new Map<string, string>();
@@ -80,14 +81,16 @@ export function CodeBlock(props: { · 72 unmodified lines
8081
8182 return (
8283 <div className={cn("group relative overflow-auto", className)}>
83− <button
84+ <Button
8485 type="button"
86+ variant="outline"
87+ size="icon"
8588 onClick={handleCopy}
86− className="absolute right-2 top-2 z-10 rounded-md border border-border bg-card/90 p-1.5 text-muted-foreground/40 opacity-0 backdrop-blur-sm transition-all hover:text-foreground group-hover:opacity-100"
89+ className="absolute right-2 top-2 z-10 bg-card/90 p-1.5 text-muted-foreground/40 opacity-0 backdrop-blur-sm hover:text-foreground group-hover:opacity-100"
8790 title="Copy to clipboard"
8891 >
8992 {copied ? <IconCheck className="size-3" /> : <IconCopy className="size-3" />}
90− </button>
93+ </Button>
9194
9295 {html ? (
9396 <div
packages/clients/react/src/plugins/components/source-tool-explorer.tsx+1−1
@@ -7,7 +7,7 @@ import { · 6 unmodified lines
77 useSourceInspection,
88 useSourceToolDetail,
99 } from "../../hooks/sources";
10−import { Badge } from "./badge";
10+import { Badge } from "./ui/badge";
1111 import { LoadableBlock } from "./loadable";
1212 import {
1313 SourceToolModelWorkbench,
packages/clients/react/src/plugins/components/source-tool-workbench.tsx+37−29
@@ -8,7 +8,7 @@ import type { · 7 unmodified lines
88 SourceInspection,
99 SourceInspectionToolDetail,
1010 } from "@executor/platform-sdk/schema";
11−import { MethodBadge } from "./badge";
11+import { MethodBadge } from "./ui/badge";
1212 import { CodeBlock } from "./code-block";
1313 import { DocumentPanel } from "./document-panel";
1414 import { EmptyState, LoadableBlock } from "./loadable";
@@ -22,6 +22,8 @@ import { · 7 unmodified lines
2222 IconSearch,
2323 IconTool,
2424 } from "./icons";
25+import { Button } from "./ui/button";
26+import { Input } from "./ui/input";
2527 import { cn } from "../lib/cn";
2628
2729 type ToolTreeNode = {
@@ -173,16 +175,18 @@ const CopyButton = (props: { · 145 unmodified lines
173175 copiedField: string | null;
174176 onCopy: (text: string, field: string) => void | Promise<void>;
175177 }) => (
176− <button
178+ <Button
177179 type="button"
180+ variant="ghost"
181+ size="icon"
178182 onClick={() => {
179183 void props.onCopy(props.text, props.field);
180184 }}
181− className="shrink-0 rounded p-1 text-muted-foreground/30 transition-colors hover:text-muted-foreground"
185+ className="size-6 shrink-0 text-muted-foreground/30 hover:text-muted-foreground"
182186 title={`Copy ${props.field}`}
183187 >
184188 {props.copiedField === props.field ? <IconCheck /> : <IconCopy />}
185− </button>
189+ </Button>
186190 );
187191
188192 const SourceToolTree = (props: {
@@ -295,17 +299,19 @@ const SourceToolTreeNodeView = (props: { · 106 unmodified lines
295299 <div>
296300 {node.tool ? (
297301 <div className="flex items-center">
298− <button
302+ <Button
299303 type="button"
304+ variant="ghost"
305+ size="icon"
300306 onClick={() => setOpen((value) => !value)}
301− className="shrink-0 rounded p-0.5 text-muted-foreground/30 hover:text-muted-foreground"
307+ className="shrink-0 size-auto rounded p-0.5 text-muted-foreground/30 hover:text-muted-foreground"
302308 style={{ marginLeft: paddingLeft }}
303309 >
304310 <IconChevron
305311 className={cn("shrink-0 transition-transform duration-150", open && "rotate-90")}
306312 style={{ width: 8, height: 8 }}
307313 />
308− </button>
314+ </Button>
309315 <SourceToolListItem
310316 tool={node.tool as SourceInspection["tools"][number]}
311317 active={node.tool?.path === selectedToolPath}
@@ -318,11 +324,12 @@ const SourceToolTreeNodeView = (props: { · 6 unmodified lines
318324 />
319325 </div>
320326 ) : (
321− <button
327+ <Button
322328 type="button"
329+ variant="ghost"
323330 onClick={() => setOpen((value) => !value)}
324331 className={cn(
325− "group flex w-full items-center gap-1.5 rounded-md py-1 pr-2.5 text-[12px] transition-colors hover:bg-accent/40",
332+ "group flex h-auto w-full items-center gap-1.5 rounded-md py-1 pr-2.5 text-[12px] hover:bg-accent/40",
326333 open ? "text-foreground/80" : "text-muted-foreground/60",
327334 )}
328335 style={{ paddingLeft }}
@@ -344,7 +351,7 @@ const SourceToolTreeNodeView = (props: { · 15 unmodified lines
344351 <span className="shrink-0 tabular-nums text-[10px] text-muted-foreground/25">
345352 {leafCount}
346353 </span>
347− </button>
354+ </Button>
348355 )}
349356
350357 {open && hasChildren && (
@@ -397,15 +404,16 @@ const SourceToolListItem = (props: { · 46 unmodified lines
397404 : props.tool.path;
398405
399406 return (
400− <button
407+ <Button
401408 ref={ref}
402409 type="button"
410+ variant="ghost"
403411 onMouseEnter={() => {
404412 props.prefetch(props.sourceId, props.tool.path);
405413 }}
406414 onClick={props.onSelect}
407415 className={cn(
408− "group flex w-full items-center gap-2 rounded-md py-1.5 pr-2.5 text-left transition-colors",
416+ "group flex h-auto w-full items-center gap-2 rounded-md py-1.5 pr-2.5 text-left",
409417 props.active
410418 ? "border-l-2 border-l-primary bg-primary/10 text-foreground"
411419 : "text-foreground/70 hover:bg-accent/50 hover:text-foreground",
@@ -418,7 +426,7 @@ const SourceToolListItem = (props: { · 6 unmodified lines
418426 {highlightMatch(label, props.search)}
419427 </span>
420428 {props.tool.method && <MethodBadge method={props.tool.method} />}
421− </button>
429+ </Button>
422430 );
423431 };
424432
@@ -599,21 +607,23 @@ export const SourceToolModelWorkbench = ( · 174 unmodified lines
599607 <div className="shrink-0 border-b border-border px-3 py-2">
600608 <div className="flex h-8 items-center gap-2 rounded-md border border-input bg-background px-2.5">
601609 <IconSearch className="size-3.5 shrink-0 text-muted-foreground/40" />
602− <input
610+ <Input
603611 ref={searchRef}
604612 value={search}
605613 onChange={(event) => setSearch(event.target.value)}
606614 placeholder={`Filter ${props.bundle.toolCount} tools...`}
607− className="min-w-0 flex-1 bg-transparent text-[13px] outline-none placeholder:text-muted-foreground/40"
615+ className="min-w-0 flex-1 border-0 bg-transparent p-0 text-[13px] shadow-none ring-0 focus:border-0 focus:ring-0"
608616 />
609617 {search.length > 0 ? (
610− <button
618+ <Button
611619 type="button"
620+ variant="ghost"
621+ size="icon"
612622 onClick={() => setSearch("")}
613− className="shrink-0 rounded p-0.5 text-muted-foreground/40 hover:text-foreground"
623+ className="size-5 shrink-0 text-muted-foreground/40 hover:text-foreground"
614624 >
615625 <IconClose />
616− </button>
626+ </Button>
617627 ) : (
618628 <kbd className="shrink-0 rounded border border-border bg-muted px-1 py-px text-[10px] leading-none text-muted-foreground/50">
619629 /
@@ -622,7 +632,7 @@ export const SourceToolModelWorkbench = ( · 2 unmodified lines
622632 </div>
623633 </div>
624634
625− <div className="flex-1 overflow-y-auto max-w-[300px]">
635+ <div className="flex-1 overflow-y-auto">
626636 {filteredTools.length === 0 ? (
627637 <div className="p-4 text-center text-[13px] text-muted-foreground/50">
628638 {terms.length > 0 ? "No tools match your filter" : "No tools available"}
@@ -687,19 +697,16 @@ export const SourceToolDiscoveryPanel = < · 58 unmodified lines
687697 >
688698 <div className="relative flex-1">
689699 <IconSearch className="absolute left-3 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground/40" />
690− <input
700+ <Input
691701 value={draftQuery}
692702 onChange={(event) => setDraftQuery(event.target.value)}
693703 placeholder="Search tools..."
694− className="h-9 w-full rounded-md border border-input bg-background pl-9 pr-3 text-sm outline-none transition-colors placeholder:text-muted-foreground/40 focus:border-ring focus:ring-1 focus:ring-ring/30"
704+ className="pl-9 pr-3 text-sm"
695705 />
696706 </div>
697− <button
698− type="submit"
699− className="inline-flex h-9 items-center rounded-md border border-input bg-card px-3 text-xs font-medium text-foreground transition-colors hover:bg-accent/50"
700− >
707+ <Button type="submit" variant="outline">
701708 Search
702− </button>
709+ </Button>
703710 </form>
704711 </div>
705712
@@ -719,11 +726,12 @@ export const SourceToolDiscoveryPanel = < · 13 unmodified lines
719726 ) : (
720727 <div className="max-w-3xl space-y-2">
721728 {result.results.map((item, index) => (
722− <button
729+ <Button
723730 key={item.path}
724731 type="button"
732+ variant="outline"
725733 onClick={() => props.onOpenTool(item.path)}
726− className="group w-full rounded-lg border border-border bg-card/60 p-3.5 text-left transition-all hover:border-primary/30 hover:shadow-sm"
734+ className="group h-auto w-full rounded-lg bg-card/60 p-3.5 text-left hover:border-primary/30 hover:shadow-sm"
727735 >
728736 <div className="mb-1.5 flex items-center justify-between gap-3">
729737 <div className="flex min-w-0 items-center gap-2.5">
@@ -743,7 +751,7 @@ export const SourceToolDiscoveryPanel = < · 13 unmodified lines
743751 {item.description}
744752 </p>
745753 )}
746− </button>
754+ </Button>
747755 ))}
748756 </div>
749757 )
packages/clients/react/src/plugins/components/ui/alert.tsx+80−0
@@ -0,0 +1,80 @@
1+import * as React from "react";
2+import { cva, type VariantProps } from "class-variance-authority";
3+
4+import { cn } from "../../lib/cn";
5+
6+const alertVariants = cva(
7+ "group/alert relative grid w-full gap-0.5 rounded-lg border px-2.5 py-2 text-left text-sm has-data-[slot=alert-action]:relative has-data-[slot=alert-action]:pr-18 has-[>svg]:grid-cols-[auto_1fr] has-[>svg]:gap-x-2 *:[svg]:row-span-2 *:[svg]:translate-y-0.5 *:[svg]:text-current *:[svg:not([class*='size-'])]:size-4",
8+ {
9+ variants: {
10+ variant: {
11+ default: "bg-card text-card-foreground",
12+ destructive:
13+ "bg-card text-destructive *:data-[slot=alert-description]:text-destructive/90 *:[svg]:text-current",
14+ warning:
15+ "border-amber-500/25 bg-amber-500/8 text-amber-700 dark:text-amber-400",
16+ success:
17+ "border-primary/25 bg-primary/8 text-primary",
18+ },
19+ },
20+ defaultVariants: {
21+ variant: "default",
22+ },
23+ },
24+);
25+
26+function Alert({
27+ className,
28+ variant,
29+ ...props
30+}: React.ComponentProps<"div"> & VariantProps<typeof alertVariants>) {
31+ return (
32+ <div
33+ data-slot="alert"
34+ role="alert"
35+ className={cn(alertVariants({ variant }), className)}
36+ {...props}
37+ />
38+ );
39+}
40+
41+function AlertTitle({ className, ...props }: React.ComponentProps<"div">) {
42+ return (
43+ <div
44+ data-slot="alert-title"
45+ className={cn(
46+ "font-heading font-medium group-has-[>svg]/alert:col-start-2 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground",
47+ className,
48+ )}
49+ {...props}
50+ />
51+ );
52+}
53+
54+function AlertDescription({
55+ className,
56+ ...props
57+}: React.ComponentProps<"div">) {
58+ return (
59+ <div
60+ data-slot="alert-description"
61+ className={cn(
62+ "text-sm text-balance text-muted-foreground md:text-pretty [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4",
63+ className,
64+ )}
65+ {...props}
66+ />
67+ );
68+}
69+
70+function AlertAction({ className, ...props }: React.ComponentProps<"div">) {
71+ return (
72+ <div
73+ data-slot="alert-action"
74+ className={cn("absolute top-2 right-2", className)}
75+ {...props}
76+ />
77+ );
78+}
79+
80+export { Alert, alertVariants, AlertTitle, AlertDescription, AlertAction };
packages/clients/react/src/plugins/components/ui/badge.tsx+57−0
@@ -0,0 +1,57 @@
1+import { cva, type VariantProps } from "class-variance-authority";
2+
3+import { cn } from "../../lib/cn";
4+
5+const badgeVariants = cva(
6+ "inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all [&>svg]:pointer-events-none [&>svg]:size-3!",
7+ {
8+ variants: {
9+ variant: {
10+ default: "bg-primary text-primary-foreground",
11+ secondary: "bg-secondary text-secondary-foreground",
12+ destructive:
13+ "bg-destructive/10 text-destructive dark:bg-destructive/20",
14+ outline: "border-border text-foreground",
15+ muted: "bg-muted text-muted-foreground",
16+ get: "border-[var(--method-get)]/20 bg-[var(--method-get)]/10 text-[var(--method-get)]",
17+ post: "border-[var(--method-post)]/20 bg-[var(--method-post)]/10 text-[var(--method-post)]",
18+ put: "border-[var(--method-put)]/20 bg-[var(--method-put)]/10 text-[var(--method-put)]",
19+ delete:
20+ "border-[var(--method-delete)]/20 bg-[var(--method-delete)]/10 text-[var(--method-delete)]",
21+ },
22+ },
23+ defaultVariants: {
24+ variant: "default",
25+ },
26+ },
27+);
28+
29+export type BadgeProps = React.ComponentProps<"span"> &
30+ VariantProps<typeof badgeVariants>;
31+
32+function Badge({ className, variant, ...props }: BadgeProps) {
33+ return (
34+ <span
35+ data-slot="badge"
36+ className={cn(badgeVariants({ variant }), className)}
37+ {...props}
38+ />
39+ );
40+}
41+
42+function MethodBadge({ method }: { method: string }) {
43+ const variant =
44+ (
45+ {
46+ GET: "get",
47+ POST: "post",
48+ PUT: "put",
49+ PATCH: "put",
50+ DELETE: "delete",
51+ } as const
52+ )[method.toUpperCase()] ?? "outline";
53+
54+ return <Badge variant={variant}>{method}</Badge>;
55+}
56+
57+export { Badge, badgeVariants, MethodBadge };
packages/clients/react/src/plugins/components/ui/button.tsx+63−0
@@ -0,0 +1,63 @@
1+import { Button as ButtonPrimitive } from "@base-ui/react/button";
2+import { cva, type VariantProps } from "class-variance-authority";
3+
4+import { cn } from "../../lib/cn";
5+
6+const buttonVariants = cva(
7+ "group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
8+ {
9+ variants: {
10+ variant: {
11+ default: "bg-primary text-primary-foreground [a]:hover:bg-primary/80",
12+ outline:
13+ "border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",
14+ secondary:
15+ "bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",
16+ ghost:
17+ "hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",
18+ destructive:
19+ "bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",
20+ "destructive-outline":
21+ "border-destructive/25 bg-destructive/5 text-destructive hover:bg-destructive/10",
22+ link: "text-primary underline-offset-4 hover:underline",
23+ },
24+ size: {
25+ default:
26+ "h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
27+ xs: "h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",
28+ sm: "h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",
29+ lg: "h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3",
30+ icon: "size-8",
31+ "icon-xs":
32+ "size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3",
33+ "icon-sm":
34+ "size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg",
35+ "icon-lg": "size-9",
36+ },
37+ },
38+ defaultVariants: {
39+ variant: "default",
40+ size: "default",
41+ },
42+ },
43+);
44+
45+export type ButtonProps = ButtonPrimitive.Props &
46+ VariantProps<typeof buttonVariants>;
47+
48+function Button({
49+ className,
50+ variant = "default",
51+ size = "default",
52+ ...props
53+}: ButtonProps) {
54+ return (
55+ <ButtonPrimitive
56+ data-slot="button"
57+ className={cn(buttonVariants({ variant, size, className }))}
58+ {...props}
59+ />
60+ );
61+}
62+
63+export { Button, buttonVariants };
packages/clients/react/src/plugins/components/ui/card.tsx+103−0
@@ -0,0 +1,103 @@
1+import * as React from "react";
2+
3+import { cn } from "../../lib/cn";
4+
5+function Card({
6+ className,
7+ size = "default",
8+ ...props
9+}: React.ComponentProps<"div"> & { size?: "default" | "sm" }) {
10+ return (
11+ <div
12+ data-slot="card"
13+ data-size={size}
14+ className={cn(
15+ "group/card flex flex-col gap-4 overflow-hidden rounded-xl bg-card py-4 text-sm text-card-foreground ring-1 ring-foreground/10 has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:gap-3 data-[size=sm]:py-3 data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl",
16+ className,
17+ )}
18+ {...props}
19+ />
20+ );
21+}
22+
23+function CardHeader({ className, ...props }: React.ComponentProps<"div">) {
24+ return (
25+ <div
26+ data-slot="card-header"
27+ className={cn(
28+ "group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-t-xl px-4 group-data-[size=sm]/card:px-3 has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-4 group-data-[size=sm]/card:[.border-b]:pb-3",
29+ className,
30+ )}
31+ {...props}
32+ />
33+ );
34+}
35+
36+function CardTitle({ className, ...props }: React.ComponentProps<"div">) {
37+ return (
38+ <div
39+ data-slot="card-title"
40+ className={cn(
41+ "font-heading text-base leading-snug font-medium group-data-[size=sm]/card:text-sm",
42+ className,
43+ )}
44+ {...props}
45+ />
46+ );
47+}
48+
49+function CardDescription({ className, ...props }: React.ComponentProps<"div">) {
50+ return (
51+ <div
52+ data-slot="card-description"
53+ className={cn("text-sm text-muted-foreground", className)}
54+ {...props}
55+ />
56+ );
57+}
58+
59+function CardAction({ className, ...props }: React.ComponentProps<"div">) {
60+ return (
61+ <div
62+ data-slot="card-action"
63+ className={cn(
64+ "col-start-2 row-span-2 row-start-1 self-start justify-self-end",
65+ className,
66+ )}
67+ {...props}
68+ />
69+ );
70+}
71+
72+function CardContent({ className, ...props }: React.ComponentProps<"div">) {
73+ return (
74+ <div
75+ data-slot="card-content"
76+ className={cn("px-4 group-data-[size=sm]/card:px-3", className)}
77+ {...props}
78+ />
79+ );
80+}
81+
82+function CardFooter({ className, ...props }: React.ComponentProps<"div">) {
83+ return (
84+ <div
85+ data-slot="card-footer"
86+ className={cn(
87+ "flex items-center rounded-b-xl border-t bg-muted/50 p-4 group-data-[size=sm]/card:p-3",
88+ className,
89+ )}
90+ {...props}
91+ />
92+ );
93+}
94+
95+export {
96+ Card,
97+ CardHeader,
98+ CardFooter,
99+ CardTitle,
100+ CardAction,
101+ CardDescription,
102+ CardContent,
103+};
packages/clients/react/src/plugins/components/ui/command.tsx+144−0
@@ -0,0 +1,144 @@
1+import * as React from "react";
2+import { Command as CommandPrimitive } from "cmdk";
3+
4+import { cn } from "../../lib/cn";
5+import { IconSearch } from "../icons";
6+
7+function Command({
8+ className,
9+ ...props
10+}: React.ComponentProps<typeof CommandPrimitive>) {
11+ return (
12+ <CommandPrimitive
13+ data-slot="command"
14+ className={cn(
15+ "flex size-full flex-col overflow-hidden rounded-xl bg-popover p-1 text-popover-foreground",
16+ className,
17+ )}
18+ {...props}
19+ />
20+ );
21+}
22+
23+function CommandInput({
24+ className,
25+ ...props
26+}: React.ComponentProps<typeof CommandPrimitive.Input>) {
27+ return (
28+ <div
29+ data-slot="command-input-wrapper"
30+ className="flex items-center gap-2 border-b border-border px-2.5 pb-2"
31+ >
32+ <IconSearch className="size-3.5 shrink-0 opacity-50" />
33+ <CommandPrimitive.Input
34+ data-slot="command-input"
35+ className={cn(
36+ "w-full bg-transparent text-sm outline-hidden placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50",
37+ className,
38+ )}
39+ {...props}
40+ />
41+ </div>
42+ );
43+}
44+
45+function CommandList({
46+ className,
47+ ...props
48+}: React.ComponentProps<typeof CommandPrimitive.List>) {
49+ return (
50+ <CommandPrimitive.List
51+ data-slot="command-list"
52+ className={cn(
53+ "no-scrollbar max-h-72 scroll-py-1 overflow-x-hidden overflow-y-auto outline-none",
54+ className,
55+ )}
56+ {...props}
57+ />
58+ );
59+}
60+
61+function CommandEmpty({
62+ className,
63+ ...props
64+}: React.ComponentProps<typeof CommandPrimitive.Empty>) {
65+ return (
66+ <CommandPrimitive.Empty
67+ data-slot="command-empty"
68+ className={cn("py-6 text-center text-sm", className)}
69+ {...props}
70+ />
71+ );
72+}
73+
74+function CommandGroup({
75+ className,
76+ ...props
77+}: React.ComponentProps<typeof CommandPrimitive.Group>) {
78+ return (
79+ <CommandPrimitive.Group
80+ data-slot="command-group"
81+ className={cn(
82+ "overflow-hidden p-1 text-foreground **:[[cmdk-group-heading]]:px-2 **:[[cmdk-group-heading]]:py-1.5 **:[[cmdk-group-heading]]:text-xs **:[[cmdk-group-heading]]:font-medium **:[[cmdk-group-heading]]:text-muted-foreground",
83+ className,
84+ )}
85+ {...props}
86+ />
87+ );
88+}
89+
90+function CommandSeparator({
91+ className,
92+ ...props
93+}: React.ComponentProps<typeof CommandPrimitive.Separator>) {
94+ return (
95+ <CommandPrimitive.Separator
96+ data-slot="command-separator"
97+ className={cn("-mx-1 h-px bg-border", className)}
98+ {...props}
99+ />
100+ );
101+}
102+
103+function CommandItem({
104+ className,
105+ ...props
106+}: React.ComponentProps<typeof CommandPrimitive.Item>) {
107+ return (
108+ <CommandPrimitive.Item
109+ data-slot="command-item"
110+ className={cn(
111+ "group/command-item relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 data-selected:bg-muted data-selected:text-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
112+ className,
113+ )}
114+ {...props}
115+ />
116+ );
117+}
118+
119+function CommandShortcut({
120+ className,
121+ ...props
122+}: React.ComponentProps<"span">) {
123+ return (
124+ <span
125+ data-slot="command-shortcut"
126+ className={cn(
127+ "ml-auto text-xs tracking-widest text-muted-foreground group-data-selected/command-item:text-foreground",
128+ className,
129+ )}
130+ {...props}
131+ />
132+ );
133+}
134+
135+export {
136+ Command,
137+ CommandInput,
138+ CommandList,
139+ CommandEmpty,
140+ CommandGroup,
141+ CommandItem,
142+ CommandShortcut,
143+ CommandSeparator,
144+};
packages/clients/react/src/plugins/components/ui/dialog.tsx+159−0
@@ -0,0 +1,159 @@
1+"use client"
2+
3+import * as React from "react"
4+import { Dialog as DialogPrimitive } from "@base-ui/react/dialog"
5+
6+import { cn } from "../../lib/cn"
7+import { Button } from "./button"
8+import { IconClose } from "../icons"
9+
10+function Dialog({ ...props }: DialogPrimitive.Root.Props) {
11+ return <DialogPrimitive.Root data-slot="dialog" {...props} />
12+}
13+
14+function DialogTrigger({ ...props }: DialogPrimitive.Trigger.Props) {
15+ return <DialogPrimitive.Trigger data-slot="dialog-trigger" {...props} />
16+}
17+
18+function DialogPortal({ ...props }: DialogPrimitive.Portal.Props) {
19+ return <DialogPrimitive.Portal data-slot="dialog-portal" {...props} />
20+}
21+
22+function DialogClose({ ...props }: DialogPrimitive.Close.Props) {
23+ return <DialogPrimitive.Close data-slot="dialog-close" {...props} />
24+}
25+
26+function DialogOverlay({
27+ className,
28+ ...props
29+}: DialogPrimitive.Backdrop.Props) {
30+ return (
31+ <DialogPrimitive.Backdrop
32+ data-slot="dialog-overlay"
33+ className={cn(
34+ "fixed inset-0 isolate z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0",
35+ className
36+ )}
37+ {...props}
38+ />
39+ )
40+}
41+
42+function DialogContent({
43+ className,
44+ children,
45+ showCloseButton = true,
46+ ...props
47+}: DialogPrimitive.Popup.Props & {
48+ showCloseButton?: boolean
49+}) {
50+ return (
51+ <DialogPortal>
52+ <DialogOverlay />
53+ <DialogPrimitive.Popup
54+ data-slot="dialog-content"
55+ className={cn(
56+ "fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl bg-popover p-4 text-sm text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
57+ className
58+ )}
59+ {...props}
60+ >
61+ {children}
62+ {showCloseButton && (
63+ <DialogPrimitive.Close
64+ data-slot="dialog-close"
65+ render={
66+ <Button
67+ variant="ghost"
68+ className="absolute top-2 right-2"
69+ size="icon-sm"
70+ />
71+ }
72+ >
73+ <IconClose className="size-3.5" />
74+ <span className="sr-only">Close</span>
75+ </DialogPrimitive.Close>
76+ )}
77+ </DialogPrimitive.Popup>
78+ </DialogPortal>
79+ )
80+}
81+
82+function DialogHeader({ className, ...props }: React.ComponentProps<"div">) {
83+ return (
84+ <div
85+ data-slot="dialog-header"
86+ className={cn("flex flex-col gap-2", className)}
87+ {...props}
88+ />
89+ )
90+}
91+
92+function DialogFooter({
93+ className,
94+ showCloseButton = false,
95+ children,
96+ ...props
97+}: React.ComponentProps<"div"> & {
98+ showCloseButton?: boolean
99+}) {
100+ return (
101+ <div
102+ data-slot="dialog-footer"
103+ className={cn(
104+ "-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 sm:flex-row sm:justify-end",
105+ className
106+ )}
107+ {...props}
108+ >
109+ {children}
110+ {showCloseButton && (
111+ <DialogPrimitive.Close render={<Button variant="outline" />}>
112+ Close
113+ </DialogPrimitive.Close>
114+ )}
115+ </div>
116+ )
117+}
118+
119+function DialogTitle({ className, ...props }: DialogPrimitive.Title.Props) {
120+ return (
121+ <DialogPrimitive.Title
122+ data-slot="dialog-title"
123+ className={cn(
124+ "text-base leading-none font-medium",
125+ className
126+ )}
127+ {...props}
128+ />
129+ )
130+}
131+
132+function DialogDescription({
133+ className,
134+ ...props
135+}: DialogPrimitive.Description.Props) {
136+ return (
137+ <DialogPrimitive.Description
138+ data-slot="dialog-description"
139+ className={cn(
140+ "text-sm text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground",
141+ className
142+ )}
143+ {...props}
144+ />
145+ )
146+}
147+
148+export {
149+ Dialog,
150+ DialogClose,
151+ DialogContent,
152+ DialogDescription,
153+ DialogFooter,
154+ DialogHeader,
155+ DialogOverlay,
156+ DialogPortal,
157+ DialogTitle,
158+ DialogTrigger,
159+}
packages/clients/react/src/plugins/components/ui/input.tsx+26−0
@@ -0,0 +1,26 @@
1+import * as React from "react";
2+import { Input as InputPrimitive } from "@base-ui/react/input";
3+
4+import { cn } from "../../lib/cn";
5+
6+const Input = React.forwardRef<
7+ HTMLInputElement,
8+ React.ComponentProps<"input">
9+>(({ className, type, ...props }, ref) => {
10+ return (
11+ <InputPrimitive
12+ ref={ref}
13+ type={type}
14+ data-slot="input"
15+ className={cn(
16+ "h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",
17+ className,
18+ )}
19+ {...props}
20+ />
21+ );
22+});
23+
24+Input.displayName = "Input";
25+
26+export { Input };
packages/clients/react/src/plugins/components/ui/label.tsx+18−0
@@ -0,0 +1,18 @@
1+import * as React from "react";
2+
3+import { cn } from "../../lib/cn";
4+
5+function Label({ className, ...props }: React.ComponentProps<"label">) {
6+ return (
7+ <label
8+ data-slot="label"
9+ className={cn(
10+ "flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",
11+ className,
12+ )}
13+ {...props}
14+ />
15+ );
16+}
17+
18+export { Label };
packages/clients/react/src/plugins/components/ui/popover.tsx+48−0
@@ -0,0 +1,48 @@
1+import * as React from "react";
2+import { Popover as PopoverPrimitive } from "@base-ui/react/popover";
3+
4+import { cn } from "../../lib/cn";
5+
6+function Popover({ ...props }: PopoverPrimitive.Root.Props) {
7+ return <PopoverPrimitive.Root data-slot="popover" {...props} />;
8+}
9+
10+function PopoverTrigger({ ...props }: PopoverPrimitive.Trigger.Props) {
11+ return <PopoverPrimitive.Trigger data-slot="popover-trigger" {...props} />;
12+}
13+
14+function PopoverContent({
15+ className,
16+ align = "center",
17+ alignOffset = 0,
18+ side = "bottom",
19+ sideOffset = 4,
20+ ...props
21+}: PopoverPrimitive.Popup.Props &
22+ Pick<
23+ PopoverPrimitive.Positioner.Props,
24+ "align" | "alignOffset" | "side" | "sideOffset"
25+ >) {
26+ return (
27+ <PopoverPrimitive.Portal>
28+ <PopoverPrimitive.Positioner
29+ align={align}
30+ alignOffset={alignOffset}
31+ side={side}
32+ sideOffset={sideOffset}
33+ className="isolate z-50"
34+ >
35+ <PopoverPrimitive.Popup
36+ data-slot="popover-content"
37+ className={cn(
38+ "z-50 flex w-72 origin-(--transform-origin) flex-col gap-2.5 rounded-lg bg-popover p-2.5 text-sm text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-hidden duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
39+ className,
40+ )}
41+ {...props}
42+ />
43+ </PopoverPrimitive.Positioner>
44+ </PopoverPrimitive.Portal>
45+ );
46+}
47+
48+export { Popover, PopoverContent, PopoverTrigger };
packages/clients/react/src/plugins/components/ui/select.tsx+24−0
@@ -0,0 +1,24 @@
1+import * as React from "react";
2+
3+import { cn } from "../../lib/cn";
4+
5+function Select({
6+ className,
7+ children,
8+ ...props
9+}: React.ComponentProps<"select">) {
10+ return (
11+ <select
12+ data-slot="select"
13+ className={cn(
14+ "h-8 w-full rounded-lg border border-input bg-transparent px-2.5 text-base outline-none transition-colors focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm dark:bg-input/30",
15+ className,
16+ )}
17+ {...props}
18+ >
19+ {children}
20+ </select>
21+ );
22+}
23+
24+export { Select };
packages/clients/react/src/plugins/components/ui/separator.tsx+23−0
@@ -0,0 +1,23 @@
1+import { Separator as SeparatorPrimitive } from "@base-ui/react/separator";
2+
3+import { cn } from "../../lib/cn";
4+
5+function Separator({
6+ className,
7+ orientation = "horizontal",
8+ ...props
9+}: SeparatorPrimitive.Props) {
10+ return (
11+ <SeparatorPrimitive
12+ data-slot="separator"
13+ orientation={orientation}
14+ className={cn(
15+ "shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch",
16+ className,
17+ )}
18+ {...props}
19+ />
20+ );
21+}
22+
23+export { Separator };
packages/clients/react/src/plugins/components/ui/textarea.tsx+18−0
@@ -0,0 +1,18 @@
1+import * as React from "react";
2+
3+import { cn } from "../../lib/cn";
4+
5+function Textarea({ className, ...props }: React.ComponentProps<"textarea">) {
6+ return (
7+ <textarea
8+ data-slot="textarea"
9+ className={cn(
10+ "flex field-sizing-content min-h-16 w-full rounded-lg border border-input bg-transparent px-2.5 py-2 text-base transition-colors outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",
11+ className,
12+ )}
13+ {...props}
14+ />
15+ );
16+}
17+
18+export { Textarea };
packages/clients/react/src/plugins/index.ts+13−4
@@ -63,10 +63,6 @@ export { · 62 unmodified lines
6363 cn,
6464 } from "./lib/cn";
6565
66−export {
67− Badge,
68− MethodBadge,
69−} from "./components/badge";
7066 export {
7167 CodeBlock,
7268 } from "./components/code-block";
@@ -106,3 +102,16 @@ export { · 33 unmodified lines
106102 type SourceToolDetailPanelProps,
107103 type SourceToolDiscoveryResult,
108104 } from "./components/source-tool-workbench";
105+
106+// ── UI primitives (shadcn/ui) ────────────────────────────────────────────
107+export { Alert, alertVariants, AlertTitle, AlertDescription, AlertAction } from "./components/ui/alert";
108+export { Badge, badgeVariants, MethodBadge, type BadgeProps } from "./components/ui/badge";
109+export { Button, buttonVariants, type ButtonProps } from "./components/ui/button";
110+export { Card, CardHeader, CardFooter, CardTitle, CardAction, CardDescription, CardContent } from "./components/ui/card";
111+export { Input } from "./components/ui/input";
112+export { Label } from "./components/ui/label";
113+export { Select } from "./components/ui/select";
114+export { Separator } from "./components/ui/separator";
115+export { Textarea } from "./components/ui/textarea";
116+export { Popover, PopoverContent, PopoverTrigger } from "./components/ui/popover";
117+export { Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem, CommandShortcut, CommandSeparator } from "./components/ui/command";
packages/clients/react/src/plugins/lib/utils.ts+6−0
@@ -0,0 +1,6 @@
1+import { clsx, type ClassValue } from "clsx";
2+import { twMerge } from "tailwind-merge";
3+
4+export function cn(...inputs: ReadonlyArray<ClassValue>): string {
5+ return twMerge(clsx(inputs));
6+}
packages/clients/react/tsconfig.json+5−1
@@ -8,7 +8,11 @@ · 7 unmodified lines
88 "noEmit": true,
99 "lib": ["ES2022", "DOM"],
1010 "jsx": "react-jsx",
11− "types": ["bun-types"]
11+ "types": ["bun-types"],
12+ "baseUrl": ".",
13+ "paths": {
14+ "@/*": ["./src/plugins/*"]
15+ }
1216 },
1317 "include": [
1418 "src/**/*.ts",
plugins/execution-history/react/components.tsx+15−10
@@ -7,7 +7,10 @@ import { · 6 unmodified lines
77 useExecutions,
88 } from "@executor/react";
99 import {
10+ Alert,
1011 Badge,
12+ Button,
13+ Card,
1114 DocumentPanel,
1215 EmptyState,
1316 LoadableBlock,
@@ -81,12 +84,12 @@ const MetadataItem = (props: { · 67 unmodified lines
8184 label: string;
8285 value: string;
8386 }) => (
84− <div className="rounded-lg border border-border bg-card/60 px-3 py-2">
87+ <Card className="bg-card/60 px-3 py-2">
8588 <div className="text-[10px] font-medium uppercase tracking-wider text-muted-foreground/70">
8689 {props.label}
8790 </div>
8891 <div className="mt-1 text-sm text-foreground">{props.value}</div>
89− </div>
92+ </Card>
9093 );
9194
9295 const ExecutionCard = (props: {
@@ -96,10 +99,11 @@ const ExecutionCard = (props: { · 3 unmodified lines
9699 const { execution } = props;
97100
98101 return (
99− <button
102+ <Button
103+ variant="ghost"
100104 type="button"
101105 onClick={props.onOpen}
102− className="w-full rounded-2xl border border-border bg-card px-5 py-4 text-left transition-colors hover:border-primary/25 hover:bg-card/90"
106+ className="h-auto w-full rounded-2xl border border-border bg-card px-5 py-4 text-left transition-colors hover:border-primary/25 hover:bg-card/90"
103107 >
104108 <div className="flex items-start justify-between gap-3">
105109 <div className="min-w-0 flex-1">
@@ -122,11 +126,11 @@ const ExecutionCard = (props: { · 16 unmodified lines
122126 </div>
123127
124128 {execution.errorText && (
125− <div className="mt-3 rounded-lg border border-destructive/20 bg-destructive/5 px-3 py-2 text-xs text-destructive">
129+ <Alert variant="destructive" className="mt-3 text-xs">
126130 {execution.errorText}
127− </div>
131+ </Alert>
128132 )}
129− </button>
133+ </Button>
130134 );
131135 };
132136
@@ -275,15 +279,16 @@ export function ExecutionHistoryDetailPage() { · 142 unmodified lines
275279 <div className="mx-auto max-w-6xl px-6 py-10 lg:px-10 lg:py-14">
276280 <div className="mb-8 flex flex-wrap items-center justify-between gap-4">
277281 <div>
278− <button
282+ <Button
283+ variant="ghost"
279284 type="button"
280285 onClick={() => {
281286 void navigation.route();
282287 }}
283− className="mb-3 text-xs font-medium uppercase tracking-wider text-muted-foreground transition-colors hover:text-foreground"
288+ className="mb-3 h-auto p-0 text-xs font-medium uppercase tracking-wider text-muted-foreground transition-colors hover:text-foreground"
284289 >
285290 Back to history
286− </button>
291+ </Button>
287292 <div className="flex items-center gap-3">
288293 <h1 className="font-display text-2xl tracking-tight text-foreground lg:text-3xl">
289294 {executionId}
plugins/google-discovery/react/components.tsx+92−91
@@ -11,9 +11,17 @@ import { · 10 unmodified lines
1111 useSource,
1212 } from "@executor/react";
1313 import {
14+ Alert,
1415 Badge,
16+ Button,
17+ Card,
1518 IconPencil,
19+ Input,
20+ Label,
21+ Select,
22+ Separator,
1623 SourceToolExplorer,
24+ Textarea,
1725 parseSourceToolExplorerSearch,
1826 type SourceToolExplorerSearch,
1927 useSourcePluginNavigation,
@@ -565,80 +573,74 @@ function GoogleDiscoverySourceForm(props: { · 545 unmodified lines
565573 };
566574
567575 return (
568− <div className="space-y-6 rounded-xl border border-border p-6">
576+ <Card className="space-y-6 p-6">
569577 <div className="grid gap-4 sm:grid-cols-2">
570− <label className="grid gap-2 sm:col-span-2">
571− <span className="text-xs font-medium text-foreground">Name</span>
572− <input
578+ <div className="grid gap-2 sm:col-span-2">
579+ <Label>Name</Label>
580+ <Input
573581 value={name}
574582 onChange={(event) => setName(event.target.value)}
575− className="h-9 rounded-lg border border-input bg-background px-3 text-sm outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
576583 />
577− </label>
578− <label className="grid gap-2">
579− <span className="text-xs font-medium text-foreground">Service</span>
580− <input
584+ </div>
585+ <div className="grid gap-2">
586+ <Label>Service</Label>
587+ <Input
581588 value={service}
582589 onChange={(event) => setService(event.target.value)}
583− className="h-9 rounded-lg border border-input bg-background px-3 text-sm outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
584590 />
585− </label>
586− <label className="grid gap-2">
587− <span className="text-xs font-medium text-foreground">Version</span>
588− <input
591+ </div>
592+ <div className="grid gap-2">
593+ <Label>Version</Label>
594+ <Input
589595 value={version}
590596 onChange={(event) => setVersion(event.target.value)}
591− className="h-9 rounded-lg border border-input bg-background px-3 text-sm outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
592597 />
593− </label>
594− <label className="grid gap-2 sm:col-span-2">
595− <span className="text-xs font-medium text-foreground">Discovery URL</span>
596− <input
598+ </div>
599+ <div className="grid gap-2 sm:col-span-2">
600+ <Label>Discovery URL</Label>
601+ <Input
597602 value={discoveryUrl}
598603 onChange={(event) => setDiscoveryUrl(event.target.value)}
599604 placeholder={defaultGoogleDiscoveryUrl(service || "sheets", version || "v4")}
600− className="h-9 rounded-lg border border-input bg-background px-3 font-mono text-xs outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
605+ className="font-mono text-xs"
601606 />
602− </label>
607+ </div>
603608 </div>
604609
605− <label className="grid gap-2">
606− <span className="text-xs font-medium text-foreground">Default Headers</span>
607− <textarea
610+ <div className="grid gap-2">
611+ <Label>Default Headers</Label>
612+ <Textarea
608613 value={headersText}
609614 onChange={(event) => setHeadersText(event.target.value)}
610615 rows={3}
611− className="rounded-lg border border-input bg-background px-3 py-2 font-mono text-xs outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
612616 />
613− </label>
617+ </div>
614618
615− <label className="grid gap-2">
616− <span className="text-xs font-medium text-foreground">Scopes</span>
617− <textarea
619+ <div className="grid gap-2">
620+ <Label>Scopes</Label>
621+ <Textarea
618622 value={scopesText}
619623 onChange={(event) => setScopesText(event.target.value)}
620624 rows={3}
621625 placeholder="Leave blank to infer from the discovery document."
622− className="rounded-lg border border-input bg-background px-3 py-2 font-mono text-xs outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
623626 />
624− </label>
627+ </div>
625628
626− <label className="grid gap-2">
627− <span className="text-xs font-medium text-foreground">Auth</span>
628− <select
629+ <div className="grid gap-2">
630+ <Label>Auth</Label>
631+ <Select
629632 value={authKind}
630633 onChange={(event) =>
631634 setAuthKind(event.target.value as GoogleDiscoveryConnectionAuth["kind"])}
632− className="h-9 rounded-lg border border-input bg-background px-3 text-sm outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
633635 >
634636 <option value="none">None</option>
635637 <option value="bearer">Bearer Secret</option>
636638 <option value="oauth2">Google OAuth</option>
637− </select>
638− </label>
639+ </Select>
640+ </div>
639641
640642 {authKind === "bearer" && (
641− <div className="border-l-2 border-border pl-4">
643+ <div className="rounded-lg border border-border bg-muted/20 p-4">
642644 <SecretReferenceField
643645 label="Secret"
644646 value={bearerSecretRef}
@@ -651,15 +653,14 @@ function GoogleDiscoverySourceForm(props: { · 6 unmodified lines
651653 )}
652654
653655 {authKind === "oauth2" && (
654− <div className="space-y-4 border-l-2 border-border pl-4">
655− <label className="grid gap-2">
656− <span className="text-xs font-medium text-foreground">Client ID</span>
657− <input
656+ <div className="space-y-4 rounded-lg border border-border bg-muted/20 p-4">
657+ <div className="grid gap-2">
658+ <Label>Client ID</Label>
659+ <Input
658660 value={clientId}
659661 onChange={(event) => setClientId(event.target.value)}
660− className="h-9 rounded-lg border border-input bg-background px-3 text-sm outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
661662 />
662− </label>
663+ </div>
663664 <SecretReferenceField
664665 label="Client Secret"
665666 value={clientSecretRef}
@@ -669,7 +670,8 @@ function GoogleDiscoverySourceForm(props: { · 3 unmodified lines
669670 onChange={setClientSecretRef}
670671 />
671672 <div className="flex items-center gap-3">
672− <button
673+ <Button
674+ variant="outline"
673675 type="button"
674676 onClick={() => {
675677 void (async () => {
@@ -685,14 +687,13 @@ function GoogleDiscoverySourceForm(props: { · 9 unmodified lines
685687 })();
686688 }}
687689 disabled={oauthStatus === "pending"}
688− className="inline-flex h-9 items-center justify-center rounded-lg border border-input bg-card px-3 text-sm font-medium text-foreground transition-colors hover:bg-accent/50 disabled:pointer-events-none disabled:opacity-50"
689690 >
690691 {oauthStatus === "pending"
691692 ? "Connecting..."
692693 : oauthStatus === "connected"
693694 ? "Reconnect"
694695 : "Connect with Google"}
695− </button>
696+ </Button>
696697 {oauthStatus === "connected" && (
697698 <span className="text-xs text-primary">Connected</span>
698699 )}
@@ -701,13 +702,13 @@ function GoogleDiscoverySourceForm(props: { · 2 unmodified lines
701702 )}
702703
703704 {error && (
704− <div className="rounded-lg border border-destructive/30 bg-destructive/8 px-4 py-2.5 text-sm text-destructive">
705+ <Alert variant="destructive">
705706 {error}
706− </div>
707+ </Alert>
707708 )}
708709
709710 <div className="flex items-center justify-end">
710− <button
711+ <Button
711712 type="button"
712713 onClick={() => {
713714 void (async () => {
@@ -746,14 +747,13 @@ function GoogleDiscoverySourceForm(props: { · 32 unmodified lines
746747 })();
747748 }}
748749 disabled={submitMutation.status === "pending"}
749− className="inline-flex h-9 items-center justify-center rounded-lg bg-primary px-4 text-sm font-medium text-primary-foreground transition-opacity hover:opacity-90 disabled:pointer-events-none disabled:opacity-50"
750750 >
751751 {submitMutation.status === "pending"
752752 ? props.mode === "create" ? "Creating..." : "Saving..."
753753 : props.mode === "create" ? "Create Source" : "Save Changes"}
754− </button>
754+ </Button>
755755 </div>
756− </div>
756+ </Card>
757757 );
758758 }
759759
@@ -857,7 +857,7 @@ function GoogleDiscoveryBatchConnectPanel(props: { · 97 unmodified lines
857857 };
858858
859859 return (
860− <div className="space-y-6 rounded-xl border border-border p-6">
860+ <Card className="space-y-6 p-6">
861861 <div>
862862 <h2 className="text-base font-semibold text-foreground">
863863 Connect multiple Google APIs
@@ -874,14 +874,17 @@ function GoogleDiscoveryBatchConnectPanel(props: { · 10 unmodified lines
874874 : `${selectedTemplates.length} Google API${selectedTemplates.length === 1 ? "" : "s"} selected.`}
875875 </div>
876876 <div className="flex items-center gap-2">
877− <button
877+ <Button
878+ variant="outline"
879+ size="sm"
878880 type="button"
879881 onClick={() => setSelectedTemplateIds([])}
880− className="inline-flex h-8 items-center justify-center rounded-lg border border-input bg-card px-3 text-xs font-medium text-foreground transition-colors hover:bg-accent/50"
881882 >
882883 Clear
883− </button>
884− <button
884+ </Button>
885+ <Button
886+ variant="outline"
887+ size="sm"
885888 type="button"
886889 onClick={() =>
887890 setSelectedTemplateIds(
@@ -890,12 +893,11 @@ function GoogleDiscoveryBatchConnectPanel(props: { · 2 unmodified lines
890893 : GOOGLE_DISCOVERY_BATCH_TEMPLATES.map((template) => template.id),
891894 )
892895 }
893− className="inline-flex h-8 items-center justify-center rounded-lg border border-input bg-card px-3 text-xs font-medium text-foreground transition-colors hover:bg-accent/50"
894896 >
895897 {selectedTemplateIds.length === GOOGLE_DISCOVERY_BATCH_TEMPLATES.length
896898 ? "Deselect all"
897899 : "Select all"}
898− </button>
900+ </Button>
899901 </div>
900902 </div>
901903
@@ -905,14 +907,15 @@ function GoogleDiscoveryBatchConnectPanel(props: { · 3 unmodified lines
905907 const iconUrl = getGoogleDiscoveryIconUrlForService(template.service);
906908
907909 return (
908− <button
910+ <Button
909911 key={template.id}
912+ variant="ghost"
910913 type="button"
911914 onClick={() => toggleTemplate(template.id)}
912915 className={
913916 selected
914− ? "rounded-lg border border-primary/30 bg-primary/5 px-4 py-3 text-left transition-colors"
915− : "rounded-lg border border-border px-4 py-3 text-left transition-colors hover:bg-accent/40"
917+ ? "h-auto rounded-lg border border-primary/30 bg-primary/5 px-4 py-3 text-left"
918+ : "h-auto rounded-lg border border-border px-4 py-3 text-left hover:bg-accent/40"
916919 }
917920 >
918921 <div className="flex items-start gap-3">
@@ -954,21 +957,20 @@ function GoogleDiscoveryBatchConnectPanel(props: { · 35 unmodified lines
954957 </div>
955958 </div>
956959 </div>
957− </button>
960+ </Button>
958961 );
959962 })}
960963 </div>
961964
962965 <div className="grid gap-4 md:grid-cols-2">
963− <label className="grid gap-2 md:col-span-2">
964− <span className="text-xs font-medium text-foreground">Client ID</span>
965− <input
966+ <div className="grid gap-2 md:col-span-2">
967+ <Label>Client ID</Label>
968+ <Input
966969 value={clientId}
967970 onChange={(event) => setClientId(event.target.value)}
968971 placeholder="1234567890-abcdef.apps.googleusercontent.com"
969− className="h-9 rounded-lg border border-input bg-background px-3 text-sm outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
970972 />
971− </label>
973+ </div>
972974 <div className="md:col-span-2">
973975 <SecretReferenceField
974976 label="Client Secret"
@@ -982,13 +984,13 @@ function GoogleDiscoveryBatchConnectPanel(props: { · 7 unmodified lines
982984 </div>
983985
984986 {error && (
985− <div className="rounded-lg border border-destructive/30 bg-destructive/8 px-4 py-3 text-sm text-destructive">
987+ <Alert variant="destructive">
986988 {error}
987− </div>
989+ </Alert>
988990 )}
989991
990992 <div className="flex items-center justify-end gap-3">
991− <button
993+ <Button
992994 type="button"
993995 onClick={() => {
994996 void handleConnect();
@@ -998,16 +1000,15 @@ function GoogleDiscoveryBatchConnectPanel(props: { · 3 unmodified lines
9981000 || selectedTemplates.length === 0
9991001 || clientId.trim().length === 0
10001002 }
1001− className="inline-flex h-9 items-center justify-center rounded-lg bg-primary px-4 text-sm font-medium text-primary-foreground transition-opacity hover:opacity-90 disabled:pointer-events-none disabled:opacity-50"
10021003 >
10031004 {status === "connecting"
10041005 ? "Connecting..."
10051006 : selectedTemplates.length > 0
10061007 ? `Connect ${selectedTemplates.length} Google API${selectedTemplates.length === 1 ? "" : "s"}`
10071008 : "Connect Google APIs"}
1008− </button>
1009+ </Button>
10091010 </div>
1010− </div>
1011+ </Card>
10111012 );
10121013 }
10131014
@@ -1043,11 +1044,11 @@ export function GoogleDiscoveryAddPage() { · 29 unmodified lines
10431044 />
10441045
10451046 <div className="flex items-center gap-3">
1046− <div className="h-px flex-1 bg-border" />
1047+ <Separator className="flex-1" />
10471048 <div className="text-xs font-medium text-muted-foreground">
10481049 or add a single API
10491050 </div>
1050− <div className="h-px flex-1 bg-border" />
1051+ <Separator className="flex-1" />
10511052 </div>
10521053
10531054 <GoogleDiscoverySourceForm
@@ -1108,9 +1109,9 @@ export function GoogleDiscoveryEditPage(props: { · 54 unmodified lines
11081109
11091110 if (Result.isFailure(configResult)) {
11101111 return (
1111− <div className="rounded-lg border border-destructive/30 bg-destructive/8 px-4 py-3 text-sm text-destructive">
1112+ <Alert variant="destructive">
11121113 Failed loading source configuration.
1113− </div>
1114+ </Alert>
11141115 );
11151116 }
11161117
@@ -1238,48 +1239,48 @@ export function GoogleDiscoveryDetailPage(props: { · 121 unmodified lines
12381239 summary={summary}
12391240 actions={(
12401241 <>
1241− <button
1242+ <Button
1243+ variant="outline"
12421244 type="button"
12431245 onClick={() =>
12441246 void navigation.edit(props.source.id)}
1245− className="inline-flex h-9 items-center gap-1.5 rounded-lg border border-input bg-card px-3 text-sm font-medium text-foreground transition-colors hover:bg-accent/50"
12461247 >
12471248 <IconPencil className="size-3.5" />
12481249 Edit
1249− </button>
1250+ </Button>
12501251 {confirmDelete ? (
12511252 <div className="flex items-center gap-2">
12521253 <span className="text-xs font-medium text-destructive">
12531254 Confirm delete?
12541255 </span>
1255− <button
1256+ <Button
1257+ variant="outline"
12561258 type="button"
12571259 onClick={() => setConfirmDelete(false)}
12581260 disabled={isDeleting}
1259− className="inline-flex h-9 items-center rounded-lg border border-input bg-card px-3 text-sm font-medium text-foreground transition-colors hover:bg-accent/50 disabled:pointer-events-none disabled:opacity-50"
12601261 >
12611262 Cancel
1262− </button>
1263− <button
1263+ </Button>
1264+ <Button
1265+ variant="destructive-outline"
12641266 type="button"
12651267 onClick={() => {
12661268 void handleDelete().catch(() => {});
12671269 }}
12681270 disabled={isDeleting}
1269− className="inline-flex h-9 items-center rounded-lg border border-destructive/25 bg-destructive/5 px-3 text-sm font-medium text-destructive transition-colors hover:bg-destructive/10 disabled:pointer-events-none disabled:opacity-50"
12701271 >
12711272 {isDeleting ? "Deleting..." : "Delete"}
1272− </button>
1273+ </Button>
12731274 </div>
12741275 ) : (
1275− <button
1276+ <Button
1277+ variant="destructive-outline"
12761278 type="button"
12771279 onClick={() => setConfirmDelete(true)}
12781280 disabled={isDeleting}
1279− className="inline-flex h-9 items-center rounded-lg border border-destructive/25 bg-destructive/5 px-3 text-sm font-medium text-destructive transition-colors hover:bg-destructive/10 disabled:pointer-events-none disabled:opacity-50"
12801281 >
12811282 Delete
1282− </button>
1283+ </Button>
12831284 )}
12841285 </>
12851286 )}
plugins/graphql/react/components.tsx+60−57
@@ -14,10 +14,17 @@ import { · 13 unmodified lines
1414 useSource,
1515 } from "@executor/react";
1616 import {
17+ Alert,
1718 Badge,
19+ Button,
20+ Card,
1821 IconPencil,
22+ Input,
23+ Label,
24+ Select,
1925 SourceToolDetailPanel,
2026 SourceToolExplorer,
27+ Textarea,
2128 parseSourceToolExplorerSearch,
2229 useSourcePluginRouteParams,
2330 type SourceToolExplorerSearch,
@@ -207,52 +214,49 @@ function GraphqlSourceForm(props: { · 183 unmodified lines
207214 const [error, setError] = useState<string | null>(null);
208215
209216 return (
210− <div className="space-y-6 rounded-xl border border-border p-6">
217+ <Card className="space-y-6 p-6">
211218 <div className="grid gap-4">
212− <label className="grid gap-2">
213− <span className="text-xs font-medium text-foreground">Name</span>
214− <input
219+ <div className="grid gap-2">
220+ <Label>Name</Label>
221+ <Input
215222 value={name}
216223 onChange={(event) => setName(event.target.value)}
217− className="h-9 rounded-lg border border-input bg-background px-3 text-sm outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
218224 />
219− </label>
225+ </div>
220226
221− <label className="grid gap-2">
222− <span className="text-xs font-medium text-foreground">Endpoint</span>
223− <input
227+ <div className="grid gap-2">
228+ <Label>Endpoint</Label>
229+ <Input
224230 value={endpoint}
225231 onChange={(event) => setEndpoint(event.target.value)}
226− className="h-9 rounded-lg border border-input bg-background px-3 font-mono text-xs outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
232+ className="font-mono text-xs"
227233 />
228− </label>
234+ </div>
229235
230− <label className="grid gap-2">
231− <span className="text-xs font-medium text-foreground">Default Headers</span>
232− <textarea
236+ <div className="grid gap-2">
237+ <Label>Default Headers</Label>
238+ <Textarea
233239 value={headersText}
234240 onChange={(event) => setHeadersText(event.target.value)}
235241 rows={3}
236242 placeholder='{"x-api-version":"2026-03-23"}'
237− className="rounded-lg border border-input bg-background px-3 py-2 font-mono text-xs outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
238243 />
239− </label>
244+ </div>
240245
241− <label className="grid gap-2">
242− <span className="text-xs font-medium text-foreground">Auth</span>
243− <select
246+ <div className="grid gap-2">
247+ <Label>Auth</Label>
248+ <Select
244249 value={authKind}
245250 onChange={(event) =>
246251 setAuthKind(event.target.value as GraphqlConnectionAuth["kind"])}
247− className="h-9 rounded-lg border border-input bg-background px-3 text-sm outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
248252 >
249253 <option value="none">None</option>
250254 <option value="bearer">Bearer Secret</option>
251− </select>
252− </label>
255+ </Select>
256+ </div>
253257
254258 {authKind === "bearer" && (
255− <div className="space-y-4 border-l-2 border-border pl-4">
259+ <div className="space-y-4 rounded-lg border border-border bg-muted/20 p-4">
256260 <SecretReferenceField
257261 label="Secret"
258262 value={secretRef}
@@ -263,38 +267,38 @@ function GraphqlSourceForm(props: { · 4 unmodified lines
263267 />
264268
265269 <div className="grid gap-4 sm:grid-cols-2">
266− <label className="grid gap-2">
267− <span className="text-xs font-medium text-foreground">Header Name</span>
268− <input
270+ <div className="grid gap-2">
271+ <Label>Header Name</Label>
272+ <Input
269273 value={authHeaderName}
270274 onChange={(event) => setAuthHeaderName(event.target.value)}
271275 placeholder={DEFAULT_BEARER_HEADER_NAME}
272− className="h-9 rounded-lg border border-input bg-background px-3 font-mono text-xs outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
276+ className="font-mono text-xs"
273277 />
274− </label>
278+ </div>
275279
276− <label className="grid gap-2">
277− <span className="text-xs font-medium text-foreground">Prefix</span>
278− <input
280+ <div className="grid gap-2">
281+ <Label>Prefix</Label>
282+ <Input
279283 value={authPrefix}
280284 onChange={(event) => setAuthPrefix(event.target.value)}
281285 placeholder={DEFAULT_BEARER_PREFIX}
282− className="h-9 rounded-lg border border-input bg-background px-3 font-mono text-xs outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
286+ className="font-mono text-xs"
283287 />
284− </label>
288+ </div>
285289 </div>
286290 </div>
287291 )}
288292 </div>
289293
290294 {error && (
291− <div className="rounded-lg border border-destructive/30 bg-destructive/8 px-4 py-2.5 text-sm text-destructive">
295+ <Alert variant="destructive">
292296 {error}
293− </div>
297+ </Alert>
294298 )}
295299
296300 <div className="flex items-center justify-end">
297− <button
301+ <Button
298302 type="button"
299303 onClick={() => {
300304 void (async () => {
@@ -317,14 +321,13 @@ function GraphqlSourceForm(props: { · 16 unmodified lines
317321 })();
318322 }}
319323 disabled={submitMutation.status === "pending"}
320− className="inline-flex h-9 items-center justify-center rounded-lg bg-primary px-4 text-sm font-medium text-primary-foreground transition-opacity hover:opacity-90 disabled:pointer-events-none disabled:opacity-50"
321324 >
322325 {submitMutation.status === "pending"
323326 ? props.mode === "create" ? "Creating..." : "Saving..."
324327 : props.mode === "create" ? "Create Source" : "Save Changes"}
325− </button>
328+ </Button>
326329 </div>
327− </div>
330+ </Card>
328331 );
329332 }
330333
@@ -400,9 +403,9 @@ export function GraphqlEditPage(props: { · 69 unmodified lines
400403
401404 if (Result.isFailure(configResult)) {
402405 return (
403− <div className="rounded-lg border border-destructive/30 bg-destructive/8 px-4 py-3 text-sm text-destructive">
406+ <Alert variant="destructive">
404407 Failed loading source configuration.
405− </div>
408+ </Alert>
406409 );
407410 }
408411
@@ -556,47 +559,47 @@ function GraphqlDetailExplorer(props: { · 147 unmodified lines
556559 ) : undefined}
557560 actions={(
558561 <>
559− <button
560− type="button"
562+ <Button
563+ variant="outline"
564+ size="sm"
561565 onClick={() => void navigation.edit(props.source.id)}
562− className="inline-flex items-center gap-1.5 rounded-md border border-border bg-card px-2.5 py-1 text-[12px] font-medium text-muted-foreground transition-colors hover:bg-accent/50 hover:text-foreground"
563566 >
564567 <IconPencil className="size-3" />
565568 Edit
566− </button>
569+ </Button>
567570 {confirmDelete ? (
568571 <div className="flex items-center gap-2">
569572 <span className="text-[11px] font-medium text-destructive">
570573 Confirm delete?
571574 </span>
572− <button
573− type="button"
575+ <Button
576+ variant="outline"
577+ size="sm"
574578 onClick={() => setConfirmDelete(false)}
575579 disabled={isDeleting}
576− className="inline-flex items-center rounded-md border border-border bg-card px-2.5 py-1 text-[12px] font-medium text-muted-foreground transition-colors hover:bg-accent/50 hover:text-foreground disabled:pointer-events-none disabled:opacity-50"
577580 >
578581 Cancel
579− </button>
580− <button
581− type="button"
582+ </Button>
583+ <Button
584+ variant="destructive-outline"
585+ size="sm"
582586 onClick={() => {
583587 void handleDelete().catch(() => {});
584588 }}
585589 disabled={isDeleting}
586− className="inline-flex items-center rounded-md border border-destructive/25 bg-destructive/5 px-2.5 py-1 text-[12px] font-medium text-destructive transition-colors hover:bg-destructive/10 disabled:pointer-events-none disabled:opacity-50"
587590 >
588591 {isDeleting ? "Deleting..." : "Delete"}
589− </button>
592+ </Button>
590593 </div>
591594 ) : (
592− <button
593− type="button"
595+ <Button
596+ variant="destructive-outline"
597+ size="sm"
594598 onClick={() => setConfirmDelete(true)}
595599 disabled={isDeleting}
596− className="inline-flex items-center rounded-md border border-destructive/25 bg-destructive/5 px-2.5 py-1 text-[12px] font-medium text-destructive transition-colors hover:bg-destructive/10 disabled:pointer-events-none disabled:opacity-50"
597600 >
598601 Delete
599− </button>
602+ </Button>
600603 )}
601604 </>
602605 )}
plugins/local-tools/react/components.tsx+12−9
@@ -7,6 +7,9 @@ import { · 6 unmodified lines
77 useSources,
88 } from "@executor/react";
99 import {
10+ Alert,
11+ Button,
12+ Card,
1013 SourceToolExplorer,
1114 parseSourceToolExplorerSearch,
1215 useSourcePluginNavigation,
@@ -116,7 +119,7 @@ export function LocalToolsAddPage() { · 103 unmodified lines
116119
117120 return (
118121 <div className="mx-auto w-full max-w-3xl px-6 py-10">
119− <div className="rounded-2xl border border-border bg-card p-6">
122+ <Card className="p-6">
120123 <h1 className="font-display text-2xl tracking-tight text-foreground">
121124 Local Tools
122125 </h1>
@@ -125,7 +128,7 @@ export function LocalToolsAddPage() { · 2 unmodified lines
125128 {" "}into a first-class source with inspection and discovery.
126129 </p>
127130
128− <div className="mt-6 rounded-xl border border-border/70 bg-background/60 p-4 text-sm text-muted-foreground">
131+ <Card className="mt-6 bg-background/60 p-4 text-sm text-muted-foreground">
129132 <p>
130133 The source is provisioned automatically when the executor session starts and finds
131134 local tool files in <code className="rounded bg-muted px-1 py-0.5 font-mono">.executor/tools</code>.
@@ -135,11 +138,12 @@ export function LocalToolsAddPage() { · 3 unmodified lines
135138 {" "}<code className="rounded bg-muted px-1 py-0.5 font-mono">.executor/tools/demo.ts</code>
136139 {" "}still appears as <code className="rounded bg-muted px-1 py-0.5 font-mono">tools.demo(...)</code>.
137140 </p>
138− </div>
141+ </Card>
139142
140143 <div className="mt-6 flex flex-wrap items-center gap-3">
141144 {localToolsSource ? (
142− <button
145+ <Button
146+ size="lg"
143147 type="button"
144148 onClick={() => {
145149 startTransition(() => {
@@ -148,19 +152,18 @@ export function LocalToolsAddPage() { · 2 unmodified lines
148152 });
149153 });
150154 }}
151− className="inline-flex h-10 items-center justify-center rounded-lg bg-primary px-4 text-sm font-medium text-primary-foreground transition-opacity hover:opacity-90"
152155 >
153156 Open Local Tools Source
154− </button>
157+ </Button>
155158 ) : (
156− <div className="rounded-lg border border-amber-500/25 bg-amber-500/8 px-4 py-2.5 text-sm text-amber-700">
159+ <Alert variant="warning">
157160 No local tools source is active yet. Create a tool in
158161 {" "}<code className="rounded bg-muted px-1 py-0.5 font-mono">.executor/tools</code>
159162 {" "}and restart the executor session.
160− </div>
163+ </Alert>
161164 )}
162165 </div>
163− </div>
166+ </Card>
164167 </div>
165168 );
166169 }
plugins/mcp/react/components.tsx+127−140
@@ -10,12 +10,20 @@ import { · 9 unmodified lines
1010 useSource,
1111 } from "@executor/react";
1212 import {
13+ Alert,
1314 Badge,
15+ Button,
16+ Card,
17+ cn,
1418 IconCheck,
1519 IconPencil,
1620 IconSearch,
1721 IconSpinner,
22+ Input,
23+ Label,
24+ Select,
1825 SourceToolExplorer,
26+ Textarea,
1927 parseSourceToolExplorerSearch,
2028 type SourceToolExplorerSearch,
2129 useSourcePluginNavigation,
@@ -584,7 +592,7 @@ function McpSourceForm(props: { · 562 unmodified lines
584592 return (
585593 <div className="space-y-8">
586594 {props.mode === "create" && (
587− <div className="rounded-xl border border-border p-6">
595+ <Card className="p-6">
588596 <div className="text-sm font-medium text-foreground">Presets</div>
589597 <div className="mt-3 grid gap-3 sm:grid-cols-2">
590598 {mcpQuickPresets.map((preset) => {
@@ -595,152 +603,145 @@ function McpSourceForm(props: { · 4 unmodified lines
595603 : !isStdio && endpoint.trim() === (preset.input.endpoint ?? "");
596604
597605 return (
598− <button
606+ <Button
599607 key={preset.id}
600608 type="button"
609+ variant="outline"
601610 onClick={() => applyPreset(preset)}
602− className={
603− selected
604− ? "rounded-lg border border-primary/30 bg-primary/5 px-4 py-3 text-left"
605− : "rounded-lg border border-border px-4 py-3 text-left transition-colors hover:bg-accent/40"
606− }
611+ className={cn(
612+ "h-auto flex-col items-start px-4 py-3 text-left",
613+ selected && "border-primary/30 bg-primary/5",
614+ )}
607615 >
608616 <div className="flex items-center gap-2">
609617 {selected ? <IconCheck className="size-3.5 text-primary" /> : null}
610618 <div className="text-sm font-medium text-foreground">{preset.name}</div>
611619 </div>
612620 <div className="mt-1 text-xs text-muted-foreground">{preset.summary}</div>
613− </button>
621+ </Button>
614622 );
615623 })}
616624 </div>
617− </div>
625+ </Card>
618626 )}
619627
620628 {props.mode === "create" && (
621− <div className="rounded-xl border border-border p-6">
629+ <Card className="p-6">
622630 <div>
623631 <div className="flex items-center justify-between gap-3">
624632 <div className="text-sm font-medium text-foreground">Discover</div>
625− <button
626− type="button"
633+ <Button
634+ variant="ghost"
627635 onClick={() => setShowProbeAuth((current) => !current)}
628636 className="text-xs font-medium text-muted-foreground transition-colors hover:text-foreground"
629637 >
630638 {showProbeAuth ? "Hide auth" : "Need auth?"}
631− </button>
639+ </Button>
632640 </div>
633641
634642 <div className="mt-2 flex flex-col gap-3 sm:flex-row">
635− <input
643+ <Input
636644 value={discoveryEndpoint}
637645 onChange={(event) => setDiscoveryEndpoint(event.target.value)}
638646 placeholder="https://mcp.example.com/mcp"
639− className="h-9 flex-1 rounded-lg border border-input bg-background px-3 font-mono text-xs outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
647+ className="flex-1 font-mono text-xs"
640648 />
641− <button
642− type="button"
649+ <Button
650+ variant="outline"
643651 onClick={() => {
644652 void handleDiscover();
645653 }}
646654 disabled={discoverMutation.status === "pending"}
647− className="inline-flex h-9 items-center justify-center gap-2 rounded-lg border border-input bg-card px-3 text-sm font-medium text-foreground transition-colors hover:bg-accent/50 disabled:pointer-events-none disabled:opacity-50"
648655 >
649656 {discoverMutation.status === "pending"
650657 ? <IconSpinner className="size-3.5" />
651658 : <IconSearch className="size-3.5" />}
652659 {discoverMutation.status === "pending" ? "Discovering..." : "Discover"}
653− </button>
660+ </Button>
654661 </div>
655662
656663 {showProbeAuth && (
657− <div className="mt-3 space-y-3 border-l-2 border-border pl-4">
658− <label className="grid gap-2">
659− <span className="text-xs font-medium text-foreground">Discovery auth</span>
660− <select
664+ <div className="mt-3 space-y-3 rounded-lg border border-border bg-muted/20 p-4">
665+ <div className="grid gap-2">
666+ <Label>Discovery auth</Label>
667+ <Select
661668 value={probeAuth.kind}
662669 onChange={(event) =>
663670 setProbeAuth((current) => ({
664671 ...current,
665672 kind: event.target.value as ProbeAuthState["kind"],
666673 }))}
667− className="h-9 rounded-lg border border-input bg-background px-3 text-sm outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
668674 >
669675 <option value="none">None</option>
670676 <option value="bearer">Bearer</option>
671677 <option value="basic">Basic</option>
672678 <option value="headers">Custom headers</option>
673− </select>
674− </label>
679+ </Select>
680+ </div>
675681
676682 {probeAuth.kind === "bearer" && (
677683 <div className="grid gap-4 md:grid-cols-2">
678− <label className="grid gap-2">
679− <span className="text-xs font-medium text-foreground">Header name</span>
680− <input
684+ <div className="grid gap-2">
685+ <Label>Header name</Label>
686+ <Input
681687 value={probeAuth.headerName}
682688 onChange={(event) =>
683689 setProbeAuth((current) => ({ ...current, headerName: event.target.value }))}
684− className="h-9 rounded-lg border border-input bg-background px-3 text-sm outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
685690 />
686− </label>
687− <label className="grid gap-2">
688− <span className="text-xs font-medium text-foreground">Prefix</span>
689− <input
691+ </div>
692+ <div className="grid gap-2">
693+ <Label>Prefix</Label>
694+ <Input
690695 value={probeAuth.prefix}
691696 onChange={(event) =>
692697 setProbeAuth((current) => ({ ...current, prefix: event.target.value }))}
693− className="h-9 rounded-lg border border-input bg-background px-3 text-sm outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
694698 />
695− </label>
696− <label className="grid gap-2 md:col-span-2">
697− <span className="text-xs font-medium text-foreground">Token</span>
698− <input
699+ </div>
700+ <div className="grid gap-2 md:col-span-2">
701+ <Label>Token</Label>
702+ <Input
699703 value={probeAuth.token}
700704 onChange={(event) =>
701705 setProbeAuth((current) => ({ ...current, token: event.target.value }))}
702− className="h-9 rounded-lg border border-input bg-background px-3 font-mono text-xs outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
706+ className="font-mono text-xs"
703707 />
704− </label>
708+ </div>
705709 </div>
706710 )}
707711
708712 {probeAuth.kind === "basic" && (
709713 <div className="grid gap-4 md:grid-cols-2">
710− <label className="grid gap-2">
711− <span className="text-xs font-medium text-foreground">Username</span>
712− <input
714+ <div className="grid gap-2">
715+ <Label>Username</Label>
716+ <Input
713717 value={probeAuth.username}
714718 onChange={(event) =>
715719 setProbeAuth((current) => ({ ...current, username: event.target.value }))}
716− className="h-9 rounded-lg border border-input bg-background px-3 text-sm outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
717720 />
718− </label>
719− <label className="grid gap-2">
720− <span className="text-xs font-medium text-foreground">Password</span>
721− <input
721+ </div>
722+ <div className="grid gap-2">
723+ <Label>Password</Label>
724+ <Input
722725 value={probeAuth.password}
723726 onChange={(event) =>
724727 setProbeAuth((current) => ({ ...current, password: event.target.value }))}
725− className="h-9 rounded-lg border border-input bg-background px-3 text-sm outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
726728 type="password"
727729 />
728− </label>
730+ </div>
729731 </div>
730732 )}
731733
732734 {probeAuth.kind === "headers" && (
733− <label className="grid gap-2">
734− <span className="text-xs font-medium text-foreground">Headers JSON</span>
735− <textarea
735+ <div className="grid gap-2">
736+ <Label>Headers JSON</Label>
737+ <Textarea
736738 value={probeAuth.headersText}
737739 onChange={(event) =>
738740 setProbeAuth((current) => ({ ...current, headersText: event.target.value }))}
739741 rows={3}
740742 placeholder='{"x-api-key":"..."}'
741− className="rounded-lg border border-input bg-background px-3 py-2 font-mono text-xs outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
742743 />
743− </label>
744+ </div>
744745 )}
745746 </div>
746747 )}
@@ -751,22 +752,21 @@ function McpSourceForm(props: { · 4 unmodified lines
751752 </div>
752753 )}
753754 </div>
754− </div>
755+ </Card>
755756 )}
756757
757− <div className="space-y-6 rounded-xl border border-border p-6">
758− <label className="grid gap-2">
759− <span className="text-xs font-medium text-foreground">Name</span>
760− <input
758+ <Card className="space-y-6 p-6">
759+ <div className="grid gap-2">
760+ <Label>Name</Label>
761+ <Input
761762 value={name}
762763 onChange={(event) => setName(event.target.value)}
763− className="h-9 rounded-lg border border-input bg-background px-3 text-sm outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
764764 />
765− </label>
765+ </div>
766766
767− <label className="grid gap-2">
768− <span className="text-xs font-medium text-foreground">Transport</span>
769− <select
767+ <div className="grid gap-2">
768+ <Label>Transport</Label>
769+ <Select
770770 value={transportFields.transport}
771771 onChange={(event) => {
772772 const nextTransport = event.target.value as McpTransportValue;
@@ -779,34 +779,33 @@ function McpSourceForm(props: { · 6 unmodified lines
779779 setOauthStatus("idle");
780780 }
781781 }}
782− className="h-9 rounded-lg border border-input bg-background px-3 text-sm outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
783782 >
784783 <option value="">Auto (remote)</option>
785784 <option value="auto">Auto</option>
786785 <option value="streamable-http">Streamable HTTP</option>
787786 <option value="sse">SSE</option>
788787 <option value="stdio">stdio</option>
789− </select>
790− </label>
788+ </Select>
789+ </div>
791790
792791 {isStdio ? (
793792 <div className="grid gap-4 md:grid-cols-2">
794− <label className="grid gap-2 md:col-span-2">
795− <span className="text-xs font-medium text-foreground">Command</span>
796− <input
793+ <div className="grid gap-2 md:col-span-2">
794+ <Label>Command</Label>
795+ <Input
797796 value={transportFields.command}
798797 onChange={(event) =>
799798 setTransportFields({
800799 ...transportFields,
801800 command: event.target.value,
802801 })}
803− className="h-9 rounded-lg border border-input bg-background px-3 font-mono text-xs outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
802+ className="font-mono text-xs"
804803 />
805− </label>
804+ </div>
806805
807− <label className="grid gap-2">
808− <span className="text-xs font-medium text-foreground">Args</span>
809− <textarea
806+ <div className="grid gap-2">
807+ <Label>Args</Label>
808+ <Textarea
810809 value={transportFields.argsText}
811810 onChange={(event) =>
812811 setTransportFields({
@@ -815,13 +814,12 @@ function McpSourceForm(props: { · 2 unmodified lines
815814 })}
816815 rows={3}
817816 placeholder='["server.js","--port","8787"]'
818− className="rounded-lg border border-input bg-background px-3 py-2 font-mono text-xs outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
819817 />
820− </label>
818+ </div>
821819
822− <label className="grid gap-2">
823− <span className="text-xs font-medium text-foreground">Environment</span>
824− <textarea
820+ <div className="grid gap-2">
821+ <Label>Environment</Label>
822+ <Textarea
825823 value={transportFields.envText}
826824 onChange={(event) =>
827825 setTransportFields({
@@ -830,37 +828,36 @@ function McpSourceForm(props: { · 2 unmodified lines
830828 })}
831829 rows={3}
832830 placeholder='{"NODE_ENV":"production"}'
833− className="rounded-lg border border-input bg-background px-3 py-2 font-mono text-xs outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
834831 />
835− </label>
832+ </div>
836833
837− <label className="grid gap-2 md:col-span-2">
838− <span className="text-xs font-medium text-foreground">Working Directory</span>
839− <input
834+ <div className="grid gap-2 md:col-span-2">
835+ <Label>Working Directory</Label>
836+ <Input
840837 value={transportFields.cwd}
841838 onChange={(event) =>
842839 setTransportFields({
843840 ...transportFields,
844841 cwd: event.target.value,
845842 })}
846− className="h-9 rounded-lg border border-input bg-background px-3 font-mono text-xs outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
843+ className="font-mono text-xs"
847844 />
848− </label>
845+ </div>
849846 </div>
850847 ) : (
851848 <div className="grid gap-4 md:grid-cols-2">
852− <label className="grid gap-2 md:col-span-2">
853− <span className="text-xs font-medium text-foreground">Endpoint</span>
854− <input
849+ <div className="grid gap-2 md:col-span-2">
850+ <Label>Endpoint</Label>
851+ <Input
855852 value={endpoint}
856853 onChange={(event) => setEndpoint(event.target.value)}
857− className="h-9 rounded-lg border border-input bg-background px-3 font-mono text-xs outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
854+ className="font-mono text-xs"
858855 />
859− </label>
856+ </div>
860857
861− <label className="grid gap-2">
862− <span className="text-xs font-medium text-foreground">Query Params</span>
863− <textarea
858+ <div className="grid gap-2">
859+ <Label>Query Params</Label>
860+ <Textarea
864861 value={transportFields.queryParamsText}
865862 onChange={(event) =>
866863 setTransportFields({
@@ -869,13 +866,12 @@ function McpSourceForm(props: { · 2 unmodified lines
869866 })}
870867 rows={3}
871868 placeholder='{"transport":"streamable-http"}'
872− className="rounded-lg border border-input bg-background px-3 py-2 font-mono text-xs outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
873869 />
874− </label>
870+ </div>
875871
876− <label className="grid gap-2">
877− <span className="text-xs font-medium text-foreground">Headers</span>
878− <textarea
872+ <div className="grid gap-2">
873+ <Label>Headers</Label>
874+ <Textarea
879875 value={transportFields.headersText}
880876 onChange={(event) =>
881877 setTransportFields({
@@ -884,16 +880,15 @@ function McpSourceForm(props: { · 2 unmodified lines
884880 })}
885881 rows={3}
886882 placeholder='{"x-api-key":"..."}'
887− className="rounded-lg border border-input bg-background px-3 py-2 font-mono text-xs outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
888883 />
889− </label>
884+ </div>
890885 </div>
891886 )}
892887
893888 {!isStdio && (
894− <label className="grid gap-2">
895− <span className="text-xs font-medium text-foreground">Auth</span>
896− <select
889+ <div className="grid gap-2">
890+ <Label>Auth</Label>
891+ <Select
897892 value={authKind}
898893 onChange={(event) => {
899894 const nextKind = event.target.value as McpConnectionAuth["kind"];
@@ -903,16 +898,15 @@ function McpSourceForm(props: { · 3 unmodified lines
903898 setOauthStatus("idle");
904899 }
905900 }}
906− className="h-9 rounded-lg border border-input bg-background px-3 text-sm outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
907901 >
908902 <option value="none">None</option>
909903 <option value="oauth2">OAuth 2.0</option>
910− </select>
911− </label>
904+ </Select>
905+ </div>
912906 )}
913907
914908 {!isStdio && authKind === "oauth2" && (
915− <div className="border-l-2 border-border pl-4">
909+ <div className="rounded-lg border border-border bg-muted/20 p-4">
916910 <div className="flex flex-wrap items-center justify-between gap-3">
917911 <div>
918912 <div className="text-sm font-medium text-foreground">OAuth</div>
@@ -920,8 +914,8 @@ function McpSourceForm(props: { · 1 unmodified line
920914 Authenticate with the MCP server's built-in OAuth flow.
921915 </div>
922916 </div>
923− <button
924− type="button"
917+ <Button
918+ variant="outline"
925919 onClick={() => {
926920 setError(null);
927921 setOauthStatus("pending");
@@ -933,10 +927,9 @@ function McpSourceForm(props: { · 5 unmodified lines
933927 );
934928 });
935929 }}
936− className="inline-flex h-9 items-center rounded-lg border border-input bg-card px-3 text-sm font-medium text-foreground transition-colors hover:bg-accent/50"
937930 >
938931 {oauthStatus === "connected" ? "Reconnect OAuth" : "Connect OAuth"}
939− </button>
932+ </Button>
940933 </div>
941934 {oauthStatus === "connected" && (
942935 <div className="mt-3 text-xs text-primary">
@@ -947,14 +940,13 @@ function McpSourceForm(props: { · 4 unmodified lines
947940 )}
948941
949942 {error && (
950− <div className="rounded-lg border border-destructive/30 bg-destructive/8 px-4 py-3 text-sm text-destructive">
943+ <Alert variant="destructive">
951944 {error}
952− </div>
945+ </Alert>
953946 )}
954947
955948 <div className="flex items-center justify-end gap-3">
956− <button
957− type="button"
949+ <Button
958950 onClick={() => {
959951 setError(null);
960952 void submitMutation
@@ -964,7 +956,6 @@ function McpSourceForm(props: { · 3 unmodified lines
964956 );
965957 }}
966958 disabled={submitMutation.status === "pending"}
967− className="inline-flex h-9 items-center rounded-lg bg-primary px-4 text-sm font-medium text-primary-foreground transition-opacity hover:opacity-90 disabled:pointer-events-none disabled:opacity-50"
968959 >
969960 {submitMutation.status === "pending"
970961 ? props.mode === "create"
@@ -973,9 +964,9 @@ function McpSourceForm(props: { · 2 unmodified lines
973964 : props.mode === "create"
974965 ? "Create Source"
975966 : "Save Changes"}
976− </button>
977− </div>
967+ </Button>
978968 </div>
969+ </Card>
979970 </div>
980971 );
981972 }
@@ -1052,9 +1043,9 @@ export function McpEditPage(props: { · 70 unmodified lines
10521043
10531044 if (Result.isFailure(configResult)) {
10541045 return (
1055− <div className="rounded-lg border border-destructive/30 bg-destructive/8 px-4 py-3 text-sm text-destructive">
1046+ <Alert variant="destructive">
10561047 Failed loading source configuration.
1057− </div>
1048+ </Alert>
10581049 );
10591050 }
10601051
@@ -1185,48 +1176,44 @@ export function McpDetailPage(props: { · 124 unmodified lines
11851176 summary={summary}
11861177 actions={(
11871178 <>
1188− <button
1189− type="button"
1179+ <Button
1180+ variant="outline"
11901181 onClick={() =>
11911182 void navigation.edit(props.source.id)}
1192− className="inline-flex h-9 items-center gap-1.5 rounded-lg border border-input bg-card px-3 text-sm font-medium text-foreground transition-colors hover:bg-accent/50"
11931183 >
11941184 <IconPencil className="size-3.5" />
11951185 Edit
1196− </button>
1186+ </Button>
11971187 {confirmDelete ? (
11981188 <div className="flex items-center gap-2">
11991189 <span className="text-xs font-medium text-destructive">
12001190 Confirm delete?
12011191 </span>
1202− <button
1203− type="button"
1192+ <Button
1193+ variant="outline"
12041194 onClick={() => setConfirmDelete(false)}
12051195 disabled={isDeleting}
1206− className="inline-flex h-9 items-center rounded-lg border border-input bg-card px-3 text-sm font-medium text-foreground transition-colors hover:bg-accent/50 disabled:pointer-events-none disabled:opacity-50"
12071196 >
12081197 Cancel
1209− </button>
1210− <button
1211− type="button"
1198+ </Button>
1199+ <Button
1200+ variant="destructive-outline"
12121201 onClick={() => {
12131202 void handleDelete().catch(() => {});
12141203 }}
12151204 disabled={isDeleting}
1216− className="inline-flex h-9 items-center rounded-lg border border-destructive/25 bg-destructive/5 px-3 text-sm font-medium text-destructive transition-colors hover:bg-destructive/10 disabled:pointer-events-none disabled:opacity-50"
12171205 >
12181206 {isDeleting ? "Deleting..." : "Delete"}
1219− </button>
1207+ </Button>
12201208 </div>
12211209 ) : (
1222− <button
1223− type="button"
1210+ <Button
1211+ variant="destructive-outline"
12241212 onClick={() => setConfirmDelete(true)}
12251213 disabled={isDeleting}
1226− className="inline-flex h-9 items-center rounded-lg border border-destructive/25 bg-destructive/5 px-3 text-sm font-medium text-destructive transition-colors hover:bg-destructive/10 disabled:pointer-events-none disabled:opacity-50"
12271214 >
12281215 Delete
1229− </button>
1216+ </Button>
12301217 )}
12311218 </>
12321219 )}
plugins/onepassword/react/components.tsx+46−59
@@ -1,4 +1,4 @@
1−import { useEffect, useState, type ReactNode } from "react";
1+import { useEffect, useState } from "react";
22
33 import {
44 getExecutorApiBaseUrl,
@@ -8,6 +8,13 @@ import { · 3 unmodified lines
88 import type {
99 SecretStoreCreateFormProps,
1010 } from "@executor/react/plugins";
11+import {
12+ Alert,
13+ Button,
14+ Input,
15+ Label,
16+ Select,
17+} from "@executor/react/plugins";
1118 import {
1219 type OnePasswordDiscoverVaultsInput,
1320 type OnePasswordDiscoverVaultsResult,
@@ -15,26 +22,6 @@ import { · 1 unmodified line
1522 type OnePasswordVault,
1623 } from "@executor/plugin-onepassword-shared";
1724
18−const fieldClassName =
19− "h-9 w-full rounded-lg border border-input bg-background px-3 text-[13px] text-foreground outline-none transition-colors placeholder:text-muted-foreground/35 focus:border-ring focus:ring-1 focus:ring-ring/25";
20−
21−const buttonClassName =
22− "inline-flex h-9 items-center justify-center rounded-lg border border-input bg-card px-3 text-[13px] font-medium text-foreground transition-colors hover:bg-accent/50 disabled:pointer-events-none disabled:opacity-50";
23−
24−const primaryButtonClassName =
25− "inline-flex h-9 items-center justify-center rounded-lg bg-primary px-3 text-[13px] font-medium text-primary-foreground transition-opacity hover:opacity-90 disabled:pointer-events-none disabled:opacity-50";
26−
27−function FieldLabel(props: {
28− label: string;
29− children: ReactNode;
30−}) {
31− return (
32− <label className="grid gap-2">
33− <span className="text-[12px] font-medium text-foreground">{props.label}</span>
34− {props.children}
35− </label>
36− );
37−}
3825
3926 export function OnePasswordSecretStoreCreateForm(
4027 props: SecretStoreCreateFormProps,
@@ -189,66 +176,66 @@ export function OnePasswordSecretStoreCreateForm( · 148 unmodified lines
189176 return (
190177 <div className="space-y-4">
191178 {error && (
192− <div className="rounded-lg border border-destructive/30 bg-destructive/8 px-4 py-2.5 text-[13px] text-destructive">
179+ <Alert variant="destructive">
193180 {error}
194− </div>
181+ </Alert>
195182 )}
196183
197− <FieldLabel label="Name">
198− <input
184+ <div className="grid gap-2">
185+ <Label>Name</Label>
186+ <Input
199187 value={name}
200188 onChange={(event) => setName(event.target.value)}
201189 placeholder="Team 1Password"
202− className={fieldClassName}
203190 autoFocus
204191 />
205− </FieldLabel>
192+ </div>
206193
207194 <div className="grid gap-4 sm:grid-cols-2">
208− <FieldLabel label="Auth method">
209− <select
195+ <div className="grid gap-2">
196+ <Label>Auth method</Label>
197+ <Select
210198 value={authKind}
211199 onChange={(event) =>
212200 setAuthKind(event.target.value as "desktop-app" | "service-account")}
213− className={fieldClassName}
214201 >
215202 <option value="desktop-app">Desktop app</option>
216203 <option value="service-account">Service account</option>
217− </select>
218− </FieldLabel>
204+ </Select>
205+ </div>
219206 <div className="flex items-end">
220− <button
207+ <Button
208+ variant="outline"
221209 type="button"
222210 onClick={() => {
223211 void handleDiscoverVaults();
224212 }}
225213 disabled={discoverVaultsMutation.status === "pending"}
226− className={buttonClassName}
227214 >
228215 {discoverVaultsMutation.status === "pending" ? "Loading..." : "Load vaults"}
229− </button>
216+ </Button>
230217 </div>
231218 </div>
232219
233220 {authKind === "desktop-app" ? (
234− <FieldLabel label="Account name or UUID">
235− <input
221+ <div className="grid gap-2">
222+ <Label>Account name or UUID</Label>
223+ <Input
236224 value={accountName}
237225 onChange={(event) => setAccountName(event.target.value)}
238226 placeholder="my.1password.com"
239− className={fieldClassName}
240227 />
241228 <div className="text-[11px] text-muted-foreground">
242229 Use the account shown in the 1Password desktop app sidebar or the
243230 account UUID from <code>op account list --format json</code>.
244231 </div>
245− </FieldLabel>
232+ </div>
246233 ) : (
247− <FieldLabel label="Service Account Token Secret">
248− <select
234+ <div className="grid gap-2">
235+ <Label>Service Account Token Secret</Label>
236+ <Select
249237 value={tokenSecretId}
250238 onChange={(event) => setTokenSecretId(event.target.value)}
251− className={fieldClassName}
252239 >
253240 <option value="">
254241 {props.secrets.status === "ready"
@@ -261,60 +248,60 @@ export function OnePasswordSecretStoreCreateForm( · 6 unmodified lines
261248 {secret.name ?? secret.id}
262249 </option>
263250 ))}
264− </select>
251+ </Select>
265252 <div className="text-[11px] text-muted-foreground">
266253 Use this for remote or headless automation. Desktop app auth is better for
267254 local Executor use.
268255 </div>
269− </FieldLabel>
256+ </div>
270257 )}
271258
272259 {discoveredVaults.length > 0 && (
273− <FieldLabel label="Discovered vaults">
274− <select
260+ <div className="grid gap-2">
261+ <Label>Discovered vaults</Label>
262+ <Select
275263 value={vaultId}
276264 onChange={(event) => setVaultId(event.target.value)}
277− className={fieldClassName}
278265 >
279266 {discoveredVaults.map((vault) => (
280267 <option key={vault.id} value={vault.id}>
281268 {vault.name}
282269 </option>
283270 ))}
284− </select>
271+ </Select>
285272 <div className="text-[11px] text-muted-foreground">
286273 Pick from the vaults visible to this account, or override the id below.
287274 </div>
288− </FieldLabel>
275+ </div>
289276 )}
290277
291− <FieldLabel label="Vault ID">
292− <input
278+ <div className="grid gap-2">
279+ <Label>Vault ID</Label>
280+ <Input
293281 value={vaultId}
294282 onChange={(event) => setVaultId(event.target.value)}
295283 placeholder="vlt_..."
296− className={`${fieldClassName} font-mono text-[12px]`}
284+ className="font-mono text-[12px]"
297285 />
298− </FieldLabel>
286+ </div>
299287
300288 <div className="flex justify-end gap-2">
301− <button
289+ <Button
290+ variant="outline"
302291 type="button"
303292 onClick={props.onCancel}
304− className={buttonClassName}
305293 >
306294 Cancel
307− </button>
308− <button
295+ </Button>
296+ <Button
309297 type="button"
310298 onClick={() => {
311299 void handleSubmit();
312300 }}
313301 disabled={props.isSubmitting}
314− className={primaryButtonClassName}
315302 >
316303 {props.isSubmitting ? "Creating..." : "Create store"}
317− </button>
304+ </Button>
318305 </div>
319306 </div>
320307 );
plugins/openapi/react/components.tsx+69−61
@@ -13,8 +13,14 @@ import { · 12 unmodified lines
1313 useWorkspaceRequestContext,
1414 } from "@executor/react";
1515 import {
16+ Alert,
17+ Button,
18+ Card,
1619 DocumentPanel,
1720 IconPencil,
21+ Input,
22+ Label,
23+ Select,
1824 SourceToolDetailPanel,
1925 SourceToolExplorer,
2026 parseSourceToolExplorerSearch,
@@ -381,63 +387,61 @@ function OpenApiSourceForm(props: { · 360 unmodified lines
381387 };
382388
383389 return (
384− <div className="space-y-6 rounded-xl border border-border p-6">
390+ <Card className="space-y-6 p-6">
385391 <Section title="Connection">
386392 <div className="grid gap-4">
387− <label className="grid gap-2">
388− <span className="text-xs font-medium text-foreground">Name</span>
389− <input
393+ <div className="grid gap-2">
394+ <Label>Name</Label>
395+ <Input
390396 value={name}
391397 onChange={(event) => {
392398 setNameEdited(true);
393399 setName(event.target.value);
394400 }}
395401 placeholder="GitHub REST"
396− className="h-9 w-full rounded-lg border border-input bg-background px-3 text-sm text-foreground outline-none transition-colors placeholder:text-muted-foreground/40 focus:border-ring focus:ring-1 focus:ring-ring/25"
397402 />
398− </label>
403+ </div>
399404
400− <label className="grid gap-2">
401− <span className="text-xs font-medium text-foreground">Spec URL</span>
402− <input
405+ <div className="grid gap-2">
406+ <Label>Spec URL</Label>
407+ <Input
403408 value={specUrl}
404409 onChange={(event) => setSpecUrl(event.target.value)}
405410 onBlur={() => {
406411 void runPreview({ mode: "manual" });
407412 }}
408413 placeholder="https://example.com/openapi.json"
409− className="h-9 w-full rounded-lg border border-input bg-background px-3 font-mono text-xs text-foreground outline-none transition-colors placeholder:text-muted-foreground/40 focus:border-ring focus:ring-1 focus:ring-ring/25"
414+ className="font-mono text-xs"
410415 />
411− </label>
416+ </div>
412417
413− <label className="grid gap-2">
414− <span className="text-xs font-medium text-foreground">Base URL</span>
415− <input
418+ <div className="grid gap-2">
419+ <Label>Base URL</Label>
420+ <Input
416421 value={baseUrl}
417422 onChange={(event) => {
418423 setBaseUrlEdited(true);
419424 setBaseUrl(event.target.value);
420425 }}
421426 placeholder="https://api.example.com"
422− className="h-9 w-full rounded-lg border border-input bg-background px-3 font-mono text-xs text-foreground outline-none transition-colors placeholder:text-muted-foreground/40 focus:border-ring focus:ring-1 focus:ring-ring/25"
427+ className="font-mono text-xs"
423428 />
424− </label>
429+ </div>
425430
426− <label className="grid gap-2">
427− <span className="text-xs font-medium text-foreground">Auth</span>
428− <select
431+ <div className="grid gap-2">
432+ <Label>Auth</Label>
433+ <Select
429434 value={authKind}
430435 onChange={(event) =>
431436 setAuthKind(event.target.value as OpenApiConnectInput["auth"]["kind"])}
432− className="h-9 w-full rounded-lg border border-input bg-background px-3 text-sm text-foreground outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
433437 >
434438 <option value="none">None</option>
435439 <option value="bearer">Bearer Secret</option>
436− </select>
437− </label>
440+ </Select>
441+ </div>
438442
439443 {authKind === "bearer" && (
440− <div className="space-y-4 border-l-2 border-border pl-4">
444+ <div className="space-y-4 rounded-lg border border-border bg-muted/20 p-4">
441445 <SecretReferenceField
442446 label="Secret"
443447 value={tokenSecretRef}
@@ -448,25 +452,25 @@ function OpenApiSourceForm(props: { · 4 unmodified lines
448452 />
449453
450454 <div className="grid gap-4 sm:grid-cols-2">
451− <label className="grid gap-2">
452− <span className="text-xs font-medium text-foreground">Header Name</span>
453− <input
455+ <div className="grid gap-2">
456+ <Label>Header Name</Label>
457+ <Input
454458 value={authHeaderName}
455459 onChange={(event) => setAuthHeaderName(event.target.value)}
456460 placeholder={DEFAULT_BEARER_HEADER_NAME}
457− className="h-9 w-full rounded-lg border border-input bg-background px-3 font-mono text-xs text-foreground outline-none transition-colors placeholder:text-muted-foreground/40 focus:border-ring focus:ring-1 focus:ring-ring/25"
461+ className="font-mono text-xs"
458462 />
459− </label>
463+ </div>
460464
461− <label className="grid gap-2">
462− <span className="text-xs font-medium text-foreground">Prefix</span>
463− <input
465+ <div className="grid gap-2">
466+ <Label>Prefix</Label>
467+ <Input
464468 value={authPrefix}
465469 onChange={(event) => setAuthPrefix(event.target.value)}
466470 placeholder={DEFAULT_BEARER_PREFIX}
467− className="h-9 w-full rounded-lg border border-input bg-background px-3 font-mono text-xs text-foreground outline-none transition-colors placeholder:text-muted-foreground/40 focus:border-ring focus:ring-1 focus:ring-ring/25"
471+ className="font-mono text-xs"
468472 />
469− </label>
473+ </div>
470474 </div>
471475 </div>
472476 )}
@@ -475,16 +479,16 @@ function OpenApiSourceForm(props: { · 2 unmodified lines
475479
476480 <Section title="Preview">
477481 <div className="flex items-center gap-3">
478− <button
482+ <Button
483+ variant="outline"
479484 type="button"
480485 onClick={() => {
481486 void runPreview({ mode: "manual" });
482487 }}
483488 disabled={previewMutation.status === "pending" || submitMutation.status === "pending"}
484− className="inline-flex h-9 items-center justify-center rounded-lg border border-input bg-card px-3 text-sm font-medium text-foreground transition-colors hover:bg-accent/50 disabled:pointer-events-none disabled:opacity-50"
485489 >
486490 {previewMutation.status === "pending" ? "Previewing..." : "Preview Spec"}
487− </button>
491+ </Button>
488492 {preview && (
489493 <div className="text-xs text-muted-foreground">
490494 {preview.operationCount} operations
@@ -519,33 +523,32 @@ function OpenApiSourceForm(props: { · 28 unmodified lines
519523 )}
520524 </dl>
521525 {preview.warnings.length > 0 && (
522− <div className="mt-3 rounded-md border border-amber-300/40 bg-amber-100/20 px-3 py-2 text-xs text-amber-800">
526+ <Alert variant="warning" className="mt-3 text-xs">
523527 {preview.warnings.join(" ")}
524− </div>
528+ </Alert>
525529 )}
526530 </div>
527531 )}
528532 </Section>
529533
530534 {error && (
531− <div className="rounded-lg border border-destructive/30 bg-destructive/8 px-4 py-2.5 text-sm text-destructive">
535+ <Alert variant="destructive">
532536 {error}
533− </div>
537+ </Alert>
534538 )}
535539
536540 <div className="flex items-center justify-end">
537− <button
541+ <Button
538542 type="button"
539543 onClick={() => {
540544 void handleSubmit();
541545 }}
542546 disabled={submitMutation.status === "pending"}
543− className="inline-flex h-9 items-center justify-center rounded-lg bg-primary px-4 text-sm font-medium text-primary-foreground transition-opacity hover:opacity-90 disabled:pointer-events-none disabled:opacity-50"
544547 >
545548 {submitMutation.status === "pending" ? props.busyLabel : props.submitLabel}
546− </button>
549+ </Button>
547550 </div>
548− </div>
551+ </Card>
549552 );
550553 }
551554
@@ -641,9 +644,9 @@ function OpenApiEditSourcePageReady(props: { · 89 unmodified lines
641644 if (Result.isFailure(configResult)) {
642645 return (
643646 <Section title="Edit Source">
644− <div className="rounded-lg border border-destructive/30 bg-destructive/8 p-4 text-sm text-destructive">
647+ <Alert variant="destructive">
645648 Failed loading source configuration.
646− </div>
649+ </Alert>
647650 </Section>
648651 );
649652 }
@@ -778,38 +781,43 @@ function OpenApiSourceDetailPageReady(props: { · 128 unmodified lines
778781 })}
779782 actions={(
780783 <>
781− <button
784+ <Button
785+ variant="outline"
786+ size="sm"
782787 type="button"
783788 onClick={() => {
784789 void refreshMutation.mutateAsync(props.source.id);
785790 }}
786791 disabled={refreshMutation.status === "pending"}
787− className="inline-flex items-center gap-1.5 rounded-md border border-border bg-card px-2.5 py-1 text-[12px] font-medium text-muted-foreground transition-colors hover:bg-accent/50 hover:text-foreground disabled:pointer-events-none disabled:opacity-50"
788792 >
789793 {refreshMutation.status === "pending" ? "Refreshing..." : "Refresh"}
790− </button>
791− <button
794+ </Button>
795+ <Button
796+ variant="outline"
797+ size="sm"
792798 type="button"
793799 onClick={() => void navigation.edit(props.source.id)}
794− className="inline-flex items-center gap-1.5 rounded-md border border-border bg-card px-2.5 py-1 text-[12px] font-medium text-muted-foreground transition-colors hover:bg-accent/50 hover:text-foreground"
795800 >
796801 <IconPencil className="size-3" />
797802 Edit
798− </button>
803+ </Button>
799804 {confirmDelete ? (
800805 <div className="flex items-center gap-2">
801806 <span className="text-[11px] font-medium text-destructive">
802807 Confirm delete?
803808 </span>
804− <button
809+ <Button
810+ variant="outline"
811+ size="sm"
805812 type="button"
806813 onClick={() => setConfirmDelete(false)}
807814 disabled={removeMutation.status === "pending"}
808− className="inline-flex items-center rounded-md border border-border bg-card px-2.5 py-1 text-[12px] font-medium text-muted-foreground transition-colors hover:bg-accent/50 hover:text-foreground disabled:pointer-events-none disabled:opacity-50"
809815 >
810816 Cancel
811− </button>
812− <button
817+ </Button>
818+ <Button
819+ variant="destructive-outline"
820+ size="sm"
813821 type="button"
814822 onClick={() => {
815823 void removeMutation.mutateAsync(props.source.id).then(() => {
@@ -821,20 +829,20 @@ function OpenApiSourceDetailPageReady(props: { · 5 unmodified lines
821829 });
822830 }}
823831 disabled={removeMutation.status === "pending"}
824− className="inline-flex items-center rounded-md border border-destructive/25 bg-destructive/5 px-2.5 py-1 text-[12px] font-medium text-destructive transition-colors hover:bg-destructive/10 disabled:pointer-events-none disabled:opacity-50"
825832 >
826833 {removeMutation.status === "pending" ? "Deleting..." : "Delete"}
827− </button>
834+ </Button>
828835 </div>
829836 ) : (
830− <button
837+ <Button
838+ variant="destructive-outline"
839+ size="sm"
831840 type="button"
832841 onClick={() => setConfirmDelete(true)}
833842 disabled={removeMutation.status === "pending"}
834− className="inline-flex items-center rounded-md border border-destructive/25 bg-destructive/5 px-2.5 py-1 text-[12px] font-medium text-destructive transition-colors hover:bg-destructive/10 disabled:pointer-events-none disabled:opacity-50"
835843 >
836844 Delete
837− </button>
845+ </Button>
838846 )}
839847 </>
840848 )}