@ponchia/ui 0.9.0 → 0.11.0
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 +107 -4
- package/MIGRATIONS.json +127 -18
- package/README.md +17 -9
- package/behaviors/index.d.ts +0 -2
- package/behaviors/index.d.ts.map +1 -1
- package/behaviors/index.js +0 -2
- package/behaviors/popover.js +4 -4
- package/classes/classes.json +53 -9
- package/classes/index.d.ts +20 -3
- package/classes/index.js +33 -3
- package/classes/vscode.css-custom-data.json +10 -10
- package/css/annotations.css +2 -2
- package/css/app.css +55 -31
- package/css/base.css +10 -14
- package/css/command.css +4 -4
- package/css/content.css +23 -21
- package/css/disclosure.css +17 -17
- package/css/discussion.css +150 -0
- package/css/feedback.css +15 -15
- package/css/figure.css +6 -4
- package/css/forms.css +8 -7
- package/css/generated.css +19 -12
- package/css/legend.css +13 -5
- package/css/navigation.css +3 -3
- package/css/overlay.css +13 -29
- package/css/primitives.css +48 -28
- package/css/report.css +91 -53
- package/css/sources.css +1 -1
- package/css/state.css +95 -6
- package/css/table.css +3 -3
- package/css/tokens.css +10 -10
- package/css/workbench.css +21 -9
- package/dist/bronto.css +1 -1
- package/dist/css/analytical.css +1 -1
- package/dist/css/annotations.css +1 -1
- package/dist/css/app.css +1 -1
- package/dist/css/base.css +1 -1
- package/dist/css/command.css +1 -1
- package/dist/css/content.css +1 -1
- package/dist/css/disclosure.css +1 -1
- package/dist/css/discussion.css +1 -0
- package/dist/css/feedback.css +1 -1
- package/dist/css/figure.css +1 -1
- package/dist/css/forms.css +1 -1
- package/dist/css/generated.css +1 -1
- package/dist/css/legend.css +1 -1
- package/dist/css/navigation.css +1 -1
- package/dist/css/overlay.css +1 -1
- package/dist/css/primitives.css +1 -1
- package/dist/css/report-kit.css +1 -1
- package/dist/css/report.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/0004-prune-unused-adapters.md +5 -1
- package/docs/adr/0005-productive-tools-and-editorial-reports.md +58 -0
- package/docs/adr/0006-trusted-publishing.md +92 -0
- package/docs/architecture.md +16 -23
- package/docs/command.md +1 -2
- package/docs/compositions.md +131 -0
- package/docs/discussion.md +64 -0
- package/docs/figure.md +10 -1
- package/docs/frontier-primitives.md +1 -2
- package/docs/migrations/0.10-to-0.11.md +61 -0
- package/docs/migrations/0.9-to-0.10.md +47 -0
- package/docs/package-contract.md +16 -13
- package/docs/reference.md +47 -18
- package/docs/reporting.md +15 -9
- package/docs/stability.md +20 -55
- package/docs/state.md +47 -0
- package/docs/usage.md +18 -30
- package/llms.txt +7 -18
- package/package.json +18 -54
- package/tokens/figma.variables.json +20 -20
- package/tokens/index.js +10 -10
- package/tokens/index.json +20 -20
- package/tokens/resolved.json +10 -10
- package/tokens/tokens.dtcg.json +20 -20
- package/behaviors/modal.d.ts +0 -45
- package/behaviors/modal.d.ts.map +0 -1
- package/behaviors/modal.js +0 -373
- package/qwik/index.d.ts +0 -48
- package/qwik/index.d.ts.map +0 -1
- package/qwik/index.js +0 -227
- package/react/index.d.ts +0 -45
- package/react/index.d.ts.map +0 -1
- package/react/index.js +0 -165
- package/solid/index.d.ts +0 -75
- package/solid/index.d.ts.map +0 -1
- package/solid/index.js +0 -172
- package/svelte/index.d.ts +0 -114
- package/svelte/index.d.ts.map +0 -1
- package/svelte/index.js +0 -197
- package/vue/index.d.ts +0 -116
- package/vue/index.d.ts.map +0 -1
- package/vue/index.js +0 -266
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# 0006. Publish to npm without a stored credential
|
|
2
|
+
|
|
3
|
+
Status: accepted; applies from 0.10.0
|
|
4
|
+
|
|
5
|
+
## Context
|
|
6
|
+
|
|
7
|
+
Releases authenticated to npm with a granular access token held in the
|
|
8
|
+
`NPM_TOKEN` secret of the protected `npm-publish` environment. The token was
|
|
9
|
+
created on 2026-05-30 with 2FA bypass, write access to `@ponchia/ui`, and an
|
|
10
|
+
expiry of 2026-08-28.
|
|
11
|
+
|
|
12
|
+
The v0.10.0 release exposed the cost of that design. Every gate passed —
|
|
13
|
+
validation, cross-engine end-to-end, packed examples, publish preflight — the
|
|
14
|
+
maintainer approved the protected environment, and the publish then failed
|
|
15
|
+
with `E404` on an existing package. `E404` reads as "no such package", so the
|
|
16
|
+
first hypothesis was package metadata. The real cause was that the token had
|
|
17
|
+
expired eleven days earlier. A read-only `whoami` request would have returned
|
|
18
|
+
`401` at any point in those eleven days, but nothing was asking.
|
|
19
|
+
|
|
20
|
+
Three properties of the old design combined into that outcome:
|
|
21
|
+
|
|
22
|
+
- The credential's validity was invisible until the most expensive moment in
|
|
23
|
+
the pipeline, after roughly twenty minutes of gates and a human approval.
|
|
24
|
+
- npm's failure mode misattributes an authentication problem to the package,
|
|
25
|
+
so the error text actively points investigation the wrong way.
|
|
26
|
+
- Expiry is silent. Nothing in the repository, the environment, or CI knew the
|
|
27
|
+
date; it lived only in a note beside the token in the password manager.
|
|
28
|
+
|
|
29
|
+
The approval gate did not and could not help. A required reviewer releases the
|
|
30
|
+
job; it does not check that the job can authenticate.
|
|
31
|
+
|
|
32
|
+
Two further constraints made "rotate the token and continue" unattractive.
|
|
33
|
+
From August 2026 npm forbids tokens with 2FA bypass from performing token
|
|
34
|
+
management, so a CI token can no longer mint or rotate its successor — every
|
|
35
|
+
renewal is a manual browser session with a second factor. And npm has stated
|
|
36
|
+
that direct token publishing will be reduced further, with trusted publishing
|
|
37
|
+
as the endorsed path.
|
|
38
|
+
|
|
39
|
+
Trusted publishing was previously assessed as unavailable to this estate: npm
|
|
40
|
+
supports it only on provider-hosted runners, and most repositories here run on
|
|
41
|
+
self-hosted `arc-vps-*` runners because GitHub-hosted minutes are billing
|
|
42
|
+
blocked. That assessment does not hold for this repository. `bronto-ui` is
|
|
43
|
+
public, so GitHub-hosted minutes are free, and the release workflow already
|
|
44
|
+
runs entirely on `ubuntu-latest`.
|
|
45
|
+
|
|
46
|
+
## Decision
|
|
47
|
+
|
|
48
|
+
Publish by trusted publishing (OIDC). No npm credential is stored.
|
|
49
|
+
|
|
50
|
+
GitHub mints a short-lived token for the workflow run; npm exchanges it for a
|
|
51
|
+
publish credential scoped to that run. The publisher is registered on npmjs.com
|
|
52
|
+
against a four-part identity: the organization `Ponchia`, the repository
|
|
53
|
+
`bronto-ui`, the workflow filename `release.yml`, and the environment
|
|
54
|
+
`npm-publish`. All four must match or the exchange is refused.
|
|
55
|
+
|
|
56
|
+
Two conditions are enforced by `check:release` rather than left to review,
|
|
57
|
+
because both fail only at publish time:
|
|
58
|
+
|
|
59
|
+
- `publish-npm` raises the npm CLI past 11.5.1. Node 22 bundles npm 10.x,
|
|
60
|
+
which predates OIDC support and falls back to looking for a token.
|
|
61
|
+
- `publish-npm` references neither `NODE_AUTH_TOKEN` nor `secrets.NPM_TOKEN`.
|
|
62
|
+
A reintroduced token takes precedence over OIDC, which would quietly restore
|
|
63
|
+
the failure mode this decision removes.
|
|
64
|
+
|
|
65
|
+
## Consequences
|
|
66
|
+
|
|
67
|
+
The expiry class of failure is gone: there is no long-lived credential, so
|
|
68
|
+
there is no date to miss and no rotation to schedule. The blast radius of a
|
|
69
|
+
compromised repository secret shrinks to nothing, because the secret does not
|
|
70
|
+
exist. Provenance is generated automatically instead of depending on a flag.
|
|
71
|
+
|
|
72
|
+
The identity is now positional, which is the cost. Renaming `release.yml`,
|
|
73
|
+
moving the publish to another environment, or transferring the repository
|
|
74
|
+
breaks publishing until the npm-side registration is updated — a rename that
|
|
75
|
+
is otherwise routine becomes a release-blocking change. The workflow header
|
|
76
|
+
and `docs/architecture.md` both say so at the point where someone would make
|
|
77
|
+
that edit.
|
|
78
|
+
|
|
79
|
+
Registration itself remains a browser action requiring the maintainer's second
|
|
80
|
+
factor. That is a one-time cost rather than a recurring one, which is the
|
|
81
|
+
whole point.
|
|
82
|
+
|
|
83
|
+
The `NPM_TOKEN` secret and its password-manager entry are retired after the
|
|
84
|
+
first successful trusted publish, not before, so the previous path stays
|
|
85
|
+
available if the exchange needs debugging.
|
|
86
|
+
|
|
87
|
+
Like every other ADR, this record ships in the package. `check:pack` enforces
|
|
88
|
+
that: the published documentation points into `docs/adr/`, so an ADR that
|
|
89
|
+
exists but is not in `files` leaves a consumer following that pointer at a
|
|
90
|
+
404. The decision set is published whole or not at all — a release-mechanics
|
|
91
|
+
record is not carved out on the grounds that consumers are unlikely to want
|
|
92
|
+
it.
|
package/docs/architecture.md
CHANGED
|
@@ -11,9 +11,9 @@ Status: accepted · 2026-05-15 · applies from v0.2.0
|
|
|
11
11
|
> gates, opt-in colorways, data-viz, APCA advisory reporting, and the
|
|
12
12
|
> OKLCH core accent ramp.
|
|
13
13
|
> - [ADR-0004 — Prune unused adapter and controlled-modal surfaces](./adr/0004-prune-unused-adapters.md)
|
|
14
|
-
> (
|
|
15
|
-
>
|
|
16
|
-
>
|
|
14
|
+
> (implemented in 0.10) — remove unadopted adapters and the controlled modal.
|
|
15
|
+
> - [ADR-0005 — Productive tools and editorial reports](./adr/0005-productive-tools-and-editorial-reports.md)
|
|
16
|
+
> (accepted; 0.10) — readable defaults, selective display identity, and task-led composition.
|
|
17
17
|
|
|
18
18
|
## Context
|
|
19
19
|
|
|
@@ -44,11 +44,6 @@ on top of the CSS, none of which require a framework commitment**:
|
|
|
44
44
|
├── annotations/ pure SVG callout geometry (builds on connectors) [optional]
|
|
45
45
|
├── glyphs/ dot-matrix glyph registry/renderers [optional]
|
|
46
46
|
├── schemas/ declarative JSON contracts for report/tooling data [optional]
|
|
47
|
-
├── react/ deprecated React hooks over behaviors [remove >=0.8]
|
|
48
|
-
├── solid/ deprecated Solid primitives over behaviors [remove >=0.8]
|
|
49
|
-
├── qwik/ deprecated Qwik hooks over behaviors [remove >=0.8]
|
|
50
|
-
├── svelte/ deprecated Svelte actions over behaviors [remove >=0.8]
|
|
51
|
-
└── vue/ deprecated Vue directives over behaviors [remove >=0.8]
|
|
52
47
|
```
|
|
53
48
|
|
|
54
49
|
### Consequences of each layer
|
|
@@ -92,11 +87,6 @@ on top of the CSS, none of which require a framework commitment**:
|
|
|
92
87
|
- **glyphs/** — static bitmap data and SSR-safe render helpers. The
|
|
93
88
|
256-cell DOM renderers are for display and solid inline icons; the `.ui-icon`
|
|
94
89
|
mask renderer is for dense icon-at-scale use.
|
|
95
|
-
- **react/** / **solid/** / **qwik/** / **svelte/** / **vue/** — deprecated
|
|
96
|
-
lifecycle adapters over `behaviors/`. They remain compatible for the complete
|
|
97
|
-
0.7 minor, then may be removed in 0.8 under ADR-0004. Ten real-consumer audits
|
|
98
|
-
found no adapter imports; framework consumers already use the vanilla
|
|
99
|
-
initializers in their own mount/cleanup lifecycle.
|
|
100
90
|
- **`css/analytical.css` — the analytical roll-up.** This convenience file
|
|
101
91
|
`@import`s exactly **nine** analytical figure/evidence leaves: `figure`,
|
|
102
92
|
`annotations`, `legend`, `marks`, `connectors`, `spotlight`, `crosshair`,
|
|
@@ -111,8 +101,7 @@ on top of the CSS, none of which require a framework commitment**:
|
|
|
111
101
|
`import '@ponchia/ui'` in Vite/Astro/SvelteKit). There is no runtime JS at
|
|
112
102
|
the package root — Node/runtime JS imports of `.` are not supported. All JS
|
|
113
103
|
entrypoints are explicit subpaths (`/behaviors`, `/classes`, `/tokens`,
|
|
114
|
-
`/glyphs`, `/annotations`, `/connectors`, `/
|
|
115
|
-
`/svelte`, `/vue`, `/skins`, `/charts`, `/mermaid`, `/d2`, `/vega`). This is
|
|
104
|
+
`/glyphs`, `/annotations`, `/connectors`, `/skins`, `/charts`, `/mermaid`, `/d2`, `/vega`). This is
|
|
116
105
|
a permanent, intentional contract.
|
|
117
106
|
|
|
118
107
|
### Surface admission rule
|
|
@@ -140,7 +129,7 @@ registries, virtualized grids, or framework component APIs.
|
|
|
140
129
|
The repo root mixes five kinds of directory that look alike but follow very
|
|
141
130
|
different rules. Two distinctions matter most: several are **path-frozen
|
|
142
131
|
published subpaths** — the directory name _is_ the public import specifier
|
|
143
|
-
(`@ponchia/ui/
|
|
132
|
+
(`@ponchia/ui/behaviors` resolves to `./behaviors/`), so they cannot be moved or
|
|
144
133
|
renamed — and several are **generated** and must never be hand-edited (a
|
|
145
134
|
generator overwrites them and a drift gate fails CI).
|
|
146
135
|
|
|
@@ -148,7 +137,7 @@ generator overwrites them and a drift gate fails CI).
|
|
|
148
137
|
| --- | --- | --- | --- |
|
|
149
138
|
| `css/` | source | yes | The framework. Most leaves are hand-authored `@layer bronto` CSS. The palette blocks in `css/tokens.css`, plus `css/skins.css` and `css/dataviz.css`, are generated. `css/generated.css` is authored trust-surface CSS despite its name. |
|
|
150
139
|
| `tokens/index.js` | source | yes | The single source of truth for token **values** (`cssVars`). |
|
|
151
|
-
| `classes/index.js`, `behaviors/`, `annotations/`, `connectors/`, `
|
|
140
|
+
| `classes/index.js`, `behaviors/`, `annotations/`, `connectors/`, `glyphs/`, `shiki/` | source · published-subpath (path-frozen) | yes — but **do not move** | Authored ESM shipped as-is; the dir name is the public import path. The `.d.ts` beside them are generated/drift-checked: `connectors`/`annotations`/`behaviors` are emitted from JSDoc by `tsc` (`npm run dts:emit`), `classes`/`tokens`/`glyphs` from the runtime. No leaf `.d.ts` is hand-maintained. |
|
|
152
141
|
| `schemas/*.schema.json` | source · published schema files (path-frozen) | yes — but **do not move exported files** | Declarative JSON Schema contracts for sidecars/tooling data. Each exported schema file path is public; the directory itself is not a wildcard import. No validator runtime ships. |
|
|
153
142
|
| `dist/` | generated | no | Build of `css/` (`npm run dist:build`); byte-checked by `check:dist`. |
|
|
154
143
|
| `tokens/index.json`, `tokens/resolved.json`, `tokens/tokens.dtcg.json`, `tokens/figma.variables.json`, `tokens/charts.json`, `classes/index.d.ts`, `tokens/index.d.ts`, `tokens/{skins,charts}.d.ts`, `glyphs/glyphs.d.ts`, `classes/vscode.css-custom-data.json`, `docs/reference.md` | generated | no | Committed build artifacts; regenerate with `npm run prepack`, never hand-edit. Drift-checked in `npm run check`. |
|
|
@@ -184,7 +173,7 @@ are copied into consumer reports.
|
|
|
184
173
|
| exports / import graph / source CSS `layer(bronto)` imports / layered-vs-unlayered CSS target map / `files` consistent | `check-exports.mjs` |
|
|
185
174
|
| pure generated mirrors fresh — `tokens.css`/`index.json`, `dtcg.json`, `resolved.json`, `figma.variables.json`, `classes`/`tokens` `.d.ts`, `reference.md`, vscode data — each byte-equal to its generator (registry: `scripts/lib/artifacts.mjs`) | `check-fresh.mjs` |
|
|
186
175
|
| `classes` `cls` ⇄ `.ui-*` selectors | `check-classes.mjs` |
|
|
187
|
-
| `connectors`/`annotations`/`
|
|
176
|
+
| `connectors`/`annotations`/`behaviors` `.d.ts` (+ maps) == fresh `tsc` emit of their JSDoc | `check-dts-emit.mjs` |
|
|
188
177
|
| legend swatch colours ⊆ `charts.js` · opt-in | `check-legend.mjs` |
|
|
189
178
|
| color tokens tiered · no raw chromatic color in components | `check-color-policy.mjs` |
|
|
190
179
|
| `css/skins.css` ⇄ `tokens/skins.js` · colorways opt-in | `check-skins.mjs` |
|
|
@@ -193,14 +182,13 @@ are copied into consumer reports.
|
|
|
193
182
|
| `shiki/nothing.json` valid + on rationed palette | `check-shiki.mjs` |
|
|
194
183
|
| `dist/*.css` == fresh single-`@layer bronto` build of `css/` + budget | `check-dist.mjs` |
|
|
195
184
|
| published tarball == intended `files` only | `check-pack.mjs` |
|
|
196
|
-
| packed
|
|
185
|
+
| packed JS/JSON public subpaths import without framework peers, packed JS named exports exactly match source modules, concrete CSS/doc/font subpaths resolve, and packed behavior initializers/toast no-op in a clean consumer with no DOM globals | `check-consumer-surface.mjs` |
|
|
197
186
|
| packed typed public subpaths compile through package exports in a clean TypeScript consumer | `check-consumer-types.mjs` |
|
|
198
187
|
| function-level cyclomatic complexity stays ≤12 and function NLOC stays within budget, with no per-function exception list | `check-complexity.mjs` |
|
|
199
188
|
| GitHub Actions workflow syntax and embedded shell snippets lint | `check:workflows` (`github-actionlint`) |
|
|
200
189
|
| every shipped CSS leaf is classified as foundation or has explicit docs/demo/e2e ownership | `check-component-matrix.mjs` |
|
|
201
190
|
| every public behavior export has explicit docs, unit-test, and browser-test ownership | `check-behavior-matrix.mjs` |
|
|
202
191
|
| every public helper export in `classes`/`annotations`/`connectors`/`glyphs` has explicit docs, unit-test, and type-test ownership | `check-helper-matrix.mjs` |
|
|
203
|
-
| every delegated behavior has React/Solid/Qwik hook, Svelte action, Vue directive, docs, example, unit, and type ownership | `check-binding-matrix.mjs` |
|
|
204
192
|
| `@playwright/test` version ⇄ pinned Playwright container image ⇄ visual workflows/docs/local runner | `check-playwright-container.mjs` |
|
|
205
193
|
| every shipped JSON schema is exported, documented, validates its public cookbook example, and rejects malformed sidecars | `check-schemas.mjs` |
|
|
206
194
|
| packed public text contains no private terms, local paths, or secret-looking assignments | `check-public-hygiene.mjs` |
|
|
@@ -263,7 +251,13 @@ pointer:
|
|
|
263
251
|
with provenance. Runs in the `npm-publish` **Environment**
|
|
264
252
|
(required-reviewer protection), so after the gates and preflight pass the run
|
|
265
253
|
pauses for a manual approval in the Actions UI before anything reaches npm —
|
|
266
|
-
a guard against an accidental tag push publishing.
|
|
254
|
+
a guard against an accidental tag push publishing. Authentication is
|
|
255
|
+
**trusted publishing (OIDC)**: no npm token is stored anywhere, and the
|
|
256
|
+
credential npm mints is short-lived and bound to this repository, this
|
|
257
|
+
workflow filename, and this environment
|
|
258
|
+
([ADR-0006](./adr/0006-trusted-publishing.md)). Renaming `release.yml` or
|
|
259
|
+
moving the publish to another environment breaks publishing until the
|
|
260
|
+
npm-side registration is updated. Dist-tag is derived from
|
|
267
261
|
the tag: stable (`v0.4.0`) → `latest`; SemVer prerelease (`v0.4.0-rc.1`, any
|
|
268
262
|
hyphenated identifier) → `next`, so the default `npm i @ponchia/ui` never
|
|
269
263
|
moves onto an unstable build (opt in with `@ponchia/ui@next`). Post-publish
|
|
@@ -321,8 +315,7 @@ explained, not surprising.
|
|
|
321
315
|
- Run `npm pack --dry-run --json` locally or from CI logs and confirm the
|
|
322
316
|
intended file count/payload.
|
|
323
317
|
- Build the packed examples matrix from the tarball, not a workspace link:
|
|
324
|
-
`npm run test:examples` covers vanilla, Astro, SvelteKit,
|
|
325
|
-
Qwik, Tailwind, and report-static, with Chromium browser smokes for runtime
|
|
318
|
+
`npm run test:examples` covers vanilla, Astro, SvelteKit, React, Tailwind, and report-static, with Chromium browser smokes for runtime
|
|
326
319
|
examples. For a deeper consumer pass, `npm run test:examples:cross-browser`
|
|
327
320
|
runs the same packed smokes in Chromium, Firefox, and WebKit; manual CI
|
|
328
321
|
dispatches pass the same cross-browser flag to the reusable examples workflow.
|
package/docs/command.md
CHANGED
|
@@ -34,8 +34,7 @@ stable ids, roles, `aria-controls`, `aria-expanded`,
|
|
|
34
34
|
`aria-activedescendant`, keyboard navigation, filtering, selection, and close
|
|
35
35
|
behavior. Do not bind both owners to the same palette.
|
|
36
36
|
|
|
37
|
-
The framework adapter subpaths
|
|
38
|
-
removal no earlier than 0.8. Prefer direct `initCommand()` lifecycle cleanup for
|
|
37
|
+
The framework adapter subpaths were removed in 0.10. Use direct `initCommand()` lifecycle cleanup for
|
|
39
38
|
a DOM-authored list, or controlled host mode when the framework owns the widget.
|
|
40
39
|
|
|
41
40
|
## Markup
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# Compose a tool or report
|
|
2
|
+
|
|
3
|
+
Start with the task and its important state. Use the catalog to find a part,
|
|
4
|
+
not to decide how many parts a page should contain.
|
|
5
|
+
|
|
6
|
+
## Service overview
|
|
7
|
+
|
|
8
|
+
Load the core CSS and the opt-in state leaf. Use `ui-app-shell` for navigation,
|
|
9
|
+
`ui-app-topbar` for the page title and primary action, and `ui-app-content` for
|
|
10
|
+
the current state and work queue. Panels group content without adding another
|
|
11
|
+
frame around every metric and table.
|
|
12
|
+
|
|
13
|
+
```css
|
|
14
|
+
@import '@ponchia/ui';
|
|
15
|
+
@import '@ponchia/ui/css/state.css';
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Use sentence-case labels. Keep the main action distinguishable from destructive
|
|
19
|
+
actions through wording and placement. Use `ui-delta--invert` when a decrease
|
|
20
|
+
is favorable, such as queue delay. Unknown, stale, and failed are distinct
|
|
21
|
+
states; do not present missing observations as success.
|
|
22
|
+
|
|
23
|
+
The complete specimen is [service.html](https://ponchia.github.io/bronto-ui/demo/service.html). On a phone,
|
|
24
|
+
navigation wraps and the compact metrics leave room for the work queue.
|
|
25
|
+
The specimen owns deterministic loading, empty, error and stale scenarios,
|
|
26
|
+
search/environment filtering and a local sample-job dialog. Unknown observations
|
|
27
|
+
hide operational health claims; stale ones stay visibly qualified. Use Sync to
|
|
28
|
+
recover. These behaviors are sample host logic, not package state management.
|
|
29
|
+
|
|
30
|
+
Check the main action, every navigation destination, and a long account name
|
|
31
|
+
at 360px and with a coarse pointer. A data table may scroll in its own region.
|
|
32
|
+
|
|
33
|
+
## Inspector and workbench
|
|
34
|
+
|
|
35
|
+
Load `workbench.css` beside core. An inspector supplies its own container
|
|
36
|
+
boundary: property rows stack below 20rem of available inline size, including
|
|
37
|
+
inside a narrow panel on a wide desktop.
|
|
38
|
+
|
|
39
|
+
```html
|
|
40
|
+
<aside class="ui-inspector" aria-label="Selected job">
|
|
41
|
+
<header class="ui-inspector__head"><h2>Job settings</h2></header>
|
|
42
|
+
<div class="ui-inspector__body">
|
|
43
|
+
<div class="ui-property">
|
|
44
|
+
<label class="ui-property__label" for="retry-count">Retry limit</label>
|
|
45
|
+
<div class="ui-property__value">
|
|
46
|
+
<input class="ui-input" id="retry-count" type="number" value="3" />
|
|
47
|
+
</div>
|
|
48
|
+
</div>
|
|
49
|
+
</div>
|
|
50
|
+
</aside>
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
A splitter does not choose a product's collapse policy. The
|
|
54
|
+
[workbench specimen](https://ponchia.github.io/bronto-ui/demo/workbench.html) stacks its two panes below 42rem
|
|
55
|
+
of container width and hides the inactive resize handle and resize controls.
|
|
56
|
+
Both panes remain available. A tool that needs a pane switch instead should
|
|
57
|
+
keep that policy in its own component.
|
|
58
|
+
|
|
59
|
+
Keep a badge inside a `ui-row__meta` wrapper rather than applying both classes
|
|
60
|
+
to the same element: the wrapper owns layout and the badge owns its tone.
|
|
61
|
+
|
|
62
|
+
Use `ui-chip--dense` for static labels inside short pane headers. Dense chips
|
|
63
|
+
on buttons, links, or button roles retain pointer target floors. Use regular
|
|
64
|
+
buttons for actions; a colored chip is not an action registry.
|
|
65
|
+
|
|
66
|
+
Test the resize control’s keyboard and pointer paths at wide sizes, then verify
|
|
67
|
+
that the narrow layout has no hidden keyboard-reachable resize control and both panes
|
|
68
|
+
have a useful reading width. Test the inspector inside a 280px parent while
|
|
69
|
+
the browser itself is wide.
|
|
70
|
+
|
|
71
|
+
## Decision report
|
|
72
|
+
|
|
73
|
+
Use the core stylesheet plus `report-kit.css` for a standalone HTML report.
|
|
74
|
+
Use real asset URLs in HTML; package specifiers resolve only in build tools.
|
|
75
|
+
|
|
76
|
+
```html
|
|
77
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.11.0/dist/bronto.css" />
|
|
78
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.11.0/dist/css/report-kit.css" />
|
|
79
|
+
<article class="ui-report">
|
|
80
|
+
<header class="ui-report__cover ui-report__cover--compact">
|
|
81
|
+
<h1 class="ui-report__title">Keep the current configuration</h1>
|
|
82
|
+
<p class="ui-report__subtitle">Queue delay improved; verify the next scheduled run.</p>
|
|
83
|
+
</header>
|
|
84
|
+
<section class="ui-report__section" aria-labelledby="decision-title">
|
|
85
|
+
<h2 class="ui-report__section-head" id="decision-title">Decision and basis</h2>
|
|
86
|
+
<p>The completed runs support keeping the change. The next batch remains unobserved.</p>
|
|
87
|
+
</section>
|
|
88
|
+
<details class="ui-report__toc ui-screen-only">
|
|
89
|
+
<summary>Contents and evidence</summary>
|
|
90
|
+
<ol><li><a href="#decision-title">Decision and basis</a></li></ol>
|
|
91
|
+
</details>
|
|
92
|
+
</article>
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Screen prose is 1.125rem with a 68ch maximum reading measure; the report can
|
|
96
|
+
still contain wider figures and evidence tables. Print uses 11pt ink-on-white
|
|
97
|
+
text. Use the `--report-measure` and `--report-width` hooks deliberately.
|
|
98
|
+
Do not apply `ui-display` to every report heading.
|
|
99
|
+
|
|
100
|
+
The [standalone specimen](https://ponchia.github.io/bronto-ui/demo/report-standalone.html) keeps its decision
|
|
101
|
+
before collapsed navigation. Verify the recommendation and its source are
|
|
102
|
+
findable, the text remains readable at narrow widths, and the PDF retains
|
|
103
|
+
claims, captions, and evidence across page boundaries.
|
|
104
|
+
|
|
105
|
+
## Display identity
|
|
106
|
+
|
|
107
|
+
`ui-display`, dot glyphs, and readouts preserve the expressive identity.
|
|
108
|
+
Use them for a short hero title or deliberate display moment. Ordinary `h1`
|
|
109
|
+
through `h4`, prose, labels, and controls use sans typography. Fixed-width type is for
|
|
110
|
+
code, identifiers, and aligned data; a whole page does not need to be mono to
|
|
111
|
+
look technical.
|
|
112
|
+
|
|
113
|
+
Use one dominant action per local task. Separate navigation, action, severity,
|
|
114
|
+
and evidence status semantically even when they share a color family. Test
|
|
115
|
+
light and dark together, and keep keyboard focus and reduced motion visible.
|
|
116
|
+
|
|
117
|
+
## Embedded evidence
|
|
118
|
+
|
|
119
|
+
Constrain the figure, decision grid or action list inside a wide page. Each
|
|
120
|
+
uses its own available width. A two-up comparison wraps intrinsically even
|
|
121
|
+
outside `ui-report`. Keep value columns readable and source links reachable;
|
|
122
|
+
page overflow is an incomplete test. The container regression suite checks
|
|
123
|
+
280/320/480px parents and a wide layout.
|
|
124
|
+
|
|
125
|
+
Review long action status, legend names and citation markers. Keep chart
|
|
126
|
+
annotations in their `viewBox` or supply an equivalent narrow fallback. Print
|
|
127
|
+
uses document flow instead of size containment.
|
|
128
|
+
|
|
129
|
+
For an existing application, review explicit typography overrides with the
|
|
130
|
+
[0.11 migration recipe](migrations/0.10-to-0.11.md). A dependency pin does not
|
|
131
|
+
remove consumer CSS that overrides the shared layer.
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Discussions
|
|
2
|
+
|
|
3
|
+
Use the opt-in discussion leaf for readable thread lists, messages, quotations,
|
|
4
|
+
and composers in a host application:
|
|
5
|
+
|
|
6
|
+
```css
|
|
7
|
+
@import '@ponchia/ui';
|
|
8
|
+
@import '@ponchia/ui/css/discussion.css';
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
BrontoUI supplies the visual structure. The host owns storage, identity,
|
|
12
|
+
thread resolution, text anchoring, unread state, and posting behavior. This leaf
|
|
13
|
+
adds no JavaScript or editor dependency.
|
|
14
|
+
|
|
15
|
+
## Thread structure
|
|
16
|
+
|
|
17
|
+
```html
|
|
18
|
+
<section class="ui-discussion" aria-labelledby="thread-title">
|
|
19
|
+
<header class="ui-discussion__header">
|
|
20
|
+
<div>
|
|
21
|
+
<h2 id="thread-title">Discussion</h2>
|
|
22
|
+
<p>Release notes</p>
|
|
23
|
+
</div>
|
|
24
|
+
</header>
|
|
25
|
+
<p class="ui-discussion__state">Open · passage attached</p>
|
|
26
|
+
<blockquote class="ui-discussion__quote">The selected passage.</blockquote>
|
|
27
|
+
<ol class="ui-discussion__messages">
|
|
28
|
+
<li class="ui-discussion__message">
|
|
29
|
+
<p class="ui-discussion__meta"><strong>Reviewer</strong> · today</p>
|
|
30
|
+
<p>Can we clarify this sentence?</p>
|
|
31
|
+
</li>
|
|
32
|
+
</ol>
|
|
33
|
+
<form class="ui-discussion__composer">
|
|
34
|
+
<label for="reply">Reply</label>
|
|
35
|
+
<textarea id="reply" name="reply" rows="4"></textarea>
|
|
36
|
+
<div class="ui-discussion__actions">
|
|
37
|
+
<button class="ui-button" type="submit">Post reply</button>
|
|
38
|
+
</div>
|
|
39
|
+
</form>
|
|
40
|
+
</section>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Wire the form to the host's posting mechanism. Keep the draft when posting
|
|
44
|
+
fails, disable duplicate submissions while a request is pending, and announce
|
|
45
|
+
success only after confirmation. Use native buttons for actions and real links
|
|
46
|
+
for navigation. A modal host must supply focus management and focus return.
|
|
47
|
+
|
|
48
|
+
## Reading and recovery
|
|
49
|
+
|
|
50
|
+
The styles use sentence case and sans-serif prose, wrap long text, and allow
|
|
51
|
+
action rows to wrap in narrow panels. Keep secondary actions visually quiet
|
|
52
|
+
with `ui-button--ghost`; posting is normally the primary action. The quote
|
|
53
|
+
should remain visible when its anchor disappears, with a clear status and a
|
|
54
|
+
host-owned way to choose a new target. Anchor status and thread resolution
|
|
55
|
+
answer different questions and should be labelled separately.
|
|
56
|
+
|
|
57
|
+
`ui-discussion__list` and `ui-discussion__item` style a host-owned thread index.
|
|
58
|
+
Keep the list bounded and offer more results explicitly. If a canvas uses pins,
|
|
59
|
+
provide the same discussions in a keyboard-accessible list. Pins, positions,
|
|
60
|
+
and annotation geometry are outside this CSS leaf.
|
|
61
|
+
|
|
62
|
+
The [discussion specimen](https://ponchia.github.io/bronto-ui/demo/discussion.html) includes a narrow-container
|
|
63
|
+
example and a local reply/resolve demonstration. Its state lasts only until
|
|
64
|
+
the page reloads.
|
package/docs/figure.md
CHANGED
|
@@ -61,7 +61,7 @@ when the same stage appears in a dashboard, doc page, or generated artifact.
|
|
|
61
61
|
| --- | --- | --- |
|
|
62
62
|
| `--figure-max-inline` | `.ui-figure__stage` | Maximum stage width, default `42rem`. |
|
|
63
63
|
| `--figure-min-block` | `.ui-figure__stage` | Reserved stage height for late-rendered media. |
|
|
64
|
-
| `--figure-key-width` | `.ui-figure__body--key-right` | Right key column width before
|
|
64
|
+
| `--figure-key-width` | `.ui-figure__body--key-right` | Right key column width before the figure container stacks. |
|
|
65
65
|
|
|
66
66
|
## Boundary
|
|
67
67
|
|
|
@@ -76,3 +76,12 @@ when the same stage appears in a dashboard, doc page, or generated artifact.
|
|
|
76
76
|
|
|
77
77
|
- [Usage](usage.md#static-reports) shows report figure composition.
|
|
78
78
|
- [Reference](reference.md) lists the generated figure and report classes.
|
|
79
|
+
|
|
80
|
+
## Narrow containers
|
|
81
|
+
|
|
82
|
+
The figure establishes the named `bronto-figure` inline-size container. Its
|
|
83
|
+
right-hand key stacks below 44rem of figure width, even in a wide browser.
|
|
84
|
+
Print disables size containment and uses document flow. Keep annotation text
|
|
85
|
+
and strokes within the authored `viewBox`; container layout does not reposition
|
|
86
|
+
chart geometry. Verify a 280px parent with long legend names and a fallback
|
|
87
|
+
table, not just a narrow viewport.
|
|
@@ -185,8 +185,7 @@ a consumer needs it.
|
|
|
185
185
|
The keyboard-hint primitive (`.ui-shortcut` + `.ui-shortcut__sep` over `.ui-kbd`,
|
|
186
186
|
core chrome) landed first, then the `ui-command` palette: the
|
|
187
187
|
`@ponchia/ui/css/command.css` shell + the `initCommand` `data-bronto-command`
|
|
188
|
-
behavior (filter, roving focus, `bronto:command:select`/`close`)
|
|
189
|
-
bindings. The host still owns the action registry and execution — Bronto only
|
|
188
|
+
behavior (filter, roving focus, `bronto:command:select`/`close`). The host still owns the action registry and execution — Bronto only
|
|
190
189
|
filters and navigates.
|
|
191
190
|
|
|
192
191
|
Why it matters: command palettes turn a product from a page collection into a
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Upgrade from 0.10 to 0.11
|
|
2
|
+
|
|
3
|
+
0.11 completes the readable composition direction. The structured visual
|
|
4
|
+
changes are in [`MIGRATIONS.json`](../../MIGRATIONS.json). JavaScript exports,
|
|
5
|
+
classes, and tokens remain available. If you are coming from 0.9, apply the
|
|
6
|
+
[0.10 migration](0.9-to-0.10.md) first, including the retired adapters/modal.
|
|
7
|
+
|
|
8
|
+
## Review reusable layouts
|
|
9
|
+
|
|
10
|
+
Figures use their own inline-size container to stack a right-hand key below
|
|
11
|
+
44rem. Decision grids and action lists stack their rows below 32rem of their
|
|
12
|
+
own width, including inside an otherwise wide report. Keep the documented
|
|
13
|
+
`ui-report__decision-grid` and `ui-report__actions` wrappers. Two-up comparisons
|
|
14
|
+
need no wrapper: they keep at most two columns, with a 16rem reading floor.
|
|
15
|
+
|
|
16
|
+
Test a 280px and 320px parent inside a 1440px browser. Check that charts have
|
|
17
|
+
useful drawing width, text columns remain readable, long labels wrap and all
|
|
18
|
+
sources are reachable. Zero page overflow alone does not prove those things.
|
|
19
|
+
Keep authored SVG labels and annotations inside the drawing's `viewBox`, or
|
|
20
|
+
provide a narrow fallback with the same information. Bronto does not own chart
|
|
21
|
+
geometry. Named size containment is disabled in print; review your PDF too.
|
|
22
|
+
|
|
23
|
+
## Review typography overrides by role
|
|
24
|
+
|
|
25
|
+
Figure captions, legends, generated labels and command groups use sans and
|
|
26
|
+
sentence case. Technical log bodies and identifiers keep mono. Inline citation
|
|
27
|
+
markers have a 12px floor at a default 16px root. Do not globally replace `Doto`:
|
|
28
|
+
keep intentional hero/display and readout roles.
|
|
29
|
+
|
|
30
|
+
1. Find explicit `font-family: var(--display)` and `var(--dot-font)` declarations
|
|
31
|
+
in your loaded consumer styles, plus old root-size and control-height rules.
|
|
32
|
+
2. Classify each use: display identity, numeric readout, heading, instruction,
|
|
33
|
+
control label or metadata. Check grouped selectors individually.
|
|
34
|
+
3. Remove overrides that recreate old generic styles. Use `var(--sans)` for
|
|
35
|
+
local explanatory headings and labels; keep intentional display roles.
|
|
36
|
+
4. Inspect complete tasks, not just the homepage. Include setup, result,
|
|
37
|
+
filtering, error/retry, source details and an empty state where applicable.
|
|
38
|
+
5. Compare long names and translated text at narrow, laptop, and desktop widths,
|
|
39
|
+
in both themes, with keyboard and touch input.
|
|
40
|
+
|
|
41
|
+
Consumer CSS outside a layer takes precedence over the package's `bronto` layer.
|
|
42
|
+
Updating the package alone cannot change those explicit overrides. A prepared
|
|
43
|
+
patch from an older application revision must be reintegrated and checked
|
|
44
|
+
against current source before it can count as migration evidence.
|
|
45
|
+
|
|
46
|
+
## Verify the package and consumer together
|
|
47
|
+
|
|
48
|
+
Install the packed candidate into an isolated consumer checkout before changing
|
|
49
|
+
production pins. Record the exact package version, consumer revision and screens
|
|
50
|
+
checked. Update the dependency and registry lock file together after publication;
|
|
51
|
+
do not commit a task-local tarball path into a production lock file.
|
|
52
|
+
|
|
53
|
+
Use the [composition guide](../compositions.md) for the service's local state
|
|
54
|
+
scenarios, container boundaries and report reading/print checks. Existing package
|
|
55
|
+
checks remain necessary; real consumer tasks provide additional evidence.
|
|
56
|
+
|
|
57
|
+
## Optional discussion UI
|
|
58
|
+
|
|
59
|
+
Import `@ponchia/ui/css/discussion.css` for thread lists, quotations, messages,
|
|
60
|
+
and composers. The new `ui-discussion` vocabulary is additive. It carries no
|
|
61
|
+
posting behavior, storage, or editor dependency; see [Discussions](../discussion.md).
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Upgrade from 0.9 to 0.10
|
|
2
|
+
|
|
3
|
+
0.10 changes visual defaults and removes the adapter and controlled-modal
|
|
4
|
+
paths deprecated in 0.7. The structured changes are in
|
|
5
|
+
[`MIGRATIONS.json`](../../MIGRATIONS.json).
|
|
6
|
+
|
|
7
|
+
## Update imports and modal ownership
|
|
8
|
+
|
|
9
|
+
Remove imports from `@ponchia/ui/react`, `/solid`, `/qwik`, `/svelte`, and
|
|
10
|
+
`/vue`. Import class names from `@ponchia/ui/classes` and initialization functions from
|
|
11
|
+
`@ponchia/ui/behaviors`. Call each initialization function after the DOM root exists and
|
|
12
|
+
call its cleanup on component removal. The [integration guide](https://github.com/Ponchia/bronto-ui/blob/main/docs/integration.md) links
|
|
13
|
+
the host lifecycle recipes.
|
|
14
|
+
|
|
15
|
+
Replace `initModal`, `ModalCloseDetail`, and `@ponchia/ui/behaviors/modal` with
|
|
16
|
+
native `<dialog>` and `initDialog`. Remove `data-bronto-modal` and the
|
|
17
|
+
`ui.modal({ open: true })` option. Open with `showModal()` and close with
|
|
18
|
+
`close()` or the existing `data-bronto-open` / `data-bronto-close` triggers.
|
|
19
|
+
Use the native `cancel` and `close` events instead of `bronto:modal:close`.
|
|
20
|
+
The `ui-modal` and drawer classes remain; `.is-open` no longer opens them.
|
|
21
|
+
|
|
22
|
+
## Review complete screens
|
|
23
|
+
|
|
24
|
+
- The root respects the browser's default size: 16px at the usual setting.
|
|
25
|
+
The small text steps are 12px, 13px, and 14px rather than approximately
|
|
26
|
+
10.8px, 11.4px, and 12.9px.
|
|
27
|
+
- Headings and controls use sans and sentence case. Keep an intentional
|
|
28
|
+
display title by applying `ui-display`, not by restyling every heading.
|
|
29
|
+
- Service panels lose redundant frames, metrics stay compact, and narrow
|
|
30
|
+
navigation wraps. Remove consumer overrides that recreated those fixes.
|
|
31
|
+
- Reports use larger screen prose, a reading measure, and 11pt print text.
|
|
32
|
+
Prefer a decision before navigation; a `details.ui-report__toc` can collapse
|
|
33
|
+
its contents without JavaScript. A `nav.ui-report__toc` remains expanded.
|
|
34
|
+
- Inspectors adapt property rows to their own width. Splitter collapse policy
|
|
35
|
+
remains host-owned; use the [composition recipe](../compositions.md).
|
|
36
|
+
|
|
37
|
+
Check your real content at narrow, laptop, and desktop sizes, in both themes,
|
|
38
|
+
with keyboard and touch input. Review print output for reports. Upgrade from
|
|
39
|
+
the packed candidate before changing production version pins.
|
|
40
|
+
|
|
41
|
+
## Retained and new surface
|
|
42
|
+
|
|
43
|
+
Core CSS, class recipes, vanilla behaviors, tokens, report and analytical
|
|
44
|
+
leaves remain framework-neutral. `ui-timestrip` and `ui-severity-tone`,
|
|
45
|
+
previously unreleased on main, are included. `ui-chip--dense` replaces repeated
|
|
46
|
+
static-label height overrides. Specialist behavior libraries may live in a
|
|
47
|
+
consumer; the core still has no runtime or peer dependencies.
|