Repository navigation
Design audit 1/4: foundations (tokens, motion system, touch, reduced motion) - #124
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Fixes the Foundations rows of the 2026-10-09 design audit. - Delete the global toast keyframe that froze Sonner, so toasts stack, expand and leave again. - Rewire the colour tokens: muted text is a real lower tier, the ghost hover, popover, primary, destructive and input colours meet contrast, and dark shadows show. - Delete the global micro-interaction layer (tooltip, menu items, tab underline, icon hijacks, marching ants, switch bounce, progress width, .tabular-nums, input focus glow). Each overlay primitive now has one curve, exits faster than it enters, and scales from its trigger. - Gate hover on devices that hover, make press feedback 0.97 over 100ms, and give buttons, Select triggers, checkboxes and close buttons 44px hit areas on touch. - Reduced motion fades instead of freezing; reduced transparency and more contrast turn blurred surfaces solid; safe-area insets and the tap highlight are handled. - One focus outline, a single theme crossfade, and light and dark theme-color metas. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
ℹ️ Recent review info
📝 Walkthrough
Note 🎁 Summarized by CodeRabbit Free
Comment |
…overlapping Codex review r1 on #124: - Ask's Save and the Factoids link icon were opacity-0 until hover, which hoverOnlyWhenSupported made permanent on touch. They now rest at 60% and go full on hover or focus, as the audit's accessibility row asks. - The 44px checkbox hit area overlapped the next row in the debate context list. It is 36px, and those rows are at least 44px on touch, so each label stays the larger target. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Codex review round 1 (head
Checked locally on |
…other Codex review r2 on #124: switching theme twice before the first transition was ready left its ready promise rejected and unhandled (AbortError: Transition was skipped). The final theme was already correct. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Codex review round 2 (head
Round 3 is reviewing |
|
Codex review round 3 at Local results on
Ready to merge from my side. Holding without merging, as asked. |
The audit replaced the blanket reduced-motion kill with one that keeps opacity and colour transitions. The spec asserted a 0s transition on the options panel; it now asserts the panel transitions nothing that moves (no transform, height, grid rows or 'all'). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>









First of four stacked PRs for the 2026-10-09 design audit: Foundations, then Shell, AI tools, Landing. This one targets
main; each later PR targets the one before it.What changed
[data-sonner-toast]keyframe (both !important) held Sonner's transform, so toasts could not stack, expand, swipe or leave. It is deleted.--muted-foregroundwas identical to--foregroundin both themes. Now light is215 16% 40%(5.55:1 on the page) and dark is215 20% 70%(8.14:1). Light--primaryis 33% lightness (button label 5.10:1), the popover is white, the ghost-hover--accentis visible,--destructivelabels pass,--inputborders reach 3.2:1 / 3.8:1, and dark shadows are strong enough to see. There is a new--successtoken, which PR2 uses.ease-ininto every close), menu-item-in, the second tab underline, the Lucide icon hijacks, the.border-dashed:hovermarching ants, the.tabular-numstransition, the progressbarwidthtransition, switch-bounce, check-draw, the slider pulse,input:focus !important, the dialog keyframe,card-hover-glowandhover-icon-spin. The nav pill, stagger,message-enter, streaming and landing classes stay until the PR that removes their last use.ease-out-strongcubic-bezier(0.23,1,0.32,1),ease-drawerandduration-120. Dialog, AlertDialog, Popover, Select and Tooltip enter in 200ms and exit in 120ms as a fade in place. Popover, Select and Tooltip scale from--radix-*-content-transform-originwithtransition-none, so the origin itself doesn't animate. Sheet runs 300ms open and 200ms close on the drawer curve. Tabs fade in 150ms with no slide. Switch, Progress (transform), accordion and options-panel chevrons all run 150–200ms on the same curve..motion-pressscales to 0.97 in 100ms and releases in 160ms. The hover lift is now opt-in (.motion-lifton solid and outline buttons only), and every CSS hover sits behind(hover: hover) and (pointer: fine), withhoverOnlyWhenSupportedon.will-changeis gone, and so are the button-icon scale, the Badgehover:scale-105and the hover lift on list rows.pointer-coarse:variant gives Button, Select triggers, Checkbox and the dialog and sheet close buttons a 44px hit area on touch. Also:-webkit-tap-highlight-color: transparent;--native-safe-*now readenv(safe-area-inset-*); and the Toaster, OfflineIndicator and bottom Sheet clear the home indicator.prefers-reduced-transparencyandprefers-contrast: moreturn blurred surfaces solid. More contrast also darkens muted text and borders, andforced-colorskeeps an edge.2px--ringoutline on:focus-visible. Primitives that drawfocus-visible:ring-*turn the outline off, so no element gets two rings. Dialog and Sheet close buttons, SelectTrigger and Badge moved fromfocus:tofocus-visible:.theme-colormetas, and ThemeProvider keeps them in sync.verify-debatelab/SKILL.mdgets a gotcha: a running stack doesn't reloadtailwind.config.ts, so you needdown && up.A change from the audit's literal After
Before and after, measured in the same running app
The audit's Playwright probes (
toast.mjs,probe.mjs) ran against the verify stack on2fca7bc(before) and on this branch (after).dismiss(): before, both were marked removed but still fully opaque and unmoved. After, they are at opacity 0.50 and 0.13 and moving.ease-in→ 120mscubic-bezier(0.23,1,0.32,1).94.5px 37pxand the debate popover176px 151px(box centres). Both are now0px 0px, the corner that meets the trigger.ease→ enter 200ms and exit 120ms onout-strong.motion-fade-in200ms.prefers-contrast: more, landing nav:rgba(241,245,249,.9)withblur(24px)→ solidrgb(248,250,252)with no blur and a visible border.Not in this PR: the mobile menu (420ms, PR2), the nav pill (PR2), the Generate shimmer,
message-enterand the Timer ring (PR3), and the landing loops (PR4).Verification
All of these ran locally on this head (
21dc4c6):npm run lint,npm run typecheck,npm test(28 files, 273 tests),npm run buildandnpm run docs:check: all pass.verify.sh drive all: desktop-chromium 30 passed and 2 skipped; mobile-chromium 30 passed and 2 skipped. The skips are the workspace-autosave recipes, which needup --collab.verify.sh e2e run: 16 files and 180 tests pass on desktop and mobile, including the English, Spanish and Hungarian page sweep./app, debate, generate, ask, library, history, settings and timer. Horizontal overflow is zero everywhere. In Hungarian, two labels clip inside their controls ("Vitaeset Generálása" and the timer display label). That is a copy fix for PR4's sentence-case pass.Not verified: real touch hardware, WebKit and Safari (
backdrop-filter, View Transitions fallback), staging and production.🤖 Generated with Claude Code
Summary by CodeRabbit