- 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
Unified · Split
| @@ -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 | +} | |
| @@ -9,13 +9,14 @@ · 8 unmodified lines | ||
| 9 | 9 | "start": "NODE_ENV=production bun src/server.ts" |
| 10 | 10 | }, |
| 11 | 11 | "dependencies": { |
| 12 | + "@base-ui/react": "^1.3.0", | |
| 12 | 13 | "@executor/plugin-execution-history-react": "workspace:*", |
| 13 | 14 | "@executor/plugin-google-discovery-react": "workspace:*", |
| 14 | 15 | "@executor/plugin-graphql-react": "workspace:*", |
| 15 | 16 | "@executor/plugin-local-tools-react": "workspace:*", |
| 16 | 17 | "@executor/plugin-mcp-react": "workspace:*", |
| 17 | − "@executor/plugin-openapi-react": "workspace:*", | |
| 18 | 18 | "@executor/plugin-onepassword-react": "workspace:*", |
| 19 | + "@executor/plugin-openapi-react": "workspace:*", | |
| 19 | 20 | "@executor/react": "workspace:*", |
| 20 | 21 | "@executor/server": "workspace:*", |
| 21 | 22 | "@shikijs/langs": "^4.0.1", |
| @@ -24,9 +25,11 @@ · 2 unmodified lines | ||
| 24 | 25 | "class-variance-authority": "^0.7.1", |
| 25 | 26 | "clsx": "^2.1.1", |
| 26 | 27 | "effect": "catalog:", |
| 28 | + "lucide-react": "^1.7.0", | |
| 27 | 29 | "react": "^19.2.0", |
| 28 | 30 | "react-dom": "^19.2.0", |
| 29 | 31 | "react-grab": "^0.1.26", |
| 32 | + "shadcn": "^4.1.1", | |
| 30 | 33 | "shiki": "^4.0.1", |
| 31 | 34 | "streamdown": "^2.3.0", |
| 32 | 35 | "tailwind-merge": "^3.5.0", |
| @@ -1,4 +1,5 @@ | ||
| 1 | 1 | import { useEffect, useState, useRef, useCallback } from "react"; |
| 2 | +import { Button } from "@executor/react/plugins"; | |
| 2 | 3 | import { codeToHtml, resolveLang } from "../lib/shiki"; |
| 3 | 4 | import { cn } from "../lib/utils"; |
| 4 | 5 | import { IconCopy, IconCheck } from "./icons"; |
| @@ -68,14 +69,16 @@ export function CodeBlock(props: { · 63 unmodified lines | ||
| 68 | 69 | return ( |
| 69 | 70 | <div className={cn("group relative overflow-auto", className)}> |
| 70 | 71 | {/* Copy button */} |
| 71 | − <button | |
| 72 | + <Button | |
| 72 | 73 | type="button" |
| 74 | + variant="ghost" | |
| 75 | + size="icon" | |
| 73 | 76 | 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" | |
| 75 | 78 | title="Copy to clipboard" |
| 76 | 79 | > |
| 77 | 80 | {copied ? <IconCheck className="size-3" /> : <IconCopy className="size-3" />} |
| 78 | − </button> | |
| 81 | + </Button> | |
| 79 | 82 | |
| 80 | 83 | {html ? ( |
| 81 | 84 | <div |
| @@ -1,4 +1,5 @@ | ||
| 1 | 1 | import { useEffect, useState } from "react"; |
| 2 | +import { Button } from "@executor/react/plugins"; | |
| 2 | 3 | import { CodeBlock } from "./code-block"; |
| 3 | 4 | import { cn } from "../lib/utils"; |
| 4 | 5 | |
| @@ -44,19 +45,16 @@ export function LocalMcpInstallCard(props: { · 39 unmodified lines | ||
| 44 | 45 | { key: "stdio" as const, label: "Standard I/O" }, |
| 45 | 46 | { key: "http" as const, label: "Remote HTTP" }, |
| 46 | 47 | ].map((option) => ( |
| 47 | − <button | |
| 48 | + <Button | |
| 48 | 49 | key={option.key} |
| 49 | 50 | type="button" |
| 51 | + variant={mode === option.key ? "default" : "ghost"} | |
| 52 | + size="sm" | |
| 50 | 53 | 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" | |
| 57 | 55 | > |
| 58 | 56 | {option.label} |
| 59 | − </button> | |
| 57 | + </Button> | |
| 60 | 58 | ))} |
| 61 | 59 | </div> |
| 62 | 60 | <CodeBlock code={command} lang="bash" className="rounded-xl border border-border bg-background/70" /> |
| @@ -1,7 +1,7 @@ | ||
| 1 | 1 | import { Link, Outlet, useLocation, useMatchRoute } from "@tanstack/react-router"; |
| 2 | 2 | import { useCallback, useEffect, useState } from "react"; |
| 3 | 3 | import { useSources, type Source } from "@executor/react"; |
| 4 | −import { sourcePluginsIndexPath } from "@executor/react/plugins"; | |
| 4 | +import { Button, sourcePluginsIndexPath } from "@executor/react/plugins"; | |
| 5 | 5 | import { cn } from "../lib/utils"; |
| 6 | 6 | import { IconPlus, IconCopy, IconCheck, IconClose, IconMenu } from "./icons"; |
| 7 | 7 | import { LoadableBlock } from "./loadable"; |
| @@ -199,10 +199,11 @@ function UpdateCard(props: { latestVersion: string; channel: UpdateChannel }) { · 191 unmodified lines | ||
| 199 | 199 | </p> |
| 200 | 200 | </div> |
| 201 | 201 | </div> |
| 202 | − <button | |
| 202 | + <Button | |
| 203 | 203 | type="button" |
| 204 | + variant="outline" | |
| 204 | 205 | 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" | |
| 206 | 207 | > |
| 207 | 208 | <code className="truncate font-mono text-[10px] text-sidebar-foreground"> |
| 208 | 209 | {command} |
| @@ -214,7 +215,7 @@ function UpdateCard(props: { latestVersion: string; channel: UpdateChannel }) { · 5 unmodified lines | ||
| 214 | 215 | <IconCopy className="size-3" /> |
| 215 | 216 | )} |
| 216 | 217 | </span> |
| 217 | − </button> | |
| 218 | + </Button> | |
| 218 | 219 | </div> |
| 219 | 220 | ); |
| 220 | 221 | } |
| @@ -285,14 +286,16 @@ export function AppShell() { · 64 unmodified lines | ||
| 285 | 286 | v3 |
| 286 | 287 | </span> |
| 287 | 288 | </Link> |
| 288 | − <button | |
| 289 | + <Button | |
| 289 | 290 | type="button" |
| 291 | + variant="ghost" | |
| 292 | + size="icon" | |
| 290 | 293 | aria-label="Close navigation" |
| 291 | 294 | 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" | |
| 293 | 296 | > |
| 294 | 297 | <IconClose className="size-3.5" /> |
| 295 | − </button> | |
| 298 | + </Button> | |
| 296 | 299 | </div> |
| 297 | 300 | <SidebarContent |
| 298 | 301 | isHome={!!isHome} |
| @@ -314,14 +317,16 @@ export function AppShell() { · 15 unmodified lines | ||
| 314 | 317 | {/* Main content */} |
| 315 | 318 | <main className="flex min-h-0 flex-1 flex-col min-w-0 overflow-hidden"> |
| 316 | 319 | <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 | |
| 318 | 321 | type="button" |
| 322 | + variant="outline" | |
| 323 | + size="icon" | |
| 319 | 324 | aria-label="Open navigation" |
| 320 | 325 | 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" | |
| 322 | 327 | > |
| 323 | 328 | <IconMenu className="size-4" /> |
| 324 | − </button> | |
| 329 | + </Button> | |
| 325 | 330 | <Link to="/" className="flex items-center gap-1.5"> |
| 326 | 331 | <span className="font-display text-base tracking-tight text-foreground"> |
| 327 | 332 | executor |
| @@ -10,7 +10,7 @@ export function SourcePluginsResetState( · 9 unmodified lines | ||
| 10 | 10 | input: SourcePluginsResetStateProps, |
| 11 | 11 | ) { |
| 12 | 12 | 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"> | |
| 14 | 14 | <div className="mx-auto max-w-3xl px-6 py-10 lg:px-10 lg:py-14"> |
| 15 | 15 | <div className="rounded-2xl border border-border bg-card p-8"> |
| 16 | 16 | <h2 className="font-display text-xl tracking-tight text-foreground"> |
| @@ -1,8 +1,7 @@ | ||
| 1 | 1 | import type { Source } from "@executor/react"; |
| 2 | 2 | |
| 3 | +import { Badge, Button } from "@executor/react/plugins"; | |
| 3 | 4 | import { cn } from "../lib/utils"; |
| 4 | −import { Button } from "./ui/button"; | |
| 5 | −import { Badge } from "./ui/badge"; | |
| 6 | 5 | import { IconSpinner, IconTool } from "./icons"; |
| 7 | 6 | |
| 8 | 7 | export function SourceRecoveryState(props: { |
| @@ -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 | −} | |
| @@ -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 | −} | |
| @@ -1,7 +1,10 @@ | ||
| 1 | 1 | @import "tailwindcss"; |
| 2 | 2 | @import "tw-animate-css"; |
| 3 | +@import "shadcn/tailwind.css"; | |
| 3 | 4 | |
| 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"; | |
| 5 | 8 | |
| 6 | 9 | @custom-variant dark (&:is(.dark *)); |
| 7 | 10 | |
| @@ -9,6 +12,7 @@ · 1 unmodified line | ||
| 9 | 12 | --font-sans: "DM Sans", ui-sans-serif, system-ui, sans-serif; |
| 10 | 13 | --font-mono: "JetBrains Mono", "IBM Plex Mono", ui-monospace, monospace; |
| 11 | 14 | --font-display: "Instrument Serif", Georgia, serif; |
| 15 | + --font-heading: var(--font-sans); | |
| 12 | 16 | |
| 13 | 17 | --color-background: var(--background); |
| 14 | 18 | --color-foreground: var(--foreground); |
| @@ -33,6 +37,25 @@ · 18 unmodified lines | ||
| 33 | 37 | --color-sidebar-foreground: var(--sidebar-foreground); |
| 34 | 38 | --color-sidebar-border: var(--sidebar-border); |
| 35 | 39 | --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); | |
| 36 | 59 | } |
| 37 | 60 | |
| 38 | 61 | /* |
| @@ -44,6 +67,8 @@ · 5 unmodified lines | ||
| 44 | 67 | /* ——— Light theme (default) ——— */ |
| 45 | 68 | :root { |
| 46 | 69 | color-scheme: light dark; |
| 70 | + --radius: 0.625rem; | |
| 71 | + | |
| 47 | 72 | --background: oklch(0.985 0.002 260); |
| 48 | 73 | --foreground: oklch(0.145 0.005 260); |
| 49 | 74 | --card: oklch(0.99 0.001 260); |
| @@ -67,6 +92,17 @@ · 17 unmodified lines | ||
| 67 | 92 | --sidebar-foreground: oklch(0.32 0.008 260); |
| 68 | 93 | --sidebar-border: oklch(0.90 0.005 260); |
| 69 | 94 | --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); | |
| 70 | 106 | |
| 71 | 107 | /* Method colors */ |
| 72 | 108 | --method-get: oklch(0.55 0.18 155); |
| @@ -104,6 +140,17 @@ · 31 unmodified lines | ||
| 104 | 140 | --sidebar-foreground: oklch(0.72 0.008 250); |
| 105 | 141 | --sidebar-border: oklch(0.20 0.006 260); |
| 106 | 142 | --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); | |
| 107 | 154 | |
| 108 | 155 | /* Method colors */ |
| 109 | 156 | --method-get: oklch(0.75 0.16 155); |
| @@ -118,7 +165,7 @@ · 8 unmodified lines | ||
| 118 | 165 | |
| 119 | 166 | @layer base { |
| 120 | 167 | * { |
| 121 | − @apply border-border; | |
| 168 | + @apply border-border outline-ring/50; | |
| 122 | 169 | } |
| 123 | 170 | |
| 124 | 171 | html, |
| @@ -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" | |
| 3 | 3 | |
| 4 | −export function cn(...inputs: ReadonlyArray<ClassValue>): string { | |
| 5 | − return twMerge(clsx(inputs)); | |
| 4 | +export function cn(...inputs: ClassValue[]) { | |
| 5 | + return twMerge(clsx(inputs)) | |
| 6 | 6 | } |
| @@ -1,6 +1,10 @@ | ||
| 1 | 1 | import { useState, type FormEvent } from "react"; |
| 2 | 2 | import { Link, useNavigate } from "@tanstack/react-router"; |
| 3 | 3 | import { |
| 4 | + Alert, | |
| 5 | + Button, | |
| 6 | + Card, | |
| 7 | + Input, | |
| 4 | 8 | ExecutorPluginRouteProvider, |
| 5 | 9 | createSourcePluginPaths, |
| 6 | 10 | type ExecutorPluginNavigation, |
| @@ -61,7 +65,7 @@ const SourceQuickEntry = () => { · 54 unmodified lines | ||
| 61 | 65 | }; |
| 62 | 66 | |
| 63 | 67 | return ( |
| 64 | − <div className="rounded-2xl border border-border bg-card p-6"> | |
| 68 | + <Card className="rounded-2xl"> | |
| 65 | 69 | <h2 className="font-display text-lg font-semibold tracking-tight text-foreground"> |
| 66 | 70 | Quick add |
| 67 | 71 | </h2> |
| @@ -71,27 +75,24 @@ const SourceQuickEntry = () => { · 3 unmodified lines | ||
| 71 | 75 | |
| 72 | 76 | <form onSubmit={handleSubmit} className="mt-4"> |
| 73 | 77 | <div className="flex flex-col gap-3 sm:flex-row"> |
| 74 | − <input | |
| 78 | + <Input | |
| 75 | 79 | value={value} |
| 76 | 80 | onChange={(event) => setValue(event.target.value)} |
| 77 | 81 | 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" | |
| 79 | 83 | /> |
| 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"> | |
| 84 | 85 | Add source |
| 85 | − </button> | |
| 86 | + </Button> | |
| 86 | 87 | </div> |
| 87 | 88 | |
| 88 | 89 | {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"> | |
| 90 | 91 | {error} |
| 91 | − </div> | |
| 92 | + </Alert> | |
| 92 | 93 | )} |
| 93 | 94 | </form> |
| 94 | − </div> | |
| 95 | + </Card> | |
| 95 | 96 | ); |
| 96 | 97 | }; |
| 97 | 98 | |
| @@ -4,8 +4,7 @@ import { sourcePluginsIndexPath } from "@executor/react/plugins"; · 3 unmodified lines | ||
| 4 | 4 | import { LoadableBlock } from "../components/loadable"; |
| 5 | 5 | import { LocalMcpInstallCard } from "../components/local-mcp-install-card"; |
| 6 | 6 | 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"; | |
| 9 | 8 | import { IconSources, IconPlus } from "../components/icons"; |
| 10 | 9 | import { |
| 11 | 10 | getSourceFrontendPaths, |
| @@ -48,9 +47,9 @@ export function HomePage() { · 36 unmodified lines | ||
| 48 | 47 | <LoadableBlock loadable={sources} loading="Loading sources..."> |
| 49 | 48 | {(items) => |
| 50 | 49 | !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"> | |
| 52 | 51 | Sources returned an unexpected payload. |
| 53 | − </div> | |
| 52 | + </Alert> | |
| 54 | 53 | ) : items.length === 0 ? ( |
| 55 | 54 | <div className="flex flex-col items-center justify-center rounded-2xl border border-dashed border-border py-20"> |
| 56 | 55 | <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 | ||
| 74 | 73 | {items.map((source) => { |
| 75 | 74 | const paths = getSourceFrontendPaths(source.kind); |
| 76 | 75 | 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"> | |
| 78 | 77 | <div className="flex items-start gap-3"> |
| 79 | 78 | <div className="flex size-9 shrink-0 items-center justify-center rounded-lg bg-muted text-muted-foreground"> |
| 80 | 79 | <SourceFavicon source={source} className="size-4" /> |
| @@ -93,7 +92,7 @@ export function HomePage() { · 12 unmodified lines | ||
| 93 | 92 | </div> |
| 94 | 93 | </div> |
| 95 | 94 | </div> |
| 96 | − </div> | |
| 95 | + </Card> | |
| 97 | 96 | ); |
| 98 | 97 | |
| 99 | 98 | if (!paths) { |
| @@ -19,8 +19,15 @@ import { · 18 unmodified lines | ||
| 19 | 19 | } from "@executor/react"; |
| 20 | 20 | |
| 21 | 21 | 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"; | |
| 24 | 31 | import { |
| 25 | 32 | IconPencil, |
| 26 | 33 | IconPlus, |
| @@ -194,7 +201,7 @@ export function SecretsPage() { · 167 unmodified lines | ||
| 194 | 201 | }} |
| 195 | 202 | /> |
| 196 | 203 | ) : ( |
| 197 | − <div className="overflow-hidden rounded-xl border border-border bg-card/80"> | |
| 204 | + <Card className="overflow-hidden p-0"> | |
| 198 | 205 | {items.map((secret, index) => ( |
| 199 | 206 | <div |
| 200 | 207 | key={secret.id} |
| @@ -212,7 +219,7 @@ export function SecretsPage() { · 11 unmodified lines | ||
| 212 | 219 | /> |
| 213 | 220 | </div> |
| 214 | 221 | ))} |
| 215 | − </div> | |
| 222 | + </Card> | |
| 216 | 223 | ) |
| 217 | 224 | } |
| 218 | 225 | </LoadableBlock> |
| @@ -283,29 +290,29 @@ function CreateSecretStoreForm(props: { · 64 unmodified lines | ||
| 283 | 290 | ) : ( |
| 284 | 291 | <> |
| 285 | 292 | <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 | |
| 288 | 296 | value={kind} |
| 289 | 297 | 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" | |
| 291 | 298 | > |
| 292 | 299 | {props.pluginOptions.map((plugin) => ( |
| 293 | 300 | <option key={plugin.kind} value={plugin.kind}> |
| 294 | 301 | {plugin.displayName} |
| 295 | 302 | </option> |
| 296 | 303 | ))} |
| 297 | − </select> | |
| 298 | − </FieldLabel> | |
| 304 | + </Select> | |
| 305 | + </div> | |
| 299 | 306 | {!StoreCreateForm && ( |
| 300 | − <FieldLabel label="Name"> | |
| 301 | − <input | |
| 307 | + <div className="grid gap-2"> | |
| 308 | + <Label>Name</Label> | |
| 309 | + <Input | |
| 302 | 310 | value={name} |
| 303 | 311 | onChange={(event) => setName(event.target.value)} |
| 304 | 312 | 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" | |
| 306 | 313 | autoFocus |
| 307 | 314 | /> |
| 308 | − </FieldLabel> | |
| 315 | + </div> | |
| 309 | 316 | )} |
| 310 | 317 | </div> |
| 311 | 318 | |
| @@ -582,50 +589,51 @@ function CreateSecretForm(props: { · 270 unmodified lines | ||
| 582 | 589 | > |
| 583 | 590 | {error && <ErrorBanner>{error}</ErrorBanner>} |
| 584 | 591 | <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 | |
| 587 | 595 | value={storeId} |
| 588 | 596 | 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" | |
| 590 | 597 | > |
| 591 | 598 | {props.storeOptions.map((store) => ( |
| 592 | 599 | <option key={store.id} value={store.id}> |
| 593 | 600 | {store.name} |
| 594 | 601 | </option> |
| 595 | 602 | ))} |
| 596 | − </select> | |
| 597 | − </FieldLabel> | |
| 603 | + </Select> | |
| 604 | + </div> | |
| 598 | 605 | {canImportSecrets && canCreateSecrets && ( |
| 599 | − <FieldLabel label="Mode"> | |
| 600 | − <select | |
| 606 | + <div className="grid gap-2"> | |
| 607 | + <Label>Mode</Label> | |
| 608 | + <Select | |
| 601 | 609 | value={mode} |
| 602 | 610 | 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" | |
| 604 | 611 | > |
| 605 | 612 | <option value="import">Import from store</option> |
| 606 | 613 | <option value="create">Create new secret</option> |
| 607 | − </select> | |
| 608 | − </FieldLabel> | |
| 614 | + </Select> | |
| 615 | + </div> | |
| 609 | 616 | )} |
| 610 | − <FieldLabel label="Name"> | |
| 611 | − <input | |
| 617 | + <div className="grid gap-2"> | |
| 618 | + <Label>Name</Label> | |
| 619 | + <Input | |
| 612 | 620 | value={name} |
| 613 | 621 | onChange={(event) => setName(event.target.value)} |
| 614 | 622 | 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" | |
| 616 | 623 | autoFocus |
| 617 | 624 | /> |
| 618 | − </FieldLabel> | |
| 625 | + </div> | |
| 619 | 626 | {mode === "create" && ( |
| 620 | − <FieldLabel label="Value"> | |
| 621 | − <input | |
| 627 | + <div className="grid gap-2"> | |
| 628 | + <Label>Value</Label> | |
| 629 | + <Input | |
| 622 | 630 | type="password" |
| 623 | 631 | value={value} |
| 624 | 632 | onChange={(event) => setValue(event.target.value)} |
| 625 | 633 | 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]" | |
| 627 | 635 | /> |
| 628 | − </FieldLabel> | |
| 636 | + </div> | |
| 629 | 637 | )} |
| 630 | 638 | </div> |
| 631 | 639 | {mode === "import" && canImportSecrets && ( |
| @@ -644,11 +652,11 @@ function CreateSecretForm(props: { · 12 unmodified lines | ||
| 644 | 652 | Back |
| 645 | 653 | </Button> |
| 646 | 654 | )} |
| 647 | − <input | |
| 655 | + <Input | |
| 648 | 656 | value={browserQuery} |
| 649 | 657 | onChange={(event) => setBrowserQuery(event.target.value)} |
| 650 | 658 | 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" | |
| 652 | 660 | /> |
| 653 | 661 | </div> |
| 654 | 662 | {browserStack.length > 0 && ( |
| @@ -673,12 +681,12 @@ function CreateSecretForm(props: { · 18 unmodified lines | ||
| 673 | 681 | </div> |
| 674 | 682 | ) : ( |
| 675 | 683 | browserEntries.map((entry, index) => ( |
| 676 | − <button | |
| 684 | + <Button | |
| 677 | 685 | key={entry.key} |
| 678 | − type="button" | |
| 686 | + variant="ghost" | |
| 679 | 687 | onClick={() => handleBrowserEntryClick(entry)} |
| 680 | 688 | 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", | |
| 682 | 690 | index > 0 && "border-t border-border", |
| 683 | 691 | selectedImportKey === entry.key && "bg-accent/60", |
| 684 | 692 | )} |
| @@ -696,7 +704,7 @@ function CreateSecretForm(props: { · 11 unmodified lines | ||
| 696 | 704 | <Badge variant="outline"> |
| 697 | 705 | {entry.kind === "group" ? "Open" : "Secret"} |
| 698 | 706 | </Badge> |
| 699 | − </button> | |
| 707 | + </Button> | |
| 700 | 708 | )) |
| 701 | 709 | )} |
| 702 | 710 | </div> |
| @@ -742,7 +750,7 @@ function SecretStoreCard(props: { · 39 unmodified lines | ||
| 742 | 750 | }; |
| 743 | 751 | |
| 744 | 752 | return ( |
| 745 | − <div className="rounded-xl border border-border bg-card/80 p-4"> | |
| 753 | + <Card className="p-4"> | |
| 746 | 754 | <div className="flex items-start justify-between gap-3"> |
| 747 | 755 | <div className="min-w-0"> |
| 748 | 756 | <div className="flex flex-wrap items-center gap-2"> |
| @@ -764,40 +772,41 @@ function SecretStoreCard(props: { · 15 unmodified lines | ||
| 764 | 772 | {props.canManage ? ( |
| 765 | 773 | confirmDelete ? ( |
| 766 | 774 | <div className="flex items-center gap-1"> |
| 767 | − <button | |
| 768 | − type="button" | |
| 775 | + <Button | |
| 776 | + variant="ghost" | |
| 777 | + size="sm" | |
| 769 | 778 | onClick={() => setConfirmDelete(false)} |
| 770 | 779 | 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" | |
| 772 | 780 | > |
| 773 | 781 | Cancel |
| 774 | − </button> | |
| 775 | − <button | |
| 776 | − type="button" | |
| 782 | + </Button> | |
| 783 | + <Button | |
| 784 | + variant="destructive-outline" | |
| 785 | + size="sm" | |
| 777 | 786 | onClick={() => { |
| 778 | 787 | void handleDelete(); |
| 779 | 788 | }} |
| 780 | 789 | 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" | |
| 782 | 790 | > |
| 783 | 791 | {isDeleting |
| 784 | 792 | ? <IconSpinner className="size-3" /> |
| 785 | 793 | : <IconTrash className="size-3" />} |
| 786 | 794 | Delete |
| 787 | − </button> | |
| 795 | + </Button> | |
| 788 | 796 | </div> |
| 789 | 797 | ) : ( |
| 790 | − <button | |
| 791 | − type="button" | |
| 798 | + <Button | |
| 799 | + variant="ghost" | |
| 800 | + size="sm" | |
| 792 | 801 | onClick={() => setConfirmDelete(true)} |
| 793 | 802 | 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" | |
| 795 | 804 | > |
| 796 | 805 | {isDeleting |
| 797 | 806 | ? <IconSpinner className="size-3" /> |
| 798 | 807 | : <IconTrash className="size-3" />} |
| 799 | 808 | Remove |
| 800 | − </button> | |
| 809 | + </Button> | |
| 801 | 810 | ) |
| 802 | 811 | ) : ( |
| 803 | 812 | <span className="text-[10px] font-medium uppercase tracking-[0.12em] text-muted-foreground/45"> |
| @@ -805,7 +814,7 @@ function SecretStoreCard(props: { · 1 unmodified line | ||
| 805 | 814 | </span> |
| 806 | 815 | )} |
| 807 | 816 | </div> |
| 808 | − </div> | |
| 817 | + </Card> | |
| 809 | 818 | ); |
| 810 | 819 | } |
| 811 | 820 | |
| @@ -868,11 +877,11 @@ function SecretRow(props: { · 56 unmodified lines | ||
| 868 | 877 | )} |
| 869 | 878 | </div> |
| 870 | 879 | <div className="flex shrink-0 items-center gap-1.5"> |
| 871 | − <button | |
| 872 | − type="button" | |
| 880 | + <Button | |
| 881 | + variant="ghost" | |
| 882 | + size="sm" | |
| 873 | 883 | onClick={props.onEdit} |
| 874 | 884 | className={cn( |
| 875 | − "inline-flex items-center gap-1 rounded-md px-2 py-1.5 text-[11px] font-medium transition-colors", | |
| 876 | 885 | props.isEditing |
| 877 | 886 | ? "bg-primary/10 text-primary" |
| 878 | 887 | : "text-muted-foreground hover:bg-accent/50 hover:text-foreground", |
| @@ -880,43 +889,44 @@ function SecretRow(props: { · 1 unmodified line | ||
| 880 | 889 | > |
| 881 | 890 | <IconPencil className="size-3" /> |
| 882 | 891 | Edit |
| 883 | − </button> | |
| 892 | + </Button> | |
| 884 | 893 | {confirmDelete ? ( |
| 885 | 894 | <> |
| 886 | − <button | |
| 887 | − type="button" | |
| 895 | + <Button | |
| 896 | + variant="ghost" | |
| 897 | + size="sm" | |
| 888 | 898 | onClick={() => setConfirmDelete(false)} |
| 889 | 899 | 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" | |
| 891 | 900 | > |
| 892 | 901 | Cancel |
| 893 | − </button> | |
| 894 | − <button | |
| 895 | − type="button" | |
| 902 | + </Button> | |
| 903 | + <Button | |
| 904 | + variant="destructive-outline" | |
| 905 | + size="sm" | |
| 896 | 906 | onClick={() => { |
| 897 | 907 | void handleDelete(); |
| 898 | 908 | }} |
| 899 | 909 | 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" | |
| 901 | 910 | > |
| 902 | 911 | {isDeleting |
| 903 | 912 | ? <IconSpinner className="size-3" /> |
| 904 | 913 | : <IconTrash className="size-3" />} |
| 905 | 914 | Delete |
| 906 | − </button> | |
| 915 | + </Button> | |
| 907 | 916 | </> |
| 908 | 917 | ) : ( |
| 909 | − <button | |
| 910 | − type="button" | |
| 918 | + <Button | |
| 919 | + variant="ghost" | |
| 920 | + size="sm" | |
| 911 | 921 | onClick={() => setConfirmDelete(true)} |
| 912 | 922 | 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" | |
| 914 | 924 | > |
| 915 | 925 | {isDeleting |
| 916 | 926 | ? <IconSpinner className="size-3" /> |
| 917 | 927 | : <IconTrash className="size-3" />} |
| 918 | 928 | Delete |
| 919 | − </button> | |
| 929 | + </Button> | |
| 920 | 930 | )} |
| 921 | 931 | </div> |
| 922 | 932 | </div> |
| @@ -968,33 +978,35 @@ function EditSecretForm(props: { · 45 unmodified lines | ||
| 968 | 978 | <div className="mt-3 border-t border-border/50 pt-3"> |
| 969 | 979 | {error && <ErrorBanner className="mb-3">{error}</ErrorBanner>} |
| 970 | 980 | <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 | |
| 973 | 984 | value={name} |
| 974 | 985 | onChange={(event) => setName(event.target.value)} |
| 975 | 986 | 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]" | |
| 977 | 988 | autoFocus |
| 978 | 989 | /> |
| 979 | − </FieldLabel> | |
| 980 | − <FieldLabel label="New value"> | |
| 981 | − <input | |
| 990 | + </div> | |
| 991 | + <div className="grid gap-2"> | |
| 992 | + <Label>New value</Label> | |
| 993 | + <Input | |
| 982 | 994 | type="password" |
| 983 | 995 | value={value} |
| 984 | 996 | onChange={(event) => setValue(event.target.value)} |
| 985 | 997 | 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]" | |
| 987 | 999 | /> |
| 988 | − </FieldLabel> | |
| 1000 | + </div> | |
| 989 | 1001 | </div> |
| 990 | 1002 | <div className="mt-3 flex items-center justify-end gap-2"> |
| 991 | − <button | |
| 992 | − type="button" | |
| 1003 | + <Button | |
| 1004 | + variant="ghost" | |
| 1005 | + size="sm" | |
| 993 | 1006 | onClick={props.onClose} |
| 994 | − className="rounded-md px-3 py-1.5 text-[12px] font-medium text-muted-foreground transition-colors hover:text-foreground" | |
| 995 | 1007 | > |
| 996 | 1008 | Cancel |
| 997 | − </button> | |
| 1009 | + </Button> | |
| 998 | 1010 | <Button |
| 999 | 1011 | size="sm" |
| 1000 | 1012 | onClick={handleSubmit} |
| @@ -1015,19 +1027,19 @@ function FormCard(props: { · 14 unmodified lines | ||
| 1015 | 1027 | children: ReactNode; |
| 1016 | 1028 | }) { |
| 1017 | 1029 | 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)}> | |
| 1019 | 1031 | <div className="flex items-center justify-between border-b border-border px-5 py-3"> |
| 1020 | 1032 | <h3 className="text-sm font-semibold text-foreground">{props.title}</h3> |
| 1021 | − <button | |
| 1022 | − type="button" | |
| 1033 | + <Button | |
| 1034 | + variant="ghost" | |
| 1035 | + size="sm" | |
| 1023 | 1036 | onClick={props.onClose} |
| 1024 | − className="text-[12px] text-muted-foreground transition-colors hover:text-foreground" | |
| 1025 | 1037 | > |
| 1026 | 1038 | Cancel |
| 1027 | − </button> | |
| 1039 | + </Button> | |
| 1028 | 1040 | </div> |
| 1029 | 1041 | <div className="space-y-4 p-5">{props.children}</div> |
| 1030 | − </div> | |
| 1042 | + </Card> | |
| 1031 | 1043 | ); |
| 1032 | 1044 | } |
| 1033 | 1045 | |
| @@ -1036,14 +1048,9 @@ function ErrorBanner(props: { · 2 unmodified lines | ||
| 1036 | 1048 | className?: string; |
| 1037 | 1049 | }) { |
| 1038 | 1050 | 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)}> | |
| 1045 | 1052 | {props.children} |
| 1046 | − </div> | |
| 1053 | + </Alert> | |
| 1047 | 1054 | ); |
| 1048 | 1055 | } |
| 1049 | 1056 | |
| @@ -1069,20 +1076,6 @@ function SectionEmptyState(props: { · 19 unmodified lines | ||
| 1069 | 1076 | ); |
| 1070 | 1077 | } |
| 1071 | 1078 | |
| 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 | − | |
| 1086 | 1079 | const formatDate = (value: number): string => |
| 1087 | 1080 | new Date(value).toLocaleDateString(undefined, { |
| 1088 | 1081 | month: "short", |
| @@ -8,7 +8,11 @@ · 7 unmodified lines | ||
| 8 | 8 | "noEmit": true, |
| 9 | 9 | "lib": ["ES2022", "DOM", "DOM.Iterable"], |
| 10 | 10 | "jsx": "react-jsx", |
| 11 | − "types": ["bun-types"] | |
| 11 | + "types": ["bun-types"], | |
| 12 | + "baseUrl": ".", | |
| 13 | + "paths": { | |
| 14 | + "@/*": ["./src/*"] | |
| 15 | + } | |
| 12 | 16 | }, |
| 13 | 17 | "include": [ |
| 14 | 18 | "src/**/*.ts", |
| @@ -1,4 +1,5 @@ | ||
| 1 | 1 | import { readFileSync } from "node:fs"; |
| 2 | +import path from "node:path"; | |
| 2 | 3 | import { defineConfig } from "vite"; |
| 3 | 4 | import react from "@vitejs/plugin-react"; |
| 4 | 5 | import tailwindcss from "@tailwindcss/vite"; |
| @@ -35,6 +36,11 @@ const workspaceExecutorPackages = Object.keys(webPackage.dependencies ?? {}).fil · 30 unmodified lines | ||
| 35 | 36 | |
| 36 | 37 | export default defineConfig({ |
| 37 | 38 | root: "src", |
| 39 | + resolve: { | |
| 40 | + alias: { | |
| 41 | + "@": path.resolve(import.meta.dirname, "./src"), | |
| 42 | + }, | |
| 43 | + }, | |
| 38 | 44 | plugins: [ |
| 39 | 45 | tailwindcss(), |
| 40 | 46 | react(), |
| @@ -57,6 +57,7 @@ · 56 unmodified lines | ||
| 57 | 57 | "name": "@executor/web", |
| 58 | 58 | "version": "0.0.0", |
| 59 | 59 | "dependencies": { |
| 60 | + "@base-ui/react": "^1.3.0", | |
| 60 | 61 | "@executor/plugin-execution-history-react": "workspace:*", |
| 61 | 62 | "@executor/plugin-google-discovery-react": "workspace:*", |
| 62 | 63 | "@executor/plugin-graphql-react": "workspace:*", |
| @@ -72,9 +73,11 @@ · 9 unmodified lines | ||
| 72 | 73 | "class-variance-authority": "^0.7.1", |
| 73 | 74 | "clsx": "^2.1.1", |
| 74 | 75 | "effect": "catalog:", |
| 76 | + "lucide-react": "^1.7.0", | |
| 75 | 77 | "react": "^19.2.0", |
| 76 | 78 | "react-dom": "^19.2.0", |
| 77 | 79 | "react-grab": "^0.1.26", |
| 80 | + "shadcn": "^4.1.1", | |
| 78 | 81 | "shiki": "^4.0.1", |
| 79 | 82 | "streamdown": "^2.3.0", |
| 80 | 83 | "tailwind-merge": "^3.5.0", |
| @@ -132,6 +135,7 @@ · 51 unmodified lines | ||
| 132 | 135 | "name": "@executor/react", |
| 133 | 136 | "version": "0.0.0", |
| 134 | 137 | "dependencies": { |
| 138 | + "@base-ui/react": "^1.3.0", | |
| 135 | 139 | "@effect-atom/atom": "0.5.3", |
| 136 | 140 | "@effect-atom/atom-react": "0.5.0", |
| 137 | 141 | "@effect/platform": "catalog:", |
| @@ -141,6 +145,7 @@ · 3 unmodified lines | ||
| 141 | 145 | "@shikijs/themes": "^4.0.1", |
| 142 | 146 | "class-variance-authority": "^0.7.1", |
| 143 | 147 | "clsx": "^2.1.1", |
| 148 | + "cmdk": "^1.1.1", | |
| 144 | 149 | "effect": "catalog:", |
| 145 | 150 | "shiki": "^4.0.1", |
| 146 | 151 | "streamdown": "^2.3.0", |
| @@ -833,16 +838,28 @@ · 686 unmodified lines | ||
| 833 | 838 | |
| 834 | 839 | "@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=="], |
| 835 | 840 | |
| 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 | + | |
| 836 | 843 | "@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=="], |
| 837 | 844 | |
| 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 | + | |
| 838 | 847 | "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="], |
| 839 | 848 | |
| 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 | + | |
| 840 | 851 | "@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=="], |
| 841 | 852 | |
| 842 | 853 | "@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=="], |
| 843 | 854 | |
| 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 | + | |
| 844 | 857 | "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.28.6", "", {}, "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug=="], |
| 845 | 858 | |
| 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 | + | |
| 846 | 863 | "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], |
| 847 | 864 | |
| 848 | 865 | "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], |
| @@ -853,10 +870,20 @@ · 4 unmodified lines | ||
| 853 | 870 | |
| 854 | 871 | "@babel/parser": ["@babel/parser@7.29.0", "", { "dependencies": { "@babel/types": "^7.29.0" }, "bin": "./bin/babel-parser.js" }, "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww=="], |
| 855 | 872 | |
| 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 | + | |
| 856 | 879 | "@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=="], |
| 857 | 880 | |
| 858 | 881 | "@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=="], |
| 859 | 882 | |
| 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 | + | |
| 860 | 887 | "@babel/runtime": ["@babel/runtime@7.28.6", "", {}, "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA=="], |
| 861 | 888 | |
| 862 | 889 | "@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 | ||
| 865 | 892 | |
| 866 | 893 | "@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=="], |
| 867 | 894 | |
| 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 | + | |
| 868 | 899 | "@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=="], |
| 869 | 900 | |
| 870 | 901 | "@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 | ||
| 909 | 940 | |
| 910 | 941 | "@csstools/css-tokenizer": ["@csstools/css-tokenizer@3.0.4", "", {}, "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw=="], |
| 911 | 942 | |
| 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 | + | |
| 912 | 947 | "@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=="], |
| 913 | 948 | |
| 914 | 949 | "@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 | ||
| 1095 | 1130 | |
| 1096 | 1131 | "@executor/web": ["@executor/web@workspace:apps/web"], |
| 1097 | 1132 | |
| 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 | + | |
| 1098 | 1141 | "@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=="], |
| 1099 | 1142 | |
| 1100 | 1143 | "@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 | ||
| 1103 | 1146 | |
| 1104 | 1147 | "@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=="], |
| 1105 | 1148 | |
| 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 | + | |
| 1106 | 1155 | "@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=="], |
| 1107 | 1156 | |
| 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 | + | |
| 1108 | 1161 | "@jitl/quickjs-ffi-types": ["@jitl/quickjs-ffi-types@0.31.0", "", {}, "sha512-1yrgvXlmXH2oNj3eFTrkwacGJbmM0crwipA3ohCrjv52gBeDaD7PsTvFYinlAnqU8iPME3LGP437yk05a2oejw=="], |
| 1109 | 1162 | |
| 1110 | 1163 | "@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 | ||
| 1147 | 1200 | |
| 1148 | 1201 | "@msgpackr-extract/msgpackr-extract-win32-x64": ["@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3", "", { "os": "win32", "cpu": "x64" }, "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ=="], |
| 1149 | 1202 | |
| 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 | + | |
| 1150 | 1205 | "@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=="], |
| 1151 | 1206 | |
| 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 | + | |
| 1152 | 1213 | "@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=="], |
| 1153 | 1214 | |
| 1154 | 1215 | "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], |
| 1155 | 1216 | |
| 1156 | 1217 | "@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=="], |
| 1157 | 1218 | |
| 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 | + | |
| 1158 | 1225 | "@opentelemetry/api": ["@opentelemetry/api@1.9.0", "", {}, "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg=="], |
| 1159 | 1226 | |
| 1160 | 1227 | "@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 | ||
| 1311 | 1378 | |
| 1312 | 1379 | "@protobufjs/utf8": ["@protobufjs/utf8@1.1.0", "", {}, "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="], |
| 1313 | 1380 | |
| 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 | + | |
| 1314 | 1415 | "@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=="], |
| 1315 | 1416 | |
| 1316 | 1417 | "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.3", "", {}, "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q=="], |
| @@ -1365,6 +1466,8 @@ · 48 unmodified lines | ||
| 1365 | 1466 | |
| 1366 | 1467 | "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.59.0", "", { "os": "win32", "cpu": "x64" }, "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA=="], |
| 1367 | 1468 | |
| 1469 | + "@sec-ant/readable-stream": ["@sec-ant/readable-stream@0.4.1", "", {}, "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg=="], | |
| 1470 | + | |
| 1368 | 1471 | "@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=="], |
| 1369 | 1472 | |
| 1370 | 1473 | "@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 | ||
| 1381 | 1484 | |
| 1382 | 1485 | "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="], |
| 1383 | 1486 | |
| 1487 | + "@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@4.0.0", "", {}, "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ=="], | |
| 1488 | + | |
| 1384 | 1489 | "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], |
| 1385 | 1490 | |
| 1386 | 1491 | "@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 | ||
| 1423 | 1528 | |
| 1424 | 1529 | "@tanstack/store": ["@tanstack/store@0.9.2", "", {}, "sha512-K013lUJEFJK2ofFQ/hZKJUmCnpcV00ebLyOyFOWQvyQHUOZp/iYO84BM6aOGiV81JzwbX0APTVmW8YI7yiG5oA=="], |
| 1425 | 1530 | |
| 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 | + | |
| 1426 | 1533 | "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], |
| 1427 | 1534 | |
| 1428 | 1535 | "@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 | ||
| 1459 | 1566 | |
| 1460 | 1567 | "@types/react-reconciler": ["@types/react-reconciler@0.28.9", "", { "peerDependencies": { "@types/react": "*" } }, "sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg=="], |
| 1461 | 1568 | |
| 1569 | + "@types/statuses": ["@types/statuses@2.0.6", "", {}, "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA=="], | |
| 1570 | + | |
| 1462 | 1571 | "@types/tough-cookie": ["@types/tough-cookie@4.0.5", "", {}, "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA=="], |
| 1463 | 1572 | |
| 1464 | 1573 | "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], |
| 1465 | 1574 | |
| 1575 | + "@types/validate-npm-package-name": ["@types/validate-npm-package-name@4.0.2", "", {}, "sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw=="], | |
| 1576 | + | |
| 1466 | 1577 | "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], |
| 1467 | 1578 | |
| 1468 | 1579 | "@vercel/oidc": ["@vercel/oidc@3.1.0", "", {}, "sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w=="], |
| @@ -1501,10 +1612,14 @@ · 32 unmodified lines | ||
| 1501 | 1612 | |
| 1502 | 1613 | "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], |
| 1503 | 1614 | |
| 1615 | + "aria-hidden": ["aria-hidden@1.2.6", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA=="], | |
| 1616 | + | |
| 1504 | 1617 | "array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="], |
| 1505 | 1618 | |
| 1506 | 1619 | "assertion-error": ["assertion-error@2.0.1", "", {}, "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA=="], |
| 1507 | 1620 | |
| 1621 | + "ast-types": ["ast-types@0.16.1", "", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg=="], | |
| 1622 | + | |
| 1508 | 1623 | "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="], |
| 1509 | 1624 | |
| 1510 | 1625 | "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], |
| @@ -1525,6 +1640,8 @@ · 14 unmodified lines | ||
| 1525 | 1640 | |
| 1526 | 1641 | "bun-types": ["bun-types@1.3.10", "", { "dependencies": { "@types/node": "*" } }, "sha512-tcpfCCl6XWo6nCVnpcVrxQ+9AYN1iqMIzgrSKYMB/fjLtV2eyAVEg7AxQJuCq/26R6HpKWykQXuSOq/21RYcbg=="], |
| 1527 | 1642 | |
| 1643 | + "bundle-name": ["bundle-name@4.1.0", "", { "dependencies": { "run-applescript": "^7.0.0" } }, "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q=="], | |
| 1644 | + | |
| 1528 | 1645 | "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], |
| 1529 | 1646 | |
| 1530 | 1647 | "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="], |
| @@ -1533,6 +1650,8 @@ · 2 unmodified lines | ||
| 1533 | 1650 | |
| 1534 | 1651 | "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], |
| 1535 | 1652 | |
| 1653 | + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], | |
| 1654 | + | |
| 1536 | 1655 | "caniuse-lite": ["caniuse-lite@1.0.30001777", "", {}, "sha512-tmN+fJxroPndC74efCdp12j+0rk0RHwV5Jwa1zWaFVyw2ZxAuPeG8ZgWC3Wz7uSjT3qMRQ5XHZ4COgQmsCMJAQ=="], |
| 1537 | 1656 | |
| 1538 | 1657 | "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], |
| @@ -1559,10 +1678,16 @@ · 20 unmodified lines | ||
| 1559 | 1678 | |
| 1560 | 1679 | "cli-spinners": ["cli-spinners@2.9.2", "", {}, "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg=="], |
| 1561 | 1680 | |
| 1681 | + "cli-width": ["cli-width@4.1.0", "", {}, "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ=="], | |
| 1682 | + | |
| 1562 | 1683 | "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=="], |
| 1563 | 1684 | |
| 1564 | 1685 | "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], |
| 1565 | 1686 | |
| 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 | + | |
| 1566 | 1691 | "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], |
| 1567 | 1692 | |
| 1568 | 1693 | "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], |
| @@ -1585,12 +1710,18 @@ · 16 unmodified lines | ||
| 1585 | 1710 | |
| 1586 | 1711 | "cors": ["cors@2.8.6", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw=="], |
| 1587 | 1712 | |
| 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 | + | |
| 1588 | 1715 | "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], |
| 1589 | 1716 | |
| 1717 | + "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], | |
| 1718 | + | |
| 1590 | 1719 | "cssstyle": ["cssstyle@4.6.0", "", { "dependencies": { "@asamuzakjp/css-color": "^3.2.0", "rrweb-cssom": "^0.8.0" } }, "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg=="], |
| 1591 | 1720 | |
| 1592 | 1721 | "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], |
| 1593 | 1722 | |
| 1723 | + "data-uri-to-buffer": ["data-uri-to-buffer@4.0.1", "", {}, "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A=="], | |
| 1724 | + | |
| 1594 | 1725 | "data-urls": ["data-urls@5.0.0", "", { "dependencies": { "whatwg-mimetype": "^4.0.0", "whatwg-url": "^14.0.0" } }, "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg=="], |
| 1595 | 1726 | |
| 1596 | 1727 | "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], |
| @@ -1599,8 +1730,18 @@ · 2 unmodified lines | ||
| 1599 | 1730 | |
| 1600 | 1731 | "decode-named-character-reference": ["decode-named-character-reference@1.3.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q=="], |
| 1601 | 1732 | |
| 1733 | + "dedent": ["dedent@1.7.2", "", { "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, "optionalPeers": ["babel-plugin-macros"] }, "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA=="], | |
| 1734 | + | |
| 1602 | 1735 | "deep-eql": ["deep-eql@5.0.2", "", {}, "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q=="], |
| 1603 | 1736 | |
| 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 | + | |
| 1604 | 1745 | "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], |
| 1605 | 1746 | |
| 1606 | 1747 | "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], |
| @@ -1609,14 +1750,22 @@ · 2 unmodified lines | ||
| 1609 | 1750 | |
| 1610 | 1751 | "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], |
| 1611 | 1752 | |
| 1753 | + "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="], | |
| 1754 | + | |
| 1612 | 1755 | "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], |
| 1613 | 1756 | |
| 1757 | + "diff": ["diff@8.0.4", "", {}, "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw=="], | |
| 1758 | + | |
| 1614 | 1759 | "dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="], |
| 1615 | 1760 | |
| 1761 | + "dotenv": ["dotenv@17.3.1", "", {}, "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA=="], | |
| 1762 | + | |
| 1616 | 1763 | "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=="], |
| 1617 | 1764 | |
| 1618 | 1765 | "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=="], |
| 1619 | 1766 | |
| 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 | + | |
| 1620 | 1769 | "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], |
| 1621 | 1770 | |
| 1622 | 1771 | "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 | ||
| 1633 | 1782 | |
| 1634 | 1783 | "entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], |
| 1635 | 1784 | |
| 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 | + | |
| 1636 | 1789 | "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], |
| 1637 | 1790 | |
| 1638 | 1791 | "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], |
| @@ -1661,6 +1814,8 @@ · 22 unmodified lines | ||
| 1661 | 1814 | |
| 1662 | 1815 | "eventsource-parser": ["eventsource-parser@3.0.6", "", {}, "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg=="], |
| 1663 | 1816 | |
| 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 | + | |
| 1664 | 1819 | "executor": ["executor@workspace:apps/executor"], |
| 1665 | 1820 | |
| 1666 | 1821 | "expect-type": ["expect-type@1.3.0", "", {}, "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA=="], |
| @@ -1687,6 +1842,10 @@ · 20 unmodified lines | ||
| 1687 | 1842 | |
| 1688 | 1843 | "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], |
| 1689 | 1844 | |
| 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 | + | |
| 1690 | 1849 | "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], |
| 1691 | 1850 | |
| 1692 | 1851 | "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 | ||
| 1697 | 1856 | |
| 1698 | 1857 | "formatly": ["formatly@0.3.0", "", { "dependencies": { "fd-package-json": "^2.0.0" }, "bin": { "formatly": "bin/index.mjs" } }, "sha512-9XNj/o4wrRFyhSMJOvsuyMwy8aUfBaZ1VrqHVfohyXf0Sw0e+yfKG+xZaY3arGCOMdwFsqObtzVOc1gU9KiT9w=="], |
| 1699 | 1858 | |
| 1859 | + "formdata-polyfill": ["formdata-polyfill@4.0.10", "", { "dependencies": { "fetch-blob": "^3.1.2" } }, "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g=="], | |
| 1860 | + | |
| 1700 | 1861 | "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], |
| 1701 | 1862 | |
| 1702 | 1863 | "fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="], |
| @@ -1707,6 +1868,8 @@ · 4 unmodified lines | ||
| 1707 | 1868 | |
| 1708 | 1869 | "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], |
| 1709 | 1870 | |
| 1871 | + "fuzzysort": ["fuzzysort@3.1.0", "", {}, "sha512-sR9BNCjBg6LNgwvxlBd0sBABvQitkLzoVY9MYYROQVX/FvfJ4Mai9LsGhDgd8qYdds0bY77VzYd5iuB+v5rwQQ=="], | |
| 1872 | + | |
| 1710 | 1873 | "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], |
| 1711 | 1874 | |
| 1712 | 1875 | "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], |
| @@ -1715,8 +1878,14 @@ · 2 unmodified lines | ||
| 1715 | 1878 | |
| 1716 | 1879 | "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=="], |
| 1717 | 1880 | |
| 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 | + | |
| 1718 | 1885 | "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], |
| 1719 | 1886 | |
| 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 | + | |
| 1720 | 1889 | "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], |
| 1721 | 1890 | |
| 1722 | 1891 | "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 | ||
| 1749 | 1918 | |
| 1750 | 1919 | "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=="], |
| 1751 | 1920 | |
| 1921 | + "headers-polyfill": ["headers-polyfill@4.0.3", "", {}, "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ=="], | |
| 1922 | + | |
| 1752 | 1923 | "hono": ["hono@4.12.5", "", {}, "sha512-3qq+FUBtlTHhtYxbxheZgY8NIFnkkC/MR8u5TTsr7YZ3wixryQ3cCwn3iZbg8p8B88iDBBAYSfZDS75t8MN7Vg=="], |
| 1753 | 1924 | |
| 1754 | 1925 | "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 | ||
| 1765 | 1936 | |
| 1766 | 1937 | "human-id": ["human-id@4.1.3", "", { "bin": { "human-id": "dist/cli.js" } }, "sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q=="], |
| 1767 | 1938 | |
| 1939 | + "human-signals": ["human-signals@8.0.1", "", {}, "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ=="], | |
| 1940 | + | |
| 1768 | 1941 | "iconv-lite": ["iconv-lite@0.7.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="], |
| 1769 | 1942 | |
| 1770 | 1943 | "ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], |
| 1771 | 1944 | |
| 1945 | + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], | |
| 1946 | + | |
| 1772 | 1947 | "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], |
| 1773 | 1948 | |
| 1774 | 1949 | "ini": ["ini@4.1.3", "", {}, "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg=="], |
| @@ -1783,8 +1958,12 @@ · 8 unmodified lines | ||
| 1783 | 1958 | |
| 1784 | 1959 | "is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="], |
| 1785 | 1960 | |
| 1961 | + "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], | |
| 1962 | + | |
| 1786 | 1963 | "is-decimal": ["is-decimal@2.0.1", "", {}, "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A=="], |
| 1787 | 1964 | |
| 1965 | + "is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="], | |
| 1966 | + | |
| 1788 | 1967 | "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], |
| 1789 | 1968 | |
| 1790 | 1969 | "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], |
| @@ -1793,22 +1972,36 @@ · 2 unmodified lines | ||
| 1793 | 1972 | |
| 1794 | 1973 | "is-hexadecimal": ["is-hexadecimal@2.0.1", "", {}, "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg=="], |
| 1795 | 1974 | |
| 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 | + | |
| 1796 | 1979 | "is-interactive": ["is-interactive@2.0.0", "", {}, "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ=="], |
| 1797 | 1980 | |
| 1981 | + "is-node-process": ["is-node-process@1.2.0", "", {}, "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw=="], | |
| 1982 | + | |
| 1798 | 1983 | "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], |
| 1799 | 1984 | |
| 1985 | + "is-obj": ["is-obj@3.0.0", "", {}, "sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ=="], | |
| 1986 | + | |
| 1800 | 1987 | "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="], |
| 1801 | 1988 | |
| 1802 | 1989 | "is-potential-custom-element-name": ["is-potential-custom-element-name@1.0.1", "", {}, "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ=="], |
| 1803 | 1990 | |
| 1804 | 1991 | "is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="], |
| 1805 | 1992 | |
| 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 | + | |
| 1806 | 1997 | "is-subdir": ["is-subdir@1.2.0", "", { "dependencies": { "better-path-resolve": "1.0.0" } }, "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw=="], |
| 1807 | 1998 | |
| 1808 | 1999 | "is-unicode-supported": ["is-unicode-supported@2.1.0", "", {}, "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ=="], |
| 1809 | 2000 | |
| 1810 | 2001 | "is-windows": ["is-windows@1.0.2", "", {}, "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="], |
| 1811 | 2002 | |
| 2003 | + "is-wsl": ["is-wsl@3.1.1", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw=="], | |
| 2004 | + | |
| 1812 | 2005 | "isbot": ["isbot@5.1.35", "", {}, "sha512-waFfC72ZNfwLLuJ2iLaoVaqcNo+CAaLR7xCpAn0Y5WfGzkNHv7ZN39Vbi1y+kb+Zs46XHOX3tZNExroFUPX+Kg=="], |
| 1813 | 2006 | |
| 1814 | 2007 | "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], |
| @@ -1825,6 +2018,8 @@ · 10 unmodified lines | ||
| 1825 | 2018 | |
| 1826 | 2019 | "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], |
| 1827 | 2020 | |
| 2021 | + "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], | |
| 2022 | + | |
| 1828 | 2023 | "json-schema": ["json-schema@0.4.0", "", {}, "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="], |
| 1829 | 2024 | |
| 1830 | 2025 | "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], |
| @@ -1837,7 +2032,7 @@ · 6 unmodified lines | ||
| 1837 | 2032 | |
| 1838 | 2033 | "jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], |
| 1839 | 2034 | |
| 1840 | − "kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="], | |
| 2035 | + "kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="], | |
| 1841 | 2036 | |
| 1842 | 2037 | "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=="], |
| 1843 | 2038 | |
| @@ -1867,6 +2062,8 @@ · 23 unmodified lines | ||
| 1867 | 2062 | |
| 1868 | 2063 | "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.31.1", "", { "os": "win32", "cpu": "x64" }, "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw=="], |
| 1869 | 2064 | |
| 2065 | + "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], | |
| 2066 | + | |
| 1870 | 2067 | "locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], |
| 1871 | 2068 | |
| 1872 | 2069 | "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="], |
| @@ -1883,6 +2080,8 @@ · 10 unmodified lines | ||
| 1883 | 2080 | |
| 1884 | 2081 | "lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], |
| 1885 | 2082 | |
| 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 | + | |
| 1886 | 2085 | "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], |
| 1887 | 2086 | |
| 1888 | 2087 | "markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="], |
| @@ -1925,6 +2124,8 @@ · 36 unmodified lines | ||
| 1925 | 2124 | |
| 1926 | 2125 | "merge-descriptors": ["merge-descriptors@2.0.0", "", {}, "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g=="], |
| 1927 | 2126 | |
| 2127 | + "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], | |
| 2128 | + | |
| 1928 | 2129 | "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], |
| 1929 | 2130 | |
| 1930 | 2131 | "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 | ||
| 1991 | 2192 | |
| 1992 | 2193 | "mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], |
| 1993 | 2194 | |
| 2195 | + "mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], | |
| 2196 | + | |
| 1994 | 2197 | "mimic-function": ["mimic-function@5.0.1", "", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="], |
| 1995 | 2198 | |
| 1996 | 2199 | "minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], |
| @@ -2005,38 +2208,54 @@ · 8 unmodified lines | ||
| 2005 | 2208 | |
| 2006 | 2209 | "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=="], |
| 2007 | 2210 | |
| 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 | + | |
| 2008 | 2213 | "multipasta": ["multipasta@0.2.7", "", {}, "sha512-KPA58d68KgGil15oDqXjkUBEBYc00XvbPj5/X+dyzeo/lWm9Nc25pQRlf1D+gv4OpK7NM0J1odrbu9JNNGvynA=="], |
| 2009 | 2214 | |
| 2215 | + "mute-stream": ["mute-stream@2.0.0", "", {}, "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA=="], | |
| 2216 | + | |
| 2010 | 2217 | "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], |
| 2011 | 2218 | |
| 2012 | 2219 | "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], |
| 2013 | 2220 | |
| 2014 | 2221 | "node-addon-api": ["node-addon-api@7.1.1", "", {}, "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ=="], |
| 2015 | 2222 | |
| 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 | + | |
| 2016 | 2227 | "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=="], |
| 2017 | 2228 | |
| 2018 | 2229 | "node-releases": ["node-releases@2.0.36", "", {}, "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA=="], |
| 2019 | 2230 | |
| 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 | + | |
| 2020 | 2233 | "nwsapi": ["nwsapi@2.2.23", "", {}, "sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ=="], |
| 2021 | 2234 | |
| 2022 | 2235 | "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], |
| 2023 | 2236 | |
| 2024 | 2237 | "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], |
| 2025 | 2238 | |
| 2239 | + "object-treeify": ["object-treeify@1.1.33", "", {}, "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A=="], | |
| 2240 | + | |
| 2026 | 2241 | "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], |
| 2027 | 2242 | |
| 2028 | 2243 | "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], |
| 2029 | 2244 | |
| 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=="], | |
| 2031 | 2246 | |
| 2032 | 2247 | "oniguruma-parser": ["oniguruma-parser@0.12.1", "", {}, "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w=="], |
| 2033 | 2248 | |
| 2034 | 2249 | "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=="], |
| 2035 | 2250 | |
| 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 | + | |
| 2036 | 2253 | "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=="], |
| 2037 | 2254 | |
| 2038 | 2255 | "outdent": ["outdent@0.5.0", "", {}, "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q=="], |
| 2039 | 2256 | |
| 2257 | + "outvariant": ["outvariant@1.4.3", "", {}, "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA=="], | |
| 2258 | + | |
| 2040 | 2259 | "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=="], |
| 2041 | 2260 | |
| 2042 | 2261 | "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 | ||
| 2053 | 2272 | |
| 2054 | 2273 | "package-manager-detector": ["package-manager-detector@0.2.11", "", { "dependencies": { "quansync": "^0.2.7" } }, "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ=="], |
| 2055 | 2274 | |
| 2275 | + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], | |
| 2276 | + | |
| 2056 | 2277 | "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=="], |
| 2057 | 2278 | |
| 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 | + | |
| 2058 | 2283 | "parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="], |
| 2059 | 2284 | |
| 2060 | 2285 | "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], |
| 2061 | 2286 | |
| 2287 | + "path-browserify": ["path-browserify@1.0.1", "", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="], | |
| 2288 | + | |
| 2062 | 2289 | "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], |
| 2063 | 2290 | |
| 2064 | 2291 | "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], |
| 2065 | 2292 | |
| 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=="], | |
| 2067 | 2294 | |
| 2068 | 2295 | "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="], |
| 2069 | 2296 | |
| @@ -2081,8 +2308,14 @@ · 11 unmodified lines | ||
| 2081 | 2308 | |
| 2082 | 2309 | "postcss": ["postcss@8.5.8", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg=="], |
| 2083 | 2310 | |
| 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 | + | |
| 2084 | 2315 | "prettier": ["prettier@3.8.1", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg=="], |
| 2085 | 2316 | |
| 2317 | + "pretty-ms": ["pretty-ms@9.3.0", "", { "dependencies": { "parse-ms": "^4.0.0" } }, "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ=="], | |
| 2318 | + | |
| 2086 | 2319 | "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="], |
| 2087 | 2320 | |
| 2088 | 2321 | "property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="], |
| @@ -2117,8 +2350,16 @@ · 28 unmodified lines | ||
| 2117 | 2350 | |
| 2118 | 2351 | "react-refresh": ["react-refresh@0.18.0", "", {}, "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw=="], |
| 2119 | 2352 | |
| 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 | + | |
| 2120 | 2359 | "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=="], |
| 2121 | 2360 | |
| 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 | + | |
| 2122 | 2363 | "regex": ["regex@6.1.0", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg=="], |
| 2123 | 2364 | |
| 2124 | 2365 | "regex-recursion": ["regex-recursion@6.0.2", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg=="], |
| @@ -2145,10 +2386,14 @@ · 20 unmodified lines | ||
| 2145 | 2386 | |
| 2146 | 2387 | "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], |
| 2147 | 2388 | |
| 2389 | + "reselect": ["reselect@5.1.1", "", {}, "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w=="], | |
| 2390 | + | |
| 2148 | 2391 | "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="], |
| 2149 | 2392 | |
| 2150 | 2393 | "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], |
| 2151 | 2394 | |
| 2395 | + "rettime": ["rettime@0.10.1", "", {}, "sha512-uyDrIlUEH37cinabq0AX4QbgV4HbFZ/gqoiunWQ1UqBtRvTTytwhNYjE++pO/MjPTZL5KQCf2bEoJ/BJNVQ5Kw=="], | |
| 2396 | + | |
| 2152 | 2397 | "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], |
| 2153 | 2398 | |
| 2154 | 2399 | "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 | ||
| 2157 | 2402 | |
| 2158 | 2403 | "rrweb-cssom": ["rrweb-cssom@0.8.0", "", {}, "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw=="], |
| 2159 | 2404 | |
| 2405 | + "run-applescript": ["run-applescript@7.1.0", "", {}, "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q=="], | |
| 2406 | + | |
| 2160 | 2407 | "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], |
| 2161 | 2408 | |
| 2162 | 2409 | "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], |
| @@ -2179,6 +2426,8 @@ · 16 unmodified lines | ||
| 2179 | 2426 | |
| 2180 | 2427 | "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], |
| 2181 | 2428 | |
| 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 | + | |
| 2182 | 2431 | "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], |
| 2183 | 2432 | |
| 2184 | 2433 | "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], |
| @@ -2205,6 +2454,8 @@ · 20 unmodified lines | ||
| 2205 | 2454 | |
| 2206 | 2455 | "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=="], |
| 2207 | 2456 | |
| 2457 | + "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], | |
| 2458 | + | |
| 2208 | 2459 | "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], |
| 2209 | 2460 | |
| 2210 | 2461 | "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], |
| @@ -2223,14 +2474,20 @@ · 12 unmodified lines | ||
| 2223 | 2474 | |
| 2224 | 2475 | "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=="], |
| 2225 | 2476 | |
| 2477 | + "strict-event-emitter": ["strict-event-emitter@0.5.1", "", {}, "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ=="], | |
| 2478 | + | |
| 2226 | 2479 | "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=="], |
| 2227 | 2480 | |
| 2228 | 2481 | "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=="], |
| 2229 | 2482 | |
| 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 | + | |
| 2230 | 2485 | "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], |
| 2231 | 2486 | |
| 2232 | 2487 | "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="], |
| 2233 | 2488 | |
| 2489 | + "strip-final-newline": ["strip-final-newline@4.0.0", "", {}, "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw=="], | |
| 2490 | + | |
| 2234 | 2491 | "strip-json-comments": ["strip-json-comments@5.0.3", "", {}, "sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw=="], |
| 2235 | 2492 | |
| 2236 | 2493 | "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 | ||
| 2241 | 2498 | |
| 2242 | 2499 | "symbol-tree": ["symbol-tree@3.2.4", "", {}, "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="], |
| 2243 | 2500 | |
| 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 | + | |
| 2244 | 2505 | "tailwind-merge": ["tailwind-merge@3.5.0", "", {}, "sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A=="], |
| 2245 | 2506 | |
| 2246 | 2507 | "tailwindcss": ["tailwindcss@4.2.1", "", {}, "sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw=="], |
| @@ -2283,6 +2544,10 @@ · 36 unmodified lines | ||
| 2283 | 2544 | |
| 2284 | 2545 | "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="], |
| 2285 | 2546 | |
| 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 | + | |
| 2286 | 2551 | "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], |
| 2287 | 2552 | |
| 2288 | 2553 | "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 | ||
| 2301 | 2566 | |
| 2302 | 2567 | "tw-animate-css": ["tw-animate-css@1.4.0", "", {}, "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ=="], |
| 2303 | 2568 | |
| 2569 | + "type-fest": ["type-fest@5.5.0", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-PlBfpQwiUvGViBNX84Yxwjsdhd1TUlXr6zjX7eoirtCPIr08NAmxwa+fcYBTeRQxHo9YC9wwF3m9i700sHma8g=="], | |
| 2570 | + | |
| 2304 | 2571 | "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=="], |
| 2305 | 2572 | |
| 2306 | 2573 | "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], |
| @@ -2309,6 +2576,8 @@ · 2 unmodified lines | ||
| 2309 | 2576 | |
| 2310 | 2577 | "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], |
| 2311 | 2578 | |
| 2579 | + "unicorn-magic": ["unicorn-magic@0.3.0", "", {}, "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA=="], | |
| 2580 | + | |
| 2312 | 2581 | "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=="], |
| 2313 | 2582 | |
| 2314 | 2583 | "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 | ||
| 2325 | 2594 | |
| 2326 | 2595 | "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], |
| 2327 | 2596 | |
| 2597 | + "until-async": ["until-async@3.0.2", "", {}, "sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw=="], | |
| 2598 | + | |
| 2328 | 2599 | "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=="], |
| 2329 | 2600 | |
| 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 | + | |
| 2330 | 2605 | "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=="], |
| 2331 | 2606 | |
| 2607 | + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], | |
| 2608 | + | |
| 2332 | 2609 | "uuid": ["uuid@11.1.0", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A=="], |
| 2333 | 2610 | |
| 2611 | + "validate-npm-package-name": ["validate-npm-package-name@7.0.2", "", {}, "sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A=="], | |
| 2612 | + | |
| 2334 | 2613 | "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], |
| 2335 | 2614 | |
| 2336 | 2615 | "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 | ||
| 2351 | 2630 | |
| 2352 | 2631 | "web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="], |
| 2353 | 2632 | |
| 2633 | + "web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="], | |
| 2634 | + | |
| 2354 | 2635 | "webidl-conversions": ["webidl-conversions@7.0.0", "", {}, "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g=="], |
| 2355 | 2636 | |
| 2356 | 2637 | "whatwg-encoding": ["whatwg-encoding@3.1.1", "", { "dependencies": { "iconv-lite": "0.6.3" } }, "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ=="], |
| @@ -2363,12 +2644,14 @@ · 6 unmodified lines | ||
| 2363 | 2644 | |
| 2364 | 2645 | "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=="], |
| 2365 | 2646 | |
| 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=="], | |
| 2367 | 2648 | |
| 2368 | 2649 | "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], |
| 2369 | 2650 | |
| 2370 | 2651 | "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=="], |
| 2371 | 2652 | |
| 2653 | + "wsl-utils": ["wsl-utils@0.3.1", "", { "dependencies": { "is-wsl": "^3.1.0", "powershell-utils": "^0.1.0" } }, "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg=="], | |
| 2654 | + | |
| 2372 | 2655 | "xml-name-validator": ["xml-name-validator@5.0.0", "", {}, "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg=="], |
| 2373 | 2656 | |
| 2374 | 2657 | "xmlchars": ["xmlchars@2.2.0", "", {}, "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="], |
| @@ -2383,6 +2666,10 @@ · 8 unmodified lines | ||
| 2383 | 2666 | |
| 2384 | 2667 | "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], |
| 2385 | 2668 | |
| 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 | + | |
| 2386 | 2673 | "zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], |
| 2387 | 2674 | |
| 2388 | 2675 | "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 | ||
| 2397 | 2684 | |
| 2398 | 2685 | "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], |
| 2399 | 2686 | |
| 2687 | + "@babel/helper-create-class-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], | |
| 2688 | + | |
| 2400 | 2689 | "@changesets/apply-release-plan/prettier": ["prettier@2.8.8", "", { "bin": { "prettier": "bin-prettier.js" } }, "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q=="], |
| 2401 | 2690 | |
| 2402 | 2691 | "@changesets/write/prettier": ["prettier@2.8.8", "", { "bin": { "prettier": "bin-prettier.js" } }, "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q=="], |
| 2403 | 2692 | |
| 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 | + | |
| 2404 | 2701 | "@manypkg/find-root/@types/node": ["@types/node@12.20.55", "", {}, "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ=="], |
| 2405 | 2702 | |
| 2406 | 2703 | "@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 | ||
| 2409 | 2706 | |
| 2410 | 2707 | "@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=="], |
| 2411 | 2708 | |
| 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 | + | |
| 2412 | 2719 | "@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=="], |
| 2413 | 2720 | |
| 2414 | 2721 | "@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 | ||
| 2421 | 2728 | |
| 2422 | 2729 | "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], |
| 2423 | 2730 | |
| 2731 | + "@ts-morph/common/minimatch": ["minimatch@10.2.4", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg=="], | |
| 2732 | + | |
| 2424 | 2733 | "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=="], |
| 2425 | 2734 | |
| 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 | + | |
| 2426 | 2737 | "globby/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], |
| 2427 | 2738 | |
| 2739 | + "import-fresh/resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], | |
| 2740 | + | |
| 2428 | 2741 | "log-symbols/is-unicode-supported": ["is-unicode-supported@1.3.0", "", {}, "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ=="], |
| 2429 | 2742 | |
| 2430 | 2743 | "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], |
| 2431 | 2744 | |
| 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 | + | |
| 2432 | 2751 | "ora/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], |
| 2433 | 2752 | |
| 2434 | 2753 | "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], |
| 2435 | 2754 | |
| 2755 | + "prompts/kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="], | |
| 2756 | + | |
| 2436 | 2757 | "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=="], |
| 2437 | 2758 | |
| 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 | + | |
| 2438 | 2767 | "string-width/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], |
| 2439 | 2768 | |
| 2440 | 2769 | "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 | ||
| 2445 | 2774 | |
| 2446 | 2775 | "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=="], |
| 2447 | 2776 | |
| 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 | + | |
| 2448 | 2793 | "cliui/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], |
| 2449 | 2794 | |
| 2450 | 2795 | "ora/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], |
| 2451 | 2796 | |
| 2452 | 2797 | "read-yaml-file/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], |
| 2453 | 2798 | |
| 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 | + | |
| 2454 | 2803 | "string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], |
| 2455 | 2804 | |
| 2456 | 2805 | "tough-cookie/tldts/tldts-core": ["tldts-core@6.1.86", "", {}, "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA=="], |
| @@ -2458,5 +2807,7 @@ · 1 unmodified line | ||
| 2458 | 2807 | "wrap-ansi/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], |
| 2459 | 2808 | |
| 2460 | 2809 | "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=="], | |
| 2461 | 2812 | } |
| 2462 | 2813 | } |
| @@ -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 | +} | |
| @@ -5,7 +5,10 @@ · 4 unmodified lines | ||
| 5 | 5 | "exports": { |
| 6 | 6 | ".": "./src/index.ts", |
| 7 | 7 | "./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" | |
| 9 | 12 | }, |
| 10 | 13 | "scripts": { |
| 11 | 14 | "typecheck": "bunx tsc --noEmit -p tsconfig.json", |
| @@ -13,15 +16,17 @@ · 1 unmodified line | ||
| 13 | 16 | "test:watch": "bunx vitest" |
| 14 | 17 | }, |
| 15 | 18 | "dependencies": { |
| 16 | − "@shikijs/langs": "^4.0.1", | |
| 17 | − "@shikijs/themes": "^4.0.1", | |
| 19 | + "@base-ui/react": "^1.3.0", | |
| 18 | 20 | "@effect-atom/atom": "0.5.3", |
| 19 | 21 | "@effect-atom/atom-react": "0.5.0", |
| 20 | 22 | "@effect/platform": "catalog:", |
| 21 | 23 | "@executor/platform-api": "workspace:*", |
| 22 | 24 | "@executor/platform-sdk": "workspace:*", |
| 25 | + "@shikijs/langs": "^4.0.1", | |
| 26 | + "@shikijs/themes": "^4.0.1", | |
| 23 | 27 | "class-variance-authority": "^0.7.1", |
| 24 | 28 | "clsx": "^2.1.1", |
| 29 | + "cmdk": "^1.1.1", | |
| 25 | 30 | "effect": "catalog:", |
| 26 | 31 | "shiki": "^4.0.1", |
| 27 | 32 | "streamdown": "^2.3.0", |
| @@ -290,53 +290,33 @@ export function SecretReferenceField(props: SecretReferenceFieldProps) { · 289 unmodified lines | ||
| 290 | 290 | <div className="grid gap-2"> |
| 291 | 291 | <span className="text-xs font-medium text-foreground">{props.label}</span> |
| 292 | 292 | |
| 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 | + } | |
| 298 | 301 | }} |
| 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 | + /> | |
| 330 | 317 | |
| 331 | 318 | {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> | |
| 340 | 320 | |
| 341 | 321 | {finderError && ( |
| 342 | 322 | <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 | ||
| 345 | 325 | )} |
| 346 | 326 | |
| 347 | 327 | <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 | + | |
| 348 | 339 | {finderStatus === "pending" && ( |
| 349 | 340 | <div className="rounded-lg border border-border px-3 py-2 text-xs text-muted-foreground"> |
| 350 | 341 | Loading secrets... |
| @@ -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 | −} | |
| @@ -2,6 +2,7 @@ import { useCallback, useEffect, useRef, useState } from "react"; · 1 unmodified line | ||
| 2 | 2 | |
| 3 | 3 | import { codeToHtml, resolveLang } from "../lib/shiki"; |
| 4 | 4 | import { cn } from "../lib/cn"; |
| 5 | +import { Button } from "./ui/button"; | |
| 5 | 6 | import { IconCheck, IconCopy } from "./icons"; |
| 6 | 7 | |
| 7 | 8 | const highlightCache = new Map<string, string>(); |
| @@ -80,14 +81,16 @@ export function CodeBlock(props: { · 72 unmodified lines | ||
| 80 | 81 | |
| 81 | 82 | return ( |
| 82 | 83 | <div className={cn("group relative overflow-auto", className)}> |
| 83 | − <button | |
| 84 | + <Button | |
| 84 | 85 | type="button" |
| 86 | + variant="outline" | |
| 87 | + size="icon" | |
| 85 | 88 | 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" | |
| 87 | 90 | title="Copy to clipboard" |
| 88 | 91 | > |
| 89 | 92 | {copied ? <IconCheck className="size-3" /> : <IconCopy className="size-3" />} |
| 90 | − </button> | |
| 93 | + </Button> | |
| 91 | 94 | |
| 92 | 95 | {html ? ( |
| 93 | 96 | <div |
| @@ -7,7 +7,7 @@ import { · 6 unmodified lines | ||
| 7 | 7 | useSourceInspection, |
| 8 | 8 | useSourceToolDetail, |
| 9 | 9 | } from "../../hooks/sources"; |
| 10 | −import { Badge } from "./badge"; | |
| 10 | +import { Badge } from "./ui/badge"; | |
| 11 | 11 | import { LoadableBlock } from "./loadable"; |
| 12 | 12 | import { |
| 13 | 13 | SourceToolModelWorkbench, |
| @@ -8,7 +8,7 @@ import type { · 7 unmodified lines | ||
| 8 | 8 | SourceInspection, |
| 9 | 9 | SourceInspectionToolDetail, |
| 10 | 10 | } from "@executor/platform-sdk/schema"; |
| 11 | −import { MethodBadge } from "./badge"; | |
| 11 | +import { MethodBadge } from "./ui/badge"; | |
| 12 | 12 | import { CodeBlock } from "./code-block"; |
| 13 | 13 | import { DocumentPanel } from "./document-panel"; |
| 14 | 14 | import { EmptyState, LoadableBlock } from "./loadable"; |
| @@ -22,6 +22,8 @@ import { · 7 unmodified lines | ||
| 22 | 22 | IconSearch, |
| 23 | 23 | IconTool, |
| 24 | 24 | } from "./icons"; |
| 25 | +import { Button } from "./ui/button"; | |
| 26 | +import { Input } from "./ui/input"; | |
| 25 | 27 | import { cn } from "../lib/cn"; |
| 26 | 28 | |
| 27 | 29 | type ToolTreeNode = { |
| @@ -173,16 +175,18 @@ const CopyButton = (props: { · 145 unmodified lines | ||
| 173 | 175 | copiedField: string | null; |
| 174 | 176 | onCopy: (text: string, field: string) => void | Promise<void>; |
| 175 | 177 | }) => ( |
| 176 | − <button | |
| 178 | + <Button | |
| 177 | 179 | type="button" |
| 180 | + variant="ghost" | |
| 181 | + size="icon" | |
| 178 | 182 | onClick={() => { |
| 179 | 183 | void props.onCopy(props.text, props.field); |
| 180 | 184 | }} |
| 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" | |
| 182 | 186 | title={`Copy ${props.field}`} |
| 183 | 187 | > |
| 184 | 188 | {props.copiedField === props.field ? <IconCheck /> : <IconCopy />} |
| 185 | − </button> | |
| 189 | + </Button> | |
| 186 | 190 | ); |
| 187 | 191 | |
| 188 | 192 | const SourceToolTree = (props: { |
| @@ -295,17 +299,19 @@ const SourceToolTreeNodeView = (props: { · 106 unmodified lines | ||
| 295 | 299 | <div> |
| 296 | 300 | {node.tool ? ( |
| 297 | 301 | <div className="flex items-center"> |
| 298 | − <button | |
| 302 | + <Button | |
| 299 | 303 | type="button" |
| 304 | + variant="ghost" | |
| 305 | + size="icon" | |
| 300 | 306 | 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" | |
| 302 | 308 | style={{ marginLeft: paddingLeft }} |
| 303 | 309 | > |
| 304 | 310 | <IconChevron |
| 305 | 311 | className={cn("shrink-0 transition-transform duration-150", open && "rotate-90")} |
| 306 | 312 | style={{ width: 8, height: 8 }} |
| 307 | 313 | /> |
| 308 | − </button> | |
| 314 | + </Button> | |
| 309 | 315 | <SourceToolListItem |
| 310 | 316 | tool={node.tool as SourceInspection["tools"][number]} |
| 311 | 317 | active={node.tool?.path === selectedToolPath} |
| @@ -318,11 +324,12 @@ const SourceToolTreeNodeView = (props: { · 6 unmodified lines | ||
| 318 | 324 | /> |
| 319 | 325 | </div> |
| 320 | 326 | ) : ( |
| 321 | − <button | |
| 327 | + <Button | |
| 322 | 328 | type="button" |
| 329 | + variant="ghost" | |
| 323 | 330 | onClick={() => setOpen((value) => !value)} |
| 324 | 331 | 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", | |
| 326 | 333 | open ? "text-foreground/80" : "text-muted-foreground/60", |
| 327 | 334 | )} |
| 328 | 335 | style={{ paddingLeft }} |
| @@ -344,7 +351,7 @@ const SourceToolTreeNodeView = (props: { · 15 unmodified lines | ||
| 344 | 351 | <span className="shrink-0 tabular-nums text-[10px] text-muted-foreground/25"> |
| 345 | 352 | {leafCount} |
| 346 | 353 | </span> |
| 347 | − </button> | |
| 354 | + </Button> | |
| 348 | 355 | )} |
| 349 | 356 | |
| 350 | 357 | {open && hasChildren && ( |
| @@ -397,15 +404,16 @@ const SourceToolListItem = (props: { · 46 unmodified lines | ||
| 397 | 404 | : props.tool.path; |
| 398 | 405 | |
| 399 | 406 | return ( |
| 400 | − <button | |
| 407 | + <Button | |
| 401 | 408 | ref={ref} |
| 402 | 409 | type="button" |
| 410 | + variant="ghost" | |
| 403 | 411 | onMouseEnter={() => { |
| 404 | 412 | props.prefetch(props.sourceId, props.tool.path); |
| 405 | 413 | }} |
| 406 | 414 | onClick={props.onSelect} |
| 407 | 415 | 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", | |
| 409 | 417 | props.active |
| 410 | 418 | ? "border-l-2 border-l-primary bg-primary/10 text-foreground" |
| 411 | 419 | : "text-foreground/70 hover:bg-accent/50 hover:text-foreground", |
| @@ -418,7 +426,7 @@ const SourceToolListItem = (props: { · 6 unmodified lines | ||
| 418 | 426 | {highlightMatch(label, props.search)} |
| 419 | 427 | </span> |
| 420 | 428 | {props.tool.method && <MethodBadge method={props.tool.method} />} |
| 421 | − </button> | |
| 429 | + </Button> | |
| 422 | 430 | ); |
| 423 | 431 | }; |
| 424 | 432 | |
| @@ -599,21 +607,23 @@ export const SourceToolModelWorkbench = ( · 174 unmodified lines | ||
| 599 | 607 | <div className="shrink-0 border-b border-border px-3 py-2"> |
| 600 | 608 | <div className="flex h-8 items-center gap-2 rounded-md border border-input bg-background px-2.5"> |
| 601 | 609 | <IconSearch className="size-3.5 shrink-0 text-muted-foreground/40" /> |
| 602 | − <input | |
| 610 | + <Input | |
| 603 | 611 | ref={searchRef} |
| 604 | 612 | value={search} |
| 605 | 613 | onChange={(event) => setSearch(event.target.value)} |
| 606 | 614 | 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" | |
| 608 | 616 | /> |
| 609 | 617 | {search.length > 0 ? ( |
| 610 | − <button | |
| 618 | + <Button | |
| 611 | 619 | type="button" |
| 620 | + variant="ghost" | |
| 621 | + size="icon" | |
| 612 | 622 | 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" | |
| 614 | 624 | > |
| 615 | 625 | <IconClose /> |
| 616 | − </button> | |
| 626 | + </Button> | |
| 617 | 627 | ) : ( |
| 618 | 628 | <kbd className="shrink-0 rounded border border-border bg-muted px-1 py-px text-[10px] leading-none text-muted-foreground/50"> |
| 619 | 629 | / |
| @@ -622,7 +632,7 @@ export const SourceToolModelWorkbench = ( · 2 unmodified lines | ||
| 622 | 632 | </div> |
| 623 | 633 | </div> |
| 624 | 634 | |
| 625 | − <div className="flex-1 overflow-y-auto max-w-[300px]"> | |
| 635 | + <div className="flex-1 overflow-y-auto"> | |
| 626 | 636 | {filteredTools.length === 0 ? ( |
| 627 | 637 | <div className="p-4 text-center text-[13px] text-muted-foreground/50"> |
| 628 | 638 | {terms.length > 0 ? "No tools match your filter" : "No tools available"} |
| @@ -687,19 +697,16 @@ export const SourceToolDiscoveryPanel = < · 58 unmodified lines | ||
| 687 | 697 | > |
| 688 | 698 | <div className="relative flex-1"> |
| 689 | 699 | <IconSearch className="absolute left-3 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground/40" /> |
| 690 | − <input | |
| 700 | + <Input | |
| 691 | 701 | value={draftQuery} |
| 692 | 702 | onChange={(event) => setDraftQuery(event.target.value)} |
| 693 | 703 | 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" | |
| 695 | 705 | /> |
| 696 | 706 | </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"> | |
| 701 | 708 | Search |
| 702 | − </button> | |
| 709 | + </Button> | |
| 703 | 710 | </form> |
| 704 | 711 | </div> |
| 705 | 712 | |
| @@ -719,11 +726,12 @@ export const SourceToolDiscoveryPanel = < · 13 unmodified lines | ||
| 719 | 726 | ) : ( |
| 720 | 727 | <div className="max-w-3xl space-y-2"> |
| 721 | 728 | {result.results.map((item, index) => ( |
| 722 | − <button | |
| 729 | + <Button | |
| 723 | 730 | key={item.path} |
| 724 | 731 | type="button" |
| 732 | + variant="outline" | |
| 725 | 733 | 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" | |
| 727 | 735 | > |
| 728 | 736 | <div className="mb-1.5 flex items-center justify-between gap-3"> |
| 729 | 737 | <div className="flex min-w-0 items-center gap-2.5"> |
| @@ -743,7 +751,7 @@ export const SourceToolDiscoveryPanel = < · 13 unmodified lines | ||
| 743 | 751 | {item.description} |
| 744 | 752 | </p> |
| 745 | 753 | )} |
| 746 | − </button> | |
| 754 | + </Button> | |
| 747 | 755 | ))} |
| 748 | 756 | </div> |
| 749 | 757 | ) |
| @@ -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 }; | |
| @@ -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 }; | |
| @@ -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 }; | |
| @@ -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 | +}; | |
| @@ -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 | +}; | |
| @@ -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 | +} | |
| @@ -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 }; | |
| @@ -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 }; | |
| @@ -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 }; | |
| @@ -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 }; | |
| @@ -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 }; | |
| @@ -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 }; | |
| @@ -63,10 +63,6 @@ export { · 62 unmodified lines | ||
| 63 | 63 | cn, |
| 64 | 64 | } from "./lib/cn"; |
| 65 | 65 | |
| 66 | −export { | |
| 67 | − Badge, | |
| 68 | − MethodBadge, | |
| 69 | −} from "./components/badge"; | |
| 70 | 66 | export { |
| 71 | 67 | CodeBlock, |
| 72 | 68 | } from "./components/code-block"; |
| @@ -106,3 +102,16 @@ export { · 33 unmodified lines | ||
| 106 | 102 | type SourceToolDetailPanelProps, |
| 107 | 103 | type SourceToolDiscoveryResult, |
| 108 | 104 | } 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"; | |
| @@ -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 | +} | |
| @@ -8,7 +8,11 @@ · 7 unmodified lines | ||
| 8 | 8 | "noEmit": true, |
| 9 | 9 | "lib": ["ES2022", "DOM"], |
| 10 | 10 | "jsx": "react-jsx", |
| 11 | − "types": ["bun-types"] | |
| 11 | + "types": ["bun-types"], | |
| 12 | + "baseUrl": ".", | |
| 13 | + "paths": { | |
| 14 | + "@/*": ["./src/plugins/*"] | |
| 15 | + } | |
| 12 | 16 | }, |
| 13 | 17 | "include": [ |
| 14 | 18 | "src/**/*.ts", |
| @@ -7,7 +7,10 @@ import { · 6 unmodified lines | ||
| 7 | 7 | useExecutions, |
| 8 | 8 | } from "@executor/react"; |
| 9 | 9 | import { |
| 10 | + Alert, | |
| 10 | 11 | Badge, |
| 12 | + Button, | |
| 13 | + Card, | |
| 11 | 14 | DocumentPanel, |
| 12 | 15 | EmptyState, |
| 13 | 16 | LoadableBlock, |
| @@ -81,12 +84,12 @@ const MetadataItem = (props: { · 67 unmodified lines | ||
| 81 | 84 | label: string; |
| 82 | 85 | value: string; |
| 83 | 86 | }) => ( |
| 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"> | |
| 85 | 88 | <div className="text-[10px] font-medium uppercase tracking-wider text-muted-foreground/70"> |
| 86 | 89 | {props.label} |
| 87 | 90 | </div> |
| 88 | 91 | <div className="mt-1 text-sm text-foreground">{props.value}</div> |
| 89 | − </div> | |
| 92 | + </Card> | |
| 90 | 93 | ); |
| 91 | 94 | |
| 92 | 95 | const ExecutionCard = (props: { |
| @@ -96,10 +99,11 @@ const ExecutionCard = (props: { · 3 unmodified lines | ||
| 96 | 99 | const { execution } = props; |
| 97 | 100 | |
| 98 | 101 | return ( |
| 99 | − <button | |
| 102 | + <Button | |
| 103 | + variant="ghost" | |
| 100 | 104 | type="button" |
| 101 | 105 | 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" | |
| 103 | 107 | > |
| 104 | 108 | <div className="flex items-start justify-between gap-3"> |
| 105 | 109 | <div className="min-w-0 flex-1"> |
| @@ -122,11 +126,11 @@ const ExecutionCard = (props: { · 16 unmodified lines | ||
| 122 | 126 | </div> |
| 123 | 127 | |
| 124 | 128 | {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"> | |
| 126 | 130 | {execution.errorText} |
| 127 | − </div> | |
| 131 | + </Alert> | |
| 128 | 132 | )} |
| 129 | − </button> | |
| 133 | + </Button> | |
| 130 | 134 | ); |
| 131 | 135 | }; |
| 132 | 136 | |
| @@ -275,15 +279,16 @@ export function ExecutionHistoryDetailPage() { · 142 unmodified lines | ||
| 275 | 279 | <div className="mx-auto max-w-6xl px-6 py-10 lg:px-10 lg:py-14"> |
| 276 | 280 | <div className="mb-8 flex flex-wrap items-center justify-between gap-4"> |
| 277 | 281 | <div> |
| 278 | − <button | |
| 282 | + <Button | |
| 283 | + variant="ghost" | |
| 279 | 284 | type="button" |
| 280 | 285 | onClick={() => { |
| 281 | 286 | void navigation.route(); |
| 282 | 287 | }} |
| 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" | |
| 284 | 289 | > |
| 285 | 290 | Back to history |
| 286 | − </button> | |
| 291 | + </Button> | |
| 287 | 292 | <div className="flex items-center gap-3"> |
| 288 | 293 | <h1 className="font-display text-2xl tracking-tight text-foreground lg:text-3xl"> |
| 289 | 294 | {executionId} |
| @@ -11,9 +11,17 @@ import { · 10 unmodified lines | ||
| 11 | 11 | useSource, |
| 12 | 12 | } from "@executor/react"; |
| 13 | 13 | import { |
| 14 | + Alert, | |
| 14 | 15 | Badge, |
| 16 | + Button, | |
| 17 | + Card, | |
| 15 | 18 | IconPencil, |
| 19 | + Input, | |
| 20 | + Label, | |
| 21 | + Select, | |
| 22 | + Separator, | |
| 16 | 23 | SourceToolExplorer, |
| 24 | + Textarea, | |
| 17 | 25 | parseSourceToolExplorerSearch, |
| 18 | 26 | type SourceToolExplorerSearch, |
| 19 | 27 | useSourcePluginNavigation, |
| @@ -565,80 +573,74 @@ function GoogleDiscoverySourceForm(props: { · 545 unmodified lines | ||
| 565 | 573 | }; |
| 566 | 574 | |
| 567 | 575 | return ( |
| 568 | − <div className="space-y-6 rounded-xl border border-border p-6"> | |
| 576 | + <Card className="space-y-6 p-6"> | |
| 569 | 577 | <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 | |
| 573 | 581 | value={name} |
| 574 | 582 | 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" | |
| 576 | 583 | /> |
| 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 | |
| 581 | 588 | value={service} |
| 582 | 589 | 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" | |
| 584 | 590 | /> |
| 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 | |
| 589 | 595 | value={version} |
| 590 | 596 | 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" | |
| 592 | 597 | /> |
| 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 | |
| 597 | 602 | value={discoveryUrl} |
| 598 | 603 | onChange={(event) => setDiscoveryUrl(event.target.value)} |
| 599 | 604 | 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" | |
| 601 | 606 | /> |
| 602 | − </label> | |
| 607 | + </div> | |
| 603 | 608 | </div> |
| 604 | 609 | |
| 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 | |
| 608 | 613 | value={headersText} |
| 609 | 614 | onChange={(event) => setHeadersText(event.target.value)} |
| 610 | 615 | 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" | |
| 612 | 616 | /> |
| 613 | − </label> | |
| 617 | + </div> | |
| 614 | 618 | |
| 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 | |
| 618 | 622 | value={scopesText} |
| 619 | 623 | onChange={(event) => setScopesText(event.target.value)} |
| 620 | 624 | rows={3} |
| 621 | 625 | 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" | |
| 623 | 626 | /> |
| 624 | − </label> | |
| 627 | + </div> | |
| 625 | 628 | |
| 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 | |
| 629 | 632 | value={authKind} |
| 630 | 633 | onChange={(event) => |
| 631 | 634 | 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" | |
| 633 | 635 | > |
| 634 | 636 | <option value="none">None</option> |
| 635 | 637 | <option value="bearer">Bearer Secret</option> |
| 636 | 638 | <option value="oauth2">Google OAuth</option> |
| 637 | − </select> | |
| 638 | − </label> | |
| 639 | + </Select> | |
| 640 | + </div> | |
| 639 | 641 | |
| 640 | 642 | {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"> | |
| 642 | 644 | <SecretReferenceField |
| 643 | 645 | label="Secret" |
| 644 | 646 | value={bearerSecretRef} |
| @@ -651,15 +653,14 @@ function GoogleDiscoverySourceForm(props: { · 6 unmodified lines | ||
| 651 | 653 | )} |
| 652 | 654 | |
| 653 | 655 | {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 | |
| 658 | 660 | value={clientId} |
| 659 | 661 | 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" | |
| 661 | 662 | /> |
| 662 | − </label> | |
| 663 | + </div> | |
| 663 | 664 | <SecretReferenceField |
| 664 | 665 | label="Client Secret" |
| 665 | 666 | value={clientSecretRef} |
| @@ -669,7 +670,8 @@ function GoogleDiscoverySourceForm(props: { · 3 unmodified lines | ||
| 669 | 670 | onChange={setClientSecretRef} |
| 670 | 671 | /> |
| 671 | 672 | <div className="flex items-center gap-3"> |
| 672 | − <button | |
| 673 | + <Button | |
| 674 | + variant="outline" | |
| 673 | 675 | type="button" |
| 674 | 676 | onClick={() => { |
| 675 | 677 | void (async () => { |
| @@ -685,14 +687,13 @@ function GoogleDiscoverySourceForm(props: { · 9 unmodified lines | ||
| 685 | 687 | })(); |
| 686 | 688 | }} |
| 687 | 689 | 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" | |
| 689 | 690 | > |
| 690 | 691 | {oauthStatus === "pending" |
| 691 | 692 | ? "Connecting..." |
| 692 | 693 | : oauthStatus === "connected" |
| 693 | 694 | ? "Reconnect" |
| 694 | 695 | : "Connect with Google"} |
| 695 | − </button> | |
| 696 | + </Button> | |
| 696 | 697 | {oauthStatus === "connected" && ( |
| 697 | 698 | <span className="text-xs text-primary">Connected</span> |
| 698 | 699 | )} |
| @@ -701,13 +702,13 @@ function GoogleDiscoverySourceForm(props: { · 2 unmodified lines | ||
| 701 | 702 | )} |
| 702 | 703 | |
| 703 | 704 | {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"> | |
| 705 | 706 | {error} |
| 706 | − </div> | |
| 707 | + </Alert> | |
| 707 | 708 | )} |
| 708 | 709 | |
| 709 | 710 | <div className="flex items-center justify-end"> |
| 710 | − <button | |
| 711 | + <Button | |
| 711 | 712 | type="button" |
| 712 | 713 | onClick={() => { |
| 713 | 714 | void (async () => { |
| @@ -746,14 +747,13 @@ function GoogleDiscoverySourceForm(props: { · 32 unmodified lines | ||
| 746 | 747 | })(); |
| 747 | 748 | }} |
| 748 | 749 | 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" | |
| 750 | 750 | > |
| 751 | 751 | {submitMutation.status === "pending" |
| 752 | 752 | ? props.mode === "create" ? "Creating..." : "Saving..." |
| 753 | 753 | : props.mode === "create" ? "Create Source" : "Save Changes"} |
| 754 | − </button> | |
| 754 | + </Button> | |
| 755 | 755 | </div> |
| 756 | − </div> | |
| 756 | + </Card> | |
| 757 | 757 | ); |
| 758 | 758 | } |
| 759 | 759 | |
| @@ -857,7 +857,7 @@ function GoogleDiscoveryBatchConnectPanel(props: { · 97 unmodified lines | ||
| 857 | 857 | }; |
| 858 | 858 | |
| 859 | 859 | return ( |
| 860 | − <div className="space-y-6 rounded-xl border border-border p-6"> | |
| 860 | + <Card className="space-y-6 p-6"> | |
| 861 | 861 | <div> |
| 862 | 862 | <h2 className="text-base font-semibold text-foreground"> |
| 863 | 863 | Connect multiple Google APIs |
| @@ -874,14 +874,17 @@ function GoogleDiscoveryBatchConnectPanel(props: { · 10 unmodified lines | ||
| 874 | 874 | : `${selectedTemplates.length} Google API${selectedTemplates.length === 1 ? "" : "s"} selected.`} |
| 875 | 875 | </div> |
| 876 | 876 | <div className="flex items-center gap-2"> |
| 877 | − <button | |
| 877 | + <Button | |
| 878 | + variant="outline" | |
| 879 | + size="sm" | |
| 878 | 880 | type="button" |
| 879 | 881 | 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" | |
| 881 | 882 | > |
| 882 | 883 | Clear |
| 883 | − </button> | |
| 884 | − <button | |
| 884 | + </Button> | |
| 885 | + <Button | |
| 886 | + variant="outline" | |
| 887 | + size="sm" | |
| 885 | 888 | type="button" |
| 886 | 889 | onClick={() => |
| 887 | 890 | setSelectedTemplateIds( |
| @@ -890,12 +893,11 @@ function GoogleDiscoveryBatchConnectPanel(props: { · 2 unmodified lines | ||
| 890 | 893 | : GOOGLE_DISCOVERY_BATCH_TEMPLATES.map((template) => template.id), |
| 891 | 894 | ) |
| 892 | 895 | } |
| 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" | |
| 894 | 896 | > |
| 895 | 897 | {selectedTemplateIds.length === GOOGLE_DISCOVERY_BATCH_TEMPLATES.length |
| 896 | 898 | ? "Deselect all" |
| 897 | 899 | : "Select all"} |
| 898 | − </button> | |
| 900 | + </Button> | |
| 899 | 901 | </div> |
| 900 | 902 | </div> |
| 901 | 903 | |
| @@ -905,14 +907,15 @@ function GoogleDiscoveryBatchConnectPanel(props: { · 3 unmodified lines | ||
| 905 | 907 | const iconUrl = getGoogleDiscoveryIconUrlForService(template.service); |
| 906 | 908 | |
| 907 | 909 | return ( |
| 908 | − <button | |
| 910 | + <Button | |
| 909 | 911 | key={template.id} |
| 912 | + variant="ghost" | |
| 910 | 913 | type="button" |
| 911 | 914 | onClick={() => toggleTemplate(template.id)} |
| 912 | 915 | className={ |
| 913 | 916 | 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" | |
| 916 | 919 | } |
| 917 | 920 | > |
| 918 | 921 | <div className="flex items-start gap-3"> |
| @@ -954,21 +957,20 @@ function GoogleDiscoveryBatchConnectPanel(props: { · 35 unmodified lines | ||
| 954 | 957 | </div> |
| 955 | 958 | </div> |
| 956 | 959 | </div> |
| 957 | − </button> | |
| 960 | + </Button> | |
| 958 | 961 | ); |
| 959 | 962 | })} |
| 960 | 963 | </div> |
| 961 | 964 | |
| 962 | 965 | <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 | |
| 966 | 969 | value={clientId} |
| 967 | 970 | onChange={(event) => setClientId(event.target.value)} |
| 968 | 971 | 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" | |
| 970 | 972 | /> |
| 971 | − </label> | |
| 973 | + </div> | |
| 972 | 974 | <div className="md:col-span-2"> |
| 973 | 975 | <SecretReferenceField |
| 974 | 976 | label="Client Secret" |
| @@ -982,13 +984,13 @@ function GoogleDiscoveryBatchConnectPanel(props: { · 7 unmodified lines | ||
| 982 | 984 | </div> |
| 983 | 985 | |
| 984 | 986 | {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"> | |
| 986 | 988 | {error} |
| 987 | − </div> | |
| 989 | + </Alert> | |
| 988 | 990 | )} |
| 989 | 991 | |
| 990 | 992 | <div className="flex items-center justify-end gap-3"> |
| 991 | − <button | |
| 993 | + <Button | |
| 992 | 994 | type="button" |
| 993 | 995 | onClick={() => { |
| 994 | 996 | void handleConnect(); |
| @@ -998,16 +1000,15 @@ function GoogleDiscoveryBatchConnectPanel(props: { · 3 unmodified lines | ||
| 998 | 1000 | || selectedTemplates.length === 0 |
| 999 | 1001 | || clientId.trim().length === 0 |
| 1000 | 1002 | } |
| 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" | |
| 1002 | 1003 | > |
| 1003 | 1004 | {status === "connecting" |
| 1004 | 1005 | ? "Connecting..." |
| 1005 | 1006 | : selectedTemplates.length > 0 |
| 1006 | 1007 | ? `Connect ${selectedTemplates.length} Google API${selectedTemplates.length === 1 ? "" : "s"}` |
| 1007 | 1008 | : "Connect Google APIs"} |
| 1008 | − </button> | |
| 1009 | + </Button> | |
| 1009 | 1010 | </div> |
| 1010 | − </div> | |
| 1011 | + </Card> | |
| 1011 | 1012 | ); |
| 1012 | 1013 | } |
| 1013 | 1014 | |
| @@ -1043,11 +1044,11 @@ export function GoogleDiscoveryAddPage() { · 29 unmodified lines | ||
| 1043 | 1044 | /> |
| 1044 | 1045 | |
| 1045 | 1046 | <div className="flex items-center gap-3"> |
| 1046 | − <div className="h-px flex-1 bg-border" /> | |
| 1047 | + <Separator className="flex-1" /> | |
| 1047 | 1048 | <div className="text-xs font-medium text-muted-foreground"> |
| 1048 | 1049 | or add a single API |
| 1049 | 1050 | </div> |
| 1050 | − <div className="h-px flex-1 bg-border" /> | |
| 1051 | + <Separator className="flex-1" /> | |
| 1051 | 1052 | </div> |
| 1052 | 1053 | |
| 1053 | 1054 | <GoogleDiscoverySourceForm |
| @@ -1108,9 +1109,9 @@ export function GoogleDiscoveryEditPage(props: { · 54 unmodified lines | ||
| 1108 | 1109 | |
| 1109 | 1110 | if (Result.isFailure(configResult)) { |
| 1110 | 1111 | 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"> | |
| 1112 | 1113 | Failed loading source configuration. |
| 1113 | − </div> | |
| 1114 | + </Alert> | |
| 1114 | 1115 | ); |
| 1115 | 1116 | } |
| 1116 | 1117 | |
| @@ -1238,48 +1239,48 @@ export function GoogleDiscoveryDetailPage(props: { · 121 unmodified lines | ||
| 1238 | 1239 | summary={summary} |
| 1239 | 1240 | actions={( |
| 1240 | 1241 | <> |
| 1241 | − <button | |
| 1242 | + <Button | |
| 1243 | + variant="outline" | |
| 1242 | 1244 | type="button" |
| 1243 | 1245 | onClick={() => |
| 1244 | 1246 | 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" | |
| 1246 | 1247 | > |
| 1247 | 1248 | <IconPencil className="size-3.5" /> |
| 1248 | 1249 | Edit |
| 1249 | − </button> | |
| 1250 | + </Button> | |
| 1250 | 1251 | {confirmDelete ? ( |
| 1251 | 1252 | <div className="flex items-center gap-2"> |
| 1252 | 1253 | <span className="text-xs font-medium text-destructive"> |
| 1253 | 1254 | Confirm delete? |
| 1254 | 1255 | </span> |
| 1255 | − <button | |
| 1256 | + <Button | |
| 1257 | + variant="outline" | |
| 1256 | 1258 | type="button" |
| 1257 | 1259 | onClick={() => setConfirmDelete(false)} |
| 1258 | 1260 | 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" | |
| 1260 | 1261 | > |
| 1261 | 1262 | Cancel |
| 1262 | − </button> | |
| 1263 | − <button | |
| 1263 | + </Button> | |
| 1264 | + <Button | |
| 1265 | + variant="destructive-outline" | |
| 1264 | 1266 | type="button" |
| 1265 | 1267 | onClick={() => { |
| 1266 | 1268 | void handleDelete().catch(() => {}); |
| 1267 | 1269 | }} |
| 1268 | 1270 | 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" | |
| 1270 | 1271 | > |
| 1271 | 1272 | {isDeleting ? "Deleting..." : "Delete"} |
| 1272 | − </button> | |
| 1273 | + </Button> | |
| 1273 | 1274 | </div> |
| 1274 | 1275 | ) : ( |
| 1275 | − <button | |
| 1276 | + <Button | |
| 1277 | + variant="destructive-outline" | |
| 1276 | 1278 | type="button" |
| 1277 | 1279 | onClick={() => setConfirmDelete(true)} |
| 1278 | 1280 | 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" | |
| 1280 | 1281 | > |
| 1281 | 1282 | Delete |
| 1282 | − </button> | |
| 1283 | + </Button> | |
| 1283 | 1284 | )} |
| 1284 | 1285 | </> |
| 1285 | 1286 | )} |
| @@ -14,10 +14,17 @@ import { · 13 unmodified lines | ||
| 14 | 14 | useSource, |
| 15 | 15 | } from "@executor/react"; |
| 16 | 16 | import { |
| 17 | + Alert, | |
| 17 | 18 | Badge, |
| 19 | + Button, | |
| 20 | + Card, | |
| 18 | 21 | IconPencil, |
| 22 | + Input, | |
| 23 | + Label, | |
| 24 | + Select, | |
| 19 | 25 | SourceToolDetailPanel, |
| 20 | 26 | SourceToolExplorer, |
| 27 | + Textarea, | |
| 21 | 28 | parseSourceToolExplorerSearch, |
| 22 | 29 | useSourcePluginRouteParams, |
| 23 | 30 | type SourceToolExplorerSearch, |
| @@ -207,52 +214,49 @@ function GraphqlSourceForm(props: { · 183 unmodified lines | ||
| 207 | 214 | const [error, setError] = useState<string | null>(null); |
| 208 | 215 | |
| 209 | 216 | return ( |
| 210 | − <div className="space-y-6 rounded-xl border border-border p-6"> | |
| 217 | + <Card className="space-y-6 p-6"> | |
| 211 | 218 | <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 | |
| 215 | 222 | value={name} |
| 216 | 223 | 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" | |
| 218 | 224 | /> |
| 219 | − </label> | |
| 225 | + </div> | |
| 220 | 226 | |
| 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 | |
| 224 | 230 | value={endpoint} |
| 225 | 231 | 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" | |
| 227 | 233 | /> |
| 228 | − </label> | |
| 234 | + </div> | |
| 229 | 235 | |
| 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 | |
| 233 | 239 | value={headersText} |
| 234 | 240 | onChange={(event) => setHeadersText(event.target.value)} |
| 235 | 241 | rows={3} |
| 236 | 242 | 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" | |
| 238 | 243 | /> |
| 239 | − </label> | |
| 244 | + </div> | |
| 240 | 245 | |
| 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 | |
| 244 | 249 | value={authKind} |
| 245 | 250 | onChange={(event) => |
| 246 | 251 | 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" | |
| 248 | 252 | > |
| 249 | 253 | <option value="none">None</option> |
| 250 | 254 | <option value="bearer">Bearer Secret</option> |
| 251 | − </select> | |
| 252 | − </label> | |
| 255 | + </Select> | |
| 256 | + </div> | |
| 253 | 257 | |
| 254 | 258 | {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"> | |
| 256 | 260 | <SecretReferenceField |
| 257 | 261 | label="Secret" |
| 258 | 262 | value={secretRef} |
| @@ -263,38 +267,38 @@ function GraphqlSourceForm(props: { · 4 unmodified lines | ||
| 263 | 267 | /> |
| 264 | 268 | |
| 265 | 269 | <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 | |
| 269 | 273 | value={authHeaderName} |
| 270 | 274 | onChange={(event) => setAuthHeaderName(event.target.value)} |
| 271 | 275 | 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" | |
| 273 | 277 | /> |
| 274 | − </label> | |
| 278 | + </div> | |
| 275 | 279 | |
| 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 | |
| 279 | 283 | value={authPrefix} |
| 280 | 284 | onChange={(event) => setAuthPrefix(event.target.value)} |
| 281 | 285 | 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" | |
| 283 | 287 | /> |
| 284 | − </label> | |
| 288 | + </div> | |
| 285 | 289 | </div> |
| 286 | 290 | </div> |
| 287 | 291 | )} |
| 288 | 292 | </div> |
| 289 | 293 | |
| 290 | 294 | {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"> | |
| 292 | 296 | {error} |
| 293 | − </div> | |
| 297 | + </Alert> | |
| 294 | 298 | )} |
| 295 | 299 | |
| 296 | 300 | <div className="flex items-center justify-end"> |
| 297 | − <button | |
| 301 | + <Button | |
| 298 | 302 | type="button" |
| 299 | 303 | onClick={() => { |
| 300 | 304 | void (async () => { |
| @@ -317,14 +321,13 @@ function GraphqlSourceForm(props: { · 16 unmodified lines | ||
| 317 | 321 | })(); |
| 318 | 322 | }} |
| 319 | 323 | 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" | |
| 321 | 324 | > |
| 322 | 325 | {submitMutation.status === "pending" |
| 323 | 326 | ? props.mode === "create" ? "Creating..." : "Saving..." |
| 324 | 327 | : props.mode === "create" ? "Create Source" : "Save Changes"} |
| 325 | − </button> | |
| 328 | + </Button> | |
| 326 | 329 | </div> |
| 327 | − </div> | |
| 330 | + </Card> | |
| 328 | 331 | ); |
| 329 | 332 | } |
| 330 | 333 | |
| @@ -400,9 +403,9 @@ export function GraphqlEditPage(props: { · 69 unmodified lines | ||
| 400 | 403 | |
| 401 | 404 | if (Result.isFailure(configResult)) { |
| 402 | 405 | 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"> | |
| 404 | 407 | Failed loading source configuration. |
| 405 | − </div> | |
| 408 | + </Alert> | |
| 406 | 409 | ); |
| 407 | 410 | } |
| 408 | 411 | |
| @@ -556,47 +559,47 @@ function GraphqlDetailExplorer(props: { · 147 unmodified lines | ||
| 556 | 559 | ) : undefined} |
| 557 | 560 | actions={( |
| 558 | 561 | <> |
| 559 | − <button | |
| 560 | − type="button" | |
| 562 | + <Button | |
| 563 | + variant="outline" | |
| 564 | + size="sm" | |
| 561 | 565 | 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" | |
| 563 | 566 | > |
| 564 | 567 | <IconPencil className="size-3" /> |
| 565 | 568 | Edit |
| 566 | − </button> | |
| 569 | + </Button> | |
| 567 | 570 | {confirmDelete ? ( |
| 568 | 571 | <div className="flex items-center gap-2"> |
| 569 | 572 | <span className="text-[11px] font-medium text-destructive"> |
| 570 | 573 | Confirm delete? |
| 571 | 574 | </span> |
| 572 | − <button | |
| 573 | − type="button" | |
| 575 | + <Button | |
| 576 | + variant="outline" | |
| 577 | + size="sm" | |
| 574 | 578 | onClick={() => setConfirmDelete(false)} |
| 575 | 579 | 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" | |
| 577 | 580 | > |
| 578 | 581 | Cancel |
| 579 | − </button> | |
| 580 | − <button | |
| 581 | − type="button" | |
| 582 | + </Button> | |
| 583 | + <Button | |
| 584 | + variant="destructive-outline" | |
| 585 | + size="sm" | |
| 582 | 586 | onClick={() => { |
| 583 | 587 | void handleDelete().catch(() => {}); |
| 584 | 588 | }} |
| 585 | 589 | 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" | |
| 587 | 590 | > |
| 588 | 591 | {isDeleting ? "Deleting..." : "Delete"} |
| 589 | − </button> | |
| 592 | + </Button> | |
| 590 | 593 | </div> |
| 591 | 594 | ) : ( |
| 592 | − <button | |
| 593 | − type="button" | |
| 595 | + <Button | |
| 596 | + variant="destructive-outline" | |
| 597 | + size="sm" | |
| 594 | 598 | onClick={() => setConfirmDelete(true)} |
| 595 | 599 | 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" | |
| 597 | 600 | > |
| 598 | 601 | Delete |
| 599 | − </button> | |
| 602 | + </Button> | |
| 600 | 603 | )} |
| 601 | 604 | </> |
| 602 | 605 | )} |
| @@ -7,6 +7,9 @@ import { · 6 unmodified lines | ||
| 7 | 7 | useSources, |
| 8 | 8 | } from "@executor/react"; |
| 9 | 9 | import { |
| 10 | + Alert, | |
| 11 | + Button, | |
| 12 | + Card, | |
| 10 | 13 | SourceToolExplorer, |
| 11 | 14 | parseSourceToolExplorerSearch, |
| 12 | 15 | useSourcePluginNavigation, |
| @@ -116,7 +119,7 @@ export function LocalToolsAddPage() { · 103 unmodified lines | ||
| 116 | 119 | |
| 117 | 120 | return ( |
| 118 | 121 | <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"> | |
| 120 | 123 | <h1 className="font-display text-2xl tracking-tight text-foreground"> |
| 121 | 124 | Local Tools |
| 122 | 125 | </h1> |
| @@ -125,7 +128,7 @@ export function LocalToolsAddPage() { · 2 unmodified lines | ||
| 125 | 128 | {" "}into a first-class source with inspection and discovery. |
| 126 | 129 | </p> |
| 127 | 130 | |
| 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"> | |
| 129 | 132 | <p> |
| 130 | 133 | The source is provisioned automatically when the executor session starts and finds |
| 131 | 134 | 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 | ||
| 135 | 138 | {" "}<code className="rounded bg-muted px-1 py-0.5 font-mono">.executor/tools/demo.ts</code> |
| 136 | 139 | {" "}still appears as <code className="rounded bg-muted px-1 py-0.5 font-mono">tools.demo(...)</code>. |
| 137 | 140 | </p> |
| 138 | − </div> | |
| 141 | + </Card> | |
| 139 | 142 | |
| 140 | 143 | <div className="mt-6 flex flex-wrap items-center gap-3"> |
| 141 | 144 | {localToolsSource ? ( |
| 142 | − <button | |
| 145 | + <Button | |
| 146 | + size="lg" | |
| 143 | 147 | type="button" |
| 144 | 148 | onClick={() => { |
| 145 | 149 | startTransition(() => { |
| @@ -148,19 +152,18 @@ export function LocalToolsAddPage() { · 2 unmodified lines | ||
| 148 | 152 | }); |
| 149 | 153 | }); |
| 150 | 154 | }} |
| 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" | |
| 152 | 155 | > |
| 153 | 156 | Open Local Tools Source |
| 154 | − </button> | |
| 157 | + </Button> | |
| 155 | 158 | ) : ( |
| 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"> | |
| 157 | 160 | No local tools source is active yet. Create a tool in |
| 158 | 161 | {" "}<code className="rounded bg-muted px-1 py-0.5 font-mono">.executor/tools</code> |
| 159 | 162 | {" "}and restart the executor session. |
| 160 | − </div> | |
| 163 | + </Alert> | |
| 161 | 164 | )} |
| 162 | 165 | </div> |
| 163 | − </div> | |
| 166 | + </Card> | |
| 164 | 167 | </div> |
| 165 | 168 | ); |
| 166 | 169 | } |
| @@ -10,12 +10,20 @@ import { · 9 unmodified lines | ||
| 10 | 10 | useSource, |
| 11 | 11 | } from "@executor/react"; |
| 12 | 12 | import { |
| 13 | + Alert, | |
| 13 | 14 | Badge, |
| 15 | + Button, | |
| 16 | + Card, | |
| 17 | + cn, | |
| 14 | 18 | IconCheck, |
| 15 | 19 | IconPencil, |
| 16 | 20 | IconSearch, |
| 17 | 21 | IconSpinner, |
| 22 | + Input, | |
| 23 | + Label, | |
| 24 | + Select, | |
| 18 | 25 | SourceToolExplorer, |
| 26 | + Textarea, | |
| 19 | 27 | parseSourceToolExplorerSearch, |
| 20 | 28 | type SourceToolExplorerSearch, |
| 21 | 29 | useSourcePluginNavigation, |
| @@ -584,7 +592,7 @@ function McpSourceForm(props: { · 562 unmodified lines | ||
| 584 | 592 | return ( |
| 585 | 593 | <div className="space-y-8"> |
| 586 | 594 | {props.mode === "create" && ( |
| 587 | − <div className="rounded-xl border border-border p-6"> | |
| 595 | + <Card className="p-6"> | |
| 588 | 596 | <div className="text-sm font-medium text-foreground">Presets</div> |
| 589 | 597 | <div className="mt-3 grid gap-3 sm:grid-cols-2"> |
| 590 | 598 | {mcpQuickPresets.map((preset) => { |
| @@ -595,152 +603,145 @@ function McpSourceForm(props: { · 4 unmodified lines | ||
| 595 | 603 | : !isStdio && endpoint.trim() === (preset.input.endpoint ?? ""); |
| 596 | 604 | |
| 597 | 605 | return ( |
| 598 | − <button | |
| 606 | + <Button | |
| 599 | 607 | key={preset.id} |
| 600 | 608 | type="button" |
| 609 | + variant="outline" | |
| 601 | 610 | 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 | + )} | |
| 607 | 615 | > |
| 608 | 616 | <div className="flex items-center gap-2"> |
| 609 | 617 | {selected ? <IconCheck className="size-3.5 text-primary" /> : null} |
| 610 | 618 | <div className="text-sm font-medium text-foreground">{preset.name}</div> |
| 611 | 619 | </div> |
| 612 | 620 | <div className="mt-1 text-xs text-muted-foreground">{preset.summary}</div> |
| 613 | − </button> | |
| 621 | + </Button> | |
| 614 | 622 | ); |
| 615 | 623 | })} |
| 616 | 624 | </div> |
| 617 | − </div> | |
| 625 | + </Card> | |
| 618 | 626 | )} |
| 619 | 627 | |
| 620 | 628 | {props.mode === "create" && ( |
| 621 | − <div className="rounded-xl border border-border p-6"> | |
| 629 | + <Card className="p-6"> | |
| 622 | 630 | <div> |
| 623 | 631 | <div className="flex items-center justify-between gap-3"> |
| 624 | 632 | <div className="text-sm font-medium text-foreground">Discover</div> |
| 625 | − <button | |
| 626 | − type="button" | |
| 633 | + <Button | |
| 634 | + variant="ghost" | |
| 627 | 635 | onClick={() => setShowProbeAuth((current) => !current)} |
| 628 | 636 | className="text-xs font-medium text-muted-foreground transition-colors hover:text-foreground" |
| 629 | 637 | > |
| 630 | 638 | {showProbeAuth ? "Hide auth" : "Need auth?"} |
| 631 | − </button> | |
| 639 | + </Button> | |
| 632 | 640 | </div> |
| 633 | 641 | |
| 634 | 642 | <div className="mt-2 flex flex-col gap-3 sm:flex-row"> |
| 635 | − <input | |
| 643 | + <Input | |
| 636 | 644 | value={discoveryEndpoint} |
| 637 | 645 | onChange={(event) => setDiscoveryEndpoint(event.target.value)} |
| 638 | 646 | 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" | |
| 640 | 648 | /> |
| 641 | − <button | |
| 642 | − type="button" | |
| 649 | + <Button | |
| 650 | + variant="outline" | |
| 643 | 651 | onClick={() => { |
| 644 | 652 | void handleDiscover(); |
| 645 | 653 | }} |
| 646 | 654 | 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" | |
| 648 | 655 | > |
| 649 | 656 | {discoverMutation.status === "pending" |
| 650 | 657 | ? <IconSpinner className="size-3.5" /> |
| 651 | 658 | : <IconSearch className="size-3.5" />} |
| 652 | 659 | {discoverMutation.status === "pending" ? "Discovering..." : "Discover"} |
| 653 | − </button> | |
| 660 | + </Button> | |
| 654 | 661 | </div> |
| 655 | 662 | |
| 656 | 663 | {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 | |
| 661 | 668 | value={probeAuth.kind} |
| 662 | 669 | onChange={(event) => |
| 663 | 670 | setProbeAuth((current) => ({ |
| 664 | 671 | ...current, |
| 665 | 672 | kind: event.target.value as ProbeAuthState["kind"], |
| 666 | 673 | }))} |
| 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" | |
| 668 | 674 | > |
| 669 | 675 | <option value="none">None</option> |
| 670 | 676 | <option value="bearer">Bearer</option> |
| 671 | 677 | <option value="basic">Basic</option> |
| 672 | 678 | <option value="headers">Custom headers</option> |
| 673 | − </select> | |
| 674 | − </label> | |
| 679 | + </Select> | |
| 680 | + </div> | |
| 675 | 681 | |
| 676 | 682 | {probeAuth.kind === "bearer" && ( |
| 677 | 683 | <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 | |
| 681 | 687 | value={probeAuth.headerName} |
| 682 | 688 | onChange={(event) => |
| 683 | 689 | 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" | |
| 685 | 690 | /> |
| 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 | |
| 690 | 695 | value={probeAuth.prefix} |
| 691 | 696 | onChange={(event) => |
| 692 | 697 | 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" | |
| 694 | 698 | /> |
| 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 | |
| 699 | 703 | value={probeAuth.token} |
| 700 | 704 | onChange={(event) => |
| 701 | 705 | 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" | |
| 703 | 707 | /> |
| 704 | − </label> | |
| 708 | + </div> | |
| 705 | 709 | </div> |
| 706 | 710 | )} |
| 707 | 711 | |
| 708 | 712 | {probeAuth.kind === "basic" && ( |
| 709 | 713 | <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 | |
| 713 | 717 | value={probeAuth.username} |
| 714 | 718 | onChange={(event) => |
| 715 | 719 | 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" | |
| 717 | 720 | /> |
| 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 | |
| 722 | 725 | value={probeAuth.password} |
| 723 | 726 | onChange={(event) => |
| 724 | 727 | 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" | |
| 726 | 728 | type="password" |
| 727 | 729 | /> |
| 728 | − </label> | |
| 730 | + </div> | |
| 729 | 731 | </div> |
| 730 | 732 | )} |
| 731 | 733 | |
| 732 | 734 | {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 | |
| 736 | 738 | value={probeAuth.headersText} |
| 737 | 739 | onChange={(event) => |
| 738 | 740 | setProbeAuth((current) => ({ ...current, headersText: event.target.value }))} |
| 739 | 741 | rows={3} |
| 740 | 742 | 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" | |
| 742 | 743 | /> |
| 743 | − </label> | |
| 744 | + </div> | |
| 744 | 745 | )} |
| 745 | 746 | </div> |
| 746 | 747 | )} |
| @@ -751,22 +752,21 @@ function McpSourceForm(props: { · 4 unmodified lines | ||
| 751 | 752 | </div> |
| 752 | 753 | )} |
| 753 | 754 | </div> |
| 754 | − </div> | |
| 755 | + </Card> | |
| 755 | 756 | )} |
| 756 | 757 | |
| 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 | |
| 761 | 762 | value={name} |
| 762 | 763 | 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" | |
| 764 | 764 | /> |
| 765 | − </label> | |
| 765 | + </div> | |
| 766 | 766 | |
| 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 | |
| 770 | 770 | value={transportFields.transport} |
| 771 | 771 | onChange={(event) => { |
| 772 | 772 | const nextTransport = event.target.value as McpTransportValue; |
| @@ -779,34 +779,33 @@ function McpSourceForm(props: { · 6 unmodified lines | ||
| 779 | 779 | setOauthStatus("idle"); |
| 780 | 780 | } |
| 781 | 781 | }} |
| 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" | |
| 783 | 782 | > |
| 784 | 783 | <option value="">Auto (remote)</option> |
| 785 | 784 | <option value="auto">Auto</option> |
| 786 | 785 | <option value="streamable-http">Streamable HTTP</option> |
| 787 | 786 | <option value="sse">SSE</option> |
| 788 | 787 | <option value="stdio">stdio</option> |
| 789 | − </select> | |
| 790 | − </label> | |
| 788 | + </Select> | |
| 789 | + </div> | |
| 791 | 790 | |
| 792 | 791 | {isStdio ? ( |
| 793 | 792 | <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 | |
| 797 | 796 | value={transportFields.command} |
| 798 | 797 | onChange={(event) => |
| 799 | 798 | setTransportFields({ |
| 800 | 799 | ...transportFields, |
| 801 | 800 | command: event.target.value, |
| 802 | 801 | })} |
| 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" | |
| 804 | 803 | /> |
| 805 | − </label> | |
| 804 | + </div> | |
| 806 | 805 | |
| 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 | |
| 810 | 809 | value={transportFields.argsText} |
| 811 | 810 | onChange={(event) => |
| 812 | 811 | setTransportFields({ |
| @@ -815,13 +814,12 @@ function McpSourceForm(props: { · 2 unmodified lines | ||
| 815 | 814 | })} |
| 816 | 815 | rows={3} |
| 817 | 816 | 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" | |
| 819 | 817 | /> |
| 820 | − </label> | |
| 818 | + </div> | |
| 821 | 819 | |
| 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 | |
| 825 | 823 | value={transportFields.envText} |
| 826 | 824 | onChange={(event) => |
| 827 | 825 | setTransportFields({ |
| @@ -830,37 +828,36 @@ function McpSourceForm(props: { · 2 unmodified lines | ||
| 830 | 828 | })} |
| 831 | 829 | rows={3} |
| 832 | 830 | 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" | |
| 834 | 831 | /> |
| 835 | − </label> | |
| 832 | + </div> | |
| 836 | 833 | |
| 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 | |
| 840 | 837 | value={transportFields.cwd} |
| 841 | 838 | onChange={(event) => |
| 842 | 839 | setTransportFields({ |
| 843 | 840 | ...transportFields, |
| 844 | 841 | cwd: event.target.value, |
| 845 | 842 | })} |
| 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" | |
| 847 | 844 | /> |
| 848 | − </label> | |
| 845 | + </div> | |
| 849 | 846 | </div> |
| 850 | 847 | ) : ( |
| 851 | 848 | <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 | |
| 855 | 852 | value={endpoint} |
| 856 | 853 | 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" | |
| 858 | 855 | /> |
| 859 | − </label> | |
| 856 | + </div> | |
| 860 | 857 | |
| 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 | |
| 864 | 861 | value={transportFields.queryParamsText} |
| 865 | 862 | onChange={(event) => |
| 866 | 863 | setTransportFields({ |
| @@ -869,13 +866,12 @@ function McpSourceForm(props: { · 2 unmodified lines | ||
| 869 | 866 | })} |
| 870 | 867 | rows={3} |
| 871 | 868 | 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" | |
| 873 | 869 | /> |
| 874 | − </label> | |
| 870 | + </div> | |
| 875 | 871 | |
| 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 | |
| 879 | 875 | value={transportFields.headersText} |
| 880 | 876 | onChange={(event) => |
| 881 | 877 | setTransportFields({ |
| @@ -884,16 +880,15 @@ function McpSourceForm(props: { · 2 unmodified lines | ||
| 884 | 880 | })} |
| 885 | 881 | rows={3} |
| 886 | 882 | 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" | |
| 888 | 883 | /> |
| 889 | − </label> | |
| 884 | + </div> | |
| 890 | 885 | </div> |
| 891 | 886 | )} |
| 892 | 887 | |
| 893 | 888 | {!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 | |
| 897 | 892 | value={authKind} |
| 898 | 893 | onChange={(event) => { |
| 899 | 894 | const nextKind = event.target.value as McpConnectionAuth["kind"]; |
| @@ -903,16 +898,15 @@ function McpSourceForm(props: { · 3 unmodified lines | ||
| 903 | 898 | setOauthStatus("idle"); |
| 904 | 899 | } |
| 905 | 900 | }} |
| 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" | |
| 907 | 901 | > |
| 908 | 902 | <option value="none">None</option> |
| 909 | 903 | <option value="oauth2">OAuth 2.0</option> |
| 910 | − </select> | |
| 911 | − </label> | |
| 904 | + </Select> | |
| 905 | + </div> | |
| 912 | 906 | )} |
| 913 | 907 | |
| 914 | 908 | {!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"> | |
| 916 | 910 | <div className="flex flex-wrap items-center justify-between gap-3"> |
| 917 | 911 | <div> |
| 918 | 912 | <div className="text-sm font-medium text-foreground">OAuth</div> |
| @@ -920,8 +914,8 @@ function McpSourceForm(props: { · 1 unmodified line | ||
| 920 | 914 | Authenticate with the MCP server's built-in OAuth flow. |
| 921 | 915 | </div> |
| 922 | 916 | </div> |
| 923 | − <button | |
| 924 | − type="button" | |
| 917 | + <Button | |
| 918 | + variant="outline" | |
| 925 | 919 | onClick={() => { |
| 926 | 920 | setError(null); |
| 927 | 921 | setOauthStatus("pending"); |
| @@ -933,10 +927,9 @@ function McpSourceForm(props: { · 5 unmodified lines | ||
| 933 | 927 | ); |
| 934 | 928 | }); |
| 935 | 929 | }} |
| 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" | |
| 937 | 930 | > |
| 938 | 931 | {oauthStatus === "connected" ? "Reconnect OAuth" : "Connect OAuth"} |
| 939 | − </button> | |
| 932 | + </Button> | |
| 940 | 933 | </div> |
| 941 | 934 | {oauthStatus === "connected" && ( |
| 942 | 935 | <div className="mt-3 text-xs text-primary"> |
| @@ -947,14 +940,13 @@ function McpSourceForm(props: { · 4 unmodified lines | ||
| 947 | 940 | )} |
| 948 | 941 | |
| 949 | 942 | {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"> | |
| 951 | 944 | {error} |
| 952 | − </div> | |
| 945 | + </Alert> | |
| 953 | 946 | )} |
| 954 | 947 | |
| 955 | 948 | <div className="flex items-center justify-end gap-3"> |
| 956 | − <button | |
| 957 | − type="button" | |
| 949 | + <Button | |
| 958 | 950 | onClick={() => { |
| 959 | 951 | setError(null); |
| 960 | 952 | void submitMutation |
| @@ -964,7 +956,6 @@ function McpSourceForm(props: { · 3 unmodified lines | ||
| 964 | 956 | ); |
| 965 | 957 | }} |
| 966 | 958 | 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" | |
| 968 | 959 | > |
| 969 | 960 | {submitMutation.status === "pending" |
| 970 | 961 | ? props.mode === "create" |
| @@ -973,9 +964,9 @@ function McpSourceForm(props: { · 2 unmodified lines | ||
| 973 | 964 | : props.mode === "create" |
| 974 | 965 | ? "Create Source" |
| 975 | 966 | : "Save Changes"} |
| 976 | − </button> | |
| 977 | − </div> | |
| 967 | + </Button> | |
| 978 | 968 | </div> |
| 969 | + </Card> | |
| 979 | 970 | </div> |
| 980 | 971 | ); |
| 981 | 972 | } |
| @@ -1052,9 +1043,9 @@ export function McpEditPage(props: { · 70 unmodified lines | ||
| 1052 | 1043 | |
| 1053 | 1044 | if (Result.isFailure(configResult)) { |
| 1054 | 1045 | 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"> | |
| 1056 | 1047 | Failed loading source configuration. |
| 1057 | − </div> | |
| 1048 | + </Alert> | |
| 1058 | 1049 | ); |
| 1059 | 1050 | } |
| 1060 | 1051 | |
| @@ -1185,48 +1176,44 @@ export function McpDetailPage(props: { · 124 unmodified lines | ||
| 1185 | 1176 | summary={summary} |
| 1186 | 1177 | actions={( |
| 1187 | 1178 | <> |
| 1188 | − <button | |
| 1189 | − type="button" | |
| 1179 | + <Button | |
| 1180 | + variant="outline" | |
| 1190 | 1181 | onClick={() => |
| 1191 | 1182 | 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" | |
| 1193 | 1183 | > |
| 1194 | 1184 | <IconPencil className="size-3.5" /> |
| 1195 | 1185 | Edit |
| 1196 | − </button> | |
| 1186 | + </Button> | |
| 1197 | 1187 | {confirmDelete ? ( |
| 1198 | 1188 | <div className="flex items-center gap-2"> |
| 1199 | 1189 | <span className="text-xs font-medium text-destructive"> |
| 1200 | 1190 | Confirm delete? |
| 1201 | 1191 | </span> |
| 1202 | − <button | |
| 1203 | − type="button" | |
| 1192 | + <Button | |
| 1193 | + variant="outline" | |
| 1204 | 1194 | onClick={() => setConfirmDelete(false)} |
| 1205 | 1195 | 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" | |
| 1207 | 1196 | > |
| 1208 | 1197 | Cancel |
| 1209 | − </button> | |
| 1210 | − <button | |
| 1211 | − type="button" | |
| 1198 | + </Button> | |
| 1199 | + <Button | |
| 1200 | + variant="destructive-outline" | |
| 1212 | 1201 | onClick={() => { |
| 1213 | 1202 | void handleDelete().catch(() => {}); |
| 1214 | 1203 | }} |
| 1215 | 1204 | 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" | |
| 1217 | 1205 | > |
| 1218 | 1206 | {isDeleting ? "Deleting..." : "Delete"} |
| 1219 | − </button> | |
| 1207 | + </Button> | |
| 1220 | 1208 | </div> |
| 1221 | 1209 | ) : ( |
| 1222 | − <button | |
| 1223 | − type="button" | |
| 1210 | + <Button | |
| 1211 | + variant="destructive-outline" | |
| 1224 | 1212 | onClick={() => setConfirmDelete(true)} |
| 1225 | 1213 | 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" | |
| 1227 | 1214 | > |
| 1228 | 1215 | Delete |
| 1229 | − </button> | |
| 1216 | + </Button> | |
| 1230 | 1217 | )} |
| 1231 | 1218 | </> |
| 1232 | 1219 | )} |
| @@ -1,4 +1,4 @@ | ||
| 1 | −import { useEffect, useState, type ReactNode } from "react"; | |
| 1 | +import { useEffect, useState } from "react"; | |
| 2 | 2 | |
| 3 | 3 | import { |
| 4 | 4 | getExecutorApiBaseUrl, |
| @@ -8,6 +8,13 @@ import { · 3 unmodified lines | ||
| 8 | 8 | import type { |
| 9 | 9 | SecretStoreCreateFormProps, |
| 10 | 10 | } from "@executor/react/plugins"; |
| 11 | +import { | |
| 12 | + Alert, | |
| 13 | + Button, | |
| 14 | + Input, | |
| 15 | + Label, | |
| 16 | + Select, | |
| 17 | +} from "@executor/react/plugins"; | |
| 11 | 18 | import { |
| 12 | 19 | type OnePasswordDiscoverVaultsInput, |
| 13 | 20 | type OnePasswordDiscoverVaultsResult, |
| @@ -15,26 +22,6 @@ import { · 1 unmodified line | ||
| 15 | 22 | type OnePasswordVault, |
| 16 | 23 | } from "@executor/plugin-onepassword-shared"; |
| 17 | 24 | |
| 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 | −} | |
| 38 | 25 | |
| 39 | 26 | export function OnePasswordSecretStoreCreateForm( |
| 40 | 27 | props: SecretStoreCreateFormProps, |
| @@ -189,66 +176,66 @@ export function OnePasswordSecretStoreCreateForm( · 148 unmodified lines | ||
| 189 | 176 | return ( |
| 190 | 177 | <div className="space-y-4"> |
| 191 | 178 | {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"> | |
| 193 | 180 | {error} |
| 194 | − </div> | |
| 181 | + </Alert> | |
| 195 | 182 | )} |
| 196 | 183 | |
| 197 | − <FieldLabel label="Name"> | |
| 198 | − <input | |
| 184 | + <div className="grid gap-2"> | |
| 185 | + <Label>Name</Label> | |
| 186 | + <Input | |
| 199 | 187 | value={name} |
| 200 | 188 | onChange={(event) => setName(event.target.value)} |
| 201 | 189 | placeholder="Team 1Password" |
| 202 | − className={fieldClassName} | |
| 203 | 190 | autoFocus |
| 204 | 191 | /> |
| 205 | − </FieldLabel> | |
| 192 | + </div> | |
| 206 | 193 | |
| 207 | 194 | <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 | |
| 210 | 198 | value={authKind} |
| 211 | 199 | onChange={(event) => |
| 212 | 200 | setAuthKind(event.target.value as "desktop-app" | "service-account")} |
| 213 | − className={fieldClassName} | |
| 214 | 201 | > |
| 215 | 202 | <option value="desktop-app">Desktop app</option> |
| 216 | 203 | <option value="service-account">Service account</option> |
| 217 | − </select> | |
| 218 | − </FieldLabel> | |
| 204 | + </Select> | |
| 205 | + </div> | |
| 219 | 206 | <div className="flex items-end"> |
| 220 | − <button | |
| 207 | + <Button | |
| 208 | + variant="outline" | |
| 221 | 209 | type="button" |
| 222 | 210 | onClick={() => { |
| 223 | 211 | void handleDiscoverVaults(); |
| 224 | 212 | }} |
| 225 | 213 | disabled={discoverVaultsMutation.status === "pending"} |
| 226 | − className={buttonClassName} | |
| 227 | 214 | > |
| 228 | 215 | {discoverVaultsMutation.status === "pending" ? "Loading..." : "Load vaults"} |
| 229 | − </button> | |
| 216 | + </Button> | |
| 230 | 217 | </div> |
| 231 | 218 | </div> |
| 232 | 219 | |
| 233 | 220 | {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 | |
| 236 | 224 | value={accountName} |
| 237 | 225 | onChange={(event) => setAccountName(event.target.value)} |
| 238 | 226 | placeholder="my.1password.com" |
| 239 | − className={fieldClassName} | |
| 240 | 227 | /> |
| 241 | 228 | <div className="text-[11px] text-muted-foreground"> |
| 242 | 229 | Use the account shown in the 1Password desktop app sidebar or the |
| 243 | 230 | account UUID from <code>op account list --format json</code>. |
| 244 | 231 | </div> |
| 245 | − </FieldLabel> | |
| 232 | + </div> | |
| 246 | 233 | ) : ( |
| 247 | − <FieldLabel label="Service Account Token Secret"> | |
| 248 | − <select | |
| 234 | + <div className="grid gap-2"> | |
| 235 | + <Label>Service Account Token Secret</Label> | |
| 236 | + <Select | |
| 249 | 237 | value={tokenSecretId} |
| 250 | 238 | onChange={(event) => setTokenSecretId(event.target.value)} |
| 251 | − className={fieldClassName} | |
| 252 | 239 | > |
| 253 | 240 | <option value=""> |
| 254 | 241 | {props.secrets.status === "ready" |
| @@ -261,60 +248,60 @@ export function OnePasswordSecretStoreCreateForm( · 6 unmodified lines | ||
| 261 | 248 | {secret.name ?? secret.id} |
| 262 | 249 | </option> |
| 263 | 250 | ))} |
| 264 | − </select> | |
| 251 | + </Select> | |
| 265 | 252 | <div className="text-[11px] text-muted-foreground"> |
| 266 | 253 | Use this for remote or headless automation. Desktop app auth is better for |
| 267 | 254 | local Executor use. |
| 268 | 255 | </div> |
| 269 | − </FieldLabel> | |
| 256 | + </div> | |
| 270 | 257 | )} |
| 271 | 258 | |
| 272 | 259 | {discoveredVaults.length > 0 && ( |
| 273 | − <FieldLabel label="Discovered vaults"> | |
| 274 | − <select | |
| 260 | + <div className="grid gap-2"> | |
| 261 | + <Label>Discovered vaults</Label> | |
| 262 | + <Select | |
| 275 | 263 | value={vaultId} |
| 276 | 264 | onChange={(event) => setVaultId(event.target.value)} |
| 277 | − className={fieldClassName} | |
| 278 | 265 | > |
| 279 | 266 | {discoveredVaults.map((vault) => ( |
| 280 | 267 | <option key={vault.id} value={vault.id}> |
| 281 | 268 | {vault.name} |
| 282 | 269 | </option> |
| 283 | 270 | ))} |
| 284 | − </select> | |
| 271 | + </Select> | |
| 285 | 272 | <div className="text-[11px] text-muted-foreground"> |
| 286 | 273 | Pick from the vaults visible to this account, or override the id below. |
| 287 | 274 | </div> |
| 288 | − </FieldLabel> | |
| 275 | + </div> | |
| 289 | 276 | )} |
| 290 | 277 | |
| 291 | − <FieldLabel label="Vault ID"> | |
| 292 | − <input | |
| 278 | + <div className="grid gap-2"> | |
| 279 | + <Label>Vault ID</Label> | |
| 280 | + <Input | |
| 293 | 281 | value={vaultId} |
| 294 | 282 | onChange={(event) => setVaultId(event.target.value)} |
| 295 | 283 | placeholder="vlt_..." |
| 296 | − className={`${fieldClassName} font-mono text-[12px]`} | |
| 284 | + className="font-mono text-[12px]" | |
| 297 | 285 | /> |
| 298 | − </FieldLabel> | |
| 286 | + </div> | |
| 299 | 287 | |
| 300 | 288 | <div className="flex justify-end gap-2"> |
| 301 | − <button | |
| 289 | + <Button | |
| 290 | + variant="outline" | |
| 302 | 291 | type="button" |
| 303 | 292 | onClick={props.onCancel} |
| 304 | − className={buttonClassName} | |
| 305 | 293 | > |
| 306 | 294 | Cancel |
| 307 | − </button> | |
| 308 | − <button | |
| 295 | + </Button> | |
| 296 | + <Button | |
| 309 | 297 | type="button" |
| 310 | 298 | onClick={() => { |
| 311 | 299 | void handleSubmit(); |
| 312 | 300 | }} |
| 313 | 301 | disabled={props.isSubmitting} |
| 314 | − className={primaryButtonClassName} | |
| 315 | 302 | > |
| 316 | 303 | {props.isSubmitting ? "Creating..." : "Create store"} |
| 317 | − </button> | |
| 304 | + </Button> | |
| 318 | 305 | </div> |
| 319 | 306 | </div> |
| 320 | 307 | ); |
| @@ -13,8 +13,14 @@ import { · 12 unmodified lines | ||
| 13 | 13 | useWorkspaceRequestContext, |
| 14 | 14 | } from "@executor/react"; |
| 15 | 15 | import { |
| 16 | + Alert, | |
| 17 | + Button, | |
| 18 | + Card, | |
| 16 | 19 | DocumentPanel, |
| 17 | 20 | IconPencil, |
| 21 | + Input, | |
| 22 | + Label, | |
| 23 | + Select, | |
| 18 | 24 | SourceToolDetailPanel, |
| 19 | 25 | SourceToolExplorer, |
| 20 | 26 | parseSourceToolExplorerSearch, |
| @@ -381,63 +387,61 @@ function OpenApiSourceForm(props: { · 360 unmodified lines | ||
| 381 | 387 | }; |
| 382 | 388 | |
| 383 | 389 | return ( |
| 384 | − <div className="space-y-6 rounded-xl border border-border p-6"> | |
| 390 | + <Card className="space-y-6 p-6"> | |
| 385 | 391 | <Section title="Connection"> |
| 386 | 392 | <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 | |
| 390 | 396 | value={name} |
| 391 | 397 | onChange={(event) => { |
| 392 | 398 | setNameEdited(true); |
| 393 | 399 | setName(event.target.value); |
| 394 | 400 | }} |
| 395 | 401 | 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" | |
| 397 | 402 | /> |
| 398 | − </label> | |
| 403 | + </div> | |
| 399 | 404 | |
| 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 | |
| 403 | 408 | value={specUrl} |
| 404 | 409 | onChange={(event) => setSpecUrl(event.target.value)} |
| 405 | 410 | onBlur={() => { |
| 406 | 411 | void runPreview({ mode: "manual" }); |
| 407 | 412 | }} |
| 408 | 413 | 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" | |
| 410 | 415 | /> |
| 411 | − </label> | |
| 416 | + </div> | |
| 412 | 417 | |
| 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 | |
| 416 | 421 | value={baseUrl} |
| 417 | 422 | onChange={(event) => { |
| 418 | 423 | setBaseUrlEdited(true); |
| 419 | 424 | setBaseUrl(event.target.value); |
| 420 | 425 | }} |
| 421 | 426 | 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" | |
| 423 | 428 | /> |
| 424 | − </label> | |
| 429 | + </div> | |
| 425 | 430 | |
| 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 | |
| 429 | 434 | value={authKind} |
| 430 | 435 | onChange={(event) => |
| 431 | 436 | 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" | |
| 433 | 437 | > |
| 434 | 438 | <option value="none">None</option> |
| 435 | 439 | <option value="bearer">Bearer Secret</option> |
| 436 | − </select> | |
| 437 | − </label> | |
| 440 | + </Select> | |
| 441 | + </div> | |
| 438 | 442 | |
| 439 | 443 | {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"> | |
| 441 | 445 | <SecretReferenceField |
| 442 | 446 | label="Secret" |
| 443 | 447 | value={tokenSecretRef} |
| @@ -448,25 +452,25 @@ function OpenApiSourceForm(props: { · 4 unmodified lines | ||
| 448 | 452 | /> |
| 449 | 453 | |
| 450 | 454 | <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 | |
| 454 | 458 | value={authHeaderName} |
| 455 | 459 | onChange={(event) => setAuthHeaderName(event.target.value)} |
| 456 | 460 | 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" | |
| 458 | 462 | /> |
| 459 | − </label> | |
| 463 | + </div> | |
| 460 | 464 | |
| 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 | |
| 464 | 468 | value={authPrefix} |
| 465 | 469 | onChange={(event) => setAuthPrefix(event.target.value)} |
| 466 | 470 | 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" | |
| 468 | 472 | /> |
| 469 | − </label> | |
| 473 | + </div> | |
| 470 | 474 | </div> |
| 471 | 475 | </div> |
| 472 | 476 | )} |
| @@ -475,16 +479,16 @@ function OpenApiSourceForm(props: { · 2 unmodified lines | ||
| 475 | 479 | |
| 476 | 480 | <Section title="Preview"> |
| 477 | 481 | <div className="flex items-center gap-3"> |
| 478 | − <button | |
| 482 | + <Button | |
| 483 | + variant="outline" | |
| 479 | 484 | type="button" |
| 480 | 485 | onClick={() => { |
| 481 | 486 | void runPreview({ mode: "manual" }); |
| 482 | 487 | }} |
| 483 | 488 | 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" | |
| 485 | 489 | > |
| 486 | 490 | {previewMutation.status === "pending" ? "Previewing..." : "Preview Spec"} |
| 487 | − </button> | |
| 491 | + </Button> | |
| 488 | 492 | {preview && ( |
| 489 | 493 | <div className="text-xs text-muted-foreground"> |
| 490 | 494 | {preview.operationCount} operations |
| @@ -519,33 +523,32 @@ function OpenApiSourceForm(props: { · 28 unmodified lines | ||
| 519 | 523 | )} |
| 520 | 524 | </dl> |
| 521 | 525 | {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"> | |
| 523 | 527 | {preview.warnings.join(" ")} |
| 524 | − </div> | |
| 528 | + </Alert> | |
| 525 | 529 | )} |
| 526 | 530 | </div> |
| 527 | 531 | )} |
| 528 | 532 | </Section> |
| 529 | 533 | |
| 530 | 534 | {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"> | |
| 532 | 536 | {error} |
| 533 | − </div> | |
| 537 | + </Alert> | |
| 534 | 538 | )} |
| 535 | 539 | |
| 536 | 540 | <div className="flex items-center justify-end"> |
| 537 | − <button | |
| 541 | + <Button | |
| 538 | 542 | type="button" |
| 539 | 543 | onClick={() => { |
| 540 | 544 | void handleSubmit(); |
| 541 | 545 | }} |
| 542 | 546 | 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" | |
| 544 | 547 | > |
| 545 | 548 | {submitMutation.status === "pending" ? props.busyLabel : props.submitLabel} |
| 546 | − </button> | |
| 549 | + </Button> | |
| 547 | 550 | </div> |
| 548 | − </div> | |
| 551 | + </Card> | |
| 549 | 552 | ); |
| 550 | 553 | } |
| 551 | 554 | |
| @@ -641,9 +644,9 @@ function OpenApiEditSourcePageReady(props: { · 89 unmodified lines | ||
| 641 | 644 | if (Result.isFailure(configResult)) { |
| 642 | 645 | return ( |
| 643 | 646 | <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"> | |
| 645 | 648 | Failed loading source configuration. |
| 646 | − </div> | |
| 649 | + </Alert> | |
| 647 | 650 | </Section> |
| 648 | 651 | ); |
| 649 | 652 | } |
| @@ -778,38 +781,43 @@ function OpenApiSourceDetailPageReady(props: { · 128 unmodified lines | ||
| 778 | 781 | })} |
| 779 | 782 | actions={( |
| 780 | 783 | <> |
| 781 | − <button | |
| 784 | + <Button | |
| 785 | + variant="outline" | |
| 786 | + size="sm" | |
| 782 | 787 | type="button" |
| 783 | 788 | onClick={() => { |
| 784 | 789 | void refreshMutation.mutateAsync(props.source.id); |
| 785 | 790 | }} |
| 786 | 791 | 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" | |
| 788 | 792 | > |
| 789 | 793 | {refreshMutation.status === "pending" ? "Refreshing..." : "Refresh"} |
| 790 | − </button> | |
| 791 | − <button | |
| 794 | + </Button> | |
| 795 | + <Button | |
| 796 | + variant="outline" | |
| 797 | + size="sm" | |
| 792 | 798 | type="button" |
| 793 | 799 | 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" | |
| 795 | 800 | > |
| 796 | 801 | <IconPencil className="size-3" /> |
| 797 | 802 | Edit |
| 798 | − </button> | |
| 803 | + </Button> | |
| 799 | 804 | {confirmDelete ? ( |
| 800 | 805 | <div className="flex items-center gap-2"> |
| 801 | 806 | <span className="text-[11px] font-medium text-destructive"> |
| 802 | 807 | Confirm delete? |
| 803 | 808 | </span> |
| 804 | − <button | |
| 809 | + <Button | |
| 810 | + variant="outline" | |
| 811 | + size="sm" | |
| 805 | 812 | type="button" |
| 806 | 813 | onClick={() => setConfirmDelete(false)} |
| 807 | 814 | 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" | |
| 809 | 815 | > |
| 810 | 816 | Cancel |
| 811 | − </button> | |
| 812 | − <button | |
| 817 | + </Button> | |
| 818 | + <Button | |
| 819 | + variant="destructive-outline" | |
| 820 | + size="sm" | |
| 813 | 821 | type="button" |
| 814 | 822 | onClick={() => { |
| 815 | 823 | void removeMutation.mutateAsync(props.source.id).then(() => { |
| @@ -821,20 +829,20 @@ function OpenApiSourceDetailPageReady(props: { · 5 unmodified lines | ||
| 821 | 829 | }); |
| 822 | 830 | }} |
| 823 | 831 | 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" | |
| 825 | 832 | > |
| 826 | 833 | {removeMutation.status === "pending" ? "Deleting..." : "Delete"} |
| 827 | − </button> | |
| 834 | + </Button> | |
| 828 | 835 | </div> |
| 829 | 836 | ) : ( |
| 830 | − <button | |
| 837 | + <Button | |
| 838 | + variant="destructive-outline" | |
| 839 | + size="sm" | |
| 831 | 840 | type="button" |
| 832 | 841 | onClick={() => setConfirmDelete(true)} |
| 833 | 842 | 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" | |
| 835 | 843 | > |
| 836 | 844 | Delete |
| 837 | − </button> | |
| 845 | + </Button> | |
| 838 | 846 | )} |
| 839 | 847 | </> |
| 840 | 848 | )} |