refactor(web): simplify global styling - #6381

Merged
juliusmarminge merged 27 commits into
mainfrom
fix/ui-control-consistency
Aug 14, 2026
Merged

refactor(web): simplify global styling#6381
juliusmarminge merged 27 commits into
mainfrom
fix/ui-control-consistency

Conversation

@t3-code

@t3-codet3-codeBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

problem

shared controls and global styles had drifted away from the project’s component and tailwind conventions. component-owned geometry lived in index.css, dark token overrides used separate selectors, and repeated compact, glass, and search controls rebuilt primitive behavior with large call-site class strings.

fix

control consistency

  • compose icon-bearing searches with InputGroup or Input
  • add shared compact geometry to Button, Input, SelectTrigger, and Toggle
  • add reusable micro icon, muted ghost, and glass button variants
  • migrate keybinding editor controls to those shared sizes
  • replace raw PR search, reviewer search, panel add, banner dismiss, scroll-to-end, and review controls with core UI primitives
  • remove repeated control height, radius, focus, cursor, and color overrides from call sites
  • use the semantic --control-radius in InputGroup

canonical tailwind cleanup

  • nest equivalent dark token overrides with @variant dark
  • move simple component-owned topbar, subheader, sidebar brand, composer inset, and terminal chrome styles to static tailwind classes at their call sites
  • consolidate reusable complex glass surfaces plus topbar and virtualized-list scroll fades as @utility
  • retain browser, vendor, runtime-theme, generated-content, mask, pseudo-element, and custom-theme selector behavior in css where global ownership is intentional
  • remove stale one-use and page-specific classes, including .sidebar-brand* and duplicated chat/settings/pull-request scroll-fade selectors
  • remove exact dark-token repeats, dead terminal-scrollbar aliases, duplicate document/sidebar paint, and owner-duplicated composer positioning
  • share the virtualized model and branch picker fade contract while preserving the model picker’s native scrollbar lane; keep ScrollArea scrollFade for base-ui-owned viewports
  • preserve keyboard focus rings, pointer cursors, dropdown saturation, and composable elevation
  • add a Macroscope UI consistency check that carries these ownership, primitive, theme, emitted-CSS, virtualizer, and verification rules into future web PRs

apps/web/src/index.css is 397 lines and 11,229 bytes smaller than the latest merged main.

verification

  • git diff --check passed
  • formatting verified for all changed css/typescript files through oxfmt stdin mode
  • focused unit suite passed: 24 tests across 5 files
  • final merged-tree focused rerun passed: 119 tests across 7 files
  • web typecheck passed
  • production web build passed
  • emitted production css contains all three exact virtualized fade masks, preserves the 6px native scrollbar lane, and emits no malformed empty selector
  • real app verified in light and dark across chat, settings, keybindings, pull-request shells, and a scrolled model picker using the final shared utility
  • compact keybinding input/select/button geometry remained aligned without clipping in light and dark
  • independent reviews were run for the stylesheet and primitive-variant passes; actionable findings were fixed before publishing
  • the new Macroscope agent frontmatter, include scope, formatting, and clean-response contract were validated
  • pull-request content could not load on the borrowed test backend because its GitHub CLI is unavailable; the migrated PR chrome, topbar, split layout, error state, and theme styling rendered correctly

screenshots

theme search before, light

theme search before, light

theme search after, light

theme search after, light

theme search after, dark

theme search after, dark

chat shell after cleanup, light

chat shell after cleanup, light

chat shell after cleanup, dark

chat shell after cleanup, dark

settings after cleanup, light

settings after cleanup, light

settings after cleanup, dark

settings after cleanup, dark

pull-request shell after cleanup, light

pull-request shell after cleanup, light

pull-request shell after cleanup, dark

pull-request shell after cleanup, dark

shared model-picker scroll fade, light

shared model-picker scroll fade, light

shared model-picker scroll fade, dark

shared model-picker scroll fade, dark

agent

gpt-5.6-sol via hermes agent

request provenance


Note

Cursor Bugbot is generating a summary for commit 148b0fb. Configure here.

Note

Simplify global styling by replacing legacy CSS classes with utility-based variants and shared Button primitives

  • Replaces .dark-scoped CSS blocks with @variant dark/@variant light blocks in index.css, and adds new utility classes (surface-glass, dialog-glass, dropdown-glass, topbar-scroll-fade, virtualized-scroll-fade) that supersede several legacy class-based rules.
  • Adds compact and icon-micro sizes plus ghost-muted and glass variants to the shared Button, Input, Select, and Toggle components; dozens of components are updated to use these new tokens instead of ad-hoc inline classes.
  • Replaces native <button> elements across settings panels, sidebars, diff views, chat composer, and pull request UIs with the shared Button component.
  • Introduces getVirtualizedScrollFadeClassName utility for scroll fade styling and COMPOSER_INLINE_CHIP_DECORATOR_CLASS_NAME constant for decorator spans.
  • Risk: components still referencing removed legacy classes (e.g. workspace-topbar, surface-subheader, chat-timeline-scroll-fade, pull-requests-scroll-fade, settings-page-scroll-fade) will lose those styles; they must adopt the new utilities or data attributes.

Macroscope summarized 190dde8.

Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@github-actionsgithub-actionsBot added size:S 10-29 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. labels Aug 12, 2026
@github-actions

github-actionsBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire11.3 KiB11.3 KiB−8 B (−0.1%)15.1 KiB
CodexThread snapshot wire5.5 KiB5.5 KiB−2 B (−0.0%)7.3 KiB
CodexLive turn WebSocket wire5.9 KiB5.9 KiB−6 B (−0.1%)7.8 KiB
CodexLive turn WebSocket decoded49.7 KiB49.7 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire11.3 KiB11.3 KiB+5 B (+0.0%)15.1 KiB
ClaudeThread snapshot wire5.5 KiB5.5 KiB+7 B (+0.1%)7.3 KiB
ClaudeLive turn WebSocket wire5.9 KiB5.9 KiB−2 B (−0.0%)7.8 KiB
ClaudeLive turn WebSocket decoded50.6 KiB50.6 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 196c8ea · PR result: 190dde8 · Source CI: success

Scenario and decoded snapshot size

10 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.

  • Codex decoded thread snapshot: 94.6 KiB
  • Claude decoded thread snapshot: 95.4 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 12, 2026
@macroscopeapp

macroscopeappBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR adds a Macroscope configuration file (.macroscope/check-run-agents/ui-consistency.md), which requires human review per policy. Additionally, this is a major refactor that restructures shared UI primitives and consolidates global CSS into new utilities across 60+ files.

You can customize Macroscope's approvability policy. Learn more.

t3-codeBotand others added 2 commits August 12, 2026 21:37
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@t3-codet3-codeBot changed the title fix(web): align input group control stylingfix(web): unify control styling and terminal chromeAug 13, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 08:43

Dismissing prior approval to re-evaluate de22137

@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). and removed size:S 10-29 changed lines (additions + deletions). labels Aug 13, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 13, 2026
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@t3-codet3-codeBot changed the title fix(web): unify control styling and terminal chromerefactor(web): simplify global stylingAug 13, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 13:30

Dismissing prior approval to re-evaluate a44720b

@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Aug 13, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 13, 2026
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 13:38

Dismissing prior approval to re-evaluate 8e3066e

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 13, 2026
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 13:45

Dismissing prior approval to re-evaluate 8925f19

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 13, 2026
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 13:54

Dismissing prior approval to re-evaluate d471299

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 13, 2026
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 21:00

Dismissing prior approval to re-evaluate 578bf5b

juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Sep 1, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Sep 1, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Sep 1, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

refactor(web): simplify global styling - #6381

Merged
juliusmarminge merged 27 commits into
mainfrom
fix/ui-control-consistency
Aug 14, 2026
Merged

refactor(web): simplify global styling#6381
juliusmarminge merged 27 commits into
mainfrom
fix/ui-control-consistency

Conversation

@t3-code

@t3-codet3-codeBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

problem

shared controls and global styles had drifted away from the project’s component and tailwind conventions. component-owned geometry lived in index.css, dark token overrides used separate selectors, and repeated compact, glass, and search controls rebuilt primitive behavior with large call-site class strings.

fix

control consistency

  • compose icon-bearing searches with InputGroup or Input
  • add shared compact geometry to Button, Input, SelectTrigger, and Toggle
  • add reusable micro icon, muted ghost, and glass button variants
  • migrate keybinding editor controls to those shared sizes
  • replace raw PR search, reviewer search, panel add, banner dismiss, scroll-to-end, and review controls with core UI primitives
  • remove repeated control height, radius, focus, cursor, and color overrides from call sites
  • use the semantic --control-radius in InputGroup

canonical tailwind cleanup

  • nest equivalent dark token overrides with @variant dark
  • move simple component-owned topbar, subheader, sidebar brand, composer inset, and terminal chrome styles to static tailwind classes at their call sites
  • consolidate reusable complex glass surfaces plus topbar and virtualized-list scroll fades as @utility
  • retain browser, vendor, runtime-theme, generated-content, mask, pseudo-element, and custom-theme selector behavior in css where global ownership is intentional
  • remove stale one-use and page-specific classes, including .sidebar-brand* and duplicated chat/settings/pull-request scroll-fade selectors
  • remove exact dark-token repeats, dead terminal-scrollbar aliases, duplicate document/sidebar paint, and owner-duplicated composer positioning
  • share the virtualized model and branch picker fade contract while preserving the model picker’s native scrollbar lane; keep ScrollArea scrollFade for base-ui-owned viewports
  • preserve keyboard focus rings, pointer cursors, dropdown saturation, and composable elevation
  • add a Macroscope UI consistency check that carries these ownership, primitive, theme, emitted-CSS, virtualizer, and verification rules into future web PRs

apps/web/src/index.css is 397 lines and 11,229 bytes smaller than the latest merged main.

verification

  • git diff --check passed
  • formatting verified for all changed css/typescript files through oxfmt stdin mode
  • focused unit suite passed: 24 tests across 5 files
  • final merged-tree focused rerun passed: 119 tests across 7 files
  • web typecheck passed
  • production web build passed
  • emitted production css contains all three exact virtualized fade masks, preserves the 6px native scrollbar lane, and emits no malformed empty selector
  • real app verified in light and dark across chat, settings, keybindings, pull-request shells, and a scrolled model picker using the final shared utility
  • compact keybinding input/select/button geometry remained aligned without clipping in light and dark
  • independent reviews were run for the stylesheet and primitive-variant passes; actionable findings were fixed before publishing
  • the new Macroscope agent frontmatter, include scope, formatting, and clean-response contract were validated
  • pull-request content could not load on the borrowed test backend because its GitHub CLI is unavailable; the migrated PR chrome, topbar, split layout, error state, and theme styling rendered correctly

screenshots

theme search before, light

theme search before, light

theme search after, light

theme search after, light

theme search after, dark

theme search after, dark

chat shell after cleanup, light

chat shell after cleanup, light

chat shell after cleanup, dark

chat shell after cleanup, dark

settings after cleanup, light

settings after cleanup, light

settings after cleanup, dark

settings after cleanup, dark

pull-request shell after cleanup, light

pull-request shell after cleanup, light

pull-request shell after cleanup, dark

pull-request shell after cleanup, dark

shared model-picker scroll fade, light

shared model-picker scroll fade, light

shared model-picker scroll fade, dark

shared model-picker scroll fade, dark

agent

gpt-5.6-sol via hermes agent

request provenance


Note

Cursor Bugbot is generating a summary for commit 148b0fb. Configure here.

Note

Simplify global styling by replacing legacy CSS classes with utility-based variants and shared Button primitives

  • Replaces .dark-scoped CSS blocks with @variant dark/@variant light blocks in index.css, and adds new utility classes (surface-glass, dialog-glass, dropdown-glass, topbar-scroll-fade, virtualized-scroll-fade) that supersede several legacy class-based rules.
  • Adds compact and icon-micro sizes plus ghost-muted and glass variants to the shared Button, Input, Select, and Toggle components; dozens of components are updated to use these new tokens instead of ad-hoc inline classes.
  • Replaces native <button> elements across settings panels, sidebars, diff views, chat composer, and pull request UIs with the shared Button component.
  • Introduces getVirtualizedScrollFadeClassName utility for scroll fade styling and COMPOSER_INLINE_CHIP_DECORATOR_CLASS_NAME constant for decorator spans.
  • Risk: components still referencing removed legacy classes (e.g. workspace-topbar, surface-subheader, chat-timeline-scroll-fade, pull-requests-scroll-fade, settings-page-scroll-fade) will lose those styles; they must adopt the new utilities or data attributes.

Macroscope summarized 190dde8.

Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@github-actionsgithub-actionsBot added size:S 10-29 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. labels Aug 12, 2026
@github-actions

github-actionsBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire11.3 KiB11.3 KiB−8 B (−0.1%)15.1 KiB
CodexThread snapshot wire5.5 KiB5.5 KiB−2 B (−0.0%)7.3 KiB
CodexLive turn WebSocket wire5.9 KiB5.9 KiB−6 B (−0.1%)7.8 KiB
CodexLive turn WebSocket decoded49.7 KiB49.7 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire11.3 KiB11.3 KiB+5 B (+0.0%)15.1 KiB
ClaudeThread snapshot wire5.5 KiB5.5 KiB+7 B (+0.1%)7.3 KiB
ClaudeLive turn WebSocket wire5.9 KiB5.9 KiB−2 B (−0.0%)7.8 KiB
ClaudeLive turn WebSocket decoded50.6 KiB50.6 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 196c8ea · PR result: 190dde8 · Source CI: success

Scenario and decoded snapshot size

10 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.

  • Codex decoded thread snapshot: 94.6 KiB
  • Claude decoded thread snapshot: 95.4 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 12, 2026
@macroscopeapp

macroscopeappBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR adds a Macroscope configuration file (.macroscope/check-run-agents/ui-consistency.md), which requires human review per policy. Additionally, this is a major refactor that restructures shared UI primitives and consolidates global CSS into new utilities across 60+ files.

You can customize Macroscope's approvability policy. Learn more.

t3-codeBotand others added 2 commits August 12, 2026 21:37
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@t3-codet3-codeBot changed the title fix(web): align input group control stylingfix(web): unify control styling and terminal chromeAug 13, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 08:43

Dismissing prior approval to re-evaluate de22137

@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). and removed size:S 10-29 changed lines (additions + deletions). labels Aug 13, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 13, 2026
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@t3-codet3-codeBot changed the title fix(web): unify control styling and terminal chromerefactor(web): simplify global stylingAug 13, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 13:30

Dismissing prior approval to re-evaluate a44720b

@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Aug 13, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 13, 2026
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 13:38

Dismissing prior approval to re-evaluate 8e3066e

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 13, 2026
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 13:45

Dismissing prior approval to re-evaluate 8925f19

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 13, 2026
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 13:54

Dismissing prior approval to re-evaluate d471299

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 13, 2026
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 21:00

Dismissing prior approval to re-evaluate 578bf5b

juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Sep 1, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Sep 1, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Sep 1, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

refactor(web): simplify global styling - #6381

Merged
juliusmarminge merged 27 commits into
mainfrom
fix/ui-control-consistency
Aug 14, 2026
Merged

refactor(web): simplify global styling#6381
juliusmarminge merged 27 commits into
mainfrom
fix/ui-control-consistency

Conversation

@t3-code

@t3-codet3-codeBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

problem

shared controls and global styles had drifted away from the project’s component and tailwind conventions. component-owned geometry lived in index.css, dark token overrides used separate selectors, and repeated compact, glass, and search controls rebuilt primitive behavior with large call-site class strings.

fix

control consistency

  • compose icon-bearing searches with InputGroup or Input
  • add shared compact geometry to Button, Input, SelectTrigger, and Toggle
  • add reusable micro icon, muted ghost, and glass button variants
  • migrate keybinding editor controls to those shared sizes
  • replace raw PR search, reviewer search, panel add, banner dismiss, scroll-to-end, and review controls with core UI primitives
  • remove repeated control height, radius, focus, cursor, and color overrides from call sites
  • use the semantic --control-radius in InputGroup

canonical tailwind cleanup

  • nest equivalent dark token overrides with @variant dark
  • move simple component-owned topbar, subheader, sidebar brand, composer inset, and terminal chrome styles to static tailwind classes at their call sites
  • consolidate reusable complex glass surfaces plus topbar and virtualized-list scroll fades as @utility
  • retain browser, vendor, runtime-theme, generated-content, mask, pseudo-element, and custom-theme selector behavior in css where global ownership is intentional
  • remove stale one-use and page-specific classes, including .sidebar-brand* and duplicated chat/settings/pull-request scroll-fade selectors
  • remove exact dark-token repeats, dead terminal-scrollbar aliases, duplicate document/sidebar paint, and owner-duplicated composer positioning
  • share the virtualized model and branch picker fade contract while preserving the model picker’s native scrollbar lane; keep ScrollArea scrollFade for base-ui-owned viewports
  • preserve keyboard focus rings, pointer cursors, dropdown saturation, and composable elevation
  • add a Macroscope UI consistency check that carries these ownership, primitive, theme, emitted-CSS, virtualizer, and verification rules into future web PRs

apps/web/src/index.css is 397 lines and 11,229 bytes smaller than the latest merged main.

verification

  • git diff --check passed
  • formatting verified for all changed css/typescript files through oxfmt stdin mode
  • focused unit suite passed: 24 tests across 5 files
  • final merged-tree focused rerun passed: 119 tests across 7 files
  • web typecheck passed
  • production web build passed
  • emitted production css contains all three exact virtualized fade masks, preserves the 6px native scrollbar lane, and emits no malformed empty selector
  • real app verified in light and dark across chat, settings, keybindings, pull-request shells, and a scrolled model picker using the final shared utility
  • compact keybinding input/select/button geometry remained aligned without clipping in light and dark
  • independent reviews were run for the stylesheet and primitive-variant passes; actionable findings were fixed before publishing
  • the new Macroscope agent frontmatter, include scope, formatting, and clean-response contract were validated
  • pull-request content could not load on the borrowed test backend because its GitHub CLI is unavailable; the migrated PR chrome, topbar, split layout, error state, and theme styling rendered correctly

screenshots

theme search before, light

theme search before, light

theme search after, light

theme search after, light

theme search after, dark

theme search after, dark

chat shell after cleanup, light

chat shell after cleanup, light

chat shell after cleanup, dark

chat shell after cleanup, dark

settings after cleanup, light

settings after cleanup, light

settings after cleanup, dark

settings after cleanup, dark

pull-request shell after cleanup, light

pull-request shell after cleanup, light

pull-request shell after cleanup, dark

pull-request shell after cleanup, dark

shared model-picker scroll fade, light

shared model-picker scroll fade, light

shared model-picker scroll fade, dark

shared model-picker scroll fade, dark

agent

gpt-5.6-sol via hermes agent

request provenance


Note

Cursor Bugbot is generating a summary for commit 148b0fb. Configure here.

Note

Simplify global styling by replacing legacy CSS classes with utility-based variants and shared Button primitives

  • Replaces .dark-scoped CSS blocks with @variant dark/@variant light blocks in index.css, and adds new utility classes (surface-glass, dialog-glass, dropdown-glass, topbar-scroll-fade, virtualized-scroll-fade) that supersede several legacy class-based rules.
  • Adds compact and icon-micro sizes plus ghost-muted and glass variants to the shared Button, Input, Select, and Toggle components; dozens of components are updated to use these new tokens instead of ad-hoc inline classes.
  • Replaces native <button> elements across settings panels, sidebars, diff views, chat composer, and pull request UIs with the shared Button component.
  • Introduces getVirtualizedScrollFadeClassName utility for scroll fade styling and COMPOSER_INLINE_CHIP_DECORATOR_CLASS_NAME constant for decorator spans.
  • Risk: components still referencing removed legacy classes (e.g. workspace-topbar, surface-subheader, chat-timeline-scroll-fade, pull-requests-scroll-fade, settings-page-scroll-fade) will lose those styles; they must adopt the new utilities or data attributes.

Macroscope summarized 190dde8.

Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@github-actionsgithub-actionsBot added size:S 10-29 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. labels Aug 12, 2026
@github-actions

github-actionsBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire11.3 KiB11.3 KiB−8 B (−0.1%)15.1 KiB
CodexThread snapshot wire5.5 KiB5.5 KiB−2 B (−0.0%)7.3 KiB
CodexLive turn WebSocket wire5.9 KiB5.9 KiB−6 B (−0.1%)7.8 KiB
CodexLive turn WebSocket decoded49.7 KiB49.7 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire11.3 KiB11.3 KiB+5 B (+0.0%)15.1 KiB
ClaudeThread snapshot wire5.5 KiB5.5 KiB+7 B (+0.1%)7.3 KiB
ClaudeLive turn WebSocket wire5.9 KiB5.9 KiB−2 B (−0.0%)7.8 KiB
ClaudeLive turn WebSocket decoded50.6 KiB50.6 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 196c8ea · PR result: 190dde8 · Source CI: success

Scenario and decoded snapshot size

10 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.

  • Codex decoded thread snapshot: 94.6 KiB
  • Claude decoded thread snapshot: 95.4 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 12, 2026
@macroscopeapp

macroscopeappBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR adds a Macroscope configuration file (.macroscope/check-run-agents/ui-consistency.md), which requires human review per policy. Additionally, this is a major refactor that restructures shared UI primitives and consolidates global CSS into new utilities across 60+ files.

You can customize Macroscope's approvability policy. Learn more.

t3-codeBotand others added 2 commits August 12, 2026 21:37
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@t3-codet3-codeBot changed the title fix(web): align input group control stylingfix(web): unify control styling and terminal chromeAug 13, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 08:43

Dismissing prior approval to re-evaluate de22137

@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). and removed size:S 10-29 changed lines (additions + deletions). labels Aug 13, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 13, 2026
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@t3-codet3-codeBot changed the title fix(web): unify control styling and terminal chromerefactor(web): simplify global stylingAug 13, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 13:30

Dismissing prior approval to re-evaluate a44720b

@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Aug 13, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 13, 2026
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 13:38

Dismissing prior approval to re-evaluate 8e3066e

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 13, 2026
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 13:45

Dismissing prior approval to re-evaluate 8925f19

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 13, 2026
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 13:54

Dismissing prior approval to re-evaluate d471299

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 13, 2026
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 21:00

Dismissing prior approval to re-evaluate 578bf5b

juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Sep 1, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Sep 1, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Sep 1, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

refactor(web): simplify global styling - #6381

Merged
juliusmarminge merged 27 commits into
mainfrom
fix/ui-control-consistency
Aug 14, 2026
Merged

refactor(web): simplify global styling#6381
juliusmarminge merged 27 commits into
mainfrom
fix/ui-control-consistency

Conversation

@t3-code

@t3-codet3-codeBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

problem

shared controls and global styles had drifted away from the project’s component and tailwind conventions. component-owned geometry lived in index.css, dark token overrides used separate selectors, and repeated compact, glass, and search controls rebuilt primitive behavior with large call-site class strings.

fix

control consistency

  • compose icon-bearing searches with InputGroup or Input
  • add shared compact geometry to Button, Input, SelectTrigger, and Toggle
  • add reusable micro icon, muted ghost, and glass button variants
  • migrate keybinding editor controls to those shared sizes
  • replace raw PR search, reviewer search, panel add, banner dismiss, scroll-to-end, and review controls with core UI primitives
  • remove repeated control height, radius, focus, cursor, and color overrides from call sites
  • use the semantic --control-radius in InputGroup

canonical tailwind cleanup

  • nest equivalent dark token overrides with @variant dark
  • move simple component-owned topbar, subheader, sidebar brand, composer inset, and terminal chrome styles to static tailwind classes at their call sites
  • consolidate reusable complex glass surfaces plus topbar and virtualized-list scroll fades as @utility
  • retain browser, vendor, runtime-theme, generated-content, mask, pseudo-element, and custom-theme selector behavior in css where global ownership is intentional
  • remove stale one-use and page-specific classes, including .sidebar-brand* and duplicated chat/settings/pull-request scroll-fade selectors
  • remove exact dark-token repeats, dead terminal-scrollbar aliases, duplicate document/sidebar paint, and owner-duplicated composer positioning
  • share the virtualized model and branch picker fade contract while preserving the model picker’s native scrollbar lane; keep ScrollArea scrollFade for base-ui-owned viewports
  • preserve keyboard focus rings, pointer cursors, dropdown saturation, and composable elevation
  • add a Macroscope UI consistency check that carries these ownership, primitive, theme, emitted-CSS, virtualizer, and verification rules into future web PRs

apps/web/src/index.css is 397 lines and 11,229 bytes smaller than the latest merged main.

verification

  • git diff --check passed
  • formatting verified for all changed css/typescript files through oxfmt stdin mode
  • focused unit suite passed: 24 tests across 5 files
  • final merged-tree focused rerun passed: 119 tests across 7 files
  • web typecheck passed
  • production web build passed
  • emitted production css contains all three exact virtualized fade masks, preserves the 6px native scrollbar lane, and emits no malformed empty selector
  • real app verified in light and dark across chat, settings, keybindings, pull-request shells, and a scrolled model picker using the final shared utility
  • compact keybinding input/select/button geometry remained aligned without clipping in light and dark
  • independent reviews were run for the stylesheet and primitive-variant passes; actionable findings were fixed before publishing
  • the new Macroscope agent frontmatter, include scope, formatting, and clean-response contract were validated
  • pull-request content could not load on the borrowed test backend because its GitHub CLI is unavailable; the migrated PR chrome, topbar, split layout, error state, and theme styling rendered correctly

screenshots

theme search before, light

theme search before, light

theme search after, light

theme search after, light

theme search after, dark

theme search after, dark

chat shell after cleanup, light

chat shell after cleanup, light

chat shell after cleanup, dark

chat shell after cleanup, dark

settings after cleanup, light

settings after cleanup, light

settings after cleanup, dark

settings after cleanup, dark

pull-request shell after cleanup, light

pull-request shell after cleanup, light

pull-request shell after cleanup, dark

pull-request shell after cleanup, dark

shared model-picker scroll fade, light

shared model-picker scroll fade, light

shared model-picker scroll fade, dark

shared model-picker scroll fade, dark

agent

gpt-5.6-sol via hermes agent

request provenance


Note

Cursor Bugbot is generating a summary for commit 148b0fb. Configure here.

Note

Simplify global styling by replacing legacy CSS classes with utility-based variants and shared Button primitives

  • Replaces .dark-scoped CSS blocks with @variant dark/@variant light blocks in index.css, and adds new utility classes (surface-glass, dialog-glass, dropdown-glass, topbar-scroll-fade, virtualized-scroll-fade) that supersede several legacy class-based rules.
  • Adds compact and icon-micro sizes plus ghost-muted and glass variants to the shared Button, Input, Select, and Toggle components; dozens of components are updated to use these new tokens instead of ad-hoc inline classes.
  • Replaces native <button> elements across settings panels, sidebars, diff views, chat composer, and pull request UIs with the shared Button component.
  • Introduces getVirtualizedScrollFadeClassName utility for scroll fade styling and COMPOSER_INLINE_CHIP_DECORATOR_CLASS_NAME constant for decorator spans.
  • Risk: components still referencing removed legacy classes (e.g. workspace-topbar, surface-subheader, chat-timeline-scroll-fade, pull-requests-scroll-fade, settings-page-scroll-fade) will lose those styles; they must adopt the new utilities or data attributes.

Macroscope summarized 190dde8.

Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@github-actionsgithub-actionsBot added size:S 10-29 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. labels Aug 12, 2026
@github-actions

github-actionsBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire11.3 KiB11.3 KiB−8 B (−0.1%)15.1 KiB
CodexThread snapshot wire5.5 KiB5.5 KiB−2 B (−0.0%)7.3 KiB
CodexLive turn WebSocket wire5.9 KiB5.9 KiB−6 B (−0.1%)7.8 KiB
CodexLive turn WebSocket decoded49.7 KiB49.7 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire11.3 KiB11.3 KiB+5 B (+0.0%)15.1 KiB
ClaudeThread snapshot wire5.5 KiB5.5 KiB+7 B (+0.1%)7.3 KiB
ClaudeLive turn WebSocket wire5.9 KiB5.9 KiB−2 B (−0.0%)7.8 KiB
ClaudeLive turn WebSocket decoded50.6 KiB50.6 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 196c8ea · PR result: 190dde8 · Source CI: success

Scenario and decoded snapshot size

10 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.

  • Codex decoded thread snapshot: 94.6 KiB
  • Claude decoded thread snapshot: 95.4 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 12, 2026
@macroscopeapp

macroscopeappBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR adds a Macroscope configuration file (.macroscope/check-run-agents/ui-consistency.md), which requires human review per policy. Additionally, this is a major refactor that restructures shared UI primitives and consolidates global CSS into new utilities across 60+ files.

You can customize Macroscope's approvability policy. Learn more.

t3-codeBotand others added 2 commits August 12, 2026 21:37
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@t3-codet3-codeBot changed the title fix(web): align input group control stylingfix(web): unify control styling and terminal chromeAug 13, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 08:43

Dismissing prior approval to re-evaluate de22137

@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). and removed size:S 10-29 changed lines (additions + deletions). labels Aug 13, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 13, 2026
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@t3-codet3-codeBot changed the title fix(web): unify control styling and terminal chromerefactor(web): simplify global stylingAug 13, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 13:30

Dismissing prior approval to re-evaluate a44720b

@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Aug 13, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 13, 2026
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 13:38

Dismissing prior approval to re-evaluate 8e3066e

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 13, 2026
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 13:45

Dismissing prior approval to re-evaluate 8925f19

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 13, 2026
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 13:54

Dismissing prior approval to re-evaluate d471299

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 13, 2026
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 21:00

Dismissing prior approval to re-evaluate 578bf5b

juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Sep 1, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Sep 1, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Sep 1, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

refactor(web): simplify global styling - #6381

Merged
juliusmarminge merged 27 commits into
mainfrom
fix/ui-control-consistency
Aug 14, 2026
Merged

refactor(web): simplify global styling#6381
juliusmarminge merged 27 commits into
mainfrom
fix/ui-control-consistency

Conversation

@t3-code

@t3-codet3-codeBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

problem

shared controls and global styles had drifted away from the project’s component and tailwind conventions. component-owned geometry lived in index.css, dark token overrides used separate selectors, and repeated compact, glass, and search controls rebuilt primitive behavior with large call-site class strings.

fix

control consistency

  • compose icon-bearing searches with InputGroup or Input
  • add shared compact geometry to Button, Input, SelectTrigger, and Toggle
  • add reusable micro icon, muted ghost, and glass button variants
  • migrate keybinding editor controls to those shared sizes
  • replace raw PR search, reviewer search, panel add, banner dismiss, scroll-to-end, and review controls with core UI primitives
  • remove repeated control height, radius, focus, cursor, and color overrides from call sites
  • use the semantic --control-radius in InputGroup

canonical tailwind cleanup

  • nest equivalent dark token overrides with @variant dark
  • move simple component-owned topbar, subheader, sidebar brand, composer inset, and terminal chrome styles to static tailwind classes at their call sites
  • consolidate reusable complex glass surfaces plus topbar and virtualized-list scroll fades as @utility
  • retain browser, vendor, runtime-theme, generated-content, mask, pseudo-element, and custom-theme selector behavior in css where global ownership is intentional
  • remove stale one-use and page-specific classes, including .sidebar-brand* and duplicated chat/settings/pull-request scroll-fade selectors
  • remove exact dark-token repeats, dead terminal-scrollbar aliases, duplicate document/sidebar paint, and owner-duplicated composer positioning
  • share the virtualized model and branch picker fade contract while preserving the model picker’s native scrollbar lane; keep ScrollArea scrollFade for base-ui-owned viewports
  • preserve keyboard focus rings, pointer cursors, dropdown saturation, and composable elevation
  • add a Macroscope UI consistency check that carries these ownership, primitive, theme, emitted-CSS, virtualizer, and verification rules into future web PRs

apps/web/src/index.css is 397 lines and 11,229 bytes smaller than the latest merged main.

verification

  • git diff --check passed
  • formatting verified for all changed css/typescript files through oxfmt stdin mode
  • focused unit suite passed: 24 tests across 5 files
  • final merged-tree focused rerun passed: 119 tests across 7 files
  • web typecheck passed
  • production web build passed
  • emitted production css contains all three exact virtualized fade masks, preserves the 6px native scrollbar lane, and emits no malformed empty selector
  • real app verified in light and dark across chat, settings, keybindings, pull-request shells, and a scrolled model picker using the final shared utility
  • compact keybinding input/select/button geometry remained aligned without clipping in light and dark
  • independent reviews were run for the stylesheet and primitive-variant passes; actionable findings were fixed before publishing
  • the new Macroscope agent frontmatter, include scope, formatting, and clean-response contract were validated
  • pull-request content could not load on the borrowed test backend because its GitHub CLI is unavailable; the migrated PR chrome, topbar, split layout, error state, and theme styling rendered correctly

screenshots

theme search before, light

theme search before, light

theme search after, light

theme search after, light

theme search after, dark

theme search after, dark

chat shell after cleanup, light

chat shell after cleanup, light

chat shell after cleanup, dark

chat shell after cleanup, dark

settings after cleanup, light

settings after cleanup, light

settings after cleanup, dark

settings after cleanup, dark

pull-request shell after cleanup, light

pull-request shell after cleanup, light

pull-request shell after cleanup, dark

pull-request shell after cleanup, dark

shared model-picker scroll fade, light

shared model-picker scroll fade, light

shared model-picker scroll fade, dark

shared model-picker scroll fade, dark

agent

gpt-5.6-sol via hermes agent

request provenance


Note

Cursor Bugbot is generating a summary for commit 148b0fb. Configure here.

Note

Simplify global styling by replacing legacy CSS classes with utility-based variants and shared Button primitives

  • Replaces .dark-scoped CSS blocks with @variant dark/@variant light blocks in index.css, and adds new utility classes (surface-glass, dialog-glass, dropdown-glass, topbar-scroll-fade, virtualized-scroll-fade) that supersede several legacy class-based rules.
  • Adds compact and icon-micro sizes plus ghost-muted and glass variants to the shared Button, Input, Select, and Toggle components; dozens of components are updated to use these new tokens instead of ad-hoc inline classes.
  • Replaces native <button> elements across settings panels, sidebars, diff views, chat composer, and pull request UIs with the shared Button component.
  • Introduces getVirtualizedScrollFadeClassName utility for scroll fade styling and COMPOSER_INLINE_CHIP_DECORATOR_CLASS_NAME constant for decorator spans.
  • Risk: components still referencing removed legacy classes (e.g. workspace-topbar, surface-subheader, chat-timeline-scroll-fade, pull-requests-scroll-fade, settings-page-scroll-fade) will lose those styles; they must adopt the new utilities or data attributes.

Macroscope summarized 190dde8.

Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@github-actionsgithub-actionsBot added size:S 10-29 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. labels Aug 12, 2026
@github-actions

github-actionsBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire11.3 KiB11.3 KiB−8 B (−0.1%)15.1 KiB
CodexThread snapshot wire5.5 KiB5.5 KiB−2 B (−0.0%)7.3 KiB
CodexLive turn WebSocket wire5.9 KiB5.9 KiB−6 B (−0.1%)7.8 KiB
CodexLive turn WebSocket decoded49.7 KiB49.7 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire11.3 KiB11.3 KiB+5 B (+0.0%)15.1 KiB
ClaudeThread snapshot wire5.5 KiB5.5 KiB+7 B (+0.1%)7.3 KiB
ClaudeLive turn WebSocket wire5.9 KiB5.9 KiB−2 B (−0.0%)7.8 KiB
ClaudeLive turn WebSocket decoded50.6 KiB50.6 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 196c8ea · PR result: 190dde8 · Source CI: success

Scenario and decoded snapshot size

10 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.

  • Codex decoded thread snapshot: 94.6 KiB
  • Claude decoded thread snapshot: 95.4 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 12, 2026
@macroscopeapp

macroscopeappBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR adds a Macroscope configuration file (.macroscope/check-run-agents/ui-consistency.md), which requires human review per policy. Additionally, this is a major refactor that restructures shared UI primitives and consolidates global CSS into new utilities across 60+ files.

You can customize Macroscope's approvability policy. Learn more.

t3-codeBotand others added 2 commits August 12, 2026 21:37
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@t3-codet3-codeBot changed the title fix(web): align input group control stylingfix(web): unify control styling and terminal chromeAug 13, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 08:43

Dismissing prior approval to re-evaluate de22137

@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). and removed size:S 10-29 changed lines (additions + deletions). labels Aug 13, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 13, 2026
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@t3-codet3-codeBot changed the title fix(web): unify control styling and terminal chromerefactor(web): simplify global stylingAug 13, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 13:30

Dismissing prior approval to re-evaluate a44720b

@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Aug 13, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 13, 2026
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 13:38

Dismissing prior approval to re-evaluate 8e3066e

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 13, 2026
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 13:45

Dismissing prior approval to re-evaluate 8925f19

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 13, 2026
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 13:54

Dismissing prior approval to re-evaluate d471299

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 13, 2026
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 21:00

Dismissing prior approval to re-evaluate 578bf5b

juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Sep 1, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Sep 1, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Sep 1, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

refactor(web): simplify global styling - #6381

Merged
juliusmarminge merged 27 commits into
mainfrom
fix/ui-control-consistency
Aug 14, 2026
Merged

refactor(web): simplify global styling#6381
juliusmarminge merged 27 commits into
mainfrom
fix/ui-control-consistency

Conversation

@t3-code

@t3-codet3-codeBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

problem

shared controls and global styles had drifted away from the project’s component and tailwind conventions. component-owned geometry lived in index.css, dark token overrides used separate selectors, and repeated compact, glass, and search controls rebuilt primitive behavior with large call-site class strings.

fix

control consistency

  • compose icon-bearing searches with InputGroup or Input
  • add shared compact geometry to Button, Input, SelectTrigger, and Toggle
  • add reusable micro icon, muted ghost, and glass button variants
  • migrate keybinding editor controls to those shared sizes
  • replace raw PR search, reviewer search, panel add, banner dismiss, scroll-to-end, and review controls with core UI primitives
  • remove repeated control height, radius, focus, cursor, and color overrides from call sites
  • use the semantic --control-radius in InputGroup

canonical tailwind cleanup

  • nest equivalent dark token overrides with @variant dark
  • move simple component-owned topbar, subheader, sidebar brand, composer inset, and terminal chrome styles to static tailwind classes at their call sites
  • consolidate reusable complex glass surfaces plus topbar and virtualized-list scroll fades as @utility
  • retain browser, vendor, runtime-theme, generated-content, mask, pseudo-element, and custom-theme selector behavior in css where global ownership is intentional
  • remove stale one-use and page-specific classes, including .sidebar-brand* and duplicated chat/settings/pull-request scroll-fade selectors
  • remove exact dark-token repeats, dead terminal-scrollbar aliases, duplicate document/sidebar paint, and owner-duplicated composer positioning
  • share the virtualized model and branch picker fade contract while preserving the model picker’s native scrollbar lane; keep ScrollArea scrollFade for base-ui-owned viewports
  • preserve keyboard focus rings, pointer cursors, dropdown saturation, and composable elevation
  • add a Macroscope UI consistency check that carries these ownership, primitive, theme, emitted-CSS, virtualizer, and verification rules into future web PRs

apps/web/src/index.css is 397 lines and 11,229 bytes smaller than the latest merged main.

verification

  • git diff --check passed
  • formatting verified for all changed css/typescript files through oxfmt stdin mode
  • focused unit suite passed: 24 tests across 5 files
  • final merged-tree focused rerun passed: 119 tests across 7 files
  • web typecheck passed
  • production web build passed
  • emitted production css contains all three exact virtualized fade masks, preserves the 6px native scrollbar lane, and emits no malformed empty selector
  • real app verified in light and dark across chat, settings, keybindings, pull-request shells, and a scrolled model picker using the final shared utility
  • compact keybinding input/select/button geometry remained aligned without clipping in light and dark
  • independent reviews were run for the stylesheet and primitive-variant passes; actionable findings were fixed before publishing
  • the new Macroscope agent frontmatter, include scope, formatting, and clean-response contract were validated
  • pull-request content could not load on the borrowed test backend because its GitHub CLI is unavailable; the migrated PR chrome, topbar, split layout, error state, and theme styling rendered correctly

screenshots

theme search before, light

theme search before, light

theme search after, light

theme search after, light

theme search after, dark

theme search after, dark

chat shell after cleanup, light

chat shell after cleanup, light

chat shell after cleanup, dark

chat shell after cleanup, dark

settings after cleanup, light

settings after cleanup, light

settings after cleanup, dark

settings after cleanup, dark

pull-request shell after cleanup, light

pull-request shell after cleanup, light

pull-request shell after cleanup, dark

pull-request shell after cleanup, dark

shared model-picker scroll fade, light

shared model-picker scroll fade, light

shared model-picker scroll fade, dark

shared model-picker scroll fade, dark

agent

gpt-5.6-sol via hermes agent

request provenance


Note

Cursor Bugbot is generating a summary for commit 148b0fb. Configure here.

Note

Simplify global styling by replacing legacy CSS classes with utility-based variants and shared Button primitives

  • Replaces .dark-scoped CSS blocks with @variant dark/@variant light blocks in index.css, and adds new utility classes (surface-glass, dialog-glass, dropdown-glass, topbar-scroll-fade, virtualized-scroll-fade) that supersede several legacy class-based rules.
  • Adds compact and icon-micro sizes plus ghost-muted and glass variants to the shared Button, Input, Select, and Toggle components; dozens of components are updated to use these new tokens instead of ad-hoc inline classes.
  • Replaces native <button> elements across settings panels, sidebars, diff views, chat composer, and pull request UIs with the shared Button component.
  • Introduces getVirtualizedScrollFadeClassName utility for scroll fade styling and COMPOSER_INLINE_CHIP_DECORATOR_CLASS_NAME constant for decorator spans.
  • Risk: components still referencing removed legacy classes (e.g. workspace-topbar, surface-subheader, chat-timeline-scroll-fade, pull-requests-scroll-fade, settings-page-scroll-fade) will lose those styles; they must adopt the new utilities or data attributes.

Macroscope summarized 190dde8.

Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@github-actionsgithub-actionsBot added size:S 10-29 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. labels Aug 12, 2026
@github-actions

github-actionsBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire11.3 KiB11.3 KiB−8 B (−0.1%)15.1 KiB
CodexThread snapshot wire5.5 KiB5.5 KiB−2 B (−0.0%)7.3 KiB
CodexLive turn WebSocket wire5.9 KiB5.9 KiB−6 B (−0.1%)7.8 KiB
CodexLive turn WebSocket decoded49.7 KiB49.7 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire11.3 KiB11.3 KiB+5 B (+0.0%)15.1 KiB
ClaudeThread snapshot wire5.5 KiB5.5 KiB+7 B (+0.1%)7.3 KiB
ClaudeLive turn WebSocket wire5.9 KiB5.9 KiB−2 B (−0.0%)7.8 KiB
ClaudeLive turn WebSocket decoded50.6 KiB50.6 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 196c8ea · PR result: 190dde8 · Source CI: success

Scenario and decoded snapshot size

10 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.

  • Codex decoded thread snapshot: 94.6 KiB
  • Claude decoded thread snapshot: 95.4 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 12, 2026
@macroscopeapp

macroscopeappBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR adds a Macroscope configuration file (.macroscope/check-run-agents/ui-consistency.md), which requires human review per policy. Additionally, this is a major refactor that restructures shared UI primitives and consolidates global CSS into new utilities across 60+ files.

You can customize Macroscope's approvability policy. Learn more.

t3-codeBotand others added 2 commits August 12, 2026 21:37
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@t3-codet3-codeBot changed the title fix(web): align input group control stylingfix(web): unify control styling and terminal chromeAug 13, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 08:43

Dismissing prior approval to re-evaluate de22137

@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). and removed size:S 10-29 changed lines (additions + deletions). labels Aug 13, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 13, 2026
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@t3-codet3-codeBot changed the title fix(web): unify control styling and terminal chromerefactor(web): simplify global stylingAug 13, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 13:30

Dismissing prior approval to re-evaluate a44720b

@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Aug 13, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 13, 2026
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 13:38

Dismissing prior approval to re-evaluate 8e3066e

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 13, 2026
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 13:45

Dismissing prior approval to re-evaluate 8925f19

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 13, 2026
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 13:54

Dismissing prior approval to re-evaluate d471299

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 13, 2026
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 21:00

Dismissing prior approval to re-evaluate 578bf5b

juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Sep 1, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Sep 1, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Sep 1, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

refactor(web): simplify global styling - #6381

Merged
juliusmarminge merged 27 commits into
mainfrom
fix/ui-control-consistency
Aug 14, 2026
Merged

refactor(web): simplify global styling#6381
juliusmarminge merged 27 commits into
mainfrom
fix/ui-control-consistency

Conversation

@t3-code

@t3-codet3-codeBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

problem

shared controls and global styles had drifted away from the project’s component and tailwind conventions. component-owned geometry lived in index.css, dark token overrides used separate selectors, and repeated compact, glass, and search controls rebuilt primitive behavior with large call-site class strings.

fix

control consistency

  • compose icon-bearing searches with InputGroup or Input
  • add shared compact geometry to Button, Input, SelectTrigger, and Toggle
  • add reusable micro icon, muted ghost, and glass button variants
  • migrate keybinding editor controls to those shared sizes
  • replace raw PR search, reviewer search, panel add, banner dismiss, scroll-to-end, and review controls with core UI primitives
  • remove repeated control height, radius, focus, cursor, and color overrides from call sites
  • use the semantic --control-radius in InputGroup

canonical tailwind cleanup

  • nest equivalent dark token overrides with @variant dark
  • move simple component-owned topbar, subheader, sidebar brand, composer inset, and terminal chrome styles to static tailwind classes at their call sites
  • consolidate reusable complex glass surfaces plus topbar and virtualized-list scroll fades as @utility
  • retain browser, vendor, runtime-theme, generated-content, mask, pseudo-element, and custom-theme selector behavior in css where global ownership is intentional
  • remove stale one-use and page-specific classes, including .sidebar-brand* and duplicated chat/settings/pull-request scroll-fade selectors
  • remove exact dark-token repeats, dead terminal-scrollbar aliases, duplicate document/sidebar paint, and owner-duplicated composer positioning
  • share the virtualized model and branch picker fade contract while preserving the model picker’s native scrollbar lane; keep ScrollArea scrollFade for base-ui-owned viewports
  • preserve keyboard focus rings, pointer cursors, dropdown saturation, and composable elevation
  • add a Macroscope UI consistency check that carries these ownership, primitive, theme, emitted-CSS, virtualizer, and verification rules into future web PRs

apps/web/src/index.css is 397 lines and 11,229 bytes smaller than the latest merged main.

verification

  • git diff --check passed
  • formatting verified for all changed css/typescript files through oxfmt stdin mode
  • focused unit suite passed: 24 tests across 5 files
  • final merged-tree focused rerun passed: 119 tests across 7 files
  • web typecheck passed
  • production web build passed
  • emitted production css contains all three exact virtualized fade masks, preserves the 6px native scrollbar lane, and emits no malformed empty selector
  • real app verified in light and dark across chat, settings, keybindings, pull-request shells, and a scrolled model picker using the final shared utility
  • compact keybinding input/select/button geometry remained aligned without clipping in light and dark
  • independent reviews were run for the stylesheet and primitive-variant passes; actionable findings were fixed before publishing
  • the new Macroscope agent frontmatter, include scope, formatting, and clean-response contract were validated
  • pull-request content could not load on the borrowed test backend because its GitHub CLI is unavailable; the migrated PR chrome, topbar, split layout, error state, and theme styling rendered correctly

screenshots

theme search before, light

theme search before, light

theme search after, light

theme search after, light

theme search after, dark

theme search after, dark

chat shell after cleanup, light

chat shell after cleanup, light

chat shell after cleanup, dark

chat shell after cleanup, dark

settings after cleanup, light

settings after cleanup, light

settings after cleanup, dark

settings after cleanup, dark

pull-request shell after cleanup, light

pull-request shell after cleanup, light

pull-request shell after cleanup, dark

pull-request shell after cleanup, dark

shared model-picker scroll fade, light

shared model-picker scroll fade, light

shared model-picker scroll fade, dark

shared model-picker scroll fade, dark

agent

gpt-5.6-sol via hermes agent

request provenance


Note

Cursor Bugbot is generating a summary for commit 148b0fb. Configure here.

Note

Simplify global styling by replacing legacy CSS classes with utility-based variants and shared Button primitives

  • Replaces .dark-scoped CSS blocks with @variant dark/@variant light blocks in index.css, and adds new utility classes (surface-glass, dialog-glass, dropdown-glass, topbar-scroll-fade, virtualized-scroll-fade) that supersede several legacy class-based rules.
  • Adds compact and icon-micro sizes plus ghost-muted and glass variants to the shared Button, Input, Select, and Toggle components; dozens of components are updated to use these new tokens instead of ad-hoc inline classes.
  • Replaces native <button> elements across settings panels, sidebars, diff views, chat composer, and pull request UIs with the shared Button component.
  • Introduces getVirtualizedScrollFadeClassName utility for scroll fade styling and COMPOSER_INLINE_CHIP_DECORATOR_CLASS_NAME constant for decorator spans.
  • Risk: components still referencing removed legacy classes (e.g. workspace-topbar, surface-subheader, chat-timeline-scroll-fade, pull-requests-scroll-fade, settings-page-scroll-fade) will lose those styles; they must adopt the new utilities or data attributes.

Macroscope summarized 190dde8.

Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@github-actionsgithub-actionsBot added size:S 10-29 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. labels Aug 12, 2026
@github-actions

github-actionsBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire11.3 KiB11.3 KiB−8 B (−0.1%)15.1 KiB
CodexThread snapshot wire5.5 KiB5.5 KiB−2 B (−0.0%)7.3 KiB
CodexLive turn WebSocket wire5.9 KiB5.9 KiB−6 B (−0.1%)7.8 KiB
CodexLive turn WebSocket decoded49.7 KiB49.7 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire11.3 KiB11.3 KiB+5 B (+0.0%)15.1 KiB
ClaudeThread snapshot wire5.5 KiB5.5 KiB+7 B (+0.1%)7.3 KiB
ClaudeLive turn WebSocket wire5.9 KiB5.9 KiB−2 B (−0.0%)7.8 KiB
ClaudeLive turn WebSocket decoded50.6 KiB50.6 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 196c8ea · PR result: 190dde8 · Source CI: success

Scenario and decoded snapshot size

10 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.

  • Codex decoded thread snapshot: 94.6 KiB
  • Claude decoded thread snapshot: 95.4 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 12, 2026
@macroscopeapp

macroscopeappBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR adds a Macroscope configuration file (.macroscope/check-run-agents/ui-consistency.md), which requires human review per policy. Additionally, this is a major refactor that restructures shared UI primitives and consolidates global CSS into new utilities across 60+ files.

You can customize Macroscope's approvability policy. Learn more.

t3-codeBotand others added 2 commits August 12, 2026 21:37
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@t3-codet3-codeBot changed the title fix(web): align input group control stylingfix(web): unify control styling and terminal chromeAug 13, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 08:43

Dismissing prior approval to re-evaluate de22137

@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). and removed size:S 10-29 changed lines (additions + deletions). labels Aug 13, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 13, 2026
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@t3-codet3-codeBot changed the title fix(web): unify control styling and terminal chromerefactor(web): simplify global stylingAug 13, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 13:30

Dismissing prior approval to re-evaluate a44720b

@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Aug 13, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 13, 2026
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 13:38

Dismissing prior approval to re-evaluate 8e3066e

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 13, 2026
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 13:45

Dismissing prior approval to re-evaluate 8925f19

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 13, 2026
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 13:54

Dismissing prior approval to re-evaluate d471299

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 13, 2026
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 21:00

Dismissing prior approval to re-evaluate 578bf5b

juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Sep 1, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Sep 1, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Sep 1, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

refactor(web): simplify global styling - #6381

Merged
juliusmarminge merged 27 commits into
mainfrom
fix/ui-control-consistency
Aug 14, 2026
Merged

refactor(web): simplify global styling#6381
juliusmarminge merged 27 commits into
mainfrom
fix/ui-control-consistency

Conversation

@t3-code

@t3-codet3-codeBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

problem

shared controls and global styles had drifted away from the project’s component and tailwind conventions. component-owned geometry lived in index.css, dark token overrides used separate selectors, and repeated compact, glass, and search controls rebuilt primitive behavior with large call-site class strings.

fix

control consistency

  • compose icon-bearing searches with InputGroup or Input
  • add shared compact geometry to Button, Input, SelectTrigger, and Toggle
  • add reusable micro icon, muted ghost, and glass button variants
  • migrate keybinding editor controls to those shared sizes
  • replace raw PR search, reviewer search, panel add, banner dismiss, scroll-to-end, and review controls with core UI primitives
  • remove repeated control height, radius, focus, cursor, and color overrides from call sites
  • use the semantic --control-radius in InputGroup

canonical tailwind cleanup

  • nest equivalent dark token overrides with @variant dark
  • move simple component-owned topbar, subheader, sidebar brand, composer inset, and terminal chrome styles to static tailwind classes at their call sites
  • consolidate reusable complex glass surfaces plus topbar and virtualized-list scroll fades as @utility
  • retain browser, vendor, runtime-theme, generated-content, mask, pseudo-element, and custom-theme selector behavior in css where global ownership is intentional
  • remove stale one-use and page-specific classes, including .sidebar-brand* and duplicated chat/settings/pull-request scroll-fade selectors
  • remove exact dark-token repeats, dead terminal-scrollbar aliases, duplicate document/sidebar paint, and owner-duplicated composer positioning
  • share the virtualized model and branch picker fade contract while preserving the model picker’s native scrollbar lane; keep ScrollArea scrollFade for base-ui-owned viewports
  • preserve keyboard focus rings, pointer cursors, dropdown saturation, and composable elevation
  • add a Macroscope UI consistency check that carries these ownership, primitive, theme, emitted-CSS, virtualizer, and verification rules into future web PRs

apps/web/src/index.css is 397 lines and 11,229 bytes smaller than the latest merged main.

verification

  • git diff --check passed
  • formatting verified for all changed css/typescript files through oxfmt stdin mode
  • focused unit suite passed: 24 tests across 5 files
  • final merged-tree focused rerun passed: 119 tests across 7 files
  • web typecheck passed
  • production web build passed
  • emitted production css contains all three exact virtualized fade masks, preserves the 6px native scrollbar lane, and emits no malformed empty selector
  • real app verified in light and dark across chat, settings, keybindings, pull-request shells, and a scrolled model picker using the final shared utility
  • compact keybinding input/select/button geometry remained aligned without clipping in light and dark
  • independent reviews were run for the stylesheet and primitive-variant passes; actionable findings were fixed before publishing
  • the new Macroscope agent frontmatter, include scope, formatting, and clean-response contract were validated
  • pull-request content could not load on the borrowed test backend because its GitHub CLI is unavailable; the migrated PR chrome, topbar, split layout, error state, and theme styling rendered correctly

screenshots

theme search before, light

theme search before, light

theme search after, light

theme search after, light

theme search after, dark

theme search after, dark

chat shell after cleanup, light

chat shell after cleanup, light

chat shell after cleanup, dark

chat shell after cleanup, dark

settings after cleanup, light

settings after cleanup, light

settings after cleanup, dark

settings after cleanup, dark

pull-request shell after cleanup, light

pull-request shell after cleanup, light

pull-request shell after cleanup, dark

pull-request shell after cleanup, dark

shared model-picker scroll fade, light

shared model-picker scroll fade, light

shared model-picker scroll fade, dark

shared model-picker scroll fade, dark

agent

gpt-5.6-sol via hermes agent

request provenance


Note

Cursor Bugbot is generating a summary for commit 148b0fb. Configure here.

Note

Simplify global styling by replacing legacy CSS classes with utility-based variants and shared Button primitives

  • Replaces .dark-scoped CSS blocks with @variant dark/@variant light blocks in index.css, and adds new utility classes (surface-glass, dialog-glass, dropdown-glass, topbar-scroll-fade, virtualized-scroll-fade) that supersede several legacy class-based rules.
  • Adds compact and icon-micro sizes plus ghost-muted and glass variants to the shared Button, Input, Select, and Toggle components; dozens of components are updated to use these new tokens instead of ad-hoc inline classes.
  • Replaces native <button> elements across settings panels, sidebars, diff views, chat composer, and pull request UIs with the shared Button component.
  • Introduces getVirtualizedScrollFadeClassName utility for scroll fade styling and COMPOSER_INLINE_CHIP_DECORATOR_CLASS_NAME constant for decorator spans.
  • Risk: components still referencing removed legacy classes (e.g. workspace-topbar, surface-subheader, chat-timeline-scroll-fade, pull-requests-scroll-fade, settings-page-scroll-fade) will lose those styles; they must adopt the new utilities or data attributes.

Macroscope summarized 190dde8.

Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@github-actionsgithub-actionsBot added size:S 10-29 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. labels Aug 12, 2026
@github-actions

github-actionsBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire11.3 KiB11.3 KiB−8 B (−0.1%)15.1 KiB
CodexThread snapshot wire5.5 KiB5.5 KiB−2 B (−0.0%)7.3 KiB
CodexLive turn WebSocket wire5.9 KiB5.9 KiB−6 B (−0.1%)7.8 KiB
CodexLive turn WebSocket decoded49.7 KiB49.7 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire11.3 KiB11.3 KiB+5 B (+0.0%)15.1 KiB
ClaudeThread snapshot wire5.5 KiB5.5 KiB+7 B (+0.1%)7.3 KiB
ClaudeLive turn WebSocket wire5.9 KiB5.9 KiB−2 B (−0.0%)7.8 KiB
ClaudeLive turn WebSocket decoded50.6 KiB50.6 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 196c8ea · PR result: 190dde8 · Source CI: success

Scenario and decoded snapshot size

10 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.

  • Codex decoded thread snapshot: 94.6 KiB
  • Claude decoded thread snapshot: 95.4 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 12, 2026
@macroscopeapp

macroscopeappBot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR adds a Macroscope configuration file (.macroscope/check-run-agents/ui-consistency.md), which requires human review per policy. Additionally, this is a major refactor that restructures shared UI primitives and consolidates global CSS into new utilities across 60+ files.

You can customize Macroscope's approvability policy. Learn more.

t3-codeBotand others added 2 commits August 12, 2026 21:37
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@t3-codet3-codeBot changed the title fix(web): align input group control stylingfix(web): unify control styling and terminal chromeAug 13, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 08:43

Dismissing prior approval to re-evaluate de22137

@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). and removed size:S 10-29 changed lines (additions + deletions). labels Aug 13, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 13, 2026
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@t3-codet3-codeBot changed the title fix(web): unify control styling and terminal chromerefactor(web): simplify global stylingAug 13, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 13:30

Dismissing prior approval to re-evaluate a44720b

@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:M 30-99 changed lines (additions + deletions). labels Aug 13, 2026
macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 13, 2026
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 13:38

Dismissing prior approval to re-evaluate 8e3066e

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 13, 2026
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 13:45

Dismissing prior approval to re-evaluate 8925f19

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 13, 2026
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 13:54

Dismissing prior approval to re-evaluate d471299

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 13, 2026
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 13, 2026 21:00

Dismissing prior approval to re-evaluate 578bf5b

juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 28, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 29, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Aug 30, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Sep 1, 2026
Re-applies the deltas that mid-stack blob reverts discarded, and merges
main's work into the v2-owned surfaces:
- keybindings: main's STATIC_KEYBINDING_COMMANDS rename plus both new
commands (rightPanel.toggleMaximized alongside threadPanel.toggle)
- OpenInPicker: main's remote-open/SSH routing and favorite-editor
shortcut layered onto the branch's panel/toolbar variants; the
extracted shouldShowOpenInPicker now takes remoteOpenMode
- ChatMarkdown: main's bare-filename resolver (#6297) ported into the
branch's module-level component factory, plus #4133 title-attribute
stripping on links and images
- ComposerPrimaryActions: main's #4781 model (stop stays reachable, send
joins it when Enter-to-send is unavailable) carrying the branch's
steering send button
- ComposerPendingUserInputPanel: main's collapsible redesign with the v2
RuntimeRequestId and responseCapability gate
- ChatComposer: main's oversized-prompt submission guard wrapping the
branch's dispatch-mode send
- preview shell: main's container-aware width clamp ported into the
branch's usePreviewPanelInlineSize hook
- MessagesTimeline/Sidebar: main's day-aware timestamps, code-font tool
bodies and provider accent badges on the v2 runtime shell
- index.css: main's @variant dark migration (#6381) replaces the branch's
standalone .dark block
- contracts: main's send-turn image mime allowlist re-homed to
chatAttachment.ts, where v2 keeps the other send-turn limits
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Sep 1, 2026
…s style simplification
Main's #6381 deleted the shared .workspace-topbar and scroll-fade rules
from index.css after inlining them at main's own call sites, but this
branch's slim chat chrome still references both classes. The round-8
rebase took the deletion without migrating the branch call sites, so the
header collapsed to zero height — the breadcrumb sat on the window edge,
timeline rows scrolled unfaded through it, and the thread-details popover
anchored to the collapsed header.
Restores both as composable utilities in #6381's own style: a
workspace-topbar utility for the titlebar rows, and the branch's
chat-timeline-scroll-fade mask (soft ramp plus a full-height scrollbar
column). Also drops the duplicated media override and its dead
settings-page-scroll-fade selector.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
juliusmarminge added a commit that referenced this pull request Sep 1, 2026
…ation
A follow-up sweep against #6381 found the branch still carrying the
pre-simplification forms it replaced, which my earlier fix had papered
over with a compat utility instead of finishing the migration:
- ChatView now uses main's inlined titlebar sizing and the
data-workspace-titlebar-controls hook on both control clusters. The
class-based markup was silently missing the themed-toggle bridge
(html[data-theme-id] [data-workspace-titlebar-controls] …), so custom
themes lost their titlebar accent in the thread view.
- The scroll-to-end pill becomes main's Button size="xs" variant="glass"
instead of a hand-rolled button recreating it.
- MessagesTimeline uses main's consolidated topbar-scroll-fade utility;
the byte-identical chat-timeline-scroll-fade copy and the
workspace-topbar compat utility are gone.
- The composer-glass dark rules move into nested @variant dark like
main's (the raw .dark duplicates could drift from the nested copies
they shadowed), including the branch-only queue strip.
- The pre-#6381 dialog-glass/dialog-backdrop/dropdown-glass class rules
and their .dark variants are deleted: the #6381 utilities plus
call-site shadow utilities own every declaration, and the stale
dropdown rule still had the saturate-less backdrop-filter. The dead
model-picker-surface dark rule goes with them.
index.css now has zero raw .dark selectors outside the variant
definitions, matching the doctrine in
.macroscope/check-run-agents/ui-consistency.md. Verified against the
emitted production CSS: dark variants compile to :is(.dark,.dark *) with
their @supports color-mix fallbacks intact.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@juliusmarminge