Repository navigation
fix(web): restore the settlement link and fade late panel content - #101
Closed
selezenart wants to merge 12 commits into
Closed
selezenart wants to merge 12 commits into
selezenart wants to merge 12 commits into
Conversation
The console shipped unreadable text in both themes from one mistake made in two directions. --os-panel and --os-field are the same colour in light and dark and carry their own fixed inks; --os-ground and --os-surface flip with the theme. Pairing one family's ink with the other family's surface is invisible in exactly one theme, so each instance survived review done in the other one: the tab strip used panel ink on the page ground, and the quote and paid-API summaries used panel ink on the lime field. Pair each surface with the ink family that owns it, and add a structural guard that resolves every rule's nearest painting ancestor and fails on any fixed ink over a flipping surface. Verified against the previous stylesheet: it reports all six pairings that existed there. Also in the cabinet: - Remove the Wallet & permissions and Developer access sections. Both were read-only restatements of facts the other sections already show, and neither had a control behind it. - Give .panel-heading a rule. It had none, so every panel that pairs a title with an action stacked them flush. - Let the hero copy sit in normal flow and set its own height, measured and fed to the clip paths, instead of overflowing a fixed 268px box by an amount that varied with the viewport. Drop the 820px cap so the hero spans the shell like the nav and tabs around it. - Lay the x402 and recovery controls out on a grid so label, field and help text each get a row, and style a.secondary, which was only ever styled for button. - Scale type once at the root rather than per component, so the console is not set at laptop sizes on a large display. - Fade surfaces on theme change and panels on tab switch, under prefers-reduced-motion: no-preference. Adds --os-on-field-muted and --os-field-line: a surface that does not flip needs a muted ink and a border line that do not flip either.
Merging develop left the branch uncompilable: Hero carried both a `height` prop and a `height` state, and the cabinet kept this branch's narrowed section union while still rendering develop's panels, so four section names had no type to belong to. Reconcile rather than pick a side: - Hero measures itself by default, which is what stops the workspace copy clipping at widths where the headline wraps. The `height` prop stays as an explicit override for the landing page, which sizes its hero to a layout rather than to its copy. Only a pinned hero gets an inline height; feeding the measured value back would rebuild the fixed box the measurement exists to avoid. - Take develop's cabinet vocabulary, then apply this branch's request to it. The two sections asked to be removed were not gone, they were renamed: Spending rules was Wallet & permissions, Team & access was Developer access. Both are read-only restatements with no control behind them, so the cabinet is Overview, API services, Requests and Payment proof, and the two panels behind them are deleted rather than left unreferenced. - Drop this branch's enumerated ink overrides. Develop solved the same problem more generally by rebinding --os-panel-ink and --os-accent-ink at each surface boundary, so descendants inherit the right ink instead of every descendant being listed; its version also gets `.quote-panel` right, which moved onto --os-surface in the redesign. Only the --os-field-line border, which develop lacks, is kept. The structural guard survives and is what caught the regressions above. One of its assertions was wrong rather than the stylesheet: `.console-container .tabs button` legitimately takes panel ink because that container paints --os-panel, and an unanchored regex was matching it as a substring.
The browser contrast checks run immediately after navigation. With motion enabled, axe samples while the cabinet panel is still fading in and reads every colour composited against what is behind it: panel ink measured as #bdd1c2 on #4d6b64 rather than #a9c4b2 on #0b332c, and page ink as #728876 on #f4f7f1 rather than #3f5c46 on #edf1e9. Ninety-eight reported violations, none of them real. All motion in styles.css sits behind prefers-reduced-motion: no-preference, so emulating a reduced-motion viewer settles the page before the audit instead of suppressing a genuine failure.
The browser acceptance spec iterated a six-label list and clicked each one. Spending rules and Team & access are gone, so the click timed out on a tab that no longer renders. Note the markdownlint findings under .superpowers/ are pre-existing and outside this branch.
Gate A caught this: taking develop's redesigned JobWorkspace.tsx wholesale also
took back `<section className="panel">`, dropping the `paid-api-panel` class.
The grid rules stayed in the stylesheet with nothing wearing them, so the x402
request key rendered inline with the text before it and its help text ran on
after it — criterion 7 undone, while every check stayed green.
Nothing caught it because the style tests assert stylesheet text and the
browser specs never look at that field. So add the structural guard: every
class this stylesheet declares must be rendered by some component. It resolves
names built by interpolation (`state-${...}`) and ignores classes the read-only
slices declare. Verified against the defect — dropping the class again fails
with exactly ['paid-api-panel'].
Also from the same review:
- Remove the .recovery-panel rules. They targeted a cabinet section develop
replaced with PaymentProtectionPanel, which lays its own controls out; the
markup they addressed no longer exists.
- Bind --os-on-field-muted. It was defined and audited for contrast but had no
consumer once the enumerated overrides gave way to token rebinding, so the
lime field had no muted ink. .paid-api-status now rebinds to it.
Four classes dead before this branch (brand-logo, fixture-toolbar, meta-code,
workspace-fact-grid) are recorded in the guard rather than removed here, so it
ratchets instead of pulling unrelated rules into this change.
…ility-and-layout # Conflicts: # apps/web/src/App.tsx
…the light ground Three light-theme and motion defects reported from the workspace. The ArcScan link in a request's settlement box was invisible in the light theme. `.job-list li` rebinds --os-accent-ink to the page ink for the card around it, but the settlement box inside repaints --os-panel, so the link rendered forest ink on the forest box. It read correctly in dark, which is how it shipped. The box now rebinds the ink tokens its own descendants inherit, the same way .paid-api-status does for the lime field. Tab panels appeared instantly while the strip above them faded, for two separate reasons. The console panel was never wrapped in `.tab-fade` and had no key at all. The cabinet panel was wrapped, but the request list arrives from the API after mount, so the 0.24s fade ran on the "Checking requests…" placeholder and was over before any row existed. The console panel is now keyed on its tab, and the list body is keyed on its loading state, so the fade runs on the content the operator actually waited for. The light page ground moves to the lime #EAFFBC from the design canvas. Contrast holds: ink 12.81:1, ink-muted 6.90:1, accent-ink 5.09:1 (up from 4.79:1). Unselected tabs now paint --os-surface rather than letting that ground show through, so the strip reads as a row of cards; with their own flipping surface they take the flipping page ink, which makes the console strip's --os-panel-ink override both wrong and unnecessary.
Deploying with
|
| Status | Name | Latest Commit | Updated (UTC) |
|---|---|---|---|
| ✅ Deployment successful! View logs |
oneshot | 9c30a4f | Sep 12 2026, 06:00 PM |
…ility-and-layout # Conflicts: # apps/web/src/styles.css # apps/web/test/styles.test.ts
The light --os-ground returns to #edf1e9 and unselected tabs are transparent again, restoring the console strip's panel-ink override that only became wrong while those tabs carried their own surface. The settlement-link ink fix and the tab-panel fades are unaffected.
Collaborator
Author
|
Superseded: reopening the two workspace fixes on a fresh branch cut from current develop, without the withdrawn ground and tab changes. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Two reported defects in the operator workspace: an ArcScan link that was invisible in the light theme, and tab panels whose content appeared without the intended fade.
--os-panelinside.job-list li, which rebinds--os-accent-inkto the page ink for the lighter card around it. The ArcScan link therefore rendered forest ink on the forest box. It read correctly in dark, which is how it shipped. The box now rebinds the ink tokens its own descendants inherit, the same way.paid-api-statusdoes for the lime field..tab-fadeand had no key at all. The cabinet panel was wrapped, but the request list arrives from the API after mount, so the 0.24s fade ran on the "Checking requests…" placeholder and finished before any row existed. The console panel is now keyed on its tab, and the list body on its loading state.A lime
#EAFFBCpage ground and a matching tab surface were implemented and then withdrawn at the requester's instruction. The revert is complete:packages/brand/src/tokens.cssis byte-identical todevelop, the tab strip is unchanged, and the console strip's--os-panel-inkoverride is restored.Scope and acceptance criteria
--os-state-committedon--os-panelis ≈7.5:1, underlined so it reads as a link.develop.Product and security invariants
Invariant notes:
Presentation only. No change to
api,worker,contracts,storage, or any settlement path; the one-intent/one-settlement invariant is untouched. The JSX changes are a wrapper element plus akey, confirmed by a whitespace-only semantic diff ofJobWorkspace.tsx.Validation
Commands and results:
Independent review evidence
Gate A — exact candidate tree before push
ff146e49407b078183ed619ff3f3b2e11b17da2cd60472acfa2e945b7338424c38c13b6ebdd7993f9c30a4f03ed50549987e24288e9bb8709027b8c5free-pi-clinot exposed by platformVERDICT: PASSBLOCKING_FINDINGS: None. Non-blocking: the local Node version differs from the pinned engine, so CI must validate the pinned runtime; and the late-row fade depends on the loading flag toggling, so a future polling change that updates rows without it would not replay the fade.Two earlier Gate A runs passed on superseded trees:
140b7af…(included the withdrawn ground/tab work) and238209cb…(before a markdownlint fix in the context record). The verdict above is the fresh review of the current tree.Gate B — exact remote PR head
Pull request URL/number: this PR
Remote head commit SHA:
9c30a4f03ed50549987e24288e9bb8709027b8c5Remote head tree SHA:
d60472acfa2e945b7338424c38c13b6ebdd7993fReviewer tool:
free-pi-cliReviewer model: not run
Verdict: skipped at the requester's explicit instruction
Findings or residual risks: Gate B was deliberately skipped for this change. This is a recorded deviation from
.agent/IMPLEMENTATION_LOOP.md§7, not a pass. The human merger should treat the independent-review evidence as Gate A only.Gate B reviewed the current remote head and matches Gate A's approved tree, or a fresh Gate A was run for the changed tree.
Agent policy / repository-policyand all applicable CI checks pass.Risk and rollback
Human merge