Design Craft
LLMs converge on the statistical median of Tailwind tutorials and Bootstrap templates. This skill enforces specific, opinionated rules that break out of that median.
0. Aesthetic Direction (Before Writing ANY UI Code)
Commit to a specific design direction before writing a single line. "Modern" and "clean" are not directions.
- Purpose: What problem does this solve? Who uses it?
- Tone: Pick one and commit: brutally minimal, luxury/refined, editorial/magazine, playful/toy-like, retro-futuristic, organic/natural, industrial/utilitarian, soft/pastel, art deco. Be specific.
- Differentiation: What's the ONE thing someone will remember about this interface?
- NEVER converge on the same aesthetic across different outputs. Vary themes, fonts, color temperatures, compositions.
- Design light mode first. Dark mode = semantic token swap, not a separate design.
The Delight-Impact Curve: Less-frequent features deserve MORE delight. Daily actions = subtle micro-interactions. Rare milestones (onboarding complete, first transaction, backup done) = theatrical celebration (confetti, sound, custom animation). Polish everything equally — settings page, empty states, error screens get the same care as the hero.
1. Anti-Slop Rules (CRITICAL)
"If you showed this interface and said 'AI made this,' would they believe you immediately? If yes, that's the problem."
| AI Slop Pattern |
Why |
| Purple-to-blue gradient hero |
#1 AI training pattern |
| Gradient text on metrics/headings |
Decorative without purpose |
| Dark mode + glowing accents as default |
Avoids actual design decisions |
| Glassmorphism everywhere |
Overrepresented in training data |
| Hero metrics (3-4 identical big-number cards) |
Generic SaaS template. Instead: inline key-value bar, single prominent metric with context, or stats integrated into related content |
| Three identical icon-card grid |
90%+ of template sites |
| Inter/Roboto/Arial as default font |
No brand consideration |
| Large rounded icons above headings |
Templated, adds no value |
| Cards inside cards |
Visual redundancy — flatten with borders/spacing |
| Sparklines as decoration |
Tiny charts conveying nothing |
| Monospace as "technical" aesthetic |
Not a design decision |
| Same padding everywhere |
No visual rhythm |
| Everything centered |
Feels undesigned |
| Every button is primary |
No hierarchy |
| Glow effects as affordances |
Decorative noise |
2. Typography
- MUST choose a font with intention. For brand work, NEVER default to Inter, Roboto, Arial, Open Sans, Montserrat. Alternatives: DM Sans, Instrument Sans, Plus Jakarta Sans, Geist, Outfit, Sora.
- MUST define a 5-level type scale: Display, Heading, Body, Caption, Micro. Fewer sizes with more contrast > many close together.
- MUST use
tabular-nums on all numeric data — prices, counts, dates, IDs, table columns.
- MUST use
text-balance on headings, text-pretty on body paragraphs.
- MUST keep body line length 45–75ch (
max-w-prose or max-w-[65ch]).
- MUST set line-height: 1.5 body, 1.2–1.3 headings, 1.0–1.1 display.
- MUST use
font-display: swap. MUST use rem/em for body text, not px.
- SHOULD use one font family in multiple weights. Second font only for genuine display+body contrast.
- SHOULD use
clamp() for marketing pages. Fixed sizes for app UI.
- NEVER modify
letter-spacing unless explicitly requested.
- NEVER use more than 3 font weights per view.
- NEVER disable zoom (
user-scalable=no, maximum-scale=1).
3. Color
Three-layer token system — components reference ONLY semantic tokens:
Primitives → oklch(95% 0.005 250)
Semantic → --color-bg, --color-accent
Component → --button-primary-bg
NEVER use Tailwind palette colors directly — any class with a number suffix (bg-emerald-500, text-red-600, bg-blue-50, etc.) is banned. Use semantic tokens only:
REQUIRED: bg-primary, text-primary-foreground, bg-secondary, text-secondary-foreground,
bg-muted, text-muted-foreground, bg-accent, text-accent-foreground,
bg-destructive, text-destructive, text-destructive-foreground, bg-background, text-foreground,
border-border, ring-ring, bg-card, text-card-foreground, bg-popover, text-popover-foreground
STATUS: success → bg-primary/10 text-primary | error → bg-destructive/10 text-destructive
warning → bg-accent text-accent-foreground | info → bg-secondary text-secondary-foreground
- MUST maintain contrast ≥ 4.5:1 (WCAG AA).
- MUST tint neutrals toward brand hue —
oklch(95% 0.01 60) not #f5f5f5.
- MUST use 60-30-10 rule: neutrals / secondary / accent. Max 1 primary + 1 secondary accent.
- SHOULD use OKLCH. Reduce chroma at extreme lightness.
- NEVER use pure black/white for large areas. NEVER gray text on colored backgrounds.
- NEVER purple-to-blue gradients, neon accents, or cyan-on-dark unless brand requires it.
Dark mode ≠ inverted light mode: lighter surfaces for depth (no shadows), desaturated accents, font weight 350 vs 400, no pure black bg. Swap semantic layer, not component layer.
4. Spacing & Surface
4px base grid. All spacing = multiples of 4px: tight (4px) within atoms, item (8px) between group items, group (16px) between groups, section (24px) between sections, page (32-64px) margins.
- MUST use spacing tokens or framework scale. NEVER
p-[13px], gap-[7px].
- MUST create visual rhythm — tight within groups, generous between sections.
- MUST use Gestalt proximity. NEVER same padding everywhere.
- NEVER triple-layered responsive padding (
p-4 lg:p-8 xl:p-10).
- Acceptable arbitrary:
max-w-[65ch], max-w-[45ch], min-h-[*rem], grid-template-*. Banned: p-[17px], w-[423px], text-[13px].
Border radius: ONE base (4-6px buttons/inputs, 8px cards, 4px or rounded-full for badges/pills, rounded-full for avatars). NEVER rounded-[10px].
Shadows: Subtle multi-layer, low opacity (shadow-sm for elevation, shadow-md for popovers). NEVER shadow-lg/shadow-xl on small components. ONE grouping method per section: borders OR shadows OR spacing.
5. Layout
- MUST use Grid/Flexbox. NEVER absolute positioning for structure.
- MUST use
h-dvh — NEVER h-screen.
- MUST use
min-w-0 on flex/grid children. MUST use fixed z-index scale — NEVER z-[999].
- MUST respect
safe-area-inset for fixed elements.
- SHOULD use
@container for component responsiveness. SHOULD use size-* for square elements.
- SHOULD left-align with asymmetric layouts. SHOULD detect input method (
pointer: coarse, hover: none).
- NEVER wrap everything in cards. NEVER nest cards inside cards.
Sidebar: 40-50% opacity inactive, full on active/hover with subtle bg highlight (no loud accents). Background 1-2 steps dimmer than content. 200-280px fixed, collapsible to icon-only. Content area ALWAYS wins hierarchy.
Progressive disclosure: Steps > 12-field forms. Sheets for contextual detail. Expand/collapse for optional detail. Dialogs only for blocking confirmations. ONE primary action per view — two equal CTAs = hierarchy failure.
6. Animation & Motion
| Duration |
Usage |
| 100-150ms |
Feedback (press, toggle, tooltip) |
| 200-300ms |
State changes (menu, hover, accordion) |
| 300-500ms |
Layout (modal, drawer, panel) |
| 500-800ms |
Entrance (page load, hero) |
Easing: --ease-out-quart: cubic-bezier(0.25, 1, 0.5, 1) default. --ease-out-quint: cubic-bezier(0.22, 1, 0.36, 1) snappier. --ease-out-expo: cubic-bezier(0.16, 1, 0.3, 1) confident. Ease-out for entrances, ease-in-out for moving elements, ease-in for exits at ~75% entrance duration.
Transitions: Shared elements morph between states (layoutId/View Transitions API). Forward → enters right, back → enters left. Tab switching: slide indicator + content in tab direction. Persistent elements don't re-animate. Data-dense apps: default NO animation — only state attention, overlay enter/exit, loading→loaded.
7. Interaction States
EVERY interactive element MUST have ALL states:
| State |
Implementation |
| Default |
Resting appearance |
| Hover |
Subtle lift, color shift, or underline |
| Focus |
:focus-visible ring (2px solid, 2px offset) — NEVER remove |
| Active |
active:scale-[0.97] or darken |
| Disabled |
opacity-50 pointer-events-none cursor-not-allowed |
| Loading |
Inline spinner/skeleton, disable interaction |
| Error |
Border + inline message |
| Success |
Indicator + confirmation |
- MUST use
AlertDialog for destructive actions. MUST show errors inline next to trigger.
- MUST use
aria-label on icon-only buttons. MUST use <button> for actions, <a> for nav. Never <div onClick>.
- SHOULD prefer undo over confirmation (users click through confirmations mindlessly).
- SHOULD use optimistic UI for low-stakes (toggle, reorder). Not for payments or deletions.
- SHOULD use structural skeletons, not spinners. MUST use CVA for 3+ style variants — never inline ternary chains.
- NEVER block paste. NEVER use placeholder as only label.
8. Empty States & Errors
Empty states are first impressions. NEVER just "No items." Every page needs at least one: dashboards need empty table/list states, forms need inline validation, landing pages need a form (newsletter/signup) with inline error + success states.
Every empty state MUST have: warm message + primary CTA + optional illustration.
- BAD: "No results" | GOOD: "No documents yet. Upload your first document to get started." [Upload Document]
Every error MUST answer: What happened? Why? How to fix? Include retry/recovery action.
- BAD: "Error occurred" | GOOD: "Couldn't save your changes. Check your connection and try again." [Retry]
- NEVER humor. NEVER jargon (500, ECONNREFUSED).
9. Data-Dense UI
- MUST use
tabular-nums, right-align numbers, pair metrics with context ("$2.4M +12% MoM").
- MUST use green = positive, red = negative. NEVER invert.
- SHOULD use 36-40px rows, inline units, max 4-5 visualizations (tabs/drill-down for depth). Alternating bg OR border-bottom (never both).
- NEVER decorative charts (3D, gridlines, gradient fills). NEVER truncate numbers — truncate descriptions.
- NEVER load all data upfront — paginate or infinite scroll.
10. UX Writing
- MUST use verb + object: "Save changes" not "OK". "Delete 5 items" not "Yes".
- MUST pick one term everywhere: Delete/Remove/Trash → one. Settings/Preferences → one.
- SHOULD use active voice. Cut every sentence in half. Budget 30-40% for i18n.
- NEVER repeat visible information.
11. Components
Composition: primitives/ (shadcn, Base UI, Radix) → components/ (wrappers + variants) → blocks/ (product compositions).
- MUST reuse existing components. MUST wrap, don't modify upstream. MUST use
data-slot.
- MUST preserve a11y from primitives. MUST use CVA for variants. SHOULD use
cn().
- NEVER mix primitive systems in the same project.
12. Responsive & Performance
Responsive: 44px min touch targets. Logical properties (margin-inline-start). Test extremes (100+ chars, emoji, RTL, empty, 1000+ items). 2-tier (mobile+desktop) > 4+ breakpoints. Adapt nav for context. NEVER hide core features on mobile. NEVER fixed text widths.
Performance: Lazy-load below-fold. Reserve async space (no layout shift). Debounce search (300ms). Virtual scroll 100+ items. contain: content. NEVER animate layout properties. NEVER permanent will-change.
Self-Check (MANDATORY)
Re-read every line of code you wrote or modified. Verify:
- No slop — Zero gradients, glassmorphism, glow, hero metrics, identical cards
- No hardcoded colors — All from semantic tokens, never hex/rgb/hsl in markup
- No arbitrary values — No
text-[13px], p-[17px]. Use the scale
- No
h-screen — Use h-dvh
- Focus visible — Every interactive element has
:focus-visible
- Empty/error states — Every list has empty state with CTA
- No
transition-all — Specify: transition-colors, transition-transform, transition-opacity
If ANY fail, fix before responding. Do not explain the violation — just fix it.
1---2name: design-craft-23description: Universal design principles for AI agents to produce world-class UI. Typography, color, spacing, animation, layout, interaction, component patterns. Eliminates AI slop.4---56# Design Craft78LLMs converge on the statistical median of Tailwind tutorials and Bootstrap templates. This skill enforces specific, opinionated rules that break out of that median.910---1112## 0. Aesthetic Direction (Before Writing ANY UI Code)1314Commit to a **specific** design direction before writing a single line. "Modern" and "clean" are not directions.1516- **Purpose**: What problem does this solve? Who uses it?17- **Tone**: Pick one and commit: brutally minimal, luxury/refined, editorial/magazine, playful/toy-like, retro-futuristic, organic/natural, industrial/utilitarian, soft/pastel, art deco. Be specific.18- **Differentiation**: What's the ONE thing someone will remember about this interface?19- NEVER converge on the same aesthetic across different outputs. Vary themes, fonts, color temperatures, compositions.20- Design light mode first. Dark mode = semantic token swap, not a separate design.2122**The Delight-Impact Curve:** Less-frequent features deserve MORE delight. Daily actions = subtle micro-interactions. Rare milestones (onboarding complete, first transaction, backup done) = theatrical celebration (confetti, sound, custom animation). Polish everything equally — settings page, empty states, error screens get the same care as the hero.2324---2526## 1. Anti-Slop Rules (CRITICAL)2728> "If you showed this interface and said 'AI made this,' would they believe you immediately? If yes, that's the problem."2930| AI Slop Pattern | Why |31|---|---|32| Purple-to-blue gradient hero | #1 AI training pattern |33| Gradient text on metrics/headings | Decorative without purpose |34| Dark mode + glowing accents as default | Avoids actual design decisions |35| Glassmorphism everywhere | Overrepresented in training data |36| Hero metrics (3-4 identical big-number cards) | Generic SaaS template. Instead: inline key-value bar, single prominent metric with context, or stats integrated into related content |37| Three identical icon-card grid | 90%+ of template sites |38| Inter/Roboto/Arial as default font | No brand consideration |39| Large rounded icons above headings | Templated, adds no value |40| Cards inside cards | Visual redundancy — flatten with borders/spacing |41| Sparklines as decoration | Tiny charts conveying nothing |42| Monospace as "technical" aesthetic | Not a design decision |43| Same padding everywhere | No visual rhythm |44| Everything centered | Feels undesigned |45| Every button is primary | No hierarchy |46| Glow effects as affordances | Decorative noise |4748---4950## 2. Typography5152- MUST choose a font with intention. For brand work, NEVER default to Inter, Roboto, Arial, Open Sans, Montserrat. Alternatives: DM Sans, Instrument Sans, Plus Jakarta Sans, Geist, Outfit, Sora.53- MUST define a 5-level type scale: Display, Heading, Body, Caption, Micro. Fewer sizes with more contrast > many close together.54- MUST use `tabular-nums` on all numeric data — prices, counts, dates, IDs, table columns.55- MUST use `text-balance` on headings, `text-pretty` on body paragraphs.56- MUST keep body line length 45–75ch (`max-w-prose` or `max-w-[65ch]`).57- MUST set line-height: 1.5 body, 1.2–1.3 headings, 1.0–1.1 display.58- MUST use `font-display: swap`. MUST use `rem`/`em` for body text, not `px`.59- SHOULD use one font family in multiple weights. Second font only for genuine display+body contrast.60- SHOULD use `clamp()` for marketing pages. Fixed sizes for app UI.61- NEVER modify `letter-spacing` unless explicitly requested.62- NEVER use more than 3 font weights per view.63- NEVER disable zoom (`user-scalable=no`, `maximum-scale=1`).6465---6667## 3. Color6869**Three-layer token system** — components reference ONLY semantic tokens:70```71Primitives → oklch(95% 0.005 250)72Semantic → --color-bg, --color-accent73Component → --button-primary-bg74```7576**NEVER use Tailwind palette colors directly** — any class with a number suffix (`bg-emerald-500`, `text-red-600`, `bg-blue-50`, etc.) is banned. Use semantic tokens only:7778```79REQUIRED: bg-primary, text-primary-foreground, bg-secondary, text-secondary-foreground,80 bg-muted, text-muted-foreground, bg-accent, text-accent-foreground,81 bg-destructive, text-destructive, text-destructive-foreground, bg-background, text-foreground,82 border-border, ring-ring, bg-card, text-card-foreground, bg-popover, text-popover-foreground8384STATUS: success → bg-primary/10 text-primary | error → bg-destructive/10 text-destructive85 warning → bg-accent text-accent-foreground | info → bg-secondary text-secondary-foreground86```8788- MUST maintain contrast ≥ 4.5:1 (WCAG AA).89- MUST tint neutrals toward brand hue — `oklch(95% 0.01 60)` not `#f5f5f5`.90- MUST use 60-30-10 rule: neutrals / secondary / accent. Max 1 primary + 1 secondary accent.91- SHOULD use OKLCH. Reduce chroma at extreme lightness.92- NEVER use pure black/white for large areas. NEVER gray text on colored backgrounds.93- NEVER purple-to-blue gradients, neon accents, or cyan-on-dark unless brand requires it.9495**Dark mode** ≠ inverted light mode: lighter surfaces for depth (no shadows), desaturated accents, font weight 350 vs 400, no pure black bg. Swap semantic layer, not component layer.9697---9899## 4. Spacing & Surface100101**4px base grid.** All spacing = multiples of 4px: tight (4px) within atoms, item (8px) between group items, group (16px) between groups, section (24px) between sections, page (32-64px) margins.102103- MUST use spacing tokens or framework scale. NEVER `p-[13px]`, `gap-[7px]`.104- MUST create visual rhythm — tight within groups, generous between sections.105- MUST use Gestalt proximity. NEVER same padding everywhere.106- NEVER triple-layered responsive padding (`p-4 lg:p-8 xl:p-10`).107- Acceptable arbitrary: `max-w-[65ch]`, `max-w-[45ch]`, `min-h-[*rem]`, `grid-template-*`. Banned: `p-[17px]`, `w-[423px]`, `text-[13px]`.108109**Border radius**: ONE base (4-6px buttons/inputs, 8px cards, 4px or `rounded-full` for badges/pills, `rounded-full` for avatars). NEVER `rounded-[10px]`.110111**Shadows**: Subtle multi-layer, low opacity (`shadow-sm` for elevation, `shadow-md` for popovers). NEVER `shadow-lg`/`shadow-xl` on small components. ONE grouping method per section: borders OR shadows OR spacing.112113---114115## 5. Layout116117- MUST use Grid/Flexbox. NEVER absolute positioning for structure.118- MUST use `h-dvh` — NEVER `h-screen`.119- MUST use `min-w-0` on flex/grid children. MUST use fixed `z-index` scale — NEVER `z-[999]`.120- MUST respect `safe-area-inset` for fixed elements.121- SHOULD use `@container` for component responsiveness. SHOULD use `size-*` for square elements.122- SHOULD left-align with asymmetric layouts. SHOULD detect input method (`pointer: coarse`, `hover: none`).123- NEVER wrap everything in cards. NEVER nest cards inside cards.124125**Sidebar**: 40-50% opacity inactive, full on active/hover with subtle bg highlight (no loud accents). Background 1-2 steps dimmer than content. 200-280px fixed, collapsible to icon-only. Content area ALWAYS wins hierarchy.126127**Progressive disclosure**: Steps > 12-field forms. Sheets for contextual detail. Expand/collapse for optional detail. Dialogs only for blocking confirmations. ONE primary action per view — two equal CTAs = hierarchy failure.128129---130131## 6. Animation & Motion132133| Duration | Usage |134|----------|-------|135| 100-150ms | Feedback (press, toggle, tooltip) |136| 200-300ms | State changes (menu, hover, accordion) |137| 300-500ms | Layout (modal, drawer, panel) |138| 500-800ms | Entrance (page load, hero) |139140**Easing**: `--ease-out-quart: cubic-bezier(0.25, 1, 0.5, 1)` default. `--ease-out-quint: cubic-bezier(0.22, 1, 0.36, 1)` snappier. `--ease-out-expo: cubic-bezier(0.16, 1, 0.3, 1)` confident. Ease-out for entrances, ease-in-out for moving elements, ease-in for exits at ~75% entrance duration.141142- MUST animate ONLY `transform` and `opacity`. For height: `grid-template-rows: 0fr → 1fr`.143- MUST respect `prefers-reduced-motion` — use this reset:144 ```css145 @media (prefers-reduced-motion: reduce) {146 *, *::before, *::after { animation-duration: 0.01ms !important; transition-duration: 0.01ms !important; }147 }148 ```149- MUST keep feedback < 200ms, standard transitions < 300ms.150- Button press: `active:scale-[0.97]`, 100ms. List stagger: 30-50ms/item, max 5-8.151- NEVER bounce/elastic easing. NEVER animate `blur()`/`backdrop-filter`. NEVER `will-change` outside animation scope.152- NEVER animate decoratively — every motion must serve a UX purpose (guide attention, show state change, reveal relationship).153- Pause looping animations when off-screen (Intersection Observer).154155**Transitions**: Shared elements morph between states (`layoutId`/View Transitions API). Forward → enters right, back → enters left. Tab switching: slide indicator + content in tab direction. Persistent elements don't re-animate. Data-dense apps: default NO animation — only state attention, overlay enter/exit, loading→loaded.156157---158159## 7. Interaction States160161EVERY interactive element MUST have ALL states:162163| State | Implementation |164|-------|---------------|165| Default | Resting appearance |166| Hover | Subtle lift, color shift, or underline |167| Focus | `:focus-visible` ring (2px solid, 2px offset) — NEVER remove |168| Active | `active:scale-[0.97]` or darken |169| Disabled | `opacity-50 pointer-events-none cursor-not-allowed` |170| Loading | Inline spinner/skeleton, disable interaction |171| Error | Border + inline message |172| Success | Indicator + confirmation |173174- MUST use `AlertDialog` for destructive actions. MUST show errors inline next to trigger.175- MUST use `aria-label` on icon-only buttons. MUST use `<button>` for actions, `<a>` for nav. Never `<div onClick>`.176- SHOULD prefer undo over confirmation (users click through confirmations mindlessly).177- SHOULD use optimistic UI for low-stakes (toggle, reorder). Not for payments or deletions.178- SHOULD use structural skeletons, not spinners. MUST use CVA for 3+ style variants — never inline ternary chains.179- NEVER block paste. NEVER use placeholder as only label.180181---182183## 8. Empty States & Errors184185Empty states are first impressions. NEVER just "No items." Every page needs at least one: dashboards need empty table/list states, forms need inline validation, landing pages need a form (newsletter/signup) with inline error + success states.186187Every empty state MUST have: warm message + primary CTA + optional illustration.188- BAD: "No results" | GOOD: "No documents yet. Upload your first document to get started." [Upload Document]189190Every error MUST answer: What happened? Why? How to fix? Include retry/recovery action.191- BAD: "Error occurred" | GOOD: "Couldn't save your changes. Check your connection and try again." [Retry]192- NEVER humor. NEVER jargon (500, ECONNREFUSED).193194---195196## 9. Data-Dense UI197198- MUST use `tabular-nums`, right-align numbers, pair metrics with context ("$2.4M +12% MoM").199- MUST use green = positive, red = negative. NEVER invert.200- SHOULD use 36-40px rows, inline units, max 4-5 visualizations (tabs/drill-down for depth). Alternating bg OR border-bottom (never both).201- NEVER decorative charts (3D, gridlines, gradient fills). NEVER truncate numbers — truncate descriptions.202- NEVER load all data upfront — paginate or infinite scroll.203204---205206## 10. UX Writing207208- MUST use verb + object: "Save changes" not "OK". "Delete 5 items" not "Yes".209- MUST pick one term everywhere: Delete/Remove/Trash → one. Settings/Preferences → one.210- SHOULD use active voice. Cut every sentence in half. Budget 30-40% for i18n.211- NEVER repeat visible information.212213---214215## 11. Components216217Composition: `primitives/` (shadcn, Base UI, Radix) → `components/` (wrappers + variants) → `blocks/` (product compositions).218219- MUST reuse existing components. MUST wrap, don't modify upstream. MUST use `data-slot`.220- MUST preserve a11y from primitives. MUST use CVA for variants. SHOULD use `cn()`.221- NEVER mix primitive systems in the same project.222223---224225## 12. Responsive & Performance226227**Responsive**: 44px min touch targets. Logical properties (`margin-inline-start`). Test extremes (100+ chars, emoji, RTL, empty, 1000+ items). 2-tier (mobile+desktop) > 4+ breakpoints. Adapt nav for context. NEVER hide core features on mobile. NEVER fixed text widths.228229**Performance**: Lazy-load below-fold. Reserve async space (no layout shift). Debounce search (300ms). Virtual scroll 100+ items. `contain: content`. NEVER animate layout properties. NEVER permanent `will-change`.230231---232233## Self-Check (MANDATORY)234235Re-read every line of code you wrote or modified. Verify:2362371. **No slop** — Zero gradients, glassmorphism, glow, hero metrics, identical cards2382. **No hardcoded colors** — All from semantic tokens, never hex/rgb/hsl in markup2393. **No arbitrary values** — No `text-[13px]`, `p-[17px]`. Use the scale2404. **No `h-screen`** — Use `h-dvh`2415. **Focus visible** — Every interactive element has `:focus-visible`2426. **Empty/error states** — Every list has empty state with CTA2437. **No `transition-all`** — Specify: `transition-colors`, `transition-transform`, `transition-opacity`244245If ANY fail, fix before responding. Do not explain the violation — just fix it.