diff --git a/frontend/DESIGN.md b/frontend/DESIGN.md
index 3584eab5..f45d45b1 100644
--- a/frontend/DESIGN.md
+++ b/frontend/DESIGN.md
@@ -91,6 +91,8 @@ One tint scale, by purpose:
- Neutral hover: solid `bg-accent` in both themes (ghost buttons, combobox,
SelectTrigger, Card `interactive`, Dropzone, every list-row highlight).
- Quiet panel inside a page or card: `bg-muted`, not `bg-muted/40` or `/60`.
+ It is a small box inside a panel (a well, a guardrail stage), never a
+ page-sized panel around cards (see Card surfaces).
- Dividers: `border-border`, not `border-border/60`.
Patterns:
@@ -242,10 +244,11 @@ rounded-3xl`) are `variant="sidebar-item"`: left-aligned, full-radius, normal
justify-start` and `aria-expanded`: a lucide `ChevronRight` first
(`rotate-90` while open) in primary, then the foreground title, with a
primary underline on hover. The button draws no focus ring; the panel does,
- so keyboard focus outlines the whole white block:
- `has-[[data-variant=section-toggle]:focus-visible]:ring-3 …:ring-ring/50
-…:ring-inset` on the panel `
` (inset, because a scrolling column clips
- an outset ring). Status badges go beside the button, not inside it, or the
+ so keyboard focus outlines the whole panel. The panel is a `Card` (a place,
+ `subtle lg`), and every Card carries that ring
+ (`has-[[data-variant=section-toggle]:focus-visible]:ring-3 … ring-inset`,
+ inset because a scrolling column clips an outset ring), so pages pass
+ nothing for it. Status badges go beside the button, not inside it, or the
hover underline runs under them.
- Drop `text-white` on default and destructive buttons; the foreground token
already provides it. Drop `disabled:cursor-not-allowed` on buttons; the
@@ -267,28 +270,68 @@ justify-start` and `aria-expanded`: a lucide `ChevronRight` first
### Card (`ui/card.tsx`)
-| Prop | Values |
-| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `variant` | `outline` (border + card surface, the default), `filled` (muted fill, no border, for tiles on a card-coloured page), `subtle` (border on the page background) |
-| `tone` | `default`, `destructive` (the status soft fill and border, `border-destructive/50 bg-destructive/10`, over any variant) |
-| `padding` | `none`, `sm` (p-3, row boxes and code blocks), `default` (p-4), `lg` (p-6, tiles, chart panels and stat tiles) |
-| `interactive` | whole card is the target: hover, focus ring and `selected` highlight; pair with `asChild` around a `