fjord-ui
A centralized definition of how every fjord surface looks and behaves, consumed as a dependency rather than copied. This gallery is the reference, and it is written in the same framework, the same renderer and the same asset pipeline as the consumer, so a component that renders correctly here renders correctly at /r.
the section header
COMP-3: the only section header in the system. Uppercase, tracked, --fj-size-1, --fj-muted, an optional count in --fj-accent, and a hairline that runs to the right margin. INV-EARN names the job that hairline does: it ties the left and right edges of the column together, and it is the only trailing rule in the system.
Repositories20
Files at HEAD
Recent commitsloading
the prose exception
TYPE-2: the one proportional face, opted into per BLOCK, on paragraphs a person wrote in sentences. TYPE-3 applies inward: a sha, a path or a ref inside such a paragraph reverts to mono at 0.94em, which is what makes the distinction legible rather than decorative. Nothing at /r renders a prose block yet (spec open question 5); the rule ships first so the first one that does cannot ship shas set in a sans.
The login slice is deliberately read-only. It establishes a session and a signed-in identity, and it stops there: no write path reaches the daemon, and no route added in this change mutates anything. That boundary is the point of the slice, and it is what makes the canary safe to run against production data.
The cookie work lives in src/app.rs, which now imports RouterBuilderCookieExt and sets CACHE_CONTROL and VARY on every authenticated response. See e6d13d5 for the whole change, and feat/accounts-s1-login for the branch.
Everything a machine said stays in mono, inside the paragraph.
a rendered document
The same block, given what a README actually contains. The rhythm is Press: sibling spacing measured in line boxes rather than in pixels, a looser gap before a heading than after it, and a list indent. Before Press this block had a paragraph margin and nothing else, so every heading and every list in the fleet fell through to the user agent -- which renders, and renders wrong, and looks deliberate. The steps are this system's own: --fj-size-6 for the h2, --fj-size-5 for the h3, and --fj-weight-strong rather than the browser's 700.
Sessions
A session is established at sign-in and carried in a cookie. It is not a token: nothing outside the daemon can mint one, and nothing inside it can widen the scope of one already issued.
What the slice does not do
Three things, deliberately:
- No write path reaches the daemon.
- No route added in src/app.rs mutates anything, including the ones behind RouterBuilderCookieExt.
- Nothing is cached across identities. CACHE_CONTROL and VARY are set on every authenticated response:
- a nested list keeps its indent at any depth,
- and does not take the sibling gap between its items.
Rolling it back
- Revert e6d13d5.
- Drop feat/accounts-s1-login.
An ordered list is the same rhythm with a different marker. Neither carries a boundary: a prose block is not a card.
the section header
COMP-3: the only section header in the system. Uppercase, tracked, --fj-size-1, --fj-muted, an optional count in --fj-accent, and a hairline that runs to the right margin. INV-EARN names the job that hairline does: it ties the left and right edges of the column together, and it is the only trailing rule in the system.
Repositories20
Files at HEAD
Recent commitsloading
the prose exception
TYPE-2: the one proportional face, opted into per BLOCK, on paragraphs a person wrote in sentences. TYPE-3 applies inward: a sha, a path or a ref inside such a paragraph reverts to mono at 0.94em, which is what makes the distinction legible rather than decorative. Nothing at /r renders a prose block yet (spec open question 5); the rule ships first so the first one that does cannot ship shas set in a sans.
The login slice is deliberately read-only. It establishes a session and a signed-in identity, and it stops there: no write path reaches the daemon, and no route added in this change mutates anything. That boundary is the point of the slice, and it is what makes the canary safe to run against production data.
The cookie work lives in src/app.rs, which now imports RouterBuilderCookieExt and sets CACHE_CONTROL and VARY on every authenticated response. See e6d13d5 for the whole change, and feat/accounts-s1-login for the branch.
Everything a machine said stays in mono, inside the paragraph.
a rendered document
The same block, given what a README actually contains. The rhythm is Press: sibling spacing measured in line boxes rather than in pixels, a looser gap before a heading than after it, and a list indent. Before Press this block had a paragraph margin and nothing else, so every heading and every list in the fleet fell through to the user agent -- which renders, and renders wrong, and looks deliberate. The steps are this system's own: --fj-size-6 for the h2, --fj-size-5 for the h3, and --fj-weight-strong rather than the browser's 700.
Sessions
A session is established at sign-in and carried in a cookie. It is not a token: nothing outside the daemon can mint one, and nothing inside it can widen the scope of one already issued.
What the slice does not do
Three things, deliberately:
- No write path reaches the daemon.
- No route added in src/app.rs mutates anything, including the ones behind RouterBuilderCookieExt.
- Nothing is cached across identities. CACHE_CONTROL and VARY are set on every authenticated response:
- a nested list keeps its indent at any depth,
- and does not take the sibling gap between its items.
Rolling it back
- Revert e6d13d5.
- Drop feat/accounts-s1-login.
An ordered list is the same rhythm with a different marker. Neither carries a boundary: a prose block is not a card.