LearnNewsExamplesServices
Frontmatter
id16336
titleWorkstation dock rails: anti-theme label colors + clipped left label
stateClosed
labels
bugdesignai
assigneesneo-fable
createdAtAug 2, 2026, 12:35 PM
updatedAtAug 2, 2026, 3:30 PM
githubUrlhttps://github.com/neomjs/neo/issues/16336
authorneo-fable
commentsCount1
parentIssue15252
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtAug 2, 2026, 3:30 PM

Workstation dock rails: anti-theme label colors + clipped left label

Closed Backlog/active-chunk-11 bugdesignai
neo-fable
neo-fable commented on Aug 2, 2026, 12:35 PM

Context

Operator report during flagship-film readiness review (2026-08-02): the bottom "footer info bar" reads white-on-light-green in the light theme and black-on-dark-green in the dark theme — inverted contrast both ways — with its text flush against the left edge; plus an "info bar at the left edge without content." Live-verified this session in both themes on the dev server; this ticket carries the measured mechanism. These bars are film-visible shell chrome: the flagship recording (#15252) shows the workstation in both themes, so this is a readiness gate for any take.

Live latest-open sweep: checked latest 20 open issues at 2026-08-02T10:04Z; no equivalent found. A2A claim sweep (herd window): no overlapping lane-claim.

The Problem

Both reported bars are the collapsed auto-hide dock rails (autoHidden: true items in the opening document — apps/workstation/tour/denseWorkstation.mjs:33 graph → left rail, :39 inspector → bottom rail). The feature is intentional; three presentation defects make it read as broken:

  1. Anti-theme label ink, both themes — measured computed styles, dev head:
Element dark theme light theme
.neo-dashboard-dock-edge-rail background srgb(0.111, 0.226, 0.233) — dark green, intended srgb(0.760, 0.845, 0.859) — light green, intended
.neo-dashboard-dock-rail-tab computed color rgb(214, 220, 230) = workstation ink ✓ rgb(31, 39, 51) = workstation ink ✓
.neo-button-text span (what renders) rgb(0, 0, 0) ✗ black on dark green rgb(255, 255, 255) ✗ white on light green

The rail-tab BUTTON computes the correct workstation ink; the inner .neo-button-text span is re-colored by the generic button skin's descendant tokens and lands anti-theme both ways. The app skin already documents this exact mechanism for the tourbar — resources/scss/src/apps/workstation/Workspace.scss:192 ("Beat generic button focus/pressed descendant colors without relying on theme load order") — the rail-tabs never received that treatment.

  1. Zero inline start gap. Rail-tab padding is 4px 1px (shared base), so the bottom label renders ~1px from the workspace edge — the reported "text starts at the left edge without a gap."

  2. Left rail label clipped to invisible. The vertical (writing-mode: vertical-rl) rail-tab measures 48px physical width inside the 14px overflow: hidden rail; its label span lands entirely outside the strip (span x≈32 vs rail x 12→26). The rail shows as an empty pill — the reported "info bar without content." The label ("Dependency Graph Explorer") exists in the DOM.

The Architectural Reality

  • Shared base: resources/scss/src/dashboard/Container.scss:142-181 — rail strip anatomy (14px cross-axis, padding: 4px 1px, 11px/1 label) plus the in-file comment documenting the generic-button-token battle, including the law "equal-specificity load-order ties are not a contract." Component: src/dashboard/DockRail.mjs.
  • Workstation layer: resources/scss/src/apps/workstation/Workspace.scss:91-104 styles the rail surface and sets color: var(--workstation-ink) on .neo-dashboard-dock-rail-tab — but not on its descendants, which is exactly where the generic skin re-colors.
  • Proven sibling fix: resources/scss/src/apps/agentos/fleet/FleetCockpit.scss:26-45.neo-dashboard-dock-rail-tab.neo-button { color: …; min-width: 0; border: 0; … .neo-button-glyph, .neo-button-text { color: inherit } } with a quiet hover idiom. Production AgentOS (per the Container.scss comment) fits an 18px label inside the 14px strip — the vertical-label fit is achievable.
  • Token authority: workstation owns its palette (resources/scss/theme-neo-light/apps/workstation/Viewport.scss + the theme-neo-dark twin). Zero CSS-in-JS — SCSS token/skin layers only.

The Fix

App-scope first (see Avoided Traps): in the Workstation layer,

  1. Lift the FleetCockpit rail-tab pattern into workstation tokens: add .neo-button-glyph, .neo-button-text { color: inherit } under the existing rail-tab rule (plus the hover idiom if desired) — kills the anti-theme span in both themes.
  2. Give the horizontal (bottom) rail label an inline start gap — app-scope padding override (e.g. padding: 4px 10px scoped to .neo-dashboard-dock-edge-rail-bottom .neo-dashboard-dock-rail-tab, or rail-level padding-inline).
  3. Root-cause the 48px physical width of the workstation vertical rail-tab so the left label renders inside the strip. First suspect set: the properties FleetCockpit's block overrides (min-width: 0, border: 0, generic button anatomy); second: the generic button height pin named by the Container.scss comment.

If the root cause turns out to be shared (Container.scss), fix there ONLY with a FleetCockpit right-rail regression check in the same PR.

Acceptance Criteria

  • Dark theme: rail labels render workstation ink (not black) on the dark-green rails; light theme: workstation ink (not white) on the light-green rails — verified via computed style on .neo-dashboard-dock-rail-tab .neo-button-text, live, both themes.
  • Bottom rail label has a visible inline start gap (≥8px effective) from the workspace edge.
  • Left rail shows "Dependency Graph Explorer" legibly inside the rail in both themes (or the strip grows to fit per the shared anatomy contract — claimant's call, documented in the PR).
  • No FleetCockpit right-rail regression (visual check, both themes).
  • SCSS token/skin layers only (zero CSS-in-JS); auto-hide flyout behavior untouched.

Out of Scope

  • Auto-hide feature semantics (autoHidden flag, flyout behavior) — working as designed.
  • The a11y naming gap (rail/tab buttons expose no accessible names in the accessibility tree — separate audit seed).
  • Body-level vs viewport-level theme-class propagation (probe artifact from this session: the neo-body element kept neo-theme-neo-dark through an app-level theme flip while rail tokens flipped correctly; if you see "impossible" token values, check WHICH element carries the live theme class before concluding — resolving that split is not this ticket).
  • Film choreography/narrative (owned elsewhere in the #15252 family).

Avoided Traps

  • Shared-skin-first fix: Container.scss serves FleetCockpit too; an app-scope fix in the Workstation layer is regression-free by construction. Only go shared with the regression check in-PR.
  • Specificity roulette: the Container.scss comment is law — "equal-specificity load-order ties are not a contract." Match the established compound idioms (.neo-dashboard .neo-button.neo-dashboard-dock-rail-tab shared-side / .neo-dashboard-dock-rail-tab.neo-button app-side); do not invent a new specificity tier.
  • Widening the shared 14px strip globally — the slim strip IS the collapsed-affordance design; workstation-scope any geometry change.

Related

  • #15252 — flagship film epic; this ticket is an app-readiness gate for the recording
  • Precedents: Workspace.scss:192-200 (tourbar descendant-color fix), FleetCockpit.scss:26-45 (rail-tab pattern), Container.scss:142-181 (shared anatomy + comment)
  • apps/workstation/tour/denseWorkstation.mjs:33 / :39 — the two autoHidden items

Origin Session ID: cc037e9f-7577-4a11-968d-7a5fe3c8db8d

Retrieval Hint: "workstation dock rail styling anti-theme film readiness"

UNASSIGNED — claimable, any family. Small, precise, fully measured. My seat stays on the narrative/show-order lane per the operator's collaborate steer.

tobiu referenced in commit a5eb2f6 - "fix(workstation): re-skin the dock auto-hide rails (#16336) (#16349) on Aug 2, 2026, 3:30 PM
tobiu closed this issue on Aug 2, 2026, 3:30 PM