Draw static states as the completed braille path - #87
Merged
Conversation
Member
Author
|
Updated the static states per the dev Space feedback.
Before/after sheet (republished at the existing URL): https://lvwerra-agent-artifacts.static.hf.space/pr87-braille-status-marks.html |
Member
Author
|
Updated #87 for the pane-header parity feedback at
Republished comparison sheet; each frame shows all three surfaces together: https://lvwerra-agent-artifacts.static.hf.space/pr87-braille-status-marks.html |
This was referenced Aug 18, 2026
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.
Follow-up to #82 for the operator's status-mark feedback: non-working states should read as the working braille spinner's completed path, and that mark must render identically in every surface that consumes it.
What changed
The working sequence remains
⠋⠙⠹⠸⠼⠴⠦⠧. Waiting, idle and stopped draw the same square-cornered hollow rectangle over the six-dot extent:That is intentionally one static silhouette. Waiting, idle and stopped are not shape-distinguishable in grayscale; they use the requested accent / muted / dim treatment and surrounding state text where present.
Context parity
#84 places the same
.statusinside.ph-title, whose text is weight 600. Before this revision the mark inherited that weight: the pane-title⠋rendered 6.00 × 5.875px / 16.34px² alpha area, versus 5.50 × 5.375px / 10.04px² at weight 400 in the sidebar and reader. That confirms the operator's heavier, incompletely-disappearing dots were a real font-weight change, not a second mark implementation.The shared contract now includes
--mark-weight: 400. Every renderer owns its family, 12.5px size, weight, and line-height, so a 600- or 700-weight parent cannot change it. This covers state marks, Overview progress/group marks, and the reader's working mark.The cell was centred before, but its ink was not. The natural braille ink sits 0.90625px above the cell centre; the 600-weight 12px pane title's x-height centre is another 0.5px below that centre. I chose optical alignment to the adjacent x-height rather than box-only alignment: moving and static marks receive the same 1.40625px downward correction. The render test measures the header baseline/x-height and pins their centres within 0.2px.
Measured geometry
With bundled
GeistMono.woff2at 12.5px in Chromium, rasterised at 16× and measured at alpha ≥ 16:⠿ink: 5.50 × 8.8125pxChromium quantises CSS border widths to whole CSS pixels:
1.875pxpaints as1px, so the path uses the nearest paintable stroke, 2px. If the bundled font fails and a fallback has different braille metrics, the animated glyph can drift relative to the path; the path deliberately remains tied to the shipped font's measurement.The base
.statusrule remains untouched. Usage provider dots and Settings ready dots remain ordinary 8 × 8 caller-coloured dots. No #84/header component code or Sidebar markup is changed here.Verification
npm test— green.npm run test:render— green. It embeds the bundled font, re-measures the ink, reproduces normal/700-weight/600-weight contexts, proves all marks compute to weight 400, checks shared working/static geometry, measures pane-title x-height alignment, exercises the reader/Overview spinner variants, and pins the bare-dot regressions.npm run build— green.ov-spinin the before and after builds; the captures use reduced motion only to hold one comparable frame.Before/after parity sheet — both themes, all three surfaces in each frame →