Drawn to scale.
One system, every component.
The blueprint style drafts the system in
design-system-blueprint.css:
Newsreader headings with an italic aside, Barlow for reading, a 24px grid under
everything and each card's meta line boxed as a title block. Same components,
same markup — on the drawing board.
Reading in an unnamed pair — blueprint / flow Change theme Browse all 8 →
01
Brand marks
Four lockups the name can wear, all one block. The base
.ds-brand
is what the site ships — the bitmap logo beside the full name — and the
three modifiers are the alternatives.
--monogram
sets the initials in the signature 2px box beside the name;
--plate
is the postmark, the name stacked over a mono role kicker on a filled slab; and
--dot
is the compact mark, lowercase mono initials closed by the single full stop that
carries the accent. None of them fork for dark: every colour resolves through a
--ds-brand-*
property, so an ink surface declares
.ds-on-dark
once and the marks follow — the same eight tokens the scrolled header already
flips, which is why it is named in that block rather than restating them.
02
Icons
One canvas, one stroke, one place they live
(_Icon): 24×24,
bare geometry carrying nothing but coordinates, and a 2.4 stroke supplied by whatever
surface the mark lands on. Nothing here names a colour, which is the only reason the
same forty-six marks can sit on paper in one row and inside an ink plate in the next
without a second copy of themselves — the two panels below are that claim,
run twice on identical markup. Square caps and miter joins because there is not a
rounded corner anywhere in this system; angles of 0, 45 and 90 and nothing else.
The set is also honest about itself. The thirty-nine destination marks and the
seven chrome marks meet the contract; the thirteen below the fold do not, and each one
says which rule it breaks and where it ships. They are drawn at the weight they
actually render, not corrected on the way to the page. The full contract —
counter minimums, the element budget, the five-question review test — is in
docs/guidelines/icon-style-guide.md.
Destinations
Chrome
Off the contract
Injected by the behaviour layer
Using one
<partial name="_Icon" model='@(new IconSpec("close"))' />
<!-- the rail is the one surface that needs a class on the element,
because it hangs per-glyph modifiers off the same hook -->
<partial name="_Icon" model='@(new IconSpec(app.Icon, "ds-rail__icon"))' />
/* everything else styles the glyph through its container, and the mark
supplies nothing but coordinates */
.ds-drawer__close svg {
fill: none;
stroke: currentColor;
stroke-width: 2.4;
stroke-linecap: square;
stroke-linejoin: miter;
}
03
Site header & navigation
The frame every page opens in
(_SiteHeader):
brand, the uppercase nav whose accent underline wipes in on hover, the current
destination held open, and the CV button. Past 60px of scroll it turns the dark
is-scrolled state
and flips the button to periwinkle so it does not read black-on-black; below 768px
the links become a numbered full-height menu behind the toggle.
--floating is the
alternative: the band goes transparent and the inner row becomes a card that clears
the top edge and rides over the page — the modal's logic, since anything
floating free of an edge earns the pop shadow. Same markup, one modifier, so the
two never drift apart. Both specimens below are the live partial.
04
Spine rail & two-level navigation
The header turned through ninety degrees
(--rail):
chrome leaves the top edge for the left margin, and the room that buys pays for
the second level of navigation the band never had space for. The three apps stack
as one bordered plate; beneath them the 2px rule turns inward into a timeline
carrying the current app's sections. Switch app and the spine
re-populates — slides in the Resume, archive surfaces in the Blog, the two
skins here — while the geometry never moves. Primary wears the ink,
secondary wears the accent, so a place you are and a position that moves can sit
40px apart and still never be confused. The latch parks it at one cell wide, and
from there hover or focus opens the full column over the page rather
than pushing it: horizontal padding is the same at both widths, so the cell lands
on the same pixel and collapsing changes what is written beside a row, never
where the row is. Below 992px it becomes a slide-over, which keeps the two levels
stacked instead of flattening them into one menu.
06
Context banner
The bar across the top that says what you are looking at
(.ds-context-bar),
for when what you are looking at is not what a visitor to this URL would see.
Full-bleed and above the content, because that is the only position that cannot
be mistaken for part of the page it is describing. Three tones and no
fourth — you are somewhere unusual, the site is in a state, what you
press will not do what it normally does — and the constraint is the
component: a banner that can say anything in any colour stops being read, which
is the one failure mode that matters for the one thing whose entire job is to be
noticed. Three consumers were waiting for it before it existed: the draft
preview, maintenance mode, and viewing a page as somebody else.
07
Reading progress strip
One line of chrome doing four jobs
(.ds-progress):
identity, app, the section actually being read, and how far through — written
as a single shell invocation, because the mono voice is the brand’s own. The
prompt holds the left end; the middle is a
cd into the page
whose --section
flag rewrites itself by scroll-spy, caret still blinking; the right side composes up
to three optional readouts — section counter, percentage, and the bar itself as
either a 2px accent rule along the bottom edge or a ten-glyph ASCII meter drawn in
text. Light-mode native on a hairline rather than an ink plate, so it can sit under
the white header band without reading as a second header;
--pinned sticks
it below whatever chrome the page wears via
--ds-chrome-top.
The markup is passive; progressStrips()
drives the flag, the counters and the fill, and speaks the state through
role="progressbar".
It ships live on all three apps, composed per app through
ViewData["DsProgress"]:
blog posts read --section
over their own h2s with the percentage and the rule; this page reads its
catalog into the ASCII meter — look up — and the resume deck
presents a
--slide flag
with a slide counter, fed by the deck itself, because a stage that pages by
transform has no scroll to spy on.
01The contract comes first
02Commands and events on the wire
03A shadow registry of every message
04Swapping the transport underneath
05Seven files, one idea
01The contract comes first
02Commands and events on the wire
03A shadow registry of every message
04Swapping the transport underneath
05Seven files, one idea
| Piece | Hook | Notes |
|---|---|---|
| Strip | .ds-progress[data-ds-progress] | Wired by progressStrips(). Add --pinned to stick it below the page’s chrome via --ds-chrome-top. |
| Sections | [data-ds-progress-mark="01 name"] | On the content, in order. The last mark scrolled past the strip is “current”. |
| Flag value | [data-ds-progress-section] | Rewritten, quoted, as the reader scrolls. |
| Counter | [data-ds-progress-index] | 1-based; the total is server-rendered. |
| Percentage | [data-ds-progress-pct] | Whole numbers; __pct reserves 4ch so 9→10 cannot nudge the row. |
| Rule fill | .ds-progress__fill | Reads --ds-progress off the strip; 2px accent along the bottom edge. |
| ASCII meter | [data-ds-progress-meter-on/-off] | Ten glyphs, █ lit / ░ spent. Carry one bar per strip, never both. |
| App | The command | The readouts |
|---|---|---|
| Blog post | cd /blog/<slug> && read --section=…, spied off the article’s own h2s | Percentage + rule fill — a read is one continuous measure. |
| Design system | cd /design-system && read --section=…, one mark per catalog section | ASCII meter + percentage — the audience that gets the joke. |
| Resume deck | present --slide=… — no cd; the prompt is already home | Slide counter + rule fill, fed by ds-deck-state from the deck — six discrete slides make a percentage fake precision. |
08
Top strip family
The dark mono bar above the site header on every private screen
(_TopStrip), in three states and one sibling.
Default is the site operated as yourself; --alarm
is the site saying it is not the site; --preview is
a real page that is not published; and .kc-writestrip
is the author's own chrome, the same grammar with the colour inverted. Four
segments in a fixed order — who, badge, sum, right — and
the colour is the only thing that changes between states, so three
surfaces read as one system rather than three designs. The badge is the role
scale at the strip's own size, six tones from Guest to Owner plus the dashed
pill a draft state wears.
09
Step-up card
The interruption a write meets when it needs a credential proved in the last
five minutes (_StepUp), and the one card both the
Account app and the Control Room render. Kicker, title, how long ago, the
mechanisms, the countdown and the server's own verdict, in that order. The
mechanisms are the part that changes: a door this composition cannot use
is a statement of what it would need, a provider that honours
prompt=login turns the same row into a button, and
the development satisfier sits under a rule where only Development can draw it.
Sign in again to remove a credential
Your last re-authentication was 42 minutes ago. This action needs a credential proved in the last five minutes - it changes who can be you.
step-up valid for 5:00 after it completes · evaluated server-side, never from this page
refused: the last re-authentication is 42 minutes old and this action needs one under five
Sign in again to remove a credential
Your last re-authentication was 42 minutes ago. This action needs a credential proved in the last five minutes - it changes who can be you.
step-up valid for 5:00 after it completes · evaluated server-side, never from this page
refused: no mechanism in this composition can produce a fresh re-authentication
Sign in again to remove a credential
Your last re-authentication was 42 minutes ago. This action needs a credential proved in the last five minutes - it changes who can be you.
step-up valid for 5:00 after it completes · evaluated server-side, never from this page
refused: the last re-authentication is 42 minutes old and this action needs one under five
10
Roles & grants
What somebody is and what the page in front of them may offer
(_RolePanel,
_GrantRow,
_GrantWall): one component in two forms, fed a
GrantView of what is true and the host's
capabilities, and nothing else. The panel's grounds — the owner's, nobody's,
a clock cooling, a sentence gone quiet — and the trio it is made of:
.kc-grantpill on the role scale,
.kc-grantbtn in three tones, and
.kc-grantnote, the statement that stands where a
button would be. They live in the public bundle because the grant wall is
a public page.
Owner is not data. There is no Owner member on the grant kind, so this panel is rendering a role that exists in configuration and in no table - which is why it has nothing on it, on this page and on the console, from one line of code.
Everything published is readable without signing in. Signing in is for the things that follow you - your place in a series, a read-later shelf - and for asking for a pass.
Hiring? A pass unlocks the appendix, the referees and the verification links, with a work address, for ninety days. Authors are invited: if you have talked to Kumar about writing here, the invitation arrives by email and carries the role in it - there is nothing to apply for and nothing to wait for.
An authorship lapses if it goes unused for a hundred and eighty days. Publishing, previewing or saving a draft resets the clock; opening this page does not, because a grant that stays alive by being looked at is not measuring anything.
The ninety days are a server-side check on every appendix request, not a badge this page is displaying. When it ends, this panel says so and the appendix stops answering - in that order, and without either of them consulting the other.
This one needs a Pass
A pass is granted on request, for ninety days, to a signed-in reader with a work address.
Everything published here is readable without signing in, and nothing behind this wall is anything you have already read.
Everything published is readable without signing in. Signing in is for the things that follow you - your place in a series, a read-later shelf - and for asking for a pass.
This one needs a Pass
A pass is granted on request, for ninety days, to a signed-in reader with a work address.
Everything published is readable without signing in. Signing in is for the things that follow you - your place in a series, a read-later shelf - and for asking for a pass.
Markup
As rendered on the page behind this — captured, not transcribed.