fix(web): appearance classes use theme tokens and scale values - #13397
Conversation
Thread transfer impact✅ Thread transfer remains within every enforced ceiling.
Baseline: unavailable · PR result: Scenario and decoded snapshot size10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.
Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed. |
ApprovabilityVerdict: Not approved Macroscope's review found this PR not approvable — This is a broad production UI styling refactor that changes shared theme tokens, global class-merging behavior, composer effects, layout insets, and many existing screens. It also adds a file-level lint suppression for an auth component, so the change requires human review. You can add or adjust custom eligibility rules. Learn more. |
|
Navigate logical layers of code changes, visualize relationships, and explore their blast radius. No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Repository: pingdotgg/t3code/.coderabbit.yaml Review profile: CHILL Plan: Team Run ID: 📒 Files selected for processing (109)
Included review availability: Your plan provides up to 10 included reviews per hour; 8 remain after this review. 📝 WalkthroughWalkthroughThe web UI replaces many fixed and arbitrary styling values with shared Tailwind utilities and CSS tokens. Changes cover typography, spacing, colors, transitions, shadows, and responsive layout. A Tailwind merge configuration and lint rule are updated to support and check the utility changes. ChangesWeb UI styling and utility alignment
Priority: ⬇️ Low Estimated code review effort: 3 (Moderate) | ~25 minutes Change: Refactor Suggested reviewers: Merge Risk: ⚪ Minimal · up to No actionable regression remains from the reviewed changes; the PR is mergeable after normal checks. 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
Full details: Docstring CoverageExplanation Docstring coverage is 28.17% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 71 functions across 50 files. (59 skipped: 1 unsupported, 58 over the file limit.)
✨ Finishing Touches 💡 2📝 Generate docstrings 💡
🛠️ Fix failing CI checks 💡
🧪 Generate unit tests (beta)
Comment |
Enables shadcn/no-arbitrary-values as an error for apps/web/src outside components/ui, with layout allowed. 479 findings in 112 files -> 0. New theme tokens (index.css): - --text-2xs (11px, line-height 1rem) and --text-3xs (10px, 0.875rem): the two sizes below text-xs that dense UI uses app-wide (metadata rows, badges, counters, kbd hints, diagnostics). 11px/0.6875rem/.7rem map to 2xs; 10px/.65rem/.6rem/9px/8px/7px map to 3xs. Registered with tailwind-merge in cn(), which otherwise reads text-2xs as a colour and drops it next to text-muted-foreground. - --ease-drawer: cubic-bezier(0.32, 0.72, 0, 1), the decelerating curve the composer context controls already shared (6 sites). The two one-off curves, (.2,.8,.2,1) on the composer "new" pop and (0.22,1,0.36,1) on the provider update pill, map to it as well. - Transition property lists stay as written (transition-[width], transition-[opacity,translate], ...): the rule allows the "transition" class group, because which properties an element animates is per-element behaviour like layout, not a design value. Every transition keeps exactly the properties it animated before; none widens to all. - --shadow-composer / --shadow-composer-dark: the composer's elevation, shared by the composer, its context strip and attached banners. - --background-image-composer-seam-below / -above: the dark-mode shade where the context strip and attached banners meet the composer. - --workspace-gutter(-start/-end): the page header and the chat column shared a copied calc(env(safe-area-inset-*)+0.75rem|1.25rem) gutter. - --font-size-prompt-touch: the prompt size on coarse-pointer phones, floored at 16px so iOS does not zoom on focus. Mappings: - 12px -> text-xs; 14px -> text-sm; 13px/0.8125rem -> text-xs for descriptions and text-sm for titles and body; 1.0625rem -> text-base; 1.4rem -> text-2xl. - Uppercase-label tracking (0.08em..0.2em) -> tracking-widest; -0.005em dropped; -0.05em -> tracking-tighter. leading-[1.125rem] -> leading-4.5, leading-[1.45] -> leading-normal. - [transition-duration:var(--x)] -> duration-(--x). - Other bespoke shadows -> shadow-xs/sm/md and inset-shadow-2xs with a colour; rgb/var colour mixes -> Tailwind colour/alpha syntax (bg-(--x)/(--glass-opacity), scrollbar-thumb-border/78, bg-foreground/10). - Radii -> the theme radius scale (22/20/24px -> 3xl, 16px -> 2xl, ...). - Masks -> mask-t/b-from/to utilities. - One-shot keyframe animations (stash count, SnapShot contents, provider pill countdown) -> transitions with starting: styles; keyframes removed. - ComposerControl icons take text-muted-foreground directly instead of a --control-icon-color indirection. - The right panel tab bar reserves the 6rem beside the native window controls with a spacer, not a calc() padding; the empty state pads its list instead of calc()ing the offset. Exemptions (each commented in vite.config.ts): - rounded-[inherit]: overlays follow their frame's corner, set at runtime (floating preview) or by the element they decorate (composer outline). - gap-[0.33em], px-[0.5em], rounded-[0.5em], text-[0.86em]: inline chips size in em so they scale with the prompt font-size preference. - rounded-[25%]: project icons render 14-48px with one proportional corner (the favicon's 37.5% now matches the monogram's 25%). - text-[length:80cqh]: an emoji icon fills its container. - bg-[Highlight]: the platform selection colour on a selected chip. - Brand fills for Cursor, Grok and Claude marks. - AuthSurfaceShell.tsx off: the sign-in masthead is T3 brand artwork. ContextChip's accent mixes with border/foreground (colour-mix of two colours) are now named custom properties on the chip, read with border-(--...) and text-(--...); the colour choices are unchanged. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2e05b91 to
7b3d869
Compare
Conflicts, resolved onto the fork's versions: - theme-token restyle (pingdotgg#13371, pingdotgg#13397): re-applied upstream's token edits (text-2xs, rounded-sm, bg-(--terminal-background), dropped panel max-h and heading tracking) onto the fork's restructured CommandPalette, composer chip, terminal drawer and settings panels. - sidebar stage art: followed upstream in dropping the focus-ring offset helper; its fork test is gone and the compact-crop test now checks the new data-stage-art marker. - review diff index (pingdotgg#12613): took upstream's rounded-down index mtime, which supersedes the fork's same-second copy. - preview broker tests: kept the fork's profile-routing tests beside upstream's live-tab-owner tests. - mobile environment row (pingdotgg#13302): kept the fork's rename button and added upstream's opensDetails chevron and switch alignment; the new environment detail screen now passes onRename too. - AgentAwarenessRelay test: upstream's new ServerEnvironment mock gains the fork's setEnvironmentLabel. - pnpm-lock.yaml regenerated from the merged manifests. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
## What's Changed * lint/unknown and static by @juliusmarminge in pingdotgg/t3code#13366 * fix(web): web colors come from theme tokens by @juliusmarminge in pingdotgg/t3code#13371 * fix(web): appearance classes use theme tokens and scale values by @juliusmarminge in pingdotgg/t3code#13397 * fix(server): keep Codex's reset answer when the re-probe fails by @juliusmarminge in pingdotgg/t3code#13363 * fix(mobile): branch search finds remote and space-typed branches by @Bil0000 in pingdotgg/t3code#13454 * chore(ci): use GPT 6 Sol Max for check agents by @juliusmarminge in pingdotgg/t3code#13473 * feat(server): show and redeem Claude banked resets by @Bil0000 in pingdotgg/t3code#13118 * fix(observability): a malformed OTEL_RESOURCE_ATTRIBUTES no longer stops startup by @yordis in pingdotgg/t3code#13469 * fix(antigravity): let Stop end commands that outlived their turn by @juliusmarminge in pingdotgg/t3code#13388 * fix(web,mobile): drop the baked-in tile from the Antigravity icon by @flamboh in pingdotgg/t3code#13373 * fix(marketing): use the official OpenCode and Antigravity logos by @flamboh in pingdotgg/t3code#13365 * fix(acp): keep one answer when a running tool reports progress by @juliusmarminge in pingdotgg/t3code#13386 * feat(web): run shell commands from chat in the thread terminal by @Bil0000 in pingdotgg/t3code#13060 * fix(antigravity): keep Windows runtime unpacking under MAX_PATH by @juliusmarminge in pingdotgg/t3code#13389 * fix(codex): the protocol generator runs again on Effect rc.115 by @juliusmarminge in pingdotgg/t3code#13480 * feat(codex): require Codex 0.156 and regenerate its protocol by @juliusmarminge in pingdotgg/t3code#13481 * feat(threads): add per-thread auto-settle switch by @t3dotgg in pingdotgg/t3code#11846 * fix(web): working and monitoring threads fade in the sidebar again by @t3dotgg in pingdotgg/t3code#13506 * fix(server): streamed section titles wait for the text under them by @t3dotgg in pingdotgg/t3code#13504 * fix(web): normalize disabled control opacity by @t3-code[bot] in pingdotgg/t3code#11441 **Full Changelog**: pingdotgg/t3code@v0.0.43-nightly.20260924.2213...v0.0.43-nightly.20260924.2223 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.43-nightly.20260924.2223
Upstream's lint now rejects arbitrary text sizes (pingdotgg#13397). text-2xl is the token upstream picked for the same label and matches the 24px Cody mark.
Turns on
@shadcn/lintno-arbitrary-valuesas an error in web app code, withallow: ["layout", "transition"]. Findings go from 479 to 0.New theme tokens (
apps/web/src/index.css):text-2xs(11px) andtext-3xs(10px): the two sizes belowxs, used at about 260 sites app-wide. Other sizes fold in: 11px, 0.6875rem and .7rem become 2xs; 10px, .65rem, .6rem, 9px, 8px and 7px become 3xs. Both are registered with tailwind-merge; otherwisecn()readstext-2xsas a colour and drops it next totext-muted-foreground.ease-drawer: the decelerating curve the composer context controls already shared at 6 sites. Two one-off curves fold into it: the composer "new" pop and the provider update pill.shadow-composer/shadow-composer-dark: the composer's own elevation, shared by the composer, its context strip and attached banners. It's unchanged.--workspace-gutter(-start/-end): the page gutter that the workspace header and the chat column previously each copied as the samecalc(env(...))classes.Allowed in the config, each with a comment:
transitionclass group: which properties an element animates is per-element behaviour, like layout. Every transition keeps the exact property list it had, and none widen toall. Timing curves and durations still come from the theme.rounded-[inherit]overlays.Visible changes:
tracking-widest.shadow-xs/shadow-smscale.starting:transitions instead of keyframes.Third layer of the stack after #13366 and #13371. With all three, web code has 0 findings across
no-restyle,no-unknown-classes,require-static-classes,no-raw-colorsandno-arbitrary-values, and the full web test suite passes.Claude Opus 5.5 via Claude Code.
🤖 Generated with Claude Code
Summary by CodeRabbit
Before / after