@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
|
@@ -28,6 +28,14 @@ props:
|
|
|
28
28
|
description:
|
|
29
29
|
description: Secondary line below the primary text. Subtle color.
|
|
30
30
|
type: string
|
|
31
|
+
selected:
|
|
32
|
+
description: >-
|
|
33
|
+
Whether this row is the current selection. Managed by the parent
|
|
34
|
+
<list-ui>[selectable] — don't set directly; the parent's
|
|
35
|
+
[selectedKey] is the single source of truth (ADR-0056).
|
|
36
|
+
type: boolean
|
|
37
|
+
default: false
|
|
38
|
+
reflect: true
|
|
31
39
|
|
|
32
40
|
slots:
|
|
33
41
|
text:
|
|
@@ -78,6 +86,8 @@ related:
|
|
|
78
86
|
- TreeItem
|
|
79
87
|
|
|
80
88
|
a2ui:
|
|
89
|
+
allowedParents:
|
|
90
|
+
- List
|
|
81
91
|
rules:
|
|
82
92
|
- rule: 'Child of <list-ui> — one row of generic-list content.'
|
|
83
93
|
reason: 'Cluster contract.'
|
|
@@ -85,3 +95,5 @@ a2ui:
|
|
|
85
95
|
reason: 'Per-context list-row primitives — list-item is generic.'
|
|
86
96
|
- rule: 'Interactive list-items should have role=''button'' or be wrapped in <button-ui>; default is non-interactive.'
|
|
87
97
|
reason: 'Accessibility — semantic clarity.'
|
|
98
|
+
- rule: '[selected] reflects the row current-selection state under <list-ui selectable> — it is parent-managed (ADR-0056); drive selection via the parent''s [selectedKey], never [selected] directly.'
|
|
99
|
+
reason: 'Single source of truth stays on the parent, mirroring <segment-ui>.'
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "https://adiaui.dev/a2ui/v0_9/components/List.json",
|
|
4
4
|
"title": "List",
|
|
5
|
-
"description": "Styled flat list with optional row dividers and icons — each row\nis a <list-item-ui> child. Selectable mode via [selectable] +\n[selectedKey] / `
|
|
5
|
+
"description": "Styled flat list with optional row dividers and icons — each row\nis a <list-item-ui> child. Selectable mode via [selectable] +\n[selectedKey] / `selection-change` event. Composes <icon-ui> for row\nleading glyphs. Distinct from <nav-ui> (sidebar navigation, route-aware),\n<tree-ui> (hierarchical with arbitrary nesting), and <table-ui>\n(tabular data with columns). Use list-ui for non-navigable,\nnon-tabular vertical rows — comment lists, file lists, message\nstreams outside chat-shell.\n",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"allOf": [
|
|
8
8
|
{
|
|
@@ -32,13 +32,18 @@
|
|
|
32
32
|
"default": false
|
|
33
33
|
},
|
|
34
34
|
"selectedKey": {
|
|
35
|
-
"description": "ID (or data-key) of the currently-selected child listitem.",
|
|
35
|
+
"description": "ID (or data-key) of the currently-selected child listitem — drives each child's [selected] reflected prop (ADR-0056, #1363 B7). Kept as `selectedKey` rather than renamed to `value` (segmented/tabs/ select's parent-selection prop name): list rows are identified by DOM id/data-key, not an option value, and ADR-0056 itself governs only the child's own [selected] state surface, not this naming — a cross-family rename has no ratifying ADR (B5/B9-shaped follow-up).",
|
|
36
36
|
"type": "string",
|
|
37
37
|
"default": ""
|
|
38
38
|
},
|
|
39
39
|
"spacing": {
|
|
40
|
-
"description": "Item spacing",
|
|
40
|
+
"description": "Item spacing scale — `sm`/`lg` modulate the per-item inset; `md` (default) is the base inset.",
|
|
41
41
|
"type": "string",
|
|
42
|
+
"enum": [
|
|
43
|
+
"sm",
|
|
44
|
+
"md",
|
|
45
|
+
"lg"
|
|
46
|
+
],
|
|
42
47
|
"default": "md"
|
|
43
48
|
}
|
|
44
49
|
},
|
|
@@ -84,6 +89,7 @@
|
|
|
84
89
|
"star"
|
|
85
90
|
],
|
|
86
91
|
"name": "UIList",
|
|
92
|
+
"parts": {},
|
|
87
93
|
"related": [
|
|
88
94
|
"ListItem",
|
|
89
95
|
"Tree",
|
|
@@ -28,7 +28,9 @@
|
|
|
28
28
|
* When `selectable`:
|
|
29
29
|
* - Children (role="listitem") become keyboard-focusable via roving tabindex.
|
|
30
30
|
* - Click selects the child; key is its id or data-key.
|
|
31
|
-
* - aria-selected
|
|
31
|
+
* - [selected] (ADR-0056, #1363 B7) and aria-selected are both set on
|
|
32
|
+
* all children — [selected] is the declared API state, aria-selected
|
|
33
|
+
* is wiring.
|
|
32
34
|
* - Fires `selection-change` with { key, previousKey }.
|
|
33
35
|
*/
|
|
34
36
|
|
|
@@ -73,6 +75,7 @@ export class UIList extends UIElement {
|
|
|
73
75
|
// (patient-visit rail's roving tabindex, gh#746).
|
|
74
76
|
if (this.#stampedSelection) {
|
|
75
77
|
for (const ch of this.#items()) {
|
|
78
|
+
ch.removeAttribute('selected');
|
|
76
79
|
ch.removeAttribute('aria-selected');
|
|
77
80
|
ch.removeAttribute('tabindex');
|
|
78
81
|
}
|
|
@@ -87,6 +90,11 @@ export class UIList extends UIElement {
|
|
|
87
90
|
for (const ch of items) {
|
|
88
91
|
const k = this.#keyOf(ch);
|
|
89
92
|
const selected = k && k === key;
|
|
93
|
+
// [selected] (ADR-0056, #1363 B7) is the declared, reflected API
|
|
94
|
+
// surface — parent-managed, mirrors <segment-ui>. aria-selected
|
|
95
|
+
// stays as-is: ARIA is wiring, not API.
|
|
96
|
+
if (selected) ch.setAttribute('selected', '');
|
|
97
|
+
else ch.removeAttribute('selected');
|
|
90
98
|
ch.setAttribute('aria-selected', selected ? 'true' : 'false');
|
|
91
99
|
ch.setAttribute('tabindex', selected ? '0' : '-1');
|
|
92
100
|
if (selected) focusTarget = ch;
|
|
@@ -173,6 +181,11 @@ export class UIListItem extends UIElement {
|
|
|
173
181
|
icon: { type: String, default: '', reflect: true },
|
|
174
182
|
text: { type: String, default: '', reflect: true },
|
|
175
183
|
description: { type: String, default: '', reflect: true },
|
|
184
|
+
// ADR-0056 (gh#1303, #1363 B7): declared reflected selection-item
|
|
185
|
+
// state, parent-managed — <list-ui>[selectable] stamps this instead
|
|
186
|
+
// of leaving selection visible only via aria-selected. Mirrors
|
|
187
|
+
// <segment-ui>'s [selected].
|
|
188
|
+
selected: { type: Boolean, default: false, reflect: true },
|
|
176
189
|
};
|
|
177
190
|
|
|
178
191
|
static template = () => null;
|
package/components/list/list.css
CHANGED
|
@@ -67,7 +67,18 @@
|
|
|
67
67
|
background: var(--a-bg-hover);
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
-
|
|
70
|
+
/* [selected] is the declared, reflected state hook (ADR-0056, #1363 B7)
|
|
71
|
+
— list.class.js stamps it in lockstep with aria-selected; ARIA stays
|
|
72
|
+
wiring, not the style hook. Matched on the tag directly (not only
|
|
73
|
+
[role="listitem"]): UIList's adopt-or-stamp (gh#753) lets a
|
|
74
|
+
consumer-authored role (e.g. role="button") survive on <list-item-ui>
|
|
75
|
+
— #items() still selects/stamps it by TAG, so the style hook must
|
|
76
|
+
too, or a role-overridden selected row silently loses its selected
|
|
77
|
+
colors. The role fallback stays for non-list-item-ui children that
|
|
78
|
+
opt into role="listitem" themselves (list-ui also hosts "arbitrary
|
|
79
|
+
children", list.yaml). */
|
|
80
|
+
:scope[selectable] > list-item-ui[selected],
|
|
81
|
+
:scope[selectable] > [role="listitem"][selected] {
|
|
71
82
|
background: var(--list-bg-selected);
|
|
72
83
|
color: var(--list-fg-selected);
|
|
73
84
|
border-inline-start-color: var(--list-border-selected);
|
|
@@ -125,7 +136,7 @@
|
|
|
125
136
|
row-gap: var(--list-item-gap-row);
|
|
126
137
|
font-size: var(--list-item-font-size);
|
|
127
138
|
color: var(--list-item-text-color);
|
|
128
|
-
line-height:
|
|
139
|
+
line-height: var(--a-font-leading-normal);
|
|
129
140
|
/* Defensive floor: empty list-item-ui (no text/icon/children) collapses
|
|
130
141
|
to 0 height and disappears. Keep a visible row instead. */
|
|
131
142
|
min-height: var(--a-space-6);
|
|
@@ -175,7 +186,7 @@
|
|
|
175
186
|
grid-row: 2;
|
|
176
187
|
color: var(--list-item-desc-color);
|
|
177
188
|
font-size: var(--list-item-desc-font-size);
|
|
178
|
-
line-height:
|
|
189
|
+
line-height: var(--a-font-leading-normal);
|
|
179
190
|
}
|
|
180
191
|
|
|
181
192
|
/* When a [slot="action"] child is present, the grid becomes 3-column:
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `<list-ui>` — Styled flat list with optional row dividers and icons — each row
|
|
3
3
|
is a <list-item-ui> child. Selectable mode via [selectable] +
|
|
4
|
-
[selectedKey] / `
|
|
5
|
-
glyphs. Distinct from <nav-ui> (sidebar navigation, route-aware),
|
|
4
|
+
[selectedKey] / `selection-change` event. Composes <icon-ui> for row
|
|
5
|
+
leading glyphs. Distinct from <nav-ui> (sidebar navigation, route-aware),
|
|
6
6
|
<tree-ui> (hierarchical with arbitrary nesting), and <table-ui>
|
|
7
7
|
(tabular data with columns). Use list-ui for non-navigable,
|
|
8
8
|
non-tabular vertical rows — comment lists, file lists, message
|
|
@@ -41,10 +41,10 @@ so content sits at the list-ui edges (canonical edge-to-edge style).
|
|
|
41
41
|
divider: boolean;
|
|
42
42
|
/** Enable selection on child listitems (roving tabindex + aria-selected). */
|
|
43
43
|
selectable: boolean;
|
|
44
|
-
/** ID (or data-key) of the currently-selected child listitem. */
|
|
44
|
+
/** ID (or data-key) of the currently-selected child listitem — drives each child's [selected] reflected prop (ADR-0056, #1363 B7). Kept as `selectedKey` rather than renamed to `value` (segmented/tabs/ select's parent-selection prop name): list rows are identified by DOM id/data-key, not an option value, and ADR-0056 itself governs only the child's own [selected] state surface, not this naming — a cross-family rename has no ratifying ADR (B5/B9-shaped follow-up). */
|
|
45
45
|
selectedKey: string;
|
|
46
|
-
/** Item spacing */
|
|
47
|
-
spacing:
|
|
46
|
+
/** Item spacing scale — `sm`/`lg` modulate the per-item inset; `md` (default) is the base inset. */
|
|
47
|
+
spacing: 'sm' | 'md' | 'lg';
|
|
48
48
|
|
|
49
49
|
addEventListener(type: 'selection-change', listener: (ev: ListSelectionChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
50
50
|
addEventListener<K extends keyof HTMLElementEventMap>(
|
|
@@ -59,6 +59,8 @@ export class UIListItem extends UIElement {
|
|
|
59
59
|
description: string;
|
|
60
60
|
/** Optional leading icon name (Phosphor). */
|
|
61
61
|
icon: string;
|
|
62
|
+
/** Whether this row is the current selection. Managed by the parent <list-ui>[selectable] — don't set directly; the parent's [selectedKey] is the single source of truth (ADR-0056). */
|
|
63
|
+
selected: boolean;
|
|
62
64
|
/** Primary text. Renders as semibold inline body. */
|
|
63
65
|
text: string;
|
|
64
66
|
}
|
|
@@ -10,8 +10,8 @@ version: 1
|
|
|
10
10
|
description: |
|
|
11
11
|
Styled flat list with optional row dividers and icons — each row
|
|
12
12
|
is a <list-item-ui> child. Selectable mode via [selectable] +
|
|
13
|
-
[selectedKey] / `
|
|
14
|
-
glyphs. Distinct from <nav-ui> (sidebar navigation, route-aware),
|
|
13
|
+
[selectedKey] / `selection-change` event. Composes <icon-ui> for row
|
|
14
|
+
leading glyphs. Distinct from <nav-ui> (sidebar navigation, route-aware),
|
|
15
15
|
<tree-ui> (hierarchical with arbitrary nesting), and <table-ui>
|
|
16
16
|
(tabular data with columns). Use list-ui for non-navigable,
|
|
17
17
|
non-tabular vertical rows — comment lists, file lists, message
|
|
@@ -40,14 +40,22 @@ props:
|
|
|
40
40
|
type: boolean
|
|
41
41
|
default: false
|
|
42
42
|
selectedKey:
|
|
43
|
-
description:
|
|
43
|
+
description: >-
|
|
44
|
+
ID (or data-key) of the currently-selected child listitem — drives
|
|
45
|
+
each child's [selected] reflected prop (ADR-0056, #1363 B7). Kept
|
|
46
|
+
as `selectedKey` rather than renamed to `value` (segmented/tabs/
|
|
47
|
+
select's parent-selection prop name): list rows are identified by
|
|
48
|
+
DOM id/data-key, not an option value, and ADR-0056 itself governs
|
|
49
|
+
only the child's own [selected] state surface, not this naming —
|
|
50
|
+
a cross-family rename has no ratifying ADR (B5/B9-shaped follow-up).
|
|
44
51
|
type: string
|
|
45
52
|
default: ""
|
|
46
53
|
attribute: selected-key
|
|
47
54
|
spacing:
|
|
48
|
-
description: Item spacing
|
|
55
|
+
description: Item spacing scale — `sm`/`lg` modulate the per-item inset; `md` (default) is the base inset.
|
|
49
56
|
type: string
|
|
50
57
|
default: md
|
|
58
|
+
enum: [sm, md, lg]
|
|
51
59
|
events:
|
|
52
60
|
selection-change:
|
|
53
61
|
description: "Fired on selection-change."
|
|
@@ -68,10 +76,12 @@ a2ui:
|
|
|
68
76
|
rules:
|
|
69
77
|
- rule: 'Generic vertical list container — hosts <list-item-ui> or arbitrary children.'
|
|
70
78
|
reason: 'Lowest-friction list primitive.'
|
|
71
|
-
- rule: '
|
|
72
|
-
reason: '
|
|
79
|
+
- rule: 'list-ui supports single selection natively via [selectable] + [selectedKey] (ADR-0056, #1363 B7) — the parent stamps the matching <list-item-ui>''s [selected] + aria-selected and fires selection-change. For route-aware navigation use <nav-ui> instead; for a popover action menu use <menu-ui> instead — both have different interaction contracts than a plain selectable list.'
|
|
80
|
+
reason: 'list-ui selectable is the supported non-navigation, non-menu selection surface; nav-ui/menu-ui remain the right choice for their own contracts.'
|
|
73
81
|
- rule: 'For data-grid / sortable / sticky-header needs use <table-ui> instead.'
|
|
74
82
|
reason: 'Table has different semantics.'
|
|
83
|
+
- rule: 'list-ui carries no fire-and-forget "action" mode. [selectable] keeps a persisted single selection (`selectedKey` / `aria-selected`, roving tabindex); for rows that activate immediately with no persisted selection state use <action-list-ui> + <action-item-ui> instead.'
|
|
84
|
+
reason: 'Container-level decision (#1363 C5): kept separate rather than absorbed as a mode axis — stateful selection and fire-and-forget activation are genuinely different interaction contracts, and list-item-ui''s selection state is under active convergence elsewhere (#1379); rationale in gh#1374 Findings.'
|
|
75
85
|
anti_patterns: []
|
|
76
86
|
examples:
|
|
77
87
|
- name: basic-list
|
|
@@ -44,6 +44,7 @@
|
|
|
44
44
|
*/
|
|
45
45
|
|
|
46
46
|
import { UIElement } from '../../core/element.js';
|
|
47
|
+
import { isNode } from '../../core/dom.js';
|
|
47
48
|
|
|
48
49
|
export class UIListWindow extends UIElement {
|
|
49
50
|
static properties = {
|
|
@@ -616,7 +617,7 @@ export class UIListWindow extends UIElement {
|
|
|
616
617
|
try { content = renderFn(item, index); }
|
|
617
618
|
catch (err) { console.warn('[list-window-ui] render() threw:', err); }
|
|
618
619
|
}
|
|
619
|
-
if (content
|
|
620
|
+
if (isNode(content)) {
|
|
620
621
|
row.appendChild(content);
|
|
621
622
|
} else if (content != null) {
|
|
622
623
|
row.textContent = String(content);
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"wrong": "<mark>matched</mark>"
|
|
41
41
|
}
|
|
42
42
|
],
|
|
43
|
-
"category": "
|
|
43
|
+
"category": "display",
|
|
44
44
|
"composes": [],
|
|
45
45
|
"events": {},
|
|
46
46
|
"examples": [
|
|
@@ -57,6 +57,7 @@
|
|
|
57
57
|
"emphasis"
|
|
58
58
|
],
|
|
59
59
|
"name": "UIMark",
|
|
60
|
+
"parts": {},
|
|
60
61
|
"related": [
|
|
61
62
|
"text",
|
|
62
63
|
"tag"
|
|
@@ -79,6 +79,11 @@ a2ui:
|
|
|
79
79
|
Use slot="icon" / slot="text" only when you need custom markup
|
|
80
80
|
(e.g. <avatar-ui slot="icon">, <kbd slot="trailing"> shortcut
|
|
81
81
|
hint).
|
|
82
|
+
- >-
|
|
83
|
+
<action-item-ui> (child of <action-list-ui>) shares this row contract
|
|
84
|
+
(icon/text/subtitle/value/variant/disabled props, icon/text/subtitle/
|
|
85
|
+
trailing slot overrides) for inline, non-popover command rows — use
|
|
86
|
+
it instead when the surface isn't a <menu-ui> popover (#1363 C5).
|
|
82
87
|
|
|
83
88
|
keywords:
|
|
84
89
|
- menu-item
|
|
@@ -91,6 +96,7 @@ related:
|
|
|
91
96
|
- MenuDivider
|
|
92
97
|
- Button
|
|
93
98
|
- NavItem
|
|
99
|
+
- ActionItem
|
|
94
100
|
|
|
95
101
|
synonyms:
|
|
96
102
|
menu-item: [dropdown-item, menu-row, popover-action]
|
|
@@ -16,8 +16,8 @@
|
|
|
16
16
|
"component": {
|
|
17
17
|
"const": "Menu"
|
|
18
18
|
},
|
|
19
|
-
"
|
|
20
|
-
"description": "
|
|
19
|
+
"offset": {
|
|
20
|
+
"description": "Pixel offset between the anchor (trigger) and the menu popover. Renamed from `[gap]` (gh#1335) — a raw-px number can't share a name with the global Scale-grammar `[gap]` attribute (ADR-0053); matches popover-ui's own `[offset]` (same anchorPopover() helper).",
|
|
21
21
|
"type": "number",
|
|
22
22
|
"default": 4
|
|
23
23
|
},
|
|
@@ -81,6 +81,7 @@
|
|
|
81
81
|
"right-click"
|
|
82
82
|
],
|
|
83
83
|
"name": "UIMenu",
|
|
84
|
+
"parts": {},
|
|
84
85
|
"related": [
|
|
85
86
|
"MenuItem",
|
|
86
87
|
"MenuDivider",
|
|
@@ -35,7 +35,7 @@ export class UIMenu extends UIElement {
|
|
|
35
35
|
static properties = {
|
|
36
36
|
open: { type: Boolean, default: false, reflect: true },
|
|
37
37
|
placement: { type: String, default: 'bottom-start', reflect: true },
|
|
38
|
-
|
|
38
|
+
offset: { type: Number, default: 4, reflect: true },
|
|
39
39
|
};
|
|
40
40
|
|
|
41
41
|
static template = () => null;
|
|
@@ -103,7 +103,7 @@ export class UIMenu extends UIElement {
|
|
|
103
103
|
this.#anchorCleanup?.();
|
|
104
104
|
this.#anchorCleanup = anchorPopover(trigger, pop, {
|
|
105
105
|
placement: this.placement,
|
|
106
|
-
gap: this.
|
|
106
|
+
gap: this.offset,
|
|
107
107
|
});
|
|
108
108
|
|
|
109
109
|
// Focus first enabled item (only when opened via keyboard).
|
|
@@ -22,8 +22,8 @@ export interface MenuActionEventDetail {
|
|
|
22
22
|
export type MenuActionEvent = CustomEvent<MenuActionEventDetail>;
|
|
23
23
|
|
|
24
24
|
export class UIMenu extends UIElement {
|
|
25
|
-
/**
|
|
26
|
-
|
|
25
|
+
/** Pixel offset between the anchor (trigger) and the menu popover. Renamed from `[gap]` (gh#1335) — a raw-px number can't share a name with the global Scale-grammar `[gap]` attribute (ADR-0053); matches popover-ui's own `[offset]` (same anchorPopover() helper). */
|
|
26
|
+
offset: number;
|
|
27
27
|
/** Controls visibility via popover API */
|
|
28
28
|
open: boolean;
|
|
29
29
|
/** Preferred position relative to the anchor element */
|
|
@@ -13,8 +13,8 @@ description: Dropdown action menu with roving focus and keyboard navigation. Use
|
|
|
13
13
|
composes:
|
|
14
14
|
- icon-ui # leading affordances on menu items (created in render)
|
|
15
15
|
props:
|
|
16
|
-
|
|
17
|
-
description:
|
|
16
|
+
offset:
|
|
17
|
+
description: Pixel offset between the anchor (trigger) and the menu popover. Renamed from `[gap]` (gh#1335) — a raw-px number can't share a name with the global Scale-grammar `[gap]` attribute (ADR-0053); matches popover-ui's own `[offset]` (same anchorPopover() helper).
|
|
18
18
|
type: number
|
|
19
19
|
default: 4
|
|
20
20
|
open:
|
|
@@ -83,7 +83,7 @@ a2ui:
|
|
|
83
83
|
Set [placement="top-start"] or [placement="top-end"] when the
|
|
84
84
|
trigger sits near the bottom of the viewport (statusbar / footer
|
|
85
85
|
menus); default [placement="bottom-start"] otherwise. Adjust
|
|
86
|
-
[
|
|
86
|
+
[offset] (default 4px) only when chrome demands it.
|
|
87
87
|
anti_patterns: []
|
|
88
88
|
examples:
|
|
89
89
|
- name: basic-menu
|
|
@@ -78,8 +78,20 @@ export class UINav extends UIElement {
|
|
|
78
78
|
if (this.variant !== 'section') this.#updateTooltips();
|
|
79
79
|
}
|
|
80
80
|
|
|
81
|
+
/**
|
|
82
|
+
* Collapsed = explicit [collapsed], or a rail narrower than 96px.
|
|
83
|
+
* linkedom (SSR — gh#1436's render sweep) has no getBoundingClientRect
|
|
84
|
+
* at all, so only the attribute can answer there. (A ZERO rect from a
|
|
85
|
+
* real pre-layout connect is the separate, unswept shape-3 question in
|
|
86
|
+
* ssr-compatibility's failure-shapes.md — not decided here.)
|
|
87
|
+
*/
|
|
88
|
+
get #isCollapsed() {
|
|
89
|
+
return this.collapsed ||
|
|
90
|
+
(typeof this.getBoundingClientRect === 'function' && this.getBoundingClientRect().width <= 96);
|
|
91
|
+
}
|
|
92
|
+
|
|
81
93
|
#updateTooltips() {
|
|
82
|
-
const isCollapsed = this
|
|
94
|
+
const isCollapsed = this.#isCollapsed;
|
|
83
95
|
for (const group of this.querySelectorAll(':scope > nav-group-ui')) {
|
|
84
96
|
const header = group.querySelector(':scope > [slot="header"]');
|
|
85
97
|
if (header) header.title = isCollapsed ? group.text : '';
|
|
@@ -143,8 +155,7 @@ export class UINav extends UIElement {
|
|
|
143
155
|
|
|
144
156
|
const group = e.target.closest('nav-group-ui');
|
|
145
157
|
if (group && this.contains(group)) {
|
|
146
|
-
|
|
147
|
-
if (isCollapsed) {
|
|
158
|
+
if (this.#isCollapsed) {
|
|
148
159
|
// The flyout popover is appended INSIDE the group, so an option
|
|
149
160
|
// click bubbles here after the option's own handler has selected
|
|
150
161
|
// and hidePopover()'d — re-showing would instantly reopen the
|
package/components/nav/nav.css
CHANGED
|
@@ -80,7 +80,7 @@
|
|
|
80
80
|
font-weight: var(--nav-label-weight);
|
|
81
81
|
color: var(--nav-label-fg);
|
|
82
82
|
text-transform: uppercase;
|
|
83
|
-
letter-spacing:
|
|
83
|
+
letter-spacing: var(--a-font-tracking-wider);
|
|
84
84
|
white-space: nowrap;
|
|
85
85
|
overflow: hidden;
|
|
86
86
|
}
|
|
@@ -134,7 +134,7 @@
|
|
|
134
134
|
font-weight: var(--nav-label-weight);
|
|
135
135
|
color: var(--nav-label-fg);
|
|
136
136
|
text-transform: uppercase;
|
|
137
|
-
letter-spacing:
|
|
137
|
+
letter-spacing: var(--a-font-tracking-wider);
|
|
138
138
|
white-space: nowrap;
|
|
139
139
|
overflow: hidden;
|
|
140
140
|
}
|
|
@@ -99,7 +99,9 @@ export class UINavGroup extends UIElement {
|
|
|
99
99
|
// whole subtree includes this host's own [selected], which render()
|
|
100
100
|
// reads anyway; render() writes only the icon's [weight], which the
|
|
101
101
|
// attributeFilter excludes, so the observer can't feed back.
|
|
102
|
-
|
|
102
|
+
// Guarded like the other Observer sites (gh#285 §1 pattern) — SSR shims
|
|
103
|
+
// have no MutationObserver; teardown already uses `?.disconnect()`.
|
|
104
|
+
if (!this.#selectionObserver && typeof MutationObserver !== 'undefined') {
|
|
103
105
|
this.#selectionObserver = new MutationObserver(this.#onChildSelection);
|
|
104
106
|
this.#selectionObserver.observe(this, {
|
|
105
107
|
subtree: true,
|
|
@@ -169,7 +169,7 @@
|
|
|
169
169
|
background: var(--nav-group-badge-bg);
|
|
170
170
|
padding: 1px var(--nav-group-badge-px);
|
|
171
171
|
border-radius: var(--nav-group-badge-radius);
|
|
172
|
-
line-height:
|
|
172
|
+
line-height: var(--a-font-leading-normal);
|
|
173
173
|
}
|
|
174
174
|
|
|
175
175
|
[slot="header"] [slot="caret"] {
|
|
@@ -313,7 +313,7 @@ nav-group-ui [slot="popover-label"] {
|
|
|
313
313
|
color: var(--nav-group-fg-muted);
|
|
314
314
|
font-size: var(--a-ui-tiny);
|
|
315
315
|
text-transform: uppercase;
|
|
316
|
-
letter-spacing:
|
|
316
|
+
letter-spacing: var(--a-font-tracking-wider);
|
|
317
317
|
}
|
|
318
318
|
|
|
319
319
|
nav-group-ui [slot="popover"] [role="option"] {
|
|
@@ -364,7 +364,7 @@ nav-ui[variant="section"] > nav-group-ui:not([variant]) > [slot="header"] {
|
|
|
364
364
|
font-weight: var(--a-weight-medium);
|
|
365
365
|
color: var(--nav-group-fg-muted);
|
|
366
366
|
text-transform: uppercase;
|
|
367
|
-
letter-spacing:
|
|
367
|
+
letter-spacing: var(--a-font-tracking-wider);
|
|
368
368
|
cursor: default;
|
|
369
369
|
border-radius: 0;
|
|
370
370
|
}
|
|
@@ -136,7 +136,7 @@ nav-item-ui[selected] [slot="icon"]:empty::before {
|
|
|
136
136
|
background: var(--nav-item-badge-bg);
|
|
137
137
|
padding: 1px var(--nav-item-badge-px);
|
|
138
138
|
border-radius: var(--nav-item-badge-radius);
|
|
139
|
-
line-height:
|
|
139
|
+
line-height: var(--a-font-leading-normal);
|
|
140
140
|
margin-inline-start: auto;
|
|
141
141
|
}
|
|
142
142
|
|
|
@@ -147,7 +147,7 @@ nav-item-ui[selected] [slot="icon"]:empty::before {
|
|
|
147
147
|
border: 1px solid var(--nav-item-trailing-border);
|
|
148
148
|
border-radius: var(--nav-item-trailing-radius);
|
|
149
149
|
padding: 0 var(--nav-item-trailing-px);
|
|
150
|
-
line-height:
|
|
150
|
+
line-height: var(--a-font-leading-loose);
|
|
151
151
|
flex-shrink: 0;
|
|
152
152
|
}
|
|
153
153
|
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
*/
|
|
25
25
|
|
|
26
26
|
import { UIElement } from '../../core/element.js';
|
|
27
|
+
import { isElement } from '../../core/dom.js';
|
|
27
28
|
|
|
28
29
|
let nextId = 0;
|
|
29
30
|
|
|
@@ -159,6 +160,9 @@ export class UINoodles extends UIElement {
|
|
|
159
160
|
|
|
160
161
|
#scheduleUpdate() {
|
|
161
162
|
if (this.#rafId) return;
|
|
163
|
+
// No rAF (SSR shim — gh#1436's render sweep) → no frame and no layout
|
|
164
|
+
// to measure connectors against; the client redraws on hydrate.
|
|
165
|
+
if (typeof requestAnimationFrame !== 'function') return;
|
|
162
166
|
this.#rafId = requestAnimationFrame(() => {
|
|
163
167
|
this.#rafId = null;
|
|
164
168
|
this.#performUpdate();
|
|
@@ -251,7 +255,7 @@ export class UINoodles extends UIElement {
|
|
|
251
255
|
// ── Element resolution ──────────────────────────────────────
|
|
252
256
|
|
|
253
257
|
#resolveElement(ref) {
|
|
254
|
-
if (ref
|
|
258
|
+
if (isElement(ref)) return ref;
|
|
255
259
|
if (typeof ref === 'string') return this.querySelector(`#${CSS.escape(ref)}`);
|
|
256
260
|
if (typeof ref === 'number') return this.#getPortChildren()[ref] ?? null;
|
|
257
261
|
return null;
|
|
@@ -77,7 +77,7 @@ option-card-ui[checked] [slot="icon"] {
|
|
|
77
77
|
--option-card-heading-size: var(--a-ui-size);
|
|
78
78
|
--option-card-desc-color: var(--a-fg-muted);
|
|
79
79
|
--option-card-desc-size: var(--a-ui-sm);
|
|
80
|
-
--option-card-desc-line-height:
|
|
80
|
+
--option-card-desc-line-height: var(--a-font-leading-relaxed);
|
|
81
81
|
--option-card-icon-color: var(--md-sys-color-neutral-on-surface-variant);
|
|
82
82
|
--option-card-icon-color-checked: var(--a-fg-strong);
|
|
83
83
|
--option-card-icon-size: 1.5rem;
|