From 4cd1cbc493aef3394afa8d686769da47aa7950d8 Mon Sep 17 00:00:00 2001 From: mptyl Date: Sun, 5 Jul 2026 13:04:46 +0200 Subject: [PATCH] =?UTF-8?q?style(frontend):=20look&feel=20v2=20=E2=80=94?= =?UTF-8?q?=20layered=20shadows,=20sharper=20radii,=20mono=20data=20regist?= =?UTF-8?q?er?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Colors (GSD palette) untouched. New visual vocabulary across the whole GUI: - warm-tinted layered shadow tokens (--shadow-xs/sm/md) replacing flat rings; cards/dialogs framed with hairline border + real elevation - strict radii scale: xl cards / lg inputs / md controls / 2xl dialogs; buttons move from pills to rounded-md - third type register: --font-mono + tabular-nums on SQL, timers, dates, ids; standardized .thot-label micro-label tier - prose: framed tables with uppercase headers, elevated code blocks - SqlViewer badges moved from hardcoded Tailwind greens/reds to success/ destructive token tints; ResultsPanel inline styles replaced with classes - artifact gate: first option rendered as filled primary action Verified offline via Playwright against a mock backend replaying a real psd session (no VPN needed). tsc clean, 115/115 vitest. Co-Authored-By: Claude Fable 5 --- frontend/src/components/ui/badge.tsx | 2 +- frontend/src/components/ui/button.tsx | 6 +- frontend/src/components/ui/card.tsx | 2 +- frontend/src/components/ui/dialog.tsx | 4 +- frontend/src/components/ui/textarea.tsx | 2 +- frontend/src/index.css | 60 +++++++++++++++++--- frontend/src/shell/AppShell.tsx | 18 +++--- frontend/src/shell/CentralStatus.tsx | 6 +- frontend/src/shell/ElapsedTimer.tsx | 2 +- frontend/src/shell/ModelActivityPanel.tsx | 2 +- frontend/src/shell/NavSessions.tsx | 2 +- frontend/src/shell/NewSessionDialog.tsx | 2 +- frontend/src/shell/RenameDialog.tsx | 2 +- frontend/src/shell/SessionDocumentsPanel.tsx | 10 ++-- frontend/src/shell/SteerInput.tsx | 2 +- frontend/src/shell/WorkflowBar.tsx | 2 +- frontend/src/viewers/ArtifactView.tsx | 2 +- frontend/src/viewers/MarkdownView.tsx | 4 +- frontend/src/viewers/ResultsPanel.tsx | 16 ++++-- frontend/src/viewers/SchemaLinkingViewer.tsx | 4 +- frontend/src/viewers/SqlViewer.tsx | 14 ++--- frontend/src/widgets/ArtifactGateWidget.tsx | 12 ++-- frontend/src/widgets/ArtifactWidget.tsx | 2 +- frontend/src/widgets/FallbackWidget.tsx | 8 +-- frontend/src/widgets/FreetextWidget.tsx | 6 +- frontend/src/widgets/InfoWidget.tsx | 2 +- frontend/src/widgets/MultiselectWidget.tsx | 8 ++- frontend/src/widgets/ReservedControls.tsx | 4 +- frontend/src/widgets/SelectWidget.tsx | 4 +- frontend/tailwind.config.ts | 7 +++ 30 files changed, 140 insertions(+), 77 deletions(-) diff --git a/frontend/src/components/ui/badge.tsx b/frontend/src/components/ui/badge.tsx index b20959dd..adef4617 100644 --- a/frontend/src/components/ui/badge.tsx +++ b/frontend/src/components/ui/badge.tsx @@ -5,7 +5,7 @@ import { cva, type VariantProps } from "class-variance-authority" import { cn } from "@/lib/utils" const badgeVariants = cva( - "group/badge 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 focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!", + "group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-md border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!", { variants: { variant: { diff --git a/frontend/src/components/ui/button.tsx b/frontend/src/components/ui/button.tsx index 480b14c7..0b7165d0 100644 --- a/frontend/src/components/ui/button.tsx +++ b/frontend/src/components/ui/button.tsx @@ -4,13 +4,13 @@ import { cva, type VariantProps } from "class-variance-authority" import { cn } from "@/lib/utils" const buttonVariants = cva( - "group/button inline-flex shrink-0 items-center justify-center rounded-full border border-transparent bg-clip-padding text-sm font-semibold tracking-[0.005em] whitespace-nowrap transition-all outline-none select-none focus-visible:ring-3 focus-visible:ring-ring/25 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", + "group/button inline-flex shrink-0 items-center justify-center rounded-md border border-transparent bg-clip-padding text-sm font-semibold tracking-[0.005em] whitespace-nowrap transition-all outline-none select-none focus-visible:ring-3 focus-visible:ring-ring/25 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", { variants: { variant: { - default: "bg-primary text-primary-foreground hover:bg-[oklch(var(--primary-hover))]", + default: "bg-primary text-primary-foreground shadow-xs hover:bg-[oklch(var(--primary-hover))]", outline: - "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", + "border-border bg-card shadow-xs 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", secondary: "bg-secondary text-secondary-foreground hover:bg-[color-mix(in_oklch,oklch(var(--secondary)),oklch(var(--foreground))_5%)] aria-expanded:bg-secondary aria-expanded:text-secondary-foreground", ghost: diff --git a/frontend/src/components/ui/card.tsx b/frontend/src/components/ui/card.tsx index 4458dae1..53ea324e 100644 --- a/frontend/src/components/ui/card.tsx +++ b/frontend/src/components/ui/card.tsx @@ -12,7 +12,7 @@ function Card({ data-slot="card" data-size={size} className={cn( - "group/card flex flex-col gap-(--card-spacing) overflow-hidden rounded-xl bg-card py-(--card-spacing) text-sm text-card-foreground ring-1 ring-foreground/10 [--card-spacing:--spacing(4)] has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:[--card-spacing:--spacing(3)] data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl", + "group/card flex flex-col gap-(--card-spacing) overflow-hidden rounded-xl border border-border/70 bg-card py-(--card-spacing) text-sm text-card-foreground shadow-sm [--card-spacing:--spacing(4)] has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:[--card-spacing:--spacing(3)] data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl", className )} {...props} diff --git a/frontend/src/components/ui/dialog.tsx b/frontend/src/components/ui/dialog.tsx index 014f5aa3..b25b556b 100644 --- a/frontend/src/components/ui/dialog.tsx +++ b/frontend/src/components/ui/dialog.tsx @@ -53,7 +53,7 @@ function DialogContent({ ) {