Calibrated Rev Q Catalog Install Marks Changelog Made by emdmed

Calibrated

Draw the number. Don't describe it. Calibrated sets a count, a position, progress, a size or a duration as a small technical figure, built from eight marks.

Pure CSS + vanilla JSNo build stepLight and darkClaude Code skillsMIT

In use on lirah.dev.

Installation #

/plugin marketplace add emdmed/calibrated
/plugin install calibrated@calibrated

The skills show up as calibrated:calibrated-tokens, calibrated:calibrated-figures and so on.

The rules #

  • A figure replaces text the UI already shows, from data it already has.
  • Eight marks only, one scale per figure, numbers at the major ticks. Values go in boxes on leaders.
  • Ink in quiet hairlines on panels. The lamp marks the one live thing with an amber line, text or star; red marks faults and limits; green marks what passed. Hatch means you can't.
  • Full form prints the scale and boxes; compact keeps only the marks.
  • Leave terminals, prompts and menus alone.
  • The grammar is fixed; the look is chosen per page. Palette, headline face, frame, layout and spacing come from the subject, so two pages about different things don't look the same. See Looks.

The eight marks

Every figure in the kit is built from these. They are plain functions on Calibrated.K that return SVG strings.

Instruments

Custom elements. Each draws an SVG with a title and an aria-label that states its facts in words. All accept density="full|compact", or follow the nearest [data-density].

Meter #

A value against its limit, with a red-hatched alert zone and a boxed reading. It sweeps to its value when it comes into view and glides when the value changes: the needle leads, the fill follows, and the reading blinks when it settles.

AttributeDefaultDescription
value, max0, 100The reading and the full scale.
warn0.8 × maxWhere the alert zone starts. Past it the fill and the reading turn red.
labelvalueName in the box and in the spoken sentence.
formatkk (46k, 1M), raw, pct (value and max as fractions: 0.46 of 1) or dur.
unitnoneAppended after k and raw values.
width420 / 144Full and compact widths.
stilloffNo motion: draw the value at once. Reduced motion does the same.

Position #

Where you are in a set. Up to 24 items get one tick each; longer sets get a scale with a marker.

AttributeDefaultDescription
index1Current item, 1-based.
count1Number of items.
labelnoneShown above in full form.
width160Scale width for sets over 24.

Progress #

Steps as nodes: done, live, to do and failed, with the finished run dimensioned.

AttributeDefaultDescription
done, total0, 1Finished steps and step count.
live, faultnone1-based index of the running or failed step.
statesnoneOr list every step: done,done,live,todo,fault.
live-labelnoneHighlighted caption under the live node.
fault-labelneeds youCaption under the failed node.
done-labelnoneA dimension line over the finished run.
step18Spacing between nodes.

Diff #

Added lines run right in green, removed lines left in red, from a shared centre. Linear up to the knee, logarithmic past it. Stacked diffs share the centre line.

AttributeDefaultDescription
added, removed0Line counts.
labelnoneName at the left.
knee, max200, 100000Where the scale turns logarithmic, and its end.
name-width64Room for the label.

Durations #

Spans on one shared ruler. A live span with a start time ticks every second; this one starts two minutes before the page loads.

AttributeDefaultDescription
maxautoOn <cal-durations>. The longest span, rounded up to a major tick.
unitms, m or h.
width480Ruler width.
namenoneOn <cal-span>.
valuenoneSeconds. Or give start (and end) in epoch ms; a live span with only start ticks.
liveoffLights the span with the lamp and ends it in a live star.

Ruler #

A scale on its own, with an optional marked value.

AttributeDefaultDescription
min, max, step0, 100, range ÷ 10Range and tick spacing.
every5Number every nth tick.
unit, widthnone, 320Label suffix and drawn width.
upoffLabels above the line.
valuenoneA marker with its value boxed on a leader.

Figures

Recipes take data and return a whole figure as an SVG string. Mount it into an empty <svg> with Calibrated.mount(), or use Calibrated.play(svg, recipe, data) to replay it when it comes into view, as every figure here does (lanes, budget, merge, fan-out, loop, measured and timeline move; matrix and section just draw). Needs calibrated-figures.js and calibrated-recipes.js. Example data on this page is illustrative.

Lanes #

Runs on one time ruler; the live one is lit by the lamp.

Budget #

A limit, its alerts, and today's pace to the end of the period.

Merge #

A branch with the exact command at each node.

Fan-out #

One parent; its children running, queued and done.

Loop #

Stations on a cycle with what each one runs.

Measured #

A long scale, a detail at 20:1, and boxed parts.

Timeline #

Consecutive steps; the slowest is called out.

Matrix #

Which releases touch which services.

Section #

Nested regions: hatched is closed, clear is open. The one figure without a scale: it shows what contains what, not how much.

Components

Pure CSS classes, plus a little JS for counts and sign-off. They carry the kit's drawing-sheet look into your own pages.

Card and sign-off #

A proposed figure beside the text it replaces, signed off as keep, rework (with a note on what isn’t good enough yet) or drop. calibrated-components.js wires the buttons; the tally counts the sign-offs and copies them, one line per card.

Counts #

A number in a box with its noun, written into the markup so it reads without JS. Calibrated.counts() redraws each from data-n when the number changes; data-pad="2" zero-pads one that changes live.

Tabs #

Ruled tabs with boxed counts. calibrated-components.js selects on click, ← → and Home / End, and shows the panel each tab's aria-controls names.

Buttons #

Tiers, so the main action leads: primary is filled with ink (one per view), the default is a hairline box, inline is a bracketed word for small actions in text, quiet is an underline.

Marks in text #

Status dots, revision triangles and the lamp, used inside running text.

Form #

Write-in lines with sentence-case labels, hints and errors.

Rows #

A list with a chosen row, marked with aria-current: its label is boxed in ink. The row under the pointer or holding focus takes a lighter box.

Table #

A parts list. Instruments in a cell draw in compact form, and on phones the table scrolls sideways.

Title block #

The ruled grid of terms and values from the corner of a drawing. Set the column count with --tb-cols.

Revisions #

Red triangles paired with what changed.

When to draw #

A two-column note for deciding what gets a figure.

Form controls

Native elements on write-in lines. A chosen option is boxed, focus is the lamp, and the few that need a hand are wired by calibrated-components.js.

Textarea #

A recessed editor pane with a block caret and a terminal-style status line: the mode, the caret's line and column, and the count, which turns red past data-max. The status line is hidden from screen readers, so a hint states the limit.

Select and option list #

A native select ending in a ▼; in browsers with styled pickers the open list is a hairline panel. The option list is the same list, always open. Hover moves the box.

Radio, switch and detent #

Radios are balloons, not squares. A switch is a small pill whose knob slides right and turns ink when it is on; its OFF/ON words are drawn, not read (aria-hidden), since the switch already says its state. A detent is a short ruler for a few ordered values, with the lamp ▼ over the chosen tick.

Range on a ruler #

Ticks on the slider's own line, the run to the value drawn heavier, a handle with grip lines and the reading boxed on a leader. The slider speaks its value with the unit, so the drawn box and scale are hidden from screen readers.

Number, units and search #

The value and its unit on one line: ↑ ↓ step it, Shift ×10, and the hint shows only while focused. Search with data-key="/" takes focus when / is pressed outside a field, and its × clears it; the count and the filtering are the page's own.

Field group, tags and date #

A fieldset whose legend sits on a rule. Tags are boxed words on a write-in line: Enter adds, Backspace removes, and each change is announced. Dates use the browser's picker.

File drop #

Drop files or click to browse. They are listed, and announced, into the rows named by data-list; a file over data-max bytes or outside the input's accept is flagged. Nothing is uploaded.

Overlays and feedback

Native popovers and dialogs, the leader-and-box mark as a tooltip, and spinners drawn from the loop and measured figures.

Dialog #

A panel over the shaded desk with a ruled head. data-dialog opens it; form method="dialog" closes it.

Tooltip and notes #

A leader up to a boxed value, on hover, focus or tap; the pointer can move onto the box, and Esc hides it. A callout is a drawing's NOTES block; the warning keys its legend with the alert hatch.

Separators #

Rules in drafting line types, so the split says what it is: solid for the next topic, dashed for an aside, the centre line for two halves, the break line where lines were skipped. A labelled rule names the break and is read as text, so it takes no separator role (that role hides its words); the lamp rule marks what's new.

Zones and brackets #

A zone is a named region with its name set into the edge, and no fill, so it sits on any surface. Dashed means not decided yet; red holds destructive settings. A bracket binds a few lines into one idea without a box. Name each zone by its head (aria-labelledby); a hidden comma keeps the head and its note apart when read.

Detail callout #

A lettered balloon on a dotted leader. Open, it drops a dashed leader into an inset labelled DETAIL A.

Toast and empty state #

Calibrated.toast() reports in the corner. A plain toast goes after 5 s; one with an action, like this undo, stays until it is used or hidden, and its timer pauses under the pointer or focus. An empty state is a dashed frame with one way forward.

Spinners #

Braille, stepped in whole frames like a terminal: the ring for a loading area, the row for text and buttons, and the readout line with its clock for work that takes a while. The readout resolves in place to a green or red result. A busy button takes aria-disabled, so it keeps focus while it works.

Theming

Two default themes, film and night, set with data-theme, and a look chosen per page on top. The theme button at the top switches both the docs and every preview.

Looks #

Film and night are the defaults, not the only look. Before building a page, Claude chooses five settings from the subject and changes at least two of them, unless you ask for the default look. The marks, one scale per figure, the one lamp, the red and green meanings and the monospace labels never change. The guide is skills/calibrated-tokens/references/looks.md; the examples show six pages, each in its own look.

SettingDefaultOptions
Palettefilm / nightSeeds from the subject: a brand's ink and accent, or a material or place (blueprint for a network, steel for hardware, clean white for a lab). The lamp is never red or green.
Headline faceIBM Plex Mono capsOne grotesk or condensed sans for headings only: Barlow Condensed, IBM Plex Sans Condensed, Space Grotesk, Archivo, Chivo. Set --font-display, --display-case and --display-weight. Never serif, script or italic.
Framepanels on a desk<html data-frame="paper"> sets panels flush on the paper, ruled on top. .cal-sheet is the bordered drawing sheet with zones and a title block.
Layoutcards with an info columnA full-width .cal-figure, figures side by side in .cal-grid (--cal-grid-min sets the column width), or one large drawing with notes beside it.
Spacedense<html data-space="open"> doubles the gaps and the space between sections.
/* look: blueprint · Barlow Condensed · paper · full-width figures · open */
:root, :root[data-theme] { --bg: #eef3f7; --fg: #12324d; --live: #0a6f83;
  --font-display: "Barlow Condensed", sans-serif; --display-case: none; --display-weight: 600; --track-title: 0; }
:root[data-theme="dark"], :root[data-theme="night"] { --bg: #0f2a44; --fg: #dbeaf5; --live: #f2c14e; --desk-depth: 70%; color-scheme: dark; }

Seeds #

Three colours; every surface, line, wash and supporting ink (title, muted, ok, fault) derives from them. Ink on panel needs 11:1 and the lamp on panel 4.5:1; the boxed readings turn red below that. Changing a seed here re-colours every preview on the page until you switch theme, reset or reload.

Density #

Full form prints scales, boxes and labels. Compact keeps the marks and at most a short reading (the meter keeps 46k / 1M), for tables and tight rows: put the numbers in a neighbouring cell. Every instrument still speaks all its numbers.

Changelog

  1. Rev Q

    Defaults, not a uniform. The grammar stays fixed (the eight marks, one scale, one lamp, red and green meanings, monospace labels), and the look is now chosen per page from five settings: a palette taken from the subject, a headline face, a frame, a layout and a spacing. Headings may use one grotesk or condensed sans (--font-display, --display-case, --display-weight). New: data-frame="paper" drops the desk, data-space="open" opens up the gaps, and .cal-grid sets figures side by side. The lamp tint may mark the one live region of a figure. See Looks and looks.md. On this site, the six examples each take their own look (with a switch to compare against the default), and the catalog's Finishes became Looks.

  2. Rev P

    Terminal spinners. They step in whole frames, like a terminal redraw, with the lamp dot as the head. <cal-spin> is now a 3×3 braille dot ring, and .cal-wait is a braille row, four dots by two, with the same four-<i> markup as before. New: .cal-readout, a waiting line with a dotted leader and a <cal-elapsed> clock that resolves in place to a green or red result. .cal-scan still renders but is no longer shown.

  3. Rev O

    A review of every component on this page. A theme is now three colours: title, muted, green, red and the desk derive from --bg, --fg and --live, so a re-seeded region stays readable, and every mark holds up in forced-colours mode. Small text reads at 4.5:1 and state marks at 3:1, and the film lamp is darker. Sign-off and tabs are wired by the kit (Calibrated.signoff(), Calibrated.tabs()). The lamp lights only what is live: a meter needle is ink unless set live, a wizard step is an ink star. Values past the end of a scale break off in red and state the real number, the ruler writes its value, and recipes report bad data in r.warnings. Toasts with an action stay until dismissed, tooltips close on Esc, the menu finishes its keyboard pattern, the pager can draw links, the empty state drops its hatch, and drawings shrink before they scroll on phones.

  4. Rev N

    A redrawn switch: a small hairline pill whose knob slides right and turns ink when on. OFF/ON words are now optional, .caps sets the label in legend caps for toolbars, the whole label is a 24px hit area, and it holds up in forced-colours mode and with reduced motion.

  5. Rev M

    Separators and containers. Rules in drafting line types, each with one meaning: solid for the next topic, dashed for an aside, the centre line for two halves, a break line where something was left out, a labelled rule, and a lamp rule for what's new (.cal-rule). Facts on one line split by hairline ticks (.cal-meta), a vertical rule for toolbars (.cal-vr), a zone with its name set into its edge (.cal-zone) and a bracket that groups a few lines (.cal-bracket). A dropped card is now taped off with red stripes and a solid SUPERSEDED stamp.

  6. Rev L

    Usable first: a UX rules reference every skill reads before composing, and an app mode (data-mode="app") for screens and forms. The primary button is boxed, field labels are sentence case at 12px, an approval stamp is green, textareas show only their count unless they opt into the editor line, counts aren't zero-padded unless they change live, and loops show their direction. Clearer hierarchy and separation: buttons in tiers (filled primary, boxed default, bracketed inline, underlined quiet), medium-weight titles, 16px section heads, block heads that rule the groups in a panel apart (.cal-block), and a darker desk.

  7. Rev K

    Twenty-six controls: textarea, select, menu, radio, switch, detent, dialog, tooltip, range, number, search, field group, detail callout, callout, toast, empty state, breadcrumb, pager, badge, file drop, tags, steps, code block, key cap, spinners, date. Chosen rows are boxed instead of barred; sign-off gains rework.

  8. Rev J

    Merge steps can be left out and the rest are numbered in run order; long branch names are no longer cut by a leader.

  9. Rev H

    The timeline replays and its ruler fits the run, from seconds to hours. Loop stations can fault; merge and timeline take a noun.

  10. Rev G

    Every instrument moves like the meter. Figures replay with Calibrated.play; the loop steps and the measured figure glides to new values.

  11. Rev F

    The meter moves: it sweeps to its value, glides on change and blinks when it settles.

  12. Rev E

    Panel look: mono type, quiet panels, the lamp replaces the highlighter.

  13. Rev D

    Ruled mark and condensed wordmark. This demo became a docs site.

  14. Rev C

    Own identity: drawing sheet, highlighter, projection mark.

  15. Rev B

    Night theme; seeds recompute in themed sections.

  16. Rev A

    First release: tokens, figure kit, components.