Card
Interactive surface
Flat, hairline border, lifts on hover. Colour stays rationed.
Open@ponchia/ui · Bronto
Bronto is a CSS-first identity and UI layer for services, tools, sites, and reports. The standard app center is load-bearing: it gives every service the same navigation, forms, tables, workflow chrome, state language, and token rhythm. The opt-in layers then make complex work legible: explanation, provenance, relationships, generated reports, and durable state. This page is the showcase and the documentation: every block is a live specimen with its class grammar, recipe, and the one rule that keeps the system honest.
.ui-* class vocabulary, token use, accessibility
guidance, pure geometry helpers, and small idempotent behavior kernels.
01 — Foundations
Monochrome surfaces, a single rationed accent, dot-matrix display type. One
--accent knob re-brands; data-theme, colorways and surface are
root-level switches.
Colorways re-point the one accent (not a second colour) for the whole page, like a theme.
Switch it — the accent, focus ring, dot-matrix and accent text all follow. Authored in
OKLCH and contrast-gated; phosphor skins add a dot-matrix
--dotmatrix-glow in dark.
Accent as text — a themed link and an accent badge.
A colourblind-safe categorical palette (series 1 = the accent), each series colour
paired with a dot-matrix pattern so it never relies on colour alone.
Read hex from @ponchia/ui/charts.json for canvas/charting libs.
@ponchia/ui/css/legend.css below for a reading key.
@ponchia/ui/glyphs, a dot-matrix icon set (a sample, default dot look, for
display sizes).
Same glyphs in solid mode — crisp inline icons (~18px) inside buttons.
render: 'mask' — a one-node .ui-icon for icon-at-scale: scales
with the text, inherits currentColor.
Animation (opt-in, reduced-motion-aware): reveal powers the cells on;
pulse breathes for a live state.
02 — Shared service center
Buttons, forms, tables, overlays, navigation, shell chrome and workflow states. This is the cross-service identity layer; the analytical/report surfaces build on it instead of replacing it.
Card
Flat, hairline border, lifts on hover. Colour stays rationed.
OpenCard · accent
The signature texture as a background utility.
No matches
| Time | Pair | Size | P/L | State |
|---|---|---|---|---|
| 09:42:01 | BTC/EUR | 0.014 | +€38.20 | Filled |
| 09:38:55 | ETH/EUR | 0.62 | −€11.04 | Stopped |
| Bob | 30 | |
| Ann | 9 | |
| Cy | 100 |
Heads up
A rationed accent border carries the tone — no fill.
Dismissible alert — wired via the shipped behavior.
Info tone — the neutral status colour, AA-safe on surface.
Disclosure body — toggled via the shipped behavior.
Settings
This whole article is plain semantic HTML — the kind a Markdown renderer produces —
with no class attributes on any element. One ui-prose
wrapper styles it.
Keeping the markup clean means it stays portable and machine-readable: scrapers, RSS, reader mode, and LLMs all parse it without fighting a class-soup div tree.
Color is rationed. Structure carries the meaning.
import ui from '@ponchia/ui/classes';
ui.button({ variant: 'ghost' });
A short content page using the narrow container + meta row + tags.
Color is rationed. Structure carries the meaning.
03 — The differentiator ★
The 0.5.0 analytical suite: communication primitives for charts, reports and analytical
UI. Each owns its visual grammar and pure geometry and refuses to own scales, state or
hit-testing — that is the line that keeps Bronto from becoming a chart engine. All
opt-in via @ponchia/ui/css/analytical.css.
A subject / connector / note grammar for SVG figures, plus geometry helpers that
return SVG strings — including directLabels, which declutters labels
along an axis and draws the leader from each anchor to its placed label.
--draw motion), and a warning band.
directLabels geometry helper: the four labels would collide at
their data y, so they declutter into a leadered column.
import { directLabels } from '@ponchia/ui/annotations';
const labels = directLabels(
points.map((p) => ({ anchor: p, size: 22, key: p.id })),
{ axis: 'y', cross: 296, gap: 6, min: 14, max: 156 },
);
// each → { x, y, anchor, key, d }
// <path class="ui-annotation__connector" d={d}/> + a label at { x, y }
Standalone reading keys that read the --chart-* palette tokens, so chart
meaning never drifts from the colours. Interactive variant toggles a series.
Categorical (colour + redundant pattern)
Interactive — toggle a series
<ul class="ui-legend ui-legend--interactive" data-bronto-legend>
<li><button class="ui-legend__item" aria-pressed="true" data-series="research">
<span class="ui-legend__swatch ui-legend__swatch--1"></span>
<span class="ui-legend__label">Research</span>
</button></li>
</ul>
import { initLegend } from '@ponchia/ui/behaviors';
initLegend(); // emits bronto:legend:toggle { series, active }
The prose counterpart to annotations: sober, report-grade highlights, underlines,
boxes and passage brackets for running text. Monochrome by default; the accent is the
opt-in --accent tone.
The migration cut p95 latency by 38%, but error rate doubled in the first hour, and the old retry path was removed. A plain neutral highlight stays monochrome, while a boxed note reads as an aside.
Source Q3 incident review, §4 — sustained for 47 minutes before rollback.
<mark class="ui-mark ui-mark--accent">cut p95 latency by 38%</mark>
<blockquote class="ui-bracket-note ui-bracket-note--accent">…</blockquote>
ui.mark({ tone: 'accent', motion: 'draw' });
ui.bracketNote({ tone: 'accent' });
Leader lines between DOM regions, drawn from measured DOMRects — straight,
elbow or curve, with an arrow or dot end. Pure geometry; the behavior only tracks
layout.
Source
Target
Aside
<svg class="ui-connector ui-connector--accent" data-bronto-connector
data-from="node-a" data-to="node-b" data-shape="curve" data-end="arrow"></svg>
import { initConnectors } from '@ponchia/ui/behaviors';
import { connectRects } from '@ponchia/ui/connectors'; // pure geometry
The visual language of guided focus: a dimmed backdrop with a cut-out ring and a tour note. Bronto owns the look and the cutout position, not the tour state machine. (It is a full-viewport overlay — the live version opens in its own demo.)
<div class="ui-spotlight ui-spotlight--ring" data-bronto-spotlight data-target="save-button">
<div class="ui-spotlight__hole"></div>
<div class="ui-tour-note">…</div>
</div>
import { initSpotlight } from '@ponchia/ui/behaviors';
A pointer-tracking ruler with a pinned readout. Move the pointer over the plot — Bronto reports the position as pixels and 0–1 fractions; it never maps pixels to data values.
Pointer: —
<figure data-bronto-crosshair>
<div class="ui-crosshair"><div class="ui-crosshair__line ui-crosshair__line--x"></div>…</div>
</figure>
initCrosshair(); // emits bronto:crosshair:move { x, y, fx, fy }
A cross-cutting vocabulary for selected / candidate / excluded — the same classes on bars, table rows, list items or map regions. The host decides what's selected; these render the result.
<div class="ui-sel ui-sel--on">…</div> <!-- selected -->
<div class="ui-sel ui-sel--maybe">…</div> <!-- live-brush candidate -->
<div class="ui-sel ui-sel--off">…</div> <!-- excluded -->
ui.sel({ state: 'on' });
The trust layer for generated reports and AI output — "where did this come from?". A
cross-cutting ui-src--* state sets a rationed tone, always paired with a
label (never colour alone). The first frontier primitive beyond the analytical suite.
Generated 3 sources Human-reviewed
Latency fell 38%[1], but error rate doubled[2].
ops.internal · postmortem
Sustained for 47 minutes before rollback; root cause was the deprecated retry path.
<a class="ui-citation" href="#s1" aria-label="Source 1">[1]</a>
<article class="ui-source-card ui-src--verified">
<h4 class="ui-source-card__title">…</h4> <p class="ui-source-card__origin">…</p>
</article>
ui.citation({ chip: true, state: 'verified' });
ui.source({ state: 'generated' }); ui.provenance({ state: 'reviewed' });
A compact report slice for LLM-authored documents: reader outcome, claim, evidence ledger, action and source card stay visually distinct while the host owns the facts.
The guarded option reduces operational risk for the next release.
Scope: release-readiness review, current evidence window.
Evidence state: partial.
Basis: reviewed rollout note and verified metric sample.
Limit: final load-test result is still pending.
Source: S1
Recheck the pending load-test result.
Owner: release lead
Due: before rollout
Status: open
Success criteria: result supports or revises C1.
S1 reviewed S2 verified
Reviewed: release checklist
<aside class="ui-report__decision">…</aside>
<article class="ui-claim ui-claim--partial" data-source-ids="source-1">…</article>
<div class="ui-evidence-ledger"><table class="ui-table">…</table></div>
<article class="ui-source-card ui-src--reviewed" id="source-1">…</article>
The states apps actually live in — saving, saved, stale, conflict, … — with canonical wording and a rationed tone. The label is the state; persistent state gets persistent UI, not a toast.
<span class="ui-state ui-state--saving ui-state--busy">
<span class="ui-state__label">Saving…</span>
</span>
ui.state({ state: 'saving', busy: true });
ui.state({ state: 'conflict' });
The trust surfaces around AI / system-generated content — a marked region, an origin label, and quiet reasoning + tool-call logs. Not a chat kit; pairs with the source layer.
AI generated
The migration cut p95 latency by 38% in the first hour.
{ "query": "p95 latency", "hits": 3 }
<section class="ui-generated">
<p class="ui-generated__label"><span class="ui-origin-label ui-origin-label--ai">AI generated</span></p>
…
</section>
<details class="ui-tool-call"><summary><span class="ui-tool-call__name">…</span></summary>…</details>
ui.originLabel({ ai: true });
The low-risk core for real tools: resizable panes, a selected-object inspector, denser property rows, and a raised selection action bar.
jobs.yaml
sync-run.json
Current selection preview and editor surface.
<aside class="ui-inspector">
<div class="ui-inspector__head">…</div>
<div class="ui-inspector__body">
<div class="ui-property"><span class="ui-property__label">Width</span><span class="ui-property__value">…</span></div>
</div>
</aside>
<div class="ui-splitter" data-bronto-splitter style="--splitter-pos: 42%">
<section id="files" class="ui-splitter__pane">…</section>
<div class="ui-splitter__handle" role="separator" tabindex="0" aria-controls="files" aria-label="Resize files pane" aria-valuenow="42"></div>
<section class="ui-splitter__pane">…</section>
</div>
<div class="ui-selectionbar"><span class="ui-selectionbar__count">3 selected</span>…</div>
Filter + keyboard-navigate a command list (live below — try typing or the arrow keys). Bronto navigates; the host owns the action registry. No global Cmd/Ctrl+K — open it yourself in a dialog.
No commands
Selected: —
<div class="ui-command" data-bronto-command>
<input class="ui-command__input" />
<ul class="ui-command__list"><li class="ui-command__item" data-value="…">…</li></ul>
</div>
initCommand(); // emits bronto:command:select { value, label } — host runs it
useCommand(); // react/solid/qwik
04 — On the frontier
The same boundary, applied to more of the "interfaces that explain themselves" surface. Planned, not yet built — the full rationale is in the frontier-primitives thesis.
Side-by-side choice, merge and accept/reject states for generated or concurrent edits.
Target rings, hotspots and linkage labels beyond connectors — lightweight "this controls that".