@ponchia/ui 0.6.6 → 0.6.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +105 -6
- package/README.md +36 -23
- package/behaviors/carousel.d.ts.map +1 -1
- package/behaviors/carousel.js +3 -0
- package/behaviors/dialog.d.ts.map +1 -1
- package/behaviors/dialog.js +14 -8
- package/behaviors/forms.d.ts.map +1 -1
- package/behaviors/forms.js +11 -5
- package/behaviors/index.d.ts +2 -0
- package/behaviors/index.d.ts.map +1 -1
- package/behaviors/index.js +2 -0
- package/behaviors/internal.d.ts +2 -1
- package/behaviors/internal.d.ts.map +1 -1
- package/behaviors/internal.js +23 -3
- package/behaviors/legend.d.ts.map +1 -1
- package/behaviors/legend.js +41 -9
- package/behaviors/splitter.d.ts +26 -0
- package/behaviors/splitter.d.ts.map +1 -0
- package/behaviors/splitter.js +200 -0
- package/behaviors/table.js +3 -3
- package/behaviors/theme.js +2 -2
- package/classes/classes.json +230 -4
- package/classes/index.d.ts +49 -1
- package/classes/index.js +56 -1
- package/classes/vscode.css-custom-data.json +1 -1
- package/css/analytical.css +3 -1
- package/css/app.css +4 -4
- package/css/clamp.css +92 -0
- package/css/figure.css +102 -0
- package/css/highlights.css +50 -0
- package/css/interval.css +90 -0
- package/css/primitives.css +2 -3
- package/css/report-kit.css +38 -0
- package/css/report.css +23 -4
- package/css/sidenote.css +12 -2
- package/css/site.css +2 -1
- package/css/sources.css +5 -0
- package/css/state.css +120 -1
- package/css/table.css +4 -0
- package/css/tokens.css +9 -9
- package/css/workbench.css +101 -8
- package/dist/bronto.css +1 -1
- package/dist/css/analytical.css +1 -1
- package/dist/css/app.css +1 -1
- package/dist/css/clamp.css +1 -0
- package/dist/css/figure.css +1 -0
- package/dist/css/highlights.css +1 -0
- package/dist/css/interval.css +1 -0
- package/dist/css/primitives.css +1 -1
- package/dist/css/report-kit.css +1 -0
- package/dist/css/report.css +1 -1
- package/dist/css/sidenote.css +1 -1
- package/dist/css/site.css +1 -1
- package/dist/css/sources.css +1 -1
- package/dist/css/state.css +1 -1
- package/dist/css/table.css +1 -1
- package/dist/css/tokens.css +1 -1
- package/dist/css/workbench.css +1 -1
- package/docs/adr/0002-scope-and-2026-baseline.md +1 -1
- package/docs/architecture.md +67 -43
- package/docs/clamp.md +49 -0
- package/docs/contrast.md +34 -24
- package/docs/d2.md +37 -0
- package/docs/figure.md +71 -0
- package/docs/frontier-primitives.md +25 -24
- package/docs/highlights.md +52 -0
- package/docs/interop/tailwind.md +148 -0
- package/docs/interval.md +55 -0
- package/docs/legends.md +3 -2
- package/docs/mermaid.md +6 -0
- package/docs/migrations/0.2-to-0.3.md +80 -0
- package/docs/migrations/0.3-to-0.4.md +48 -0
- package/docs/migrations/0.4-to-0.5.md +96 -0
- package/docs/migrations/0.5-to-0.6.md +82 -0
- package/docs/package-contract.md +40 -2
- package/docs/reference.md +78 -5
- package/docs/reporting.md +113 -58
- package/docs/sidenote.md +7 -1
- package/docs/sources.md +1 -1
- package/docs/stability.md +5 -3
- package/docs/state.md +67 -10
- package/docs/theming.md +10 -2
- package/docs/usage.md +31 -11
- package/docs/workbench.md +59 -18
- package/llms.txt +80 -12
- package/package.json +66 -6
- package/qwik/index.d.ts +1 -0
- package/qwik/index.d.ts.map +1 -1
- package/qwik/index.js +26 -21
- package/react/index.d.ts +1 -0
- package/react/index.d.ts.map +1 -1
- package/react/index.js +4 -1
- package/schemas/report-claims.v1.schema.json +137 -0
- package/solid/index.d.ts +2 -0
- package/solid/index.d.ts.map +1 -1
- package/solid/index.js +3 -0
- package/svelte/index.d.ts +88 -0
- package/svelte/index.d.ts.map +1 -0
- package/svelte/index.js +166 -0
- package/tailwind.css +87 -0
- package/tokens/figma.variables.json +2241 -0
- package/tokens/index.js +1 -1
- package/tokens/index.json +2 -2
- package/tokens/resolved.json +3 -3
- package/tokens/tokens.dtcg.json +1 -1
- package/vue/index.d.ts +79 -0
- package/vue/index.d.ts.map +1 -0
- package/vue/index.js +197 -0
package/docs/stability.md
CHANGED
|
@@ -21,15 +21,17 @@ shipped `files` entry, and the generated artifact provenance map — see
|
|
|
21
21
|
| Design tokens | Stable names/roles | Token names and documented roles are public. Exact values and generated colour math outputs may change for visual tuning before 1.0. |
|
|
22
22
|
| `--accent-1..6` | Stable names/roles | A subtle-to-bold accent ramp derived from `--accent`. Exact resolved values are visual tuning; algorithm changes require release-note visibility and resolver/browser checks. |
|
|
23
23
|
| Tokens as data (`tokens.json`, `tokens.dtcg.json`, `tokens/resolved.json`) | Stable additive | The JSON shapes are public for non-CSS/non-JS consumers. `resolved.json` exposes `light`/`dark` (resolved colours) and `scale` (resolved non-colour scales). Token names/roles are stable; exact resolved values are visual tuning (pin `~0.x`). |
|
|
24
|
+
| Schemas (`schemas/*.schema.json`) | Stable additive | Declarative JSON Schema contracts for package-adjacent tooling data. Existing schema files and enum values are public within a compatible minor; new optional properties and new schema files are additive. No validator runtime ships. |
|
|
24
25
|
| Theme axes | Mixed | `data-theme` (light/dark) is the **contractual** base. `data-surface="oled"`, `data-density`, and `data-contrast` are **convenience presets** — best-effort visual variants, **not** part of the stability contract; their presence and exact values may change for tuning. Computed-style smoke tests guard that the presets apply to their intended token families. |
|
|
25
26
|
| Behavior attributes (`data-bronto-*`) | Stable | Attribute names and documented markup relationships are public. Behavior internals are not. |
|
|
26
27
|
| Behavior functions (`@ponchia/ui/behaviors`) | Stable | Exported function names, option names, custom events, SSR no-op behavior, idempotency, and cleanup-returning contract are public. |
|
|
27
28
|
| Glyph registry/renderers (`@ponchia/ui/glyphs`) | Stable additive | Existing glyph names stay valid. New glyphs are additive. Renderer option names and accessibility defaults are public. |
|
|
28
29
|
| `.ui-icon` mask renderer | Stable | Class name, `--icon-size`, currentColor inheritance, and `--icon-mask` contract are public. The internal data URL encoding is not. |
|
|
29
|
-
|
|
|
30
|
+
| Framework lifecycle adapters (`react`/`solid`/`qwik`/`svelte`/`vue`) | Stable thin adapters | Hook/action/directive names, optional peer behavior where applicable, root ref/signal/resolver support, and cleanup lifecycle are public. They remain wrappers over vanilla behaviors, not component APIs. |
|
|
30
31
|
| Skins (`@ponchia/ui/skins`, `css/skins.css`) | Stable additive | Existing skin names stay valid. New skins are additive. Skins are root-level choices. |
|
|
31
32
|
| Charts (`@ponchia/ui/charts`, `charts.json`, `css/dataviz.css`) | Stable additive | Token names, JSON shape, and 8 categorical slots are public. Exact palette values may tune if gates and release notes justify it. |
|
|
32
33
|
| Reports (`css/report.css`, `.ui-report*`, print utilities) | Stable additive | Report class names, BEM part names, and print utility names are public. Report CSS is opt-in and not imported by the default bundle. The data key now lives in the standalone Legends layer (below), not `css/report.css`; charting is via the Vega theme target (`@ponchia/ui/vega`, see [vega](./vega.md)) or a token-themed inline SVG, not a shipped renderer. |
|
|
34
|
+
| Report kit roll-up (`css/report-kit.css`) | Stable additive | A convenience `@import` of the complete static-report vocabulary. The set of leaves it bundles may grow additively; each leaf also stays individually exported. Opt-in, not in the default bundle. |
|
|
33
35
|
| Annotations (`@ponchia/ui/annotations`, `css/annotations.css`, `.ui-annotation*`) | Stable additive | SVG annotation class names, recipe option names, and helper function names are public. Helper internals and exact path-control heuristics may tune before 1.0. |
|
|
34
36
|
| Legends (`css/legend.css`, `.ui-legend*`, `@ponchia/ui/behaviors` `initLegend`) | Stable additive | Legend class names, recipe option names, and the `bronto:legend:toggle` event contract (`aria-pressed="true"` ⇒ shown) are public. Opt-in, not in the default bundle; swatch colours are gated to the `--chart-*` palette. |
|
|
35
37
|
| Marks (`css/marks.css`, `.ui-mark*`, `.ui-bracket-note*`) | Stable additive | Text-mark and bracket-note class names and recipe option names are public. Opt-in, not in the default bundle. Uses semantic tones only. |
|
|
@@ -37,11 +39,11 @@ shipped `files` entry, and the generated artifact provenance map — see
|
|
|
37
39
|
| Spotlight (`css/spotlight.css`, `.ui-spotlight*`, `.ui-tour-note*`, `initSpotlight`) | Stable additive | Spotlight/tour-note class names, the `--spot-*` custom-property contract, and the `data-bronto-spotlight`/`data-target` attributes are public. Opt-in, not in the default bundle. Not a tour engine. |
|
|
38
40
|
| Crosshair (`css/crosshair.css`, `.ui-crosshair*`, `.ui-readout`, `initCrosshair`) | Stable additive | Crosshair/readout class names, the `--crosshair-x/y` properties, the `data-bronto-crosshair` attribute, and the `bronto:crosshair:move`/`:leave` event contract are public. Opt-in. Reports pointer position only — no data mapping. |
|
|
39
41
|
| Selection states (`css/selection.css`, `.ui-sel*`) | Stable additive | The `.ui-sel`/`--on`/`--off`/`--maybe` emphasis classes and recipe options are public. Opt-in, cross-cutting. The host owns selection logic; Bronto only styles the states. |
|
|
40
|
-
| Analytical roll-up (`css/analytical.css`) | Stable additive | A convenience `@import` of the
|
|
42
|
+
| Analytical roll-up (`css/analytical.css`) | Stable additive | A convenience `@import` of the nine analytical leaves (figure, annotations, legend, marks, connectors, spotlight, crosshair, selection, highlights). The set of leaves it bundles may grow additively; each leaf also stays individually exported. Opt-in, not in the default bundle. |
|
|
41
43
|
| Sources / provenance (`css/sources.css`, `.ui-citation*`, `.ui-source-card*`, `.ui-source-list*`, `.ui-provenance*`, `.ui-src--*`, `initSources`) | Stable additive | Citation/source/provenance class names, the cross-cutting `.ui-src--*` trust-state modifiers (always paired with an author label), the optional `data-bronto-sources` / `data-bronto-source-ref` behavior contract, `bronto:source:focus`, and the `ui.citation`/`ui.source`/`ui.provenance` recipes + `cls.sourceList` are public. Opt-in, not in the default bundle. |
|
|
42
44
|
| Lifecycle state (`css/state.css`, `.ui-state*`, `.ui-syncbar`) | Stable additive | The `.ui-state`/`__label`/`__detail`/`--busy` classes, the canonical lifecycle state modifiers, `.ui-syncbar`, and the `ui.state` recipe are public. Opt-in, not in the default bundle. |
|
|
43
45
|
| Generated / AI-trust (`css/generated.css`, `.ui-generated*`, `.ui-origin-label*`, `.ui-reasoning*`, `.ui-tool-log`, `.ui-tool-call*`) | Stable additive | The generated-content, origin-label (incl. `--ai`), reasoning-trace and tool-log/tool-call class names and the `ui.originLabel` recipe are public. Opt-in, not in the default bundle. Not a chat kit; no confidence widget. |
|
|
44
|
-
| Workbench (`css/workbench.css`, `.ui-inspector*`, `.ui-property*`, `.ui-selectionbar
|
|
46
|
+
| Workbench (`css/workbench.css`, `.ui-splitter*`, `.ui-inspector*`, `.ui-property*`, `.ui-selectionbar*`, `initSplitter`) | Stable additive | Splitter, inspector, property-row and selection-bar class + BEM part names are public (no recipe). `data-bronto-splitter`, `--splitter-pos`, `bronto:splitter:resize`, and the `initSplitter` cleanup contract are public. Opt-in, not in the default bundle. The host owns pane content, persistence, collapse policy, and selection state. |
|
|
45
47
|
| Command palette (`css/command.css`, `.ui-command*`, `initCommand`, `useCommand`) | Stable additive | Command class/part names, the `data-bronto-command` attribute, and the event contract — `bronto:command:select` (`detail: { value, label }`) and `bronto:command:close` — are public, plus the `useCommand` binding hook. Bronto filters + navigates (APG combobox/listbox); the host owns the action registry/execution. Opt-in, not in the default bundle, no global hotkey. |
|
|
46
48
|
| Controlled-modal focus trap (`initModal`, `useModal`, `data-bronto-modal`) | Stable additive | For the `.ui-modal.is-open` (non-`<dialog>`) path: the `data-bronto-modal` opt-in marker, the `inert`-based focus trap + focus-return, and the cancelable `bronto:modal:close` (`detail: { reason }`) event are public. The consumer still owns the `is-open` class; the behavior never changes visibility. The native `<dialog>` path (`initDialog`) is the default and gets the trap for free. |
|
|
47
49
|
| Keyboard-shortcut hint (`.ui-shortcut`, `.ui-shortcut__sep`) | Stable additive | Class names for the chord/sequence hint over `.ui-kbd` are public. Ships in the core layer (class-only, no recipe). |
|
package/docs/state.md
CHANGED
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
`@ponchia/ui/css/state.css` is an opt-in vocabulary for the states real apps
|
|
4
4
|
spend their time in — saving, saved, queued, offline, stale, conflicted, locked,
|
|
5
|
-
reviewed
|
|
5
|
+
reviewed, and background work still running after the initiating interaction is
|
|
6
|
+
gone. These are usually improvised per product, so even good apps feel
|
|
6
7
|
inconsistent. This is the canonical set: a labelled state object with a rationed
|
|
7
|
-
tone,
|
|
8
|
+
tone, a page/document sync bar, and a persistent background-job row.
|
|
8
9
|
|
|
9
10
|
```css
|
|
10
11
|
@import '@ponchia/ui';
|
|
@@ -12,10 +13,10 @@ tone, plus a page/document sync bar.
|
|
|
12
13
|
```
|
|
13
14
|
|
|
14
15
|
Bronto ships the visual states and the canonical wording. The host owns the
|
|
15
|
-
state machine, retry policy, persistence, and announcements.
|
|
16
|
-
deserves persistent UI** — a toast is secondary, not the
|
|
17
|
-
second channel; the **label is the state**, so it
|
|
18
|
-
screen readers (WCAG 1.4.1).
|
|
16
|
+
state machine, retry policy, persistence, cancellation, and announcements.
|
|
17
|
+
**Persistent state deserves persistent UI** — a toast is secondary, not the
|
|
18
|
+
answer. The tone is a second channel; the **label is the state**, so it
|
|
19
|
+
survives forced-colors and screen readers (WCAG 1.4.1).
|
|
19
20
|
|
|
20
21
|
## `.ui-state`
|
|
21
22
|
|
|
@@ -68,6 +69,61 @@ the other.
|
|
|
68
69
|
</div>
|
|
69
70
|
```
|
|
70
71
|
|
|
72
|
+
## `.ui-job`
|
|
73
|
+
|
|
74
|
+
A durable row for background jobs, imports, exports, sync runs, and pipelines.
|
|
75
|
+
It is deliberately not a task runner: the host owns polling, retry/cancel
|
|
76
|
+
semantics, queue position, partial failures, and completion messages. Bronto
|
|
77
|
+
paints a persistent status/progress object so long-running work is not hidden in
|
|
78
|
+
a transient toast.
|
|
79
|
+
|
|
80
|
+
```html
|
|
81
|
+
<article
|
|
82
|
+
class="ui-job ui-job--running"
|
|
83
|
+
style="--job-progress: 64%"
|
|
84
|
+
aria-labelledby="job-title"
|
|
85
|
+
>
|
|
86
|
+
<div class="ui-job__head">
|
|
87
|
+
<h3 class="ui-job__title" id="job-title">Importing listings</h3>
|
|
88
|
+
<span class="ui-state ui-state--saving ui-state--busy">
|
|
89
|
+
<span class="ui-state__label">Running</span>
|
|
90
|
+
<span class="ui-state__detail">64%</span>
|
|
91
|
+
</span>
|
|
92
|
+
</div>
|
|
93
|
+
<p class="ui-job__body">124 of 194 records processed. Latest checkpoint saved.</p>
|
|
94
|
+
<div
|
|
95
|
+
class="ui-job__progress"
|
|
96
|
+
role="progressbar"
|
|
97
|
+
aria-label="Import progress"
|
|
98
|
+
aria-valuemin="0"
|
|
99
|
+
aria-valuemax="100"
|
|
100
|
+
aria-valuenow="64"
|
|
101
|
+
>
|
|
102
|
+
<span class="ui-job__bar"></span>
|
|
103
|
+
</div>
|
|
104
|
+
<div class="ui-job__actions">
|
|
105
|
+
<button class="ui-button ui-button--subtle ui-button--sm" type="button">View log</button>
|
|
106
|
+
<button class="ui-button ui-button--ghost ui-button--sm" type="button">Cancel</button>
|
|
107
|
+
</div>
|
|
108
|
+
</article>
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Use the written state as the source of truth:
|
|
112
|
+
|
|
113
|
+
| State | Class | Typical label | Use when… |
|
|
114
|
+
| --- | --- | --- | --- |
|
|
115
|
+
| Queued | `ui-job--queued` | "Queued" | The job is accepted but not running yet. |
|
|
116
|
+
| Running | `ui-job--running` | "Running" / "Syncing" | Work is actively progressing. |
|
|
117
|
+
| Blocked | `ui-job--blocked` | "Blocked" / "Waiting" | Work cannot proceed without another system or user action. |
|
|
118
|
+
| Failed | `ui-job--failed` | "Failed" | The job stopped and needs retry, inspection, or acknowledgement. |
|
|
119
|
+
| Complete | `ui-job--complete` | "Complete" | Work finished and the result is available. |
|
|
120
|
+
|
|
121
|
+
For determinate jobs, set `--job-progress` as a percentage on `.ui-job` and
|
|
122
|
+
put `role="progressbar"` plus `aria-valuenow/min/max` on `.ui-job__progress`.
|
|
123
|
+
For indeterminate jobs, omit the progress block or omit `aria-valuenow`, and
|
|
124
|
+
make the written state clear ("Running", "Waiting for worker", "Retrying").
|
|
125
|
+
Use `ui-job--compact` for dense queues.
|
|
126
|
+
|
|
71
127
|
## Recipe
|
|
72
128
|
|
|
73
129
|
```js
|
|
@@ -75,11 +131,12 @@ import { ui } from '@ponchia/ui/classes';
|
|
|
75
131
|
|
|
76
132
|
ui.state({ state: 'saving', busy: true }); // "ui-state ui-state--saving ui-state--busy"
|
|
77
133
|
ui.state({ state: 'conflict' }); // "ui-state ui-state--conflict"
|
|
134
|
+
ui.job({ state: 'running' }); // "ui-job ui-job--running"
|
|
78
135
|
```
|
|
79
136
|
|
|
80
137
|
## Scope
|
|
81
138
|
|
|
82
|
-
CSS only — there is no JS yet. Auto-updating elapsed time ("2m ago")
|
|
83
|
-
progress text
|
|
84
|
-
|
|
85
|
-
|
|
139
|
+
CSS only — there is no JS yet. Auto-updating elapsed time ("2m ago"), live
|
|
140
|
+
progress text, polling, cancellation, retry, and conflict-resolution affordances
|
|
141
|
+
are the host's job. A small optional behavior may come later if a real consumer
|
|
142
|
+
needs it.
|
package/docs/theming.md
CHANGED
|
@@ -11,7 +11,7 @@ theme-owned neutral ramp endpoint:
|
|
|
11
11
|
|
|
12
12
|
| Token | Derivation (light / dark) | Role |
|
|
13
13
|
| --------------------- | -------------------------------------------- | ---- |
|
|
14
|
-
| `--accent-strong` | `--accent` mixed 83% with black /
|
|
14
|
+
| `--accent-strong` | `--accent` mixed 83% with black / 80% white | darker/lighter accent for hover, emphasis |
|
|
15
15
|
| `--accent-ramp-end` | white / black | neutral endpoint for the low-chroma OKLCH ramp |
|
|
16
16
|
| `--accent-text` | `var(--accent-strong)` (alias) | **accent used as foreground text** — the on-surface, AA-safe one |
|
|
17
17
|
| `--accent-soft` | `--accent` at 10% / 14% over transparent | tinted fills |
|
|
@@ -63,7 +63,7 @@ fills — follows automatically, in both light and dark.
|
|
|
63
63
|
> defaults to `--accent-strong` (a darkened/lightened accent). If you
|
|
64
64
|
> re-brand to a pale hue, raw `--accent` would fail as text — override
|
|
65
65
|
> `--accent-text` to a sufficiently dark/light value rather than
|
|
66
|
-
> relying on the 83%/
|
|
66
|
+
> relying on the 83%/80% mix.
|
|
67
67
|
>
|
|
68
68
|
> The defaults are tuned for both; verify if you deviate hard. The focus
|
|
69
69
|
> ring is solid `--accent` (≥ 3:1 non-text) — re-brand to a near-`--bg`
|
|
@@ -303,6 +303,14 @@ palette) carry real `$value`s; the CSS-runtime-derived family
|
|
|
303
303
|
`$value: null` + the CSS in `$extensions["com.ponchia.css"]` rather than
|
|
304
304
|
fabricating a number — the resolvable knob is `color.<theme>.accent`.
|
|
305
305
|
|
|
306
|
+
`@ponchia/ui/tokens/figma.variables.json` is the resolved local handoff for
|
|
307
|
+
Figma Variables import/sync scripts. It is generated from `tokens/resolved.json`
|
|
308
|
+
and keeps a `Bronto / Color` collection with `Light` and `Dark` modes plus a
|
|
309
|
+
`Bronto / Scale` collection for spacing, radius, type, z-index and motion.
|
|
310
|
+
Colour values are exported as Figma-style RGBA objects; non-colour values keep
|
|
311
|
+
their original CSS value under `$extensions["com.ponchia.css"]` so importer
|
|
312
|
+
scripts do not lose units.
|
|
313
|
+
|
|
306
314
|
## Reading tokens from JS
|
|
307
315
|
|
|
308
316
|
`@ponchia/ui/tokens` exposes the model as data. The ergonomic view only
|
package/docs/usage.md
CHANGED
|
@@ -276,12 +276,14 @@ without it these widgets are unlabelled or unannounced:
|
|
|
276
276
|
- **`ui-skiplink`** — keep it the first focusable element and point its `href`
|
|
277
277
|
at the `id` of your main landmark.
|
|
278
278
|
|
|
279
|
-
## App shell: the
|
|
279
|
+
## App shell: the service frame
|
|
280
280
|
|
|
281
|
-
`ui-app-shell` is
|
|
282
|
-
column
|
|
283
|
-
|
|
284
|
-
|
|
281
|
+
`ui-app-shell` is the default cross-service identity frame: a CSS-only
|
|
282
|
+
two-column app shell (sidebar rail + main column) that collapses to a single
|
|
283
|
+
column with a horizontal rail below 880px — no behavior required. Use it for
|
|
284
|
+
ops tools, admin apps, internal services, generated dashboards, and any workflow
|
|
285
|
+
surface that should feel like part of the same system. The nesting matters; the
|
|
286
|
+
rail is `ui-app-rail` and the content side is `ui-app-main`:
|
|
285
287
|
|
|
286
288
|
```html
|
|
287
289
|
<div class="ui-app-shell">
|
|
@@ -290,7 +292,9 @@ content side is `ui-app-main`:
|
|
|
290
292
|
<nav class="ui-app-nav" aria-label="Primary">
|
|
291
293
|
<span class="ui-app-nav__section">Main</span>
|
|
292
294
|
<a href="/overview" aria-current="page">Overview</a>
|
|
293
|
-
<a href="/
|
|
295
|
+
<a href="/jobs">Jobs</a>
|
|
296
|
+
<a href="/integrations">Integrations</a>
|
|
297
|
+
<a href="/settings">Settings</a>
|
|
294
298
|
</nav>
|
|
295
299
|
<div class="ui-app-rail__account">…</div>
|
|
296
300
|
</aside>
|
|
@@ -310,6 +314,21 @@ Knobs: `--app-rail` sets the rail width (default 14rem); `ui-app-shell--full`
|
|
|
310
314
|
drops the rail for a single-column app. `ui-app-nav` honours `aria-current="page"`
|
|
311
315
|
(preferred) and the visual-only `.is-active`.
|
|
312
316
|
|
|
317
|
+
Service composition checklist:
|
|
318
|
+
|
|
319
|
+
- Start with `ui-app-shell`, `ui-app-rail`, `ui-app-nav`, `ui-app-main`,
|
|
320
|
+
`ui-app-topbar`, and `ui-app-content`.
|
|
321
|
+
- Put brand and account identity in the rail; do not rebuild that frame per app.
|
|
322
|
+
- Use `ui-app-toolbar` for filters/actions above a workflow surface.
|
|
323
|
+
- Use `ui-app-panel` for grouped operational sections, not nested cards.
|
|
324
|
+
- Use `ui-statgrid`/`ui-stat`, `ui-table`, `ui-field`, `ui-alert`, and
|
|
325
|
+
`ui-progress` inside panels; add opt-in `state.css` for `ui-state` lifecycle
|
|
326
|
+
labels.
|
|
327
|
+
- Keep nav current state on `aria-current="page"` so the visual cue and AT cue
|
|
328
|
+
match.
|
|
329
|
+
- Reach for opt-in `workbench.css` only when the service needs panes,
|
|
330
|
+
inspectors, or selected-object bulk actions.
|
|
331
|
+
|
|
313
332
|
## Menus: `data-bronto-menu` + `initMenu`
|
|
314
333
|
|
|
315
334
|
A dropdown menu is a native `<details data-bronto-menu>` styled as
|
|
@@ -606,10 +625,11 @@ These are JS widgets wearing the Bronto look; without the behavior they are iner
|
|
|
606
625
|
| Tabs (`ui-tabs`) | `initTabs` | **author panels visible** — ship `hidden` panels and if `initTabs` never runs the content is unreachable |
|
|
607
626
|
| Combobox (`ui-combobox`) | `initCombobox` | a plain text input beside an unfiltered list |
|
|
608
627
|
| Command palette (`ui-command`) | `initCommand` | a static, unfiltered list |
|
|
628
|
+
| Splitter (`ui-splitter`) | `initSplitter` | fixed panes at the authored `--splitter-pos`; no keyboard/pointer resize or `aria-valuenow` updates |
|
|
609
629
|
| Table sort/select (`[data-bronto-sortable]`) | `initTableSort` | a static table (still readable) |
|
|
610
630
|
| Popover (`ui-popover`) | `initPopover` | no placement/ARIA — prefer the native `popover` attribute |
|
|
611
631
|
| Carousel (`ui-carousel`) | `initCarousel` | a native scroll-snap track (usable, no controls) |
|
|
612
|
-
| Controlled modal (`ui-modal.is-open`) | `initModal` |
|
|
632
|
+
| Controlled modal (`ui-modal.is-open`) | `initModal` | open skin only — no inert trap, focus-return, or Escape close signal |
|
|
613
633
|
| Menu (`data-bronto-menu`) | `initMenu` | a button next to a list with no open/close, outside-click, or Escape |
|
|
614
634
|
| Toast | `toast()` | nothing — it is imperative-only |
|
|
615
635
|
|
|
@@ -628,10 +648,10 @@ boundary of what CSS alone cannot do.
|
|
|
628
648
|
The CSS is the framework; `@ponchia/ui/behaviors` is the *sanctioned*
|
|
629
649
|
home for the little JS that genuinely needs scripting (theme persistence,
|
|
630
650
|
disclosure, dialog glue, modal focus-trap, toast, combobox, form-validation,
|
|
631
|
-
table-sort). Reach for it instead of reimplementing — every
|
|
632
|
-
SSR-safe, idempotent, and returns a cleanup. If you find yourself
|
|
633
|
-
management or `aria-expanded` toggling by hand,
|
|
634
|
-
a behavior for it.
|
|
651
|
+
table-sort, splitter resizing). Reach for it instead of reimplementing — every
|
|
652
|
+
initializer is SSR-safe, idempotent, and returns a cleanup. If you find yourself
|
|
653
|
+
writing focus management, ARIA value sync, or `aria-expanded` toggling by hand,
|
|
654
|
+
there is probably already a behavior for it.
|
|
635
655
|
|
|
636
656
|
## Re-brand obligations (the short version)
|
|
637
657
|
|
package/docs/workbench.md
CHANGED
|
@@ -1,29 +1,69 @@
|
|
|
1
|
-
# Workbench — inspector, properties, selection bar
|
|
1
|
+
# Workbench — split panes, inspector, properties, selection bar
|
|
2
2
|
|
|
3
3
|
`@ponchia/ui/css/workbench.css` is an opt-in set of primitives for **real
|
|
4
|
-
tools**: an inspector panel, property rows for a selected
|
|
5
|
-
actions on the current selection. Generic kits stop at
|
|
6
|
-
every app builds its own half-consistent workbench. This
|
|
7
|
-
core — layout and
|
|
4
|
+
tools**: resizable split panes, an inspector panel, property rows for a selected
|
|
5
|
+
object, and a bar of actions on the current selection. Generic kits stop at
|
|
6
|
+
cards/tables/forms, so every app builds its own half-consistent workbench. This
|
|
7
|
+
is the low-risk core — layout, resize affordance, and ARIA value sync.
|
|
8
8
|
|
|
9
9
|
```css
|
|
10
10
|
@import '@ponchia/ui';
|
|
11
11
|
@import '@ponchia/ui/css/workbench.css';
|
|
12
12
|
```
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
```js
|
|
15
|
+
import { initSplitter } from '@ponchia/ui/behaviors';
|
|
16
|
+
|
|
17
|
+
initSplitter();
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Not in the core bundle. Import the CSS leaf where the workbench appears and run
|
|
21
|
+
`initSplitter()` only if the page includes `[data-bronto-splitter]`.
|
|
22
|
+
|
|
23
|
+
## Splitter — `.ui-splitter`
|
|
24
|
+
|
|
25
|
+
Two panes separated by a focusable ARIA separator handle. The CSS owns the grid
|
|
26
|
+
tracks and handle affordance; `initSplitter()` owns keyboard/pointer resizing,
|
|
27
|
+
`--splitter-pos`, `aria-valuenow`, and the `bronto:splitter:resize` event. The
|
|
28
|
+
host owns pane content, persistence, saved layout state, collapse policy, and any
|
|
29
|
+
domain selection model.
|
|
30
|
+
|
|
31
|
+
```html
|
|
32
|
+
<div
|
|
33
|
+
class="ui-splitter ui-splitter--vertical"
|
|
34
|
+
data-bronto-splitter
|
|
35
|
+
style="--splitter-pos: 36%"
|
|
36
|
+
>
|
|
37
|
+
<section class="ui-splitter__pane" id="files" aria-label="Files">...</section>
|
|
38
|
+
<div
|
|
39
|
+
class="ui-splitter__handle"
|
|
40
|
+
role="separator"
|
|
41
|
+
tabindex="0"
|
|
42
|
+
aria-controls="files"
|
|
43
|
+
aria-label="Resize files pane"
|
|
44
|
+
aria-orientation="vertical"
|
|
45
|
+
aria-valuemin="20"
|
|
46
|
+
aria-valuemax="72"
|
|
47
|
+
aria-valuenow="36"
|
|
48
|
+
></div>
|
|
49
|
+
<section class="ui-splitter__pane" aria-label="Preview">...</section>
|
|
50
|
+
</div>
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Use `.ui-splitter--horizontal` for top/bottom panes. Arrow keys change the value
|
|
54
|
+
by 2 percentage points, Shift+Arrow and PageUp/PageDown by 10, and Home/End jump
|
|
55
|
+
to `aria-valuemin` / `aria-valuemax`. The handle needs a real accessible name
|
|
56
|
+
and `aria-controls` pointing at the primary pane.
|
|
17
57
|
|
|
18
58
|
## Inspector — `.ui-inspector`
|
|
19
59
|
|
|
20
|
-
A panel of details for the selected object: a `
|
|
60
|
+
A panel of details for the selected object: a `__head` (title + actions) over
|
|
21
61
|
a `__body` of property rows.
|
|
22
62
|
|
|
23
63
|
```html
|
|
24
64
|
<aside class="ui-inspector">
|
|
25
65
|
<div class="ui-inspector__head">
|
|
26
|
-
<h2 class="ui-eyebrow">
|
|
66
|
+
<h2 class="ui-eyebrow">Sync job</h2>
|
|
27
67
|
<button class="ui-button ui-button--subtle ui-button--sm" type="button">Reset</button>
|
|
28
68
|
</div>
|
|
29
69
|
<div class="ui-inspector__body">
|
|
@@ -39,12 +79,12 @@ A label/value pair, denser than `ui-key-value` and tuned for an inspector. The
|
|
|
39
79
|
|
|
40
80
|
```html
|
|
41
81
|
<div class="ui-property">
|
|
42
|
-
<span class="ui-property__label">
|
|
43
|
-
<span class="ui-property__value">
|
|
82
|
+
<span class="ui-property__label">Owner</span>
|
|
83
|
+
<span class="ui-property__value">Platform</span>
|
|
44
84
|
</div>
|
|
45
85
|
<div class="ui-property">
|
|
46
|
-
<span class="ui-property__label">
|
|
47
|
-
<span class="ui-property__value"><input class="ui-input" value="
|
|
86
|
+
<span class="ui-property__label">Retries</span>
|
|
87
|
+
<span class="ui-property__value"><input class="ui-input" value="3" /></span>
|
|
48
88
|
</div>
|
|
49
89
|
```
|
|
50
90
|
|
|
@@ -72,7 +112,8 @@ A raised bar of actions on the current selection: a `__count` on one side,
|
|
|
72
112
|
|
|
73
113
|
## Scope
|
|
74
114
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
the selection bar with the cross-cutting [`ui-sel`](./selection.md) states
|
|
78
|
-
selected items themselves
|
|
115
|
+
No recipes — these are structural containers and rows; apply the classes
|
|
116
|
+
directly (or read them from `cls.splitter`, `cls.inspector`, `cls.property`, …).
|
|
117
|
+
Pair the selection bar with the cross-cutting [`ui-sel`](./selection.md) states
|
|
118
|
+
on the selected items themselves. Bronto styles both and wires the splitter
|
|
119
|
+
affordance; the host owns hit-testing, persistence, pane contents, and commands.
|
package/llms.txt
CHANGED
|
@@ -44,7 +44,7 @@ the path changes from source `css/` to built `dist/css/`:
|
|
|
44
44
|
<!-- installed locally -->
|
|
45
45
|
<link rel="stylesheet" href="./node_modules/@ponchia/ui/dist/css/<leaf>.css" />
|
|
46
46
|
<!-- or from a CDN; pin the version (pre-1.0, breaking changes ship in the minor) -->
|
|
47
|
-
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.6.
|
|
47
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.6.7/dist/css/<leaf>.css" />
|
|
48
48
|
```
|
|
49
49
|
|
|
50
50
|
The flattened default bundle is `dist/bronto.css` (bundler shorthand
|
|
@@ -213,10 +213,30 @@ simulated protan/deutan/tritan), `--chart-seq-*` (sequential), `--chart-div-*`
|
|
|
213
213
|
pattern N; colour is never the sole signal). Details in `docs/theming.md`.
|
|
214
214
|
|
|
215
215
|
Building analytical / generated-report UI? Import the roll-up
|
|
216
|
-
`@ponchia/ui/css/analytical.css` (bundles
|
|
217
|
-
connectors + spotlight + crosshair + selection) instead
|
|
218
|
-
add `css/dataviz.css` for chart colours and `css/report.css`
|
|
219
|
-
grammar.
|
|
216
|
+
`@ponchia/ui/css/analytical.css` (bundles figure + annotations + legend +
|
|
217
|
+
marks + connectors + spotlight + crosshair + selection + highlights) instead
|
|
218
|
+
of the nine leaves; add `css/dataviz.css` for chart colours and `css/report.css`
|
|
219
|
+
for the document grammar. Interval and clamp are report/evidence leaves but are
|
|
220
|
+
NOT in the roll-up; link them individually. The individual layers (each opt-in,
|
|
221
|
+
none in the default bundle):
|
|
222
|
+
|
|
223
|
+
Optional figure stage for charts, diagrams, screenshots, and annotated media —
|
|
224
|
+
opt-in, never in the default bundle. It composes with `ui-report__figure` but
|
|
225
|
+
does not replace it:
|
|
226
|
+
|
|
227
|
+
```html
|
|
228
|
+
<link rel="stylesheet" href="@ponchia/ui/css/figure.css" />
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
Use `ui-figure` on the `<figure>`, `ui-figure__caption` on the caption,
|
|
232
|
+
`ui-figure__body` and optional `ui-figure__body--key-right` for stage + key
|
|
233
|
+
layout, `ui-figure__stage` for the centered media box, `ui-figure__media` for
|
|
234
|
+
the chart/SVG/img/canvas, `ui-figure__overlay` for pointer-transparent absolute
|
|
235
|
+
overlays, `ui-figure__key` for legends, and `ui-figure__data` for fallback
|
|
236
|
+
tables. Author-set knobs: `--figure-max-inline`, `--figure-min-block`,
|
|
237
|
+
`--figure-key-width`. Bronto owns layout only; the host owns data, scales,
|
|
238
|
+
chart rendering, overlay content, and accessibility text. Details:
|
|
239
|
+
`docs/figure.md`.
|
|
220
240
|
|
|
221
241
|
Optional SVG annotations for charts/reports — opt-in, never in the default
|
|
222
242
|
bundle. This is Bronto's subject / connector / note grammar inspired by
|
|
@@ -351,6 +371,20 @@ Apply `ui-sel` + `ui-sel--on` (selected), `ui-sel--off` (excluded), or
|
|
|
351
371
|
row, list item, map region) from YOUR selection/brush logic — Bronto only styles
|
|
352
372
|
them. `ui.sel({ state: 'on'|'off'|'maybe' })`. Details: `docs/selection.md`.
|
|
353
373
|
|
|
374
|
+
Optional Custom Highlight API paint — opt-in, CSS only, never in the default
|
|
375
|
+
bundle. For cited evidence, search hits, and current match ranges without
|
|
376
|
+
wrapping text nodes:
|
|
377
|
+
|
|
378
|
+
```html
|
|
379
|
+
<link rel="stylesheet" href="@ponchia/ui/css/highlights.css" />
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
Put `ui-highlights` on the text scope. The host creates `Range` objects and
|
|
383
|
+
registers `Highlight` sets as `CSS.highlights.set('bronto-evidence', ...)`,
|
|
384
|
+
`bronto-search`, and `bronto-current`; Bronto only paints them. Custom props:
|
|
385
|
+
`--highlight-evidence`, `--highlight-search`, `--highlight-current`. Always
|
|
386
|
+
check `CSS.highlights` before registering. Details: `docs/highlights.md`.
|
|
387
|
+
|
|
354
388
|
Optional source/citation/provenance trust layer — opt-in, CSS only, never in
|
|
355
389
|
the default bundle. The grammar for "where did this come from?" in generated
|
|
356
390
|
reports/AI output:
|
|
@@ -371,6 +405,32 @@ author-written label (never colour alone). A tone class **needs a host**:
|
|
|
371
405
|
states; the host owns fetching, numbering, and trust. `ui.citation({chip,state})` / `ui.source({state})` /
|
|
372
406
|
`ui.provenance({state})`. Details: `docs/sources.md`.
|
|
373
407
|
|
|
408
|
+
Optional low/high interval — opt-in, CSS only, never in the default bundle. For
|
|
409
|
+
confidence windows, estimates, budget bands, or caveated evidence readings:
|
|
410
|
+
|
|
411
|
+
```html
|
|
412
|
+
<link rel="stylesheet" href="@ponchia/ui/css/interval.css" />
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
Use `ui-interval` with host-normalised `--lo` and `--hi` (0..1), optional
|
|
416
|
+
`ui-interval__point` with `--v`, plus `ui-interval__track`,
|
|
417
|
+
`ui-interval__range`, `ui-interval__label`, and `ui-interval__bounds`.
|
|
418
|
+
The container needs host-written text (`role="img"` + `aria-label`, or nearby
|
|
419
|
+
visible prose). Bronto paints geometry only. Details: `docs/interval.md`.
|
|
420
|
+
|
|
421
|
+
Optional bounded excerpt clamp — opt-in, CSS only, never in the default bundle.
|
|
422
|
+
For source excerpts, claim basis, and caveats that should scan compactly but
|
|
423
|
+
remain reachable:
|
|
424
|
+
|
|
425
|
+
```html
|
|
426
|
+
<link rel="stylesheet" href="@ponchia/ui/css/clamp.css" />
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
Use `ui-clamp` with `--clamp-lines`, `ui-clamp__body`, and optionally a checkbox
|
|
430
|
+
`ui-clamp__toggle` followed by a visible `ui-clamp__control` containing explicit
|
|
431
|
+
`ui-clamp__more` / `ui-clamp__less` text. Host owns IDs and content. Print
|
|
432
|
+
expands the body and hides the control. Details: `docs/clamp.md`.
|
|
433
|
+
|
|
374
434
|
Optional line/row change-review grammar — opt-in, CSS only, never in the
|
|
375
435
|
default bundle. For code review, changelogs, version history, config diffs, and
|
|
376
436
|
generated reports:
|
|
@@ -569,11 +629,13 @@ specifiers only work after a bundler rewrites them:
|
|
|
569
629
|
<link rel="stylesheet" href="./node_modules/@ponchia/ui/dist/bronto.css" />
|
|
570
630
|
<link rel="stylesheet" href="./node_modules/@ponchia/ui/dist/css/report.css" />
|
|
571
631
|
<link rel="stylesheet" href="./node_modules/@ponchia/ui/dist/css/dataviz.css" />
|
|
632
|
+
<link rel="stylesheet" href="./node_modules/@ponchia/ui/dist/css/figure.css" />
|
|
572
633
|
<link rel="stylesheet" href="./node_modules/@ponchia/ui/dist/css/sources.css" />
|
|
573
634
|
```
|
|
574
635
|
|
|
575
636
|
In Vite/webpack/etc., import `@ponchia/ui`, `@ponchia/ui/css/report.css`, and
|
|
576
|
-
`@ponchia/ui/css/dataviz.css` instead.
|
|
637
|
+
`@ponchia/ui/css/dataviz.css` instead; add `figure.css`, `interval.css`,
|
|
638
|
+
`clamp.css`, or `highlights.css` only when the report uses them.
|
|
577
639
|
|
|
578
640
|
Canonical report skeleton:
|
|
579
641
|
|
|
@@ -616,8 +678,9 @@ Report rules for agents:
|
|
|
616
678
|
- Use semantic headings; give tables captions and header cells; give charts
|
|
617
679
|
captions, legends/direct labels, and fallback data.
|
|
618
680
|
- For a chart, theme Vega-Lite with `@ponchia/ui/vega` or hand-author a
|
|
619
|
-
token-themed inline `<svg>` inside
|
|
620
|
-
|
|
681
|
+
token-themed inline `<svg>` inside `ui-report__figure ui-figure`, with a
|
|
682
|
+
`ui-figure__stage`, optional `ui-figure__key`, and fallback `ui-figure__data`.
|
|
683
|
+
Bronto ships no chart component.
|
|
621
684
|
- Put the above-the-fold call in `ui-report__decision`; use
|
|
622
685
|
`ui-report__finding--critical|--major|--minor|--resolved` only when the
|
|
623
686
|
written finding label also states the severity/status.
|
|
@@ -633,9 +696,12 @@ Report rules for agents:
|
|
|
633
696
|
conflicting, unverified, or generated inputs should be surfaced near affected
|
|
634
697
|
claims, not only in the source appendix.
|
|
635
698
|
- For important reports, emit a sidecar `claims.json` / source archive manifest
|
|
636
|
-
with
|
|
637
|
-
|
|
638
|
-
|
|
699
|
+
with `schemaVersion: "bronto-report-claims.v1"` and, when validating,
|
|
700
|
+
`@ponchia/ui/schemas/report-claims.v1.schema.json`. Include stable claim IDs,
|
|
701
|
+
source IDs, status, risk, retrieval time, and explicit `relations`
|
|
702
|
+
(`supports`, `limits`, `contradicts`, or `informs`). The visible HTML remains
|
|
703
|
+
the primary artifact, but the sidecar lets tools prove IDs and high-risk
|
|
704
|
+
evidence still resolve.
|
|
639
705
|
- Use `ui-delta` (`--up`/`--down`/`--flat`, `--invert` when up is bad) for a
|
|
640
706
|
trend figure and `ui-compare` (`--2up`) for an A/B / before-after section.
|
|
641
707
|
- Use `ui-report__section--unnumbered` for appendices in numbered reports.
|
|
@@ -676,6 +742,8 @@ Read these from `node_modules/@ponchia/ui/` — no network needed:
|
|
|
676
742
|
- `docs/reporting.md` — static/PDF-first report cookbook for LLM-authored
|
|
677
743
|
reports, including report skeletons, decision/finding/evidence patterns,
|
|
678
744
|
chart rules, print utilities, and safety boundaries.
|
|
745
|
+
- `schemas/report-claims.v1.schema.json` — declarative JSON Schema for
|
|
746
|
+
`claims.json` sidecars that map report claims to source IDs and relations.
|
|
679
747
|
- `docs/annotations.md` — SVG annotation recipes and helper guidance for
|
|
680
748
|
analytical figures.
|
|
681
749
|
- `docs/mermaid.md` — theme Mermaid diagrams from bronto tokens (resolved
|
|
@@ -705,7 +773,7 @@ Read these from `node_modules/@ponchia/ui/` — no network needed:
|
|
|
705
773
|
annotation geometry.
|
|
706
774
|
- `classes/vscode.css-custom-data.json` — editor autocomplete for tokens.
|
|
707
775
|
|
|
708
|
-
##
|
|
776
|
+
## External web references
|
|
709
777
|
|
|
710
778
|
- Live kitchen-sink demo (every component, light/dark, RTL): https://ponchia.github.io/bronto-ui/
|
|
711
779
|
- Architecture & the CSS-first decision: https://github.com/Ponchia/bronto-ui/blob/main/docs/architecture.md
|