A record from the Factory repository, docs/brand/tokens.json, shown as committed except that its local paths appear as placeholders in angle brackets, such as <local evidence archive>, standing for files that are not published. Every hash, date and count is as recorded. The build review says what the Factory's receipts support.
{
"name": "Factory · Plumb",
"version": 1,
"meta": {
"source": "local-repository",
"repo": "software-factory (local checkout, no remote)",
"ref": "main@f5a8991",
"paths": {
"tokens": ["apps/dashboard/src/styles.css", "docs/ui/design-system.md", "docs/brand/geometry.md"],
"assets": ["docs/brand/assets/core", "docs/brand/assets/studies", "apps/dashboard/public/favicon.svg", "docs/ui/portfolio-concept.png", "docs/ui/project-concept.png"],
"docs": ["docs/branding.md", "docs/brand/geometry.md", "docs/brand/modules.md", "docs/brand/assets.md", "docs/ui/design-system.md", "apps/dashboard/src/brand.ts"]
},
"components": {
"Lockup": "apps/dashboard/src/components.tsx (Navigation, the wordmark link)",
"Navigation": "apps/dashboard/src/components.tsx (Navigation)",
"Button": "apps/dashboard/src/styles.css (.button, .text-button)",
"Badge": "apps/dashboard/src/styles.css (.badge)",
"Metric": "apps/dashboard/src/components.tsx (Metric, CountValue)",
"CalmEmpty": "apps/dashboard/src/components.tsx (EmptyState) and apps/dashboard/src/brand.ts (calmEmptyPortfolio)",
"StatusMessage": "apps/dashboard/src/components.tsx (Loading, CheckStatus, ReloadStatus, ErrorPanel)"
},
"synced": "2026-09-28"
},
"color": {
"themes": [{ "id": "light", "name": "Light" }],
"tokens": [
{ "name": "ink", "value": "#080d1a", "usage": "Near-black. Body text, headings and the wordmark; Plumb's line, collar, eyes and outlines. 19.39:1 on canvas, 17.89:1 on rail, 15.94:1 on select." },
{ "name": "muted", "value": "#58627b", "usage": "Slate. Subtitles, supporting and provenance text, table headers; prop outlines in artwork. 6.09:1 on canvas, 5.62:1 on rail, 5.00:1 on select." },
{ "name": "rail", "value": "#f3f6fa", "usage": "Cool grey. The navigation rail, chips and prop fills in artwork. 1.08:1 on canvas: decorative, never a sole boundary." },
{ "name": "rule", "value": "#dce2ec", "usage": "Divider. Hairline separators, control borders and ground lines in artwork. 1.30:1 on canvas: decorative, never the sole boundary, information or state." },
{ "name": "blue", "value": "#075bea", "usage": "Action blue. Plumb's bob, the one primary action per view, links, the selected navigation item's text and the focus ring. Text 5.69:1 on canvas, 4.67:1 on select, 5.25:1 on rail. At most one small prop detail in artwork." },
{ "name": "blue-dark", "value": "#0547b8", "usage": "The primary action on hover; badge text on select (6.64:1). 8.08:1 on canvas." },
{ "name": "select", "value": "#dceaff", "usage": "Pale blue. The selected navigation item, default badges, the backdrop tiles and ground shadows in studies. 1.22:1 on canvas: decorative." },
{ "name": "ok", "value": "#1f9a4b", "usage": "A confirmed healthy state: the 40 px status icon and the saved notice's border, always beside a word. 3.63:1 on canvas: graphics only, never text. Never in artwork." },
{ "name": "warn", "value": "#b25400", "usage": "Stale or needs-attention state: text, icons and borders, always beside a word. 5.05:1 on canvas, 4.54:1 on stale-bg, 4.79:1 on warn-bg. Never in artwork." },
{ "name": "problem", "value": "#b42318", "usage": "Blocked, failed or broken state: text, icons and borders, always beside a word. 6.57:1 on canvas, 5.75:1 on blocked-bg. Never in artwork." },
{ "name": "hover", "value": "#f7f9fc", "usage": "Linked table rows on hover and the attention summary's ground." },
{ "name": "canvas", "value": "#ffffff", "usage": "White. The page, secondary buttons and inputs; the plate canvas and Plumb's highlight. Text on blue (5.69:1) and blue-dark (8.08:1)." },
{ "name": "nav-hover", "value": "#e8eef7", "usage": "A navigation item on hover." },
{ "name": "notice-bg", "value": "#f5f8fe", "usage": "Ground of the loading, check, reload and save notices behind a blue border." },
{ "name": "warn-bg", "value": "#fff8f0", "usage": "Ground of a failed check, a failed reload and a warning save notice behind a warn border." },
{ "name": "ok-bg", "value": "#f1f9f4", "usage": "Ground of the saved notice behind an ok border." },
{ "name": "blocked-bg", "value": "#fdecea", "usage": "Ground of the blocked badge; carries problem text (5.75:1)." },
{ "name": "stale-bg", "value": "#fff1e0", "usage": "Ground of the stale badge; carries warn text (4.54:1)." },
{ "name": "input-border", "value": "#b8c1d1", "usage": "A text input's border at rest (1.81:1 on canvas: the label and the focus ring carry the meaning)." },
{ "name": "mark-off", "value": "#9aa3b5", "usage": "The unchecked visibility mark (2.54:1 on canvas: decorative, its label carries the meaning)." }
]
},
"type": {
"fonts": [],
"families": {
"sans": "system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif",
"mono": "ui-monospace, \"SF Mono\", Menlo, Consolas, monospace"
},
"groups": [
{
"name": "Display",
"family": "sans",
"note": "Weight 750 with tight tracking on the largest sizes; 650 on standing titles.",
"styles": [
{ "name": "page-title", "fontSize": "48px", "lineHeight": 1.1, "fontWeight": 750, "letterSpacing": "-0.02em", "sample": "Portfolio", "usage": "One page title per view, in ink. 36 px at 960 px and below." },
{ "name": "metric-value", "fontSize": "44px", "lineHeight": 1.15, "fontWeight": 750, "sample": "6", "usage": "A metric's value; an unknown value shows an em dash and its reason. 36 px at 960 px and below." },
{ "name": "wordmark", "fontSize": "40px", "lineHeight": 1.1, "fontWeight": 750, "letterSpacing": "-0.02em", "sample": "Factory", "usage": "The live-text wordmark beside the mark, in ink. 34 px at 1280 px and below, 28 px at 960 px and below." },
{ "name": "section-heading", "fontSize": "26px", "lineHeight": 1.2, "fontWeight": 750, "sample": "Connections to finish", "usage": "Section headings within a page. 22 px at 960 px and below." },
{ "name": "status-title", "fontSize": "24px", "lineHeight": 1.4, "fontWeight": 650, "sample": "Repository available", "usage": "The title of a project's status band, beside its 40 px status icon." },
{ "name": "panel-heading", "fontSize": "22px", "lineHeight": 1.2, "fontWeight": 750, "sample": "Could not load the portfolio", "usage": "The heading of an error panel." },
{ "name": "blocker-title", "fontSize": "20px", "lineHeight": 1.4, "fontWeight": 650, "sample": "Prerequisite not met", "usage": "The heading of a blocker card." }
]
},
{
"name": "Text",
"family": "sans",
"note": "Body is 18 px at the reference width and 17 px at 960 px and below; line height 1.4 throughout.",
"styles": [
{ "name": "subtitle", "fontSize": "24px", "lineHeight": 1.4, "fontWeight": 400, "sample": "Progress across your local projects.", "usage": "The line under a page title, in muted. 20 px at 960 px and below." },
{ "name": "nav-item", "fontSize": "20px", "lineHeight": 1.4, "fontWeight": 400, "sample": "Portfolio", "usage": "Navigation items in ink; the current item is weight 500 in blue on select. 17 px at 960 px and below." },
{ "name": "item-title", "fontSize": "19px", "lineHeight": 1.4, "fontWeight": 650, "sample": "Repair read-only inspection", "usage": "The title of an attention item." },
{ "name": "body", "fontSize": "18px", "lineHeight": 1.4, "fontWeight": 400, "sample": "Delivery activity is not measured customer value.", "usage": "Body text, table cells and controls, in ink." },
{ "name": "label", "fontSize": "18px", "lineHeight": 1.4, "fontWeight": 500, "sample": "Local projects", "usage": "Metric labels, field labels, source names and row names in compact tables." },
{ "name": "control", "fontSize": "18px", "lineHeight": 1.4, "fontWeight": 650, "sample": "Check repositories", "usage": "Button labels, table row headers and the next action in a blocker." },
{ "name": "subheading", "fontSize": "18px", "lineHeight": 1.4, "fontWeight": 650, "sample": "Verified runs", "usage": "Third-level headings, such as a count group's title." },
{ "name": "compact", "fontSize": "17px", "lineHeight": 1.4, "fontWeight": 400, "sample": "Stated focus", "usage": "Compact table cells, source lines and the attention summary." },
{ "name": "supporting", "fontSize": "16px", "lineHeight": 1.4, "fontWeight": 400, "sample": "Registered now · not filtered by period", "usage": "Provenance, details, footnotes, table headers and the rail footer, in muted." },
{ "name": "badge", "fontSize": "16px", "lineHeight": 1.4, "fontWeight": 500, "sample": "Blocked", "usage": "Badge text, in blue-dark on select, problem on blocked-bg or warn on stale-bg." },
{ "name": "small", "fontSize": "15px", "lineHeight": 1.4, "fontWeight": 400, "sample": "Stated 2 days ago", "usage": "Field hints, field problems and attention item metadata." },
{ "name": "caption", "fontSize": "14px", "lineHeight": 1.3, "fontWeight": 400, "sample": "not filtered by period", "usage": "A count's note beneath its value and quiet badges, in muted." }
]
},
{
"name": "Code",
"family": "mono",
"styles": [
{ "name": "code", "fontSize": "0.88em", "lineHeight": 1.4, "fontWeight": 400, "sample": "cdaaffc0f97a", "usage": "Collector names, record ids and digests inline with text (0.88 of the surrounding size)." },
{ "name": "path", "fontSize": "16px", "lineHeight": 1.4, "fontWeight": 400, "sample": "<home directory path>", "usage": "File system paths in project detail." }
]
}
]
},
"spacing": {
"note": "The 4/8/12/16/24/32/40/48 px scale from the design system; nothing in between.",
"tokens": [
{ "name": "space-1", "value": "4px", "usage": "Label to value inside a metric; gaps in field lists." },
{ "name": "space-2", "value": "8px", "usage": "Title to subtitle; navigation list gap; calm empty-state gaps." },
{ "name": "space-3", "value": "12px", "usage": "Notice padding; badge and wordmark horizontal padding." },
{ "name": "space-4", "value": "16px", "usage": "Table cell padding; navigation item padding and icon gap; the footnote's top margin." },
{ "name": "space-6", "value": "24px", "usage": "Button side padding; metric strip padding; page header gap; error panel padding." },
{ "name": "space-8", "value": "32px", "usage": "Rail gap; main top padding; section padding; the main inset at 1280 px and below." },
{ "name": "space-10", "value": "40px", "usage": "The main inset at the reference width." },
{ "name": "space-12", "value": "48px", "usage": "The gap before the lower lists; control height." }
]
},
"radius": {
"note": "Small, flat corners; nothing is a pill.",
"tokens": [
{ "name": "radius-sm", "value": "4px", "usage": "Chips, the focus outline's corners and the save notice." },
{ "name": "radius-md", "value": "6px", "usage": "Buttons, selects, inputs, badges, panels and cards." },
{ "name": "radius-lg", "value": "8px", "usage": "Navigation items and the focus ring of a linked table row." }
]
},
"shadow": {
"note": "Surfaces are never raised; the only shadow is the keyboard focus ring.",
"tokens": [
{ "name": "focus", "value": "0 0 0 3px #ffffff, 0 0 0 6px #075bea", "usage": "Keyboard focus on buttons, selects, inputs and disclosures: a 3 px canvas gap, then a 3 px blue ring. Links and rows use a 3 px blue outline instead." }
]
},
"size": {
"note": "Layout and brand sizes from the dashboard stylesheet and the brand guide.",
"tokens": [
{ "name": "rail-width", "value": "258px", "usage": "The navigation rail at the reference width; 224 px at 1280 px and below; a top bar at 960 px and below." },
{ "name": "inset", "value": "40px", "usage": "The main content's side inset; 32 px at 1280 px and below, 20 px at 960 px and below." },
{ "name": "control-height", "value": "48px", "usage": "Buttons, selects and inputs. Small buttons, text buttons and disclosure summaries are 44 px." },
{ "name": "touch-min", "value": "44px", "usage": "The smallest interactive target." },
{ "name": "mark-lg", "value": "72px", "usage": "The mark's canvas beside the wordmark at the reference width." },
{ "name": "mark-md", "value": "64px", "usage": "The mark's canvas at 1280 px and below." },
{ "name": "mark-sm", "value": "56px", "usage": "The mark's canvas at 960 px and below." },
{ "name": "mark-min", "value": "48px", "usage": "The reviewed minimum canvas for the generated mark. Never smaller; it is not an approved favicon." },
{ "name": "illustration", "value": "128px", "usage": "Plumb in a calm empty state." },
{ "name": "status-icon", "value": "40px", "usage": "The ok, warn and unknown status icons in a status band." },
{ "name": "icon", "value": "24px", "usage": "Navigation and inline icons (20 px in the top bar at 960 px and below)." }
]
}
}
