@adia-ai/a2ui 0.8.39 → 0.8.41

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.
@@ -17,14 +17,17 @@
17
17
  - Set variant="contained" for a bounded per-item surface (background, border, radius, and an open-state divider) — the composition to reach for when nesting inside <card-ui>. Default variant="flat" (no chrome) suits settings pages and FAQ blocks sitting on the page canvas.
18
18
 
19
19
  ## ActionItem
20
- - Child of <action-list-ui> — one inline-action row with icon + label + optional shortcut + optional sublabel.
20
+ - Child of <action-list-ui> — one inline-action row with icon + label + optional subtitle + optional trailing shortcut/badge.
21
21
  - Different from <menu-item-ui>: action-items live inline in content surfaces; menu-items live inside <menu-ui> popovers.
22
22
  - For navigation entries (route-changing) use <nav-item-ui> instead.
23
+ - Use [variant="danger"] exclusively for destructive/irreversible actions (Delete, Remove). Pair danger items with an explicit confirm flow when the action cannot be undone.
24
+ - Prefer [icon]/[text]/[subtitle] props over slotted markup; use slot="icon"/"text"/"subtitle"/"trailing" only for custom markup (e.g. a slotted <kbd> shortcut hint).
23
25
 
24
26
  ## ActionList
25
27
  - Hosts <action-item-ui> children as a vertical command list inline in content surfaces.
26
28
  - For popover-style menus use <menu-ui> + <menu-item-ui> instead.
27
29
  - Typical use: command palettes, settings panels, agent suggestion lists.
30
+ - For a persisted, non-firing single selection (highlight the current row, no keyboard-activated command) use <list-ui selectable> instead — action-list-ui always fires and never holds a selected state.
28
31
 
29
32
  ## AdiaMark
30
33
  - Use <AdiaMark> for the Adia brand/app-identity mark — a favicon-style app-switcher tile, a splash/loading screen, an about-panel header. Do not use it as a generic icon; it has no [name] prop and always renders the same wordmark.
@@ -129,7 +132,7 @@
129
132
  - Canonical clickable affordance — text + optional icon. Variant attribute sets primary/secondary/ghost/destructive intent.
130
133
  - Do not repeat the icon's glyph in text=. Icon provides the symbol; text= carries only the words.
131
134
  - For navigation (route-change) use <nav-item-ui> or anchor; button-ui is for actions only.
132
- - For toggleable on/off state use <switch-ui>; for multi-select clusters use <toggle-group-ui> + <toggle-option-ui>.
135
+ - For toggleable on/off state use <switch-ui>; for multi-select clusters use <segmented-ui multiple> + <segment-ui> (gh#1369 — <toggle-group-ui>/<toggle-option-ui> are deprecated).
133
136
 
134
137
  ## CalendarGrid
135
138
  - Use <CalendarGrid> only as a substrate primitive composed inside a higher-level component (date-range picker, datetime picker, custom date affordance). For a full single-date input, use <CalendarPicker> — it adds a trigger button, popover surface, and form-association.
@@ -137,8 +140,11 @@
137
140
 
138
141
  ## CalendarPicker
139
142
  - Form-associated date input. Trigger button + popover calendar grid; emits ISO date string via change events.
140
- - Use for single-date input. For date ranges compose two pickers or use a dedicated range component.
143
+ - Use for single-date input. For date ranges use <date-range-picker-ui> instead of composing two calendar-picker instances.
141
144
  - min/max attributes constrain selectable range; disabled-dates accepts a function or date list.
145
+ - Set `precision: "minute"` or `precision: "second"` for combined date+time selection — composes a time pane alongside the calendar grid. `value` MUST then be ISO 8601 datetime ("YYYY-MM-DDTHH:mm" or with seconds) OR empty string; a date-only or time-only string fires `invalid`.
146
+ - `hour-cycle`/`step`/`locale` are only meaningful when `precision` is minute/second.
147
+ - Do NOT wrap in `<field-ui label>` AND also expect a bare `label` attribute on `<calendar-picker-ui>` to render — the picker has no first-class label; use `<field-ui label="…">` (siblings all follow this convention).
142
148
 
143
149
  ## Canvas
144
150
  - A2UI rendering surface — consumes a DocStore / A2UI document and renders the component tree from it.
@@ -173,7 +179,7 @@
173
179
  - For chat interfaces emit ChatInput as the sole input component inside the chat shell. The submit event fires on Enter or send-button click; `detail` is `{ text, model }`.
174
180
  - To customize models, set the `models` prop with an array of {value, label} option objects. Do not stamp a separate Select next to ChatInput for model selection — the built-in model picker handles it.
175
181
 
176
- ## ChatThread
182
+ ## UIChatThread
177
183
  - Primitive chat-message scroll container — ad-hoc message rendering surface.
178
184
  - Different from the bespoke <chat-thread> (module-tier, lives inside <chat-shell-ui>, owns scroll + load-more affordances).
179
185
  - Hosts arbitrary children — typical content: agent + user message blocks, <agent-feedback-bar-ui>, <agent-suggestions-ui>.
@@ -233,11 +239,9 @@
233
239
  - Use DateRangePicker for date ranges. Do NOT compose two adjacent `<calendar-picker-ui>` instances + JS synchronization — that is the pattern this primitive replaces.
234
240
 
235
241
  ## DatetimePicker
242
+ - DEPRECATED — prefer `{"component": "CalendarPicker", "precision": "minute"}` (or `"second"`) over `{"component": "DatetimePicker"}`. Both render and behave identically; DatetimePicker is a thin compatibility alias.
236
243
  - `DatetimePicker.value` MUST be ISO 8601 datetime (`YYYY-MM-DDTHH:mm` or `YYYY-MM-DDTHH:mm:ss`) OR empty string. Date-only or time-only strings fire `invalid`.
237
- - `precision: "second"` requires the value to include seconds when set; missing seconds are coerced to `:00` on commit.
238
244
  - `min` and `max` MUST be parseable ISO 8601 datetimes if non-empty. If `value` falls outside, `invalid` fires and the value does not commit.
239
- - `hour-cycle` overrides the locale-derived cycle in the time pane. Set explicitly when the surface needs a specific cycle (cron editors, log queries, system surfaces).
240
- - Use DatetimePicker for combined date+time. Do NOT compose `<calendar-picker-ui>` + a free-form `<input-ui>` manually as an alternative — that is the pattern this primitive replaces.
241
245
  - Per ADR-0025 NEVER wrap a native `<input type="datetime-local">` — the calendar pane + time pane composition + ElementInternals together provide form participation.
242
246
 
243
247
  ## DemoToggle
@@ -288,14 +292,15 @@
288
292
 
289
293
  ## FeedItem
290
294
  - One notification entry inside <feed-ui>. Title + description + optional icon + auto-dismiss timer.
291
- - Typically created programmatically via UIFeed.post(...); do not place declaratively.
292
- - Different from <alert-ui> (inline persistent) and <toast-ui> (standalone ephemeral); feed-item is feed-scoped.
295
+ - Typically created programmatically via UIFeed.post(...); do not place declaratively — for a generated declarative notification author `Toast` instead, which forwards into this same channel (SPEC-FEED-CHANNEL-001 Phase 4).
296
+ - Different from <alert-ui> (inline persistent). <toast-ui> is not a separate standalone system — it is the declarative-authoring facade for this same feed channel; both render as a feed-item paint site.
293
297
  - For "notification deep-link" pattern: post with action + onAction. Click navigates and auto-dismisses (router.push() / location.href / api.markRead()).
294
298
 
295
299
  ## Feed
296
300
  - Top-layer notification feed channel — singleton per position (top-right, bottom-center, etc.) mounted lazily into document.body.
297
301
  - Hosts <feed-item-ui> children programmatically via static API (UIFeed.post(...)). Do not place feed-items declaratively.
298
302
  - For inline persistent alerts inside content regions use <alert-ui> instead; feed is ephemeral overlay.
303
+ - Not the generation target for a new transient notification — author `Toast` instead. <toast-ui> is a thin declarative facade that already posts into this channel and self-removes on connect (SPEC-FEED-CHANNEL-001 Phase 4); `<feed-ui>`/`<feed-item-ui>` are the imperative/programmatic infrastructure underneath it, reached via `UIFeed.post()` or a declared `<toast-ui>`, never by placing `<feed-ui>`/`<feed-item-ui>` directly in generated markup.
299
304
 
300
305
  ## Field
301
306
  - field-ui is for WIDE controls (input-ui, select-ui, textarea-ui, slider-ui, etc.) that need a separate label row. Small self-labeling widgets (check-ui, switch-ui, radio-ui, toggle-ui) carry their own [label] attribute and MUST NOT be wrapped in field-ui.
@@ -331,7 +336,7 @@
331
336
  - Compose with the default slot for the heading (typically <text-ui variant="title">) and slot="action" for trailing controls (button-ui, badge-ui). The slot vocabulary (icon / heading / description / action) is shared with <aside-ui> / <section-ui> / <footer-ui> per ADR-0009.
332
337
  - Do NOT substitute <header-ui> for bespoke shell-tier chrome. Inside <admin-content> / <admin-sidebar> use <admin-topbar>; inside <chat-shell> use <chat-header>; inside <editor-shell> use <editor-toolbar>. Those modules carry shell-specific slot vocabulary and CSS that <header-ui> does not. (admin-topbar.yaml codifies this explicitly.)
333
338
  - Do NOT wrap header-ui's children in <col-ui> or <row-ui>. The container parent's @scope already lays out default+icon+heading+description+action via slot vocabulary; extra layout primitives fight the chrome styling.
334
- - The `padding` attribute is a bare boolean — it enables default header padding, but the *scale* is set by the container parent's own `padding` prop. Do not pass numeric values.
339
+ - The `padded` attribute is a bare boolean — it enables default header padding, but the *scale* is set by the container parent's own `padding` prop. Do not pass numeric values.
335
340
 
336
341
  ## Heatmap
337
342
  - Grid-cell heatmap visualization (calendar heatmap, density grid). Cells colored by value via OKLCH scale.
@@ -369,6 +374,7 @@
369
374
  - Form participation is implicit via UIFormElement. Set [name] for FormData submission; [required] / [disabled] / [readonly] reflect; listen for `change` (blur or Enter commit) and `input` (per keystroke). `submit` event fires when Enter commits the value (used by <chat-composer>'s `composer-submit` forwarding).
370
375
  - For numeric input use [type="number"] with [min] [max] [step] [precision] [prefix] / [suffix] — this stamps a contenteditable surface + <button-ui> / <icon-ui> stepper column with ARIA spinbutton semantics. Read `el.valueAsNumber` for the parsed Number. Never substitute a native <input type="number">.
371
376
  - Inside <chat-composer>, the canonical inner input is <chat-input-ui> (chat variant subclass — adds the send button + model picker + paste-to-attach plumbing). The plain <input-ui> primitive ALSO fires a bubbling `submit` event on Enter (unconditional, no opt-in attribute); <chat-input-ui> simply builds on that semantic.
377
+ - input-ui's `type` enum covers only the modes it actually implements — text/email/password/number/tel/url (gh#1363 B10). Never set [type] to an HTML5 value input-ui doesn't render — route date/time/color/search intents to the owning primitive instead: CalendarPicker, DatetimePicker, TimePicker, ColorInput (or ColorPicker directly), Search. See anti_patterns.
372
378
 
373
379
  ## Inspector
374
380
  - Developer-tools pane for A2UI runtime state — composes <tabs-ui> + <code-ui> internally.
@@ -407,11 +413,13 @@
407
413
  - Child of <list-ui> — one row of generic-list content.
408
414
  - For navigation lists use <nav-item-ui> inside <nav-ui>; for menu items use <menu-item-ui>; for tree rows use <tree-item-ui>.
409
415
  - Interactive list-items should have role='button' or be wrapped in <button-ui>; default is non-interactive.
416
+ - [selected] reflects the row current-selection state under <list-ui selectable> — it is parent-managed (ADR-0056); drive selection via the parent's [selectedKey], never [selected] directly.
410
417
 
411
418
  ## List
412
419
  - Generic vertical list container — hosts <list-item-ui> or arbitrary children.
413
- - For interactive selection lists use <nav-ui> (single-select navigation) or <menu-ui> (action menu); list-ui is content display.
420
+ - list-ui supports single selection natively via [selectable] + [selectedKey] (ADR-0056, #1363 B7) — the parent stamps the matching <list-item-ui>'s [selected] + aria-selected and fires selection-change. For route-aware navigation use <nav-ui> instead; for a popover action menu use <menu-ui> instead both have different interaction contracts than a plain selectable list.
414
421
  - For data-grid / sortable / sticky-header needs use <table-ui> instead.
422
+ - list-ui carries no fire-and-forget "action" mode. [selectable] keeps a persisted single selection (`selectedKey` / `aria-selected`, roving tabindex); for rows that activate immediately with no persisted selection state use <action-list-ui> + <action-item-ui> instead.
415
423
 
416
424
  ## LoadingOverlay
417
425
  - <LoadingOverlay> MUST be placed inside a sized container with content (Card, Section, Table body, Chart). It absolutely positions against the nearest positioned ancestor. The parent's CSS must include `position: relative` (or any non-static positioning) — the component does not mutate parent layout styles.
@@ -439,6 +447,7 @@
439
447
  - Use [variant="danger"] exclusively for destructive / irreversible actions (Delete, Remove). "Sign out" is NOT danger. Pair danger items with an explicit confirm flow (<modal-ui> destructive-confirm pattern) when the action cannot be undone.
440
448
  - Set [disabled] (not [hidden]) when an action is contextually unavailable — disabled items remain visible for affordance discoverability but skip roving focus + don't fire `action`.
441
449
  - Prefer [icon] + [text] props over slotted markup for consistency. Use slot="icon" / slot="text" only when you need custom markup (e.g. <avatar-ui slot="icon">, <kbd slot="trailing"> shortcut hint).
450
+ - <action-item-ui> (child of <action-list-ui>) shares this row contract (icon/text/subtitle/value/variant/disabled props, icon/text/subtitle/ trailing slot overrides) for inline, non-popover command rows — use it instead when the surface isn't a <menu-ui> popover (#1363 C5).
442
451
 
443
452
  ## MenuLabel
444
453
  - <menu-label-ui> MUST be a direct child of <menu-ui>; like menu-item-ui and menu-divider-ui it is hoisted into the top-layer popover via <menu-ui>'s direct-descendant query — a label nested elsewhere renders outside the popover.
@@ -450,7 +459,7 @@
450
459
  - Default slot accepts only <menu-item-ui> and <menu-divider-ui> children — no submenus, headers, or arbitrary content. Roving tabindex + Arrow / Home / End / Enter / Escape keyboard nav is built in.
451
460
  - Listen for the `action` event on <menu-ui> (or an ancestor — bubbles). Detail = { value, text }. Do NOT treat menu-ui as a value-holder; for single-select form input use <select-ui> instead. Menu fires actions, doesn't store state.
452
461
  - Use <menu-ui> for transient action surfaces (kebab / ⋯ row actions, workspace / user switchers, view-as toggles). For persistent side navigation use <nav-ui>; for inline (non-popover) command lists use <action-list-ui>; for searchable command palettes use <command-ui> inside <admin-command>.
453
- - Set [placement="top-start"] or [placement="top-end"] when the trigger sits near the bottom of the viewport (statusbar / footer menus); default [placement="bottom-start"] otherwise. Adjust [gap] (default 4px) only when chrome demands it.
462
+ - Set [placement="top-start"] or [placement="top-end"] when the trigger sits near the bottom of the viewport (statusbar / footer menus); default [placement="bottom-start"] otherwise. Adjust [offset] (default 4px) only when chrome demands it.
454
463
 
455
464
  ## Modal
456
465
  - Reflect modal visibility via the [open] boolean attribute on the host (open=true / open=false). Do NOT toggle [hidden], CSS display, or wrap in a sibling visibility container — modal-ui owns the native <dialog> lifecycle, focus trap, ::backdrop, and Escape-dismiss. Listen for the `close` event to react to dismiss.
@@ -537,7 +546,7 @@
537
546
  ## Popover
538
547
  - <popover-ui> wraps a focusable trigger (slot="trigger", typically <button-ui>) + arbitrary interactive content (slot="content"). Never put bare text in slot="trigger" — it must be focusable so keyboard users can open the popover.
539
548
  - Decision rule vs adjacent surfaces. (a) For a list of action items use <menu-ui> instead — menu-ui is the specialized popover with role=menu + roving tabindex. (b) For read-only hover hints use <tooltip-ui>. (c) For centered focus-trapping dialogs use <modal-ui>. (d) For edge-anchored multi-field forms use <drawer-ui>. popover-ui is the GENERAL anchored surface for everything else (inline forms, color pickers, theme panels, export menus with non-action content).
540
- - Placement convention (ADR-0034): default `bottom` centers under the trigger — correct for wide pickers (calendar, color, date-range, filter forms). Use `bottom-start` for trigger-width menus (action lists, listboxes, breadcrumb overflow — popover width ≈ trigger width). Use `bottom-end` only when the trigger sits at the right edge of a container by construction (toolbar spillover). Use `top-*` when the trigger sits low in the viewport (statusbar). [gap] (default 4px) sets offset from anchor.
549
+ - Placement convention (ADR-0034): default `bottom` centers under the trigger — correct for wide pickers (calendar, color, date-range, filter forms). Use `bottom-start` for trigger-width menus (action lists, listboxes, breadcrumb overflow — popover width ≈ trigger width). Use `bottom-end` only when the trigger sits at the right edge of a container by construction (toolbar spillover). Use `top-*` when the trigger sits low in the viewport (statusbar). [offset] (default 4px) sets offset from anchor.
541
550
  - [trigger="hover"] is for non-essential disclosure only — never use it for popovers containing inputs, destructive actions, or anything the user must interact with via keyboard. Default [trigger="click"] for everything interactive.
542
551
  - Do NOT nest <modal-ui> or <drawer-ui> inside slot="content"; popovers are non-modal anchored surfaces, not dialog hosts. Stacking dialog surfaces inside a popover breaks focus management.
543
552
 
@@ -547,20 +556,19 @@
547
556
  - Side-by-side ([layout="split"]) is the default. Set [layout="stack"] for wide self-framing examples (a full card / shell / table reads cramped at half width). Use [code-first] when the code is the teaching point and the render is confirmation.
548
557
 
549
558
  ## ProgressRow
550
- - Labeled progress row composes a label + <progress-ui> + optional value display in one horizontal row.
551
- - For standalone progress bars without a row context use <progress-ui> directly.
552
- - Inside lists (multiple tasks with progress) stack multiple progress-rows in a <col-ui>.
559
+ - DEPRECATED do not generate ProgressRow. Set `label` (and optional `meta`) directly on <progress-ui> instead; label present activates the identical row layout.
560
+ - For standalone progress bars without a row context use <progress-ui> directly (no `label`).
553
561
 
554
562
  ## Progress
555
563
  - Use for in-progress task feedback with known or indeterminate state. Value < 0 = indeterminate animation.
556
- - For labeled task lists (multiple progress bars with row labels), use <progress-row-ui> instead.
557
- - Spinner variant (variant='spinner') for circular loading indicators; bar variant default for linear.
564
+ - For labeled task lists (multiple progress bars with row labels, e.g. storage/capacity breakdowns), set `label` (and optional `meta`) directly on <progress-ui> — no separate component needed.
565
+ - For circular loading indicators, use <spinner-ui> instead <progress-ui> is bar-only.
558
566
 
559
567
  ## QRCode
560
568
  - Set [value] for URLs / share links / plain text. The built-in encoder covers byte-mode UTF-8 up to QR version 10 (~150 chars at ECC-M, more at lower ECC levels).
561
569
  - For data that exceeds version 10, switch to a higher ECC level downgrade ([error-correction=L]) OR use a BYO encoder and pass the precomputed [matrix].
562
570
  - When QR sits over a non-white surface, set [background] to a solid color. White-on-image QR backgrounds are unreliable for scanners — quiet-zone contrast against the dark cells is the load-bearing visual.
563
- - The [margin] (quiet zone) defaults to 4 cells per QR spec. Smaller margins may scan on some devices but not others; do not go below 2.
571
+ - The [quiet-zone] defaults to 4 cells per QR spec. Smaller values may scan on some devices but not others; do not go below 2.
564
572
 
565
573
  ## RadioGroup
566
574
  - The canonical radio-group shape is <radio-group-ui label="…"> wrapping a set of bare <radio-ui label="…" name="…"> children — the wrapper supplies the group's accessible name (role=radiogroup + aria-labelledby); Column/Section cannot carry a role, so a bare Column of radios has no programmatic question↔group association.
@@ -610,14 +618,14 @@
610
618
  - <section-ui> is the right place for layout primitives (<col-ui>, <row-ui>, <grid-ui>) that organize body content. Do NOT put those layout primitives inside <header-ui> or <footer-ui> — the parent's chrome scope already lays those rows out.
611
619
 
612
620
  ## Segment
613
- - Child of <segmented-ui> — one selectable option button in a single-select group.
614
- - Different from <toggle-option-ui> (which is multi-select inside <toggle-group-ui>).
615
- - Selected state managed by parent <segmented-ui> via active attribute; do not set selected directly on segment.
621
+ - Child of <segmented-ui> — one selectable option button; the parent's [multiple] axis decides single- or multi-select, segment-ui itself is unchanged either way.
622
+ - <toggle-option-ui> (deprecated, gh#1369) is the same concept — use segment-ui inside <segmented-ui multiple> instead.
623
+ - Selected state managed by the parent <segmented-ui> it syncs the selected attribute onto every child whose value is in its own value (single value, or the [multiple] comma-separated set); do not set selected directly on segment.
616
624
 
617
625
  ## Segmented
618
- - Single-select segmented control. Hosts <segment-ui> children; exactly one selected at a time.
619
- - For multi-select use <toggle-group-ui> + <toggle-option-ui> instead.
620
- - Use for view-mode switches (grid/list, light/dark) or short filter sets (3-5 options); for longer sets use <tabs-ui> or <select-ui>.
626
+ - Single-select by default. Hosts <segment-ui> children; exactly one selected at a time.
627
+ - For multi-select (filter chips, multi-flag toggles, day-of-week pickers), set [multiple] instead of using a separate component — value becomes a comma-separated set of selected segment values. <toggle-group-ui>/<toggle-option-ui> are deprecated; use <segmented-ui multiple> + <segment-ui> instead (gh#1369, #1363 C1).
628
+ - Use for view-mode switches (grid/list, light/dark) or short filter sets (3-5 options); for longer sets use <tabs-ui> or <select-ui multiple>.
621
629
 
622
630
  ## Select
623
631
  - Use <select-ui> for single-select with > 4 options or any list that benefits from a popover. Prefer <segmented-ui> / <radio-ui> when ≤ 4 visible options fit the row.
@@ -663,7 +671,7 @@
663
671
  ## StepProgress
664
672
  - Compact step indicator — N dots/segments showing current step out of total.
665
673
  - Different from <stepper-ui> (labeled, expanded) — step-progress is dense and label-free.
666
- - For multi-task progress bars (multiple labeled rows) use <progress-row-ui> stack.
674
+ - For multi-task progress bars (multiple labeled rows) use a stack of <progress-ui> with `label` set (absorbed the row layout from the now-deprecated progress-row-ui).
667
675
 
668
676
  ## StepperItem
669
677
  - Child of <stepper-ui> — one numbered step with label + complete/current/upcoming state.
@@ -719,6 +727,7 @@
719
727
  - [value] is required and must be unique among siblings — the parent <tabs-ui> matches its own [value] against each <tab-ui>[value] to decide which is active. [text] is the visible button label; optional [icon] is a Phosphor icon name shown leading the label.
720
728
  - Use the default slot for panel content. Inactive <tab-ui> children are auto-hidden by the parent's [hidden] toggling; do NOT set [hidden] yourself unless you want to remove the button from the strip entirely (i.e. a temporarily-disabled tab whose strip button shouldn't render at all).
721
729
  - Use [disabled] to keep a tab visible in the strip but non-selectable. Do not pair <tab-ui> with <button-ui> wrappers — the strip button is parent-rendered. Do not nest <tab-ui> inside another <tab-ui>.
730
+ - [selected] reflects whether this tab's panel is active — it is parent-managed (ADR-0056's selection-item convention, mirroring <segment-ui>); author markup drives the parent's [value], never [selected] directly.
722
731
 
723
732
  ## Tabs
724
733
  - Decision rule: use <tabs-ui> when switching VIEWS within the same logical page (no route change, no URL change). For navigating AWAY (different page / route / anchor), use <nav-ui> instead. For a form-control segmented selector that returns a value, use <segmented-ui>.
@@ -782,7 +791,8 @@
782
791
  ## Toast
783
792
  - Single ephemeral notification item — auto-dismissing or manually-closable.
784
793
  - Typically posted into <feed-ui> via UIFeed.post(...); for inline persistent alerts use <alert-ui> instead.
785
- - Variant maps to severity (info, success, warn, error); same tokens as <alert-ui>.
794
+ - Variant maps to severity (info, success, warning, danger); same tokens as <alert-ui>.
795
+ - Taught default for generated transient notifications — author `Toast` declaratively. It safely dissolves into `<feed-ui>` on connect (SPEC-FEED-CHANNEL-001 Phase 4; see toast.class.js), forwarding only `text`, `duration`, and `position` — not full parity with `UIFeed.post()`, which also accepts `heading`, `icon`, `dismissible`, and `action`, and defaults `variant` to `default` where Toast defaults to `info`. For those extra fields, call `UIFeed.post()` directly (imperative) instead of authoring `Toast`. Do not author `FeedItem` directly either way — <feed-ui>/<feed-item-ui>'s own a2ui rules say not to place it declaratively; that pair is the imperative channel Toast forwards into, not itself a generation target.
786
796
 
787
797
  ## TableOfContents
788
798
  - Use for in-page section navigation. Pair with a sticky container in an aside / right rail for the docs-site outline pattern.
@@ -791,14 +801,14 @@
791
801
  - Smooth-scroll on click is handled by the global `scroll-behavior: smooth` in resets.css (gated by prefers-reduced-motion). Do NOT add per-toc-ui smooth-scroll JS — the global wins.
792
802
 
793
803
  ## ToggleGroup
804
+ - DEPRECATED (gh#1369, #1363 C1) — generate <segmented-ui multiple> + <segment-ui> children instead when [single] is false/absent (the default, multi-select). When [single] is true, generate plain <segmented-ui> (no [multiple]) instead — single-select toggle-group maps to segmented's own single-select mode, not the multiple axis; note segmented-ui single-select never clears on re-click (toggle-group[single] does). Same comma-separated value encoding either way; toggle-group is kept working for existing consumers but should not appear in new generated output.
794
805
  - Multi-select button cluster — hosts <toggle-option-ui> children, each independently toggleable.
795
- - Different from <segmented-ui> (single-select) — toggle-group emits a SET of active values.
796
806
  - Use for filter chips, multi-flag toggles, day-of-week pickers; for binary on/off use <switch-ui>.
797
807
  - Sets the child <toggle-option-ui>'s declared [selected] prop to reflect the group value (ADR-0056) — do not author [selected] directly in generated markup; author the group's value instead.
798
808
 
799
809
  ## ToggleOption
810
+ - DEPRECATED (gh#1369, #1363 C1) — generate <segment-ui> instead, as a child of <segmented-ui multiple> (or plain <segmented-ui>, no [multiple], if the parent toggle-group had [single] — see toggle-group.yaml). toggle-option is kept working for existing consumers but should not appear in new generated output.
800
811
  - Child of <toggle-group-ui> — one independently-toggleable button in a multi-select cluster.
801
- - Different from <segment-ui> (which is single-select inside <segmented-ui>).
802
812
  - Selected state exposed via its own declared [selected] reflected prop, set by the parent <toggle-group-ui> (ADR-0056) — mirrors <segment-ui>'s convention. Do not set [selected] directly; drive the group's value instead.
803
813
 
804
814
  ## ToggleScheme
@@ -852,6 +862,7 @@
852
862
  ## Upload
853
863
  - File-upload input with drop zone + browse button. Form-associated; emits file-list change events.
854
864
  - Multiple attribute enables multi-file selection; accept= constrains file types.
865
+ - compact renders an icon-only trigger (no drop-zone chrome) — use in toolbars/dense rows; label becomes the trigger's aria-label. Programmatic triggering goes through the public .open() method, never the internal [data-dropzone] part.
855
866
  - For agent chat attachments use <chat-composer-ui>'s built-in upload affordance instead.
856
867
 
857
868
  ## VisuallyHidden
@@ -1171,7 +1182,7 @@ inside <grid-ui>; reach for the page composite only when search
1171
1182
  - Wraps a single <admin-page> child typically; do not place multiple admin-pages side-by-side as siblings here.
1172
1183
  - For horizontal scrolling regions (data grids, canvas surfaces) use overflow on the inner content instead — admin-scroll is vertical-only.
1173
1184
 
1174
- ## AppShell
1185
+ ## AdminShell
1175
1186
  - admin-shell takes bespoke admin-* children only. The canonical composition is <admin-topbar> + <admin-sidebar slot="leading"> + <admin-content> + <admin-sidebar slot="trailing"> + <admin-command> + optional <admin-statusbar>. The shell's CSS grid reads child tag selectors to place them.
1176
1187
  - Don't nest col-ui / row-ui or generic layout primitives directly inside admin-shell — app-shell.css handles grid layout based on bespoke child tags. Generic layout goes inside <admin-content> or inside <admin-page-body>.
1177
1188
  - Click forwarding patterns — [data-sidebar-toggle="<name>"] on a button forwards to <admin-sidebar[slot="<name>"]>.toggle(); [data-command-trigger] on a button forwards to <admin-command>.show(). The shell doesn't need to know about the buttons; the bespoke children own the behavior.
@@ -155,6 +155,7 @@
155
155
  "textAlign": { "$ref": "#/$defs/DynamicString", "description": "Text alignment — start, center, end, justify." },
156
156
  "ariaLabel": { "$ref": "#/$defs/DynamicString", "description": "Accessibility label (maps to aria-label at runtime)." },
157
157
  "ariaHidden":{ "$ref": "#/$defs/DynamicBoolean", "description": "Accessibility hidden state (maps to aria-hidden at runtime)." },
158
+ "ariaLive": { "$ref": "#/$defs/DynamicString", "description": "ARIA live-region politeness (maps to aria-live at runtime). Values: off | polite | assertive (A2UI v1.0 vocabulary, SPEC REQ-013). Use polite for status/progress text that updates in place, assertive only for urgent errors." },
158
159
  "span": { "$ref": "#/$defs/DynamicString", "description": "Grid-child column span, read by grid-ui's CSS attribute selector ([span=\"N\"] { grid-column: span N }). Layout-bearing like slot — accepted on every component, not a per-component prop (TKT-0002/TKT-0010)." }
159
160
  },
160
161
  "patternProperties": {