From 5c03321c76510d869eff8dc9633ba55e490ddceb Mon Sep 17 00:00:00 2001
From: LinzLos <223187540+LinzLos@users.noreply.github.com>
Date: Sat, 19 Sep 2026 12:01:25 -0700
Subject: [PATCH] Docs site: every number rendered, six components documented,
one finding-ID space
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
scripts/render-docs.py replaces render-readme.py and writes the token,
component, pattern, and finding counts and the version into the README,
the intro page, the components page, the audit card, and docs.js.
Foundations gains an Every-token table rendered from tokens.css (186;
the curated sections show 92). Divider, Kbd, Spinner, Status Bar, and
Status Dot get sections — six shipped class families had no page. The
audit's v1.3/v1.5 findings are renumbered F-018–F-023; F-013–F-017
stay with the a11y page and the changelog. Intro page no longer says
brand is forest green. 'What I won't ship' is dated Decisions; 'What's
next' points at the hub docket. Tiny Wire.html (orphan single-file
copy) removed. Sidebar rail in the nav.
---
CHANGELOG.md | 8 +
README.md | 2 +-
Tiny Wire.html | 1579 --------------------------------------
docs/audit.html | 65 +-
docs/components.html | 118 ++-
docs/docs.js | 10 +-
docs/foundations.html | 201 +++++
docs/index.html | 53 +-
scripts/render-docs.py | 264 +++++++
scripts/render-readme.py | 156 ----
10 files changed, 626 insertions(+), 1830 deletions(-)
delete mode 100644 Tiny Wire.html
create mode 100644 scripts/render-docs.py
delete mode 100755 scripts/render-readme.py
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e9fcb15..40a5a40 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,17 +8,25 @@ All notable changes to **Tiny Wire** are tracked here. Versioning follows [SemVe
#### Added
+- **Components page**: Divider, Kbd, Spinner, Status Bar, and Status Dot get sections. `components.css` shipped six class families with no place a reader could find them; one consumer rebuilt `.status-stat` locally for exactly that reason.
+- **Foundations**: an Every-token table at the end of the page, rendered from `lib/tokens.css` — all 186, light and dark, by tier. The curated sections above it show 92.
- **CONSUMING.md**: a `Promotion` section stating how candidates are judged — the four-question sameness test, the glyph rule for visual atoms, and two thresholds: present in ≥ 2 consumers promotes; ≥ 2 copies inside one consumer consolidates there. The hub's heuristic line now states the numbers instead of `N`; the Layer 3 build-order line no longer names examples (all three had failed verification) and points at the candidates table instead; the "status pill 3/3" row is split into a passive status chip and an interactive live indicator, one consumer each — the dot itself already ships as `.monitoring-dot`.
- **Card**: `.card-value` and `.card-delta` (+ `-success` / `-danger`) — the stat tile. Three consumers and both docs pages had each built this from inline styles; it now ships. Badge slot is a `.tag` in `.card-header`, so nothing new there.
#### Changed
- **README, `lib/CONSUMING.md`, the hub, and CONTRIBUTING** restructured for legibility. Each names its reader and opens in plain words. The `lib/` file list has one home (CONSUMING § The lib unit); the other three link to it. CONSUMING's rules are written as invariants — what must hold, what breaks if it doesn't, what checks it — marked `deterministic` or `judgment`. The hub reads state → contract → decisions → verified clean → coverage; its architecture / roadmap section is cut, and the one settled decision from it (components are authored once) is kept as a dated entry.
+- **Every typed number in the docs is rendered**: `scripts/render-docs.py` (replaces `render-readme.py`) writes the token, component, pattern, and finding counts and the version into the README, the intro page, the components page, the audit card, and `docs.js`. Hand edits between the markers are overwritten.
+- **Audit page**: "What I won't ship" is now "Decisions", each dated to the release it was made at; the icon decision is amended for Phosphor. "What's next" points at the hub's candidates table instead of carrying its own roadmap.
- **README counts are rendered**, not typed: `scripts/render-readme.py` counts tokens in `lib/tokens.css`, documented components on the components page, and patterns, and rewrites the block between markers. It counts 186 tokens (the README said "~180"; the count is now exact and re-rendered on every run) and lists the class families `components.css` ships that have no docs section yet.
- **Consumer profiles** are named `static` and `react` instead of A and B, in `lib/CONSUMING.md` and the hub. The letters only meant something to whoever wrote them.
#### Fixed
+- **Intro page** said brand is forest green; it has been cobalt since v1.5. Its counts (16 findings, 28 components, three files in `lib/`) were typed and stale; they are rendered or linked now.
+- **Finding IDs**: the audit page's v1.3 and v1.5 findings reused F-013–F-018, which the a11y page and this changelog already used for the v1.1 contrast findings. The audit's are renumbered F-018–F-023; the a11y page keeps the originals. One ID space.
+- **`Tiny Wire.html`** at the repo root — a 1,579-line single-file copy of the system with its own token values, linked from nowhere — is removed. Git history keeps it.
+- **Sidebar rail** example page is in the nav.
- **CONTRIBUTING** pointed token additions at `lib/globals.css`; tokens are declared in `lib/tokens.css`. The project-structure tree that repeated the `lib/` list is replaced by a link.
- **Patterns**: the dashboard pattern's stat cards used `.p-stat-*` classes that existed only inside `docs/patterns.html`, so the pattern couldn't be lifted as promised. They now use the shipped Card parts. Positive deltas move from `--brand` to `--success-dark`, matching `.tag-success` per the v1.5 semantic-color pass.
diff --git a/README.md b/README.md
index 49531c0..6a003c2 100644
--- a/README.md
+++ b/README.md
@@ -10,7 +10,7 @@ TinyWire is a design system for the interfaces where people operate complex soft
- **186 tokens** in `lib/tokens.css`, three tiers (primitive → semantic → component), light and dark
-- **30 documented components** on the [components page](docs/components.html) — `lib/components.css` ships 38 class families; 6 have no section yet
+- **35 documented components** on the [components page](docs/components.html) — `lib/components.css` ships 38 class families
- **5 patterns**: Dashboard · Data Table with Filters · Empty states · Login · Settings
- **2 fonts**: Bricolage Grotesque (display) + DM Sans (body)
diff --git a/Tiny Wire.html b/Tiny Wire.html
deleted file mode 100644
index 71eaade..0000000
--- a/Tiny Wire.html
+++ /dev/null
@@ -1,1579 +0,0 @@
-
-
-
A minimal, warm-toned design system built for dense operational interfaces. Two fonts, a coherent color language, and a small set of reusable components.
-
-
-
-
-
Usage
-
Drop globals.css into any project. All tokens are CSS custom properties on :root.
-
-
-/* 1. Import the token file */
-@import'./tokens/globals.css';
-
-/* 2. Import fonts in your <head> */
-/* Bricolage Grotesque + DM Sans from Google Fonts */
-
-/* 3. Use tokens anywhere */
-.my-card {
- background: var(--surface);
- border: 1px solid var(--border);
- border-radius: var(--radius-md);
- padding: var(--space-16);
- box-shadow: var(--shadow-card);
-}
-
-
-
-/* JS / TS — import tokens object */
-import tokens from'./tokens/design-tokens.js'
-
-// Access any value
-const brand = tokens.colors.brand // '#2F4BA6'
-const base = tokens.typography.fontSize.base // 13
-
-
-
-
-
-
Colors
-
A warm neutral base with a cobalt brand, green reserved strictly for success/trust states, orange-red danger, and categorical data colors. All hues share a muted, slightly desaturated quality.
-
-
Surfaces
-
-
-
-
Surface
--surface
-
-
-
-
Surface Subtle
--surface-subtle
-
-
-
-
Surface Page
--surface-page
-
-
-
-
Surface Muted
--surface-muted
-
-
-
-
Borders
-
-
-
-
Border
--border
-
-
-
-
Border Light
--border-light
-
-
-
-
Border Dashed
--border-dashed
-
-
-
-
Text
-
-
-
-
Primary
--text-primary
-
-
-
-
Secondary
--text-secondary
-
-
-
-
Tertiary
--text-tertiary
-
-
-
-
Inverse
--text-inverse
-
-
-
-
Brand — Cobalt
-
-
-
-
Brand
--brand
-
-
-
-
Brand Light
--brand-light
-
-
-
-
Brand Mid
--brand-mid
-
-
-
-
Brand Dark
--brand-dark
-
-
-
-
Success — Green (reserved)
-
-
-
-
Success
--success
-
-
-
-
Success Light
--success-light
-
-
-
-
Success Mid
--success-mid
-
-
-
-
Success Dark
--success-dark
-
-
-
-
Status — Danger
-
-
-
-
Danger
--danger
-
-
-
-
Danger Light
--danger-light
-
-
-
-
Danger Mid
--danger-mid
-
-
-
-
Status — Warning
-
-
-
-
Warning
--warning
-
-
-
-
Warning Light
--warning-light
-
-
-
-
Warning Mid
--warning-mid
-
-
-
-
Status — Info & Accent
-
-
-
-
Info
--info
-
-
-
-
Info Light
--info-light
-
-
-
-
Info Mid
--info-mid
-
-
-
-
Accent
--accent
-
-
-
-
Accent Light
--accent-light
-
-
-
-
Data / Charts
-
-
-
-
Inflow
--data-inflow
-
-
-
-
Outflow
--data-outflow
-
-
-
-
Target
--data-target
-
-
-
-
Chart Blue
--chart-blue
-
-
-
-
Chart Azure
--chart-azure
-
-
-
-
-
-
-
Typography
-
Bricolage Grotesque for headings and display numerics. DM Sans for all body copy, labels, and UI text. Both loaded from Google Fonts.
-
-
Font Families
-
-
-
--font-heading
-
Bricolage Grotesque
-
Display · Numerics · Headings
-
-
-
--font-body
-
DM Sans
-
Body · Labels · UI text
-
-
-
-
Size Scale
-
-
--text-3xl
26px
The quick brown fox
-
--text-2xl
20px
The quick brown fox
-
--text-xl
18px
The quick brown fox
-
--text-lg
16px
The quick brown fox
-
--text-base
13px
The quick brown fox jumps over the lazy dog
-
--text-md
12px
The quick brown fox jumps over the lazy dog
-
--text-sm
11px
Label caps · Section heading
-
--text-xs
10px
Caption · Overline
-
--text-2xs
9px
Tag · Badge
-
-
-
Weights
-
-
--weight-lightLight 300
-
--weight-regularRegular 400
-
--weight-mediumMedium 500
-
--weight-semiboldSemibold 600
-
--weight-boldBold 700
-
-
-
-
-
-
Spacing
-
A tight scale built for dense UI. All values are in px.
-
-
--space-22px
-
--space-44px
-
--space-55px
-
--space-66px
-
--space-88px
-
--space-1010px
-
--space-1212px
-
--space-1414px
-
--space-1616px
-
--space-1818px
-
--space-2020px
-
--space-2424px
-
-
-
-
-
-
Border Radius
-
Five steps from tight to pill. --radius (10px) is the default card radius.
-
-
--radius-xs
4px
-
--radius-sm
6px
-
--radius-md
8px
-
--radius
10px
-
--radius-full
9999px
-
-
-
-
-
-
Shadows
-
Subtle, layered shadows. Never black — always transparent washes.
-
-
--shadow-card
-
--shadow-nav
-
--shadow-toggle
-
--shadow-hover
-
--shadow-modal
-
--shadow-dropdown
-
--shadow-overlay
-
-
-
-
-
-
Animation
-
Spring easing for entrances, standard ease for micro-interactions. Click a box to replay.
A custom range input styled with a pill track and circular thumb. The value display uses --font-heading for a numeric display feel.
-
-
-
Dial speed
-
-
- 1.2
-
-
- 1.0
- 2.0
-
-
-
-
-
-
-
-
Alerts & Validation
-
Inline messages for validation states, system feedback, and contextual warnings. All use color-mix to derive tinted backgrounds from the semantic color.
-
-
Warn threshold must be below the pause threshold.
-
Current rate (3.2%) already meets this threshold — system is now in warn.
-
Targeting is active — priority routing applied to this segment.
Green carried both the brand accent and the "safe / attested" status meaning — overloaded, so the trust signal never popped. Reserved green for a new --success family; brand + all interaction moved to cobalt; back-compat aliases kept.
Medium
Fixed
-
F-018
+
F-023
The green-as-text contrast issue moved with the role: --success (green-500) as text on light tints is still ~3.5:1. Guidance shipped — --success-dark for text, bare --success for non-text (dots, borders, fills); a lint rule against bare --success on text is queued.
Low
Deferred · lint rule
@@ -339,25 +339,25 @@
v1.3 — Pedigree pass
ID
Finding
Severity
Status
-
F-013
+
F-018
Dark --text-tertiary failed AA on --surface-inset (4.05:1). Lifted #948682 → #A0928E; the live checker now passes every pair in both themes.
High
Fixed
-
F-014
+
F-019
lib/tokens.js had drifted from globals.css — three values (light/dark tertiary, dark disabled) shipped pre-AA hexes to JS consumers. Resynced.
Medium
Fixed
-
F-015
+
F-020
The .select chevron was a hardcoded #8A7E7D (a stale token value) that read low-contrast in dark mode. Repointed to a mid-neutral legible in both themes.
Medium
Fixed
-
F-016
+
F-021
Floating overlays stacked a solid border and a full elevation shadow — a doubled container signal. Border → --border-hairline; elevation does the lifting.
Low
Fixed
@@ -378,6 +378,7 @@
v1.2 — Sidebar rail
v1.1 — Findings
Twelve issues, grouped by theme. Click a filter to scope the list. Every fixed finding links to the line that changed.
+
The live checker's five findings from the same release, F-013 – F-017, are on the A11y check page and keep those IDs. The audit's later findings start at F-018 — one ID space across both pages.
Filter
@@ -877,26 +878,30 @@
How I audit
-
-
What I won't ship (and why)
-
A design system is as much about what you refuse to add as what's in. These came up during the audit and stayed out.
+
+
Decisions
+
A design system is as much about what you refuse to add as what's in. These came up during audits and were decided; each says when. The findings above are the checked part of this page — this section is the judgment part.
A third type weight ramp
Bricolage + DM Sans is the system. Adding a mono display family "for code-forward dashboards" was floated and rejected — every font is a maintenance contract.
+
Decided at v1.1 · 2026-05-20
A separate "compact" density
Tiny Wire is already dense by default (13px base, 32px controls). A "compact" override would double the surface area of every state matrix. If 13px is too big, override the token at scope.
+
Decided at v1.1 · 2026-05-20
Hand-drawn iconography
-
Examples use Lucide-style strokes inline. The system doesn't ship icons — bundling a set means owning a set. Consumers pick their own.
+
The system doesn't draw an icon set — owning a set means maintaining a set. Amended: it names one library, Phosphor, and will ship size and stroke conventions, so consumers stop hand-drawing. Still no bundled glyphs.
+
Decided at v1.1 · 2026-05-20 · amended 2026-09-18
A second brand colour
The temptation is real — every operational tool has a "secondary accent" moment. But every additional brand-mapped token doubles the override matrix for re-skinning. Override --brand at the consumer's scope instead.
+
Decided at v1.1 · 2026-05-20
@@ -904,45 +909,7 @@
What I won't ship (and why)
What's next
-
The next release is in flight. The deferred findings get their fix, plus the additions below.
-
-
-
-
Target
Type
Notes
Status
-
-
-
ARIA documentation pass
-
Docs
-
Toast, spinner, skeleton, alert — one block per component on the components page.
-
In progress
-
-
-
Segmented control
-
New component
-
A formal name for what .btn-group + .btn.active is doing. Comes with keyboard arrow nav.
-
Drafting
-
-
-
Date / range picker
-
New component
-
The most-requested gap from the v1.0 feedback round.
-
Drafting
-
-
-
Theme builder
-
Tooling
-
Live token editor in the docs site. Drop a brand colour, see every component re-skin.
-
Backlog
-
-
-
Focus-trap RFC (TW-018)
-
Spec
-
The "does Tiny Wire ship JS?" decision. Drafting.
-
Backlog
-
-
-
-
+
Not a roadmap. The candidates table in the Design System Hub is what's next — every row is something a real app built, counted, and sorted by how many apps built it. Deferred findings above keep their IDs until they close.
Every release ships with a page like this. The point isn't the changelog — every repo has one of those. The point is to make the reasoning visible: what changed, what didn't, and what I refused to add.
30 components covering forms, feedback, navigation, overlays, and data. Every component is plain HTML + a class — no framework, no runtime. Click "Code" on any demo to copy the markup.
+
35 documented components covering forms, feedback, navigation, overlays, and data. Every component is plain HTML + a class — no framework, no runtime. Click "Code" on any demo to copy the markup.
A hairline between things. Horizontal by default; .separator-strong for a heavier line; .separator-v for a vertical rule inside a row. It carries no meaning of its own — if the break matters to a screen reader, use a heading or a landmark instead.
An in-progress ring in three sizes. Put it beside a label, or inside a button while it waits. Give it role="status" and an aria-label — the ring itself says nothing.
A row of small stats with rules between them — the strip under a dashboard header. Each .status-stat is a label, a value in tabular numerals, and optional context.
A colored dot that means a state. .dot-* is still; .monitoring-dot pulses for something live right now. Both are decorative — the meaning goes in text beside them, never in the color alone. The Status Chip is a dot with its label built in.
+
+
+ Healthy
+ Degraded
+ Chart amber
+ Down
+ Info
+ Off
+ Live
+
+
+
+
+
+
+
+
<spanclass="dot dot-green"></span> Healthy
+<spanclass="monitoring-dot"></span> Live
+
+
Switch
.switch
Toggle for boolean settings. Use when the state takes effect immediately; use Checkbox when paired with a form submission.
@@ -1092,7 +1206,7 @@
Tag & Badge
NewDefaultrolled back
- v1.3
+ v1.5
diff --git a/docs/docs.js b/docs/docs.js
index 3262765..25b52b3 100644
--- a/docs/docs.js
+++ b/docs/docs.js
@@ -7,9 +7,9 @@
const root = document.documentElement;
// ─── Single source of truth for the current version ────────────────────
- // Bump this ONE constant each release. It drives the sidebar below and every
+ // Rendered from /VERSION — do not edit by hand. It drives the sidebar below and every
// element marked [data-tw-version] across the docs (see init()).
- const VERSION = 'v1.5';
+ const VERSION = /* record:version start */'v1.5'/* record:version end */; // rendered from /VERSION by scripts/render-docs.py
// ─── Sidebar template ──────────────────────────────────────────────────
const SIDEBAR_HTML = `
@@ -68,9 +68,11 @@
CheckboxCommandDialog
+ DividerDropdown MenuEmpty StateInput
+ KbdPaginationPopoverProgress
@@ -78,9 +80,13 @@
SelectSheetSidebar
+ Sidebar rail (example)SkeletonSlider
+ Spinner
+ Status BarStatus Chip
+ Status DotSwitchTableTabs
diff --git a/docs/foundations.html b/docs/foundations.html
index 98ba3b7..d86b1c8 100644
--- a/docs/foundations.html
+++ b/docs/foundations.html
@@ -219,6 +219,207 @@
Typography
--weight-boldBold 700 — page titles, hero
+
Every token
+
The sections above explain the tokens that matter most. This table is all of them — rendered from lib/tokens.css by scripts/render-docs.py, so it cannot fall behind the file. Dark shows only where it differs from light.