@ponchia/ui 0.10.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 CHANGED
@@ -5,6 +5,43 @@
5
5
  |> `^0` / `*` wildcard does **not** protect you. See README → Versioning, and
6
6
  |> the deprecation policy in CONTRIBUTING.md.
7
7
 
8
+ ## 0.11.0 — 2026-09-09
9
+
10
+ ### Changed
11
+
12
+ - **BREAKING: complete the supporting typography.** Figure captions, legend
13
+ text, generated-content labels and command groups use sentence-case sans.
14
+ Technical log bodies and identifiers retain mono. Caption text is 14px at
15
+ the default root size; inline citations no longer shrink below 12px.
16
+ - Figure keys and decision/action rows respond to their own available width.
17
+ Two-up comparisons wrap intrinsically, including outside a report. Named
18
+ containment on figure, decision-grid and actions wrappers is disabled for
19
+ print to preserve document flow.
20
+
21
+ ### Fixed
22
+
23
+ - Narrow evidence panels no longer squeeze a chart into 40px or decision text
24
+ into 21px on a wide page. Long action status and legend labels wrap.
25
+ - Long mobile navigation labels wrap while keeping every destination reachable.
26
+ - The figure specimen's authored annotation stays inside its viewBox.
27
+ - Generated-content disclosure summaries retain the coarse-pointer target floor.
28
+
29
+ ### Added
30
+
31
+ - Optional `discussion.css` with thread lists, quoted passages, messages and
32
+ composers. State and posting remain host-owned; includes a local interactive
33
+ specimen and a narrow-panel example.
34
+
35
+ - A working service specimen with deterministic loading, empty, error and stale
36
+ states, environment/search filtering, retry and native-dialog sample creation.
37
+ Unavailable observations never retain an operational health claim. Product
38
+ state stays in the specimen; no framework state machine or data dependency.
39
+ - Narrow-parent regression checks, including a comparison outside a report,
40
+ annotation bounds, long action status, citation text and recovery journeys.
41
+ - A complete-screen migration recipe for explicit consumer typography overrides.
42
+
43
+ See [the migration guide](docs/migrations/0.10-to-0.11.md).
44
+
8
45
  ## 0.10.0 — 2026-09-08
9
46
 
10
47
  ### Changed
package/MIGRATIONS.json CHANGED
@@ -83,7 +83,7 @@
83
83
  {
84
84
  "old": "hero / project-* / post-card / essay-* / page-* / home-* / signal-panel / worklog-summary",
85
85
  "new": "the ui-* content layer",
86
- "note": "Long-form content: .ui-prose / .ui-quote. Cards: .ui-card. Layout: .ui-grid / .ui-stack. Site chrome: the ui-site* shell. No 1:1 mapping \u2014 re-compose with the content primitives."
86
+ "note": "Long-form content: .ui-prose / .ui-quote. Cards: .ui-card. Layout: .ui-grid / .ui-stack. Site chrome: the ui-site* shell. No 1:1 mapping re-compose with the content primitives."
87
87
  },
88
88
  {
89
89
  "old": "callout",
@@ -98,7 +98,7 @@
98
98
  {
99
99
  "old": "tag-list / tag",
100
100
  "new": "ui-tags / ui-tag",
101
- "note": "Compact variant .tag-list--compact \u2192 .ui-tags--compact; verify accent-on-accent contrast (see CHANGELOG 0.3.0 a11y fix)."
101
+ "note": "Compact variant .tag-list--compact .ui-tags--compact; verify accent-on-accent contrast (see CHANGELOG 0.3.0 a11y fix)."
102
102
  }
103
103
  ],
104
104
  "codemod": "See docs/migrations/0.2-to-0.3.md for a ready-to-run ripgrep+sed recipe covering the 'safe' rules."
@@ -111,7 +111,7 @@
111
111
  "manual": [
112
112
  {
113
113
  "old": "--orange / --orange-soft",
114
- "new": "(removed \u2014 re-declare in a consumer :root override if referenced)",
114
+ "new": "(removed re-declare in a consumer :root override if referenced)",
115
115
  "note": "Orphan token pair: defined in the token mirrors but referenced by no shipped component and documented nowhere, and untiered under the new colour model. Removed under the CONTRIBUTING 'provably-unreferenced surface' exception. If you used it: :root { --orange: #a85f32; --orange-soft: rgb(168 95 50 / 0.13); }"
116
116
  }
117
117
  ],
@@ -120,7 +120,7 @@
120
120
  {
121
121
  "from": "0.4",
122
122
  "to": "0.5",
123
- "summary": "Adds the analytical-primitives suite (annotations, legend, marks, connectors, spotlight, crosshair, selection + the analytical.css roll-up); all additive/opt-in. Three breaking changes: the chart data key moved out of the report kit into the standalone Legends layer (`.ui-chart__legend`/`.ui-chart__swatch` removed); annotation arrowheads now render via the shared connectors geometry kernel (a small visual path change, no API change); and the marks/bracket-note rationed-accent tone was renamed `evidence`\u2192`accent` to match the annotation/connector tone vocabulary (`.ui-annotation--evidence` stays \u2014 it's a marker variant, not a tone).",
123
+ "summary": "Adds the analytical-primitives suite (annotations, legend, marks, connectors, spotlight, crosshair, selection + the analytical.css roll-up); all additive/opt-in. Three breaking changes: the chart data key moved out of the report kit into the standalone Legends layer (`.ui-chart__legend`/`.ui-chart__swatch` removed); annotation arrowheads now render via the shared connectors geometry kernel (a small visual path change, no API change); and the marks/bracket-note rationed-accent tone was renamed `evidence`→`accent` to match the annotation/connector tone vocabulary (`.ui-annotation--evidence` stays it's a marker variant, not a tone).",
124
124
  "safe": [
125
125
  {
126
126
  "old": "ui-chart__swatch",
@@ -139,12 +139,12 @@
139
139
  {
140
140
  "old": "ui.mark({ tone: 'evidence' }) / ui.bracketNote({ tone: 'evidence' })",
141
141
  "new": "tone: 'accent'",
142
- "note": "The rationed-accent tone option on the mark/bracket-note recipes is now 'accent' (was 'evidence'), matching ui.connector/ui.annotation. Do NOT rewrite ui.annotation({ variant: 'evidence' }) or the 'evidence' subject marker \u2014 those are a marker shape, not a tone, and are unchanged."
142
+ "note": "The rationed-accent tone option on the mark/bracket-note recipes is now 'accent' (was 'evidence'), matching ui.connector/ui.annotation. Do NOT rewrite ui.annotation({ variant: 'evidence' }) or the 'evidence' subject marker those are a marker shape, not a tone, and are unchanged."
143
143
  },
144
144
  {
145
145
  "old": "ui-chart__legend",
146
146
  "new": "ui-legend",
147
- "note": "Also import '@ponchia/ui/css/legend.css' beside report.css, and wrap each entry's content as <li class=\"ui-legend__item\"> \u2026 <span class=\"ui-legend__label\">\u2026</span>. The swatch's --chart-color/--chart-pattern inline contract is unchanged; the categorical --chart-N colour is also available via .ui-legend__swatch--N. See docs/legends.md."
147
+ "note": "Also import '@ponchia/ui/css/legend.css' beside report.css, and wrap each entry's content as <li class=\"ui-legend__item\"> <span class=\"ui-legend__label\">…</span>. The swatch's --chart-color/--chart-pattern inline contract is unchanged; the categorical --chart-N colour is also available via .ui-legend__swatch--N. See docs/legends.md."
148
148
  },
149
149
  {
150
150
  "old": "connectorEndArrow (annotations)",
@@ -157,16 +157,16 @@
157
157
  {
158
158
  "from": "0.5",
159
159
  "to": "0.6",
160
- "summary": "Charting realignment. The local static bar-chart renderer (.ui-chart*) is removed \u2014 a chart needs scales + data binding, out of scope for the analytical layer. bronto is now a themeable target for Vega-Lite (@ponchia/ui/vega), the same tokens-as-data path as Mermaid/D2. The --chart-* data-viz palette, tokens/charts.json, and the .ui-legend layer are unchanged.",
160
+ "summary": "Charting realignment. The local static bar-chart renderer (.ui-chart*) is removed a chart needs scales + data binding, out of scope for the analytical layer. bronto is now a themeable target for Vega-Lite (@ponchia/ui/vega), the same tokens-as-data path as Mermaid/D2. The --chart-* data-viz palette, tokens/charts.json, and the .ui-legend layer are unchanged.",
161
161
  "safe": [],
162
162
  "manual": [
163
163
  {
164
164
  "old": "ui-chart / ui-chart__plot / ui-chart__bar / ui-chart__label / ui-chart__track / ui-chart__fill / ui-chart__fallback / ui-chart__caption",
165
165
  "new": "a Vega-Lite chart themed with @ponchia/ui/vega, or a token-themed inline <svg>",
166
- "note": "No 1:1 class mapping \u2014 the renderer is removed. For a real chart: import '@ponchia/ui/vega', pass brontoVegaConfig(theme) to vega-embed, and place the result in a <figure class=\"ui-report__figure\"> with a <figcaption class=\"ui-report__caption\"> and a <ul class=\"ui-legend\"> key (see docs/vega.md). For a frozen/print chart: hand-author an inline <svg> using the --chart-N palette tokens for fills. The --chart-value inline knob is gone; --chart-color/--chart-pattern remain on .ui-legend__swatch."
166
+ "note": "No 1:1 class mapping the renderer is removed. For a real chart: import '@ponchia/ui/vega', pass brontoVegaConfig(theme) to vega-embed, and place the result in a <figure class=\"ui-report__figure\"> with a <figcaption class=\"ui-report__caption\"> and a <ul class=\"ui-legend\"> key (see docs/vega.md). For a frozen/print chart: hand-author an inline <svg> using the --chart-N palette tokens for fills. The --chart-value inline knob is gone; --chart-color/--chart-pattern remain on .ui-legend__swatch."
167
167
  }
168
168
  ],
169
- "codemod": "No codemod \u2014 the .ui-chart* renderer has no replacement class. rg -l 'ui-chart\\\\b|ui-chart__' to find call sites, then rebuild each as a Vega-Lite chart (@ponchia/ui/vega) or a token-themed inline <svg>. See docs/vega.md."
169
+ "codemod": "No codemod the .ui-chart* renderer has no replacement class. rg -l 'ui-chart\\\\b|ui-chart__' to find call sites, then rebuild each as a Vega-Lite chart (@ponchia/ui/vega) or a token-themed inline <svg>. See docs/vega.md."
170
170
  },
171
171
  {
172
172
  "from": "0.6",
@@ -205,6 +205,25 @@
205
205
  }
206
206
  ],
207
207
  "codemod": "See docs/migrations/0.9-to-0.10.md. Changes require consumer lifecycle and visual review; no blanket replacement is safe."
208
+ },
209
+ {
210
+ "from": "0.10",
211
+ "to": "0.11",
212
+ "summary": "Readable supporting typography and container-aware evidence layouts.",
213
+ "safe": [],
214
+ "manual": [
215
+ {
216
+ "old": "viewport-based figure/report layouts",
217
+ "new": "container-aware figure, decision-grid and actions layouts; intrinsic two-up comparisons",
218
+ "note": "Keep the documented wrappers, verify narrow parents on wide screens and review print. New inline-size containment can change intrinsic sizing."
219
+ },
220
+ {
221
+ "old": "uppercase mono explanatory labels and unconstrained superscript citations",
222
+ "new": "sentence-case sans supporting text and a citation size floor",
223
+ "note": "Review explicit consumer overrides by role, preserving intentional display and technical identifiers."
224
+ }
225
+ ],
226
+ "codemod": "No automatic rewrite: review complete consumer tasks and docs/migrations/0.10-to-0.11.md."
208
227
  }
209
228
  ]
210
229
  }
package/README.md CHANGED
@@ -93,7 +93,7 @@ Or drop it in with no build step, straight from a CDN (replace the version only
93
93
  when deliberately upgrading across a breaking pre-1.0 minor):
94
94
 
95
95
  ```html
96
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.10.0/dist/bronto.css">
96
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ponchia/ui@0.11.0/dist/bronto.css">
97
97
  ```
98
98
 
99
99
  ## Quick start
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$comment": "@ponchia/ui class vocabulary as language-neutral data — validate emitted markup without executing the ESM cls map or parsing the .d.ts. Generated from classes/index.js — do not edit by hand; run `npm run classes:json:build`. Drift-checked in CI. `groups[].base` is null for a parts-only namespace (no standalone base class — do NOT emit it). A modifier whose name contains `__` (e.g. `ui-spark__bar--pos`) attaches to THAT part, not the base host. `states` is the author-applied `is-*` hooks (runtime/behavior-managed hooks are excluded); `behaviorAttributes` are the `data-bronto-*` wiring hooks the optional behaviors delegate on; `requiredAria` is the role/aria a generator must emit per component. `states` + `customProperties` are documented in docs/reference.md and ship outside `cls` by design.",
3
3
  "counts": {
4
- "classes": 683,
5
- "groups": 186
4
+ "classes": 695,
5
+ "groups": 187
6
6
  },
7
7
  "groups": {
8
8
  "ui-accordion": {
@@ -465,6 +465,23 @@
465
465
  "ui-diff__row"
466
466
  ]
467
467
  },
468
+ "ui-discussion": {
469
+ "base": "ui-discussion",
470
+ "modifiers": [],
471
+ "parts": [
472
+ "ui-discussion__actions",
473
+ "ui-discussion__composer",
474
+ "ui-discussion__header",
475
+ "ui-discussion__hint",
476
+ "ui-discussion__item",
477
+ "ui-discussion__list",
478
+ "ui-discussion__message",
479
+ "ui-discussion__messages",
480
+ "ui-discussion__meta",
481
+ "ui-discussion__quote",
482
+ "ui-discussion__state"
483
+ ]
484
+ },
468
485
  "ui-display": {
469
486
  "base": "ui-display",
470
487
  "modifiers": [],
@@ -1799,6 +1816,18 @@
1799
1816
  "ui-diff__row--add",
1800
1817
  "ui-diff__row--context",
1801
1818
  "ui-diff__row--remove",
1819
+ "ui-discussion",
1820
+ "ui-discussion__actions",
1821
+ "ui-discussion__composer",
1822
+ "ui-discussion__header",
1823
+ "ui-discussion__hint",
1824
+ "ui-discussion__item",
1825
+ "ui-discussion__list",
1826
+ "ui-discussion__message",
1827
+ "ui-discussion__messages",
1828
+ "ui-discussion__meta",
1829
+ "ui-discussion__quote",
1830
+ "ui-discussion__state",
1802
1831
  "ui-display",
1803
1832
  "ui-divider",
1804
1833
  "ui-dot",
@@ -382,6 +382,18 @@ export declare const cls: {
382
382
  readonly legendTrack: 'ui-legend__track';
383
383
  readonly legendTicks: 'ui-legend__ticks';
384
384
  readonly legendTick: 'ui-legend__tick';
385
+ readonly discussion: 'ui-discussion';
386
+ readonly discussionHeader: 'ui-discussion__header';
387
+ readonly discussionActions: 'ui-discussion__actions';
388
+ readonly discussionQuote: 'ui-discussion__quote';
389
+ readonly discussionMessages: 'ui-discussion__messages';
390
+ readonly discussionList: 'ui-discussion__list';
391
+ readonly discussionMessage: 'ui-discussion__message';
392
+ readonly discussionMeta: 'ui-discussion__meta';
393
+ readonly discussionHint: 'ui-discussion__hint';
394
+ readonly discussionState: 'ui-discussion__state';
395
+ readonly discussionItem: 'ui-discussion__item';
396
+ readonly discussionComposer: 'ui-discussion__composer';
385
397
  readonly annotation: 'ui-annotation';
386
398
  readonly annotationSubject: 'ui-annotation__subject';
387
399
  readonly annotationConnector: 'ui-annotation__connector';
package/classes/index.js CHANGED
@@ -400,6 +400,19 @@ export const cls = Object.freeze({
400
400
  legendTrack: 'ui-legend__track',
401
401
  legendTicks: 'ui-legend__ticks',
402
402
  legendTick: 'ui-legend__tick',
403
+ // discussions (opt-in discussion.css; host-owned state)
404
+ discussion: 'ui-discussion',
405
+ discussionHeader: 'ui-discussion__header',
406
+ discussionActions: 'ui-discussion__actions',
407
+ discussionQuote: 'ui-discussion__quote',
408
+ discussionMessages: 'ui-discussion__messages',
409
+ discussionList: 'ui-discussion__list',
410
+ discussionMessage: 'ui-discussion__message',
411
+ discussionMeta: 'ui-discussion__meta',
412
+ discussionHint: 'ui-discussion__hint',
413
+ discussionState: 'ui-discussion__state',
414
+ discussionItem: 'ui-discussion__item',
415
+ discussionComposer: 'ui-discussion__composer',
403
416
  annotation: 'ui-annotation',
404
417
  annotationSubject: 'ui-annotation__subject',
405
418
  annotationConnector: 'ui-annotation__connector',
@@ -14,7 +14,7 @@
14
14
  --annotation-stroke-width: 1.5;
15
15
 
16
16
  color: var(--annotation-color);
17
- font-family: var(--mono);
17
+ font-family: var(--sans);
18
18
  font-size: var(--text-xs);
19
19
  overflow: visible;
20
20
  }
@@ -96,7 +96,7 @@
96
96
  stroke: var(--annotation-note-bg);
97
97
  stroke-linejoin: round;
98
98
  stroke-width: 3;
99
- text-transform: uppercase;
99
+ text-transform: none;
100
100
  }
101
101
 
102
102
  .ui-annotation__label {
package/css/app.css CHANGED
@@ -73,6 +73,8 @@
73
73
  }
74
74
 
75
75
  .ui-app-nav a {
76
+ min-inline-size: 0;
77
+ overflow-wrap: anywhere;
76
78
  align-items: center;
77
79
  border-inline-start: 2px solid transparent;
78
80
  color: var(--text-soft);
@@ -354,7 +356,7 @@
354
356
  justify-content: center;
355
357
  border-inline-start: 0;
356
358
  border-block-end: 2px solid transparent;
357
- white-space: nowrap;
359
+ white-space: normal;
358
360
  }
359
361
 
360
362
  .ui-app-nav a.is-active,
package/css/command.css CHANGED
@@ -43,11 +43,11 @@
43
43
 
44
44
  .ui-command__group {
45
45
  color: var(--text-dim);
46
- font-family: var(--mono);
47
- font-size: var(--text-2xs);
48
- letter-spacing: var(--tracking-wide);
46
+ font-family: var(--sans);
47
+ font-size: var(--text-xs);
48
+ letter-spacing: 0;
49
49
  padding: 0.5rem 0.6rem 0.25rem;
50
- text-transform: uppercase;
50
+ text-transform: none;
51
51
  }
52
52
 
53
53
  .ui-command__item {
@@ -0,0 +1,150 @@
1
+ /* Discussions: readable messages and composers. The host owns storage, identity,
2
+ focus management, anchoring, notifications, and posting state. */
3
+ .ui-discussion {
4
+ color: var(--text);
5
+ font-family: var(--sans);
6
+ font-size: var(--text-sm);
7
+ line-height: 1.5;
8
+ min-inline-size: 0;
9
+ overflow-wrap: anywhere;
10
+ }
11
+
12
+ .ui-discussion__header {
13
+ align-items: start;
14
+ display: flex;
15
+ gap: var(--space-md);
16
+ justify-content: space-between;
17
+ }
18
+
19
+ .ui-discussion__header > div {
20
+ min-inline-size: 0;
21
+ }
22
+
23
+ .ui-discussion__header h2 {
24
+ font-family: var(--sans);
25
+ font-size: var(--text-lg);
26
+ font-weight: 650;
27
+ letter-spacing: normal;
28
+ line-height: 1.25;
29
+ margin: 0;
30
+ text-transform: none;
31
+ }
32
+
33
+ .ui-discussion__header p,
34
+ .ui-discussion__meta,
35
+ .ui-discussion__hint,
36
+ .ui-discussion__state {
37
+ color: var(--text-dim);
38
+ font-family: var(--sans);
39
+ font-size: var(--text-xs);
40
+ letter-spacing: normal;
41
+ text-transform: none;
42
+ }
43
+
44
+ .ui-discussion__actions {
45
+ align-items: center;
46
+ display: flex;
47
+ flex-wrap: wrap;
48
+ gap: var(--space-sm);
49
+ }
50
+
51
+ .ui-discussion__quote {
52
+ background: var(--panel);
53
+ border-inline-start: 3px solid var(--accent);
54
+ color: var(--text);
55
+ font-family: var(--sans);
56
+ margin: var(--space-md) 0;
57
+ padding: var(--space-sm) var(--space-md);
58
+ white-space: pre-wrap;
59
+ }
60
+
61
+ .ui-discussion__messages,
62
+ .ui-discussion__list {
63
+ list-style: none;
64
+ margin: var(--space-md) 0;
65
+ padding: 0;
66
+ }
67
+
68
+ .ui-discussion__message {
69
+ border-block-end: 1px solid var(--line);
70
+ padding-block: var(--space-md);
71
+ }
72
+
73
+ .ui-discussion__message .ui-prose {
74
+ font-family: var(--sans);
75
+ font-size: var(--text-sm);
76
+ line-height: 1.5;
77
+ }
78
+
79
+ .ui-discussion__meta {
80
+ margin-block: 0 var(--space-sm);
81
+ }
82
+
83
+ .ui-discussion__item {
84
+ background: transparent;
85
+ border: 0;
86
+ border-block-end: 1px solid var(--line);
87
+ color: inherit;
88
+ cursor: pointer;
89
+ display: grid;
90
+ font: inherit;
91
+ gap: var(--space-xs);
92
+ inline-size: 100%;
93
+ min-block-size: 44px;
94
+ padding: var(--space-md) var(--space-sm);
95
+ text-align: start;
96
+ }
97
+
98
+ .ui-discussion__item > :first-child {
99
+ font-weight: 600;
100
+ }
101
+
102
+ .ui-discussion__item small {
103
+ color: var(--text-dim);
104
+ font-family: var(--sans);
105
+ font-size: var(--text-xs);
106
+ }
107
+
108
+ .ui-discussion__item:is(:hover, :focus-visible) {
109
+ background: var(--panel);
110
+ }
111
+
112
+ .ui-discussion__item:focus-visible {
113
+ outline: 2px solid var(--accent);
114
+ outline-offset: -2px;
115
+ }
116
+
117
+ .ui-discussion__composer {
118
+ border-block-start: 1px solid var(--line);
119
+ display: grid;
120
+ gap: var(--space-sm);
121
+ padding-block: var(--space-md);
122
+ }
123
+
124
+ .ui-discussion__composer textarea {
125
+ font-family: var(--sans);
126
+ inline-size: 100%;
127
+ min-block-size: 7rem;
128
+ resize: vertical;
129
+ }
130
+
131
+ @media (forced-colors: active) {
132
+ .ui-discussion__quote {
133
+ border-color: Highlight;
134
+ }
135
+
136
+ .ui-discussion__item:focus-visible {
137
+ outline-color: Highlight;
138
+ }
139
+ }
140
+
141
+ @media print {
142
+ .ui-discussion__actions,
143
+ .ui-discussion__composer {
144
+ display: none;
145
+ }
146
+
147
+ .ui-discussion__message {
148
+ break-inside: avoid;
149
+ }
150
+ }
package/css/figure.css CHANGED
@@ -8,6 +8,7 @@
8
8
  ========================================================================== */
9
9
 
10
10
  .ui-figure {
11
+ container: bronto-figure / inline-size;
11
12
  display: grid;
12
13
  gap: var(--space-sm);
13
14
  margin: 0;
@@ -22,11 +23,11 @@
22
23
 
23
24
  .ui-figure__caption {
24
25
  color: var(--text-dim);
25
- font-family: var(--mono);
26
- font-size: var(--text-2xs);
26
+ font-family: var(--sans);
27
+ font-size: var(--text-sm);
27
28
  letter-spacing: 0;
28
29
  line-height: 1.5;
29
- text-transform: uppercase;
30
+ text-transform: none;
30
31
  }
31
32
 
32
33
  .ui-figure__body {
@@ -81,7 +82,7 @@
81
82
  margin-block-start: var(--space-xs);
82
83
  }
83
84
 
84
- @media (max-width: 44rem) {
85
+ @container bronto-figure (max-width: 44rem) {
85
86
  .ui-figure__body--key-right {
86
87
  grid-template-columns: 1fr;
87
88
  }
@@ -89,6 +90,7 @@
89
90
 
90
91
  @media print {
91
92
  .ui-figure {
93
+ container-type: normal;
92
94
  break-inside: avoid;
93
95
  }
94
96
 
package/css/generated.css CHANGED
@@ -25,11 +25,11 @@
25
25
  align-items: center;
26
26
  color: var(--text-dim);
27
27
  display: inline-flex;
28
- font-family: var(--mono);
29
- font-size: var(--text-2xs);
28
+ font-family: var(--sans);
29
+ font-size: var(--text-xs);
30
30
  gap: 0.4rem;
31
- letter-spacing: var(--tracking-wide);
32
- text-transform: uppercase;
31
+ letter-spacing: 0;
32
+ text-transform: none;
33
33
  }
34
34
 
35
35
  /* --- Origin label — "AI assisted" / "model output" / "human reviewed". --- */
@@ -39,12 +39,12 @@
39
39
  border-radius: var(--radius-pill);
40
40
  color: var(--text-soft);
41
41
  display: inline-flex;
42
- font-family: var(--mono);
43
- font-size: var(--text-2xs);
42
+ font-family: var(--sans);
43
+ font-size: var(--text-xs);
44
44
  gap: 0.35rem;
45
- letter-spacing: var(--tracking-wide);
45
+ letter-spacing: 0;
46
46
  padding: 0.08rem 0.55rem;
47
- text-transform: uppercase;
47
+ text-transform: none;
48
48
  }
49
49
 
50
50
  .ui-origin-label--ai {
@@ -61,10 +61,10 @@
61
61
  .ui-reasoning > summary {
62
62
  color: var(--text-soft);
63
63
  cursor: pointer;
64
- font-family: var(--mono);
65
- font-size: var(--text-2xs);
66
- letter-spacing: var(--tracking-wide);
67
- text-transform: uppercase;
64
+ font-family: var(--sans);
65
+ font-size: var(--text-xs);
66
+ letter-spacing: 0;
67
+ text-transform: none;
68
68
  }
69
69
 
70
70
  .ui-reasoning__body {
@@ -110,6 +110,13 @@
110
110
  white-space: pre-wrap;
111
111
  }
112
112
 
113
+ @media (pointer: coarse) {
114
+ .ui-reasoning > summary,
115
+ .ui-tool-call > summary {
116
+ min-block-size: var(--tap-target);
117
+ }
118
+ }
119
+
113
120
  @media (forced-colors: active) {
114
121
  .ui-generated {
115
122
  border-inline-start-color: CanvasText;
package/css/legend.css CHANGED
@@ -18,7 +18,7 @@
18
18
  color: var(--text-soft);
19
19
  display: flex;
20
20
  flex-wrap: wrap;
21
- font-family: var(--mono);
21
+ font-family: var(--sans);
22
22
  font-size: var(--text-xs);
23
23
  gap: var(--space-2xs) var(--space-md);
24
24
  list-style: none;
@@ -37,13 +37,15 @@
37
37
 
38
38
  .ui-legend__title {
39
39
  color: var(--text-dim);
40
- font-size: var(--text-2xs);
40
+ font-size: var(--text-xs);
41
41
  letter-spacing: 0;
42
42
  margin: 0;
43
- text-transform: uppercase;
43
+ text-transform: none;
44
44
  }
45
45
 
46
46
  .ui-legend__item {
47
+ min-inline-size: 0;
48
+ max-inline-size: 100%;
47
49
  align-items: center;
48
50
  color: inherit;
49
51
  display: inline-flex;
@@ -51,6 +53,8 @@
51
53
  }
52
54
 
53
55
  .ui-legend__label {
56
+ min-inline-size: 0;
57
+ overflow-wrap: anywhere;
54
58
  color: inherit;
55
59
  }
56
60
 
@@ -62,9 +66,9 @@
62
66
 
63
67
  .ui-legend__caption {
64
68
  color: var(--text-dim);
65
- font-size: var(--text-2xs);
69
+ font-size: var(--text-xs);
66
70
  letter-spacing: 0;
67
- text-transform: uppercase;
71
+ text-transform: none;
68
72
  }
69
73
 
70
74
  /* Swatch — same token contract as the chart fill: set `--chart-color` (and,
@@ -202,6 +206,8 @@
202
206
  }
203
207
 
204
208
  .ui-legend--with-values .ui-legend__item {
209
+ min-inline-size: 0;
210
+ max-inline-size: 100%;
205
211
  display: grid;
206
212
  grid-column: 1 / -1;
207
213
  grid-template-columns: subgrid;
@@ -242,6 +248,8 @@
242
248
 
243
249
  .ui-legend__item.is-inactive .ui-legend__label,
244
250
  .ui-legend__item[aria-pressed='false'] .ui-legend__label {
251
+ min-inline-size: 0;
252
+ overflow-wrap: anywhere;
245
253
  text-decoration: line-through;
246
254
  }
247
255