Design System
This page shows the design system of Management Craft: its colors, its type, its scale, its components, and its motion. The page draws each swatch with the live tokens. The page reads each value from the source file at build time. Thus the numbers on this page and the numbers the site uses are always the same. The notes adjacent to the values are written by hand and have no such guarantee. If a note and the code do not agree, the code is correct.
Materials
A cream page, dark ink, and one blue. Dark mode is the same page with dark values. Each pair below shows the two themes.
Seven tokens set all the colors of the page. Click a swatch to copy its value. Use the switch above to select the authored oklch() notation or the hex notation that a Figma color field accepts. The page copies the value that it shows.
- #F3EEE1#1E1D1BPage background
120The cream background of each page - #FAF7EC#2A2825Input background
1Text-entry fields are lighter than the page; the lighter color shows where to write - #D2CDBE#3A3530Rules and borders
242Hairlines, table rules, and low-contrast edges - #6C696D#9A9590Secondary text
289Captions, notes, and apparatus — see the contrast ratios below - #1C1B1A#D8D0C0Body text
366Body copy and headings
- #274893#7F9EDDBrand blue
293Only for navigation targets: links, citations, titles, and buttons - #11184A#11184APage frame
4The 8px page border, and navy ink for artwork
Each entity shows its family color only in small elements: the card rule, the label, and the hover accent. A family color is not a page background. The four families have one lightness and one chroma (L 0.42, C 0.13). Only the hue is different. Hex notation cannot show this relation. This is the primary reason the tokens are written in OKLCH.
- #045E17#76AF77Competency
16Green — the capabilities - #722C6E#CC8BC5Tool
10Plum — the instruments - #842B02#D4896ESource
18Rust — the works cited, and nothing else - #7B3800#D49656Person
1Ochre — the people behind the ideas
Rust is only for the Source family. Error chrome has the same hue, but it has its own token. Thus the two colors can change independently, and one is never used to mean the other. Links and buttons keep the blue color on hover. The underline becomes stronger.
- #2D5F3F#76AF77Success
14Confirmations, passing checks, added lines - #764800#BE9851Flagged
26Blocked but reversible — distinct from rejected - #842B02#D4896EError
21Failed checks, invalid input, removed lines
The build computes these ratios from the tokens. The ratios are measured, not asserted. The check includes each family and each state. Before the OKLCH conversion, the check could read only hex values, and eleven of these tokens could not be measured.
- AaBody textLight14.85:1AAA
- AaSecondary textLight4.67:1AA
- AaBrand blueLight7.45:1AAA
- AaBody textDark10.99:1AAA
- AaSecondary textDark5.68:1AA
- AaBrand blueDark6.29:1AA
- AaCompetencyLight6.92:1AA
- AaToolLight7.88:1AAA
- AaSourceLight7.79:1AAA
- AaPersonLight7.53:1AAA
- AaSuccessLight6.43:1AA
- AaFlaggedLight6.72:1AA
- AaErrorLight7.79:1AAA
Family and state hues are used only for labels, rules, and other non-text UI. For these elements, the AA threshold is 3:1. These hues are not used for body text. The three text pairs at the top must be more than 4.5:1.
Three cards are dark in the two themes: the entity card on a link such as The MOC, the citation card on a bracketed [N], and the authorship panel in the frontispiece. The card is dark in the light theme. Thus the card shows as an object on the page, not as a hole in the page. The component is on Part V.
- #1C1B1ACard background
11Dark in both themes - #D8D0C0Card text
5Title and body on the dark ground - #CDC6B7Card dek
6One step below the title — the payload
The label and the rule below the title use the family hue of the entity, with more lightness for the card. The ochre and the rust of the cream page are too dark for the dark card. Each accent has a twin with half the chroma (--hovercard-divider-*) for the rule. The twin is the same hue with a smaller effect.
- #62BB78Competency
1Green, lifted - #CC8BC5Tool
1Plum — also the default accent - #E98664Source
2Rust, lifted - #D8944DPerson
1Ochre, lifted - #7F9EDDAuthorship
1Apparatus blue — not a family
Agent Mode sets Plex Mono on an almost-black background. It has no accent of its own. The root element has data-theme="dark". Thus headings use the same --color-blue as the site, in its dark-theme value. One blue is used in the two themes.
- #100F0FAgent Mode background
15The near-black behind Plex Mono - #CECDC3Agent Mode text
54Plex Mono body - #E8E7E0Agent Mode text, bright
5Emphasis — near-white - #878580Agent Mode text, muted
52Apparatus: paths, hints, captions
Type
Signifier sets the content. Söhne sets the apparatus. Plex Mono shows that a machine speaks. Hierarchy comes from size and style, not from bold.
There are two families and one question to select between them: do you read this thing, or does this thing operate the page? Signifier is a serif with sharp stress and a true italic. It sets the content: titles, deks, body text, headings, and quotes. Söhne is a grotesque with no editorial opinion. It sets the apparatus: navigation, labels, buttons, breadcrumbs, badges, and form feedback. Klim made the two families. IBM Plex Mono is a third register, not a third voice. It shows that a machine speaks. It occurs only in Agent Mode, in code, and in token values such as the values on this page.
Signifier
The content voiceProse, headings, deks, pull quotes, and card copy. If a reader can quote the text, the text is set in Signifier.
Söhne
The apparatusAll text that names, labels, or operates a thing. Form feedback is also apparatus. A success note or an error below a field is the system that speaks, not the writer. The note has the same size as the text of its field.
Because of this separation, the page can have much chrome, and the chrome does not compete with the content. The two families also do not compete on weight. The register shows which family you read. Thus hierarchy in each family comes only from size and style. For the same reason, MC does not set headings in bold.
The craft of management
- Page title (H1)
- Font
- Signifier VF
- Size
- Weight
- Style
- Line height
- Tracking
- Case
What does the path from novice to expert look like?
- Section heading (H2)
- Font
- Signifier VF
- Size
- Weight
- Style
- Line height
- Tracking
- Case
The weight is a small step above Regular. Thus the H2 has more rank than the italic subhead of the same size. Bold is not permitted: hierarchy is the register plus this step.
Decide to improve. Price the value of doing so.
- Subhead (H3)
- Font
- Signifier VF
- Size
- Weight
- Style
- Line height
- Tracking
- Case
The same size as the H2. The register (italic against small caps) and the weight step of the H2 show the hierarchy. The subhead binds to the text below it: 32px above, 24px below.
The best hiring process on Earth still misses about three times out of ten for individual contributors. It should give you grace when you feel like you’re bad at hiring, and it should put real weight on being willing to start over.
- Reading body
- Font
- Signifier VF
- Size
- Weight
- Style
- Line height
- Tracking
- Measure
- Column width
- Size · steps
- max-width: 599px 19pxmin-width: 600px 18pxmin-width: 960px 20pxmin-width: 1440px 20pxmin-width: 1920px 22px
- Column width · steps
- max-width: 599px 657pxmin-width: 600px 623pxmin-width: 960px 692pxmin-width: 1440px 692pxmin-width: 1920px 761px
The size has steps for each breakpoint. The value above the steps is the :root minimum. One control sets the measure: 82 characters for each line. The width is computed from this control. It is not set by hand.
A map of the competencies and tools the best leaders use to build effective companies.
- Dek / standfirst
- Font
- Signifier VF
- Size
- Weight
- Style
- Line height
- Size · steps
- max-width: 599px 22pxmin-width: 600px 21pxmin-width: 960px 23pxmin-width: 1440px 24pxmin-width: 1920px 26px
Defining · Coming soon · View full screen
- Labels
- Font
- Söhne
- Size
- Weight
- Style
- Line height
- Tracking
- Case
0.08em is the standard for the corpus. Part numerals and present-mode chrome use the wide 0.12em. The correct word is “label,” not “eyebrow.”
Read the competency · Install the Craftsman
- UI text
- Font
- Söhne
- Size
- Weight
- Line height
- Tracking
Buttons, CTAs, and index titles are Söhne in sentence case.
$ paste the setup prompt into your agent — it drafts the MOC with you
- Plex Mono
- Font
- IBM Plex Mono
- Size
- Weight
- Line height
- Tracking
This shows all the styles above, together. This is the real article chrome. The components and the classes are the same components and classes that a tool page or a competency page renders. This includes the Goudy versal, the small-caps lead-in, the hanging indents, and the bracketed citation markers. The page shows what the site ships, not an approximation.
Why write it down first?
Writing the role down before you talk to anyone is the cheapest way to find out you disagree with yourself. The document does not persuade a candidate; it settles an argument you were going to have anyway, in a week when it costs nothing [1].
The order matters. Outcomes first, then the competencies that produce them, then the questions that reveal the competencies — sorted through the Competency Stack, which separates the role-specific abilities from the company-fit ones. Reverse it and you get a list of traits you admire rather than a standard you can hold anyone to.
What goes in it
- The mission — one sentence, the reason the role exists.
- Three to five outcomes, each one measurable within a year.
- The competencies those outcomes require, ranked.
And the things it deliberately leaves out:
- Years of experience, which is a proxy for none of the above.
- A tools list, unless the tool is the job.
- Anything you would not be willing to reject a strong candidate over [2].
Hover on a marker to see the citation card. The references are on Part V.
Scale
The base is 8, with one approved half-step. Intervals that occur frequently have names. There are six corners, and each corner has one function.
4pxthe finest step8pxthe base unit12pxrole-locked: intra-group pairing only16pxwithin a block24pxlabel to display32pxbetween blocks48pxbetween groups64pxbetween sections96pxbetween movements
Intervals that occur frequently have semantic names: --space-{from}-to-{to}. You adjust a rhythm one time, and all pages change together.
64pxBreadcrumbs → H124pxH1 → dek56pxDek → first rulevar(--space-lg)Figure label → figure28pxBullet list hanging indent38pxNumbered list hanging indent
A radius shows the type of the object. Thus this table gives each radius by its function, not as a sequence of numbers. Select the radius whose function is correct. Do not select a radius because its number looks correct. Shadows and gradients are not permitted. The corner is the only soft effect in the system.
- 2px
8Hairline softening — buttons, rules, small chrome - 4px
49The default corner: chips, fields, cards - 8px
7Panels and containers that hold other things - 16px
13Badges and tags — reads as a token, not a box - 24px
2Large soft containers; the widest square corner - 50%
11Dots, avatars, the motion marker
Grid
The layout of a page: the canonical responsive tiers, the rules that govern them, and the three shapes of the pages on the site.
- Phone≤599px4 col24px gutterAuthor one-column compositions; use columns for inset, not micro-placement.
- Tablet600–959px6 col32px gutterUse for simple two-part relations. The desktop shelves come at the next tier.
- Desktop960–1439px8 col32px → 72px gutterThe primary editorial layout tier. Declare spans; do not adjust them optically.
- Laptop+1440–1919px12 col72px gutterFull modular authoring field for landing pages, shelves, and exhibit relations.
- Display≥1920px12 col72px gutterSame 12-column logic with wider modules; do not invent a display-only grammar.
The homepage can show a diagnostic overlay at /?grid=1. The overlay is a tool for authors, not chrome for readers. It checks the shared content box, the margin rails, the 8px baseline, and the 24px major rhythm.
- Figures nest. The edges of a figure align with the grid, flush on the content column. The internal tracks come from the content of the figure, not from the page grid. Nested subdivisions have one internal rule, and the boundary is documented.
- Declare spans. Put hero copy, exhibit groups, cards, and header chrome on named tier spans where possible.
- Name grid breaks. The hero engraving, full-bleed NavCard rows, and source rivers can break the content grid only if their CSS names the exception and the edge where the grid starts again.
- Protect expressive type. Display text can keep optical values. Systems that occur frequently, such as cards, captions, FAQ, CTA rows, and newsletter blocks, must use the 8px/24px rhythm.
- Keep color semantic. Family colors are signals for entities. A monochrome treatment is a proposal, not the default system.
- Article. Breadcrumbs, a display-italic title, a dek, a measured column, and a contents rail. Tool pages and competency pages use this shape.
- Index. A title, a dek, and a grid of nav cards in alphabetical sequence. The tools, sources, and people pages use this shape.
- Landing. Exhibits show the product at a smaller scale. The windows show real pages, not mockups.
Components
The components are live, not screenshots. Each specimen on this part is the same component that the site renders. This includes the citation apparatus.
There is no shared button primitive. These are the buttons that render on a launch surface, each with the class that draws it. An audit compared each button class in src/styles with its consumers. The legacy .btn family does not ship, thus it is not shown: see Part VII.
The first two buttons were the same design, made two times independently. From 2026-07-26, they agree on corner, fill, press, and hover. The unification of the hover found a bug: the shared value was --color-blue-dark, a fixed dark navy in the two themes. In the dark theme, this made a dark navy button below almost-black label text. Now the hover mixes the fill in the direction of --color-ink. This makes the button darker on cream and lighter in the dark theme. The difference that remains is the waiting state, and that difference is real — see Part VII.
The frontispiece of each article is a real CardFrame with tone="brand". The frame uses --color-blue and --color-background, not the fixed navy of the card-era artwork. Thus the frame changes with the theme. The hero is a mask with one ink, not a raster image, for the same reason. The proportion is locked at 5:7.
Sizes: Large 280×392, Medium 200×280, Small 160×224. The ratio does not change. A card that is not 5:7 is not this card. The frame can show a Roman numeral for its index in a pack. The article frontispiece shows no numeral.
These are not tooltips. Each card is a link. You can move the pointer into the card and follow it. Thus the card is a popover. The card stays open while the pointer is inside it. Hover on The MOC to see the entity card. Hover on the marker in the article above to see the citation card. The colors are on Part I.
Only once you have the outcomes do you work out the competencies — sort them through the Competency Stack, which separates the role-specific from the company-fit abilities.
The card is an enhancement, not the only route. The link navigates without the card. The dek is also in a visually-hidden description. Thus keyboard users and screen-reader users get the same summary.
Each tool page has the Human / Agent toggle. The page is written two times: one time for you, one time for your agent. On the site, the toggle is a fixed control at the bottom right. Here, the toggle is in the page flow.
One style is used on each reading surface that 0.3 ships. A bracketed marker is at the point of the claim. The marker points at a numbered reference at the foot of the page. The two halves are below, adjacent. This adjacency shows their relation.
The framework separates the role-specific abilities [1] from the company-fit ones.
References
https://www.amazon.com/Who-Method-Hiring-Geoff-Smart/dp/0345504194
https://a16z.com/the-hiring-process/
The entry is in Chicago notes form, author-first. The name is in speech sequence, not in bibliography sequence. The first reference to a work is full. Later references are short. There are four types, with the short form last:
References
https://mitpress.mit.edu/9780262534291/sources-of-power/
https://doi.org/10.1037/0022-3514.77.6.1121
https://time.com/4267448/andrew-grove-man-of-the-year/
- Put a space before the bracket. Write
abilities [1], notabilities[1]. - Mid-sentence position is correct. Put the marker at the claim, not at the end of the sentence. Do not change it.
- The marker becomes rust on hover. This is the only link on the site that can do this. This is not an exception to the rule on Part VII; it is an instance of the rule. Rust shows a Source, and a citation points at a source.
- The number is a link, not a label. The ↩ symbol moves you back to your sentence. If you cannot go back from a citation, you lose your position on the page.
- Author-first, not inverted. Write
Walter Isaacson, “…”, notIsaacson, Walter.MC does not sort by surname. Thus inversion gives no help and is less clear. - Put the URL last, with no text after it. A period after the URL goes into the href and breaks the link. A URL in the middle of an entry is not parsed and shows as dead text.
check-citation-formfinds the two errors. - An entry can ship incomplete. Write the entry as far as the source permits, then stop. The lint gives a warning; it does not block. A gate that demands an unknown date teaches authors to invent a date.
This is frozen history, listed so that nobody writes a new instance: the card corpus sets Chicago superscripts adjacent to the punctuation (“the framework.2”). All routes that rendered them were removed from 0.3. ^N^ is only in content/packs/**.
Motion
Motion explains one time, then stops. Entrances ease out. Travel eases in and out. An action that the reader does many times each day has no animation.
Entrances lead with speed: the reader sees movement the instant they ask for it.
On-screen travel accelerates and settles: nothing teleports, nothing lurches.
Color and shadow shifts ride the browser's plain ease at the instant tier.
100msDuration150msDuration200msDuration260msDuration300msDuration600msDurationcubic-bezier(0.23, 1, 0.32, 1)Easingcubic-bezier(0.77, 0, 0.175, 1)Easing12pxEntrance80msEntrance
With prefers-reduced-motion, travel is removed. Only the fades that help comprehension stay. The demos above become a crossfade.
Violations
Nine instances of drift in this system, each with a date, and the checks that now report the same drift.
Each entry below occurred in this design system. Each entry has a date and a link to the decision that closed it. The list is not confession. Each entry names a failure class. If you can name a class, you can build a check for it.
A name that describes a slot gets spent
--color-accent-secondarymeans “the second color, use it when you need one.” Thus it was used. By 2026-07-25 it did five functions at the same time: the Source family, error states, CTA/button/nav hover, a maturity rung, and the fail badge of this page. The audit found 33 direct consumers.Closed The token was renamed, not aliased. An alias invites new consumers. Rust is now
--family-biband means Source. Errors have--color-error. The ladder has its own tokens.2026-07-25-rust-reserved-for-sourcesA retirement that only covered half the surface
On 2026-06-10, the one-register-per-role rule removed rust from the link register — but only for prose links, and the token name did not change. 45 days later, rust was still possible as a button, CTA, and nav hover. The rule was written, but no check enforced it.
Closed Each button, CTA, and nav hover now keeps blue and makes the underline stronger.
A button system with no consumers
.btnand its four variants are documented as the button system of MC. Their only consumer in the app isShareButton, which renders on/pack/*, a card-era route removed from 0.3. On each launch surface, the count is zero. The buttons that ship —.nl-signup-btnand.home-cta— are the same design, made two times, with different radii and different hovers.Closed Corner, fill, press, and hover were unified on 2026-07-25/26. The unification found a bug immediately. The shared hover value,
--color-blue-dark, is a fixed dark navy in the two themes. In dark mode, it made a dark navy fill below almost-black label text, at approximately 1:1. Because there were two implementations of one button, nobody examined one of them as the button. The difference that remains is real: only the newsletter button waits, and Part V now shows that state instead of a description of it.A breakpoint that is not one of the breakpoints
The tier system has four boundaries: 600, 960, 1440, 1920.
--space-page-guttersteps at 1024, which is not one of them. Thus the Desktop tier changes its page gutter in the middle of the tier, and the Grid table above gave one value for each tier that the token does not ship. The cost is measurable. Make this page wider from 1023px to 1024px, and the content column becomes narrower, from 715px to 636px. The gutter increases 32→72 faster than the viewport increases.Open The Gutter column is now computed from the token at the two ends of each tier, not written by hand. Thus the split reports itself. To move 1024 to 960 is a layout decision with effects far past this page. The decision is named here, not made silently.
A style documented for surfaces that were cut
Until 2026-07-25, this page taught two citation styles: IEEE brackets for article surfaces, and Chicago superscripts for “card surfaces.” But all routes that render a superscript were removed from 0.3, and
^N^occurs only incontent/packs/**. The reader got a selection between a live convention and a dead convention, and no mark showed which was which.Closed The section gives the one live style and names the other style as frozen history. The failure class is larger than citations: a reference page gets its scope from the version it was written for, and a route removal does not change the prose that documents the route.
A ladder with no readers
--competency-level-1/2/3document a maturity ladder, andcompetency-page.cssstill carries 1 declaration that consume the first rung. Competencies currently carrying amaturity_rubric: 0. The colors are documented, styled, and rendered on zero pages.Open The build computes that count from the corpus. Thus this entry cannot become stale in the way that prose can. The consumer count is now adjacent to each token on this page. A token that nothing renders reports this itself.
A state that failed its own check
--color-flagshipped as#B8860B: 2.81:1 against the page, below AA. It had no dark override. Thus the dark theme got a value designed for cream. The contrast table did not sample it. That is the only reason it stayed.Closed The token now uses the L/C convention of the palette at the flag hue. It has a dark twin. It is in the contrast table, which now samples each family and each state, not four selected pairs.
A split running through a set
Two of the four family tokens were written in hex and two in
oklch()— an effect of time, not of intent. The effect was not cosmetic. The families have one lightness and one chroma, and only the hue is different. Hex notation cannot show this relation. A rule cannot stay strong when the members of its own set do not agree.Closed 64 tokens were converted to OKLCH. The conversion was verified as lossless in three ways: through the numbers, through the authored string, and through browser pixels before and after.
2026-07-25-oklch-is-the-authored-notationA checker that could not check
contrastRatio()accepted only hex. Thus eleven tokens could not show in the contrast table — in the section whose claim is “measured, not asserted.” The gap was silent. The table rendered, passed, and omitted the tokens.Closed The function now resolves each notation. A filter that hides outputs must be verified in two directions: the bad case is gone, and the correct population is present.
A rule without its forbidden pair is only a preference. Each row below shows the violation adjacent to the correct setting. The violation has a line through it and has the size it would have on the site.
- Never
Hierarchy by bold
CorrectHierarchy by register
- Never
A link that hovers to rust
- Never
Rust as a generic accent
CorrectRust marks a Source, and nothing else
- Never
Söhne’s job, set in Signifier
CorrectApparatus is Söhne