@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.
- package/CHANGELOG.md +26 -0
- package/catalog-a2ui_0_9.json +3153 -356
- package/catalog-a2ui_0_9_rules.txt +98 -0
- package/chunk-embeddings.json +1 -1
- package/chunks/_index.json +32 -4
- package/chunks/accordion-settings.json +1 -1
- package/chunks/agent-activity-feed.json +1 -1
- package/chunks/agent-canvas-shell.json +1 -1
- package/chunks/agent-command-palette-search.json +1 -1
- package/chunks/agent-reasoning-collapsed.json +1 -1
- package/chunks/agent-tool-call-result.json +1 -1
- package/chunks/agent-trace-timeline.json +1 -1
- package/chunks/ai-streaming-response.json +1 -1
- package/chunks/alert-banner.json +1 -1
- package/chunks/auth-account-deleted-actions.json +1 -1
- package/chunks/auth-account-deleted.json +1 -1
- package/chunks/auth-card-content.json +1 -1
- package/chunks/auth-card-header.json +1 -1
- package/chunks/auth-email-entry.json +1 -1
- package/chunks/auth-email-verify-confirm.json +1 -1
- package/chunks/auth-email-verify.json +1 -1
- package/chunks/auth-forbidden-actions.json +1 -1
- package/chunks/auth-forbidden.json +1 -1
- package/chunks/auth-invite-actions.json +1 -1
- package/chunks/auth-invite-team-card.json +1 -1
- package/chunks/auth-link-expired-form.json +1 -1
- package/chunks/auth-link-expired.json +1 -1
- package/chunks/auth-locked-account.json +1 -1
- package/chunks/auth-locked-recovery-options.json +1 -1
- package/chunks/auth-mfa-enrollment-submit.json +1 -1
- package/chunks/auth-mfa-enrollment.json +1 -1
- package/chunks/auth-mfa-fallback-actions.json +1 -1
- package/chunks/auth-mfa-recovery.json +1 -1
- package/chunks/auth-new-password-form.json +1 -1
- package/chunks/auth-new-password.json +1 -1
- package/chunks/auth-oauth-fallback-actions.json +1 -1
- package/chunks/auth-oauth-interstitial.json +1 -1
- package/chunks/auth-password-challenge.json +1 -1
- package/chunks/auth-password-reset-form.json +1 -1
- package/chunks/auth-password-reset.json +1 -1
- package/chunks/auth-profile-form.json +1 -1
- package/chunks/auth-profile-setup.json +1 -1
- package/chunks/auth-reset-sent.json +1 -1
- package/chunks/auth-session-expired-actions.json +1 -1
- package/chunks/auth-session-expired.json +1 -1
- package/chunks/auth-signin-card-email.json +1 -1
- package/chunks/auth-signin-card-magic-link.json +1 -1
- package/chunks/auth-signin-card-mfa.json +1 -1
- package/chunks/auth-signin-card-otp.json +1 -1
- package/chunks/auth-signin-card-password.json +1 -1
- package/chunks/auth-signin-card-recovery.json +1 -1
- package/chunks/auth-signout-actions.json +1 -1
- package/chunks/auth-signout.json +1 -1
- package/chunks/auth-signup-email-entry.json +1 -1
- package/chunks/auth-signup-entry.json +1 -1
- package/chunks/auth-signup-social-auths.json +1 -1
- package/chunks/auth-signup-verify.json +1 -1
- package/chunks/auth-social-auths.json +1 -1
- package/chunks/auth-sso-providers.json +1 -1
- package/chunks/auth-sso-required.json +1 -1
- package/chunks/auth-team-invite.json +1 -1
- package/chunks/avatar-group-overflow.json +1 -1
- package/chunks/breadcrumb-nav.json +1 -1
- package/chunks/calendar-month-view.json +1 -1
- package/chunks/card-header-with-description.json +1 -1
- package/chunks/chart-with-filter-pills.json +1 -1
- package/chunks/chat-page-shell.json +1 -1
- package/chunks/chat-streaming-surface.json +1 -1
- package/chunks/color-picker-swatches.json +1 -1
- package/chunks/command-palette.json +1 -1
- package/chunks/commerce-pricing-tiers.json +1 -1
- package/chunks/comparison-table.json +1 -1
- package/chunks/conversion-funnel-6step.json +1 -1
- package/chunks/dashboard-acquisition-panel.json +1 -1
- package/chunks/dashboard-admin-page.json +1 -1
- package/chunks/dashboard-audience-kpis.json +1 -1
- package/chunks/dashboard-audience-panel.json +1 -1
- package/chunks/dashboard-behavior-panel.json +1 -1
- package/chunks/dashboard-chart-recent.json +1 -1
- package/chunks/dashboard-cohort-retention.json +1 -1
- package/chunks/dashboard-conversion-panel.json +1 -1
- package/chunks/dashboard-country-list.json +1 -1
- package/chunks/dashboard-filter-bar.json +1 -1
- package/chunks/dashboard-funnel.json +1 -1
- package/chunks/dashboard-kpi-grid.json +1 -1
- package/chunks/dashboard-notifications-feed.json +1 -1
- package/chunks/dashboard-notifications-panel.json +1 -1
- package/chunks/dashboard-overview-panel.json +1 -1
- package/chunks/dashboard-page-header.json +1 -1
- package/chunks/dashboard-pages-table.json +1 -1
- package/chunks/dashboard-quick-actions.json +1 -1
- package/chunks/dashboard-reports-panel.json +1 -1
- package/chunks/dashboard-reports-table.json +1 -1
- package/chunks/dashboard-spark-cards.json +1 -1
- package/chunks/dashboard-storage-card.json +1 -1
- package/chunks/dashboard-tabs.json +1 -1
- package/chunks/dashboard-team-actions-storage.json +1 -1
- package/chunks/dashboard-team-list.json +1 -1
- package/chunks/dashboard-traffic-channels.json +1 -1
- package/chunks/dashboard-transactions-table.json +1 -1
- package/chunks/date-time-picker-form.json +1 -1
- package/chunks/destructive-confirm-modal.json +1 -1
- package/chunks/divider-text-label.json +1 -1
- package/chunks/doc-editor-shell.json +1 -1
- package/chunks/drawer-2fa-key.json +1 -1
- package/chunks/drawer-2fa-sms.json +1 -1
- package/chunks/drawer-2fa-totp.json +1 -1
- package/chunks/drawer-cancel-sub.json +1 -1
- package/chunks/drawer-change-plan.json +1 -1
- package/chunks/drawer-custom-roles.json +1 -1
- package/chunks/drawer-data-start.json +1 -1
- package/chunks/drawer-delete-account.json +1 -1
- package/chunks/drawer-delete-workspace.json +1 -1
- package/chunks/drawer-discord.json +1 -1
- package/chunks/drawer-figma.json +1 -1
- package/chunks/drawer-first-dashboard.json +1 -1
- package/chunks/drawer-gcal.json +1 -1
- package/chunks/drawer-github.json +1 -1
- package/chunks/drawer-invite.json +1 -1
- package/chunks/drawer-payment-method.json +1 -1
- package/chunks/drawer-report.json +1 -1
- package/chunks/drawer-revoke-session.json +1 -1
- package/chunks/drawer-role.json +1 -1
- package/chunks/drawer-slack.json +1 -1
- package/chunks/drawer-smtp.json +1 -1
- package/chunks/drawer-source.json +1 -1
- package/chunks/drawer-transaction.json +1 -1
- package/chunks/editor-code-pane.json +1 -1
- package/chunks/editor-page-shell.json +1 -1
- package/chunks/editor-preview-pane.json +1 -1
- package/chunks/empty-state-danger.json +1 -1
- package/chunks/empty-state-minimal.json +1 -1
- package/chunks/empty-state-warning.json +1 -1
- package/chunks/empty-state.json +1 -1
- package/chunks/error-404-actions.json +1 -1
- package/chunks/error-404.json +1 -1
- package/chunks/error-500-actions.json +1 -1
- package/chunks/error-500.json +1 -1
- package/chunks/error-maintenance-actions.json +1 -1
- package/chunks/error-maintenance.json +1 -1
- package/chunks/error-page-shell.json +1 -1
- package/chunks/faq-accordion.json +1 -1
- package/chunks/file-upload-dnd.json +1 -1
- package/chunks/footer-multi-column.json +1 -1
- package/chunks/footer-primary-only.json +1 -1
- package/chunks/form-page-shell.json +1 -1
- package/chunks/gallery-page-shell.json +1 -1
- package/chunks/hero-section-split.json +1 -1
- package/chunks/icon-text-row.json +1 -1
- package/chunks/image-carousel.json +1 -1
- package/chunks/image-tile.json +1 -1
- package/chunks/image-upload-preview.json +1 -1
- package/chunks/inventory-list-stock.json +1 -1
- package/chunks/kanban-board-3col.json +1 -1
- package/chunks/kanban-page-shell.json +1 -1
- package/chunks/kbd-shortcuts.json +1 -1
- package/chunks/labeled-textarea.json +1 -1
- package/chunks/leaderboard-table.json +1 -1
- package/chunks/linked-record-row.json +1 -1
- package/chunks/marketing-hero-cta.json +1 -1
- package/chunks/marketing-page-shell.json +1 -1
- package/chunks/masonry-gallery.json +1 -1
- package/chunks/member-edit-drawer.json +1 -1
- package/chunks/metadata-description-list.json +1 -1
- package/chunks/multi-step-wizard.json +1 -1
- package/chunks/notification-toast-row.json +1 -1
- package/chunks/onb-completion.json +1 -1
- package/chunks/onb-extension-install.json +1 -1
- package/chunks/onb-hero-welcome.json +1 -1
- package/chunks/onb-import-picker.json +1 -1
- package/chunks/onb-mobile-handoff.json +1 -1
- package/chunks/onb-notification-prefs.json +1 -1
- package/chunks/onb-persona-picker.json +1 -1
- package/chunks/onb-provider-tiles.json +1 -1
- package/chunks/onb-settings-review.json +1 -1
- package/chunks/onb-step-footer.json +1 -1
- package/chunks/onb-step-header.json +1 -1
- package/chunks/onb-step-progress.json +1 -1
- package/chunks/onb-step-shell.json +1 -1
- package/chunks/onb-story-pane.json +1 -1
- package/chunks/onb-tutorial-steps.json +1 -1
- package/chunks/pagination-controls.json +1 -1
- package/chunks/playground-a2ui.json +1 -1
- package/chunks/playground-app-shell.json +1 -1
- package/chunks/playground-chat.json +1 -1
- package/chunks/playground-construct-canvas.json +1 -1
- package/chunks/playground-css-channel.json +355 -0
- package/chunks/playground-gen-ui.json +1 -1
- package/chunks/playground-render-preview.json +1 -1
- package/chunks/playground-streams-bridge.json +1 -1
- package/chunks/playground-table-toolbar.json +1 -1
- package/chunks/popover-with-content.json +1 -1
- package/chunks/progress-tracker-milestones.json +1 -1
- package/chunks/real-time-metrics-dashboard.json +1 -1
- package/chunks/reg-address-form.json +1 -1
- package/chunks/reg-billing-card.json +1 -1
- package/chunks/reg-brand-scrape.json +1 -1
- package/chunks/reg-departments-toggle.json +1 -1
- package/chunks/reg-extended-profile.json +1 -1
- package/chunks/reg-final-done.json +1 -1
- package/chunks/reg-helpdesk-grid.json +1 -1
- package/chunks/reg-import-picker.json +1 -1
- package/chunks/reg-integrations-grid.json +1 -1
- package/chunks/reg-invite-form.json +1 -1
- package/chunks/reg-legal-entity.json +1 -1
- package/chunks/reg-org-chart-review.json +1 -1
- package/chunks/reg-profile-identity.json +1 -1
- package/chunks/reg-step-footer.json +1 -1
- package/chunks/reg-step-header.json +1 -1
- package/chunks/reg-step-progress.json +1 -1
- package/chunks/reg-step-shell.json +1 -1
- package/chunks/reg-story-pane.json +1 -1
- package/chunks/reg-success-summary.json +1 -1
- package/chunks/reg-team-size.json +1 -1
- package/chunks/reg-usecase-picker.json +1 -1
- package/chunks/reg-workspace-name.json +1 -1
- package/chunks/responsive-grid-pattern.json +1 -1
- package/chunks/responsive-kpi-grid.json +1 -1
- package/chunks/responsive-row-pattern.json +1 -1
- package/chunks/responsive-wrap-at-pattern.json +1 -1
- package/chunks/search-with-filters.json +1 -1
- package/chunks/section-with-stack.json +1 -1
- package/chunks/select-multiple-preselected.json +1 -1
- package/chunks/settings-admin-page.json +1 -1
- package/chunks/settings-appearance.json +1 -1
- package/chunks/settings-billing-plan.json +1 -1
- package/chunks/settings-general-form.json +1 -1
- package/chunks/settings-integrations.json +1 -1
- package/chunks/settings-members-invite.json +1 -1
- package/chunks/settings-notifications.json +1 -1
- package/chunks/settings-page-shell.json +1 -1
- package/chunks/settings-profile-security.json +1 -1
- package/chunks/sidebar-collapsible-nav.json +1 -1
- package/chunks/slider-range-controls.json +1 -1
- package/chunks/tabs-with-panels.json +1 -1
- package/chunks/testimonial-grid.json +1 -1
- package/chunks/text-card.json +1 -1
- package/chunks/timeline-events.json +1 -1
- package/chunks/toolbar-icons.json +1 -1
- package/chunks/toolbar-tooltips.json +1 -1
- package/chunks/user-identity-row.json +1 -1
- package/chunks/user-profile-card.json +1 -1
- package/chunks/users-table-badge.json +1 -1
- package/chunks/video-player-controls.json +1 -1
- package/package.json +1 -1
package/catalog-a2ui_0_9.json
CHANGED
|
@@ -3347,6 +3347,140 @@
|
|
|
3347
3347
|
"version": 1
|
|
3348
3348
|
}
|
|
3349
3349
|
},
|
|
3350
|
+
"CalendarGrid": {
|
|
3351
|
+
"title": "CalendarGrid",
|
|
3352
|
+
"description": "Substrate primitive — a single-month calendar grid (month nav + day cells + keyboard nav). Renders inline; no trigger, no popover. Used as a substrate by calendar-picker-ui (popover wrapper), date-range-picker-ui (two side-by-side grids), and datetime-picker-ui (one grid + time pane). For a complete date-picker affordance (trigger + popover + form participation), use calendar-picker-ui.",
|
|
3353
|
+
"type": "object",
|
|
3354
|
+
"allOf": [
|
|
3355
|
+
{
|
|
3356
|
+
"$ref": "#/$defs/ComponentCommon"
|
|
3357
|
+
},
|
|
3358
|
+
{
|
|
3359
|
+
"$ref": "#/$defs/CatalogComponentCommon"
|
|
3360
|
+
}
|
|
3361
|
+
],
|
|
3362
|
+
"properties": {
|
|
3363
|
+
"component": {
|
|
3364
|
+
"const": "CalendarGrid"
|
|
3365
|
+
},
|
|
3366
|
+
"disabled": {
|
|
3367
|
+
"description": "Disables all interaction.",
|
|
3368
|
+
"type": "boolean",
|
|
3369
|
+
"default": false
|
|
3370
|
+
},
|
|
3371
|
+
"max": {
|
|
3372
|
+
"description": "Maximum selectable date in ISO format (YYYY-MM-DD).",
|
|
3373
|
+
"type": "string",
|
|
3374
|
+
"default": ""
|
|
3375
|
+
},
|
|
3376
|
+
"min": {
|
|
3377
|
+
"description": "Minimum selectable date in ISO format (YYYY-MM-DD).",
|
|
3378
|
+
"type": "string",
|
|
3379
|
+
"default": ""
|
|
3380
|
+
},
|
|
3381
|
+
"readonly": {
|
|
3382
|
+
"description": "Blocks selection but allows month navigation.",
|
|
3383
|
+
"type": "boolean",
|
|
3384
|
+
"default": false
|
|
3385
|
+
},
|
|
3386
|
+
"value": {
|
|
3387
|
+
"description": "Selected date in ISO format (YYYY-MM-DD).",
|
|
3388
|
+
"type": "string",
|
|
3389
|
+
"default": ""
|
|
3390
|
+
}
|
|
3391
|
+
},
|
|
3392
|
+
"required": [
|
|
3393
|
+
"component"
|
|
3394
|
+
],
|
|
3395
|
+
"unevaluatedProperties": false,
|
|
3396
|
+
"x-adiaui": {
|
|
3397
|
+
"anti_patterns": [
|
|
3398
|
+
{
|
|
3399
|
+
"fix": "{\"component\": \"CalendarPicker\", \"name\": \"birthdate\"}\n",
|
|
3400
|
+
"why": "CalendarGrid is a substrate primitive — it does not participate in\nforms. The `name` attribute has no effect. Use CalendarPicker\n(form-associated) for single-date input.\n",
|
|
3401
|
+
"wrong": "{\"component\": \"CalendarGrid\", \"name\": \"birthdate\"}\n"
|
|
3402
|
+
}
|
|
3403
|
+
],
|
|
3404
|
+
"category": "input",
|
|
3405
|
+
"composes": [],
|
|
3406
|
+
"events": {
|
|
3407
|
+
"change": {
|
|
3408
|
+
"description": "User selected a date. detail.value is the ISO string."
|
|
3409
|
+
},
|
|
3410
|
+
"input": {
|
|
3411
|
+
"description": "Focus moved between days during keyboard nav. detail.focusDate is the ISO string."
|
|
3412
|
+
}
|
|
3413
|
+
},
|
|
3414
|
+
"examples": [],
|
|
3415
|
+
"keywords": [
|
|
3416
|
+
"calendar",
|
|
3417
|
+
"date",
|
|
3418
|
+
"grid",
|
|
3419
|
+
"month",
|
|
3420
|
+
"day-picker",
|
|
3421
|
+
"substrate"
|
|
3422
|
+
],
|
|
3423
|
+
"name": "UICalendarGrid",
|
|
3424
|
+
"related": [
|
|
3425
|
+
"CalendarPicker",
|
|
3426
|
+
"DateRangePicker",
|
|
3427
|
+
"DatetimePicker"
|
|
3428
|
+
],
|
|
3429
|
+
"slots": {},
|
|
3430
|
+
"states": [
|
|
3431
|
+
{
|
|
3432
|
+
"description": "Pointer-events off, reduced opacity, no selection.",
|
|
3433
|
+
"attribute": "disabled",
|
|
3434
|
+
"name": "disabled"
|
|
3435
|
+
},
|
|
3436
|
+
{
|
|
3437
|
+
"description": "Navigation allowed, selection blocked.",
|
|
3438
|
+
"attribute": "readonly",
|
|
3439
|
+
"name": "readonly"
|
|
3440
|
+
}
|
|
3441
|
+
],
|
|
3442
|
+
"status": "stable",
|
|
3443
|
+
"synonyms": {
|
|
3444
|
+
"calendar": [
|
|
3445
|
+
"calendar",
|
|
3446
|
+
"date"
|
|
3447
|
+
],
|
|
3448
|
+
"grid": [
|
|
3449
|
+
"grid",
|
|
3450
|
+
"calendar"
|
|
3451
|
+
]
|
|
3452
|
+
},
|
|
3453
|
+
"tag": "calendar-grid-ui",
|
|
3454
|
+
"tokens": {
|
|
3455
|
+
"--calendar-grid-day-bg-hover": {
|
|
3456
|
+
"description": "Background on hover (non-selected, non-outside, non-disabled).",
|
|
3457
|
+
"default": "var(--a-bg-hover)"
|
|
3458
|
+
},
|
|
3459
|
+
"--calendar-grid-day-bg-selected": {
|
|
3460
|
+
"description": "Background of the selected day cell.",
|
|
3461
|
+
"default": "var(--a-accent)"
|
|
3462
|
+
},
|
|
3463
|
+
"--calendar-grid-day-fg-selected": {
|
|
3464
|
+
"description": "Text color of the selected day cell.",
|
|
3465
|
+
"default": "var(--a-accent-fg)"
|
|
3466
|
+
},
|
|
3467
|
+
"--calendar-grid-day-size": {
|
|
3468
|
+
"description": "Square cell size for day buttons.",
|
|
3469
|
+
"default": "2rem"
|
|
3470
|
+
},
|
|
3471
|
+
"--calendar-grid-day-today-color": {
|
|
3472
|
+
"description": "Accent color used for the today-indicator dot + numeral tint.",
|
|
3473
|
+
"default": "var(--a-accent)"
|
|
3474
|
+
},
|
|
3475
|
+
"--calendar-grid-width": {
|
|
3476
|
+
"description": "Grid container width.",
|
|
3477
|
+
"default": "16rem"
|
|
3478
|
+
}
|
|
3479
|
+
},
|
|
3480
|
+
"traits": [],
|
|
3481
|
+
"version": 1
|
|
3482
|
+
}
|
|
3483
|
+
},
|
|
3350
3484
|
"CalendarPicker": {
|
|
3351
3485
|
"title": "CalendarPicker",
|
|
3352
3486
|
"description": "Date picker with trigger button and popover calendar grid. Form-associated input emitting ISO date string via change events; supports min/max and disabled-date masks. Use for single-date input in forms; for date ranges compose two pickers or use a dedicated range component.",
|
|
@@ -6027,9 +6161,9 @@
|
|
|
6027
6161
|
"version": 1
|
|
6028
6162
|
}
|
|
6029
6163
|
},
|
|
6030
|
-
"
|
|
6031
|
-
"title": "
|
|
6032
|
-
"description": "
|
|
6164
|
+
"Combobox": {
|
|
6165
|
+
"title": "Combobox",
|
|
6166
|
+
"description": "Typeahead-filterable single-select primitive — the constrained-choice\ncombobox per WAI-APG \"Combobox With List Autocomplete (manual\nselection)\". The committed value MUST come from the options list\nunless `[free-text]` is set. Distinct from `<select-ui searchable>`\n(button-first dropdown) and `<autocomplete-input-ui>` (free-form).\nForm-bearing via UIFormElement: `[name]`, `[value]`, `[required]`,\n`[disabled]`, fires `change`. Options via native `<option>` /\n`<optgroup>` children OR programmatic `.options` array.\n",
|
|
6033
6167
|
"type": "object",
|
|
6034
6168
|
"allOf": [
|
|
6035
6169
|
{
|
|
@@ -6040,18 +6174,113 @@
|
|
|
6040
6174
|
}
|
|
6041
6175
|
],
|
|
6042
6176
|
"properties": {
|
|
6177
|
+
"required": {
|
|
6178
|
+
"description": "Marks the field as required for form validation",
|
|
6179
|
+
"type": "boolean",
|
|
6180
|
+
"default": false
|
|
6181
|
+
},
|
|
6182
|
+
"clearable": {
|
|
6183
|
+
"description": "Renders an `x` clear button when value is set",
|
|
6184
|
+
"type": "boolean",
|
|
6185
|
+
"default": false
|
|
6186
|
+
},
|
|
6043
6187
|
"component": {
|
|
6044
|
-
"const": "
|
|
6188
|
+
"const": "Combobox"
|
|
6189
|
+
},
|
|
6190
|
+
"creatable": {
|
|
6191
|
+
"description": "Implies `[free-text]`; on Enter with unmatched typed text fires a\n`create` event with detail.value so the consumer can run a\nbackend create-then-refresh-options flow.",
|
|
6192
|
+
"type": "boolean",
|
|
6193
|
+
"default": false
|
|
6194
|
+
},
|
|
6195
|
+
"disabled": {
|
|
6196
|
+
"description": "Disables interaction and dims the control",
|
|
6197
|
+
"type": "boolean",
|
|
6198
|
+
"default": false
|
|
6199
|
+
},
|
|
6200
|
+
"error": {
|
|
6201
|
+
"description": "Validation error message",
|
|
6202
|
+
"type": "string",
|
|
6203
|
+
"default": ""
|
|
6204
|
+
},
|
|
6205
|
+
"filter-mode": {
|
|
6206
|
+
"description": "Client-side filter algorithm.",
|
|
6207
|
+
"type": "string",
|
|
6208
|
+
"enum": [
|
|
6209
|
+
"substring",
|
|
6210
|
+
"prefix",
|
|
6211
|
+
"fuzzy"
|
|
6212
|
+
],
|
|
6213
|
+
"default": "substring"
|
|
6214
|
+
},
|
|
6215
|
+
"free-text": {
|
|
6216
|
+
"description": "Allow typed text not in the options list. Blurs the distinction\nwith <autocomplete-input-ui>; prefer the dedicated primitive\nunless the value model truly needs both modes (tag-with-suggestions,\nemail-with-recent-recipients).",
|
|
6217
|
+
"type": "boolean",
|
|
6218
|
+
"default": false
|
|
6219
|
+
},
|
|
6220
|
+
"highlight-match": {
|
|
6221
|
+
"description": "Wraps the matched substring in `<mark>` inside option labels",
|
|
6222
|
+
"type": "boolean",
|
|
6223
|
+
"default": true
|
|
6224
|
+
},
|
|
6225
|
+
"hint": {
|
|
6226
|
+
"description": "Caption text below the field; wires `aria-describedby` on the host\nso screen readers announce it as a description.",
|
|
6227
|
+
"type": "string",
|
|
6228
|
+
"default": ""
|
|
6229
|
+
},
|
|
6230
|
+
"label": {
|
|
6231
|
+
"description": "Inline label rendered above the field. Wrap with <field-ui> for\nproper `<label for>` association in form-row compositions.",
|
|
6232
|
+
"type": "string",
|
|
6233
|
+
"default": ""
|
|
6234
|
+
},
|
|
6235
|
+
"loading": {
|
|
6236
|
+
"description": "Shows a loading spinner inside the popover; consumer drives async fetch",
|
|
6237
|
+
"type": "boolean",
|
|
6238
|
+
"default": false
|
|
6239
|
+
},
|
|
6240
|
+
"max-options": {
|
|
6241
|
+
"description": "Cap on rendered options. Overflow shows a \"scroll for more\" hint",
|
|
6242
|
+
"type": "number",
|
|
6243
|
+
"default": 100
|
|
6244
|
+
},
|
|
6245
|
+
"name": {
|
|
6246
|
+
"description": "Form control name for form data submission",
|
|
6247
|
+
"type": "string",
|
|
6248
|
+
"default": ""
|
|
6045
6249
|
},
|
|
6046
6250
|
"open": {
|
|
6047
|
-
"description": "
|
|
6251
|
+
"description": "Reflects popover open / closed state",
|
|
6048
6252
|
"type": "boolean",
|
|
6049
6253
|
"default": false
|
|
6050
6254
|
},
|
|
6255
|
+
"options": {
|
|
6256
|
+
"description": "Programmatic option list. Array of {value, label, disabled?, group?} or grouped {label, options:[…]}. Alternative to declarative <option> / <optgroup> children.",
|
|
6257
|
+
"type": "array",
|
|
6258
|
+
"default": []
|
|
6259
|
+
},
|
|
6051
6260
|
"placeholder": {
|
|
6052
|
-
"description": "Placeholder text
|
|
6261
|
+
"description": "Placeholder text in the input when value is empty",
|
|
6053
6262
|
"type": "string",
|
|
6054
|
-
"default": "
|
|
6263
|
+
"default": "Select..."
|
|
6264
|
+
},
|
|
6265
|
+
"readonly": {
|
|
6266
|
+
"description": "Prevents selection changes while keeping the field focusable + popover-open allowed",
|
|
6267
|
+
"type": "boolean",
|
|
6268
|
+
"default": false
|
|
6269
|
+
},
|
|
6270
|
+
"size": {
|
|
6271
|
+
"description": "Sizing scale via universal `[size]` attribute system. Matches Input + Select sizing tokens so a Combobox rendered alongside either feels coherent in a form row.",
|
|
6272
|
+
"type": "string",
|
|
6273
|
+
"enum": [
|
|
6274
|
+
"sm",
|
|
6275
|
+
"md",
|
|
6276
|
+
"lg"
|
|
6277
|
+
],
|
|
6278
|
+
"default": "md"
|
|
6279
|
+
},
|
|
6280
|
+
"value": {
|
|
6281
|
+
"description": "Currently selected option value. Must be a member of `options[].value` unless `[free-text]` is set. With declarative <option> children, a child carrying the native `selected` attribute sets the initial value when this attribute is absent.",
|
|
6282
|
+
"type": "string",
|
|
6283
|
+
"default": ""
|
|
6055
6284
|
}
|
|
6056
6285
|
},
|
|
6057
6286
|
"required": [
|
|
@@ -6059,26 +6288,90 @@
|
|
|
6059
6288
|
],
|
|
6060
6289
|
"unevaluatedProperties": false,
|
|
6061
6290
|
"x-adiaui": {
|
|
6062
|
-
"anti_patterns": [
|
|
6063
|
-
|
|
6064
|
-
|
|
6065
|
-
|
|
6066
|
-
|
|
6067
|
-
"description": "Fired when Escape is pressed"
|
|
6291
|
+
"anti_patterns": [
|
|
6292
|
+
{
|
|
6293
|
+
"fix": "{\"component\": \"Combobox\", \"value\": \"us\", \"options\": [{\"value\": \"us\", \"label\": \"United States\"}]}\n",
|
|
6294
|
+
"why": "`value` is \"xx\" but only \"us\" is in options. With free-text:false (default), this is an invalid\nmid-state — set value: \"us\" or add an option with value: \"xx\".\n",
|
|
6295
|
+
"wrong": "{\"component\": \"Combobox\", \"value\": \"xx\", \"options\": [{\"value\": \"us\", \"label\": \"United States\"}]}\n"
|
|
6068
6296
|
},
|
|
6069
|
-
|
|
6070
|
-
"
|
|
6297
|
+
{
|
|
6298
|
+
"fix": "{\"component\": \"SegmentedControl\", \"options\": [{\"value\": \"a\", \"label\": \"A\"}, {\"value\": \"b\", \"label\": \"B\"}]}\n",
|
|
6299
|
+
"why": "Only 2 options. Combobox is overkill — use SegmentedControl or Radio.\n",
|
|
6300
|
+
"wrong": "{\"component\": \"Combobox\", \"options\": [{\"value\": \"a\", \"label\": \"A\"}, {\"value\": \"b\", \"label\": \"B\"}]}\n"
|
|
6301
|
+
},
|
|
6302
|
+
{
|
|
6303
|
+
"fix": "{\"component\": \"MultiSelect\", \"options\": [...]}\n",
|
|
6304
|
+
"why": "Combobox is single-select. Multi-select goes through MultiSelect.\n",
|
|
6305
|
+
"wrong": "{\"component\": \"Combobox\", \"multiple\": true, \"options\": [...]}\n"
|
|
6306
|
+
}
|
|
6307
|
+
],
|
|
6308
|
+
"category": "input",
|
|
6309
|
+
"composes": [
|
|
6310
|
+
"icon-ui"
|
|
6311
|
+
],
|
|
6312
|
+
"events": {
|
|
6313
|
+
"change": {
|
|
6314
|
+
"description": "Fired when value is committed — option clicked, Enter on active\noption, or programmatic `.value =`. Detail.option resolves to the\nmatching `{label,value,...}` or null in free-text/cleared paths.",
|
|
6071
6315
|
"detail": {
|
|
6072
|
-
"
|
|
6073
|
-
"description": "
|
|
6316
|
+
"option": {
|
|
6317
|
+
"description": "Resolved option object or null when free-text / cleared.",
|
|
6318
|
+
"type": "object"
|
|
6319
|
+
},
|
|
6320
|
+
"source": {
|
|
6321
|
+
"description": "One of `click` / `keyboard` / `programmatic`.",
|
|
6074
6322
|
"type": "string"
|
|
6075
6323
|
},
|
|
6076
|
-
"
|
|
6077
|
-
"description": "
|
|
6324
|
+
"value": {
|
|
6325
|
+
"description": "Committed value.",
|
|
6326
|
+
"type": "string"
|
|
6327
|
+
}
|
|
6328
|
+
}
|
|
6329
|
+
},
|
|
6330
|
+
"close": {
|
|
6331
|
+
"description": "Popover closed.",
|
|
6332
|
+
"detail": {
|
|
6333
|
+
"reason": {
|
|
6334
|
+
"description": "One of `escape` / `outside` / `select` / `blur`.",
|
|
6335
|
+
"type": "string"
|
|
6336
|
+
}
|
|
6337
|
+
}
|
|
6338
|
+
},
|
|
6339
|
+
"create": {
|
|
6340
|
+
"description": "Fired when `[creatable]` is set and the user presses Enter on\ntyped text that doesn't match any option. Consumer wires this to\na backend create flow and then refreshes `.options`.",
|
|
6341
|
+
"detail": {
|
|
6342
|
+
"value": {
|
|
6343
|
+
"description": "The typed text the user is trying to create.",
|
|
6344
|
+
"type": "string"
|
|
6345
|
+
}
|
|
6346
|
+
}
|
|
6347
|
+
},
|
|
6348
|
+
"input": {
|
|
6349
|
+
"description": "Fired on each keystroke (filter typing); not a commit. Detail carries the typed query.",
|
|
6350
|
+
"detail": {
|
|
6351
|
+
"query": {
|
|
6352
|
+
"description": "Lowercased filter query.",
|
|
6078
6353
|
"type": "string"
|
|
6079
6354
|
},
|
|
6080
6355
|
"value": {
|
|
6081
|
-
"description": "
|
|
6356
|
+
"description": "Current input text (the user's typed query).",
|
|
6357
|
+
"type": "string"
|
|
6358
|
+
}
|
|
6359
|
+
}
|
|
6360
|
+
},
|
|
6361
|
+
"invalid": {
|
|
6362
|
+
"description": "Fired when `[free-text]` is false and the user presses Enter on\ntyped text that doesn't match any option. The value is NOT\ncommitted; the input is restored to the last committed value.",
|
|
6363
|
+
"detail": {
|
|
6364
|
+
"query": {
|
|
6365
|
+
"description": "The unmatched typed text.",
|
|
6366
|
+
"type": "string"
|
|
6367
|
+
}
|
|
6368
|
+
}
|
|
6369
|
+
},
|
|
6370
|
+
"open": {
|
|
6371
|
+
"description": "Popover opened.",
|
|
6372
|
+
"detail": {
|
|
6373
|
+
"trigger": {
|
|
6374
|
+
"description": "One of `click` / `keyboard` / `typing`.",
|
|
6082
6375
|
"type": "string"
|
|
6083
6376
|
}
|
|
6084
6377
|
}
|
|
@@ -6086,186 +6379,1431 @@
|
|
|
6086
6379
|
},
|
|
6087
6380
|
"examples": [
|
|
6088
6381
|
{
|
|
6089
|
-
"description": "
|
|
6090
|
-
"a2ui": "[\n {\
|
|
6091
|
-
"name": "
|
|
6382
|
+
"description": "Country picker — canonical declarative <option> children inside a <field-ui>.",
|
|
6383
|
+
"a2ui": "[\n {\"id\": \"root\", \"component\": \"Card\", \"children\": [\"sec\"]},\n {\"id\": \"sec\", \"component\": \"Section\", \"children\": [\"country\"]},\n {\n \"id\": \"country\",\n \"component\": \"Combobox\",\n \"name\": \"country\",\n \"label\": \"Country\",\n \"placeholder\": \"Select country…\",\n \"options\": [\n {\"value\": \"us\", \"label\": \"United States\"},\n {\"value\": \"gb\", \"label\": \"United Kingdom\"},\n {\"value\": \"de\", \"label\": \"Germany\"},\n {\"value\": \"fr\", \"label\": \"France\"},\n {\"value\": \"es\", \"label\": \"Spain\"}\n ],\n \"value\": \"us\"\n }\n]",
|
|
6384
|
+
"name": "country-picker"
|
|
6385
|
+
},
|
|
6386
|
+
{
|
|
6387
|
+
"description": "Tag picker with create-new affordance — fires `create` event on unmatched Enter.",
|
|
6388
|
+
"a2ui": "[\n {\"id\": \"root\", \"component\": \"Card\", \"children\": [\"sec\"]},\n {\"id\": \"sec\", \"component\": \"Section\", \"children\": [\"tag\"]},\n {\n \"id\": \"tag\",\n \"component\": \"Combobox\",\n \"name\": \"tag\",\n \"label\": \"Tag\",\n \"creatable\": true,\n \"placeholder\": \"Pick or create a tag…\",\n \"options\": [\n {\"value\": \"bug\", \"label\": \"bug\"},\n {\"value\": \"feature\", \"label\": \"feature\"},\n {\"value\": \"chore\", \"label\": \"chore\"}\n ]\n }\n]",
|
|
6389
|
+
"name": "creatable-tag-picker"
|
|
6092
6390
|
}
|
|
6093
6391
|
],
|
|
6094
6392
|
"keywords": [
|
|
6095
|
-
"
|
|
6096
|
-
"assistant",
|
|
6097
|
-
"copilot",
|
|
6098
|
-
"ai",
|
|
6099
|
-
"prompt",
|
|
6100
|
-
"console",
|
|
6101
|
-
"menu",
|
|
6102
|
-
"terminal",
|
|
6103
|
-
"search",
|
|
6104
|
-
"find",
|
|
6105
|
-
"lookup",
|
|
6393
|
+
"combobox",
|
|
6106
6394
|
"autocomplete",
|
|
6107
6395
|
"typeahead",
|
|
6108
|
-
"
|
|
6109
|
-
"
|
|
6110
|
-
"
|
|
6111
|
-
"
|
|
6112
|
-
"
|
|
6113
|
-
"
|
|
6114
|
-
|
|
6115
|
-
|
|
6116
|
-
|
|
6117
|
-
|
|
6396
|
+
"select",
|
|
6397
|
+
"filter",
|
|
6398
|
+
"picker",
|
|
6399
|
+
"country-picker",
|
|
6400
|
+
"timezone-picker",
|
|
6401
|
+
"member-picker"
|
|
6402
|
+
],
|
|
6403
|
+
"name": "UICombobox",
|
|
6404
|
+
"related": [
|
|
6405
|
+
"select",
|
|
6406
|
+
"search",
|
|
6407
|
+
"input",
|
|
6408
|
+
"field"
|
|
6409
|
+
],
|
|
6410
|
+
"slots": {
|
|
6411
|
+
"default": {
|
|
6412
|
+
"description": "Native <option> / <optgroup> children for declarative authoring"
|
|
6413
|
+
},
|
|
6414
|
+
"empty": {
|
|
6415
|
+
"description": "Custom no-matches content (defaults to \"No matches\")"
|
|
6416
|
+
},
|
|
6417
|
+
"footer": {
|
|
6418
|
+
"description": "Footer area inside the popover (e.g. \"Press Enter to create…\" affordance)"
|
|
6419
|
+
},
|
|
6420
|
+
"loading": {
|
|
6421
|
+
"description": "Custom loading content (defaults to a spinner)"
|
|
6422
|
+
},
|
|
6423
|
+
"prefix": {
|
|
6424
|
+
"description": "Leading icon / element inside the input chrome"
|
|
6425
|
+
},
|
|
6426
|
+
"suffix": {
|
|
6427
|
+
"description": "Trailing icon / element (defaults to `caret-down`)"
|
|
6428
|
+
}
|
|
6429
|
+
},
|
|
6430
|
+
"states": [
|
|
6431
|
+
{
|
|
6432
|
+
"description": "Closed; not focused.",
|
|
6433
|
+
"name": "idle"
|
|
6434
|
+
},
|
|
6435
|
+
{
|
|
6436
|
+
"description": "Input focused; popover closed.",
|
|
6437
|
+
"attribute": ":focus-within",
|
|
6438
|
+
"name": "focused"
|
|
6439
|
+
},
|
|
6440
|
+
{
|
|
6441
|
+
"description": "Popover visible; filtered options listed.",
|
|
6442
|
+
"attribute": "open",
|
|
6443
|
+
"name": "open"
|
|
6444
|
+
},
|
|
6445
|
+
{
|
|
6446
|
+
"description": "Spinner shown; options stale (consumer-driven async fetch).",
|
|
6447
|
+
"attribute": "loading",
|
|
6448
|
+
"name": "loading"
|
|
6449
|
+
},
|
|
6450
|
+
{
|
|
6451
|
+
"description": "Non-interactive; dimmed.",
|
|
6452
|
+
"attribute": "disabled",
|
|
6453
|
+
"name": "disabled"
|
|
6454
|
+
},
|
|
6455
|
+
{
|
|
6456
|
+
"description": "Focusable + popover-open allowed; commits blocked.",
|
|
6457
|
+
"attribute": "readonly",
|
|
6458
|
+
"name": "readonly"
|
|
6459
|
+
}
|
|
6460
|
+
],
|
|
6461
|
+
"status": "stable",
|
|
6462
|
+
"synonyms": {
|
|
6463
|
+
"autocomplete": [
|
|
6464
|
+
"combobox",
|
|
6465
|
+
"typeahead",
|
|
6466
|
+
"suggest"
|
|
6467
|
+
],
|
|
6468
|
+
"combobox": [
|
|
6469
|
+
"autocomplete",
|
|
6470
|
+
"typeahead",
|
|
6471
|
+
"filter",
|
|
6472
|
+
"picker"
|
|
6473
|
+
],
|
|
6474
|
+
"picker": [
|
|
6475
|
+
"combobox",
|
|
6476
|
+
"select",
|
|
6477
|
+
"dropdown"
|
|
6478
|
+
],
|
|
6479
|
+
"typeahead": [
|
|
6480
|
+
"combobox",
|
|
6481
|
+
"autocomplete",
|
|
6482
|
+
"search"
|
|
6483
|
+
]
|
|
6484
|
+
},
|
|
6485
|
+
"tag": "combobox-ui",
|
|
6486
|
+
"tokens": {
|
|
6487
|
+
"--combobox-bg": {
|
|
6488
|
+
"description": "Input background color"
|
|
6489
|
+
},
|
|
6490
|
+
"--combobox-fg": {
|
|
6491
|
+
"description": "Input text color"
|
|
6492
|
+
},
|
|
6493
|
+
"--combobox-match-bg": {
|
|
6494
|
+
"description": "Background for `<mark>` spans that highlight matched substrings"
|
|
6495
|
+
},
|
|
6496
|
+
"--combobox-option-bg-active": {
|
|
6497
|
+
"description": "Background for the currently active (arrow-navigated) option"
|
|
6498
|
+
},
|
|
6499
|
+
"--combobox-option-bg-selected": {
|
|
6500
|
+
"description": "Background for the currently committed option"
|
|
6501
|
+
},
|
|
6502
|
+
"--combobox-option-fg-active": {
|
|
6503
|
+
"description": "Foreground for the currently active option"
|
|
6504
|
+
},
|
|
6505
|
+
"--combobox-popover-bg": {
|
|
6506
|
+
"description": "Popover background color"
|
|
6507
|
+
},
|
|
6508
|
+
"--combobox-popover-border": {
|
|
6509
|
+
"description": "Popover border color"
|
|
6510
|
+
},
|
|
6511
|
+
"--combobox-popover-radius": {
|
|
6512
|
+
"description": "Popover border radius"
|
|
6513
|
+
},
|
|
6514
|
+
"--combobox-popover-shadow": {
|
|
6515
|
+
"description": "Popover elevation shadow"
|
|
6516
|
+
},
|
|
6517
|
+
"--combobox-radius": {
|
|
6518
|
+
"description": "Input border radius"
|
|
6519
|
+
}
|
|
6520
|
+
},
|
|
6521
|
+
"traits": [],
|
|
6522
|
+
"version": 1
|
|
6523
|
+
}
|
|
6524
|
+
},
|
|
6525
|
+
"Command": {
|
|
6526
|
+
"title": "Command",
|
|
6527
|
+
"description": "Searchable command palette primitive — combobox-style search input\nplus a scrollable list of <option value> items grouped by\n<optgroup label>. Content-only; does NOT own the dialog or the\nCmd+K shortcut. For canonical Cmd+K palettes wrap in <admin-command>\nat the shell tier, which provides the native <dialog> + focus\nmanagement + cross-platform Cmd+K listener. Distinct from <menu-ui>\n(small popover action menu, not searchable) and <modal-ui> (generic\ncentered dialog).\n",
|
|
6528
|
+
"type": "object",
|
|
6529
|
+
"allOf": [
|
|
6530
|
+
{
|
|
6531
|
+
"$ref": "#/$defs/ComponentCommon"
|
|
6532
|
+
},
|
|
6533
|
+
{
|
|
6534
|
+
"$ref": "#/$defs/CatalogComponentCommon"
|
|
6535
|
+
}
|
|
6536
|
+
],
|
|
6537
|
+
"properties": {
|
|
6538
|
+
"component": {
|
|
6539
|
+
"const": "Command"
|
|
6540
|
+
},
|
|
6541
|
+
"open": {
|
|
6542
|
+
"description": "Whether the command palette is visible",
|
|
6543
|
+
"type": "boolean",
|
|
6544
|
+
"default": false
|
|
6545
|
+
},
|
|
6546
|
+
"placeholder": {
|
|
6547
|
+
"description": "Placeholder text for the search input",
|
|
6548
|
+
"type": "string",
|
|
6549
|
+
"default": "Type a command..."
|
|
6550
|
+
}
|
|
6551
|
+
},
|
|
6552
|
+
"required": [
|
|
6553
|
+
"component"
|
|
6554
|
+
],
|
|
6555
|
+
"unevaluatedProperties": false,
|
|
6556
|
+
"x-adiaui": {
|
|
6557
|
+
"anti_patterns": [],
|
|
6558
|
+
"category": "container",
|
|
6559
|
+
"composes": [],
|
|
6560
|
+
"events": {
|
|
6561
|
+
"dismiss": {
|
|
6562
|
+
"description": "Fired when Escape is pressed"
|
|
6563
|
+
},
|
|
6564
|
+
"select": {
|
|
6565
|
+
"description": "Fired when an item is selected. detail: { value, label, category }. `category` is the parent `<optgroup label=\"…\">` label, or empty string when the item is a direct child of `<command-ui>` with no group.\n",
|
|
6566
|
+
"detail": {
|
|
6567
|
+
"category": {
|
|
6568
|
+
"description": "Parent optgroup label (empty string when item has no group).",
|
|
6569
|
+
"type": "string"
|
|
6570
|
+
},
|
|
6571
|
+
"label": {
|
|
6572
|
+
"description": "Item label text.",
|
|
6573
|
+
"type": "string"
|
|
6574
|
+
},
|
|
6575
|
+
"value": {
|
|
6576
|
+
"description": "Item value attribute.",
|
|
6577
|
+
"type": "string"
|
|
6578
|
+
}
|
|
6579
|
+
}
|
|
6580
|
+
}
|
|
6581
|
+
},
|
|
6582
|
+
"examples": [
|
|
6583
|
+
{
|
|
6584
|
+
"description": "Basic Command usage",
|
|
6585
|
+
"a2ui": "[\n {\n \"id\": \"root\",\n \"component\": \"Card\",\n \"children\": [\n \"sec\"\n ]\n },\n {\n \"id\": \"sec\",\n \"component\": \"Section\",\n \"children\": [\n \"comp\"\n ]\n },\n {\n \"id\": \"comp\",\n \"component\": \"Command\",\n \"placeholder\": \"Enter command...\"\n }\n]",
|
|
6586
|
+
"name": "basic-command"
|
|
6587
|
+
}
|
|
6588
|
+
],
|
|
6589
|
+
"keywords": [
|
|
6590
|
+
"command",
|
|
6591
|
+
"assistant",
|
|
6592
|
+
"copilot",
|
|
6593
|
+
"ai",
|
|
6594
|
+
"prompt",
|
|
6595
|
+
"console",
|
|
6596
|
+
"menu",
|
|
6597
|
+
"terminal",
|
|
6598
|
+
"search",
|
|
6599
|
+
"find",
|
|
6600
|
+
"lookup",
|
|
6601
|
+
"autocomplete",
|
|
6602
|
+
"typeahead",
|
|
6603
|
+
"spotlight",
|
|
6604
|
+
"omnibar",
|
|
6605
|
+
"combobox",
|
|
6606
|
+
"palette",
|
|
6607
|
+
"shortcut",
|
|
6608
|
+
"hotkey",
|
|
6609
|
+
"keyboard",
|
|
6610
|
+
"keybinding"
|
|
6611
|
+
],
|
|
6612
|
+
"name": "UICommand",
|
|
6613
|
+
"related": [
|
|
6614
|
+
"AdminCommand",
|
|
6615
|
+
"Menu",
|
|
6616
|
+
"Modal",
|
|
6617
|
+
"Search"
|
|
6618
|
+
],
|
|
6619
|
+
"slots": {
|
|
6620
|
+
"empty": {
|
|
6621
|
+
"description": "Empty state shown when no items match"
|
|
6622
|
+
},
|
|
6623
|
+
"footer": {
|
|
6624
|
+
"description": "Keyboard hint bar"
|
|
6625
|
+
},
|
|
6626
|
+
"list": {
|
|
6627
|
+
"description": "Container for command items and groups"
|
|
6628
|
+
},
|
|
6629
|
+
"search": {
|
|
6630
|
+
"description": "Search input with combobox role"
|
|
6631
|
+
}
|
|
6632
|
+
},
|
|
6633
|
+
"states": [
|
|
6634
|
+
{
|
|
6635
|
+
"description": "Default, ready for interaction.",
|
|
6636
|
+
"name": "idle"
|
|
6637
|
+
}
|
|
6638
|
+
],
|
|
6639
|
+
"status": "stable",
|
|
6640
|
+
"synonyms": {
|
|
6641
|
+
"ai": [
|
|
6642
|
+
"chat",
|
|
6643
|
+
"streaming",
|
|
6644
|
+
"response",
|
|
6645
|
+
"command"
|
|
6646
|
+
],
|
|
6647
|
+
"assistant": [
|
|
6648
|
+
"chat",
|
|
6649
|
+
"streaming",
|
|
6650
|
+
"response",
|
|
6651
|
+
"command"
|
|
6652
|
+
],
|
|
6653
|
+
"autocomplete": [
|
|
6654
|
+
"search",
|
|
6655
|
+
"command",
|
|
6656
|
+
"palette",
|
|
6657
|
+
"tag"
|
|
6658
|
+
],
|
|
6659
|
+
"combobox": [
|
|
6660
|
+
"search",
|
|
6661
|
+
"command",
|
|
6662
|
+
"select"
|
|
6663
|
+
],
|
|
6664
|
+
"command": [
|
|
6665
|
+
"command",
|
|
6666
|
+
"palette",
|
|
6667
|
+
"kbd",
|
|
6668
|
+
"shortcut"
|
|
6669
|
+
],
|
|
6670
|
+
"console": [
|
|
6671
|
+
"dashboard",
|
|
6672
|
+
"table",
|
|
6673
|
+
"data",
|
|
6674
|
+
"sidebar",
|
|
6675
|
+
"command"
|
|
6676
|
+
],
|
|
6677
|
+
"copilot": [
|
|
6678
|
+
"chat",
|
|
6679
|
+
"streaming",
|
|
6680
|
+
"response",
|
|
6681
|
+
"command"
|
|
6682
|
+
],
|
|
6683
|
+
"find": [
|
|
6684
|
+
"search",
|
|
6685
|
+
"filter",
|
|
6686
|
+
"command"
|
|
6687
|
+
],
|
|
6688
|
+
"hotkey": [
|
|
6689
|
+
"kbd",
|
|
6690
|
+
"shortcut",
|
|
6691
|
+
"command"
|
|
6692
|
+
],
|
|
6693
|
+
"keybinding": [
|
|
6694
|
+
"kbd",
|
|
6695
|
+
"shortcut",
|
|
6696
|
+
"command"
|
|
6697
|
+
],
|
|
6698
|
+
"keyboard": [
|
|
6699
|
+
"kbd",
|
|
6700
|
+
"shortcut",
|
|
6701
|
+
"command"
|
|
6702
|
+
],
|
|
6703
|
+
"lookup": [
|
|
6704
|
+
"search",
|
|
6705
|
+
"filter",
|
|
6706
|
+
"command"
|
|
6707
|
+
],
|
|
6708
|
+
"menu": [
|
|
6709
|
+
"nav",
|
|
6710
|
+
"sidebar",
|
|
6711
|
+
"popover",
|
|
6712
|
+
"menu",
|
|
6713
|
+
"command"
|
|
6714
|
+
],
|
|
6715
|
+
"omnibar": [
|
|
6716
|
+
"command",
|
|
6717
|
+
"palette",
|
|
6718
|
+
"search"
|
|
6719
|
+
],
|
|
6720
|
+
"palette": [
|
|
6721
|
+
"color",
|
|
6722
|
+
"picker",
|
|
6723
|
+
"command",
|
|
6724
|
+
"palette"
|
|
6725
|
+
],
|
|
6726
|
+
"prompt": [
|
|
6727
|
+
"chat",
|
|
6728
|
+
"streaming",
|
|
6729
|
+
"command",
|
|
6730
|
+
"palette"
|
|
6731
|
+
],
|
|
6732
|
+
"search": [
|
|
6733
|
+
"search",
|
|
6734
|
+
"filter",
|
|
6735
|
+
"command",
|
|
6736
|
+
"palette"
|
|
6737
|
+
],
|
|
6738
|
+
"shortcut": [
|
|
6739
|
+
"kbd",
|
|
6740
|
+
"shortcut",
|
|
6741
|
+
"command"
|
|
6742
|
+
],
|
|
6743
|
+
"spotlight": [
|
|
6744
|
+
"command",
|
|
6745
|
+
"palette",
|
|
6746
|
+
"search"
|
|
6747
|
+
],
|
|
6748
|
+
"tags": [
|
|
6749
|
+
"CommandPalette"
|
|
6750
|
+
],
|
|
6751
|
+
"terminal": [
|
|
6752
|
+
"code",
|
|
6753
|
+
"block",
|
|
6754
|
+
"command"
|
|
6755
|
+
],
|
|
6756
|
+
"typeahead": [
|
|
6757
|
+
"search",
|
|
6758
|
+
"command",
|
|
6759
|
+
"palette"
|
|
6760
|
+
]
|
|
6761
|
+
},
|
|
6762
|
+
"tag": "command-ui",
|
|
6763
|
+
"tokens": {},
|
|
6764
|
+
"traits": [],
|
|
6765
|
+
"version": 1
|
|
6766
|
+
}
|
|
6767
|
+
},
|
|
6768
|
+
"ConfirmDialog": {
|
|
6769
|
+
"title": "ConfirmDialog",
|
|
6770
|
+
"description": "Non-destructive yes/no confirmation dialog — a thin composite over\n<modal-ui> that pre-stamps the canonical confirm shape: header (title\n+ optional icon), body (description + optional rich slot), and\nfooter (cancel + confirm buttons). Wires Cancel-default focus,\nconfirm / cancel / close events, and the [loading] in-flight state.\n\nUse confirm-dialog-ui for benign questions: \"Save changes?\", \"Switch\ntheme?\", \"Apply preset?\". For irreversible destructive operations\n(delete account, drop database, deploy to prod) use <alert-dialog-ui>\ninstead — it carries role=\"alertdialog\", danger chrome, and the\noptional typed-name speed-bump.\n\nComposed primitive: <modal-ui> owns the native <dialog>, focus trap,\nbackdrop, and Escape-dismiss. confirm-dialog-ui decorates; it does\nnot reimplement.\n\nSpec: docs/specs/implementation-ready/SPEC-049-confirm-dialog-yes-no.md.\n",
|
|
6771
|
+
"type": "object",
|
|
6772
|
+
"allOf": [
|
|
6773
|
+
{
|
|
6774
|
+
"$ref": "#/$defs/ComponentCommon"
|
|
6775
|
+
},
|
|
6776
|
+
{
|
|
6777
|
+
"$ref": "#/$defs/CatalogComponentCommon"
|
|
6778
|
+
}
|
|
6779
|
+
],
|
|
6780
|
+
"properties": {
|
|
6781
|
+
"title": {
|
|
6782
|
+
"description": "Dialog title; rendered in the modal header via <modal-ui>[text]\nand announced through aria-labelledby on the inner <dialog>.\n",
|
|
6783
|
+
"type": "string",
|
|
6784
|
+
"default": ""
|
|
6785
|
+
},
|
|
6786
|
+
"description": {
|
|
6787
|
+
"description": "Body description; rendered as a paragraph above any default-slot\ncontent. Wired as the aria-describedby target.\n",
|
|
6788
|
+
"type": "string",
|
|
6789
|
+
"default": ""
|
|
6790
|
+
},
|
|
6791
|
+
"cancel-text": {
|
|
6792
|
+
"description": "Cancel button label. Defaults to \"Cancel\".",
|
|
6793
|
+
"type": "string",
|
|
6794
|
+
"default": "Cancel"
|
|
6795
|
+
},
|
|
6796
|
+
"component": {
|
|
6797
|
+
"const": "ConfirmDialog"
|
|
6798
|
+
},
|
|
6799
|
+
"confirm-text": {
|
|
6800
|
+
"description": "Primary action button label. Defaults to \"Confirm\".",
|
|
6801
|
+
"type": "string",
|
|
6802
|
+
"default": "Confirm"
|
|
6803
|
+
},
|
|
6804
|
+
"confirm-variant": {
|
|
6805
|
+
"description": "Tone of the confirm button. \"primary\" (default) for the typical\naffirmative-action case; \"ghost\" when both choices are roughly\nbalanced and a tonal primary would over-weight the affirmative.\n",
|
|
6806
|
+
"type": "string",
|
|
6807
|
+
"enum": [
|
|
6808
|
+
"primary",
|
|
6809
|
+
"ghost"
|
|
6810
|
+
],
|
|
6811
|
+
"default": "primary"
|
|
6812
|
+
},
|
|
6813
|
+
"icon": {
|
|
6814
|
+
"description": "Optional Phosphor icon glyph stamped in the header. Opt-in —\nconsumer supplies the name (e.g. \"info\", \"question\"). When\nempty, no icon disc renders.\n",
|
|
6815
|
+
"type": "string",
|
|
6816
|
+
"default": ""
|
|
6817
|
+
},
|
|
6818
|
+
"loading": {
|
|
6819
|
+
"description": "In-flight state. When set, both buttons disable and the confirm\nbutton shows a spinner — the consumer toggles [loading] off and\ncloses via [open]=false when the underlying action resolves.\n",
|
|
6820
|
+
"type": "boolean",
|
|
6821
|
+
"default": false
|
|
6822
|
+
},
|
|
6823
|
+
"open": {
|
|
6824
|
+
"description": "Mirrors <modal-ui>[open]. Setting to true opens the dialog with\nentry animation; setting to false animates close.\n",
|
|
6825
|
+
"type": "boolean",
|
|
6826
|
+
"default": false
|
|
6827
|
+
},
|
|
6828
|
+
"size": {
|
|
6829
|
+
"description": "Forwarded to <modal-ui>[size]. sm = ~24rem, md = ~32rem,\nlg = ~48rem. Confirm dialogs default to sm.\n",
|
|
6830
|
+
"type": "string",
|
|
6831
|
+
"enum": [
|
|
6832
|
+
"sm",
|
|
6833
|
+
"md",
|
|
6834
|
+
"lg"
|
|
6835
|
+
],
|
|
6836
|
+
"default": "sm"
|
|
6837
|
+
}
|
|
6838
|
+
},
|
|
6839
|
+
"required": [
|
|
6840
|
+
"component"
|
|
6841
|
+
],
|
|
6842
|
+
"unevaluatedProperties": false,
|
|
6843
|
+
"x-adiaui": {
|
|
6844
|
+
"anti_patterns": [
|
|
6845
|
+
{
|
|
6846
|
+
"description": "Re-deriving the confirm shape from a raw <modal-ui> instead of using ConfirmDialog. The header/body/footer triplet, the Cancel-default focus, and the confirm/cancel event wiring all need to be re-authored, and the WAI-APG contract drifts per consumer.",
|
|
6847
|
+
"right": "<confirm-dialog-ui open\n title=\"Save changes?\"\n description=\"Save changes before closing?\"\n confirm-text=\"Save\"\n cancel-text=\"Discard\">\n</confirm-dialog-ui>\n",
|
|
6848
|
+
"rule": "Reach for ConfirmDialog (not raw Modal) for non-destructive yes/no prompts. The composite owns the contract.",
|
|
6849
|
+
"wrong": "<modal-ui open size=\"sm\" text=\"Save?\">\n <p>Save changes before closing?</p>\n <footer>\n <button-ui variant=\"ghost\" text=\"Discard\"></button-ui>\n <button-ui variant=\"primary\" text=\"Save\"></button-ui>\n </footer>\n</modal-ui>\n"
|
|
6850
|
+
},
|
|
6851
|
+
{
|
|
6852
|
+
"description": "Using ConfirmDialog for destructive irreversible operations. The primary-toned confirm button reads as benign and primes the user to click through; the WAI-APG `alertdialog` role + danger chrome live in AlertDialog for that reason.",
|
|
6853
|
+
"right": "<alert-dialog-ui open\n title=\"Delete project?\"\n description=\"This is permanent.\"\n confirm-text=\"Delete\">\n</alert-dialog-ui>\n",
|
|
6854
|
+
"rule": "Destructive intent → AlertDialog. Non-destructive intent → ConfirmDialog. The tag name carries the semantic; do not cross the streams.",
|
|
6855
|
+
"wrong": "<confirm-dialog-ui open\n title=\"Delete project?\"\n description=\"This is permanent.\"\n confirm-text=\"Delete\">\n</confirm-dialog-ui>\n"
|
|
6856
|
+
}
|
|
6857
|
+
],
|
|
6858
|
+
"category": "feedback",
|
|
6859
|
+
"composes": [
|
|
6860
|
+
"modal-ui",
|
|
6861
|
+
"button-ui",
|
|
6862
|
+
"icon-ui",
|
|
6863
|
+
"text-ui"
|
|
6864
|
+
],
|
|
6865
|
+
"events": {
|
|
6866
|
+
"cancel": {
|
|
6867
|
+
"description": "Fired when the user activates the cancel button, presses Escape,\nor clicks the backdrop. Bubbles.\n",
|
|
6868
|
+
"detail": {}
|
|
6869
|
+
},
|
|
6870
|
+
"close": {
|
|
6871
|
+
"description": "Re-emitted from the underlying <modal-ui> when the dialog\nfinishes closing via any path. Bubbles.\n",
|
|
6872
|
+
"detail": {}
|
|
6873
|
+
},
|
|
6874
|
+
"confirm": {
|
|
6875
|
+
"description": "Fired when the user activates the confirm button. Bubbles.\nConsumer wires the actual action handler off this event.\n",
|
|
6876
|
+
"detail": {}
|
|
6877
|
+
}
|
|
6878
|
+
},
|
|
6879
|
+
"examples": [],
|
|
6880
|
+
"keywords": [
|
|
6881
|
+
"confirm",
|
|
6882
|
+
"confirm-dialog",
|
|
6883
|
+
"dialog",
|
|
6884
|
+
"confirmation",
|
|
6885
|
+
"yes-no",
|
|
6886
|
+
"ok-cancel",
|
|
6887
|
+
"save-confirm",
|
|
6888
|
+
"prompt",
|
|
6889
|
+
"dialog-modal"
|
|
6890
|
+
],
|
|
6891
|
+
"name": "ConfirmDialog",
|
|
6892
|
+
"related": [
|
|
6893
|
+
"Modal",
|
|
6894
|
+
"AlertDialog",
|
|
6895
|
+
"Button",
|
|
6896
|
+
"Icon",
|
|
6897
|
+
"Text"
|
|
6898
|
+
],
|
|
6899
|
+
"slots": {
|
|
6900
|
+
"default": {
|
|
6901
|
+
"description": "Optional rich content rendered above the description — supplementary\nlists, hints, or markup the [description] string can't carry.\n"
|
|
6902
|
+
},
|
|
6903
|
+
"icon": {
|
|
6904
|
+
"description": "Override the [icon] glyph with a custom node (e.g. a colored\n<icon-ui>, an image, or arbitrary markup). Mutually exclusive\nwith [icon]; if a slot child is present, the [icon] attribute\nis ignored.\n"
|
|
6905
|
+
}
|
|
6906
|
+
},
|
|
6907
|
+
"states": [
|
|
6908
|
+
{
|
|
6909
|
+
"description": "Default — closed, no <dialog> in the top layer.",
|
|
6910
|
+
"name": "idle"
|
|
6911
|
+
},
|
|
6912
|
+
{
|
|
6913
|
+
"description": "Visible in the top layer; focus trapped; Cancel focused by default.",
|
|
6914
|
+
"attribute": "open",
|
|
6915
|
+
"name": "open"
|
|
6916
|
+
},
|
|
6917
|
+
{
|
|
6918
|
+
"description": "Both buttons disabled; confirm shows spinner.",
|
|
6919
|
+
"attribute": "loading",
|
|
6920
|
+
"name": "loading"
|
|
6921
|
+
}
|
|
6922
|
+
],
|
|
6923
|
+
"status": "stable",
|
|
6924
|
+
"synonyms": {
|
|
6925
|
+
"cancel": [
|
|
6926
|
+
"dismiss",
|
|
6927
|
+
"back",
|
|
6928
|
+
"no"
|
|
6929
|
+
],
|
|
6930
|
+
"confirm": [
|
|
6931
|
+
"confirmation",
|
|
6932
|
+
"prompt",
|
|
6933
|
+
"ok",
|
|
6934
|
+
"yes"
|
|
6935
|
+
],
|
|
6936
|
+
"dialog": [
|
|
6937
|
+
"modal",
|
|
6938
|
+
"popup"
|
|
6939
|
+
]
|
|
6940
|
+
},
|
|
6941
|
+
"tag": "confirm-dialog-ui",
|
|
6942
|
+
"tokens": {
|
|
6943
|
+
"--confirm-dialog-confirm-bg": {
|
|
6944
|
+
"description": "Confirm-button background under [confirm-variant=\"primary\"].\nDefaults to var(--a-accent-bg). When [confirm-variant=\"ghost\"]\nthe button uses transparent background regardless of this token.\n"
|
|
6945
|
+
},
|
|
6946
|
+
"--confirm-dialog-icon-bg": {
|
|
6947
|
+
"description": "Optional header-icon disc background. Defaults to var(--a-bg-muted)."
|
|
6948
|
+
},
|
|
6949
|
+
"--confirm-dialog-icon-fg": {
|
|
6950
|
+
"description": "Optional header-icon glyph color. Defaults to var(--a-fg)."
|
|
6951
|
+
}
|
|
6952
|
+
},
|
|
6953
|
+
"traits": [],
|
|
6954
|
+
"version": 1
|
|
6955
|
+
}
|
|
6956
|
+
},
|
|
6957
|
+
"DateRangePicker": {
|
|
6958
|
+
"title": "DateRangePicker",
|
|
6959
|
+
"description": "Compound form primitive for selecting a start + end date pair with optional named preset shortcuts (\"Today\", \"Last 7 days\", \"This month\", ...). Default presentation is a trigger button showing the formatted range; on activation a popover opens with two synchronized calendar panes + a preset side rail. Composes <calendar-picker-ui> twice; emits {from, to} ISO 8601 dates. Optional comparison-range mode emits a secondary range for analytics surfaces.",
|
|
6960
|
+
"type": "object",
|
|
6961
|
+
"allOf": [
|
|
6962
|
+
{
|
|
6963
|
+
"$ref": "#/$defs/ComponentCommon"
|
|
6964
|
+
},
|
|
6965
|
+
{
|
|
6966
|
+
"$ref": "#/$defs/CatalogComponentCommon"
|
|
6967
|
+
}
|
|
6968
|
+
],
|
|
6969
|
+
"properties": {
|
|
6970
|
+
"required": {
|
|
6971
|
+
"description": "Required for validation when inside a `<form>`.",
|
|
6972
|
+
"type": "boolean",
|
|
6973
|
+
"default": false
|
|
6974
|
+
},
|
|
6975
|
+
"compareValue": {
|
|
6976
|
+
"description": "Comparison range when `[comparison]` is set. Same `{from, to}` shape as `value`.",
|
|
6977
|
+
"$ref": "#/$defs/DynamicString"
|
|
6978
|
+
},
|
|
6979
|
+
"comparison": {
|
|
6980
|
+
"description": "Enable comparison-range mode. Renders a second preset cluster and emits a secondary range under `<name>-compare`.",
|
|
6981
|
+
"type": "boolean",
|
|
6982
|
+
"default": false
|
|
6983
|
+
},
|
|
6984
|
+
"component": {
|
|
6985
|
+
"const": "DateRangePicker"
|
|
6986
|
+
},
|
|
6987
|
+
"disabled": {
|
|
6988
|
+
"description": "Block all interaction. Trigger remains rendered but does not open the popover.",
|
|
6989
|
+
"type": "boolean",
|
|
6990
|
+
"default": false
|
|
6991
|
+
},
|
|
6992
|
+
"format": {
|
|
6993
|
+
"description": "Trigger button date format. `short`: `Jan 1, 2026`; `long`: `January 1, 2026`; `iso`: `2026-01-01`.",
|
|
6994
|
+
"type": "string",
|
|
6995
|
+
"enum": [
|
|
6996
|
+
"short",
|
|
6997
|
+
"long",
|
|
6998
|
+
"iso"
|
|
6999
|
+
],
|
|
7000
|
+
"default": "short"
|
|
7001
|
+
},
|
|
7002
|
+
"max": {
|
|
7003
|
+
"description": "Latest selectable ISO date (inclusive). Days after are disabled in both panes.",
|
|
7004
|
+
"type": "string",
|
|
7005
|
+
"default": ""
|
|
7006
|
+
},
|
|
7007
|
+
"min": {
|
|
7008
|
+
"description": "Earliest selectable ISO date (inclusive). Days before are disabled in both panes.",
|
|
7009
|
+
"type": "string",
|
|
7010
|
+
"default": ""
|
|
7011
|
+
},
|
|
7012
|
+
"name": {
|
|
7013
|
+
"description": "Form field name for form data submission. The selected range serializes as JSON `{\"from\":\"...\",\"to\":\"...\"}` under this key.",
|
|
7014
|
+
"type": "string",
|
|
7015
|
+
"default": ""
|
|
7016
|
+
},
|
|
7017
|
+
"noPresets": {
|
|
7018
|
+
"description": "Hide the preset side rail.",
|
|
7019
|
+
"type": "boolean",
|
|
7020
|
+
"default": false
|
|
7021
|
+
},
|
|
7022
|
+
"open": {
|
|
7023
|
+
"description": "Whether the popover is currently open.",
|
|
7024
|
+
"type": "boolean",
|
|
7025
|
+
"default": false
|
|
7026
|
+
},
|
|
7027
|
+
"placeholder": {
|
|
7028
|
+
"description": "Text shown in the trigger when the value is empty.",
|
|
7029
|
+
"type": "string",
|
|
7030
|
+
"default": "Select range"
|
|
7031
|
+
},
|
|
7032
|
+
"readonly": {
|
|
7033
|
+
"description": "Block edits; allow keyboard navigation for screen-reader inspection.",
|
|
7034
|
+
"type": "boolean",
|
|
7035
|
+
"default": false
|
|
7036
|
+
},
|
|
7037
|
+
"value": {
|
|
7038
|
+
"description": "Selected range as `{from, to}` ISO 8601 dates. Null when empty. Emitted on commit.",
|
|
7039
|
+
"$ref": "#/$defs/DynamicString"
|
|
7040
|
+
}
|
|
7041
|
+
},
|
|
7042
|
+
"required": [
|
|
7043
|
+
"component"
|
|
7044
|
+
],
|
|
7045
|
+
"unevaluatedProperties": false,
|
|
7046
|
+
"x-adiaui": {
|
|
7047
|
+
"anti_patterns": [
|
|
7048
|
+
{
|
|
7049
|
+
"fix": "{\"component\": \"DateRangePicker\", \"value\": {\"from\": \"2026-01-01\", \"to\": \"2026-01-31\"}}\n",
|
|
7050
|
+
"why": "`value` is a string, not an object. The contract is `{from, to}` ISO 8601 dates.\n",
|
|
7051
|
+
"wrong": "{\"component\": \"DateRangePicker\", \"value\": \"2026-01-01 to 2026-01-31\"}\n"
|
|
7052
|
+
},
|
|
7053
|
+
{
|
|
7054
|
+
"fix": "{\"component\": \"DateRangePicker\", \"value\": {\"from\": \"2026-01-01\", \"to\": \"2026-12-31\"}}\n",
|
|
7055
|
+
"why": "Reversed range — `to < from`. This fires `invalid` and never commits.\n",
|
|
7056
|
+
"wrong": "{\"component\": \"DateRangePicker\", \"value\": {\"from\": \"2026-12-31\", \"to\": \"2026-01-01\"}}\n"
|
|
7057
|
+
},
|
|
7058
|
+
{
|
|
7059
|
+
"fix": "Use <date-range-picker-ui>.\n",
|
|
7060
|
+
"why": "This is the pattern the primitive replaces. Reinvents linked-pane behavior,\nmisses preset rail, has no a11y range-announcement.\n",
|
|
7061
|
+
"wrong": "Two adjacent <calendar-picker-ui> instances + JS synchronization.\n"
|
|
7062
|
+
}
|
|
7063
|
+
],
|
|
7064
|
+
"category": "input",
|
|
7065
|
+
"composes": [
|
|
7066
|
+
"calendar-grid-ui",
|
|
7067
|
+
"button-ui",
|
|
7068
|
+
"popover-ui",
|
|
7069
|
+
"text-ui",
|
|
7070
|
+
"divider-ui"
|
|
7071
|
+
],
|
|
7072
|
+
"events": {
|
|
7073
|
+
"change": {
|
|
7074
|
+
"description": "Fired when the range commits (both `from` AND `to` selected, OR a preset clicked).",
|
|
7075
|
+
"detail": {
|
|
7076
|
+
"compareValue": "object",
|
|
7077
|
+
"presetLabel": "string",
|
|
7078
|
+
"value": "object"
|
|
7079
|
+
}
|
|
7080
|
+
},
|
|
7081
|
+
"close": {
|
|
7082
|
+
"description": "Popover closed (without commit, or after commit).",
|
|
7083
|
+
"detail": {
|
|
7084
|
+
"reason": "string"
|
|
7085
|
+
}
|
|
7086
|
+
},
|
|
7087
|
+
"input": {
|
|
7088
|
+
"description": "Fired during selection — e.g. user clicked `from` but has not yet picked `to`.",
|
|
7089
|
+
"detail": {
|
|
7090
|
+
"value": "object"
|
|
7091
|
+
}
|
|
7092
|
+
},
|
|
7093
|
+
"invalid": {
|
|
7094
|
+
"description": "A constraint failed (out of range, end < start).",
|
|
7095
|
+
"detail": {
|
|
7096
|
+
"reason": "string",
|
|
7097
|
+
"value": "object"
|
|
7098
|
+
}
|
|
7099
|
+
},
|
|
7100
|
+
"open": {
|
|
7101
|
+
"description": "Popover opened (user clicked the trigger or pressed Enter / Space).",
|
|
7102
|
+
"detail": {
|
|
7103
|
+
"trigger": "string"
|
|
7104
|
+
}
|
|
7105
|
+
}
|
|
7106
|
+
},
|
|
7107
|
+
"examples": [
|
|
7108
|
+
{
|
|
7109
|
+
"description": "Form-field-wrapped picker with default presets.",
|
|
7110
|
+
"a2ui": "[\n {\n \"id\": \"field\",\n \"component\": \"Field\",\n \"label\": \"Report period\",\n \"children\": [\"dr\"]\n },\n {\n \"id\": \"dr\",\n \"component\": \"DateRangePicker\",\n \"name\": \"report-period\",\n \"min\": \"2026-01-01\",\n \"max\": \"2026-12-31\"\n }\n]\n",
|
|
7111
|
+
"name": "canonical"
|
|
7112
|
+
},
|
|
7113
|
+
{
|
|
7114
|
+
"description": "Analytics-surface picker with comparison range enabled.",
|
|
7115
|
+
"a2ui": "[\n {\n \"id\": \"dr\",\n \"component\": \"DateRangePicker\",\n \"name\": \"period\",\n \"comparison\": true,\n \"value\": {\"from\": \"2026-05-01\", \"to\": \"2026-05-31\"},\n \"compareValue\": {\"from\": \"2026-04-01\", \"to\": \"2026-04-30\"}\n }\n]\n",
|
|
7116
|
+
"name": "comparison"
|
|
7117
|
+
},
|
|
7118
|
+
{
|
|
7119
|
+
"description": "Custom-only picker with the preset rail hidden.",
|
|
7120
|
+
"a2ui": "[\n {\n \"id\": \"dr\",\n \"component\": \"DateRangePicker\",\n \"name\": \"period\",\n \"noPresets\": true\n }\n]\n",
|
|
7121
|
+
"name": "no-presets"
|
|
7122
|
+
}
|
|
7123
|
+
],
|
|
7124
|
+
"keywords": [
|
|
7125
|
+
"daterangepicker",
|
|
7126
|
+
"date-range-picker",
|
|
7127
|
+
"date-range",
|
|
7128
|
+
"range",
|
|
7129
|
+
"daterange",
|
|
7130
|
+
"period",
|
|
7131
|
+
"reporting-period"
|
|
7132
|
+
],
|
|
7133
|
+
"name": "UIDateRangePicker",
|
|
7134
|
+
"related": [
|
|
7135
|
+
"calendar-picker",
|
|
7136
|
+
"popover",
|
|
7137
|
+
"field",
|
|
7138
|
+
"button"
|
|
7139
|
+
],
|
|
7140
|
+
"slots": {
|
|
7141
|
+
"footer": {
|
|
7142
|
+
"description": "Optional footer area below the calendars (e.g., \"Apply\" / \"Cancel\" buttons for explicit-commit flows)."
|
|
7143
|
+
},
|
|
7144
|
+
"presets": {
|
|
7145
|
+
"description": "Custom preset content replacing the default preset rail."
|
|
7146
|
+
},
|
|
7147
|
+
"trigger": {
|
|
7148
|
+
"description": "Custom trigger replacement. When omitted, a default `<button-ui>` is stamped."
|
|
7149
|
+
}
|
|
7150
|
+
},
|
|
7151
|
+
"states": [
|
|
7152
|
+
{
|
|
7153
|
+
"description": "Closed, no pending selection.",
|
|
7154
|
+
"name": "idle"
|
|
7155
|
+
},
|
|
7156
|
+
{
|
|
7157
|
+
"description": "Popover open, user has not yet clicked a start date.",
|
|
7158
|
+
"attribute": "open",
|
|
7159
|
+
"name": "open-pending-from"
|
|
7160
|
+
},
|
|
7161
|
+
{
|
|
7162
|
+
"description": "Start clicked, awaiting end click; hover preview active.",
|
|
7163
|
+
"attribute": "open",
|
|
7164
|
+
"name": "open-pending-to"
|
|
7165
|
+
},
|
|
7166
|
+
{
|
|
7167
|
+
"description": "Both ends clicked, awaiting Apply (only in explicit-commit mode with `footer` slot).",
|
|
7168
|
+
"attribute": "open",
|
|
7169
|
+
"name": "open-committed"
|
|
7170
|
+
},
|
|
7171
|
+
{
|
|
7172
|
+
"description": "Non-interactive; dimmed.",
|
|
7173
|
+
"attribute": "disabled",
|
|
7174
|
+
"name": "disabled"
|
|
7175
|
+
},
|
|
7176
|
+
{
|
|
7177
|
+
"description": "Read-only; trigger keyboard-focusable but popover does not open.",
|
|
7178
|
+
"attribute": "readonly",
|
|
7179
|
+
"name": "readonly"
|
|
7180
|
+
}
|
|
7181
|
+
],
|
|
7182
|
+
"status": "experimental",
|
|
7183
|
+
"synonyms": {
|
|
7184
|
+
"period": [
|
|
7185
|
+
"date-range",
|
|
7186
|
+
"range",
|
|
7187
|
+
"reporting-period"
|
|
7188
|
+
],
|
|
7189
|
+
"range": [
|
|
7190
|
+
"date-range",
|
|
7191
|
+
"period",
|
|
7192
|
+
"report-period"
|
|
7193
|
+
],
|
|
7194
|
+
"tags": [
|
|
7195
|
+
"DateRangePicker",
|
|
7196
|
+
"DateRange",
|
|
7197
|
+
"DateRangeInput"
|
|
7198
|
+
]
|
|
7199
|
+
},
|
|
7200
|
+
"tag": "date-range-picker-ui",
|
|
7201
|
+
"tokens": {
|
|
7202
|
+
"--date-range-picker-bg": {
|
|
7203
|
+
"description": "Host background.",
|
|
7204
|
+
"default": "var(--a-bg)"
|
|
7205
|
+
},
|
|
7206
|
+
"--date-range-picker-popover-bg": {
|
|
7207
|
+
"description": "Popover background.",
|
|
7208
|
+
"default": "var(--a-bg-subtle)"
|
|
7209
|
+
},
|
|
7210
|
+
"--date-range-picker-popover-border": {
|
|
7211
|
+
"description": "Popover border color.",
|
|
7212
|
+
"default": "var(--a-border-subtle)"
|
|
7213
|
+
},
|
|
7214
|
+
"--date-range-picker-popover-radius": {
|
|
7215
|
+
"description": "Popover border radius.",
|
|
7216
|
+
"default": "var(--a-radius-lg)"
|
|
7217
|
+
},
|
|
7218
|
+
"--date-range-picker-popover-shadow": {
|
|
7219
|
+
"description": "Popover box shadow.",
|
|
7220
|
+
"default": "var(--a-shadow-lg)"
|
|
7221
|
+
},
|
|
7222
|
+
"--date-range-picker-preset-bg": {
|
|
7223
|
+
"description": "Preset row background (idle).",
|
|
7224
|
+
"default": "transparent"
|
|
7225
|
+
},
|
|
7226
|
+
"--date-range-picker-preset-bg-hover": {
|
|
7227
|
+
"description": "Preset row background on hover.",
|
|
7228
|
+
"default": "var(--a-bg-hover)"
|
|
7229
|
+
},
|
|
7230
|
+
"--date-range-picker-preview-bg": {
|
|
7231
|
+
"description": "In-range preview background (between from and pending to).",
|
|
7232
|
+
"default": "var(--a-accent-muted)"
|
|
7233
|
+
},
|
|
7234
|
+
"--date-range-picker-px": {
|
|
7235
|
+
"description": "Horizontal popover padding.",
|
|
7236
|
+
"default": "var(--a-space-3)"
|
|
7237
|
+
},
|
|
7238
|
+
"--date-range-picker-py": {
|
|
7239
|
+
"description": "Vertical popover padding.",
|
|
7240
|
+
"default": "var(--a-space-2)"
|
|
7241
|
+
},
|
|
7242
|
+
"--date-range-picker-selected-bg": {
|
|
7243
|
+
"description": "Selected day-cell background (cascaded into the inner calendar via --calendar-picker-day-bg-selected).",
|
|
7244
|
+
"default": "var(--a-accent)"
|
|
7245
|
+
},
|
|
7246
|
+
"--date-range-picker-selected-fg": {
|
|
7247
|
+
"description": "Selected day-cell foreground.",
|
|
7248
|
+
"default": "var(--a-accent-fg)"
|
|
7249
|
+
}
|
|
7250
|
+
},
|
|
7251
|
+
"traits": [],
|
|
7252
|
+
"version": 1
|
|
7253
|
+
}
|
|
7254
|
+
},
|
|
7255
|
+
"DateRangeSelector": {
|
|
7256
|
+
"title": "DateRangeSelector",
|
|
7257
|
+
"description": "Page-level \"current time window\" chooser for dashboards. A module-tier\ncomposite that pairs a preset chip-row (Today / 7d / 30d / 90d / QTD /\nYTD / Custom) with an embedded <date-range-picker-ui> and broadcasts\nthe active range to every range-aware panel on the page.\n\nOne chooser, one event bus, every panel follows. The composite owns\nthe range value, resolves preset keys to ISO 8601 from/to pairs, and\nemits a `range-change` CustomEvent on the configured broadcast target\n(default `document`). It also writes `data-range-from` /\n`data-range-to` to that target so CSS-only subscribers can match\nattribute selectors.\n\nUse for dashboard toolbars (typically <dashboard-layout-ui slot=\"toolbar\">\nor <admin-page-header slot=\"action\">). For card-local per-panel\ncomparison overlays, set [broadcast=\"self\"] so the secondary instance\nscopes to its host.\n\nSpec: docs/specs/implementation-ready/SPEC-019-date-range-selector-global.md.\n",
|
|
7258
|
+
"type": "object",
|
|
7259
|
+
"allOf": [
|
|
7260
|
+
{
|
|
7261
|
+
"$ref": "#/$defs/ComponentCommon"
|
|
7262
|
+
},
|
|
7263
|
+
{
|
|
7264
|
+
"$ref": "#/$defs/CatalogComponentCommon"
|
|
7265
|
+
}
|
|
7266
|
+
],
|
|
7267
|
+
"properties": {
|
|
7268
|
+
"aria-label": {
|
|
7269
|
+
"description": "Accessible name for the toolbar group (role=group). Defaults to\n\"Time period\"; override when multiple range selectors sit on the\nsame page (e.g., \"Primary range\" / \"Comparison range\").\n",
|
|
7270
|
+
"type": "string",
|
|
7271
|
+
"default": "Time period"
|
|
7272
|
+
},
|
|
7273
|
+
"broadcast": {
|
|
7274
|
+
"description": "Broadcast scope. `document` fires `range-change` on\n`document.documentElement` AND writes `data-range-from` /\n`data-range-to` there (page-global). `self` fires on the host and\nwrites the same attributes to the host (scoped subscribers).\n`none` suppresses broadcast entirely; only the host-level `change`\nevent fires.\n",
|
|
7275
|
+
"type": "string",
|
|
7276
|
+
"enum": [
|
|
7277
|
+
"document",
|
|
7278
|
+
"self",
|
|
7279
|
+
"none"
|
|
7280
|
+
],
|
|
7281
|
+
"default": "document"
|
|
7282
|
+
},
|
|
7283
|
+
"component": {
|
|
7284
|
+
"const": "DateRangeSelector"
|
|
7285
|
+
},
|
|
7286
|
+
"from": {
|
|
7287
|
+
"description": "Start of the resolved range, ISO-8601 date (YYYY-MM-DD). Read-only\noutput — set by the composite when value resolves or when the\nembedded picker commits a custom range. Consumers read this after\n`range-change`.\n",
|
|
7288
|
+
"$ref": "#/$defs/DynamicString"
|
|
7289
|
+
},
|
|
7290
|
+
"presets": {
|
|
7291
|
+
"description": "Override the preset chip list as a comma-separated subset of the\n`value` enum. Order matters. `custom` is optional but recommended\nas the trailing chip. Unknown keys are ignored at runtime.\n",
|
|
7292
|
+
"type": "string",
|
|
7293
|
+
"default": "today,7d,30d,90d,qtd,ytd,custom"
|
|
7294
|
+
},
|
|
7295
|
+
"to": {
|
|
7296
|
+
"description": "End of the resolved range, ISO-8601 date. Same read-only output\nsemantics as `from`.\n",
|
|
7297
|
+
"$ref": "#/$defs/DynamicString"
|
|
7298
|
+
},
|
|
7299
|
+
"value": {
|
|
7300
|
+
"description": "Active preset key. Drives the chip-row selection and re-resolves\nthe from/to range on change. `custom` defers to the embedded\npicker's value (consumer-supplied from/to).\n",
|
|
7301
|
+
"$ref": "#/$defs/DynamicString"
|
|
7302
|
+
}
|
|
7303
|
+
},
|
|
7304
|
+
"required": [
|
|
7305
|
+
"component"
|
|
7306
|
+
],
|
|
7307
|
+
"unevaluatedProperties": false,
|
|
7308
|
+
"x-adiaui": {
|
|
7309
|
+
"anti_patterns": [
|
|
7310
|
+
{
|
|
7311
|
+
"description": "Two document-broadcasters on the same page. The late mounter wins\nsilently for the data-range-* attributes on <html>, and CSS-only\nsubscribers see flicker as the attributes are rewritten.\n",
|
|
7312
|
+
"right": "<date-range-selector-ui broadcast=\"document\"></date-range-selector-ui>\n<date-range-selector-ui broadcast=\"self\"></date-range-selector-ui>\n",
|
|
7313
|
+
"rule": "Pick ONE global broadcaster; route secondary instances via\nbroadcast=\"self\" so they emit only on the host.\n",
|
|
7314
|
+
"wrong": "<date-range-selector-ui broadcast=\"document\"></date-range-selector-ui>\n<date-range-selector-ui broadcast=\"document\"></date-range-selector-ui>\n"
|
|
7315
|
+
},
|
|
7316
|
+
{
|
|
7317
|
+
"description": "Using DateRangeSelector for single-date selection. The composite\nresolves a range; the picker UI exposes two-pane selection. For\nsingle-date use <input-ui type=\"date\"> or <calendar-picker-ui>.\n",
|
|
7318
|
+
"right": "<input-ui type=\"date\" name=\"d\"></input-ui>\n",
|
|
7319
|
+
"rule": "Range chooser → DateRangeSelector. Single-date chooser → input-ui\ntype=date or calendar-picker-ui.\n",
|
|
7320
|
+
"wrong": "<date-range-selector-ui value=\"today\"></date-range-selector-ui>\n<!-- The selector still resolves a range (from=today, to=today). -->\n"
|
|
7321
|
+
},
|
|
7322
|
+
{
|
|
7323
|
+
"description": "Custom selected with no from/to. The composite falls back to the\nprevious resolved range, which may be empty on first mount —\nconsumers see mystery behavior.\n",
|
|
7324
|
+
"right": "<date-range-selector-ui value=\"custom\" from=\"2026-05-01\" to=\"2026-05-07\"></date-range-selector-ui>\n",
|
|
7325
|
+
"rule": "value=\"custom\" requires either declarative from/to or a follow-on\nsetRange(\"custom\", from, to) call before the chooser is meaningful.\n",
|
|
7326
|
+
"wrong": "<date-range-selector-ui value=\"custom\"></date-range-selector-ui>\n"
|
|
7327
|
+
},
|
|
7328
|
+
{
|
|
7329
|
+
"description": "Unknown preset key. The composite resolves to the default (\"7d\")\nand the consumer sees an unexpected range.\n",
|
|
7330
|
+
"right": "<date-range-selector-ui value=\"qtd\"></date-range-selector-ui>\n",
|
|
7331
|
+
"rule": "Use documented enum keys only — today, 7d, 30d, 90d, qtd, ytd,\ncustom. Quarter-to-date is `qtd`.\n",
|
|
7332
|
+
"wrong": "<date-range-selector-ui value=\"lastQuarter\"></date-range-selector-ui>\n"
|
|
7333
|
+
}
|
|
7334
|
+
],
|
|
7335
|
+
"category": "input",
|
|
7336
|
+
"composes": [
|
|
7337
|
+
"date-range-picker-ui",
|
|
7338
|
+
"segmented-ui",
|
|
7339
|
+
"segment-ui",
|
|
7340
|
+
"button-ui",
|
|
7341
|
+
"text-ui"
|
|
7342
|
+
],
|
|
7343
|
+
"events": {
|
|
7344
|
+
"change": {
|
|
7345
|
+
"description": "Alias of range-change, fires on the host element only (UIFormElement\nconvention). When [name] is set, the form value is the colon-pair\n\"{from}:{to}\".\n",
|
|
7346
|
+
"detail": {
|
|
7347
|
+
"from": "string",
|
|
7348
|
+
"to": "string",
|
|
7349
|
+
"value": "string"
|
|
7350
|
+
}
|
|
7351
|
+
},
|
|
7352
|
+
"range-change": {
|
|
7353
|
+
"description": "Fired when the resolved range changes — preset clicked, custom\nrange applied, or programmatic setRange(). Fires on the broadcast\ntarget per [broadcast]. Guaranteed once per resolved range; never\nfires for in-progress picker interactions.\n",
|
|
7354
|
+
"detail": {
|
|
7355
|
+
"from": "string",
|
|
7356
|
+
"preset": "string",
|
|
7357
|
+
"to": "string",
|
|
7358
|
+
"value": "string"
|
|
7359
|
+
}
|
|
7360
|
+
}
|
|
7361
|
+
},
|
|
7362
|
+
"examples": [
|
|
7363
|
+
{
|
|
7364
|
+
"description": "Page-global selector in a dashboard toolbar; charts subscribe to range-change on document.",
|
|
7365
|
+
"a2ui": "[\n {\n \"id\": \"dr-global\",\n \"component\": \"DateRangeSelector\",\n \"value\": \"30d\",\n \"presets\": \"today,7d,30d,90d,qtd,ytd,custom\",\n \"broadcast\": \"document\"\n }\n]\n",
|
|
7366
|
+
"name": "dashboard-toolbar-global"
|
|
7367
|
+
},
|
|
7368
|
+
{
|
|
7369
|
+
"description": "Card-local secondary picker broadcasting only on the host (no document writes).",
|
|
7370
|
+
"a2ui": "[\n {\n \"id\": \"dr-overlay\",\n \"component\": \"DateRangeSelector\",\n \"broadcast\": \"self\",\n \"presets\": \"7d,30d,90d\"\n }\n]\n",
|
|
7371
|
+
"name": "scoped-self-broadcast"
|
|
7372
|
+
},
|
|
7373
|
+
{
|
|
7374
|
+
"description": "Form-participating selector emitting a colon-pair value on submit.",
|
|
7375
|
+
"a2ui": "[\n {\n \"id\": \"dr-form\",\n \"component\": \"DateRangeSelector\",\n \"name\": \"period\",\n \"value\": \"ytd\"\n }\n]\n",
|
|
7376
|
+
"name": "form-participating"
|
|
7377
|
+
}
|
|
7378
|
+
],
|
|
7379
|
+
"keywords": [
|
|
7380
|
+
"date-range-selector",
|
|
7381
|
+
"date-range",
|
|
7382
|
+
"range-selector",
|
|
7383
|
+
"period-selector",
|
|
7384
|
+
"time-window",
|
|
7385
|
+
"dashboard-range",
|
|
7386
|
+
"period",
|
|
7387
|
+
"global-range",
|
|
7388
|
+
"range-bus",
|
|
7389
|
+
"timeframe"
|
|
7390
|
+
],
|
|
7391
|
+
"name": "DateRangeSelector",
|
|
7392
|
+
"related": [
|
|
7393
|
+
"DateRangePicker",
|
|
7394
|
+
"Segmented",
|
|
7395
|
+
"Segment",
|
|
7396
|
+
"Button",
|
|
7397
|
+
"Text",
|
|
7398
|
+
"DashboardLayout",
|
|
7399
|
+
"AdminPageHeader"
|
|
7400
|
+
],
|
|
7401
|
+
"slots": {
|
|
7402
|
+
"default": {
|
|
7403
|
+
"description": "The composite stamps its own chip row + picker; children placed in\nthe default slot are ignored. Use prefix/suffix slots for label\ntext or auxiliary controls.\n"
|
|
7404
|
+
},
|
|
7405
|
+
"prefix": {
|
|
7406
|
+
"description": "Optional leading content (e.g., a \"Period:\" caption). Renders\nbefore the chip row.\n"
|
|
7407
|
+
},
|
|
7408
|
+
"suffix": {
|
|
7409
|
+
"description": "Optional trailing content (e.g., a comparison-mode toggle).\nRenders after the picker.\n"
|
|
7410
|
+
}
|
|
7411
|
+
},
|
|
7412
|
+
"states": [
|
|
7413
|
+
{
|
|
7414
|
+
"description": "Default — preset chip selected, custom picker closed.",
|
|
7415
|
+
"name": "idle"
|
|
7416
|
+
},
|
|
7417
|
+
{
|
|
7418
|
+
"description": "Custom preset active; embedded picker is exposed for editing.",
|
|
7419
|
+
"attribute": "value",
|
|
7420
|
+
"name": "custom"
|
|
7421
|
+
},
|
|
7422
|
+
{
|
|
7423
|
+
"description": "Embedded picker popover is open (reflected from <date-range-picker-ui>).",
|
|
7424
|
+
"attribute": "picker-open",
|
|
7425
|
+
"name": "picker-open"
|
|
7426
|
+
},
|
|
7427
|
+
{
|
|
7428
|
+
"description": "Non-interactive; chips + picker dimmed; pointer-events suppressed.",
|
|
7429
|
+
"attribute": "disabled",
|
|
7430
|
+
"name": "disabled"
|
|
7431
|
+
}
|
|
7432
|
+
],
|
|
7433
|
+
"status": "experimental",
|
|
7434
|
+
"synonyms": {
|
|
7435
|
+
"period": [
|
|
7436
|
+
"range",
|
|
7437
|
+
"timeframe",
|
|
7438
|
+
"reporting-period"
|
|
7439
|
+
],
|
|
7440
|
+
"range": [
|
|
7441
|
+
"period",
|
|
7442
|
+
"timeframe",
|
|
7443
|
+
"window"
|
|
7444
|
+
],
|
|
7445
|
+
"selector": [
|
|
7446
|
+
"chooser",
|
|
7447
|
+
"picker"
|
|
7448
|
+
],
|
|
7449
|
+
"tags": [
|
|
7450
|
+
"DateRangeSelector",
|
|
7451
|
+
"RangeSelector",
|
|
7452
|
+
"PeriodSelector",
|
|
7453
|
+
"TimeWindow"
|
|
7454
|
+
]
|
|
7455
|
+
},
|
|
7456
|
+
"tag": "date-range-selector-ui",
|
|
7457
|
+
"tokens": {
|
|
7458
|
+
"--date-range-selector-gap": {
|
|
7459
|
+
"description": "Inline gap between prefix slot, chip row, picker, readout, and suffix slot.",
|
|
7460
|
+
"default": "var(--a-space-3)"
|
|
7461
|
+
},
|
|
7462
|
+
"--date-range-selector-picker-trigger-py": {
|
|
7463
|
+
"description": "Vertical padding on the embedded picker trigger (cascades into the inner button-ui).",
|
|
7464
|
+
"default": "var(--a-space-2)"
|
|
7465
|
+
},
|
|
7466
|
+
"--date-range-selector-readout-fg": {
|
|
7467
|
+
"description": "Resolved-range readout foreground color.",
|
|
7468
|
+
"default": "var(--a-fg-muted)"
|
|
7469
|
+
},
|
|
7470
|
+
"--date-range-selector-readout-size": {
|
|
7471
|
+
"description": "Resolved-range readout font size.",
|
|
7472
|
+
"default": "var(--a-font-size-sm)"
|
|
7473
|
+
}
|
|
7474
|
+
},
|
|
7475
|
+
"traits": [],
|
|
7476
|
+
"version": 1
|
|
7477
|
+
}
|
|
7478
|
+
},
|
|
7479
|
+
"DatetimePicker": {
|
|
7480
|
+
"title": "DatetimePicker",
|
|
7481
|
+
"description": "Single-control date + time selection. Trigger button opens a popover with a `<calendar-picker-ui>` on the left + a `<time-picker-ui>` on the right; commit emits a full ISO 8601 datetime string (\"YYYY-MM-DDTHH:mm\" or with seconds). Composes the two underlying primitives — never wraps a native `<input type=\"datetime-local\">` (per ADR-0025). Form-associated under one `name`. SPEC-038.",
|
|
7482
|
+
"type": "object",
|
|
7483
|
+
"allOf": [
|
|
7484
|
+
{
|
|
7485
|
+
"$ref": "#/$defs/ComponentCommon"
|
|
7486
|
+
},
|
|
7487
|
+
{
|
|
7488
|
+
"$ref": "#/$defs/CatalogComponentCommon"
|
|
7489
|
+
}
|
|
7490
|
+
],
|
|
7491
|
+
"properties": {
|
|
7492
|
+
"required": {
|
|
7493
|
+
"description": "Required for validation when inside a `<form>`.",
|
|
7494
|
+
"type": "boolean",
|
|
7495
|
+
"default": false
|
|
7496
|
+
},
|
|
7497
|
+
"component": {
|
|
7498
|
+
"const": "DatetimePicker"
|
|
7499
|
+
},
|
|
7500
|
+
"disabled": {
|
|
7501
|
+
"description": "Block all interaction. Trigger remains rendered but does not open the popover.",
|
|
7502
|
+
"type": "boolean",
|
|
7503
|
+
"default": false
|
|
7504
|
+
},
|
|
7505
|
+
"format": {
|
|
7506
|
+
"description": "Trigger button date format. `short`: `Jan 1, 2026 14:30`; `long`: `January 1, 2026 14:30`; `iso`: full ISO string.",
|
|
7507
|
+
"type": "string",
|
|
7508
|
+
"enum": [
|
|
7509
|
+
"short",
|
|
7510
|
+
"long",
|
|
7511
|
+
"iso"
|
|
7512
|
+
],
|
|
7513
|
+
"default": "short"
|
|
7514
|
+
},
|
|
7515
|
+
"hourcycle": {
|
|
7516
|
+
"description": "Hour cycle for the time pane. Empty (default) derives from the\ndocument locale. `h12` forces a 12-hour cycle with an AM/PM\n(meridiem) segment; `h23` forces 24-hour cycle.\n",
|
|
7517
|
+
"type": "string",
|
|
7518
|
+
"enum": [
|
|
7519
|
+
"",
|
|
7520
|
+
"h12",
|
|
7521
|
+
"h23"
|
|
7522
|
+
],
|
|
7523
|
+
"default": ""
|
|
7524
|
+
},
|
|
7525
|
+
"locale": {
|
|
7526
|
+
"description": "BCP-47 locale tag used to derive hour-cycle when `hour-cycle` is empty. Falls back to `<html lang>` then to browser default.",
|
|
7527
|
+
"type": "string",
|
|
7528
|
+
"default": ""
|
|
7529
|
+
},
|
|
7530
|
+
"max": {
|
|
7531
|
+
"description": "Latest selectable ISO 8601 datetime (inclusive). Days after are disabled in the calendar pane; times after are rejected by the time pane on the same day.",
|
|
7532
|
+
"type": "string",
|
|
7533
|
+
"default": ""
|
|
7534
|
+
},
|
|
7535
|
+
"min": {
|
|
7536
|
+
"description": "Earliest selectable ISO 8601 datetime (inclusive). Days before are disabled in the calendar pane; times before are rejected by the time pane on the same day.",
|
|
7537
|
+
"type": "string",
|
|
7538
|
+
"default": ""
|
|
7539
|
+
},
|
|
7540
|
+
"name": {
|
|
7541
|
+
"description": "Form field name. The ISO 8601 datetime is submitted under this key when the picker is inside a `<form>`.",
|
|
7542
|
+
"type": "string",
|
|
7543
|
+
"default": ""
|
|
7544
|
+
},
|
|
7545
|
+
"open": {
|
|
7546
|
+
"description": "Whether the popover is currently open.",
|
|
7547
|
+
"type": "boolean",
|
|
7548
|
+
"default": false
|
|
7549
|
+
},
|
|
7550
|
+
"placeholder": {
|
|
7551
|
+
"description": "Text shown in the trigger when the value is empty.",
|
|
7552
|
+
"type": "string",
|
|
7553
|
+
"default": "Select date and time"
|
|
7554
|
+
},
|
|
7555
|
+
"precision": {
|
|
7556
|
+
"description": "Time-pane precision. `minute` (default) emits `HH:mm`; `second` exposes the seconds segment and emits `HH:mm:ss`.",
|
|
7557
|
+
"type": "string",
|
|
7558
|
+
"enum": [
|
|
7559
|
+
"minute",
|
|
7560
|
+
"second"
|
|
7561
|
+
],
|
|
7562
|
+
"default": "minute"
|
|
7563
|
+
},
|
|
7564
|
+
"readonly": {
|
|
7565
|
+
"description": "Block edits; allow keyboard navigation for screen-reader inspection.",
|
|
7566
|
+
"type": "boolean",
|
|
7567
|
+
"default": false
|
|
7568
|
+
},
|
|
7569
|
+
"step": {
|
|
7570
|
+
"description": "Per-Arrow-keypress increment in seconds for the time pane. 60 = minute precision (default), 900 = 15-minute, 1 = second precision.",
|
|
7571
|
+
"type": "number",
|
|
7572
|
+
"default": 60
|
|
7573
|
+
},
|
|
7574
|
+
"value": {
|
|
7575
|
+
"description": "Current value as ISO 8601 datetime (\"YYYY-MM-DDTHH:mm\" or \"YYYY-MM-DDTHH:mm:ss\"). Empty when no value selected.",
|
|
7576
|
+
"$ref": "#/$defs/DynamicString"
|
|
7577
|
+
}
|
|
7578
|
+
},
|
|
7579
|
+
"required": [
|
|
7580
|
+
"component"
|
|
7581
|
+
],
|
|
7582
|
+
"unevaluatedProperties": false,
|
|
7583
|
+
"x-adiaui": {
|
|
7584
|
+
"anti_patterns": [
|
|
7585
|
+
{
|
|
7586
|
+
"fix": "{\"component\": \"DatetimePicker\", \"value\": \"2026-05-24T00:00\"}\n",
|
|
7587
|
+
"why": "`value` is a date-only string — no time component. The contract requires\na full ISO 8601 datetime including the `T` and time segment.\n",
|
|
7588
|
+
"wrong": "{\"component\": \"DatetimePicker\", \"value\": \"2026-05-24\"}\n"
|
|
7589
|
+
},
|
|
7590
|
+
{
|
|
7591
|
+
"fix": "{\"component\": \"DatetimePicker\", \"value\": \"2026-05-24T14:30\"}\n",
|
|
7592
|
+
"why": "`value` is a time-only string — no date component. Use `<TimePicker>` for\ntime-only selection or supply the date portion.\n",
|
|
7593
|
+
"wrong": "{\"component\": \"DatetimePicker\", \"value\": \"14:30\"}\n"
|
|
7594
|
+
},
|
|
7595
|
+
{
|
|
7596
|
+
"fix": "{\"component\": \"DatetimePicker\", \"name\": \"field-name\"}\n",
|
|
7597
|
+
"why": "Nesting a native datetime-local input violates ADR-0025 and bypasses\nElementInternals form participation.\n",
|
|
7598
|
+
"wrong": "{\"component\": \"DatetimePicker\", \"children\": [\n {\"component\": \"Input\", \"type\": \"datetime-local\"}\n]}\n"
|
|
7599
|
+
},
|
|
7600
|
+
{
|
|
7601
|
+
"fix": "<datetime-picker-ui name=\"appointment\"></datetime-picker-ui>\n",
|
|
7602
|
+
"why": "Hand-rolled date + free-form time composition is the pattern this primitive\nreplaces. It misses the coordinated popover, the per-segment Spinbutton\na11y model, and unified form participation.\n",
|
|
7603
|
+
"wrong": "<calendar-picker-ui></calendar-picker-ui>\n<input-ui type=\"text\" placeholder=\"HH:mm\"></input-ui>\n"
|
|
7604
|
+
}
|
|
7605
|
+
],
|
|
7606
|
+
"category": "input",
|
|
7607
|
+
"composes": [
|
|
7608
|
+
"calendar-grid-ui",
|
|
7609
|
+
"time-picker-ui",
|
|
7610
|
+
"button-ui",
|
|
7611
|
+
"popover-ui",
|
|
7612
|
+
"divider-ui"
|
|
7613
|
+
],
|
|
7614
|
+
"events": {
|
|
7615
|
+
"change": {
|
|
7616
|
+
"description": "Fired when the value commits (date picked + time edited, OR Apply clicked in explicit-commit mode).",
|
|
7617
|
+
"detail": {
|
|
7618
|
+
"source": "string",
|
|
7619
|
+
"value": "string"
|
|
7620
|
+
}
|
|
7621
|
+
},
|
|
7622
|
+
"close": {
|
|
7623
|
+
"description": "Popover closed (without commit, or after commit).",
|
|
7624
|
+
"detail": {
|
|
7625
|
+
"reason": "string"
|
|
7626
|
+
}
|
|
7627
|
+
},
|
|
7628
|
+
"input": {
|
|
7629
|
+
"description": "Fired during partial selection (date picked but time still pending, or vice versa).",
|
|
7630
|
+
"detail": {
|
|
7631
|
+
"value": "string"
|
|
7632
|
+
}
|
|
7633
|
+
},
|
|
7634
|
+
"invalid": {
|
|
7635
|
+
"description": "A constraint failed (out of range, parse error).",
|
|
7636
|
+
"detail": {
|
|
7637
|
+
"reason": "string",
|
|
7638
|
+
"value": "string"
|
|
7639
|
+
}
|
|
7640
|
+
},
|
|
7641
|
+
"open": {
|
|
7642
|
+
"description": "Popover opened (user clicked the trigger or pressed Enter / Space).",
|
|
7643
|
+
"detail": {
|
|
7644
|
+
"trigger": "string"
|
|
7645
|
+
}
|
|
7646
|
+
}
|
|
7647
|
+
},
|
|
7648
|
+
"examples": [
|
|
7649
|
+
{
|
|
7650
|
+
"description": "Form-field-wrapped picker with min/max bounds.",
|
|
7651
|
+
"a2ui": "[\n {\n \"id\": \"field\",\n \"component\": \"Field\",\n \"label\": \"Appointment\",\n \"children\": [\"dt\"]\n },\n {\n \"id\": \"dt\",\n \"component\": \"DatetimePicker\",\n \"name\": \"appointment\",\n \"min\": \"2026-01-01T00:00\",\n \"max\": \"2026-12-31T23:59\"\n }\n]\n",
|
|
7652
|
+
"name": "canonical"
|
|
7653
|
+
},
|
|
7654
|
+
{
|
|
7655
|
+
"description": "Log-cursor picker with second precision.",
|
|
7656
|
+
"a2ui": "[\n {\n \"id\": \"dt\",\n \"component\": \"DatetimePicker\",\n \"name\": \"log-cursor\",\n \"precision\": \"second\",\n \"step\": 1,\n \"value\": \"2026-05-24T14:30:45\"\n }\n]\n",
|
|
7657
|
+
"name": "second-precision"
|
|
7658
|
+
},
|
|
7659
|
+
{
|
|
7660
|
+
"description": "Cron editor with forced 24-hour cycle.",
|
|
7661
|
+
"a2ui": "[\n {\n \"id\": \"dt\",\n \"component\": \"DatetimePicker\",\n \"name\": \"cron\",\n \"hourCycle\": \"h23\"\n }\n]\n",
|
|
7662
|
+
"name": "forced-24h"
|
|
7663
|
+
},
|
|
7664
|
+
{
|
|
7665
|
+
"description": "Read-only datetime for inspection only.",
|
|
7666
|
+
"a2ui": "[\n {\n \"id\": \"dt\",\n \"component\": \"DatetimePicker\",\n \"readonly\": true,\n \"value\": \"2026-05-24T14:30\"\n }\n]\n",
|
|
7667
|
+
"name": "readonly"
|
|
7668
|
+
}
|
|
7669
|
+
],
|
|
7670
|
+
"keywords": [
|
|
7671
|
+
"datetimepicker",
|
|
7672
|
+
"datetime-picker",
|
|
7673
|
+
"datetime",
|
|
7674
|
+
"date-time",
|
|
7675
|
+
"dateandtime",
|
|
7676
|
+
"appointment",
|
|
7677
|
+
"schedule",
|
|
7678
|
+
"timestamp"
|
|
7679
|
+
],
|
|
7680
|
+
"name": "UIDatetimePicker",
|
|
6118
7681
|
"related": [
|
|
6119
|
-
"
|
|
6120
|
-
"
|
|
6121
|
-
"
|
|
6122
|
-
"
|
|
7682
|
+
"calendar-picker",
|
|
7683
|
+
"time-picker",
|
|
7684
|
+
"date-range-picker",
|
|
7685
|
+
"popover",
|
|
7686
|
+
"field",
|
|
7687
|
+
"button"
|
|
6123
7688
|
],
|
|
6124
7689
|
"slots": {
|
|
6125
|
-
"empty": {
|
|
6126
|
-
"description": "Empty state shown when no items match"
|
|
6127
|
-
},
|
|
6128
7690
|
"footer": {
|
|
6129
|
-
"description": "
|
|
6130
|
-
},
|
|
6131
|
-
"list": {
|
|
6132
|
-
"description": "Container for command items and groups"
|
|
7691
|
+
"description": "Optional Apply / Cancel buttons for explicit-commit flows. Spans both panes below the calendar + time area."
|
|
6133
7692
|
},
|
|
6134
|
-
"
|
|
6135
|
-
"description": "
|
|
7693
|
+
"trigger": {
|
|
7694
|
+
"description": "Custom trigger replacement. When omitted, a default `<button-ui>` is stamped."
|
|
6136
7695
|
}
|
|
6137
7696
|
},
|
|
6138
7697
|
"states": [
|
|
6139
7698
|
{
|
|
6140
|
-
"description": "
|
|
7699
|
+
"description": "Closed, no pending selection.",
|
|
6141
7700
|
"name": "idle"
|
|
7701
|
+
},
|
|
7702
|
+
{
|
|
7703
|
+
"description": "Popover open, no calendar pick yet.",
|
|
7704
|
+
"attribute": "open",
|
|
7705
|
+
"name": "open-pending-date"
|
|
7706
|
+
},
|
|
7707
|
+
{
|
|
7708
|
+
"description": "Date picked; time pane is the next focus target.",
|
|
7709
|
+
"attribute": "open",
|
|
7710
|
+
"name": "open-pending-time"
|
|
7711
|
+
},
|
|
7712
|
+
{
|
|
7713
|
+
"description": "Both panes set; awaiting Apply (explicit-commit mode only).",
|
|
7714
|
+
"attribute": "open",
|
|
7715
|
+
"name": "open-committed"
|
|
7716
|
+
},
|
|
7717
|
+
{
|
|
7718
|
+
"description": "Non-interactive; dimmed.",
|
|
7719
|
+
"attribute": "disabled",
|
|
7720
|
+
"name": "disabled"
|
|
7721
|
+
},
|
|
7722
|
+
{
|
|
7723
|
+
"description": "Read-only; trigger keyboard-focusable but popover does not open.",
|
|
7724
|
+
"attribute": "readonly",
|
|
7725
|
+
"name": "readonly"
|
|
6142
7726
|
}
|
|
6143
7727
|
],
|
|
6144
|
-
"status": "
|
|
7728
|
+
"status": "experimental",
|
|
6145
7729
|
"synonyms": {
|
|
6146
|
-
"
|
|
6147
|
-
"
|
|
6148
|
-
"
|
|
6149
|
-
"
|
|
6150
|
-
"command"
|
|
6151
|
-
],
|
|
6152
|
-
"assistant": [
|
|
6153
|
-
"chat",
|
|
6154
|
-
"streaming",
|
|
6155
|
-
"response",
|
|
6156
|
-
"command"
|
|
6157
|
-
],
|
|
6158
|
-
"autocomplete": [
|
|
6159
|
-
"search",
|
|
6160
|
-
"command",
|
|
6161
|
-
"palette",
|
|
6162
|
-
"tag"
|
|
6163
|
-
],
|
|
6164
|
-
"combobox": [
|
|
6165
|
-
"search",
|
|
6166
|
-
"command",
|
|
6167
|
-
"select"
|
|
6168
|
-
],
|
|
6169
|
-
"command": [
|
|
6170
|
-
"command",
|
|
6171
|
-
"palette",
|
|
6172
|
-
"kbd",
|
|
6173
|
-
"shortcut"
|
|
6174
|
-
],
|
|
6175
|
-
"console": [
|
|
6176
|
-
"dashboard",
|
|
6177
|
-
"table",
|
|
6178
|
-
"data",
|
|
6179
|
-
"sidebar",
|
|
6180
|
-
"command"
|
|
6181
|
-
],
|
|
6182
|
-
"copilot": [
|
|
6183
|
-
"chat",
|
|
6184
|
-
"streaming",
|
|
6185
|
-
"response",
|
|
6186
|
-
"command"
|
|
6187
|
-
],
|
|
6188
|
-
"find": [
|
|
6189
|
-
"search",
|
|
6190
|
-
"filter",
|
|
6191
|
-
"command"
|
|
6192
|
-
],
|
|
6193
|
-
"hotkey": [
|
|
6194
|
-
"kbd",
|
|
6195
|
-
"shortcut",
|
|
6196
|
-
"command"
|
|
6197
|
-
],
|
|
6198
|
-
"keybinding": [
|
|
6199
|
-
"kbd",
|
|
6200
|
-
"shortcut",
|
|
6201
|
-
"command"
|
|
6202
|
-
],
|
|
6203
|
-
"keyboard": [
|
|
6204
|
-
"kbd",
|
|
6205
|
-
"shortcut",
|
|
6206
|
-
"command"
|
|
6207
|
-
],
|
|
6208
|
-
"lookup": [
|
|
6209
|
-
"search",
|
|
6210
|
-
"filter",
|
|
6211
|
-
"command"
|
|
6212
|
-
],
|
|
6213
|
-
"menu": [
|
|
6214
|
-
"nav",
|
|
6215
|
-
"sidebar",
|
|
6216
|
-
"popover",
|
|
6217
|
-
"menu",
|
|
6218
|
-
"command"
|
|
6219
|
-
],
|
|
6220
|
-
"omnibar": [
|
|
6221
|
-
"command",
|
|
6222
|
-
"palette",
|
|
6223
|
-
"search"
|
|
6224
|
-
],
|
|
6225
|
-
"palette": [
|
|
6226
|
-
"color",
|
|
6227
|
-
"picker",
|
|
6228
|
-
"command",
|
|
6229
|
-
"palette"
|
|
7730
|
+
"appointment": [
|
|
7731
|
+
"datetime",
|
|
7732
|
+
"meeting",
|
|
7733
|
+
"schedule"
|
|
6230
7734
|
],
|
|
6231
|
-
"
|
|
6232
|
-
"
|
|
6233
|
-
"
|
|
6234
|
-
"
|
|
6235
|
-
"
|
|
6236
|
-
],
|
|
6237
|
-
"search": [
|
|
6238
|
-
"search",
|
|
6239
|
-
"filter",
|
|
6240
|
-
"command",
|
|
6241
|
-
"palette"
|
|
6242
|
-
],
|
|
6243
|
-
"shortcut": [
|
|
6244
|
-
"kbd",
|
|
6245
|
-
"shortcut",
|
|
6246
|
-
"command"
|
|
6247
|
-
],
|
|
6248
|
-
"spotlight": [
|
|
6249
|
-
"command",
|
|
6250
|
-
"palette",
|
|
6251
|
-
"search"
|
|
7735
|
+
"datetime": [
|
|
7736
|
+
"date-time",
|
|
7737
|
+
"timestamp",
|
|
7738
|
+
"appointment",
|
|
7739
|
+
"schedule"
|
|
6252
7740
|
],
|
|
6253
7741
|
"tags": [
|
|
6254
|
-
"
|
|
6255
|
-
|
|
6256
|
-
|
|
6257
|
-
"
|
|
6258
|
-
"block",
|
|
6259
|
-
"command"
|
|
6260
|
-
],
|
|
6261
|
-
"typeahead": [
|
|
6262
|
-
"search",
|
|
6263
|
-
"command",
|
|
6264
|
-
"palette"
|
|
7742
|
+
"DateTimePicker",
|
|
7743
|
+
"DateTimeInput",
|
|
7744
|
+
"DatetimeInput",
|
|
7745
|
+
"Timestamp"
|
|
6265
7746
|
]
|
|
6266
7747
|
},
|
|
6267
|
-
"tag": "
|
|
6268
|
-
"tokens": {
|
|
7748
|
+
"tag": "datetime-picker-ui",
|
|
7749
|
+
"tokens": {
|
|
7750
|
+
"--datetime-picker-bg": {
|
|
7751
|
+
"description": "Host background.",
|
|
7752
|
+
"default": "var(--a-bg)"
|
|
7753
|
+
},
|
|
7754
|
+
"--datetime-picker-divider": {
|
|
7755
|
+
"description": "Pane divider color.",
|
|
7756
|
+
"default": "var(--a-border-subtle)"
|
|
7757
|
+
},
|
|
7758
|
+
"--datetime-picker-duration": {
|
|
7759
|
+
"description": "Open/close transition duration.",
|
|
7760
|
+
"default": "var(--a-duration-fast)"
|
|
7761
|
+
},
|
|
7762
|
+
"--datetime-picker-easing": {
|
|
7763
|
+
"description": "Open/close transition easing.",
|
|
7764
|
+
"default": "var(--a-easing)"
|
|
7765
|
+
},
|
|
7766
|
+
"--datetime-picker-fg": {
|
|
7767
|
+
"description": "Host text color.",
|
|
7768
|
+
"default": "var(--a-fg)"
|
|
7769
|
+
},
|
|
7770
|
+
"--datetime-picker-popover-bg": {
|
|
7771
|
+
"description": "Popover background.",
|
|
7772
|
+
"default": "var(--a-bg-subtle)"
|
|
7773
|
+
},
|
|
7774
|
+
"--datetime-picker-popover-border": {
|
|
7775
|
+
"description": "Popover border color.",
|
|
7776
|
+
"default": "var(--a-border-subtle)"
|
|
7777
|
+
},
|
|
7778
|
+
"--datetime-picker-popover-gap": {
|
|
7779
|
+
"description": "Gap between calendar pane and time pane.",
|
|
7780
|
+
"default": "var(--a-space-3)"
|
|
7781
|
+
},
|
|
7782
|
+
"--datetime-picker-popover-padding": {
|
|
7783
|
+
"description": "Popover internal padding.",
|
|
7784
|
+
"default": "var(--a-space-3)"
|
|
7785
|
+
},
|
|
7786
|
+
"--datetime-picker-popover-radius": {
|
|
7787
|
+
"description": "Popover border radius.",
|
|
7788
|
+
"default": "var(--a-radius-lg)"
|
|
7789
|
+
},
|
|
7790
|
+
"--datetime-picker-popover-shadow": {
|
|
7791
|
+
"description": "Popover box shadow.",
|
|
7792
|
+
"default": "var(--a-shadow-lg)"
|
|
7793
|
+
},
|
|
7794
|
+
"--datetime-picker-px": {
|
|
7795
|
+
"description": "Horizontal popover padding.",
|
|
7796
|
+
"default": "var(--a-space-3)"
|
|
7797
|
+
},
|
|
7798
|
+
"--datetime-picker-py": {
|
|
7799
|
+
"description": "Vertical popover padding.",
|
|
7800
|
+
"default": "var(--a-space-2)"
|
|
7801
|
+
},
|
|
7802
|
+
"--datetime-picker-trigger-min-width": {
|
|
7803
|
+
"description": "Default trigger min-width — sized so the formatted date+time fits without truncation.",
|
|
7804
|
+
"default": "16em"
|
|
7805
|
+
}
|
|
7806
|
+
},
|
|
6269
7807
|
"traits": [],
|
|
6270
7808
|
"version": 1
|
|
6271
7809
|
}
|
|
@@ -9476,9 +11014,87 @@
|
|
|
9476
11014
|
"version": 1
|
|
9477
11015
|
}
|
|
9478
11016
|
},
|
|
9479
|
-
"Inspector": {
|
|
9480
|
-
"title": "Inspector",
|
|
9481
|
-
"description": "Developer-tools pane for inspecting A2UI runtime state — composes\n<tabs-ui> + <code-ui> to show the live document JSON, rendered\nHTML, and event log for the bound <canvas-ui> / <a2ui-root>. The\nright-pane inspector of the a2ui-editor app. Use inside an\n<editor-sidebar slot=\"trailing\"> for debugging A2UI playgrounds;\nnot for end-user inspector panes (build those bespoke with\n<field-ui> + form rows per the editor-inspector-pane recipe in\npatterns-recipes.md).\n",
|
|
11017
|
+
"Inspector": {
|
|
11018
|
+
"title": "Inspector",
|
|
11019
|
+
"description": "Developer-tools pane for inspecting A2UI runtime state — composes\n<tabs-ui> + <code-ui> to show the live document JSON, rendered\nHTML, and event log for the bound <canvas-ui> / <a2ui-root>. The\nright-pane inspector of the a2ui-editor app. Use inside an\n<editor-sidebar slot=\"trailing\"> for debugging A2UI playgrounds;\nnot for end-user inspector panes (build those bespoke with\n<field-ui> + form rows per the editor-inspector-pane recipe in\npatterns-recipes.md).\n",
|
|
11020
|
+
"type": "object",
|
|
11021
|
+
"allOf": [
|
|
11022
|
+
{
|
|
11023
|
+
"$ref": "#/$defs/ComponentCommon"
|
|
11024
|
+
},
|
|
11025
|
+
{
|
|
11026
|
+
"$ref": "#/$defs/CatalogComponentCommon"
|
|
11027
|
+
}
|
|
11028
|
+
],
|
|
11029
|
+
"properties": {
|
|
11030
|
+
"component": {
|
|
11031
|
+
"const": "Inspector"
|
|
11032
|
+
},
|
|
11033
|
+
"value": {
|
|
11034
|
+
"description": "Active tab. One of 'catalog', 'surface', 'messages', 'code'.",
|
|
11035
|
+
"type": "string",
|
|
11036
|
+
"default": "surface"
|
|
11037
|
+
}
|
|
11038
|
+
},
|
|
11039
|
+
"required": [
|
|
11040
|
+
"component"
|
|
11041
|
+
],
|
|
11042
|
+
"unevaluatedProperties": false,
|
|
11043
|
+
"x-adiaui": {
|
|
11044
|
+
"anti_patterns": [],
|
|
11045
|
+
"category": "agent",
|
|
11046
|
+
"composes": [
|
|
11047
|
+
"tabs-ui",
|
|
11048
|
+
"tab-ui",
|
|
11049
|
+
"code-ui"
|
|
11050
|
+
],
|
|
11051
|
+
"events": {},
|
|
11052
|
+
"examples": [
|
|
11053
|
+
{
|
|
11054
|
+
"description": "Basic Inspector usage",
|
|
11055
|
+
"a2ui": "[\n {\n \"id\": \"root\",\n \"component\": \"Card\",\n \"children\": [\n \"sec\"\n ]\n },\n {\n \"id\": \"sec\",\n \"component\": \"Section\",\n \"children\": [\n \"comp\"\n ]\n },\n {\n \"id\": \"comp\",\n \"component\": \"Inspector\"\n }\n]",
|
|
11056
|
+
"name": "basic-inspector"
|
|
11057
|
+
}
|
|
11058
|
+
],
|
|
11059
|
+
"keywords": [
|
|
11060
|
+
"inspector"
|
|
11061
|
+
],
|
|
11062
|
+
"name": "UIInspector",
|
|
11063
|
+
"related": [
|
|
11064
|
+
"A2uiRoot",
|
|
11065
|
+
"EditorSidebar",
|
|
11066
|
+
"Code",
|
|
11067
|
+
"Tabs"
|
|
11068
|
+
],
|
|
11069
|
+
"slots": {
|
|
11070
|
+
"default": {
|
|
11071
|
+
"description": "Default slot — primary child content."
|
|
11072
|
+
}
|
|
11073
|
+
},
|
|
11074
|
+
"states": [
|
|
11075
|
+
{
|
|
11076
|
+
"description": "Default, ready for interaction.",
|
|
11077
|
+
"name": "idle"
|
|
11078
|
+
}
|
|
11079
|
+
],
|
|
11080
|
+
"status": "stable",
|
|
11081
|
+
"synonyms": {
|
|
11082
|
+
"tags": [
|
|
11083
|
+
"object-inspector",
|
|
11084
|
+
"property-grid",
|
|
11085
|
+
"record-detail",
|
|
11086
|
+
"devtools-pane"
|
|
11087
|
+
]
|
|
11088
|
+
},
|
|
11089
|
+
"tag": "inspector-ui",
|
|
11090
|
+
"tokens": {},
|
|
11091
|
+
"traits": [],
|
|
11092
|
+
"version": 1
|
|
11093
|
+
}
|
|
11094
|
+
},
|
|
11095
|
+
"IntegrationCard": {
|
|
11096
|
+
"title": "IntegrationCard",
|
|
11097
|
+
"description": "Single-tile primitive representing one third-party integration (Slack, GitHub, Stripe, …). Shows the provider logo + name + description + status pill + a single primary action button whose label and variant are derived from `status`. Composes into a grid via the SPEC-063 integrations-page composite. One tile = one provider; the button variant is computed from `status`, not a separate prop. Distinct from <option-card-ui> (a single-select radio with no status / async action) and <card-ui> (the generic bordered surface this specializes).",
|
|
9482
11098
|
"type": "object",
|
|
9483
11099
|
"allOf": [
|
|
9484
11100
|
{
|
|
@@ -9489,67 +11105,255 @@
|
|
|
9489
11105
|
}
|
|
9490
11106
|
],
|
|
9491
11107
|
"properties": {
|
|
11108
|
+
"description": {
|
|
11109
|
+
"description": "One-line description of what the integration does.",
|
|
11110
|
+
"type": "string",
|
|
11111
|
+
"default": ""
|
|
11112
|
+
},
|
|
9492
11113
|
"component": {
|
|
9493
|
-
"const": "
|
|
11114
|
+
"const": "IntegrationCard"
|
|
9494
11115
|
},
|
|
9495
|
-
"
|
|
9496
|
-
"description": "
|
|
11116
|
+
"disabled": {
|
|
11117
|
+
"description": "Disables the action button.",
|
|
11118
|
+
"type": "boolean",
|
|
11119
|
+
"default": false
|
|
11120
|
+
},
|
|
11121
|
+
"error-message": {
|
|
11122
|
+
"description": "When `status=\"error\"`, the message to show below the description. Ignored for other statuses.",
|
|
11123
|
+
"$ref": "#/$defs/DynamicString"
|
|
11124
|
+
},
|
|
11125
|
+
"logo": {
|
|
11126
|
+
"description": "Logo URL (preferred — renders as <img>) or icon name (renders as <icon-ui>). URLs are sniffed by presence of `/`.",
|
|
9497
11127
|
"type": "string",
|
|
9498
|
-
"default": "
|
|
11128
|
+
"default": ""
|
|
11129
|
+
},
|
|
11130
|
+
"name": {
|
|
11131
|
+
"description": "Display name shown as the card title. Required.",
|
|
11132
|
+
"type": "string",
|
|
11133
|
+
"default": ""
|
|
11134
|
+
},
|
|
11135
|
+
"provider": {
|
|
11136
|
+
"description": "Provider key — `slack`, `github`, etc. — used for analytics + a11y label. Required.",
|
|
11137
|
+
"type": "string",
|
|
11138
|
+
"default": ""
|
|
11139
|
+
},
|
|
11140
|
+
"status": {
|
|
11141
|
+
"description": "Current connection state — drives the button label, variant, and visibility. `available` shows a primary `Connect`; `connected` shows an outline `Configure`; `error` shows an outline `Retry`; `pending` shows a non-interactive spinner; `coming-soon` hides the button.",
|
|
11142
|
+
"$ref": "#/$defs/DynamicString"
|
|
9499
11143
|
}
|
|
9500
11144
|
},
|
|
9501
11145
|
"required": [
|
|
9502
|
-
"component"
|
|
11146
|
+
"component",
|
|
11147
|
+
"provider",
|
|
11148
|
+
"name"
|
|
9503
11149
|
],
|
|
9504
11150
|
"unevaluatedProperties": false,
|
|
9505
11151
|
"x-adiaui": {
|
|
9506
|
-
"anti_patterns": [
|
|
9507
|
-
|
|
11152
|
+
"anti_patterns": [
|
|
11153
|
+
{
|
|
11154
|
+
"fix": "{\"component\": \"IntegrationCard\", \"provider\": \"slack\",\n \"name\": \"Slack\", \"status\": \"available\"}\n",
|
|
11155
|
+
"why": "Manually slotting a Button bypasses the card's status-driven\nbutton semantics. The card renders its own button AND the\nslotted one, producing two actions side-by-side.\n",
|
|
11156
|
+
"wrong": "{\"component\": \"IntegrationCard\", \"provider\": \"slack\",\n \"children\": [{\"component\": \"Button\", \"label\": \"Connect\"}]}\n"
|
|
11157
|
+
},
|
|
11158
|
+
{
|
|
11159
|
+
"fix": "{\"component\": \"IntegrationCard\", \"provider\": \"slack\",\n \"name\": \"Slack\", \"logo\": \"/slack.svg\", \"status\": \"available\"}\n",
|
|
11160
|
+
"why": "Re-implements IntegrationCard with primitives. Loses status\nbadge semantics, accessible-name wiring, and the typed\nconnect/configure events.\n",
|
|
11161
|
+
"wrong": "{\"component\": \"Card\", \"children\": [\n {\"component\": \"Image\", \"src\": \"/slack.svg\"},\n {\"component\": \"Text\", \"value\": \"Slack\"},\n {\"component\": \"Button\", \"label\": \"Connect\"}]}\n"
|
|
11162
|
+
}
|
|
11163
|
+
],
|
|
11164
|
+
"category": "display",
|
|
9508
11165
|
"composes": [
|
|
9509
|
-
"
|
|
9510
|
-
"
|
|
9511
|
-
"
|
|
11166
|
+
"icon-ui",
|
|
11167
|
+
"badge-ui",
|
|
11168
|
+
"button-ui"
|
|
9512
11169
|
],
|
|
9513
|
-
"events": {
|
|
11170
|
+
"events": {
|
|
11171
|
+
"configure": {
|
|
11172
|
+
"description": "Fired when the user clicks the action button while `status=\"connected\"`.",
|
|
11173
|
+
"detail": {
|
|
11174
|
+
"provider": {
|
|
11175
|
+
"description": "The provider key for this card.",
|
|
11176
|
+
"type": "string"
|
|
11177
|
+
}
|
|
11178
|
+
}
|
|
11179
|
+
},
|
|
11180
|
+
"connect": {
|
|
11181
|
+
"description": "Fired when the user clicks the action button while `status=\"available\"`.",
|
|
11182
|
+
"detail": {
|
|
11183
|
+
"provider": {
|
|
11184
|
+
"description": "The provider key for this card.",
|
|
11185
|
+
"type": "string"
|
|
11186
|
+
}
|
|
11187
|
+
}
|
|
11188
|
+
},
|
|
11189
|
+
"disconnect": {
|
|
11190
|
+
"description": "Fired when the consumer wires a `<menu-ui slot=\"actions\">` overflow with a `disconnect` item. The card does not stamp this menu — it bubbles whatever consumer markup dispatches.",
|
|
11191
|
+
"detail": {
|
|
11192
|
+
"provider": {
|
|
11193
|
+
"description": "The provider key for this card.",
|
|
11194
|
+
"type": "string"
|
|
11195
|
+
}
|
|
11196
|
+
}
|
|
11197
|
+
},
|
|
11198
|
+
"retry": {
|
|
11199
|
+
"description": "Fired when the user clicks the action button while `status=\"error\"`.",
|
|
11200
|
+
"detail": {
|
|
11201
|
+
"provider": {
|
|
11202
|
+
"description": "The provider key for this card.",
|
|
11203
|
+
"type": "string"
|
|
11204
|
+
}
|
|
11205
|
+
}
|
|
11206
|
+
}
|
|
11207
|
+
},
|
|
9514
11208
|
"examples": [
|
|
9515
11209
|
{
|
|
9516
|
-
"description": "
|
|
9517
|
-
"a2ui": "
|
|
9518
|
-
"name": "
|
|
11210
|
+
"description": "Available integration with logo, description, and primary Connect button.",
|
|
11211
|
+
"a2ui": "{\n \"id\": \"card-slack\",\n \"component\": \"IntegrationCard\",\n \"provider\": \"slack\",\n \"name\": \"Slack\",\n \"logo\": \"/integrations/slack.svg\",\n \"description\": \"Send AI replies and notifications to channels.\",\n \"status\": \"available\"\n}",
|
|
11212
|
+
"name": "available"
|
|
11213
|
+
},
|
|
11214
|
+
{
|
|
11215
|
+
"description": "Connected integration with success badge and outline Configure button.",
|
|
11216
|
+
"a2ui": "{\n \"id\": \"card-github\",\n \"component\": \"IntegrationCard\",\n \"provider\": \"github\",\n \"name\": \"GitHub\",\n \"logo\": \"/integrations/github.svg\",\n \"description\": \"Sync issues and pull requests.\",\n \"status\": \"connected\"\n}",
|
|
11217
|
+
"name": "connected"
|
|
11218
|
+
},
|
|
11219
|
+
{
|
|
11220
|
+
"description": "Error integration with danger badge, error message, and Retry button.",
|
|
11221
|
+
"a2ui": "{\n \"id\": \"card-stripe\",\n \"component\": \"IntegrationCard\",\n \"provider\": \"stripe\",\n \"name\": \"Stripe\",\n \"description\": \"Charge customers and reconcile invoices.\",\n \"status\": \"error\",\n \"error-message\": \"Token expired — re-authenticate.\"\n}",
|
|
11222
|
+
"name": "error"
|
|
11223
|
+
},
|
|
11224
|
+
{
|
|
11225
|
+
"description": "Coming-soon integration with no action button.",
|
|
11226
|
+
"a2ui": "{\n \"id\": \"card-zapier\",\n \"component\": \"IntegrationCard\",\n \"provider\": \"zapier\",\n \"name\": \"Zapier\",\n \"description\": \"Trigger Zaps from AdiaUI events.\",\n \"status\": \"coming-soon\"\n}",
|
|
11227
|
+
"name": "coming-soon"
|
|
9519
11228
|
}
|
|
9520
11229
|
],
|
|
9521
11230
|
"keywords": [
|
|
9522
|
-
"
|
|
11231
|
+
"integration",
|
|
11232
|
+
"connect",
|
|
11233
|
+
"provider",
|
|
11234
|
+
"slack",
|
|
11235
|
+
"github",
|
|
11236
|
+
"stripe",
|
|
11237
|
+
"oauth",
|
|
11238
|
+
"third-party",
|
|
11239
|
+
"settings",
|
|
11240
|
+
"integrations",
|
|
11241
|
+
"card",
|
|
11242
|
+
"tile"
|
|
9523
11243
|
],
|
|
9524
|
-
"name": "
|
|
11244
|
+
"name": "UIIntegrationCard",
|
|
9525
11245
|
"related": [
|
|
9526
|
-
"
|
|
9527
|
-
"
|
|
9528
|
-
"
|
|
9529
|
-
"
|
|
11246
|
+
"card",
|
|
11247
|
+
"badge",
|
|
11248
|
+
"button",
|
|
11249
|
+
"menu"
|
|
9530
11250
|
],
|
|
9531
11251
|
"slots": {
|
|
9532
11252
|
"default": {
|
|
9533
|
-
"description": "
|
|
11253
|
+
"description": "Optional override for the description. When a non-empty default slot is provided it supersedes the `description` prop."
|
|
11254
|
+
},
|
|
11255
|
+
"actions": {
|
|
11256
|
+
"description": "Optional secondary actions — typically a <menu-ui> overflow carrying `Reauthenticate` / `Disconnect` entries. Collapses when empty."
|
|
9534
11257
|
}
|
|
9535
11258
|
},
|
|
9536
11259
|
"states": [
|
|
9537
11260
|
{
|
|
9538
|
-
"description": "Default
|
|
11261
|
+
"description": "Default — `[status=\"available\"]`.",
|
|
9539
11262
|
"name": "idle"
|
|
11263
|
+
},
|
|
11264
|
+
{
|
|
11265
|
+
"description": "Ready to connect.",
|
|
11266
|
+
"attribute": "status=\"available\"",
|
|
11267
|
+
"name": "available"
|
|
11268
|
+
},
|
|
11269
|
+
{
|
|
11270
|
+
"description": "Linked — success-tinted border, check badge, outline `Configure` button.",
|
|
11271
|
+
"attribute": "status=\"connected\"",
|
|
11272
|
+
"name": "connected"
|
|
11273
|
+
},
|
|
11274
|
+
{
|
|
11275
|
+
"description": "Connection failed — danger-tinted border, error message visible, outline `Retry` button.",
|
|
11276
|
+
"attribute": "status=\"error\"",
|
|
11277
|
+
"name": "error"
|
|
11278
|
+
},
|
|
11279
|
+
{
|
|
11280
|
+
"description": "Awaiting response — button shows spinner, non-interactive.",
|
|
11281
|
+
"attribute": "status=\"pending\"",
|
|
11282
|
+
"name": "pending"
|
|
11283
|
+
},
|
|
11284
|
+
{
|
|
11285
|
+
"description": "Listed but not yet enabled — opacity reduced, button hidden, \"Coming soon\" badge shown.",
|
|
11286
|
+
"attribute": "status=\"coming-soon\"",
|
|
11287
|
+
"name": "coming-soon"
|
|
11288
|
+
},
|
|
11289
|
+
{
|
|
11290
|
+
"description": "Non-interactive; dimmed.",
|
|
11291
|
+
"attribute": "disabled",
|
|
11292
|
+
"name": "disabled"
|
|
9540
11293
|
}
|
|
9541
11294
|
],
|
|
9542
11295
|
"status": "stable",
|
|
9543
11296
|
"synonyms": {
|
|
9544
|
-
"
|
|
9545
|
-
"
|
|
9546
|
-
"
|
|
9547
|
-
"
|
|
9548
|
-
|
|
11297
|
+
"connect": [
|
|
11298
|
+
"integration",
|
|
11299
|
+
"oauth",
|
|
11300
|
+
"connection"
|
|
11301
|
+
],
|
|
11302
|
+
"integration": [
|
|
11303
|
+
"integration",
|
|
11304
|
+
"connect",
|
|
11305
|
+
"provider",
|
|
11306
|
+
"third-party"
|
|
11307
|
+
],
|
|
11308
|
+
"oauth": [
|
|
11309
|
+
"integration",
|
|
11310
|
+
"connect",
|
|
11311
|
+
"auth"
|
|
11312
|
+
],
|
|
11313
|
+
"provider": [
|
|
11314
|
+
"integration",
|
|
11315
|
+
"third-party",
|
|
11316
|
+
"service"
|
|
11317
|
+
],
|
|
11318
|
+
"settings": [
|
|
11319
|
+
"settings",
|
|
11320
|
+
"integration",
|
|
11321
|
+
"account"
|
|
9549
11322
|
]
|
|
9550
11323
|
},
|
|
9551
|
-
"tag": "
|
|
9552
|
-
"tokens": {
|
|
11324
|
+
"tag": "integration-card-ui",
|
|
11325
|
+
"tokens": {
|
|
11326
|
+
"--integration-card-bg": {
|
|
11327
|
+
"description": "Card background. Defaults to `--a-bg`."
|
|
11328
|
+
},
|
|
11329
|
+
"--integration-card-border": {
|
|
11330
|
+
"description": "Card border color. Defaults to `--a-border`."
|
|
11331
|
+
},
|
|
11332
|
+
"--integration-card-description-fg": {
|
|
11333
|
+
"description": "Description text color."
|
|
11334
|
+
},
|
|
11335
|
+
"--integration-card-error-fg": {
|
|
11336
|
+
"description": "Error-message text color (used when `status=\"error\"`)."
|
|
11337
|
+
},
|
|
11338
|
+
"--integration-card-gap": {
|
|
11339
|
+
"description": "Vertical rhythm between header / body / footer."
|
|
11340
|
+
},
|
|
11341
|
+
"--integration-card-heading-fg": {
|
|
11342
|
+
"description": "Provider name color."
|
|
11343
|
+
},
|
|
11344
|
+
"--integration-card-logo-size": {
|
|
11345
|
+
"description": "Logo square dimension. Defaults to `--a-space-7`."
|
|
11346
|
+
},
|
|
11347
|
+
"--integration-card-px": {
|
|
11348
|
+
"description": "Horizontal padding. Defaults to `--a-space-4`."
|
|
11349
|
+
},
|
|
11350
|
+
"--integration-card-py": {
|
|
11351
|
+
"description": "Vertical padding. Defaults to `--a-space-4`."
|
|
11352
|
+
},
|
|
11353
|
+
"--integration-card-radius": {
|
|
11354
|
+
"description": "Card corner radius. Defaults to `--a-radius-md`."
|
|
11355
|
+
}
|
|
11356
|
+
},
|
|
9553
11357
|
"traits": [],
|
|
9554
11358
|
"version": 1
|
|
9555
11359
|
}
|
|
@@ -9986,48 +11790,323 @@
|
|
|
9986
11790
|
"description": "Optional leading icon name (Phosphor).",
|
|
9987
11791
|
"type": "string"
|
|
9988
11792
|
},
|
|
9989
|
-
"text": {
|
|
9990
|
-
"description": "Primary text. Renders as semibold inline body.",
|
|
9991
|
-
"type": "string"
|
|
9992
|
-
}
|
|
9993
|
-
},
|
|
9994
|
-
"required": [
|
|
9995
|
-
"component"
|
|
9996
|
-
],
|
|
9997
|
-
"unevaluatedProperties": false,
|
|
9998
|
-
"x-adiaui": {
|
|
9999
|
-
"anti_patterns": [],
|
|
10000
|
-
"category": "layout",
|
|
10001
|
-
"composes": [],
|
|
10002
|
-
"events": {},
|
|
10003
|
-
"examples": [],
|
|
11793
|
+
"text": {
|
|
11794
|
+
"description": "Primary text. Renders as semibold inline body.",
|
|
11795
|
+
"type": "string"
|
|
11796
|
+
}
|
|
11797
|
+
},
|
|
11798
|
+
"required": [
|
|
11799
|
+
"component"
|
|
11800
|
+
],
|
|
11801
|
+
"unevaluatedProperties": false,
|
|
11802
|
+
"x-adiaui": {
|
|
11803
|
+
"anti_patterns": [],
|
|
11804
|
+
"category": "layout",
|
|
11805
|
+
"composes": [],
|
|
11806
|
+
"events": {},
|
|
11807
|
+
"examples": [],
|
|
11808
|
+
"keywords": [
|
|
11809
|
+
"list-item",
|
|
11810
|
+
"list-row",
|
|
11811
|
+
"list-entry",
|
|
11812
|
+
"item-row",
|
|
11813
|
+
"row"
|
|
11814
|
+
],
|
|
11815
|
+
"name": "UIListItem",
|
|
11816
|
+
"related": [
|
|
11817
|
+
"List",
|
|
11818
|
+
"NavItem",
|
|
11819
|
+
"MenuItem",
|
|
11820
|
+
"TreeItem"
|
|
11821
|
+
],
|
|
11822
|
+
"slots": {},
|
|
11823
|
+
"states": [],
|
|
11824
|
+
"status": "stable",
|
|
11825
|
+
"synonyms": {
|
|
11826
|
+
"list-item": [
|
|
11827
|
+
"row",
|
|
11828
|
+
"entry",
|
|
11829
|
+
"list-row",
|
|
11830
|
+
"item"
|
|
11831
|
+
]
|
|
11832
|
+
},
|
|
11833
|
+
"tag": "list-item-ui",
|
|
11834
|
+
"tokens": {},
|
|
11835
|
+
"traits": [],
|
|
11836
|
+
"version": 1
|
|
11837
|
+
}
|
|
11838
|
+
},
|
|
11839
|
+
"ListWindow": {
|
|
11840
|
+
"title": "ListWindow",
|
|
11841
|
+
"description": "Virtualized / windowed list primitive. Renders only the visible slice of a large items[] array (chat threads, feeds, log streams, nav lists, search-result panes) — typically ≤50 DOM rows regardless of the underlying collection size. Composes a `render`-function prop OR a slotted <template> for row materialization; ships a fixed-size fast-path (constant-time index→offset math) and a variable-size measurement fallback. Distinct from <list-ui> (renders every child, preferred for short lists < 50 items) and <table-ui> (tabular data with columns). Use list-window-ui when items.length is large enough that rendering every row would block the main thread or stutter scroll.",
|
|
11842
|
+
"type": "object",
|
|
11843
|
+
"allOf": [
|
|
11844
|
+
{
|
|
11845
|
+
"$ref": "#/$defs/ComponentCommon"
|
|
11846
|
+
},
|
|
11847
|
+
{
|
|
11848
|
+
"$ref": "#/$defs/CatalogComponentCommon"
|
|
11849
|
+
}
|
|
11850
|
+
],
|
|
11851
|
+
"properties": {
|
|
11852
|
+
"items": {
|
|
11853
|
+
"description": "The items to virtualize. Required for prop-driven authoring; ignored when data-stream-src is set.",
|
|
11854
|
+
"type": "array",
|
|
11855
|
+
"default": []
|
|
11856
|
+
},
|
|
11857
|
+
"component": {
|
|
11858
|
+
"const": "ListWindow"
|
|
11859
|
+
},
|
|
11860
|
+
"direction": {
|
|
11861
|
+
"description": "Scroll axis — vertical (default) or horizontal carousel.",
|
|
11862
|
+
"type": "string",
|
|
11863
|
+
"enum": [
|
|
11864
|
+
"vertical",
|
|
11865
|
+
"horizontal"
|
|
11866
|
+
],
|
|
11867
|
+
"default": "vertical"
|
|
11868
|
+
},
|
|
11869
|
+
"estimatedSize": {
|
|
11870
|
+
"description": "Initial guess for variable-height rows. Used until the first measurement pass refines the offset cache.",
|
|
11871
|
+
"type": "number",
|
|
11872
|
+
"default": 48
|
|
11873
|
+
},
|
|
11874
|
+
"itemSize": {
|
|
11875
|
+
"description": "Fixed item height in pixels. When > 0, uses the constant-time fast path (avoids per-row measurement).",
|
|
11876
|
+
"type": "number",
|
|
11877
|
+
"default": 0
|
|
11878
|
+
},
|
|
11879
|
+
"itemSizeRem": {
|
|
11880
|
+
"description": "Fixed item height in rem. Useful for typographic-scale rows that should track the body type.",
|
|
11881
|
+
"type": "number",
|
|
11882
|
+
"default": 0
|
|
11883
|
+
},
|
|
11884
|
+
"loading": {
|
|
11885
|
+
"description": "Render skeleton rows in the visible window. Sets aria-busy=\"true\" on the host.",
|
|
11886
|
+
"type": "boolean",
|
|
11887
|
+
"default": false
|
|
11888
|
+
},
|
|
11889
|
+
"overscan": {
|
|
11890
|
+
"description": "Rows to render above + below the visible window. 0–20 is reasonable; > 50 negates the windowing benefit.",
|
|
11891
|
+
"type": "number",
|
|
11892
|
+
"default": 3
|
|
11893
|
+
},
|
|
11894
|
+
"pinBottom": {
|
|
11895
|
+
"description": "When appending items, keep scroll pinned to the bottom (chat-thread / log-tail pattern).",
|
|
11896
|
+
"type": "boolean",
|
|
11897
|
+
"default": false
|
|
11898
|
+
},
|
|
11899
|
+
"startIndex": {
|
|
11900
|
+
"description": "Index to scroll to on mount. Useful for restoring scroll position on remount.",
|
|
11901
|
+
"type": "number",
|
|
11902
|
+
"default": 0
|
|
11903
|
+
}
|
|
11904
|
+
},
|
|
11905
|
+
"required": [
|
|
11906
|
+
"component"
|
|
11907
|
+
],
|
|
11908
|
+
"unevaluatedProperties": false,
|
|
11909
|
+
"x-adiaui": {
|
|
11910
|
+
"anti_patterns": [
|
|
11911
|
+
{
|
|
11912
|
+
"fix": "{ \"component\": \"ListWindow\", \"items\": [/* 10000 items */], \"item-size\": 48 }\n",
|
|
11913
|
+
"why": "Rendering 10k items into <list-ui> blows up the DOM and main thread. Scroll\njank, mount lag, and memory pressure all degrade.\n",
|
|
11914
|
+
"wrong": "{ \"component\": \"List\", \"items\": [/* 10000 items */] }\n"
|
|
11915
|
+
},
|
|
11916
|
+
{
|
|
11917
|
+
"fix": "Wrap in a container with a height, or set style=\"height:480px\" on the\nListWindow itself.\n",
|
|
11918
|
+
"why": "Without a height bound, the scroll container has no viewport, so the windowing\nmath reports \"all items visible\" and the whole list mounts.\n",
|
|
11919
|
+
"wrong": "{ \"component\": \"ListWindow\", \"items\": [/* … */] }\n(with no parent height + no item-size + no estimated-size)\n"
|
|
11920
|
+
},
|
|
11921
|
+
{
|
|
11922
|
+
"fix": "{ \"component\": \"ListWindow\", \"overscan\": 5, \"items\": [/* … */] }\n",
|
|
11923
|
+
"why": "Overscan=200 materializes 200 rows above + below the viewport. That defeats\nthe entire point of windowing.\n",
|
|
11924
|
+
"wrong": "{ \"component\": \"ListWindow\", \"overscan\": 200, \"items\": [/* … */] }\n"
|
|
11925
|
+
}
|
|
11926
|
+
],
|
|
11927
|
+
"category": "display",
|
|
11928
|
+
"composes": [
|
|
11929
|
+
"skeleton-ui"
|
|
11930
|
+
],
|
|
11931
|
+
"events": {
|
|
11932
|
+
"item-click": {
|
|
11933
|
+
"description": "Fired when a rendered row is clicked.",
|
|
11934
|
+
"detail": {
|
|
11935
|
+
"index": {
|
|
11936
|
+
"description": "Item index in the full items[] array.",
|
|
11937
|
+
"type": "number"
|
|
11938
|
+
},
|
|
11939
|
+
"item": {
|
|
11940
|
+
"description": "The clicked item (full item-shape from items[])."
|
|
11941
|
+
}
|
|
11942
|
+
}
|
|
11943
|
+
},
|
|
11944
|
+
"measure": {
|
|
11945
|
+
"description": "Fired when a variable-height row is measured. Useful for instrumenting the offset cache.",
|
|
11946
|
+
"detail": {
|
|
11947
|
+
"height": {
|
|
11948
|
+
"description": "Measured row height in pixels.",
|
|
11949
|
+
"type": "number"
|
|
11950
|
+
},
|
|
11951
|
+
"index": {
|
|
11952
|
+
"description": "Index of the row that was measured.",
|
|
11953
|
+
"type": "number"
|
|
11954
|
+
}
|
|
11955
|
+
}
|
|
11956
|
+
},
|
|
11957
|
+
"range-change": {
|
|
11958
|
+
"description": "Fired when the visible row range (start/end indices) changes due to scroll.",
|
|
11959
|
+
"detail": {
|
|
11960
|
+
"items": {
|
|
11961
|
+
"description": "The items currently materialized in the window.",
|
|
11962
|
+
"type": "array"
|
|
11963
|
+
},
|
|
11964
|
+
"endIndex": {
|
|
11965
|
+
"description": "Last rendered row index (exclusive).",
|
|
11966
|
+
"type": "number"
|
|
11967
|
+
},
|
|
11968
|
+
"startIndex": {
|
|
11969
|
+
"description": "First rendered row index.",
|
|
11970
|
+
"type": "number"
|
|
11971
|
+
}
|
|
11972
|
+
}
|
|
11973
|
+
},
|
|
11974
|
+
"scroll-end": {
|
|
11975
|
+
"description": "Fired when the user scrolls to the bottom (within 1 viewport). Use for infinite-load patterns.",
|
|
11976
|
+
"detail": {
|
|
11977
|
+
"index": {
|
|
11978
|
+
"description": "Last visible row index.",
|
|
11979
|
+
"type": "number"
|
|
11980
|
+
}
|
|
11981
|
+
}
|
|
11982
|
+
},
|
|
11983
|
+
"scroll-start": {
|
|
11984
|
+
"description": "Fired when the user scrolls to the top (within 1 viewport). Use for \"load older\" patterns.",
|
|
11985
|
+
"detail": {
|
|
11986
|
+
"index": {
|
|
11987
|
+
"description": "First visible row index.",
|
|
11988
|
+
"type": "number"
|
|
11989
|
+
}
|
|
11990
|
+
}
|
|
11991
|
+
}
|
|
11992
|
+
},
|
|
11993
|
+
"examples": [
|
|
11994
|
+
{
|
|
11995
|
+
"description": "Virtualized chat-thread message list with declarative <template> rows.",
|
|
11996
|
+
"a2ui": "[\n {\n \"id\": \"root\",\n \"component\": \"Card\",\n \"children\": [\"thread\"]\n },\n {\n \"id\": \"thread\",\n \"component\": \"ListWindow\",\n \"item-size\": 56,\n \"overscan\": 5,\n \"pin-bottom\": true\n }\n]",
|
|
11997
|
+
"name": "chat-thread-list"
|
|
11998
|
+
},
|
|
11999
|
+
{
|
|
12000
|
+
"description": "SSE-streamed JSONL log tail with sticky-bottom pin.",
|
|
12001
|
+
"a2ui": "[\n {\n \"id\": \"logs\",\n \"component\": \"ListWindow\",\n \"item-size\": 24,\n \"pin-bottom\": true\n }\n]",
|
|
12002
|
+
"name": "log-tail-stream"
|
|
12003
|
+
}
|
|
12004
|
+
],
|
|
10004
12005
|
"keywords": [
|
|
10005
|
-
"list-
|
|
10006
|
-
"
|
|
10007
|
-
"
|
|
10008
|
-
"
|
|
10009
|
-
"
|
|
12006
|
+
"list-window",
|
|
12007
|
+
"virtualized",
|
|
12008
|
+
"windowed",
|
|
12009
|
+
"virtual-scroll",
|
|
12010
|
+
"infinite-scroll",
|
|
12011
|
+
"large-list",
|
|
12012
|
+
"feed",
|
|
12013
|
+
"chat-thread",
|
|
12014
|
+
"log-stream",
|
|
12015
|
+
"10k-rows"
|
|
10010
12016
|
],
|
|
10011
|
-
"name": "
|
|
12017
|
+
"name": "UIListWindow",
|
|
10012
12018
|
"related": [
|
|
10013
12019
|
"List",
|
|
10014
|
-
"
|
|
10015
|
-
"
|
|
10016
|
-
"
|
|
12020
|
+
"ListItem",
|
|
12021
|
+
"Feed",
|
|
12022
|
+
"ChatThread",
|
|
12023
|
+
"Table"
|
|
12024
|
+
],
|
|
12025
|
+
"slots": {
|
|
12026
|
+
"default": {
|
|
12027
|
+
"description": "A single <template> element used to clone rows (declarative-template authoring). Mutually exclusive with the render prop."
|
|
12028
|
+
},
|
|
12029
|
+
"after": {
|
|
12030
|
+
"description": "Sticky-bottom content (composer, \"load older\" button)."
|
|
12031
|
+
},
|
|
12032
|
+
"before": {
|
|
12033
|
+
"description": "Sticky-top content (filter chips, summary stat)."
|
|
12034
|
+
},
|
|
12035
|
+
"empty": {
|
|
12036
|
+
"description": "Custom empty-state content when items.length === 0."
|
|
12037
|
+
},
|
|
12038
|
+
"loading": {
|
|
12039
|
+
"description": "Custom skeleton row template; falls back to <skeleton-ui> when omitted."
|
|
12040
|
+
}
|
|
12041
|
+
},
|
|
12042
|
+
"states": [
|
|
12043
|
+
{
|
|
12044
|
+
"description": "Default — rendering and reconciling normally.",
|
|
12045
|
+
"name": "idle"
|
|
12046
|
+
},
|
|
12047
|
+
{
|
|
12048
|
+
"description": "Skeleton rows; data fetch in flight.",
|
|
12049
|
+
"attribute": "loading",
|
|
12050
|
+
"name": "loading"
|
|
12051
|
+
},
|
|
12052
|
+
{
|
|
12053
|
+
"description": "items.length === 0.",
|
|
12054
|
+
"attribute": "empty",
|
|
12055
|
+
"name": "empty"
|
|
12056
|
+
},
|
|
12057
|
+
{
|
|
12058
|
+
"description": "First-mount measurement pass on variable-height rows; suppresses scroll-end events.",
|
|
12059
|
+
"attribute": "measuring",
|
|
12060
|
+
"name": "measuring"
|
|
12061
|
+
},
|
|
12062
|
+
{
|
|
12063
|
+
"description": "Pointer events blocked.",
|
|
12064
|
+
"attribute": "disabled",
|
|
12065
|
+
"name": "disabled"
|
|
12066
|
+
}
|
|
10017
12067
|
],
|
|
10018
|
-
"slots": {},
|
|
10019
|
-
"states": [],
|
|
10020
12068
|
"status": "stable",
|
|
10021
12069
|
"synonyms": {
|
|
10022
|
-
"
|
|
10023
|
-
"
|
|
10024
|
-
"
|
|
10025
|
-
"list-
|
|
10026
|
-
|
|
12070
|
+
"infinite-scroll": [
|
|
12071
|
+
"virtualized",
|
|
12072
|
+
"virtual-scroll",
|
|
12073
|
+
"list-window"
|
|
12074
|
+
],
|
|
12075
|
+
"large-list": [
|
|
12076
|
+
"virtualized",
|
|
12077
|
+
"list-window"
|
|
12078
|
+
],
|
|
12079
|
+
"virtual-scroll": [
|
|
12080
|
+
"virtualized",
|
|
12081
|
+
"windowed",
|
|
12082
|
+
"list-window"
|
|
12083
|
+
],
|
|
12084
|
+
"virtualized": [
|
|
12085
|
+
"virtual-scroll",
|
|
12086
|
+
"windowed",
|
|
12087
|
+
"list-window"
|
|
12088
|
+
],
|
|
12089
|
+
"windowed": [
|
|
12090
|
+
"virtualized",
|
|
12091
|
+
"virtual-scroll",
|
|
12092
|
+
"list-window"
|
|
10027
12093
|
]
|
|
10028
12094
|
},
|
|
10029
|
-
"tag": "list-
|
|
10030
|
-
"tokens": {
|
|
12095
|
+
"tag": "list-window-ui",
|
|
12096
|
+
"tokens": {
|
|
12097
|
+
"--list-window-bg": {
|
|
12098
|
+
"description": "Host background (defaults to --a-bg)."
|
|
12099
|
+
},
|
|
12100
|
+
"--list-window-overscan-bg": {
|
|
12101
|
+
"description": "Visible buffer rows background — transparent by default."
|
|
12102
|
+
},
|
|
12103
|
+
"--list-window-row-gap": {
|
|
12104
|
+
"description": "Row spacing in the visible window (defaults to --a-space-1)."
|
|
12105
|
+
},
|
|
12106
|
+
"--list-window-sentinel-size": {
|
|
12107
|
+
"description": "Top + bottom IntersectionObserver-target sentinel size (defaults to --a-space-2)."
|
|
12108
|
+
}
|
|
12109
|
+
},
|
|
10031
12110
|
"traits": [],
|
|
10032
12111
|
"version": 1
|
|
10033
12112
|
}
|
|
@@ -10930,107 +13009,365 @@
|
|
|
10930
13009
|
],
|
|
10931
13010
|
"unevaluatedProperties": false,
|
|
10932
13011
|
"x-adiaui": {
|
|
10933
|
-
"anti_patterns": [],
|
|
10934
|
-
"category": "agent",
|
|
13012
|
+
"anti_patterns": [],
|
|
13013
|
+
"category": "agent",
|
|
13014
|
+
"composes": [],
|
|
13015
|
+
"events": {
|
|
13016
|
+
"noodle-connect": {
|
|
13017
|
+
"description": "Fired when a connection is created. detail: { id, from, to, fromPort, toPort }",
|
|
13018
|
+
"detail": {
|
|
13019
|
+
"from": {
|
|
13020
|
+
"description": "Source node ID.",
|
|
13021
|
+
"type": "string"
|
|
13022
|
+
},
|
|
13023
|
+
"fromPort": {
|
|
13024
|
+
"description": "Source port identifier.",
|
|
13025
|
+
"type": "string"
|
|
13026
|
+
},
|
|
13027
|
+
"id": {
|
|
13028
|
+
"description": "Connection ID.",
|
|
13029
|
+
"type": "string"
|
|
13030
|
+
},
|
|
13031
|
+
"to": {
|
|
13032
|
+
"description": "Target node ID.",
|
|
13033
|
+
"type": "string"
|
|
13034
|
+
},
|
|
13035
|
+
"toPort": {
|
|
13036
|
+
"description": "Target port identifier.",
|
|
13037
|
+
"type": "string"
|
|
13038
|
+
}
|
|
13039
|
+
}
|
|
13040
|
+
},
|
|
13041
|
+
"noodle-disconnect": {
|
|
13042
|
+
"description": "Fired when a connection is removed. detail: { id, from, to, fromPort, toPort }",
|
|
13043
|
+
"detail": {
|
|
13044
|
+
"from": {
|
|
13045
|
+
"description": "Source node ID.",
|
|
13046
|
+
"type": "string"
|
|
13047
|
+
},
|
|
13048
|
+
"fromPort": {
|
|
13049
|
+
"description": "Source port identifier.",
|
|
13050
|
+
"type": "string"
|
|
13051
|
+
},
|
|
13052
|
+
"id": {
|
|
13053
|
+
"description": "Connection ID.",
|
|
13054
|
+
"type": "string"
|
|
13055
|
+
},
|
|
13056
|
+
"to": {
|
|
13057
|
+
"description": "Target node ID.",
|
|
13058
|
+
"type": "string"
|
|
13059
|
+
},
|
|
13060
|
+
"toPort": {
|
|
13061
|
+
"description": "Target port identifier.",
|
|
13062
|
+
"type": "string"
|
|
13063
|
+
}
|
|
13064
|
+
}
|
|
13065
|
+
},
|
|
13066
|
+
"noodle-drag": {
|
|
13067
|
+
"description": "Fired during drag-to-connect. detail: { from, fromPort, x, y, reconnect }"
|
|
13068
|
+
}
|
|
13069
|
+
},
|
|
13070
|
+
"examples": [
|
|
13071
|
+
{
|
|
13072
|
+
"description": "Basic Noodles usage",
|
|
13073
|
+
"a2ui": "[\n {\n \"id\": \"root\",\n \"component\": \"Card\",\n \"children\": [\n \"sec\"\n ]\n },\n {\n \"id\": \"sec\",\n \"component\": \"Section\",\n \"children\": [\n \"comp\"\n ]\n },\n {\n \"id\": \"comp\",\n \"component\": \"Noodles\"\n }\n]",
|
|
13074
|
+
"name": "basic-noodles"
|
|
13075
|
+
}
|
|
13076
|
+
],
|
|
13077
|
+
"keywords": [
|
|
13078
|
+
"noodles"
|
|
13079
|
+
],
|
|
13080
|
+
"name": "UINoodles",
|
|
13081
|
+
"related": [
|
|
13082
|
+
"Canvas",
|
|
13083
|
+
"EditorCanvas"
|
|
13084
|
+
],
|
|
13085
|
+
"slots": {},
|
|
13086
|
+
"states": [
|
|
13087
|
+
{
|
|
13088
|
+
"description": "Default, ready for interaction.",
|
|
13089
|
+
"name": "idle"
|
|
13090
|
+
},
|
|
13091
|
+
{
|
|
13092
|
+
"description": "Non-interactive; dimmed.",
|
|
13093
|
+
"attribute": "disabled",
|
|
13094
|
+
"name": "disabled"
|
|
13095
|
+
}
|
|
13096
|
+
],
|
|
13097
|
+
"status": "stable",
|
|
13098
|
+
"synonyms": {
|
|
13099
|
+
"noodles": [
|
|
13100
|
+
"connection-curve",
|
|
13101
|
+
"wire",
|
|
13102
|
+
"edge-line",
|
|
13103
|
+
"bezier-wire"
|
|
13104
|
+
]
|
|
13105
|
+
},
|
|
13106
|
+
"tag": "noodles-ui",
|
|
13107
|
+
"tokens": {
|
|
13108
|
+
"--noodles-duration": {
|
|
13109
|
+
"description": "Transition duration for noodle animations"
|
|
13110
|
+
},
|
|
13111
|
+
"--noodles-easing": {
|
|
13112
|
+
"description": "Easing function for noodle animations"
|
|
13113
|
+
}
|
|
13114
|
+
},
|
|
13115
|
+
"traits": [],
|
|
13116
|
+
"version": 1
|
|
13117
|
+
}
|
|
13118
|
+
},
|
|
13119
|
+
"OnboardingChecklist": {
|
|
13120
|
+
"title": "OnboardingChecklist",
|
|
13121
|
+
"description": "Module-tier onboarding checklist — a progressive setup-step widget\n(\"Getting started\" card seen in Stripe / Linear / Vercel dashboards).\nComposes <progress-ui> (top fill bar), <list-ui> + <list-item-ui>\n(the step rows), <check-ui> (per-item completion checkbox), and\noptional <button-ui> (per-item action CTA).\n\nOwns the data model (items: array of {id, label, description, href,\ndone}), the persistence contract (storage-key writes a JSON blob to\nlocalStorage / sessionStorage), the auto-computed progress display,\nand the dismiss-on-complete behavior. Items are data, not slotted\nmarkup — host wiring uses stable per-item ids, not DOM positions.\n\nUse for the \"card of optional setup tasks\" case; use <step-progress-ui>\nfor horizontal multi-screen wizards where the user is locked into\nlinear progression.\n",
|
|
13122
|
+
"type": "object",
|
|
13123
|
+
"allOf": [
|
|
13124
|
+
{
|
|
13125
|
+
"$ref": "#/$defs/ComponentCommon"
|
|
13126
|
+
},
|
|
13127
|
+
{
|
|
13128
|
+
"$ref": "#/$defs/CatalogComponentCommon"
|
|
13129
|
+
}
|
|
13130
|
+
],
|
|
13131
|
+
"properties": {
|
|
13132
|
+
"title": {
|
|
13133
|
+
"description": "Header label above the progress bar. Defaults to \"Get started\".",
|
|
13134
|
+
"type": "string",
|
|
13135
|
+
"default": "Get started"
|
|
13136
|
+
},
|
|
13137
|
+
"items": {
|
|
13138
|
+
"description": "Step list — each item is { id, label, description?, href?, done? }. Required, non-empty.",
|
|
13139
|
+
"$ref": "#/$defs/DynamicStringList"
|
|
13140
|
+
},
|
|
13141
|
+
"collapsed": {
|
|
13142
|
+
"description": "Initial / current collapsed state — hides the item list, keeps progress + header visible.",
|
|
13143
|
+
"$ref": "#/$defs/DynamicBoolean"
|
|
13144
|
+
},
|
|
13145
|
+
"collapsible": {
|
|
13146
|
+
"description": "Show a top-right collapse toggle.",
|
|
13147
|
+
"type": "boolean",
|
|
13148
|
+
"default": true
|
|
13149
|
+
},
|
|
13150
|
+
"component": {
|
|
13151
|
+
"const": "OnboardingChecklist"
|
|
13152
|
+
},
|
|
13153
|
+
"dismiss-on-complete": {
|
|
13154
|
+
"description": "Auto-hide the widget when all items are done.",
|
|
13155
|
+
"type": "boolean",
|
|
13156
|
+
"default": true
|
|
13157
|
+
},
|
|
13158
|
+
"storage": {
|
|
13159
|
+
"description": "Persistence backend when storage-key is set.",
|
|
13160
|
+
"type": "string",
|
|
13161
|
+
"enum": [
|
|
13162
|
+
"local",
|
|
13163
|
+
"session",
|
|
13164
|
+
"none"
|
|
13165
|
+
],
|
|
13166
|
+
"default": "local"
|
|
13167
|
+
},
|
|
13168
|
+
"storage-key": {
|
|
13169
|
+
"description": "localStorage key for per-item completion persistence. Empty string disables storage (ephemeral).",
|
|
13170
|
+
"type": "string",
|
|
13171
|
+
"default": ""
|
|
13172
|
+
},
|
|
13173
|
+
"value": {
|
|
13174
|
+
"description": "Completion map mapping item id to boolean. When set, host owns state and storage attributes are ignored.",
|
|
13175
|
+
"type": "object",
|
|
13176
|
+
"default": {}
|
|
13177
|
+
}
|
|
13178
|
+
},
|
|
13179
|
+
"required": [
|
|
13180
|
+
"component",
|
|
13181
|
+
"items"
|
|
13182
|
+
],
|
|
13183
|
+
"unevaluatedProperties": false,
|
|
13184
|
+
"x-adiaui": {
|
|
13185
|
+
"anti_patterns": [
|
|
13186
|
+
{
|
|
13187
|
+
"fix": "{ \"component\": \"OnboardingChecklist\", \"items\": [{ \"id\": \"x\", \"label\": \"Step 1\" }] }\n",
|
|
13188
|
+
"why": "Empty checklist — renders an empty card.\n",
|
|
13189
|
+
"wrong": "{ \"component\": \"OnboardingChecklist\", \"items\": [] }\n"
|
|
13190
|
+
},
|
|
13191
|
+
{
|
|
13192
|
+
"fix": "{ \"component\": \"OnboardingChecklist\", \"items\": [\n { \"id\": \"a\", \"label\": \"Step A\" }, { \"id\": \"b\", \"label\": \"Step B\" }\n] }\n",
|
|
13193
|
+
"why": "Items missing `id`. The component cannot persist completion\nwithout stable per-item identifiers.\n",
|
|
13194
|
+
"wrong": "{ \"component\": \"OnboardingChecklist\", \"items\": [\n { \"label\": \"Step A\" }, { \"label\": \"Step B\" }\n] }\n"
|
|
13195
|
+
}
|
|
13196
|
+
],
|
|
13197
|
+
"category": "feedback",
|
|
10935
13198
|
"composes": [],
|
|
10936
13199
|
"events": {
|
|
10937
|
-
"
|
|
10938
|
-
"description": "Fired when
|
|
13200
|
+
"onboarding-complete": {
|
|
13201
|
+
"description": "Fired when all items become done.",
|
|
10939
13202
|
"detail": {
|
|
10940
|
-
"
|
|
10941
|
-
"description": "
|
|
10942
|
-
"type": "
|
|
10943
|
-
}
|
|
10944
|
-
|
|
10945
|
-
|
|
13203
|
+
"value": {
|
|
13204
|
+
"description": "The completion map at the moment of full completion.",
|
|
13205
|
+
"type": "object"
|
|
13206
|
+
}
|
|
13207
|
+
}
|
|
13208
|
+
},
|
|
13209
|
+
"onboarding-dismiss": {
|
|
13210
|
+
"description": "Fired when the widget collapses or auto-dismisses on completion.",
|
|
13211
|
+
"detail": {
|
|
13212
|
+
"reason": {
|
|
13213
|
+
"description": "Why the widget was dismissed.",
|
|
13214
|
+
"type": "string",
|
|
13215
|
+
"enum": [
|
|
13216
|
+
"collapsed",
|
|
13217
|
+
"complete"
|
|
13218
|
+
]
|
|
13219
|
+
}
|
|
13220
|
+
}
|
|
13221
|
+
},
|
|
13222
|
+
"onboarding-step-action": {
|
|
13223
|
+
"description": "Fired when the user clicks an item's action CTA.",
|
|
13224
|
+
"detail": {
|
|
13225
|
+
"href": {
|
|
13226
|
+
"description": "The href of the CTA (may be empty when host wires the click elsewhere).",
|
|
10946
13227
|
"type": "string"
|
|
10947
13228
|
},
|
|
10948
13229
|
"id": {
|
|
10949
|
-
"description": "
|
|
10950
|
-
"type": "string"
|
|
10951
|
-
},
|
|
10952
|
-
"to": {
|
|
10953
|
-
"description": "Target node ID.",
|
|
10954
|
-
"type": "string"
|
|
10955
|
-
},
|
|
10956
|
-
"toPort": {
|
|
10957
|
-
"description": "Target port identifier.",
|
|
13230
|
+
"description": "The id of the step whose CTA was clicked.",
|
|
10958
13231
|
"type": "string"
|
|
10959
13232
|
}
|
|
10960
13233
|
}
|
|
10961
13234
|
},
|
|
10962
|
-
"
|
|
10963
|
-
"description": "Fired when a
|
|
13235
|
+
"onboarding-step-complete": {
|
|
13236
|
+
"description": "Fired when a step transitions from undone to done.",
|
|
10964
13237
|
"detail": {
|
|
10965
|
-
"from": {
|
|
10966
|
-
"description": "Source node ID.",
|
|
10967
|
-
"type": "string"
|
|
10968
|
-
},
|
|
10969
|
-
"fromPort": {
|
|
10970
|
-
"description": "Source port identifier.",
|
|
10971
|
-
"type": "string"
|
|
10972
|
-
},
|
|
10973
13238
|
"id": {
|
|
10974
|
-
"description": "
|
|
10975
|
-
"type": "string"
|
|
10976
|
-
},
|
|
10977
|
-
"to": {
|
|
10978
|
-
"description": "Target node ID.",
|
|
13239
|
+
"description": "The id of the step that just completed.",
|
|
10979
13240
|
"type": "string"
|
|
10980
13241
|
},
|
|
10981
|
-
"
|
|
10982
|
-
"description": "
|
|
10983
|
-
"type": "
|
|
13242
|
+
"value": {
|
|
13243
|
+
"description": "Snapshot of the full completion map after the change.",
|
|
13244
|
+
"type": "object"
|
|
10984
13245
|
}
|
|
10985
13246
|
}
|
|
10986
|
-
},
|
|
10987
|
-
"noodle-drag": {
|
|
10988
|
-
"description": "Fired during drag-to-connect. detail: { from, fromPort, x, y, reconnect }"
|
|
10989
13247
|
}
|
|
10990
13248
|
},
|
|
10991
13249
|
"examples": [
|
|
10992
13250
|
{
|
|
10993
|
-
"description": "
|
|
10994
|
-
"a2ui": "[\n {\n \"id\": \"
|
|
10995
|
-
"name": "basic-
|
|
13251
|
+
"description": "Three-step dashboard setup card.",
|
|
13252
|
+
"a2ui": "[\n {\n \"id\": \"onb-1\",\n \"component\": \"OnboardingChecklist\",\n \"storageKey\": \"acme:onboarding:v1\",\n \"items\": [\n { \"id\": \"profile\", \"label\": \"Complete your profile\", \"description\": \"Add a photo and bio\", \"href\": \"/settings/profile\" },\n { \"id\": \"team\", \"label\": \"Invite your team\", \"description\": \"Add at least one teammate\", \"href\": \"/settings/team\" },\n { \"id\": \"connect\", \"label\": \"Connect a data source\", \"description\": \"Hook up the first integration\", \"href\": \"/integrations\" }\n ]\n }\n]\n",
|
|
13253
|
+
"name": "basic-checklist"
|
|
10996
13254
|
}
|
|
10997
13255
|
],
|
|
10998
13256
|
"keywords": [
|
|
10999
|
-
"
|
|
13257
|
+
"onboarding",
|
|
13258
|
+
"checklist",
|
|
13259
|
+
"getting-started",
|
|
13260
|
+
"setup",
|
|
13261
|
+
"steps",
|
|
13262
|
+
"progress",
|
|
13263
|
+
"getting started"
|
|
11000
13264
|
],
|
|
11001
|
-
"name": "
|
|
13265
|
+
"name": "UIOnboardingChecklist",
|
|
11002
13266
|
"related": [
|
|
11003
|
-
"
|
|
11004
|
-
"
|
|
13267
|
+
"Check",
|
|
13268
|
+
"List",
|
|
13269
|
+
"ListItem",
|
|
13270
|
+
"Progress",
|
|
13271
|
+
"Button",
|
|
13272
|
+
"StepProgress"
|
|
11005
13273
|
],
|
|
11006
|
-
"slots": {
|
|
13274
|
+
"slots": {
|
|
13275
|
+
"complete": {
|
|
13276
|
+
"description": "Content shown when all items are done and dismiss-on-complete is false."
|
|
13277
|
+
},
|
|
13278
|
+
"footer": {
|
|
13279
|
+
"description": "Optional footer content (e.g. \"Skip for now\" link / button)."
|
|
13280
|
+
},
|
|
13281
|
+
"header": {
|
|
13282
|
+
"description": "Custom title region above the progress bar. Overrides the default [title] attribute label."
|
|
13283
|
+
}
|
|
13284
|
+
},
|
|
11007
13285
|
"states": [
|
|
11008
13286
|
{
|
|
11009
|
-
"description": "
|
|
13287
|
+
"description": "Some items incomplete; widget visible and expanded.",
|
|
11010
13288
|
"name": "idle"
|
|
11011
13289
|
},
|
|
11012
13290
|
{
|
|
11013
|
-
"description": "
|
|
11014
|
-
"attribute": "
|
|
11015
|
-
"name": "
|
|
13291
|
+
"description": "Item list hidden; header + progress visible.",
|
|
13292
|
+
"attribute": "collapsed",
|
|
13293
|
+
"name": "collapsed"
|
|
13294
|
+
},
|
|
13295
|
+
{
|
|
13296
|
+
"description": "All items done. Behavior depends on dismiss-on-complete.",
|
|
13297
|
+
"attribute": "data-complete",
|
|
13298
|
+
"name": "complete"
|
|
13299
|
+
},
|
|
13300
|
+
{
|
|
13301
|
+
"description": "Widget removed from layout after collapse or auto-dismiss.",
|
|
13302
|
+
"attribute": "hidden",
|
|
13303
|
+
"name": "dismissed"
|
|
11016
13304
|
}
|
|
11017
13305
|
],
|
|
11018
13306
|
"status": "stable",
|
|
11019
13307
|
"synonyms": {
|
|
11020
|
-
"
|
|
11021
|
-
"
|
|
11022
|
-
"
|
|
11023
|
-
"
|
|
11024
|
-
|
|
13308
|
+
"checklist": [
|
|
13309
|
+
"todo",
|
|
13310
|
+
"task-list",
|
|
13311
|
+
"steps"
|
|
13312
|
+
],
|
|
13313
|
+
"getting-started": [
|
|
13314
|
+
"onboarding",
|
|
13315
|
+
"setup",
|
|
13316
|
+
"welcome"
|
|
13317
|
+
],
|
|
13318
|
+
"onboarding": [
|
|
13319
|
+
"getting-started",
|
|
13320
|
+
"setup",
|
|
13321
|
+
"welcome",
|
|
13322
|
+
"kickoff"
|
|
13323
|
+
],
|
|
13324
|
+
"setup": [
|
|
13325
|
+
"onboarding",
|
|
13326
|
+
"getting-started",
|
|
13327
|
+
"configuration"
|
|
11025
13328
|
]
|
|
11026
13329
|
},
|
|
11027
|
-
"tag": "
|
|
13330
|
+
"tag": "onboarding-checklist-ui",
|
|
11028
13331
|
"tokens": {
|
|
11029
|
-
"--
|
|
11030
|
-
"description": "
|
|
13332
|
+
"--onboarding-checklist-bg": {
|
|
13333
|
+
"description": "Card background. Defaults to elevated canvas tier.",
|
|
13334
|
+
"default": "var(--a-canvas-1)"
|
|
11031
13335
|
},
|
|
11032
|
-
"--
|
|
11033
|
-
"description": "
|
|
13336
|
+
"--onboarding-checklist-border": {
|
|
13337
|
+
"description": "Outer border.",
|
|
13338
|
+
"default": "1px solid var(--a-border-subtle)"
|
|
13339
|
+
},
|
|
13340
|
+
"--onboarding-checklist-fg": {
|
|
13341
|
+
"description": "Primary foreground color.",
|
|
13342
|
+
"default": "var(--a-fg)"
|
|
13343
|
+
},
|
|
13344
|
+
"--onboarding-checklist-fg-muted": {
|
|
13345
|
+
"description": "Secondary foreground color for descriptions + meta.",
|
|
13346
|
+
"default": "var(--a-fg-muted)"
|
|
13347
|
+
},
|
|
13348
|
+
"--onboarding-checklist-gap": {
|
|
13349
|
+
"description": "Gap between header / progress / items / footer.",
|
|
13350
|
+
"default": "var(--a-space-3)"
|
|
13351
|
+
},
|
|
13352
|
+
"--onboarding-checklist-progress-fill": {
|
|
13353
|
+
"description": "Progress-bar fill color (forwarded to inner <progress-ui> via --progress-fill).",
|
|
13354
|
+
"default": "var(--a-accent)"
|
|
13355
|
+
},
|
|
13356
|
+
"--onboarding-checklist-px": {
|
|
13357
|
+
"description": "Inline (left/right) padding.",
|
|
13358
|
+
"default": "var(--a-space-4)"
|
|
13359
|
+
},
|
|
13360
|
+
"--onboarding-checklist-py": {
|
|
13361
|
+
"description": "Block (top/bottom) padding.",
|
|
13362
|
+
"default": "var(--a-space-4)"
|
|
13363
|
+
},
|
|
13364
|
+
"--onboarding-checklist-radius": {
|
|
13365
|
+
"description": "Outer card radius.",
|
|
13366
|
+
"default": "var(--a-radius-lg)"
|
|
13367
|
+
},
|
|
13368
|
+
"--onboarding-checklist-shadow": {
|
|
13369
|
+
"description": "Card elevation.",
|
|
13370
|
+
"default": "var(--a-shadow-sm)"
|
|
11034
13371
|
}
|
|
11035
13372
|
},
|
|
11036
13373
|
"traits": [],
|
|
@@ -14215,84 +16552,279 @@
|
|
|
14215
16552
|
"change": {
|
|
14216
16553
|
"description": "Fired when the value changes (on blur for inputs, on selection for pickers)."
|
|
14217
16554
|
},
|
|
14218
|
-
"input": {
|
|
14219
|
-
"description": "Fired on each slider movement"
|
|
16555
|
+
"input": {
|
|
16556
|
+
"description": "Fired on each slider movement"
|
|
16557
|
+
}
|
|
16558
|
+
},
|
|
16559
|
+
"examples": [
|
|
16560
|
+
{
|
|
16561
|
+
"description": "Card with labeled slider components for adjusting values like volume, brightness, and contrast.",
|
|
16562
|
+
"a2ui": "[\n {\n \"id\": \"root\",\n \"component\": \"Card\",\n \"children\": [\n \"hdr\",\n \"sec\"\n ]\n },\n {\n \"id\": \"hdr\",\n \"component\": \"Header\",\n \"children\": [\n \"title\"\n ]\n },\n {\n \"id\": \"title\",\n \"component\": \"Text\",\n \"slot\": \"heading\",\n \"textContent\": \"Audio & Display\",\n \"variant\": \"section\"\n },\n {\n \"id\": \"sec\",\n \"component\": \"Section\",\n \"children\": [\n \"sliders\"\n ]\n },\n {\n \"id\": \"sliders\",\n \"component\": \"Column\",\n \"children\": [\n \"volume\",\n \"brightness\",\n \"contrast\"\n ],\n \"gap\": \"6\"\n },\n {\n \"id\": \"volume\",\n \"component\": \"Slider\",\n \"label\": \"Volume\",\n \"min\": 0,\n \"max\": 100,\n \"value\": 75,\n \"name\": \"volume\"\n },\n {\n \"id\": \"brightness\",\n \"component\": \"Slider\",\n \"label\": \"Brightness\",\n \"min\": 0,\n \"max\": 100,\n \"value\": 50,\n \"name\": \"brightness\"\n },\n {\n \"id\": \"contrast\",\n \"component\": \"Slider\",\n \"label\": \"Contrast\",\n \"min\": 0,\n \"max\": 100,\n \"value\": 60,\n \"name\": \"contrast\"\n }\n]",
|
|
16563
|
+
"name": "slider-range"
|
|
16564
|
+
},
|
|
16565
|
+
{
|
|
16566
|
+
"description": "Card with color pickers, theme select, density slider, and preview area for theme customization.",
|
|
16567
|
+
"a2ui": "[\n {\n \"id\": \"root\",\n \"component\": \"Card\",\n \"size\": \"lg\",\n \"children\": [\n \"hdr\",\n \"sec\",\n \"ftr\"\n ]\n },\n {\n \"id\": \"hdr\",\n \"component\": \"Header\",\n \"children\": [\n \"title\",\n \"desc\"\n ]\n },\n {\n \"id\": \"title\",\n \"component\": \"Text\",\n \"slot\": \"heading\",\n \"textContent\": \"Theme Customizer\",\n \"variant\": \"section\"\n },\n {\n \"id\": \"desc\",\n \"component\": \"Text\",\n \"slot\": \"description\",\n \"variant\": \"caption\",\n \"textContent\": \"Personalize your interface appearance\"\n },\n {\n \"id\": \"sec\",\n \"component\": \"Section\",\n \"children\": [\n \"fields\"\n ]\n },\n {\n \"id\": \"fields\",\n \"component\": \"Column\",\n \"children\": [\n \"colors-row\",\n \"theme-select\",\n \"density\",\n \"preview-label\"\n ],\n \"gap\": \"4\"\n },\n {\n \"id\": \"colors-row\",\n \"component\": \"Row\",\n \"children\": [\n \"primary-color\",\n \"accent-color\"\n ],\n \"gap\": \"3\"\n },\n {\n \"id\": \"primary-color\",\n \"component\": \"Input\",\n \"label\": \"Primary Color\",\n \"type\": \"color\",\n \"name\": \"primaryColor\",\n \"value\": \"#6366f1\"\n },\n {\n \"id\": \"accent-color\",\n \"component\": \"Input\",\n \"label\": \"Accent Color\",\n \"type\": \"color\",\n \"name\": \"accentColor\",\n \"value\": \"#f59e0b\"\n },\n {\n \"id\": \"theme-select\",\n \"component\": \"Select\",\n \"label\": \"Theme\",\n \"name\": \"theme\",\n \"placeholder\": \"Select theme...\"\n },\n {\n \"id\": \"density\",\n \"component\": \"Slider\",\n \"label\": \"Density\",\n \"min\": 1,\n \"max\": 5,\n \"value\": 3,\n \"name\": \"density\"\n },\n {\n \"id\": \"preview-label\",\n \"component\": \"Text\",\n \"variant\": \"caption\",\n \"textContent\": \"Preview will update in real time\"\n },\n {\n \"id\": \"ftr\",\n \"component\": \"Footer\",\n \"children\": [\n \"reset-btn\",\n \"save-btn\"\n ]\n },\n {\n \"id\": \"reset-btn\",\n \"component\": \"Button\",\n \"text\": \"Reset to Default\",\n \"variant\": \"ghost\"\n },\n {\n \"id\": \"save-btn\",\n \"component\": \"Button\",\n \"text\": \"Save Theme\",\n \"variant\": \"primary\"\n }\n]",
|
|
16568
|
+
"name": "theme-customizer"
|
|
16569
|
+
}
|
|
16570
|
+
],
|
|
16571
|
+
"keywords": [
|
|
16572
|
+
"slider",
|
|
16573
|
+
"range",
|
|
16574
|
+
"volume"
|
|
16575
|
+
],
|
|
16576
|
+
"name": "UISlider",
|
|
16577
|
+
"related": [
|
|
16578
|
+
"input",
|
|
16579
|
+
"select",
|
|
16580
|
+
"button",
|
|
16581
|
+
"embed"
|
|
16582
|
+
],
|
|
16583
|
+
"slots": {
|
|
16584
|
+
"input": {
|
|
16585
|
+
"description": "Native range input element"
|
|
16586
|
+
},
|
|
16587
|
+
"label": {
|
|
16588
|
+
"description": "Label element above the slider"
|
|
16589
|
+
},
|
|
16590
|
+
"value": {
|
|
16591
|
+
"description": "Current value display"
|
|
16592
|
+
}
|
|
16593
|
+
},
|
|
16594
|
+
"states": [
|
|
16595
|
+
{
|
|
16596
|
+
"description": "Default, ready for interaction.",
|
|
16597
|
+
"name": "idle"
|
|
16598
|
+
},
|
|
16599
|
+
{
|
|
16600
|
+
"description": "Non-interactive; dimmed.",
|
|
16601
|
+
"attribute": "disabled",
|
|
16602
|
+
"name": "disabled"
|
|
16603
|
+
}
|
|
16604
|
+
],
|
|
16605
|
+
"status": "stable",
|
|
16606
|
+
"synonyms": {
|
|
16607
|
+
"range": [
|
|
16608
|
+
"slider",
|
|
16609
|
+
"range"
|
|
16610
|
+
],
|
|
16611
|
+
"volume": [
|
|
16612
|
+
"slider",
|
|
16613
|
+
"range",
|
|
16614
|
+
"music"
|
|
16615
|
+
]
|
|
16616
|
+
},
|
|
16617
|
+
"tag": "slider-ui",
|
|
16618
|
+
"tokens": {
|
|
16619
|
+
"--slider-fill": {
|
|
16620
|
+
"description": "Filled portion / progress color (was mixed accent, now primary)"
|
|
16621
|
+
},
|
|
16622
|
+
"--slider-thumb-height": {
|
|
16623
|
+
"description": "Thumb pill height (track-height − 2× inset)"
|
|
16624
|
+
},
|
|
16625
|
+
"--slider-thumb-width": {
|
|
16626
|
+
"description": "Thumb pill width (2× thumb-height, driven by track-height)"
|
|
16627
|
+
},
|
|
16628
|
+
"--slider-track": {
|
|
16629
|
+
"description": "Unfilled track background color"
|
|
16630
|
+
},
|
|
16631
|
+
"--slider-track-height": {
|
|
16632
|
+
"description": "Full track height (scales via universal [size] attribute)"
|
|
16633
|
+
}
|
|
16634
|
+
},
|
|
16635
|
+
"traits": [],
|
|
16636
|
+
"version": 1
|
|
16637
|
+
}
|
|
16638
|
+
},
|
|
16639
|
+
"Spinner": {
|
|
16640
|
+
"title": "Spinner",
|
|
16641
|
+
"description": "Circular animated indicator for indeterminate loading. Renders a rotating arc, full ring, or three bouncing dots inside a sized box; the animation runs while the element is in the DOM and `[paused]` is unset. Fills the circular-spinner gap left by <skeleton-ui> (rectangular placeholder) and <progress-ui> (linear determinate bar) — use <spinner-ui> when the wait duration is unknown and the shape of the eventual content is irregular or the region is too small for a placeholder block.",
|
|
16642
|
+
"type": "object",
|
|
16643
|
+
"allOf": [
|
|
16644
|
+
{
|
|
16645
|
+
"$ref": "#/$defs/ComponentCommon"
|
|
16646
|
+
},
|
|
16647
|
+
{
|
|
16648
|
+
"$ref": "#/$defs/CatalogComponentCommon"
|
|
16649
|
+
}
|
|
16650
|
+
],
|
|
16651
|
+
"properties": {
|
|
16652
|
+
"component": {
|
|
16653
|
+
"const": "Spinner"
|
|
16654
|
+
},
|
|
16655
|
+
"label": {
|
|
16656
|
+
"description": "Accessible operation name surfaced via `aria-valuetext`. Override for context-specific labels (\"Saving\", \"Uploading\").",
|
|
16657
|
+
"type": "string",
|
|
16658
|
+
"default": "Loading"
|
|
16659
|
+
},
|
|
16660
|
+
"paused": {
|
|
16661
|
+
"description": "Pause the animation in-place. Useful for screenshot tests and explicit-control flows.",
|
|
16662
|
+
"type": "boolean",
|
|
16663
|
+
"default": false
|
|
16664
|
+
},
|
|
16665
|
+
"size": {
|
|
16666
|
+
"description": "Diameter — matches icon-ui's ladder (sm 14px, md 16px, lg 20px).",
|
|
16667
|
+
"type": "string",
|
|
16668
|
+
"enum": [
|
|
16669
|
+
"sm",
|
|
16670
|
+
"md",
|
|
16671
|
+
"lg"
|
|
16672
|
+
],
|
|
16673
|
+
"default": "md"
|
|
16674
|
+
},
|
|
16675
|
+
"tone": {
|
|
16676
|
+
"description": "Color tone — `current` inherits parent text color (matches button label), `accent` uses brand accent, `subtle` is muted, `inverse` flips for on-accent surfaces.",
|
|
16677
|
+
"type": "string",
|
|
16678
|
+
"enum": [
|
|
16679
|
+
"current",
|
|
16680
|
+
"accent",
|
|
16681
|
+
"subtle",
|
|
16682
|
+
"inverse"
|
|
16683
|
+
],
|
|
16684
|
+
"default": "current"
|
|
16685
|
+
},
|
|
16686
|
+
"variant": {
|
|
16687
|
+
"description": "Visual flavor — arc (rotating quarter-circle), ring (full ring with one colored segment), dots (three bouncing dots).",
|
|
16688
|
+
"type": "string",
|
|
16689
|
+
"enum": [
|
|
16690
|
+
"arc",
|
|
16691
|
+
"ring",
|
|
16692
|
+
"dots"
|
|
16693
|
+
],
|
|
16694
|
+
"default": "arc"
|
|
16695
|
+
}
|
|
16696
|
+
},
|
|
16697
|
+
"required": [
|
|
16698
|
+
"component"
|
|
16699
|
+
],
|
|
16700
|
+
"unevaluatedProperties": false,
|
|
16701
|
+
"x-adiaui": {
|
|
16702
|
+
"anti_patterns": [
|
|
16703
|
+
{
|
|
16704
|
+
"fix": "{\"component\": \"Progress\", \"value\": 42, \"max\": 100}\n",
|
|
16705
|
+
"why": "Spinner is INDETERMINATE only. `value` and any quantitative\nprogress field belongs on Progress, not Spinner. Also \"Spin\" is\nnot a valid operation label.\n",
|
|
16706
|
+
"wrong": "{\"component\": \"Spinner\", \"label\": \"Spin\", \"value\": 0.42}\n"
|
|
16707
|
+
},
|
|
16708
|
+
{
|
|
16709
|
+
"fix": "{\"component\": \"Spinner\", \"size\": \"md\"}\n",
|
|
16710
|
+
"why": "Skeleton is a placeholder; rotation is not part of its contract.\nA rotating circle is a Spinner.\n",
|
|
16711
|
+
"wrong": "{\"component\": \"Skeleton\", \"variant\": \"circle\", \"animation\": \"rotate\"}\n"
|
|
16712
|
+
},
|
|
16713
|
+
{
|
|
16714
|
+
"fix": "{\"component\": \"Card\", \"children\": [\n {\"component\": \"Spinner\", \"size\": \"lg\"}\n]}\n",
|
|
16715
|
+
"why": "Multiple sibling spinners in one region produce visual noise\nwithout extra information. Use one parent-level Spinner.\n",
|
|
16716
|
+
"wrong": "{\"component\": \"Card\", \"children\": [\n {\"component\": \"Spinner\"},\n {\"component\": \"Spinner\"},\n {\"component\": \"Spinner\"}\n]}\n"
|
|
14220
16717
|
}
|
|
14221
|
-
|
|
16718
|
+
],
|
|
16719
|
+
"category": "feedback",
|
|
16720
|
+
"composes": [],
|
|
16721
|
+
"events": {},
|
|
14222
16722
|
"examples": [
|
|
14223
16723
|
{
|
|
14224
|
-
"description": "
|
|
14225
|
-
"a2ui": "[\n {\n \"id\": \"
|
|
14226
|
-
"name": "
|
|
16724
|
+
"description": "Loading button — primary action with a saving spinner. The button is disabled while the operation is in progress; the spinner matches the button label color via tone=\"current\".",
|
|
16725
|
+
"a2ui": "[\n {\n \"id\": \"btn-save\",\n \"component\": \"Button\",\n \"text\": \"Saving\",\n \"variant\": \"primary\",\n \"disabled\": true,\n \"children\": [\"sp-1\"]\n },\n {\n \"id\": \"sp-1\",\n \"component\": \"Spinner\",\n \"size\": \"sm\",\n \"tone\": \"current\",\n \"label\": \"Saving\"\n }\n]",
|
|
16726
|
+
"name": "button-saving"
|
|
14227
16727
|
},
|
|
14228
16728
|
{
|
|
14229
|
-
"description": "
|
|
14230
|
-
"a2ui": "[\n {\n \"id\": \"
|
|
14231
|
-
"name": "
|
|
16729
|
+
"description": "Standalone centered spinner inside a card while body content fetches.",
|
|
16730
|
+
"a2ui": "[\n {\n \"id\": \"card\",\n \"component\": \"Card\",\n \"children\": [\"row\"]\n },\n {\n \"id\": \"row\",\n \"component\": \"Row\",\n \"justify\": \"center\",\n \"align\": \"center\",\n \"children\": [\"sp\"]\n },\n {\n \"id\": \"sp\",\n \"component\": \"Spinner\",\n \"size\": \"lg\",\n \"tone\": \"subtle\",\n \"label\": \"Loading dashboard\"\n }\n]",
|
|
16731
|
+
"name": "centered-card-loading"
|
|
16732
|
+
},
|
|
16733
|
+
{
|
|
16734
|
+
"description": "Three bouncing dots — good for chat / typing indicators.",
|
|
16735
|
+
"a2ui": "[\n {\n \"id\": \"sp\",\n \"component\": \"Spinner\",\n \"variant\": \"dots\",\n \"tone\": \"subtle\",\n \"label\": \"Assistant is typing\"\n }\n]",
|
|
16736
|
+
"name": "typing-indicator"
|
|
14232
16737
|
}
|
|
14233
16738
|
],
|
|
14234
16739
|
"keywords": [
|
|
14235
|
-
"
|
|
14236
|
-
"
|
|
14237
|
-
"
|
|
16740
|
+
"spinner",
|
|
16741
|
+
"loader",
|
|
16742
|
+
"loading",
|
|
16743
|
+
"indeterminate",
|
|
16744
|
+
"progress",
|
|
16745
|
+
"busy",
|
|
16746
|
+
"feedback",
|
|
16747
|
+
"circular"
|
|
14238
16748
|
],
|
|
14239
|
-
"name": "
|
|
16749
|
+
"name": "UISpinner",
|
|
14240
16750
|
"related": [
|
|
14241
|
-
"
|
|
14242
|
-
"
|
|
14243
|
-
"
|
|
14244
|
-
"
|
|
16751
|
+
"Progress",
|
|
16752
|
+
"Skeleton",
|
|
16753
|
+
"Button",
|
|
16754
|
+
"EmptyState"
|
|
14245
16755
|
],
|
|
14246
|
-
"slots": {
|
|
14247
|
-
"input": {
|
|
14248
|
-
"description": "Native range input element"
|
|
14249
|
-
},
|
|
14250
|
-
"label": {
|
|
14251
|
-
"description": "Label element above the slider"
|
|
14252
|
-
},
|
|
14253
|
-
"value": {
|
|
14254
|
-
"description": "Current value display"
|
|
14255
|
-
}
|
|
14256
|
-
},
|
|
16756
|
+
"slots": {},
|
|
14257
16757
|
"states": [
|
|
14258
16758
|
{
|
|
14259
|
-
"description": "Default
|
|
14260
|
-
"name": "
|
|
16759
|
+
"description": "Default; animation active.",
|
|
16760
|
+
"name": "running"
|
|
14261
16761
|
},
|
|
14262
16762
|
{
|
|
14263
|
-
"description": "
|
|
14264
|
-
"attribute": "
|
|
14265
|
-
"name": "
|
|
16763
|
+
"description": "Animation frozen at the current frame.",
|
|
16764
|
+
"attribute": "paused",
|
|
16765
|
+
"name": "paused"
|
|
16766
|
+
},
|
|
16767
|
+
{
|
|
16768
|
+
"description": "Triggered by prefers-reduced-motion. Animation replaced with a static ellipsis. Detected via CSS, not JS.",
|
|
16769
|
+
"name": "reduced"
|
|
14266
16770
|
}
|
|
14267
16771
|
],
|
|
14268
16772
|
"status": "stable",
|
|
14269
16773
|
"synonyms": {
|
|
14270
|
-
"
|
|
14271
|
-
"
|
|
14272
|
-
"
|
|
16774
|
+
"busy": [
|
|
16775
|
+
"spinner",
|
|
16776
|
+
"loading"
|
|
14273
16777
|
],
|
|
14274
|
-
"
|
|
14275
|
-
"
|
|
14276
|
-
"
|
|
14277
|
-
|
|
16778
|
+
"indeterminate": [
|
|
16779
|
+
"spinner",
|
|
16780
|
+
"progress"
|
|
16781
|
+
],
|
|
16782
|
+
"loader": [
|
|
16783
|
+
"spinner",
|
|
16784
|
+
"loading",
|
|
16785
|
+
"progress"
|
|
16786
|
+
],
|
|
16787
|
+
"loading": [
|
|
16788
|
+
"spinner",
|
|
16789
|
+
"loading",
|
|
16790
|
+
"progress",
|
|
16791
|
+
"skeleton"
|
|
16792
|
+
],
|
|
16793
|
+
"saving": [
|
|
16794
|
+
"spinner",
|
|
16795
|
+
"loading"
|
|
16796
|
+
],
|
|
16797
|
+
"spinner": [
|
|
16798
|
+
"spinner",
|
|
16799
|
+
"loader",
|
|
16800
|
+
"progress"
|
|
16801
|
+
],
|
|
16802
|
+
"uploading": [
|
|
16803
|
+
"spinner",
|
|
16804
|
+
"loading"
|
|
14278
16805
|
]
|
|
14279
16806
|
},
|
|
14280
|
-
"tag": "
|
|
16807
|
+
"tag": "spinner-ui",
|
|
14281
16808
|
"tokens": {
|
|
14282
|
-
"--
|
|
14283
|
-
"description": "
|
|
16809
|
+
"--spinner-color": {
|
|
16810
|
+
"description": "Color of the active arc / ring / dots. Defaults to currentColor so a tone-driven cascade resolves naturally.",
|
|
16811
|
+
"default": "currentColor"
|
|
14284
16812
|
},
|
|
14285
|
-
"--
|
|
14286
|
-
"description": "
|
|
16813
|
+
"--spinner-duration": {
|
|
16814
|
+
"description": "One full rotation duration.",
|
|
16815
|
+
"default": "var(--a-duration-slow)"
|
|
14287
16816
|
},
|
|
14288
|
-
"--
|
|
14289
|
-
"description": "
|
|
16817
|
+
"--spinner-size": {
|
|
16818
|
+
"description": "Diameter of the spinner box.",
|
|
16819
|
+
"default": "1rem"
|
|
14290
16820
|
},
|
|
14291
|
-
"--
|
|
14292
|
-
"description": "
|
|
16821
|
+
"--spinner-stroke": {
|
|
16822
|
+
"description": "Border thickness for the arc / ring variants.",
|
|
16823
|
+
"default": "2px"
|
|
14293
16824
|
},
|
|
14294
|
-
"--
|
|
14295
|
-
"description": "
|
|
16825
|
+
"--spinner-track-opacity": {
|
|
16826
|
+
"description": "Opacity for the non-rotating ring track (variant=ring only).",
|
|
16827
|
+
"default": "0.25"
|
|
14296
16828
|
}
|
|
14297
16829
|
},
|
|
14298
16830
|
"traits": [],
|
|
@@ -15685,7 +18217,7 @@
|
|
|
15685
18217
|
"default": 0
|
|
15686
18218
|
},
|
|
15687
18219
|
"raw": {
|
|
15688
|
-
"description": "
|
|
18220
|
+
"description": "Visual-only passthrough — applies `<table-ui>`'s chrome reset (background / border / border-radius all transparent) AND short-circuits the data lifecycle entirely. The consumer owns the body shape: no header injection, no row reconciliation from `.data`, no empty-state / loading overlays, no aggregation or pagination footers. Use raw when embedding `<table-ui>` inside surfaces that supply their own chrome (e.g. `<card-ui><section bleed>`), or when wrapping a consumer-authored native `<table>` for design-token styling without the framework's data semantics. Pre-v0.6.33 (FB-53 §2) `raw` was visual-only and the data lifecycle still ran — wrapping a `.data`-unset native table produced a phantom \"No data\" overlay. v0.6.33+ matches the documented contract.",
|
|
15689
18221
|
"type": "boolean",
|
|
15690
18222
|
"default": false
|
|
15691
18223
|
},
|
|
@@ -17430,6 +19962,271 @@
|
|
|
17430
19962
|
"version": 1
|
|
17431
19963
|
}
|
|
17432
19964
|
},
|
|
19965
|
+
"TimePicker": {
|
|
19966
|
+
"title": "TimePicker",
|
|
19967
|
+
"description": "Time-of-day picker with discrete segments (hour, minute, optional second, optional AM/PM). Each segment follows the WAI-ARIA Spinbutton pattern with Arrow-key increment/decrement, Page Up/Down for larger jumps, Home/End for segment min/max, and Tab to move between segments. Form-associated input emitting ISO 8601 time string (\"HH:mm\" or \"HH:mm:ss\") via change events. Per ADR-0025 no native form controls — segments are contenteditable spans inside a custom host. SPEC-043.",
|
|
19968
|
+
"type": "object",
|
|
19969
|
+
"allOf": [
|
|
19970
|
+
{
|
|
19971
|
+
"$ref": "#/$defs/ComponentCommon"
|
|
19972
|
+
},
|
|
19973
|
+
{
|
|
19974
|
+
"$ref": "#/$defs/CatalogComponentCommon"
|
|
19975
|
+
}
|
|
19976
|
+
],
|
|
19977
|
+
"properties": {
|
|
19978
|
+
"required": {
|
|
19979
|
+
"description": "Marks the field as required for form validation. Sets aria-required.",
|
|
19980
|
+
"type": "boolean",
|
|
19981
|
+
"default": false
|
|
19982
|
+
},
|
|
19983
|
+
"component": {
|
|
19984
|
+
"const": "TimePicker"
|
|
19985
|
+
},
|
|
19986
|
+
"disabled": {
|
|
19987
|
+
"description": "Disables interaction; dims the control",
|
|
19988
|
+
"type": "boolean",
|
|
19989
|
+
"default": false
|
|
19990
|
+
},
|
|
19991
|
+
"hourcycle": {
|
|
19992
|
+
"description": "Hour cycle. Empty (default) derives from the document locale — most\nen-* locales resolve to `h23`. `h12` forces a 12-hour cycle with an\nAM/PM (meridiem) segment; `h23` forces 24-hour cycle.\n",
|
|
19993
|
+
"type": "string",
|
|
19994
|
+
"enum": [
|
|
19995
|
+
"",
|
|
19996
|
+
"h12",
|
|
19997
|
+
"h23"
|
|
19998
|
+
],
|
|
19999
|
+
"default": ""
|
|
20000
|
+
},
|
|
20001
|
+
"locale": {
|
|
20002
|
+
"description": "BCP-47 locale tag used to derive hour-cycle when `hour-cycle` is empty. Falls back to `<html lang>` then to browser default.",
|
|
20003
|
+
"type": "string",
|
|
20004
|
+
"default": ""
|
|
20005
|
+
},
|
|
20006
|
+
"max": {
|
|
20007
|
+
"description": "Latest selectable time as ISO 8601. Empty disables the constraint.",
|
|
20008
|
+
"type": "string",
|
|
20009
|
+
"default": ""
|
|
20010
|
+
},
|
|
20011
|
+
"min": {
|
|
20012
|
+
"description": "Earliest selectable time as ISO 8601. Empty disables the constraint.",
|
|
20013
|
+
"type": "string",
|
|
20014
|
+
"default": ""
|
|
20015
|
+
},
|
|
20016
|
+
"name": {
|
|
20017
|
+
"description": "Form field name for FormData submission",
|
|
20018
|
+
"type": "string",
|
|
20019
|
+
"default": ""
|
|
20020
|
+
},
|
|
20021
|
+
"placeholder": {
|
|
20022
|
+
"description": "Per-segment placeholder text shown when a segment is empty. Defaults to \"--\".",
|
|
20023
|
+
"type": "string",
|
|
20024
|
+
"default": "--"
|
|
20025
|
+
},
|
|
20026
|
+
"precision": {
|
|
20027
|
+
"description": "Whether the seconds segment is exposed. `minute` (default) hides seconds; `second` adds the seconds segment + separator.",
|
|
20028
|
+
"type": "string",
|
|
20029
|
+
"enum": [
|
|
20030
|
+
"minute",
|
|
20031
|
+
"second"
|
|
20032
|
+
],
|
|
20033
|
+
"default": "minute"
|
|
20034
|
+
},
|
|
20035
|
+
"readonly": {
|
|
20036
|
+
"description": "Prevents editing while keeping the field focusable. Segments stay focusable for inspection.",
|
|
20037
|
+
"type": "boolean",
|
|
20038
|
+
"default": false
|
|
20039
|
+
},
|
|
20040
|
+
"step": {
|
|
20041
|
+
"description": "Per-Arrow-keypress increment in seconds. 60 = minute precision (default), 900 = 15-minute, 1 = second precision.",
|
|
20042
|
+
"type": "number",
|
|
20043
|
+
"default": 60
|
|
20044
|
+
},
|
|
20045
|
+
"value": {
|
|
20046
|
+
"description": "Current time value as ISO 8601 (\"HH:mm\" or \"HH:mm:ss\"). Empty when no value selected.",
|
|
20047
|
+
"type": "string",
|
|
20048
|
+
"default": ""
|
|
20049
|
+
}
|
|
20050
|
+
},
|
|
20051
|
+
"required": [
|
|
20052
|
+
"component"
|
|
20053
|
+
],
|
|
20054
|
+
"unevaluatedProperties": false,
|
|
20055
|
+
"x-adiaui": {
|
|
20056
|
+
"anti_patterns": [
|
|
20057
|
+
{
|
|
20058
|
+
"fix": "{\"component\": \"TimePicker\", \"value\": \"09:30\"}\n",
|
|
20059
|
+
"why": "Localized format is not a valid `value`. The contract requires ISO\n8601 time (`HH:mm` or `HH:mm:ss`, 24-hour). The display format is\nderived from `hourCycle` regardless of how the value is stored.\n",
|
|
20060
|
+
"wrong": "{\"component\": \"TimePicker\", \"value\": \"9:30 AM\"}\n"
|
|
20061
|
+
},
|
|
20062
|
+
{
|
|
20063
|
+
"fix": "{\"component\": \"DatetimePicker\", \"value\": \"2026-05-24T09:30\"}\n",
|
|
20064
|
+
"why": "Datetime string is invalid for TimePicker — the date portion is\nnot accepted. For datetime selection use the DatetimePicker\ncomponent.\n",
|
|
20065
|
+
"wrong": "{\"component\": \"TimePicker\", \"value\": \"2026-05-24T09:30\"}\n"
|
|
20066
|
+
},
|
|
20067
|
+
{
|
|
20068
|
+
"fix": "{\"component\": \"TimePicker\", \"name\": \"field-name\"}\n",
|
|
20069
|
+
"why": "Nesting a native time input violates ADR-0025 and bypasses\nElementInternals form participation.\n",
|
|
20070
|
+
"wrong": "{\"component\": \"TimePicker\", \"children\": [\n {\"component\": \"Input\", \"type\": \"time\"}\n]}\n"
|
|
20071
|
+
}
|
|
20072
|
+
],
|
|
20073
|
+
"category": "input",
|
|
20074
|
+
"composes": [],
|
|
20075
|
+
"events": {
|
|
20076
|
+
"change": {
|
|
20077
|
+
"description": "Fired when the value commits (segment edit completes via Arrow / Tab / blur).",
|
|
20078
|
+
"detail": {
|
|
20079
|
+
"segment": {
|
|
20080
|
+
"description": "Which segment commit fired the event (`hour` | `minute` | `second` | `meridiem`).",
|
|
20081
|
+
"type": "string"
|
|
20082
|
+
},
|
|
20083
|
+
"value": {
|
|
20084
|
+
"description": "Current value as ISO 8601 (\"HH:mm\" or \"HH:mm:ss\").",
|
|
20085
|
+
"type": "string"
|
|
20086
|
+
}
|
|
20087
|
+
}
|
|
20088
|
+
},
|
|
20089
|
+
"input": {
|
|
20090
|
+
"description": "Fired on intermediate segment edits before commit.",
|
|
20091
|
+
"detail": {
|
|
20092
|
+
"value": {
|
|
20093
|
+
"description": "In-flight value as ISO 8601.",
|
|
20094
|
+
"type": "string"
|
|
20095
|
+
}
|
|
20096
|
+
}
|
|
20097
|
+
},
|
|
20098
|
+
"invalid": {
|
|
20099
|
+
"description": "Fired when a constraint is violated (min/max range, parse error).",
|
|
20100
|
+
"detail": {
|
|
20101
|
+
"reason": {
|
|
20102
|
+
"description": "Why it failed (`min` | `max` | `parse`).",
|
|
20103
|
+
"type": "string",
|
|
20104
|
+
"enum": [
|
|
20105
|
+
"min",
|
|
20106
|
+
"max",
|
|
20107
|
+
"parse"
|
|
20108
|
+
]
|
|
20109
|
+
},
|
|
20110
|
+
"value": {
|
|
20111
|
+
"description": "Value that failed validation.",
|
|
20112
|
+
"type": "string"
|
|
20113
|
+
}
|
|
20114
|
+
}
|
|
20115
|
+
}
|
|
20116
|
+
},
|
|
20117
|
+
"examples": [
|
|
20118
|
+
{
|
|
20119
|
+
"description": "Time-of-day picker with 15-minute step and business-hours bounds.",
|
|
20120
|
+
"a2ui": "[\n {\"id\": \"root\", \"component\": \"Field\", \"label\": \"Start time\",\n \"children\": [\"t\"]},\n {\"id\": \"t\", \"component\": \"TimePicker\",\n \"name\": \"start-time\", \"value\": \"09:30\",\n \"min\": \"08:00\", \"max\": \"18:00\", \"step\": 900}\n]\n",
|
|
20121
|
+
"name": "meeting-time-15min-step"
|
|
20122
|
+
},
|
|
20123
|
+
{
|
|
20124
|
+
"description": "Time picker with second precision for a log-cursor query.",
|
|
20125
|
+
"a2ui": "[\n {\"id\": \"root\", \"component\": \"Field\", \"label\": \"Cursor\",\n \"children\": [\"t\"]},\n {\"id\": \"t\", \"component\": \"TimePicker\",\n \"name\": \"cursor\", \"precision\": \"second\", \"step\": 1,\n \"value\": \"14:30:45\"}\n]\n",
|
|
20126
|
+
"name": "log-cursor-second-precision"
|
|
20127
|
+
},
|
|
20128
|
+
{
|
|
20129
|
+
"description": "Forced 12-hour cycle with AM/PM segment for an alarm picker.",
|
|
20130
|
+
"a2ui": "[\n {\"id\": \"root\", \"component\": \"Field\", \"label\": \"Alarm\",\n \"children\": [\"t\"]},\n {\"id\": \"t\", \"component\": \"TimePicker\",\n \"name\": \"alarm\", \"hourCycle\": \"h12\", \"value\": \"07:00\"}\n]\n",
|
|
20131
|
+
"name": "alarm-12h-cycle"
|
|
20132
|
+
}
|
|
20133
|
+
],
|
|
20134
|
+
"keywords": [
|
|
20135
|
+
"time",
|
|
20136
|
+
"timepicker",
|
|
20137
|
+
"time-picker",
|
|
20138
|
+
"clock",
|
|
20139
|
+
"hour",
|
|
20140
|
+
"minute",
|
|
20141
|
+
"spinbutton"
|
|
20142
|
+
],
|
|
20143
|
+
"name": "UITimePicker",
|
|
20144
|
+
"related": [
|
|
20145
|
+
"CalendarPicker",
|
|
20146
|
+
"Field",
|
|
20147
|
+
"Input"
|
|
20148
|
+
],
|
|
20149
|
+
"slots": {
|
|
20150
|
+
"prefix": {
|
|
20151
|
+
"description": "Leading content (e.g. an `<icon-ui name=\"clock\">`); sits before the hour segment."
|
|
20152
|
+
},
|
|
20153
|
+
"suffix": {
|
|
20154
|
+
"description": "Trailing content (e.g. a timezone label); sits after the last segment."
|
|
20155
|
+
}
|
|
20156
|
+
},
|
|
20157
|
+
"states": [
|
|
20158
|
+
{
|
|
20159
|
+
"description": "Default, ready for interaction.",
|
|
20160
|
+
"name": "idle"
|
|
20161
|
+
},
|
|
20162
|
+
{
|
|
20163
|
+
"description": "One segment is the focus target.",
|
|
20164
|
+
"attribute": "editing",
|
|
20165
|
+
"name": "editing"
|
|
20166
|
+
},
|
|
20167
|
+
{
|
|
20168
|
+
"description": "Non-interactive; dimmed.",
|
|
20169
|
+
"attribute": "disabled",
|
|
20170
|
+
"name": "disabled"
|
|
20171
|
+
},
|
|
20172
|
+
{
|
|
20173
|
+
"description": "Keyboard focus ring on the host.",
|
|
20174
|
+
"name": "focused",
|
|
20175
|
+
"selector": ":focus-within"
|
|
20176
|
+
}
|
|
20177
|
+
],
|
|
20178
|
+
"status": "stable",
|
|
20179
|
+
"synonyms": {
|
|
20180
|
+
"tags": [
|
|
20181
|
+
"TimeInput",
|
|
20182
|
+
"TimePicker"
|
|
20183
|
+
],
|
|
20184
|
+
"time": [
|
|
20185
|
+
"clock",
|
|
20186
|
+
"hour",
|
|
20187
|
+
"minute",
|
|
20188
|
+
"alarm"
|
|
20189
|
+
]
|
|
20190
|
+
},
|
|
20191
|
+
"tag": "time-picker-ui",
|
|
20192
|
+
"tokens": {
|
|
20193
|
+
"--time-picker-bg": {
|
|
20194
|
+
"description": "Host background color."
|
|
20195
|
+
},
|
|
20196
|
+
"--time-picker-border": {
|
|
20197
|
+
"description": "Host border color."
|
|
20198
|
+
},
|
|
20199
|
+
"--time-picker-fg": {
|
|
20200
|
+
"description": "Host text color."
|
|
20201
|
+
},
|
|
20202
|
+
"--time-picker-fg-muted": {
|
|
20203
|
+
"description": "Muted text color (empty placeholder + separator)."
|
|
20204
|
+
},
|
|
20205
|
+
"--time-picker-px": {
|
|
20206
|
+
"description": "Host inline padding."
|
|
20207
|
+
},
|
|
20208
|
+
"--time-picker-py": {
|
|
20209
|
+
"description": "Host block padding."
|
|
20210
|
+
},
|
|
20211
|
+
"--time-picker-radius": {
|
|
20212
|
+
"description": "Host border radius."
|
|
20213
|
+
},
|
|
20214
|
+
"--time-picker-segment-bg-focus": {
|
|
20215
|
+
"description": "Focused segment background."
|
|
20216
|
+
},
|
|
20217
|
+
"--time-picker-segment-fg-focus": {
|
|
20218
|
+
"description": "Focused segment text color."
|
|
20219
|
+
},
|
|
20220
|
+
"--time-picker-separator-fg": {
|
|
20221
|
+
"description": "Separator (`:`) text color."
|
|
20222
|
+
}
|
|
20223
|
+
},
|
|
20224
|
+
"traits": [
|
|
20225
|
+
"focusable"
|
|
20226
|
+
],
|
|
20227
|
+
"version": 1
|
|
20228
|
+
}
|
|
20229
|
+
},
|
|
17433
20230
|
"Toast": {
|
|
17434
20231
|
"title": "Toast",
|
|
17435
20232
|
"description": "Transient global notification popup with auto-dismiss + animated\nenter/exit. Variants map to severity (info / success / warning /\ndanger). Distinct from <alert-ui> (inline persistent banner) and\n<empty-state-ui> (zero-data placeholder). Use toast-ui for\nshort-lived feedback after user actions (\"Saved\", \"Copied to\nclipboard\"); the toast positions itself relative to viewport\n[position] regardless of where in the DOM it's rendered.\n",
|