fj-index
One repository, one line. The rail runs behind every node and stops half a row short at each end, so the line terminates on a node rather than on a cut (RAIL-2). The node vocabulary names FORM, never meaning: the same filled disc reads as "pushed this week" on an index and "on the current ref" in a log (RAIL-3).
rest
Four rungs of the ladder on one line: name --fj-primary size-4 medium, sha --fj-faint size-2, subject --fj-muted size-3, date --fj-faint size-2 aligned to the right margin (COMP-4). Single-line, because nothing here is a second independent fact (DENS-1, DENS-2).
Repositories4
the node vocabulary
Filled, half-weight, hollow, and a square rotated 45 degrees. Four forms, one geometry. The merge form is a SHAPE rather than a fourth colour, so the vocabulary survives a monochrome print and a colour-blind reader (COLOR-5). Adding a fifth reading means adding it to the spec's table first (RAIL-4). RAIL-3 states the middle step as "filled at 45%"; it is drawn in --fj-primary-half rather than in 45% opacity, because the node carries meaning and COLOR-6's 3:1 floor has no exception list.
- filled
- half-weight
- hollow
- merge
- merge, filled
hover
The row lifts to --fj-surface, the node fills to --fj-primary, and the link gains an underline. Never geometry, never size, never position.
focus-visible
The ring is on the row's only tab stop, the name. Tab into the list below to see it: this one is live rather than forced, because a focus ring you cannot reach with the keyboard is the thing DNA-5 is about.
cursor (j / k)
The row washes to --fj-select-wash and the node gains a --fj-marker ring in --fj-primary. It lives in the rail's own column, so keyboard navigation adds no new vocabulary (RAIL-5, STATE-CURSOR-3). It is carried by data-cursor rather than by :focus-visible, so a reader who clicked and then pressed j still sees where they are (STATE-CURSOR-4).
cursor and hover together
STATE-PREC-2: the two must stay distinguishable when both apply. The cursor is carried by the node's ring, hover by the surface lift, so a row that is both reads as both.
active
The background deepens one surface step. No transform (STATE-ACTIVE).
disabled
Every rung collapses to --fj-faint and the name stops being a link: the affordance is removed, not painted over. The node's border drops from --fj-mark to --fj-rule, because a disabled row's node encodes nothing and a boundary that encodes nothing has no contrast floor (COLOR-6).
- repo-archived30ede92still clears 4.5:1; disabled is not illegible2026-07-25
truncated
Single-line, ellipsis at the end, full value in title, never wraps and never reflows the row (DENS-4). Narrow this window to watch the subject give way while the name, the sha and the date hold their columns.
- repo-control-plane-asyncd27c798Merge pull request 'accounts: wire the KeyEvent key-set into the advance gate (Slice A)' (#8) from feat/keyevent-advance-gate into main2026-07-30
tall row
DENS-2: --fj-row-tall only where a second independent fact cannot be truncated onto the first line. A commit row qualifies; an index row does not, which is why the specimen here is a commit. DENS-6: nothing is ever taller than this.
- Merge pull request 'accounts: fjord-web login, read-only (Slice S1)' (#1)Stephen Way / 2026-07-30 / 2 parents
- accounts: fjord-web login (Slice S1)Stephen Way / 2026-07-30 / 24 files changed
loading
aria-busy on the region and a word in the eyebrow's count slot. The rail still renders, so the page does not change shape when the rows arrive.
Repositoriesloading
Loading repositories
empty
One left-aligned line in --fj-muted, on the content column, with the rail rendered as a single node stub. Never centred (DNA-4), never illustrated, never an emoji (AP-10).
Repositories0
No repositories yet. Push one with a git client.
error
A hairline region with a --fj-del border, a SIGN GLYPH, and the message in --fj-ink. The sign is a required parameter, so an error rendered through this binding cannot lose its non-colour carrier (COLOR-5, A11Y-5).
rest
Four rungs of the ladder on one line: name --fj-primary size-4 medium, sha --fj-faint size-2, subject --fj-muted size-3, date --fj-faint size-2 aligned to the right margin (COMP-4). Single-line, because nothing here is a second independent fact (DENS-1, DENS-2).
Repositories4
the node vocabulary
Filled, half-weight, hollow, and a square rotated 45 degrees. Four forms, one geometry. The merge form is a SHAPE rather than a fourth colour, so the vocabulary survives a monochrome print and a colour-blind reader (COLOR-5). Adding a fifth reading means adding it to the spec's table first (RAIL-4). RAIL-3 states the middle step as "filled at 45%"; it is drawn in --fj-primary-half rather than in 45% opacity, because the node carries meaning and COLOR-6's 3:1 floor has no exception list.
- filled
- half-weight
- hollow
- merge
- merge, filled
hover
The row lifts to --fj-surface, the node fills to --fj-primary, and the link gains an underline. Never geometry, never size, never position.
focus-visible
The ring is on the row's only tab stop, the name. Tab into the list below to see it: this one is live rather than forced, because a focus ring you cannot reach with the keyboard is the thing DNA-5 is about.
cursor (j / k)
The row washes to --fj-select-wash and the node gains a --fj-marker ring in --fj-primary. It lives in the rail's own column, so keyboard navigation adds no new vocabulary (RAIL-5, STATE-CURSOR-3). It is carried by data-cursor rather than by :focus-visible, so a reader who clicked and then pressed j still sees where they are (STATE-CURSOR-4).
cursor and hover together
STATE-PREC-2: the two must stay distinguishable when both apply. The cursor is carried by the node's ring, hover by the surface lift, so a row that is both reads as both.
active
The background deepens one surface step. No transform (STATE-ACTIVE).
disabled
Every rung collapses to --fj-faint and the name stops being a link: the affordance is removed, not painted over. The node's border drops from --fj-mark to --fj-rule, because a disabled row's node encodes nothing and a boundary that encodes nothing has no contrast floor (COLOR-6).
- repo-archived30ede92still clears 4.5:1; disabled is not illegible2026-07-25
truncated
Single-line, ellipsis at the end, full value in title, never wraps and never reflows the row (DENS-4). Narrow this window to watch the subject give way while the name, the sha and the date hold their columns.
- repo-control-plane-asyncd27c798Merge pull request 'accounts: wire the KeyEvent key-set into the advance gate (Slice A)' (#8) from feat/keyevent-advance-gate into main2026-07-30
tall row
DENS-2: --fj-row-tall only where a second independent fact cannot be truncated onto the first line. A commit row qualifies; an index row does not, which is why the specimen here is a commit. DENS-6: nothing is ever taller than this.
- Merge pull request 'accounts: fjord-web login, read-only (Slice S1)' (#1)Stephen Way / 2026-07-30 / 2 parents
- accounts: fjord-web login (Slice S1)Stephen Way / 2026-07-30 / 24 files changed
loading
aria-busy on the region and a word in the eyebrow's count slot. The rail still renders, so the page does not change shape when the rows arrive.
Repositoriesloading
Loading repositories
empty
One left-aligned line in --fj-muted, on the content column, with the rail rendered as a single node stub. Never centred (DNA-4), never illustrated, never an emoji (AP-10).
Repositories0
No repositories yet. Push one with a git client.
error
A hairline region with a --fj-del border, a SIGN GLYPH, and the message in --fj-ink. The sign is a required parameter, so an error rendered through this binding cannot lose its non-colour carrier (COLOR-5, A11Y-5).