@adia-ai/web-components 0.8.39 → 0.8.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +59 -0
- package/MIGRATION.md +1269 -3
- package/README.md +25 -30
- package/USAGE.md +26 -0
- package/bin/audit-template-children.mjs +556 -0
- package/components/accordion/accordion-item.a2ui.json +4 -0
- package/components/accordion/accordion-item.yaml +2 -0
- package/components/accordion/accordion.a2ui.json +4 -0
- package/components/accordion/accordion.yaml +2 -0
- package/components/action-list/action-item.a2ui.json +24 -2
- package/components/action-list/action-item.yaml +28 -3
- package/components/action-list/action-list.a2ui.json +6 -1
- package/components/action-list/action-list.class.js +52 -11
- package/components/action-list/action-list.css +43 -3
- package/components/action-list/action-list.d.ts +4 -2
- package/components/action-list/action-list.yaml +5 -0
- package/components/adia-mark/adia-mark.a2ui.json +1 -0
- package/components/adia-wordmark/adia-wordmark.a2ui.json +1 -0
- package/components/agent-artifact/agent-artifact.a2ui.json +1 -0
- package/components/agent-artifact/agent-artifact.css +1 -1
- package/components/agent-feedback-bar/agent-feedback-bar.a2ui.json +6 -5
- package/components/agent-feedback-bar/agent-feedback-bar.yaml +6 -2
- package/components/agent-questions/agent-questions.a2ui.json +1 -0
- package/components/agent-reasoning/agent-reasoning.a2ui.json +6 -5
- package/components/agent-reasoning/agent-reasoning.css +2 -2
- package/components/agent-reasoning/agent-reasoning.yaml +6 -2
- package/components/agent-suggestions/agent-suggestions.a2ui.json +11 -2
- package/components/agent-suggestions/agent-suggestions.class.js +2 -1
- package/components/agent-suggestions/agent-suggestions.d.ts +4 -4
- package/components/agent-suggestions/agent-suggestions.yaml +4 -2
- package/components/agent-trace/agent-trace.a2ui.json +6 -5
- package/components/agent-trace/agent-trace.css +3 -3
- package/components/agent-trace/agent-trace.yaml +6 -2
- package/components/alert/alert.a2ui.json +1 -0
- package/components/alert/alert.css +2 -2
- package/components/anchor-bar/anchor-bar.a2ui.json +1 -0
- package/components/aside/aside.a2ui.json +1 -0
- package/components/avatar/avatar-group.a2ui.json +7 -1
- package/components/avatar/avatar-group.yaml +1 -0
- package/components/avatar/avatar.a2ui.json +12 -11
- package/components/avatar/avatar.css +1 -1
- package/components/avatar/avatar.d.ts +1 -1
- package/components/avatar/avatar.yaml +4 -4
- package/components/badge/badge.a2ui.json +1 -0
- package/components/badge/badge.css +1 -1
- package/components/block/block.a2ui.json +1 -0
- package/components/blockquote/blockquote.a2ui.json +1 -0
- package/components/breadcrumb/breadcrumb.a2ui.json +1 -0
- package/components/button/button.a2ui.json +1 -3
- package/components/button/button.css +6 -5
- package/components/button/button.yaml +1 -3
- package/components/calendar-grid/calendar-grid.a2ui.json +1 -0
- package/components/calendar-grid/calendar-grid.class.js +2 -1
- package/components/calendar-picker/calendar-picker.a2ui.json +143 -24
- package/components/calendar-picker/calendar-picker.class.js +490 -197
- package/components/calendar-picker/calendar-picker.css +121 -172
- package/components/calendar-picker/calendar-picker.yaml +225 -47
- package/components/canvas/canvas.a2ui.json +6 -5
- package/components/canvas/canvas.d.ts +37 -0
- package/components/canvas/canvas.js +72 -3
- package/components/canvas/canvas.yaml +6 -2
- package/components/card/card.a2ui.json +25 -2
- package/components/card/card.class.js +3 -0
- package/components/card/card.css +34 -4
- package/components/card/card.d.ts +2 -2
- package/components/card/card.examples.md +3 -3
- package/components/card/card.yaml +28 -4
- package/components/chart/chart.a2ui.json +13 -8
- package/components/chart/chart.class.js +10 -10
- package/components/chart/chart.css +12 -10
- package/components/chart/chart.d.ts +2 -2
- package/components/chart/chart.yaml +8 -5
- package/components/chart-legend/chart-legend.a2ui.json +1 -0
- package/components/chat-thread/chat-input.a2ui.json +1 -0
- package/components/chat-thread/chat-thread.a2ui.json +10 -9
- package/components/chat-thread/chat-thread.css +1 -1
- package/components/chat-thread/chat-thread.yaml +13 -20
- package/components/check/check.a2ui.json +10 -9
- package/components/check/check.yaml +4 -4
- package/components/code/code.a2ui.json +1 -0
- package/components/code/code.css +6 -6
- package/components/col/col.a2ui.json +1 -0
- package/components/color-input/color-input.a2ui.json +1 -0
- package/components/color-picker/color-picker.a2ui.json +1 -0
- package/components/combobox/combobox.a2ui.json +3 -2
- package/components/combobox/combobox.css +2 -2
- package/components/combobox/combobox.yaml +2 -2
- package/components/command/command.a2ui.json +12 -10
- package/components/command/command.class.js +3 -2
- package/components/command/command.css +3 -3
- package/components/command/command.yaml +17 -4
- package/components/context-menu/context-menu.a2ui.json +1 -0
- package/components/date-range-picker/date-range-picker.a2ui.json +2 -1
- package/components/date-range-picker/date-range-picker.css +1 -1
- package/components/date-range-picker/date-range-picker.yaml +1 -1
- package/components/datetime-picker/datetime-picker.a2ui.json +15 -108
- package/components/datetime-picker/datetime-picker.class.js +37 -690
- package/components/datetime-picker/datetime-picker.css +11 -183
- package/components/datetime-picker/datetime-picker.d.ts +4 -5
- package/components/datetime-picker/datetime-picker.yaml +44 -135
- package/components/demo-toggle/demo-toggle.a2ui.json +1 -0
- package/components/demo-toggle/demo-toggle.css +1 -1
- package/components/description-list/description-list.a2ui.json +1 -0
- package/components/description-list/description-list.css +2 -2
- package/components/display-field/display-field.a2ui.json +1 -0
- package/components/display-field/display-field.css +3 -3
- package/components/divider/divider.a2ui.json +1 -0
- package/components/divider/divider.css +1 -1
- package/components/drawer/drawer.a2ui.json +1 -3
- package/components/drawer/drawer.css +3 -3
- package/components/drawer/drawer.yaml +0 -2
- package/components/drilldown/drilldown.a2ui.json +22 -20
- package/components/drilldown/drilldown.class.js +4 -3
- package/components/drilldown/drilldown.css +8 -8
- package/components/drilldown/drilldown.yaml +40 -9
- package/components/embed/embed.a2ui.json +6 -5
- package/components/embed/embed.yaml +2 -2
- package/components/empty-state/empty-state.a2ui.json +1 -0
- package/components/empty-state/empty-state.css +2 -2
- package/components/feed/feed-item.a2ui.json +25 -5
- package/components/feed/feed-item.yaml +28 -7
- package/components/feed/feed.a2ui.json +9 -2
- package/components/feed/feed.class.js +19 -12
- package/components/feed/feed.css +8 -8
- package/components/feed/feed.yaml +14 -1
- package/components/field/field.a2ui.json +1 -0
- package/components/field/field.css +1 -1
- package/components/field/field.examples.md +1 -1
- package/components/fields/fields.a2ui.json +1 -0
- package/components/fields/fields.examples.md +1 -1
- package/components/footer/footer.a2ui.json +1 -0
- package/components/frame/frame.a2ui.json +1 -0
- package/components/grid/grid.a2ui.json +1 -0
- package/components/header/header.a2ui.json +3 -2
- package/components/header/header.yaml +3 -3
- package/components/heatmap/heatmap.a2ui.json +2 -1
- package/components/heatmap/heatmap.class.js +1 -1
- package/components/heatmap/heatmap.css +6 -6
- package/components/heatmap/heatmap.yaml +1 -1
- package/components/icon/icon.a2ui.json +1 -0
- package/components/image/image.a2ui.json +28 -14
- package/components/image/image.class.js +38 -23
- package/components/image/image.css +18 -8
- package/components/image/image.d.ts +2 -2
- package/components/image/image.examples.md +3 -3
- package/components/image/image.yaml +23 -7
- package/components/inline-edit/inline-edit.a2ui.json +1 -0
- package/components/inline-message/inline-message.a2ui.json +3 -1
- package/components/inline-message/inline-message.class.js +3 -1
- package/components/inline-message/inline-message.css +1 -1
- package/components/inline-message/inline-message.d.ts +2 -2
- package/components/inline-message/inline-message.yaml +2 -1
- package/components/input/input.a2ui.json +66 -16
- package/components/input/input.class.js +64 -7
- package/components/input/input.css +19 -18
- package/components/input/input.d.ts +9 -4
- package/components/input/input.yaml +83 -10
- package/components/inspector/inspector.a2ui.json +1 -0
- package/components/integration-card/integration-card.a2ui.json +1 -0
- package/components/integration-card/integration-card.css +4 -4
- package/components/kbd/kbd.a2ui.json +1 -0
- package/components/kbd/kbd.css +1 -1
- package/components/link/link.a2ui.json +2 -1
- package/components/link/link.yaml +1 -1
- package/components/list/list-item.a2ui.json +9 -0
- package/components/list/list-item.yaml +12 -0
- package/components/list/list.a2ui.json +9 -3
- package/components/list/list.class.js +14 -1
- package/components/list/list.css +14 -3
- package/components/list/list.d.ts +7 -5
- package/components/list/list.yaml +16 -6
- package/components/list-window/list-window.a2ui.json +1 -0
- package/components/list-window/list-window.class.js +2 -1
- package/components/loading-overlay/loading-overlay.a2ui.json +1 -0
- package/components/mark/mark.a2ui.json +2 -1
- package/components/mark/mark.yaml +1 -1
- package/components/menu/menu-divider.a2ui.json +1 -0
- package/components/menu/menu-item.a2ui.json +3 -1
- package/components/menu/menu-item.yaml +6 -0
- package/components/menu/menu-label.a2ui.json +1 -0
- package/components/menu/menu.a2ui.json +3 -2
- package/components/menu/menu.class.js +2 -2
- package/components/menu/menu.d.ts +2 -2
- package/components/menu/menu.yaml +3 -3
- package/components/modal/modal.a2ui.json +1 -0
- package/components/nav/nav.a2ui.json +1 -0
- package/components/nav/nav.class.js +14 -3
- package/components/nav/nav.css +2 -2
- package/components/nav-group/nav-group.a2ui.json +1 -0
- package/components/nav-group/nav-group.class.js +3 -1
- package/components/nav-group/nav-group.css +3 -3
- package/components/nav-item/nav-item.a2ui.json +1 -0
- package/components/nav-item/nav-item.css +2 -2
- package/components/noodles/noodles.a2ui.json +1 -0
- package/components/noodles/noodles.class.js +5 -1
- package/components/number-format/number-format.a2ui.json +1 -0
- package/components/option-card/option-card.a2ui.json +1 -0
- package/components/option-card/option-card.css +1 -1
- package/components/otp-input/otp-input.a2ui.json +3 -2
- package/components/otp-input/otp-input.css +1 -1
- package/components/otp-input/otp-input.yaml +9 -2
- package/components/page/page.a2ui.json +13 -0
- package/components/page/page.css +2 -2
- package/components/page/page.d.ts +1 -1
- package/components/page/page.yaml +1 -0
- package/components/pagination/pagination.a2ui.json +1 -0
- package/components/pagination/pagination.class.js +3 -2
- package/components/pagination/pagination.css +1 -1
- package/components/pane/pane.a2ui.json +6 -0
- package/components/pane/pane.class.js +3 -3
- package/components/pane/pane.css +3 -3
- package/components/pane/pane.yaml +3 -0
- package/components/password-strength/password-strength.a2ui.json +1 -0
- package/components/pipeline-status/pipeline-status.a2ui.json +1 -0
- package/components/popover/popover.a2ui.json +7 -6
- package/components/popover/popover.class.js +2 -2
- package/components/popover/popover.d.ts +2 -2
- package/components/popover/popover.yaml +4 -4
- package/components/preview/preview.a2ui.json +1 -0
- package/components/preview/preview.class.js +5 -1
- package/components/progress/progress.a2ui.json +47 -24
- package/components/progress/progress.class.js +66 -11
- package/components/progress/progress.css +44 -26
- package/components/progress/progress.d.ts +7 -5
- package/components/progress/progress.examples.md +2 -2
- package/components/progress/progress.yaml +235 -53
- package/components/progress-row/progress-row.a2ui.json +16 -12
- package/components/progress-row/progress-row.css +2 -2
- package/components/progress-row/progress-row.d.ts +2 -2
- package/components/progress-row/progress-row.examples.md +2 -14
- package/components/progress-row/progress-row.yaml +28 -36
- package/components/qr-code/qr-code.a2ui.json +13 -12
- package/components/qr-code/qr-code.class.js +7 -7
- package/components/qr-code/qr-code.css +1 -1
- package/components/qr-code/qr-code.d.ts +10 -7
- package/components/qr-code/qr-code.yaml +18 -12
- package/components/radio/radio.a2ui.json +8 -7
- package/components/radio/radio.class.js +8 -0
- package/components/radio/radio.yaml +3 -3
- package/components/radio-group/radio-group.a2ui.json +5 -3
- package/components/radio-group/radio-group.class.js +11 -0
- package/components/radio-group/radio-group.yaml +7 -1
- package/components/range/range.a2ui.json +6 -0
- package/components/range/range.class.js +2 -2
- package/components/range/range.css +3 -3
- package/components/range/range.yaml +3 -0
- package/components/rating/rating.a2ui.json +1 -0
- package/components/rating/rating.css +1 -1
- package/components/relative-time/relative-time.a2ui.json +1 -0
- package/components/richtext/richtext.a2ui.json +2 -1
- package/components/richtext/richtext.css +3 -3
- package/components/richtext/richtext.yaml +1 -1
- package/components/row/row.a2ui.json +1 -0
- package/components/search/search.a2ui.json +1 -0
- package/components/search/search.class.js +4 -1
- package/components/section/section.a2ui.json +1 -0
- package/components/segment/segment.a2ui.json +21 -10
- package/components/segment/segment.css +20 -4
- package/components/segment/segment.d.ts +2 -1
- package/components/segment/segment.yaml +20 -13
- package/components/segmented/segmented.a2ui.json +36 -7
- package/components/segmented/segmented.class.js +113 -22
- package/components/segmented/segmented.css +3 -0
- package/components/segmented/segmented.d.ts +3 -1
- package/components/segmented/segmented.yaml +80 -8
- package/components/select/select.a2ui.json +18 -13
- package/components/select/select.class.js +61 -37
- package/components/select/select.css +18 -16
- package/components/select/select.yaml +18 -7
- package/components/skeleton/skeleton.a2ui.json +8 -7
- package/components/skeleton/skeleton.class.js +8 -7
- package/components/skeleton/skeleton.css +21 -6
- package/components/skeleton/skeleton.d.ts +2 -2
- package/components/skeleton/skeleton.examples.md +2 -2
- package/components/skeleton/skeleton.yaml +3 -2
- package/components/skip-nav/skip-nav.a2ui.json +1 -0
- package/components/slider/slider.a2ui.json +6 -0
- package/components/slider/slider.class.js +20 -3
- package/components/slider/slider.css +2 -2
- package/components/slider/slider.yaml +3 -0
- package/components/spinner/spinner.a2ui.json +1 -0
- package/components/spinner/spinner.css +1 -1
- package/components/stack/stack.a2ui.json +1 -0
- package/components/stat/stat.a2ui.json +1 -0
- package/components/stat/stat.css +3 -3
- package/components/stat/stat.js +2 -2
- package/components/step-progress/step-progress.a2ui.json +1 -0
- package/components/step-progress/step-progress.css +1 -1
- package/components/step-progress/step-progress.yaml +1 -1
- package/components/stepper/stepper-item.a2ui.json +7 -3
- package/components/stepper/stepper-item.yaml +15 -5
- package/components/stepper/stepper.a2ui.json +5 -1
- package/components/stepper/stepper.class.js +31 -16
- package/components/stepper/stepper.css +2 -2
- package/components/stepper/stepper.d.ts +1 -1
- package/components/stepper/stepper.yaml +4 -2
- package/components/stream/stream.a2ui.json +1 -0
- package/components/swatch/swatch.a2ui.json +1 -0
- package/components/swatch/swatch.css +2 -2
- package/components/swiper/swiper.a2ui.json +1 -0
- package/components/swiper/swiper.class.js +5 -1
- package/components/switch/switch.a2ui.json +12 -11
- package/components/switch/switch.css +1 -1
- package/components/switch/switch.yaml +6 -6
- package/components/table/table.a2ui.json +1 -10
- package/components/table/table.class.js +18 -16
- package/components/table/table.css +17 -18
- package/components/table/table.d.ts +0 -2
- package/components/table/table.yaml +0 -9
- package/components/table-toolbar/table-toolbar.a2ui.json +1 -0
- package/components/table-toolbar/table-toolbar.class.js +38 -19
- package/components/table-toolbar/table-toolbar.css +2 -2
- package/components/tabs/tab.a2ui.json +9 -0
- package/components/tabs/tab.js +4 -0
- package/components/tabs/tab.yaml +15 -0
- package/components/tabs/tabs.a2ui.json +9 -4
- package/components/tabs/tabs.class.js +13 -1
- package/components/tabs/tabs.css +9 -1
- package/components/tabs/tabs.d.ts +2 -0
- package/components/tabs/tabs.yaml +9 -2
- package/components/tag/tag.a2ui.json +1 -0
- package/components/tag/tag.css +2 -2
- package/components/tags-input/tags-input.a2ui.json +22 -17
- package/components/tags-input/tags-input.class.js +13 -11
- package/components/tags-input/tags-input.css +11 -7
- package/components/tags-input/tags-input.d.ts +16 -7
- package/components/tags-input/tags-input.examples.md +2 -2
- package/components/tags-input/tags-input.yaml +25 -8
- package/components/text/text.a2ui.json +6 -5
- package/components/text/text.css +10 -5
- package/components/text/text.d.ts +2 -2
- package/components/text/text.yaml +9 -4
- package/components/textarea/textarea.a2ui.json +2 -1
- package/components/textarea/textarea.css +1 -1
- package/components/textarea/textarea.yaml +1 -1
- package/components/theme-provider/theme-provider.a2ui.json +2 -1
- package/components/theme-provider/theme-provider.d.ts +5 -3
- package/components/theme-provider/theme-provider.yaml +5 -3
- package/components/time-picker/time-picker.a2ui.json +1 -0
- package/components/time-picker/time-picker.class.js +4 -2
- package/components/time-picker/time-picker.css +1 -1
- package/components/timeline/timeline-item.a2ui.json +26 -3
- package/components/timeline/timeline-item.yaml +22 -7
- package/components/timeline/timeline.a2ui.json +4 -0
- package/components/timeline/timeline.class.js +29 -18
- package/components/timeline/timeline.css +4 -4
- package/components/timeline/timeline.d.ts +3 -3
- package/components/timeline/timeline.yaml +2 -0
- package/components/toast/toast.a2ui.json +10 -3
- package/components/toast/toast.yaml +20 -13
- package/components/toc/toc.a2ui.json +1 -0
- package/components/toc/toc.css +1 -1
- package/components/toggle-group/toggle-group.a2ui.json +7 -3
- package/components/toggle-group/toggle-group.class.js +43 -12
- package/components/toggle-group/toggle-group.css +7 -4
- package/components/toggle-group/toggle-group.d.ts +3 -4
- package/components/toggle-group/toggle-group.yaml +22 -16
- package/components/toggle-group/toggle-option.a2ui.json +8 -4
- package/components/toggle-group/toggle-option.yaml +15 -13
- package/components/toggle-scheme/toggle-scheme.a2ui.json +2 -1
- package/components/toggle-scheme/toggle-scheme.yaml +1 -1
- package/components/toolbar/toolbar-group.a2ui.json +1 -0
- package/components/toolbar/toolbar.a2ui.json +1 -0
- package/components/toolbar/toolbar.class.js +3 -0
- package/components/tooltip/tooltip.a2ui.json +1 -0
- package/components/tooltip/tooltip.css +1 -1
- package/components/tour/tour-step.a2ui.json +4 -0
- package/components/tour/tour-step.yaml +2 -0
- package/components/tour/tour.a2ui.json +4 -0
- package/components/tour/tour.css +2 -2
- package/components/tour/tour.yaml +2 -0
- package/components/tree/tree-item.a2ui.json +5 -0
- package/components/tree/tree-item.yaml +3 -0
- package/components/tree/tree.a2ui.json +4 -0
- package/components/tree/tree.class.js +2 -1
- package/components/tree/tree.css +1 -1
- package/components/tree/tree.yaml +2 -0
- package/components/upload/upload.a2ui.json +8 -1
- package/components/upload/upload.class.js +35 -5
- package/components/upload/upload.css +28 -0
- package/components/upload/upload.d.ts +16 -0
- package/components/upload/upload.yaml +27 -7
- package/components/visually-hidden/visually-hidden.a2ui.json +1 -0
- package/core/dom.d.ts +11 -0
- package/core/dom.js +34 -0
- package/core/form.js +7 -0
- package/core/index.d.ts +1 -0
- package/core/index.js +1 -0
- package/core/responsive.js +16 -4
- package/core/template.js +2 -1
- package/custom-elements.json +442 -502
- package/dist/host.min.css +1 -1
- package/dist/host.sheet.js +1 -1
- package/dist/theme-provider.min.js +5 -5
- package/dist/web-components.min.css +1 -1
- package/dist/web-components.min.js +91 -104
- package/dist/web-components.sheet.js +1 -1
- package/package.json +4 -2
- package/patterns/conversion-funnel/conversion-funnel.examples.html +15 -15
- package/patterns/inline-dialog/inline-dialog.examples.html +2 -2
- package/patterns/inline-dialog/inline-dialog.html +4 -0
- package/patterns/timezone-selector/timezone-selector.examples.html +1 -1
- package/patterns/timezone-selector/timezone-selector.html +2 -2
- package/styles/api/text.css +7 -0
- package/styles/type/scale.css +6 -7
- package/traits/_catalog.json +129 -41
- package/traits/anchor-positioning/anchor-positioning.js +1 -0
- package/traits/announcer/announcer.js +1 -0
- package/traits/arrow-grid-nav/arrow-grid-nav.js +1 -0
- package/traits/attention-pulse/attention-pulse.js +1 -0
- package/traits/count-up/count-up.js +1 -0
- package/traits/define.js +78 -0
- package/traits/focus-restore/focus-restore.js +2 -1
- package/traits/haptic-feedback/haptic-feedback.js +1 -0
- package/traits/input-mask/input-mask.js +1 -0
- package/traits/intersection-observer/intersection-observer.js +1 -0
- package/traits/layout-animation/layout-animation.js +1 -0
- package/traits/noise-texture/noise-texture.js +1 -0
- package/traits/resize-observer/resize-observer.js +1 -0
- package/traits/scroll-progress/scroll-progress.js +1 -0
- package/traits/snap-to-grid/snap-to-grid.js +1 -0
- package/traits/sound-feedback/sound-feedback.js +1 -0
- package/traits/spring-animate/spring-animate.js +1 -0
- package/traits/validation/validation.js +1 -0
|
@@ -5,14 +5,19 @@ status: stable
|
|
|
5
5
|
component: Segmented
|
|
6
6
|
category: navigation
|
|
7
7
|
version: 1
|
|
8
|
-
description:
|
|
8
|
+
description: Toggle group with an animated sliding indicator (single-select) or independently-toggleable segments (multi-select via [multiple]). Children must be segment-ui elements.
|
|
9
9
|
props:
|
|
10
10
|
value:
|
|
11
|
-
description: Value of the currently selected segment.
|
|
11
|
+
description: Value of the currently selected segment. Under [multiple], a comma-separated set of selected values (same encoding as select-ui[multiple]).
|
|
12
12
|
type: string
|
|
13
13
|
default: ''
|
|
14
|
+
multiple:
|
|
15
|
+
description: "Enables multi-select — value becomes a comma-separated set, the sliding indicator is suppressed (each selected segment carries its own background instead), and Space/Enter toggles a focused segment instead of arrow-move selecting it. Positive polarity, matching select-ui[multiple]. Absorbs the role of the deprecated <toggle-group-ui> + <toggle-option-ui> pair (gh#1369, #1363 C1). Unlike <toggle-group-ui single>, re-clicking an already-selected segment does NOT clear the selection — segmented-ui's single-select is standard radiogroup semantics (always exactly one selected once a value is set)."
|
|
16
|
+
type: boolean
|
|
17
|
+
default: false
|
|
18
|
+
reflect: true
|
|
14
19
|
allowEmpty:
|
|
15
|
-
description: Suppresses the connect-time self-select of the first enabled segment when value is falsy. Without it, an empty value silently selects the first segment; with it, a falsy value renders every segment unselected until a real value arrives — for path-bound consumers whose bound value can be a genuine empty state.
|
|
20
|
+
description: Suppresses the connect-time self-select of the first enabled segment when value is falsy. Without it, an empty value silently selects the first segment; with it, a falsy value renders every segment unselected until a real value arrives — for path-bound consumers whose bound value can be a genuine empty state. No effect under [multiple] — multi-select never self-selects (empty value already means "nothing chosen").
|
|
16
21
|
type: boolean
|
|
17
22
|
default: false
|
|
18
23
|
attribute: allow-empty
|
|
@@ -22,20 +27,27 @@ events:
|
|
|
22
27
|
slots:
|
|
23
28
|
default:
|
|
24
29
|
description: Child segment-ui elements that form the toggle group. Children MUST be segment-ui — bare segment tags render text but are silently ignored for the sliding indicator and role/aria-checked state.
|
|
30
|
+
parts:
|
|
25
31
|
indicator:
|
|
26
|
-
description:
|
|
32
|
+
description: >-
|
|
33
|
+
Auto-created sliding indicator element prepended on first render —
|
|
34
|
+
template-owned anatomy part, not a light-DOM insertion point
|
|
35
|
+
(gh#1454). Lazily created once via an internal-field guard, never
|
|
36
|
+
adopted from a consumer-authored element.
|
|
27
37
|
states:
|
|
28
38
|
- name: idle
|
|
29
39
|
description: Default, ready for interaction.
|
|
30
40
|
traits: []
|
|
31
41
|
tokens: {}
|
|
32
42
|
a2ui:
|
|
43
|
+
allowedChildren:
|
|
44
|
+
- Segment
|
|
33
45
|
rules:
|
|
34
|
-
- rule: 'Single-select
|
|
46
|
+
- rule: 'Single-select by default. Hosts <segment-ui> children; exactly one selected at a time.'
|
|
35
47
|
reason: 'Single-select cluster contract.'
|
|
36
|
-
- rule: 'For multi-select
|
|
37
|
-
reason: 'Selection model
|
|
38
|
-
- rule: 'Use for view-mode switches (grid/list, light/dark) or short filter sets (3-5 options); for longer sets use <tabs-ui> or <select-ui>.'
|
|
48
|
+
- rule: 'For multi-select (filter chips, multi-flag toggles, day-of-week pickers), set [multiple] instead of using a separate component — value becomes a comma-separated set of selected segment values. <toggle-group-ui>/<toggle-option-ui> are deprecated; use <segmented-ui multiple> + <segment-ui> instead (gh#1369, #1363 C1).'
|
|
49
|
+
reason: 'Selection model axis — multiple absorbs the deprecated multi-select pair.'
|
|
50
|
+
- rule: 'Use for view-mode switches (grid/list, light/dark) or short filter sets (3-5 options); for longer sets use <tabs-ui> or <select-ui multiple>.'
|
|
39
51
|
reason: 'Capacity guidance.'
|
|
40
52
|
anti_patterns: []
|
|
41
53
|
examples:
|
|
@@ -86,6 +98,54 @@ examples:
|
|
|
86
98
|
"text": "Monthly"
|
|
87
99
|
}
|
|
88
100
|
]
|
|
101
|
+
- name: multi-select-filter-chips
|
|
102
|
+
description: Multi-select segmented control (gh#1369) for filter chips — [multiple] set, value is a comma-separated set of active segments.
|
|
103
|
+
a2ui: >-
|
|
104
|
+
[
|
|
105
|
+
{
|
|
106
|
+
"id": "root",
|
|
107
|
+
"component": "Card",
|
|
108
|
+
"children": [
|
|
109
|
+
"sec"
|
|
110
|
+
]
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"id": "sec",
|
|
114
|
+
"component": "Section",
|
|
115
|
+
"children": [
|
|
116
|
+
"comp"
|
|
117
|
+
]
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"id": "comp",
|
|
121
|
+
"component": "Segmented",
|
|
122
|
+
"multiple": true,
|
|
123
|
+
"value": "bold,italic",
|
|
124
|
+
"children": [
|
|
125
|
+
"s1",
|
|
126
|
+
"s2",
|
|
127
|
+
"s3"
|
|
128
|
+
]
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"id": "s1",
|
|
132
|
+
"component": "Segment",
|
|
133
|
+
"value": "bold",
|
|
134
|
+
"text": "Bold"
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
"id": "s2",
|
|
138
|
+
"component": "Segment",
|
|
139
|
+
"value": "italic",
|
|
140
|
+
"text": "Italic"
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
"id": "s3",
|
|
144
|
+
"component": "Segment",
|
|
145
|
+
"value": "underline",
|
|
146
|
+
"text": "Underline"
|
|
147
|
+
}
|
|
148
|
+
]
|
|
89
149
|
keywords:
|
|
90
150
|
- segmented
|
|
91
151
|
- options
|
|
@@ -95,6 +155,9 @@ keywords:
|
|
|
95
155
|
- tab
|
|
96
156
|
- tabs
|
|
97
157
|
- button-group
|
|
158
|
+
- filter
|
|
159
|
+
- multi-select
|
|
160
|
+
- filter-chips
|
|
98
161
|
synonyms:
|
|
99
162
|
button-group:
|
|
100
163
|
- toolbar
|
|
@@ -125,11 +188,20 @@ synonyms:
|
|
|
125
188
|
- segmented
|
|
126
189
|
- radio
|
|
127
190
|
- settings
|
|
191
|
+
filter:
|
|
192
|
+
- segmented
|
|
193
|
+
- toggle-group
|
|
194
|
+
- filter-chips
|
|
195
|
+
multi-select:
|
|
196
|
+
- segmented
|
|
197
|
+
- toggle-group
|
|
198
|
+
- select
|
|
128
199
|
tags:
|
|
129
200
|
- SegmentedControl
|
|
130
201
|
- Segmented
|
|
131
202
|
related:
|
|
132
203
|
- Segment
|
|
133
204
|
- ToggleGroup
|
|
205
|
+
- ToggleOption
|
|
134
206
|
- Tabs
|
|
135
207
|
- Radio
|
|
@@ -83,7 +83,10 @@
|
|
|
83
83
|
},
|
|
84
84
|
"maxlength": {
|
|
85
85
|
"description": "Maximum character length for validation",
|
|
86
|
-
"type":
|
|
86
|
+
"type": [
|
|
87
|
+
"number",
|
|
88
|
+
"null"
|
|
89
|
+
],
|
|
87
90
|
"default": null
|
|
88
91
|
},
|
|
89
92
|
"min": {
|
|
@@ -93,7 +96,10 @@
|
|
|
93
96
|
},
|
|
94
97
|
"minlength": {
|
|
95
98
|
"description": "Minimum character length for validation",
|
|
96
|
-
"type":
|
|
99
|
+
"type": [
|
|
100
|
+
"number",
|
|
101
|
+
"null"
|
|
102
|
+
],
|
|
97
103
|
"default": null
|
|
98
104
|
},
|
|
99
105
|
"multiple": {
|
|
@@ -158,7 +164,7 @@
|
|
|
158
164
|
"summary-label": {
|
|
159
165
|
"description": "Multi-select only (gh#442). Replaces the chip trigger with one\ntext line: a single selection shows its own label; N > 1 shows\n\"<summary-label> (N)\" — e.g. \"Organizations (2)\"; none shows the\nplaceholder. Popover checkbox rows, Backspace-removes-last, the\ncomma-separated form value, [select-all], and [clearable] are\nunchanged. Absent (default) = tag-ui chip trigger. Prefer this\nform for narrow triggers (filter bars) where wrapping chips\nwould balloon the control.\n",
|
|
160
166
|
"type": "string",
|
|
161
|
-
"default":
|
|
167
|
+
"default": ""
|
|
162
168
|
},
|
|
163
169
|
"value": {
|
|
164
170
|
"description": "Currently selected option value. With declarative <option> children, a child carrying the native `selected` attribute sets the initial value when this attribute is absent (native <select> parity).",
|
|
@@ -226,6 +232,14 @@
|
|
|
226
232
|
"picker"
|
|
227
233
|
],
|
|
228
234
|
"name": "UISelect",
|
|
235
|
+
"parts": {
|
|
236
|
+
"hint": {
|
|
237
|
+
"description": "Override slot for hint markup richer than the plain [hint] attribute string (inline links, code spans). Renders beneath the trigger at body-subtle typography. Mutually exclusive with [hint] per this description, but template-owned in practice (gh#1454): the trigger stamp is an unconditional `this.innerHTML = …` with no capture-before-wipe for `hint` (unlike `leading`/`trailing` on input-ui), so any pre-existing [slot=\"hint\"] content is discarded, not adopted, on first render."
|
|
238
|
+
},
|
|
239
|
+
"listbox": {
|
|
240
|
+
"description": "Popover container for options (role=listbox) — template-owned anatomy part, not a light-DOM insertion point (gh#1454). Its contents are always wiped (`innerHTML = ''`) and rebuilt wholesale from `.options`/ parsed `<option>` children on every options render."
|
|
241
|
+
}
|
|
242
|
+
},
|
|
229
243
|
"related": [
|
|
230
244
|
"image",
|
|
231
245
|
"button",
|
|
@@ -234,17 +248,8 @@
|
|
|
234
248
|
"upload"
|
|
235
249
|
],
|
|
236
250
|
"slots": {
|
|
237
|
-
"hint": {
|
|
238
|
-
"description": "Override slot for hint markup richer than the plain [hint] attribute string (inline links, code spans). Renders beneath the trigger at body-subtle typography. Mutually exclusive with [hint]."
|
|
239
|
-
},
|
|
240
|
-
"label": {
|
|
241
|
-
"description": "Label element above the trigger"
|
|
242
|
-
},
|
|
243
|
-
"listbox": {
|
|
244
|
-
"description": "Popover container for options (role=listbox)"
|
|
245
|
-
},
|
|
246
251
|
"trigger": {
|
|
247
|
-
"description": "Button that opens the listbox"
|
|
252
|
+
"description": "Button that opens the listbox. Stamped only if no consumer-authored [slot=\"trigger\"] is already present at first render (adopt-or-stamp) — a genuine light-DOM insertion point."
|
|
248
253
|
}
|
|
249
254
|
},
|
|
250
255
|
"states": [
|
|
@@ -399,8 +399,7 @@ export class UISelect extends UIFormElement {
|
|
|
399
399
|
this.#parseOptions();
|
|
400
400
|
if (this.#options.length) {
|
|
401
401
|
this.#renderOptions();
|
|
402
|
-
|
|
403
|
-
if (display) display.textContent = this.#displayText();
|
|
402
|
+
this.#syncDisplayText();
|
|
404
403
|
}
|
|
405
404
|
});
|
|
406
405
|
}
|
|
@@ -410,12 +409,13 @@ export class UISelect extends UIFormElement {
|
|
|
410
409
|
render() {
|
|
411
410
|
// SPEC-040 — in multi-select mode the trigger needs to host chips +
|
|
412
411
|
// optional clear-x + optional "+N more" pill alongside the usual
|
|
413
|
-
// leading / display / caret.
|
|
414
|
-
//
|
|
412
|
+
// leading / display / caret. CSS switches layout from single-line
|
|
413
|
+
// text to flex-wrap chip row off the compound selector
|
|
414
|
+
// [multiple]:not([summary-label]) — both already-declared, reflected
|
|
415
|
+
// props, so no private data-* mirror is needed here (gh#1332
|
|
416
|
+
// Category A; dropped [data-multi-chips]).
|
|
415
417
|
// gh#442 — [summary-label] keeps the single-line text layout: the
|
|
416
418
|
// summary renders through [slot="display"], no chip row.
|
|
417
|
-
if (this.multiple && !this.summaryLabel) this.setAttribute('data-multi-chips', '');
|
|
418
|
-
else this.removeAttribute('data-multi-chips');
|
|
419
419
|
|
|
420
420
|
// A11y (FB-88): name a placeholder-only select from its placeholder, like
|
|
421
421
|
// input-ui, so it isn't unnamed for assistive tech (WCAG 4.1.2).
|
|
@@ -495,34 +495,7 @@ export class UISelect extends UIFormElement {
|
|
|
495
495
|
// Re-attach listbox after trigger is stamped
|
|
496
496
|
if (lb) this.appendChild(lb);
|
|
497
497
|
} else {
|
|
498
|
-
|
|
499
|
-
if (display && !this.multiple) {
|
|
500
|
-
// Single-select: keep the canonical text-rendering path.
|
|
501
|
-
if (display.hasAttribute('contenteditable')) {
|
|
502
|
-
// Only update text when not actively editing (no active query)
|
|
503
|
-
if (!this.#query) {
|
|
504
|
-
const text = this.#displayText() === this.placeholder ? '' : this.#displayText();
|
|
505
|
-
display.textContent = text;
|
|
506
|
-
display.toggleAttribute('data-empty', !text);
|
|
507
|
-
}
|
|
508
|
-
} else {
|
|
509
|
-
display.textContent = this.#displayText();
|
|
510
|
-
}
|
|
511
|
-
} else if (display && this.multiple) {
|
|
512
|
-
// Multi-select: display element holds the placeholder ONLY when
|
|
513
|
-
// no chips are present (otherwise the chip row IS the display).
|
|
514
|
-
const hasChips = this.#values().length > 0;
|
|
515
|
-
if (display.hasAttribute('contenteditable')) {
|
|
516
|
-
// search input — keep placeholder; never inject the value text.
|
|
517
|
-
display.setAttribute('data-placeholder', hasChips ? '' : (this.placeholder || ''));
|
|
518
|
-
if (!this.#query) {
|
|
519
|
-
display.textContent = '';
|
|
520
|
-
display.toggleAttribute('data-empty', true);
|
|
521
|
-
}
|
|
522
|
-
} else {
|
|
523
|
-
display.textContent = hasChips ? '' : (this.placeholder || '');
|
|
524
|
-
}
|
|
525
|
-
}
|
|
498
|
+
this.#syncDisplayText();
|
|
526
499
|
}
|
|
527
500
|
|
|
528
501
|
// Reflect the selected option's mark/avatar/icon in the trigger leading.
|
|
@@ -597,6 +570,57 @@ export class UISelect extends UIFormElement {
|
|
|
597
570
|
}
|
|
598
571
|
}
|
|
599
572
|
|
|
573
|
+
/**
|
|
574
|
+
* Reconcile the trigger's text with its [data-empty] flag — ALWAYS together.
|
|
575
|
+
*
|
|
576
|
+
* ADIA2-8927. For a searchable trigger the placeholder paints from
|
|
577
|
+
* `[slot="display"][contenteditable][data-empty]::before` (select.css), so
|
|
578
|
+
* text and flag are two halves of ONE state, not two independent writes:
|
|
579
|
+
* set the text and leave the flag and the label renders on top of the
|
|
580
|
+
* placeholder in the same box. `#displayText()` also falls back to
|
|
581
|
+
* `placeholder` when nothing is selected, and that string must never land in
|
|
582
|
+
* the editable surface as real content — the pseudo owns it, so writing it
|
|
583
|
+
* paints the placeholder twice, over itself.
|
|
584
|
+
*
|
|
585
|
+
* This lived inline in render()'s else-branch while `set options` and the
|
|
586
|
+
* FB-98 observer kept their own text-only writes, which is exactly how both
|
|
587
|
+
* drifted: a programmatically populated searchable select showed the overlap
|
|
588
|
+
* until the first click re-entered render() and repaired it. One caller-
|
|
589
|
+
* agnostic method is what keeps a third write site from repeating it.
|
|
590
|
+
*/
|
|
591
|
+
#syncDisplayText() {
|
|
592
|
+
const display = this.querySelector('[slot="display"]');
|
|
593
|
+
if (!display) return; // trigger not stamped yet
|
|
594
|
+
|
|
595
|
+
if (!this.multiple) {
|
|
596
|
+
// Single-select: keep the canonical text-rendering path.
|
|
597
|
+
if (display.hasAttribute('contenteditable')) {
|
|
598
|
+
// Only update text when not actively editing (no active query)
|
|
599
|
+
if (!this.#query) {
|
|
600
|
+
const text = this.#displayText() === this.placeholder ? '' : this.#displayText();
|
|
601
|
+
display.textContent = text;
|
|
602
|
+
display.toggleAttribute('data-empty', !text);
|
|
603
|
+
}
|
|
604
|
+
} else {
|
|
605
|
+
display.textContent = this.#displayText();
|
|
606
|
+
}
|
|
607
|
+
} else {
|
|
608
|
+
// Multi-select: display element holds the placeholder ONLY when
|
|
609
|
+
// no chips are present (otherwise the chip row IS the display).
|
|
610
|
+
const hasChips = this.#values().length > 0;
|
|
611
|
+
if (display.hasAttribute('contenteditable')) {
|
|
612
|
+
// search input — keep placeholder; never inject the value text.
|
|
613
|
+
display.setAttribute('data-placeholder', hasChips ? '' : (this.placeholder || ''));
|
|
614
|
+
if (!this.#query) {
|
|
615
|
+
display.textContent = '';
|
|
616
|
+
display.toggleAttribute('data-empty', true);
|
|
617
|
+
}
|
|
618
|
+
} else {
|
|
619
|
+
display.textContent = hasChips ? '' : (this.placeholder || '');
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
|
|
600
624
|
/** Parse <option> and <optgroup> children into internal model. */
|
|
601
625
|
// FB-98: collect declarative <option>/<optgroup> children — direct OR nested
|
|
602
626
|
// inside the template engine's display:contents wrapper spans (which carry
|
|
@@ -689,8 +713,7 @@ export class UISelect extends UIFormElement {
|
|
|
689
713
|
}
|
|
690
714
|
}
|
|
691
715
|
this.#renderOptions();
|
|
692
|
-
|
|
693
|
-
if (display) display.textContent = this.#displayText();
|
|
716
|
+
this.#syncDisplayText();
|
|
694
717
|
// Pre-existing gap surfaced while adding mark (gh#339): #renderOptions()
|
|
695
718
|
// only rebuilds the LISTBOX rows — the trigger's leading visual
|
|
696
719
|
// (icon/avatar/mark) was only ever reconciled from render()'s call to
|
|
@@ -975,7 +998,8 @@ export class UISelect extends UIFormElement {
|
|
|
975
998
|
return `${this.summaryLabel} (${values.length})`;
|
|
976
999
|
}
|
|
977
1000
|
// SPEC-040 — chips render the selection; display element holds the
|
|
978
|
-
// placeholder when empty and is otherwise empty (CSS sees
|
|
1001
|
+
// placeholder when empty and is otherwise empty (CSS sees
|
|
1002
|
+
// [multiple]:not([summary-label])).
|
|
979
1003
|
return this.value ? '' : this.placeholder;
|
|
980
1004
|
}
|
|
981
1005
|
const flat = this.#options.flatMap(o => o.options || [o]);
|
|
@@ -91,7 +91,7 @@
|
|
|
91
91
|
border: 1px solid var(--select-border);
|
|
92
92
|
border-radius: var(--select-radius);
|
|
93
93
|
background: var(--select-bg);
|
|
94
|
-
line-height:
|
|
94
|
+
line-height: var(--a-font-leading-none);
|
|
95
95
|
cursor: pointer;
|
|
96
96
|
/* Match every property the hover / focus / invalid states change. */
|
|
97
97
|
transition:
|
|
@@ -130,7 +130,7 @@
|
|
|
130
130
|
display: inline-flex;
|
|
131
131
|
align-items: center;
|
|
132
132
|
flex-shrink: 0;
|
|
133
|
-
line-height:
|
|
133
|
+
line-height: var(--a-font-leading-none);
|
|
134
134
|
--a-icon-size: var(--select-font-size);
|
|
135
135
|
color: var(--select-fg-muted);
|
|
136
136
|
}
|
|
@@ -215,11 +215,13 @@
|
|
|
215
215
|
}
|
|
216
216
|
|
|
217
217
|
/* ── SPEC-040 — Multi-select chip trigger ──
|
|
218
|
-
[
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
218
|
+
[multiple]:not([summary-label]) — both already-declared, reflected
|
|
219
|
+
props; no private stamp needed (dropped the redundant [data-multi-chips]
|
|
220
|
+
mirror, gh#1332 Category A). Layout switches from inline-text trigger
|
|
221
|
+
to wrap-flex chip row. Tag-ui chips inside [data-chips] inherit the
|
|
222
|
+
host's tag-ui token set; the +more pill is a CSS-only button styled
|
|
223
|
+
to match. */
|
|
224
|
+
:scope[multiple]:not([summary-label]) [slot="trigger"] {
|
|
223
225
|
flex-wrap: wrap;
|
|
224
226
|
align-items: center;
|
|
225
227
|
/* Pack chips left with a small gap — override the base trigger's
|
|
@@ -232,17 +234,17 @@
|
|
|
232
234
|
it to grow as chips overflow. */
|
|
233
235
|
padding-block: calc(var(--select-py, var(--a-space-1)));
|
|
234
236
|
}
|
|
235
|
-
:scope[
|
|
237
|
+
:scope[multiple]:not([summary-label]) [data-chips] {
|
|
236
238
|
display: contents; /* let chips participate in the trigger's flex line */
|
|
237
239
|
}
|
|
238
|
-
:scope[
|
|
240
|
+
:scope[multiple]:not([summary-label]) [data-chips] tag-ui {
|
|
239
241
|
/* Chip styling tracks the active variant via tag-ui's own tokens. */
|
|
240
242
|
--tag-size: var(--a-ui-tiny);
|
|
241
243
|
}
|
|
242
244
|
/* "+N more" overflow pill — a stamped <button-ui variant="ghost" size="sm">
|
|
243
245
|
(gh issue 276: no native <button> in stamped DOM); pill shape + chip-row
|
|
244
246
|
height via button token re-points, chrome stays button-ui's own. */
|
|
245
|
-
:scope[
|
|
247
|
+
:scope[multiple]:not([summary-label]) [data-chips] [data-more] {
|
|
246
248
|
--button-radius: var(--a-radius-full);
|
|
247
249
|
--button-height: calc(var(--a-size) - var(--a-space-3));
|
|
248
250
|
--button-fg: var(--select-fg-muted);
|
|
@@ -252,7 +254,7 @@
|
|
|
252
254
|
|
|
253
255
|
/* Clear-all `x` affordance — stamped <button-ui variant="ghost" size="sm"
|
|
254
256
|
icon="x"> (gh issue 276). Visible only when [clearable] AND chips. */
|
|
255
|
-
:scope[
|
|
257
|
+
:scope[multiple]:not([summary-label]) [data-clear-all] {
|
|
256
258
|
--button-radius: var(--a-radius-full);
|
|
257
259
|
--button-height: calc(var(--a-size) - var(--a-space-3));
|
|
258
260
|
--button-fg: var(--select-fg-muted);
|
|
@@ -263,16 +265,16 @@
|
|
|
263
265
|
}
|
|
264
266
|
/* button-ui's own :scope display wins over the UA [hidden] rule —
|
|
265
267
|
keep the explicit guard. */
|
|
266
|
-
:scope[
|
|
268
|
+
:scope[multiple]:not([summary-label]) [data-clear-all][hidden] { display: none; }
|
|
267
269
|
|
|
268
270
|
/* In multi-select with chips present, the trigger display element is
|
|
269
271
|
the rest-of-row slot — make it flex-grow but not push chips off. */
|
|
270
|
-
:scope[
|
|
272
|
+
:scope[multiple]:not([summary-label]) [slot="display"] {
|
|
271
273
|
flex: 1;
|
|
272
274
|
min-width: 4ch;
|
|
273
275
|
}
|
|
274
276
|
/* Hide the display when empty in multi-mode (chips fill the slot). */
|
|
275
|
-
:scope[
|
|
277
|
+
:scope[multiple]:not([summary-label]) [slot="display"]:empty {
|
|
276
278
|
flex: 0 0 0;
|
|
277
279
|
padding: 0;
|
|
278
280
|
}
|
|
@@ -414,7 +416,7 @@ select-ui [role="group"] [slot="group-label"] {
|
|
|
414
416
|
font-weight: var(--a-ui-weight);
|
|
415
417
|
color: var(--select-fg-muted);
|
|
416
418
|
text-transform: uppercase;
|
|
417
|
-
letter-spacing:
|
|
419
|
+
letter-spacing: var(--a-font-tracking-wide);
|
|
418
420
|
white-space: nowrap;
|
|
419
421
|
}
|
|
420
422
|
|
|
@@ -432,7 +434,7 @@ select-ui [slot="hint"] {
|
|
|
432
434
|
margin-top: var(--select-hint-mt, var(--a-space-1));
|
|
433
435
|
font-size: var(--select-hint-size, var(--a-ui-xs));
|
|
434
436
|
color: var(--select-hint-fg, var(--select-fg-muted));
|
|
435
|
-
line-height: var(--select-hint-lh,
|
|
437
|
+
line-height: var(--select-hint-lh, var(--a-font-leading-normal));
|
|
436
438
|
}
|
|
437
439
|
|
|
438
440
|
/* ── SPEC-040 — Multi-select popover affordances ──
|
|
@@ -147,7 +147,7 @@ props:
|
|
|
147
147
|
form for narrow triggers (filter bars) where wrapping chips
|
|
148
148
|
would balloon the control.
|
|
149
149
|
type: string
|
|
150
|
-
default:
|
|
150
|
+
default: ''
|
|
151
151
|
reflect: true
|
|
152
152
|
min:
|
|
153
153
|
description: |
|
|
@@ -251,17 +251,28 @@ usage: |-
|
|
|
251
251
|
</script>
|
|
252
252
|
```
|
|
253
253
|
slots:
|
|
254
|
-
label:
|
|
255
|
-
description: Label element above the trigger
|
|
256
|
-
listbox:
|
|
257
|
-
description: Popover container for options (role=listbox)
|
|
258
254
|
trigger:
|
|
259
|
-
description:
|
|
255
|
+
description: >-
|
|
256
|
+
Button that opens the listbox. Stamped only if no consumer-authored
|
|
257
|
+
[slot="trigger"] is already present at first render (adopt-or-stamp) —
|
|
258
|
+
a genuine light-DOM insertion point.
|
|
259
|
+
parts:
|
|
260
|
+
listbox:
|
|
261
|
+
description: >-
|
|
262
|
+
Popover container for options (role=listbox) — template-owned anatomy
|
|
263
|
+
part, not a light-DOM insertion point (gh#1454). Its contents are
|
|
264
|
+
always wiped (`innerHTML = ''`) and rebuilt wholesale from `.options`/
|
|
265
|
+
parsed `<option>` children on every options render.
|
|
260
266
|
hint:
|
|
261
267
|
description: >-
|
|
262
268
|
Override slot for hint markup richer than the plain [hint] attribute
|
|
263
269
|
string (inline links, code spans). Renders beneath the trigger at
|
|
264
|
-
body-subtle typography. Mutually exclusive with [hint]
|
|
270
|
+
body-subtle typography. Mutually exclusive with [hint] per this
|
|
271
|
+
description, but template-owned in practice (gh#1454): the trigger
|
|
272
|
+
stamp is an unconditional `this.innerHTML = …` with no
|
|
273
|
+
capture-before-wipe for `hint` (unlike `leading`/`trailing` on
|
|
274
|
+
input-ui), so any pre-existing [slot="hint"] content is discarded, not
|
|
275
|
+
adopted, on first render.
|
|
265
276
|
states:
|
|
266
277
|
- name: idle
|
|
267
278
|
description: Default, ready for interaction.
|
|
@@ -16,13 +16,8 @@
|
|
|
16
16
|
"component": {
|
|
17
17
|
"const": "Skeleton"
|
|
18
18
|
},
|
|
19
|
-
"
|
|
20
|
-
"description": "
|
|
21
|
-
"type": "string",
|
|
22
|
-
"default": "1.2em"
|
|
23
|
-
},
|
|
24
|
-
"radius": {
|
|
25
|
-
"description": "Border radius",
|
|
19
|
+
"cornerRadius": {
|
|
20
|
+
"description": "Border radius. Renamed from `[radius]` (gh#1335) — a preset-enum can't share a name with the global Enum·preset `[radius]` attribute (`sharp`/`rounded`/`round`), whose vocabulary is unrelated (ADR-0053); mirrors chart-ui's own `[corner-radius]` fix (ADR-0054).",
|
|
26
21
|
"type": "string",
|
|
27
22
|
"enum": [
|
|
28
23
|
"none",
|
|
@@ -33,6 +28,11 @@
|
|
|
33
28
|
],
|
|
34
29
|
"default": "sm"
|
|
35
30
|
},
|
|
31
|
+
"height": {
|
|
32
|
+
"description": "Height of the placeholder.",
|
|
33
|
+
"type": "string",
|
|
34
|
+
"default": "1.2em"
|
|
35
|
+
},
|
|
36
36
|
"static": {
|
|
37
37
|
"description": "When true, suppress the shimmer animation.",
|
|
38
38
|
"type": "boolean",
|
|
@@ -68,6 +68,7 @@
|
|
|
68
68
|
"shimmer"
|
|
69
69
|
],
|
|
70
70
|
"name": "UISkeleton",
|
|
71
|
+
"parts": {},
|
|
71
72
|
"related": [
|
|
72
73
|
"EmptyState",
|
|
73
74
|
"Card",
|
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
|
-
* <skeleton-ui width="200px" height="1.2em" radius="sm"></skeleton-ui>
|
|
16
|
-
* <skeleton-ui width="100%" height="3rem" radius="md" static></skeleton-ui>
|
|
15
|
+
* <skeleton-ui width="200px" height="1.2em" corner-radius="sm"></skeleton-ui>
|
|
16
|
+
* <skeleton-ui width="100%" height="3rem" corner-radius="md" static></skeleton-ui>
|
|
17
17
|
*
|
|
18
18
|
* Placeholder shimmer for loading states.
|
|
19
19
|
* Purely presentational — no DOM stamping needed.
|
|
@@ -21,17 +21,18 @@
|
|
|
21
21
|
* Props (attributes):
|
|
22
22
|
* static — suppress the shimmer animation (default: false — shimmer on)
|
|
23
23
|
*
|
|
24
|
-
*
|
|
24
|
+
* Corner radius: none, sm (default), md, lg, full. Renamed from `[radius]`
|
|
25
|
+
* (gh#1335) — see skeleton.yaml.
|
|
25
26
|
*/
|
|
26
27
|
|
|
27
28
|
import { UIElement } from '../../core/element.js';
|
|
28
29
|
|
|
29
30
|
export class UISkeleton extends UIElement {
|
|
30
31
|
static properties = {
|
|
31
|
-
width:
|
|
32
|
-
height:
|
|
33
|
-
|
|
34
|
-
static:
|
|
32
|
+
width: { type: String, default: '100%', reflect: true },
|
|
33
|
+
height: { type: String, default: '1.2em', reflect: true },
|
|
34
|
+
cornerRadius: { type: String, default: 'sm', reflect: true, attribute: 'corner-radius' },
|
|
35
|
+
static: { type: Boolean, default: false, reflect: true },
|
|
35
36
|
};
|
|
36
37
|
|
|
37
38
|
static template = () => null;
|
|
@@ -18,12 +18,27 @@
|
|
|
18
18
|
border-radius: var(--skeleton-radius);
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
/* ──
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
21
|
+
/* ── Overlay mode (gh#1362) ──
|
|
22
|
+
Set by a composing parent (e.g. image-ui) that wants this element
|
|
23
|
+
positioned absolutely over itself. Declared here, inside skeleton-ui's
|
|
24
|
+
OWN `@scope` block, so it competes at skeleton-ui's own proximity (0)
|
|
25
|
+
against the base `:scope { position: relative }` rule above — an
|
|
26
|
+
equal-proximity tie the higher-specificity attribute selector wins
|
|
27
|
+
outright. A parent's own `@scope` overlay rule (image-ui's included)
|
|
28
|
+
can NEVER win this by raising its own specificity: `@scope` proximity
|
|
29
|
+
is resolved before specificity, and that parent's scoping root is one
|
|
30
|
+
level further away (proximity 1) — see CSS Cascade & Inheritance L6. */
|
|
31
|
+
:scope[data-overlay] {
|
|
32
|
+
position: absolute;
|
|
33
|
+
inset: 0;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/* ── Corner-radius variants (attribute renamed from [radius], gh#1335) ── */
|
|
37
|
+
:scope[corner-radius="none"] { --skeleton-radius: 0; }
|
|
38
|
+
:scope[corner-radius="sm"] { --skeleton-radius: var(--a-radius-sm); }
|
|
39
|
+
:scope[corner-radius="md"] { --skeleton-radius: var(--a-radius-md); }
|
|
40
|
+
:scope[corner-radius="lg"] { --skeleton-radius: var(--a-radius-lg); }
|
|
41
|
+
:scope[corner-radius="full"] { --skeleton-radius: var(--a-radius-full); }
|
|
27
42
|
|
|
28
43
|
/* ── Shimmer animation (default; suppress with [static]) ── */
|
|
29
44
|
:scope:not([static])::after {
|
|
@@ -13,10 +13,10 @@
|
|
|
13
13
|
import { UIElement } from '../../core/element.js';
|
|
14
14
|
|
|
15
15
|
export class UISkeleton extends UIElement {
|
|
16
|
+
/** Border radius. Renamed from `[radius]` (gh#1335) — a preset-enum can't share a name with the global Enum·preset `[radius]` attribute (`sharp`/`rounded`/`round`), whose vocabulary is unrelated (ADR-0053); mirrors chart-ui's own `[corner-radius]` fix (ADR-0054). */
|
|
17
|
+
cornerRadius: 'none' | 'sm' | 'md' | 'lg' | 'full';
|
|
16
18
|
/** Height of the placeholder. */
|
|
17
19
|
height: string;
|
|
18
|
-
/** Border radius */
|
|
19
|
-
radius: 'none' | 'sm' | 'md' | 'lg' | 'full';
|
|
20
20
|
/** When true, suppress the shimmer animation. */
|
|
21
21
|
static: boolean;
|
|
22
22
|
/** Width of the placeholder. */
|
|
@@ -6,10 +6,10 @@
|
|
|
6
6
|
<skeleton-ui width="100px" height="1em"></skeleton-ui>
|
|
7
7
|
```
|
|
8
8
|
|
|
9
|
-
## radius
|
|
9
|
+
## corner-radius
|
|
10
10
|
|
|
11
11
|
```html
|
|
12
|
-
<skeleton-ui width="120px" height="2em" radius="none"></skeleton-ui>
|
|
12
|
+
<skeleton-ui width="120px" height="2em" corner-radius="none"></skeleton-ui>
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
## static
|
|
@@ -17,10 +17,11 @@ props:
|
|
|
17
17
|
description: Height of the placeholder.
|
|
18
18
|
type: string
|
|
19
19
|
default: 1.2em
|
|
20
|
-
|
|
21
|
-
description: Border radius
|
|
20
|
+
cornerRadius:
|
|
21
|
+
description: Border radius. Renamed from `[radius]` (gh#1335) — a preset-enum can't share a name with the global Enum·preset `[radius]` attribute (`sharp`/`rounded`/`round`), whose vocabulary is unrelated (ADR-0053); mirrors chart-ui's own `[corner-radius]` fix (ADR-0054).
|
|
22
22
|
type: string
|
|
23
23
|
default: sm
|
|
24
|
+
attribute: corner-radius
|
|
24
25
|
enum:
|
|
25
26
|
- none
|
|
26
27
|
- sm
|