@adia-ai/a2ui-corpus 0.6.32 → 0.6.34

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.
Files changed (245) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/catalog-a2ui_0_9.json +3153 -356
  3. package/catalog-a2ui_0_9_rules.txt +98 -0
  4. package/chunk-embeddings.json +1 -1
  5. package/chunks/_index.json +32 -4
  6. package/chunks/accordion-settings.json +1 -1
  7. package/chunks/agent-activity-feed.json +1 -1
  8. package/chunks/agent-canvas-shell.json +1 -1
  9. package/chunks/agent-command-palette-search.json +1 -1
  10. package/chunks/agent-reasoning-collapsed.json +1 -1
  11. package/chunks/agent-tool-call-result.json +1 -1
  12. package/chunks/agent-trace-timeline.json +1 -1
  13. package/chunks/ai-streaming-response.json +1 -1
  14. package/chunks/alert-banner.json +1 -1
  15. package/chunks/auth-account-deleted-actions.json +1 -1
  16. package/chunks/auth-account-deleted.json +1 -1
  17. package/chunks/auth-card-content.json +1 -1
  18. package/chunks/auth-card-header.json +1 -1
  19. package/chunks/auth-email-entry.json +1 -1
  20. package/chunks/auth-email-verify-confirm.json +1 -1
  21. package/chunks/auth-email-verify.json +1 -1
  22. package/chunks/auth-forbidden-actions.json +1 -1
  23. package/chunks/auth-forbidden.json +1 -1
  24. package/chunks/auth-invite-actions.json +1 -1
  25. package/chunks/auth-invite-team-card.json +1 -1
  26. package/chunks/auth-link-expired-form.json +1 -1
  27. package/chunks/auth-link-expired.json +1 -1
  28. package/chunks/auth-locked-account.json +1 -1
  29. package/chunks/auth-locked-recovery-options.json +1 -1
  30. package/chunks/auth-mfa-enrollment-submit.json +1 -1
  31. package/chunks/auth-mfa-enrollment.json +1 -1
  32. package/chunks/auth-mfa-fallback-actions.json +1 -1
  33. package/chunks/auth-mfa-recovery.json +1 -1
  34. package/chunks/auth-new-password-form.json +1 -1
  35. package/chunks/auth-new-password.json +1 -1
  36. package/chunks/auth-oauth-fallback-actions.json +1 -1
  37. package/chunks/auth-oauth-interstitial.json +1 -1
  38. package/chunks/auth-password-challenge.json +1 -1
  39. package/chunks/auth-password-reset-form.json +1 -1
  40. package/chunks/auth-password-reset.json +1 -1
  41. package/chunks/auth-profile-form.json +1 -1
  42. package/chunks/auth-profile-setup.json +1 -1
  43. package/chunks/auth-reset-sent.json +1 -1
  44. package/chunks/auth-session-expired-actions.json +1 -1
  45. package/chunks/auth-session-expired.json +1 -1
  46. package/chunks/auth-signin-card-email.json +1 -1
  47. package/chunks/auth-signin-card-magic-link.json +1 -1
  48. package/chunks/auth-signin-card-mfa.json +1 -1
  49. package/chunks/auth-signin-card-otp.json +1 -1
  50. package/chunks/auth-signin-card-password.json +1 -1
  51. package/chunks/auth-signin-card-recovery.json +1 -1
  52. package/chunks/auth-signout-actions.json +1 -1
  53. package/chunks/auth-signout.json +1 -1
  54. package/chunks/auth-signup-email-entry.json +1 -1
  55. package/chunks/auth-signup-entry.json +1 -1
  56. package/chunks/auth-signup-social-auths.json +1 -1
  57. package/chunks/auth-signup-verify.json +1 -1
  58. package/chunks/auth-social-auths.json +1 -1
  59. package/chunks/auth-sso-providers.json +1 -1
  60. package/chunks/auth-sso-required.json +1 -1
  61. package/chunks/auth-team-invite.json +1 -1
  62. package/chunks/avatar-group-overflow.json +1 -1
  63. package/chunks/breadcrumb-nav.json +1 -1
  64. package/chunks/calendar-month-view.json +1 -1
  65. package/chunks/card-header-with-description.json +1 -1
  66. package/chunks/chart-with-filter-pills.json +1 -1
  67. package/chunks/chat-page-shell.json +1 -1
  68. package/chunks/chat-streaming-surface.json +1 -1
  69. package/chunks/color-picker-swatches.json +1 -1
  70. package/chunks/command-palette.json +1 -1
  71. package/chunks/commerce-pricing-tiers.json +1 -1
  72. package/chunks/comparison-table.json +1 -1
  73. package/chunks/conversion-funnel-6step.json +1 -1
  74. package/chunks/dashboard-acquisition-panel.json +1 -1
  75. package/chunks/dashboard-admin-page.json +1 -1
  76. package/chunks/dashboard-audience-kpis.json +1 -1
  77. package/chunks/dashboard-audience-panel.json +1 -1
  78. package/chunks/dashboard-behavior-panel.json +1 -1
  79. package/chunks/dashboard-chart-recent.json +1 -1
  80. package/chunks/dashboard-cohort-retention.json +1 -1
  81. package/chunks/dashboard-conversion-panel.json +1 -1
  82. package/chunks/dashboard-country-list.json +1 -1
  83. package/chunks/dashboard-filter-bar.json +1 -1
  84. package/chunks/dashboard-funnel.json +1 -1
  85. package/chunks/dashboard-kpi-grid.json +1 -1
  86. package/chunks/dashboard-notifications-feed.json +1 -1
  87. package/chunks/dashboard-notifications-panel.json +1 -1
  88. package/chunks/dashboard-overview-panel.json +1 -1
  89. package/chunks/dashboard-page-header.json +1 -1
  90. package/chunks/dashboard-pages-table.json +1 -1
  91. package/chunks/dashboard-quick-actions.json +1 -1
  92. package/chunks/dashboard-reports-panel.json +1 -1
  93. package/chunks/dashboard-reports-table.json +1 -1
  94. package/chunks/dashboard-spark-cards.json +1 -1
  95. package/chunks/dashboard-storage-card.json +1 -1
  96. package/chunks/dashboard-tabs.json +1 -1
  97. package/chunks/dashboard-team-actions-storage.json +1 -1
  98. package/chunks/dashboard-team-list.json +1 -1
  99. package/chunks/dashboard-traffic-channels.json +1 -1
  100. package/chunks/dashboard-transactions-table.json +1 -1
  101. package/chunks/date-time-picker-form.json +1 -1
  102. package/chunks/destructive-confirm-modal.json +1 -1
  103. package/chunks/divider-text-label.json +1 -1
  104. package/chunks/doc-editor-shell.json +1 -1
  105. package/chunks/drawer-2fa-key.json +1 -1
  106. package/chunks/drawer-2fa-sms.json +1 -1
  107. package/chunks/drawer-2fa-totp.json +1 -1
  108. package/chunks/drawer-cancel-sub.json +1 -1
  109. package/chunks/drawer-change-plan.json +1 -1
  110. package/chunks/drawer-custom-roles.json +1 -1
  111. package/chunks/drawer-data-start.json +1 -1
  112. package/chunks/drawer-delete-account.json +1 -1
  113. package/chunks/drawer-delete-workspace.json +1 -1
  114. package/chunks/drawer-discord.json +1 -1
  115. package/chunks/drawer-figma.json +1 -1
  116. package/chunks/drawer-first-dashboard.json +1 -1
  117. package/chunks/drawer-gcal.json +1 -1
  118. package/chunks/drawer-github.json +1 -1
  119. package/chunks/drawer-invite.json +1 -1
  120. package/chunks/drawer-payment-method.json +1 -1
  121. package/chunks/drawer-report.json +1 -1
  122. package/chunks/drawer-revoke-session.json +1 -1
  123. package/chunks/drawer-role.json +1 -1
  124. package/chunks/drawer-slack.json +1 -1
  125. package/chunks/drawer-smtp.json +1 -1
  126. package/chunks/drawer-source.json +1 -1
  127. package/chunks/drawer-transaction.json +1 -1
  128. package/chunks/editor-code-pane.json +1 -1
  129. package/chunks/editor-page-shell.json +1 -1
  130. package/chunks/editor-preview-pane.json +1 -1
  131. package/chunks/empty-state-danger.json +1 -1
  132. package/chunks/empty-state-minimal.json +1 -1
  133. package/chunks/empty-state-warning.json +1 -1
  134. package/chunks/empty-state.json +1 -1
  135. package/chunks/error-404-actions.json +1 -1
  136. package/chunks/error-404.json +1 -1
  137. package/chunks/error-500-actions.json +1 -1
  138. package/chunks/error-500.json +1 -1
  139. package/chunks/error-maintenance-actions.json +1 -1
  140. package/chunks/error-maintenance.json +1 -1
  141. package/chunks/error-page-shell.json +1 -1
  142. package/chunks/faq-accordion.json +1 -1
  143. package/chunks/file-upload-dnd.json +1 -1
  144. package/chunks/footer-multi-column.json +1 -1
  145. package/chunks/footer-primary-only.json +1 -1
  146. package/chunks/form-page-shell.json +1 -1
  147. package/chunks/gallery-page-shell.json +1 -1
  148. package/chunks/hero-section-split.json +1 -1
  149. package/chunks/icon-text-row.json +1 -1
  150. package/chunks/image-carousel.json +1 -1
  151. package/chunks/image-tile.json +1 -1
  152. package/chunks/image-upload-preview.json +1 -1
  153. package/chunks/inventory-list-stock.json +1 -1
  154. package/chunks/kanban-board-3col.json +1 -1
  155. package/chunks/kanban-page-shell.json +1 -1
  156. package/chunks/kbd-shortcuts.json +1 -1
  157. package/chunks/labeled-textarea.json +1 -1
  158. package/chunks/leaderboard-table.json +1 -1
  159. package/chunks/linked-record-row.json +1 -1
  160. package/chunks/marketing-hero-cta.json +1 -1
  161. package/chunks/marketing-page-shell.json +1 -1
  162. package/chunks/masonry-gallery.json +1 -1
  163. package/chunks/member-edit-drawer.json +1 -1
  164. package/chunks/metadata-description-list.json +1 -1
  165. package/chunks/multi-step-wizard.json +1 -1
  166. package/chunks/notification-toast-row.json +1 -1
  167. package/chunks/onb-completion.json +1 -1
  168. package/chunks/onb-extension-install.json +1 -1
  169. package/chunks/onb-hero-welcome.json +1 -1
  170. package/chunks/onb-import-picker.json +1 -1
  171. package/chunks/onb-mobile-handoff.json +1 -1
  172. package/chunks/onb-notification-prefs.json +1 -1
  173. package/chunks/onb-persona-picker.json +1 -1
  174. package/chunks/onb-provider-tiles.json +1 -1
  175. package/chunks/onb-settings-review.json +1 -1
  176. package/chunks/onb-step-footer.json +1 -1
  177. package/chunks/onb-step-header.json +1 -1
  178. package/chunks/onb-step-progress.json +1 -1
  179. package/chunks/onb-step-shell.json +1 -1
  180. package/chunks/onb-story-pane.json +1 -1
  181. package/chunks/onb-tutorial-steps.json +1 -1
  182. package/chunks/pagination-controls.json +1 -1
  183. package/chunks/playground-a2ui.json +1 -1
  184. package/chunks/playground-app-shell.json +1 -1
  185. package/chunks/playground-chat.json +1 -1
  186. package/chunks/playground-construct-canvas.json +1 -1
  187. package/chunks/playground-css-channel.json +355 -0
  188. package/chunks/playground-gen-ui.json +1 -1
  189. package/chunks/playground-render-preview.json +1 -1
  190. package/chunks/playground-streams-bridge.json +1 -1
  191. package/chunks/playground-table-toolbar.json +1 -1
  192. package/chunks/popover-with-content.json +1 -1
  193. package/chunks/progress-tracker-milestones.json +1 -1
  194. package/chunks/real-time-metrics-dashboard.json +1 -1
  195. package/chunks/reg-address-form.json +1 -1
  196. package/chunks/reg-billing-card.json +1 -1
  197. package/chunks/reg-brand-scrape.json +1 -1
  198. package/chunks/reg-departments-toggle.json +1 -1
  199. package/chunks/reg-extended-profile.json +1 -1
  200. package/chunks/reg-final-done.json +1 -1
  201. package/chunks/reg-helpdesk-grid.json +1 -1
  202. package/chunks/reg-import-picker.json +1 -1
  203. package/chunks/reg-integrations-grid.json +1 -1
  204. package/chunks/reg-invite-form.json +1 -1
  205. package/chunks/reg-legal-entity.json +1 -1
  206. package/chunks/reg-org-chart-review.json +1 -1
  207. package/chunks/reg-profile-identity.json +1 -1
  208. package/chunks/reg-step-footer.json +1 -1
  209. package/chunks/reg-step-header.json +1 -1
  210. package/chunks/reg-step-progress.json +1 -1
  211. package/chunks/reg-step-shell.json +1 -1
  212. package/chunks/reg-story-pane.json +1 -1
  213. package/chunks/reg-success-summary.json +1 -1
  214. package/chunks/reg-team-size.json +1 -1
  215. package/chunks/reg-usecase-picker.json +1 -1
  216. package/chunks/reg-workspace-name.json +1 -1
  217. package/chunks/responsive-grid-pattern.json +1 -1
  218. package/chunks/responsive-kpi-grid.json +1 -1
  219. package/chunks/responsive-row-pattern.json +1 -1
  220. package/chunks/responsive-wrap-at-pattern.json +1 -1
  221. package/chunks/search-with-filters.json +1 -1
  222. package/chunks/section-with-stack.json +1 -1
  223. package/chunks/select-multiple-preselected.json +1 -1
  224. package/chunks/settings-admin-page.json +1 -1
  225. package/chunks/settings-appearance.json +1 -1
  226. package/chunks/settings-billing-plan.json +1 -1
  227. package/chunks/settings-general-form.json +1 -1
  228. package/chunks/settings-integrations.json +1 -1
  229. package/chunks/settings-members-invite.json +1 -1
  230. package/chunks/settings-notifications.json +1 -1
  231. package/chunks/settings-page-shell.json +1 -1
  232. package/chunks/settings-profile-security.json +1 -1
  233. package/chunks/sidebar-collapsible-nav.json +1 -1
  234. package/chunks/slider-range-controls.json +1 -1
  235. package/chunks/tabs-with-panels.json +1 -1
  236. package/chunks/testimonial-grid.json +1 -1
  237. package/chunks/text-card.json +1 -1
  238. package/chunks/timeline-events.json +1 -1
  239. package/chunks/toolbar-icons.json +1 -1
  240. package/chunks/toolbar-tooltips.json +1 -1
  241. package/chunks/user-identity-row.json +1 -1
  242. package/chunks/user-profile-card.json +1 -1
  243. package/chunks/users-table-badge.json +1 -1
  244. package/chunks/video-player-controls.json +1 -1
  245. package/package.json +1 -1
@@ -104,6 +104,10 @@
104
104
  - For navigation (route-change) use <nav-item-ui> or anchor; button-ui is for actions only.
105
105
  - For toggleable on/off state use <switch-ui>; for multi-select clusters use <toggle-group-ui> + <toggle-option-ui>.
106
106
 
107
+ ## CalendarGrid
108
+ - 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.
109
+ - <CalendarGrid> is NOT form-associated. Its emitted `change` event is the sole signal to the parent — the parent owns the canonical value + form participation.
110
+
107
111
  ## CalendarPicker
108
112
  - Form-associated date input. Trigger button + popover calendar grid; emits ISO date string via change events.
109
113
  - Use for single-date input. For date ranges compose two pickers or use a dedicated range component.
@@ -173,12 +177,34 @@
173
177
  - For simple color swatches (read-only display) use <swatch-ui>; for hex/rgb text input use <color-input-ui>.
174
178
  - Output format defaults to oklch(); set format= to override (hex, rgb, hsl).
175
179
 
180
+ ## Combobox
181
+ - Use <combobox-ui> for typeahead-filterable single-select with a constrained-choice value model. `value` MUST be one of `options[].value` unless `[free-text]` is set. For ≤ 4 options, use <segmented-ui> or <radio-ui> instead.
182
+ - For free-form text entry with suggestions, use <autocomplete-input-ui> (SPEC-035) — combobox is constrained-choice. For button-first dropdowns where the trigger should be closed by default, use <select-ui searchable>.
183
+ - Compose options via native <option> / <optgroup> children, OR set `.options` programmatically as an array of `{value, label, disabled?}` (grouped form: `{label, options:[…]}`). Setting `value` to a string not in `options` is invalid mid-state (free-text=false) and the validator should reject it.
184
+ - `[creatable]` implies `[free-text]` and adds the "Create '{value}'" footer affordance + `create` event. Consumer wires the create event to a backend flow.
185
+ - Multi-select goes through <multi-select-ui> (SPEC-040), not combobox. Combobox is single-select.
186
+
176
187
  ## Command
177
188
  - <command-ui> is the searchable PALETTE primitive (input + option list). For Cmd+K palettes, wrap it in <admin-command> at the shell tier — admin-command owns the native <dialog>, focus management, and the Cmd+K / Ctrl+K shortcut listener. command-ui is content-only and does NOT own the dialog or shortcut. Do NOT hand-roll a <dialog> + Cmd+K key listener.
178
189
  - Author items as native <option value data-icon data-shortcut> elements inside <optgroup label="…"> for grouped sections. The `select` event's detail.category mirrors the parent optgroup's label. Detail = { value, label, category }.
179
190
  - Decision rule vs adjacent surfaces. Use <menu-ui> for small NON-searchable popover menus (≤10 actions, triggered by a button). Use <modal-ui> for generic centered dialogs. Reach for <command-ui> only when you need a searchable, keyboard-navigable list of commands or destinations.
180
191
  - command-ui MAY render inline (no dialog) for embedded search panels, but the canonical AdiaUI admin pattern is exactly one <command-ui placeholder="…"> as the sole child of <admin-command> inside <admin-shell>. See site/index.html and playgrounds/admin-shell/ for production references.
181
192
 
193
+ ## DateRangePicker
194
+ - DateRangePicker.value MUST be `{from, to}` with both ISO 8601 dates, OR null. Either side null is invalid mid-state and the validator should reject it (use `input` event for partial state).
195
+ - DateRangePicker.value.to MUST be `>=` value.from lexicographically. Reversed ranges trigger `invalid` and do NOT commit.
196
+ - When `comparison: true`, both `value` AND `compareValue` MUST be set on commit. If only one is set, the form participation emits the set one and omits the other.
197
+ - presets array entries each require both `label` (string) and `range` (`{from, to}`). Empty preset arrays are valid (rail renders empty).
198
+ - Use DateRangePicker for date ranges. Do NOT compose two adjacent `<calendar-picker-ui>` instances + JS synchronization — that is the pattern this primitive replaces.
199
+
200
+ ## DatetimePicker
201
+ - `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`.
202
+ - `precision: "second"` requires the value to include seconds when set; missing seconds are coerced to `:00` on commit.
203
+ - `min` and `max` MUST be parseable ISO 8601 datetimes if non-empty. If `value` falls outside, `invalid` fires and the value does not commit.
204
+ - `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).
205
+ - 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.
206
+ - Per ADR-0025 NEVER wrap a native `<input type="datetime-local">` — the calendar pane + time pane composition + ElementInternals together provide form participation.
207
+
182
208
  ## DemoToggle
183
209
  - Demo-page-only — toggles between live and code views in component documentation surfaces.
184
210
  - Do not use in apps/ — restrict to packages/web-components/components/*/<name>.html demo pages and docs surfaces.
@@ -283,6 +309,13 @@
283
309
  - Use only in dev/debug surfaces; not for product UI.
284
310
  - Place in a right-pane inside <editor-shell-ui>'s editor-sidebar slot for editor-style inspector layouts.
285
311
 
312
+ ## IntegrationCard
313
+ - Use <integration-card-ui> for one tile in an integrations grid. Set `provider` and `name` — both are required for analytics keys and the accessible name. Set `description` so users don't have to look the integration up externally.
314
+ - `status` MUST be one of `available | connected | error | pending | coming-soon`. The button label and variant are DERIVED from `status` — never slot a <button-ui> directly in the card body. Use the `actions` slot for an overflow <menu-ui> with secondary actions like Reauthenticate or Disconnect.
315
+ - When `status="error"`, set `error-message` — otherwise the user sees a Retry button with no context. The message renders below the description in danger-text color.
316
+ - `logo` accepts a URL (containing `/`, renders as <img>) or a registered icon name (renders as <icon-ui>). Don't mix — one provider gets one logo source.
317
+ - Group integration cards in <grid-ui columns="auto-fit"> or use <integrations-page-ui> (SPEC-063) for the canonical Settings-panel grid. Never nest <card-ui> around an <integration-card-ui> — it IS a card variant.
318
+
286
319
  ## Kbd
287
320
  - Inline-only — content from innerHTML, typically one or two key labels.
288
321
  - In menu items, use the kbd= attribute on <menu-item-ui> instead of nesting <kbd-ui> directly.
@@ -293,6 +326,16 @@
293
326
  - When wrapping action affordances that visually mimic links (e.g. 'Forgot password?' that triggers a reset flow), prefer `<button-ui variant="ghost">` over a fake `<link-ui>` — the affordance is semantically a button, just visually understated.
294
327
  - For inline-sentence affordances ('I agree to the [Terms] and [Privacy]'), nest `<link-ui>` directly inside `<text-ui>` so it inherits the paragraph's font / size / line-height.
295
328
 
329
+ ## ListWindow
330
+ - ListWindow.items MUST be an array of plain objects OR scalars. Functions / DOM nodes / Promises are invalid.
331
+ - ListWindow.render cannot be expressed in A2UI JSON — declarative authoring MUST use a <template> child (or default <list-item-ui> for objects with a text field).
332
+ - When items.length > 200, the validator SHOULD recommend ListWindow over List to keep the DOM tractable.
333
+ - ListWindow MUST have a defined height (via parent layout or style="height:..."). An unbounded-height windowed list defeats the windowing math.
334
+ - ListWindow.item-size SHOULD be set when item heights are known and constant — the fast-path is significantly cheaper.
335
+ - Do NOT nest ListWindow inside another scroll container; double-scroll containers break the IntersectionObserver math. Use one scroll boundary.
336
+ - Do NOT use ListWindow for short lists (< 50 items). The windowing overhead exceeds the cost of rendering all rows. Use List for short lists.
337
+ - Do NOT use for tabular data — that is Table with virtualized rows.
338
+
296
339
  ## ListItem
297
340
  - Child of <list-ui> — one row of generic-list content.
298
341
  - For navigation lists use <nav-item-ui> inside <nav-ui>; for menu items use <menu-item-ui>; for tree rows use <tree-item-ui>.
@@ -474,6 +517,13 @@
474
517
  - For two-handle range selection use <range-ui> instead.
475
518
  - Step attribute controls increments; show-value enables an inline value label.
476
519
 
520
+ ## Spinner
521
+ - Use <Spinner> for INDETERMINATE loading where the duration is unknown. For determinate progress (a known fraction complete), use <Progress> (linear) instead. For known-shape placeholder loading, use <Skeleton>.
522
+ - When a Spinner is inside a Button, set tone="current" so it matches the button label color, and disable the button while the operation is in progress.
523
+ - When overriding [label], use a present-progressive verb form ("Loading", "Saving", "Uploading"). Never use "Spin" or "Wait" — they describe the visual, not the operation.
524
+ - Do not nest <Spinner> inside <Skeleton>; they are siblings (two different loading idioms), not parent/child.
525
+ - Do not stack multiple sibling <Spinner>s in the same viewport region. Use one parent-level Spinner instead — multiple spinners add visual noise without extra information.
526
+
477
527
  ## Stack
478
528
  - Overlay/layer stacking container — children occupy the same area, stacked on the z-axis.
479
529
  - Use for overlapping content (image + overlay, badge-over-avatar, drop-shadow stacks).
@@ -566,6 +616,14 @@
566
616
  - Use [rows] to set initial height (default 3) and [resize] (vertical | horizontal | both | none; default vertical) to control user resize. Never substitute a native <textarea> just to get rows / resize.
567
617
  - Enter inserts a newline — <textarea-ui> does NOT emit a `submit` event. For Enter-to-send multi-line composers, use <chat-input-ui submit-on-enter> inside <chat-composer>, not textarea-ui.
568
618
 
619
+ ## TimePicker
620
+ - `<time-picker-ui>` is the canonical standalone time-of-day picker. Per ADR-0025 NEVER wrap a native `<input type="time">` — segments are contenteditable spans + ElementInternals provides form participation.
621
+ - `value` MUST be ISO 8601 time `HH:mm` or `HH:mm:ss` (24-hour), or empty string. Localized formats (e.g. "9:30 AM") are not accepted; display formatting is derived from `hour-cycle` regardless of how the value is stored.
622
+ - `step` is in seconds. 60 = minute precision (default); 900 = 15-minute precision (meeting-time common); 1 = second precision (requires `precision="second"`).
623
+ - `precision="second"` exposes the seconds segment AND emits `HH:mm:ss`. Default `precision="minute"` emits `HH:mm`.
624
+ - `hour-cycle` overrides locale-derived behavior. Set explicitly (`h12` / `h23`) when the surface needs a specific cycle (cron editors, log queries, system surfaces).
625
+ - For datetime selection use `<datetime-picker-ui>` (SPEC-038) — it composes this primitive as its time pane.
626
+
569
627
  ## TimelineItem
570
628
  - Child of <timeline-ui> — one chronological event with timestamp + content + optional icon dot.
571
629
  - Different from <stepper-item-ui> (process steps with completion state) — timeline-item is event history.
@@ -671,6 +729,31 @@
671
729
  - Different from primitive <chat-thread-ui>: chat-thread (no -ui suffix) is the module-tier shell-aware version with scroll-on-new-message + load-more + empty-state coordination.
672
730
  - Hosts message blocks (typically agent/user message rows) as default-slot children; <chat-empty> goes as first child for the empty state.
673
731
 
732
+ ## DateRangeSelector
733
+ - DateRangeSelector MUST sit inside a toolbar context — typically a
734
+ Row inside DashboardLayout.slot=toolbar, or directly inside
735
+ AdminPageHeader.slot=action. Do NOT place it as a freestanding
736
+ block primitive at page top-level.
737
+
738
+ - ONLY ONE DateRangeSelector with broadcast="document" per page.
739
+ Secondary instances on the same page MUST use broadcast="self"
740
+ or broadcast="none". Two document-broadcasters race for the
741
+ data-range-* attributes on <html> and produce flicker.
742
+
743
+ - `presets` MUST be a comma-separated subset of the documented value
744
+ enum (today, 7d, 30d, 90d, qtd, ytd, custom). Unknown keys are
745
+ ignored at runtime; the chip-row renders only recognized keys.
746
+
747
+ - When value="custom", from/to MUST be ISO-8601 dates supplied
748
+ either declaratively (from + to attributes) or imperatively via
749
+ setRange("custom", from, to). Without a custom from/to, the
750
+ composite falls back to the prior resolved range.
751
+
752
+ - For form participation, set [name]. Without [name], the composite
753
+ emits range-change events only and does NOT participate in form
754
+ submission. With [name], FormData carries the value "{from}:{to}".
755
+
756
+
674
757
  ## EditorCanvasEmpty
675
758
  - editor-canvas-empty is the bespoke empty-state slot for <editor-canvas>. Place as the first child of <editor-canvas>; visibility is automatic via the [empty] reflected attribute.
676
759
  - CSS-only — no JS module needed in shell HTML imports.
@@ -710,6 +793,21 @@
710
793
  - Different from <admin-topbar> (admin-shell chrome) — editor-toolbar has [full-screen] state + editor-specific [data-toolbar-action] event bubbling.
711
794
  - Place full-screen toggle buttons inside the toolbar with [data-toolbar-action="toggle-full-screen"]; host reflects [full-screen] up to <editor-shell>.
712
795
 
796
+ ## ConfirmDialog
797
+ - ConfirmDialog is for NON-destructive yes/no questions ("Save changes?", "Switch theme?", "Apply preset?"). For irreversible destructive operations (delete, drop, deploy to prod) use AlertDialog instead — its danger chrome + role="alertdialog" + typed-name speed-bump are the WAI-APG pattern for that case.
798
+ - Default focus lands on Cancel by default — this is intentional (WAI guidance: the least-destructive action is the default). Do NOT add autofocus to the confirm button or override the focus model.
799
+ - The confirm button is primary-toned by default. Use [confirm-variant="ghost"] only when both options are roughly equivalent in weight (e.g. "Apply preset" vs "Keep current" where neither is strictly preferred).
800
+ - Do NOT model the cancel option as a "Discard" action — if cancel means "lose data", the operation is destructive and belongs in AlertDialog. ConfirmDialog's cancel is a no-op return-to-prior- state semantically.
801
+ - Reflect dialog visibility via the [open] boolean attribute on the ConfirmDialog host (open=true / open=false). Do NOT toggle [hidden], CSS display, or wrap in a sibling visibility container — the inner <modal-ui> owns the native <dialog> lifecycle.
802
+
803
+ ## OnboardingChecklist
804
+ - OnboardingChecklist MUST have a non-empty `items` array. Empty items renders an empty card.
805
+ - Each item MUST have a unique `id` within the list — used as the storage key + event detail.
806
+ - `storageKey` SHOULD be namespaced per product (e.g. `myapp:onboarding:v1`) to avoid cross-app collisions.
807
+ - Items SHOULD number 3 to 8. Fewer than 3 is not worth a checklist; more than 8 should split into stages.
808
+ - Use for the "card of optional setup tasks" case. For horizontal multi-screen wizards use <step-progress-ui>; for generic to-do lists compose <list-ui> + <check-ui> directly.
809
+ - Do not nest two <onboarding-checklist-ui> with the same `storageKey` — they will clobber each other.
810
+
713
811
  ## A2UIRoot
714
812
  - Mount point for an A2UI-rendered composition. Hosts the runtime-emitted DOM tree.
715
813
  - Different from <gen-root> (which is for the generative-UI lane with LLM-driven streaming).