@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
|
@@ -112,43 +112,45 @@
|
|
|
112
112
|
"catalog-browser"
|
|
113
113
|
],
|
|
114
114
|
"name": "UIDrilldown",
|
|
115
|
-
"
|
|
116
|
-
"Tree",
|
|
117
|
-
"List",
|
|
118
|
-
"Nav",
|
|
119
|
-
"Breadcrumb",
|
|
120
|
-
"Menu"
|
|
121
|
-
],
|
|
122
|
-
"slots": {
|
|
115
|
+
"parts": {
|
|
123
116
|
"title": {
|
|
124
|
-
"description": "Auto-stamped title cluster (current-level label + item count) inside the header."
|
|
117
|
+
"description": "Auto-stamped title cluster (current-level label + item count) inside the header — template-owned anatomy part, not a light-DOM insertion point (gh#1454)."
|
|
125
118
|
},
|
|
126
119
|
"back": {
|
|
127
|
-
"description": "Auto-stamped back-affordance <button> (chevron + parent-level label). Hidden at the root level."
|
|
128
|
-
},
|
|
129
|
-
"breadcrumb": {
|
|
130
|
-
"description": "Optional slot for a consumer-supplied <breadcrumb-ui> in the level header, for deep hierarchies. Not managed by drilldown-ui — the consumer wires jump clicks to `.path = [...]` itself."
|
|
120
|
+
"description": "Auto-stamped back-affordance <button> (chevron + parent-level label). Hidden at the root level — template-owned anatomy part, not a light-DOM insertion point (gh#1454)."
|
|
131
121
|
},
|
|
132
122
|
"counts": {
|
|
133
|
-
"description": "Auto-stamped per-row trailing count-chip cluster, rendered when the row's data item declares `counts
|
|
123
|
+
"description": "Auto-stamped per-row trailing count-chip cluster, rendered when the row's data item declares `counts` — template-owned anatomy part, rendered from data every row, not a light-DOM insertion point (gh#1454)."
|
|
134
124
|
},
|
|
135
125
|
"dot": {
|
|
136
|
-
"description": "Auto-stamped per-row leading color swatch, rendered when the row's data item declares a `dot` tone."
|
|
126
|
+
"description": "Auto-stamped per-row leading color swatch, rendered when the row's data item declares a `dot` tone — template-owned anatomy part, rendered from data every row, not a light-DOM insertion point (gh#1454)."
|
|
137
127
|
},
|
|
138
128
|
"filter": {
|
|
139
|
-
"description": "Auto-stamped filter-input row, shown only when `[filterable]` is set."
|
|
129
|
+
"description": "Auto-stamped filter-input row, shown only when `[filterable]` is set — template-owned anatomy part, not a light-DOM insertion point (gh#1454)."
|
|
140
130
|
},
|
|
141
131
|
"header": {
|
|
142
|
-
"description": "Auto-stamped level-header container (back affordance + breadcrumb + title/count). Structural — not consumer-overridable."
|
|
132
|
+
"description": "Auto-stamped level-header container (back affordance + breadcrumb + title/count). Structural — not consumer-overridable; template-owned anatomy part, not a light-DOM insertion point (gh#1454). Stamped once via an unconditional `this.innerHTML = …` with no consumer-content capture (except `breadcrumb`, which stays in `slots:` above)."
|
|
143
133
|
},
|
|
144
134
|
"main": {
|
|
145
|
-
"description": "Auto-stamped per-row content column (label + optional meta line)."
|
|
135
|
+
"description": "Auto-stamped per-row content column (label + optional meta line) — template-owned anatomy part, rendered from data every row, not a light-DOM insertion point (gh#1454)."
|
|
146
136
|
},
|
|
147
137
|
"meta": {
|
|
148
|
-
"description": "Auto-stamped per-row secondary meta line, rendered when the row's data item declares `meta
|
|
138
|
+
"description": "Auto-stamped per-row secondary meta line, rendered when the row's data item declares `meta` — template-owned anatomy part, rendered from data every row, not a light-DOM insertion point (gh#1454)."
|
|
149
139
|
},
|
|
150
140
|
"viewport": {
|
|
151
|
-
"description": "Auto-stamped clipping container for the current level's panel (hosts the slide-transition overflow clip)."
|
|
141
|
+
"description": "Auto-stamped clipping container for the current level's panel (hosts the slide-transition overflow clip) — template-owned anatomy part, not a light-DOM insertion point (gh#1454)."
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
"related": [
|
|
145
|
+
"Tree",
|
|
146
|
+
"List",
|
|
147
|
+
"Nav",
|
|
148
|
+
"Breadcrumb",
|
|
149
|
+
"Menu"
|
|
150
|
+
],
|
|
151
|
+
"slots": {
|
|
152
|
+
"breadcrumb": {
|
|
153
|
+
"description": "Optional slot for a consumer-supplied <breadcrumb-ui> in the level header, for deep hierarchies. Not managed by drilldown-ui — the consumer wires jump clicks to `.path = [...]` itself."
|
|
152
154
|
}
|
|
153
155
|
},
|
|
154
156
|
"states": [
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
14
|
import { UIElement, untracked } from '../../core/element.js';
|
|
15
|
+
import { isElement } from '../../core/dom.js';
|
|
15
16
|
|
|
16
17
|
/**
|
|
17
18
|
* <drilldown-ui> — Single-panel, multi-level drill-in menu.
|
|
@@ -427,7 +428,7 @@ export class UIDrilldown extends UIElement {
|
|
|
427
428
|
const counts = Array.isArray(item.counts) ? item.counts : [];
|
|
428
429
|
if (counts.length) {
|
|
429
430
|
html += `<span slot="counts">${counts
|
|
430
|
-
.map((c) => `<span data-
|
|
431
|
+
.map((c) => `<span data-drilldown-chip data-tone="${this.#escAttr(c.variant || 'neutral')}">${this.#escText(c.value)}</span>`)
|
|
431
432
|
.join('')}</span>`;
|
|
432
433
|
}
|
|
433
434
|
if (hasChildren) html += `<icon-ui name="caret-right" slot="chevron"></icon-ui>`;
|
|
@@ -500,7 +501,7 @@ export class UIDrilldown extends UIElement {
|
|
|
500
501
|
};
|
|
501
502
|
|
|
502
503
|
#onPanelClick = (e) => {
|
|
503
|
-
const row = e.target
|
|
504
|
+
const row = isElement(e.target) ? e.target.closest('[role="option"]') : null;
|
|
504
505
|
if (!row) return;
|
|
505
506
|
const item = this.#rowByEl.get(row);
|
|
506
507
|
if (!item) return;
|
|
@@ -509,7 +510,7 @@ export class UIDrilldown extends UIElement {
|
|
|
509
510
|
};
|
|
510
511
|
|
|
511
512
|
#onKeydown = (e) => {
|
|
512
|
-
const row = e.target
|
|
513
|
+
const row = isElement(e.target) ? e.target.closest('[role="option"]') : null;
|
|
513
514
|
switch (e.key) {
|
|
514
515
|
case 'ArrowDown':
|
|
515
516
|
e.preventDefault();
|
|
@@ -230,7 +230,7 @@
|
|
|
230
230
|
flex-direction: column;
|
|
231
231
|
min-width: 0;
|
|
232
232
|
flex: 1;
|
|
233
|
-
line-height:
|
|
233
|
+
line-height: var(--a-font-leading-normal);
|
|
234
234
|
}
|
|
235
235
|
[slot="label"] {
|
|
236
236
|
overflow: hidden;
|
|
@@ -251,21 +251,21 @@
|
|
|
251
251
|
gap: var(--a-space-1);
|
|
252
252
|
flex-shrink: 0;
|
|
253
253
|
}
|
|
254
|
-
[data-
|
|
254
|
+
[data-drilldown-chip] {
|
|
255
255
|
padding: var(--drilldown-count-chip-py) var(--drilldown-count-chip-px);
|
|
256
256
|
border-radius: var(--drilldown-count-chip-radius);
|
|
257
257
|
font-size: var(--drilldown-count-chip-font-size);
|
|
258
258
|
font-variant-numeric: tabular-nums;
|
|
259
|
-
line-height:
|
|
259
|
+
line-height: var(--a-font-leading-none);
|
|
260
260
|
background: var(--drilldown-count-chip-bg);
|
|
261
261
|
color: var(--drilldown-count-chip-fg);
|
|
262
262
|
white-space: nowrap;
|
|
263
263
|
}
|
|
264
|
-
[data-
|
|
265
|
-
[data-
|
|
266
|
-
[data-
|
|
267
|
-
[data-
|
|
268
|
-
[data-
|
|
264
|
+
[data-drilldown-chip][data-tone="info"] { background: var(--a-info-bg); color: var(--md-sys-color-info-on-info); }
|
|
265
|
+
[data-drilldown-chip][data-tone="success"] { background: var(--a-success-bg); color: var(--md-sys-color-success-on-success); }
|
|
266
|
+
[data-drilldown-chip][data-tone="warning"] { background: var(--a-warning-bg); color: var(--md-sys-color-warning-on-warning); }
|
|
267
|
+
[data-drilldown-chip][data-tone="danger"] { background: var(--a-danger-bg); color: var(--md-sys-color-danger-on-danger); }
|
|
268
|
+
[data-drilldown-chip][data-tone="primary"] { background: var(--a-primary-bg); color: var(--md-sys-color-primary-on-primary); }
|
|
269
269
|
|
|
270
270
|
[slot="chevron"] {
|
|
271
271
|
--a-icon-size: var(--drilldown-chevron-size);
|
|
@@ -130,24 +130,55 @@ slots:
|
|
|
130
130
|
Optional slot for a consumer-supplied <breadcrumb-ui> in the level
|
|
131
131
|
header, for deep hierarchies. Not managed by drilldown-ui — the
|
|
132
132
|
consumer wires jump clicks to `.path = [...]` itself.
|
|
133
|
+
parts:
|
|
133
134
|
header:
|
|
134
|
-
description:
|
|
135
|
+
description: >-
|
|
136
|
+
Auto-stamped level-header container (back affordance + breadcrumb +
|
|
137
|
+
title/count). Structural — not consumer-overridable; template-owned
|
|
138
|
+
anatomy part, not a light-DOM insertion point (gh#1454). Stamped once
|
|
139
|
+
via an unconditional `this.innerHTML = …` with no consumer-content
|
|
140
|
+
capture (except `breadcrumb`, which stays in `slots:` above).
|
|
135
141
|
back:
|
|
136
|
-
description:
|
|
142
|
+
description: >-
|
|
143
|
+
Auto-stamped back-affordance <button> (chevron + parent-level label).
|
|
144
|
+
Hidden at the root level — template-owned anatomy part, not a
|
|
145
|
+
light-DOM insertion point (gh#1454).
|
|
137
146
|
title:
|
|
138
|
-
description:
|
|
147
|
+
description: >-
|
|
148
|
+
Auto-stamped title cluster (current-level label + item count) inside
|
|
149
|
+
the header — template-owned anatomy part, not a light-DOM insertion
|
|
150
|
+
point (gh#1454).
|
|
139
151
|
filter:
|
|
140
|
-
description:
|
|
152
|
+
description: >-
|
|
153
|
+
Auto-stamped filter-input row, shown only when `[filterable]` is set —
|
|
154
|
+
template-owned anatomy part, not a light-DOM insertion point (gh#1454).
|
|
141
155
|
viewport:
|
|
142
|
-
description:
|
|
156
|
+
description: >-
|
|
157
|
+
Auto-stamped clipping container for the current level's panel (hosts
|
|
158
|
+
the slide-transition overflow clip) — template-owned anatomy part, not
|
|
159
|
+
a light-DOM insertion point (gh#1454).
|
|
143
160
|
dot:
|
|
144
|
-
description:
|
|
161
|
+
description: >-
|
|
162
|
+
Auto-stamped per-row leading color swatch, rendered when the row's
|
|
163
|
+
data item declares a `dot` tone — template-owned anatomy part,
|
|
164
|
+
rendered from data every row, not a light-DOM insertion point
|
|
165
|
+
(gh#1454).
|
|
145
166
|
main:
|
|
146
|
-
description:
|
|
167
|
+
description: >-
|
|
168
|
+
Auto-stamped per-row content column (label + optional meta line) —
|
|
169
|
+
template-owned anatomy part, rendered from data every row, not a
|
|
170
|
+
light-DOM insertion point (gh#1454).
|
|
147
171
|
meta:
|
|
148
|
-
description:
|
|
172
|
+
description: >-
|
|
173
|
+
Auto-stamped per-row secondary meta line, rendered when the row's data
|
|
174
|
+
item declares `meta` — template-owned anatomy part, rendered from data
|
|
175
|
+
every row, not a light-DOM insertion point (gh#1454).
|
|
149
176
|
counts:
|
|
150
|
-
description:
|
|
177
|
+
description: >-
|
|
178
|
+
Auto-stamped per-row trailing count-chip cluster, rendered when the
|
|
179
|
+
row's data item declares `counts` — template-owned anatomy part,
|
|
180
|
+
rendered from data every row, not a light-DOM insertion point
|
|
181
|
+
(gh#1454).
|
|
151
182
|
states:
|
|
152
183
|
- name: idle
|
|
153
184
|
description: Default, ready for interaction.
|
|
@@ -71,15 +71,16 @@
|
|
|
71
71
|
"third-party"
|
|
72
72
|
],
|
|
73
73
|
"name": "UIEmbed",
|
|
74
|
+
"parts": {
|
|
75
|
+
"iframe": {
|
|
76
|
+
"description": "Sandboxed <iframe> element (allow-scripts allow-same-origin) — template-owned anatomy part, not a light-DOM insertion point (gh#1447)"
|
|
77
|
+
}
|
|
78
|
+
},
|
|
74
79
|
"related": [
|
|
75
80
|
"slider",
|
|
76
81
|
"button"
|
|
77
82
|
],
|
|
78
|
-
"slots": {
|
|
79
|
-
"iframe": {
|
|
80
|
-
"description": "Sandboxed <iframe> element (allow-scripts allow-same-origin)"
|
|
81
|
-
}
|
|
82
|
-
},
|
|
83
|
+
"slots": {},
|
|
83
84
|
"states": [
|
|
84
85
|
{
|
|
85
86
|
"description": "Default, ready for interaction.",
|
|
@@ -33,9 +33,9 @@ props:
|
|
|
33
33
|
type: string
|
|
34
34
|
default: 100%
|
|
35
35
|
events: {}
|
|
36
|
-
|
|
36
|
+
parts:
|
|
37
37
|
iframe:
|
|
38
|
-
description: Sandboxed <iframe> element (allow-scripts allow-same-origin)
|
|
38
|
+
description: Sandboxed <iframe> element (allow-scripts allow-same-origin) — template-owned anatomy part, not a light-DOM insertion point (gh#1447)
|
|
39
39
|
states:
|
|
40
40
|
- name: idle
|
|
41
41
|
description: Default, ready for interaction.
|
|
@@ -44,14 +44,14 @@
|
|
|
44
44
|
font-size: var(--empty-state-heading-size);
|
|
45
45
|
font-weight: var(--empty-state-heading-weight);
|
|
46
46
|
color: var(--empty-state-heading-fg);
|
|
47
|
-
line-height:
|
|
47
|
+
line-height: var(--a-font-leading-normal);
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
/* ── Description ── */
|
|
51
51
|
[slot="description"] {
|
|
52
52
|
font-size: var(--empty-state-desc-size);
|
|
53
53
|
color: var(--empty-state-desc-fg);
|
|
54
|
-
line-height:
|
|
54
|
+
line-height: var(--a-font-leading-relaxed);
|
|
55
55
|
max-width: 36ch;
|
|
56
56
|
}
|
|
57
57
|
|
|
@@ -65,6 +65,9 @@
|
|
|
65
65
|
],
|
|
66
66
|
"unevaluatedProperties": false,
|
|
67
67
|
"x-adiaui": {
|
|
68
|
+
"allowedParents": [
|
|
69
|
+
"Feed"
|
|
70
|
+
],
|
|
68
71
|
"anti_patterns": [],
|
|
69
72
|
"category": "feedback",
|
|
70
73
|
"composes": [],
|
|
@@ -83,17 +86,34 @@
|
|
|
83
86
|
"notification-card"
|
|
84
87
|
],
|
|
85
88
|
"name": "UIFeedItem",
|
|
89
|
+
"parts": {
|
|
90
|
+
"body": {
|
|
91
|
+
"description": "Template-owned anatomy part, not a light-DOM insertion point (gh#1454). render() always clears (`body.textContent = ''`) and rebuilds it wholesale from the `text` / `heading` props every cycle — no consumer content is preserved."
|
|
92
|
+
}
|
|
93
|
+
},
|
|
86
94
|
"related": [
|
|
87
95
|
"Feed",
|
|
88
96
|
"Toast",
|
|
89
97
|
"Alert"
|
|
90
98
|
],
|
|
91
|
-
"slots": {
|
|
92
|
-
|
|
93
|
-
|
|
99
|
+
"slots": {},
|
|
100
|
+
"states": [
|
|
101
|
+
{
|
|
102
|
+
"description": "Entry transition settled — deferred one frame (or immediate under SSR) after mount so the enter transition can run.",
|
|
103
|
+
"attribute": "open",
|
|
104
|
+
"name": "open"
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
"description": "Dismiss in progress — the exit transition is running before the element removes itself.",
|
|
108
|
+
"attribute": "closing",
|
|
109
|
+
"name": "closing"
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"description": "Above the parent `<feed-ui>`'s `[max]` visible-lane limit; hidden until a visible sibling dismisses and promotes it (Phase 2 max-queue).",
|
|
113
|
+
"attribute": "queued",
|
|
114
|
+
"name": "queued"
|
|
94
115
|
}
|
|
95
|
-
|
|
96
|
-
"states": {},
|
|
116
|
+
],
|
|
97
117
|
"status": "stable",
|
|
98
118
|
"synonyms": {
|
|
99
119
|
"feed-item": [
|
|
@@ -59,10 +59,29 @@ props:
|
|
|
59
59
|
events:
|
|
60
60
|
close:
|
|
61
61
|
description: Fired after the item finishes its exit animation
|
|
62
|
-
|
|
62
|
+
parts:
|
|
63
63
|
body:
|
|
64
|
-
description:
|
|
65
|
-
|
|
64
|
+
description: >-
|
|
65
|
+
Template-owned anatomy part, not a light-DOM insertion point (gh#1454).
|
|
66
|
+
render() always clears (`body.textContent = ''`) and rebuilds it
|
|
67
|
+
wholesale from the `text` / `heading` props every cycle — no consumer
|
|
68
|
+
content is preserved.
|
|
69
|
+
states:
|
|
70
|
+
- name: open
|
|
71
|
+
description: >-
|
|
72
|
+
Entry transition settled — deferred one frame (or immediate under
|
|
73
|
+
SSR) after mount so the enter transition can run.
|
|
74
|
+
attribute: open
|
|
75
|
+
- name: closing
|
|
76
|
+
description: >-
|
|
77
|
+
Dismiss in progress — the exit transition is running before the
|
|
78
|
+
element removes itself.
|
|
79
|
+
attribute: closing
|
|
80
|
+
- name: queued
|
|
81
|
+
description: >-
|
|
82
|
+
Above the parent `<feed-ui>`'s `[max]` visible-lane limit; hidden
|
|
83
|
+
until a visible sibling dismisses and promotes it (Phase 2 max-queue).
|
|
84
|
+
attribute: queued
|
|
66
85
|
|
|
67
86
|
keywords:
|
|
68
87
|
- feed-item
|
|
@@ -81,12 +100,14 @@ related:
|
|
|
81
100
|
- Alert
|
|
82
101
|
|
|
83
102
|
a2ui:
|
|
103
|
+
allowedParents:
|
|
104
|
+
- Feed
|
|
84
105
|
rules:
|
|
85
106
|
- rule: 'One notification entry inside <feed-ui>. Title + description + optional icon + auto-dismiss timer.'
|
|
86
107
|
reason: 'Feed-channel item primitive.'
|
|
87
|
-
- rule: 'Typically created programmatically via UIFeed.post(...); do not place declaratively.'
|
|
88
|
-
reason: 'Imperative ownership.'
|
|
89
|
-
- rule: 'Different from <alert-ui> (inline persistent)
|
|
90
|
-
reason: 'Surface boundary.'
|
|
108
|
+
- rule: 'Typically created programmatically via UIFeed.post(...); do not place declaratively — for a generated declarative notification author `Toast` instead, which forwards into this same channel (SPEC-FEED-CHANNEL-001 Phase 4).'
|
|
109
|
+
reason: 'Imperative ownership; taught-default ruling (#1363 C6 / #1375).'
|
|
110
|
+
- rule: 'Different from <alert-ui> (inline persistent). <toast-ui> is not a separate standalone system — it is the declarative-authoring facade for this same feed channel; both render as a feed-item paint site.'
|
|
111
|
+
reason: 'Surface boundary — corrected post-#1375 (toast used to be standalone, is now a facade).'
|
|
91
112
|
- rule: 'For "notification deep-link" pattern: post with action + onAction. Click navigates and auto-dismisses (router.push() / location.href / api.markRead()).'
|
|
92
113
|
reason: 'Deep-link pattern lives in the onAction callback, not in markup.'
|
|
@@ -41,8 +41,14 @@
|
|
|
41
41
|
],
|
|
42
42
|
"unevaluatedProperties": false,
|
|
43
43
|
"x-adiaui": {
|
|
44
|
-
"anti_patterns": [
|
|
45
|
-
|
|
44
|
+
"anti_patterns": [
|
|
45
|
+
{
|
|
46
|
+
"fix": "{\"component\": \"Toast\", \"variant\": \"success\", \"text\": \"Saved successfully.\"}\n",
|
|
47
|
+
"why": "<feed-ui> is a lazily-mounted per-position singleton reached via\nUIFeed.get()/.post(); statically nesting <feed-item-ui> children in\ngenerated markup bypasses that container lifecycle. Declarative\ntransient notifications are <toast-ui>'s job — it already dissolves\ninto this same channel on connect (SPEC-FEED-CHANNEL-001 Phase 4).\n",
|
|
48
|
+
"wrong": "{\"component\": \"Feed\", \"children\": [{\"component\": \"FeedItem\", \"variant\": \"success\", \"text\": \"Saved successfully.\"}]}\n"
|
|
49
|
+
}
|
|
50
|
+
],
|
|
51
|
+
"category": "feedback",
|
|
46
52
|
"composes": [
|
|
47
53
|
"button-ui",
|
|
48
54
|
"feed-item-ui"
|
|
@@ -63,6 +69,7 @@
|
|
|
63
69
|
"notification-channel"
|
|
64
70
|
],
|
|
65
71
|
"name": "UIFeedContainer",
|
|
72
|
+
"parts": {},
|
|
66
73
|
"related": [
|
|
67
74
|
"FeedItem",
|
|
68
75
|
"Toast",
|
|
@@ -177,11 +177,18 @@ export class UIFeedItem extends UIElement {
|
|
|
177
177
|
if (isActionRequired) this.#installFocusTrap();
|
|
178
178
|
else this.#uninstallFocusTrap();
|
|
179
179
|
|
|
180
|
-
if (!this.hasAttribute('
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
180
|
+
if (!this.hasAttribute('open') && !this.#removing) {
|
|
181
|
+
// rAF defers the attribute one frame so the enter transition can
|
|
182
|
+
// run. No rAF (SSR shim — gh#1436's render sweep) → emit the settled
|
|
183
|
+
// state directly; there's no frame to animate into.
|
|
184
|
+
if (typeof requestAnimationFrame === 'function') {
|
|
185
|
+
this.#openRaf = requestAnimationFrame(() => {
|
|
186
|
+
this.#openRaf = null;
|
|
187
|
+
this.setAttribute('open', '');
|
|
188
|
+
});
|
|
189
|
+
} else {
|
|
190
|
+
this.setAttribute('open', '');
|
|
191
|
+
}
|
|
185
192
|
}
|
|
186
193
|
this.#scheduleAutoDismiss();
|
|
187
194
|
}
|
|
@@ -197,8 +204,8 @@ export class UIFeedItem extends UIElement {
|
|
|
197
204
|
if (this.#removing) return;
|
|
198
205
|
this.#removing = true;
|
|
199
206
|
if (this.#timer) { clearTimeout(this.#timer); this.#timer = null; }
|
|
200
|
-
this.removeAttribute('
|
|
201
|
-
this.setAttribute('
|
|
207
|
+
this.removeAttribute('open');
|
|
208
|
+
this.setAttribute('closing', '');
|
|
202
209
|
this.#closeTimer = setTimeout(() => {
|
|
203
210
|
this.#closeTimer = null;
|
|
204
211
|
const container = this.parentElement;
|
|
@@ -328,11 +335,11 @@ export class UIFeed {
|
|
|
328
335
|
} = opts;
|
|
329
336
|
const v = variant === 'error' ? 'danger' : variant; // documented alias
|
|
330
337
|
const container = UIFeed.get(position);
|
|
331
|
-
// Phase 2 max-queue: items above [max] queue with [
|
|
338
|
+
// Phase 2 max-queue: items above [max] queue with [queued] and
|
|
332
339
|
// become visible as visible items dismiss.
|
|
333
340
|
const max = parseInt(container.getAttribute('max') || '5', 10);
|
|
334
341
|
const visibleCount = [...container.children].filter((c) =>
|
|
335
|
-
c.tagName === 'FEED-ITEM-UI' && !c.hasAttribute('
|
|
342
|
+
c.tagName === 'FEED-ITEM-UI' && !c.hasAttribute('queued')
|
|
336
343
|
).length;
|
|
337
344
|
const item = document.createElement('feed-item-ui');
|
|
338
345
|
if (id) item.setAttribute('data-id', id);
|
|
@@ -347,7 +354,7 @@ export class UIFeed {
|
|
|
347
354
|
item.duration = action && !explicitDuration ? 0 : duration;
|
|
348
355
|
if (dismissible != null) item.dismissible = !!dismissible;
|
|
349
356
|
if (action) item.action = action;
|
|
350
|
-
if (visibleCount >= max) item.setAttribute('
|
|
357
|
+
if (visibleCount >= max) item.setAttribute('queued', '');
|
|
351
358
|
container.appendChild(item);
|
|
352
359
|
if (typeof onAction === 'function') item.update({ onAction });
|
|
353
360
|
return {
|
|
@@ -382,8 +389,8 @@ export class UIFeed {
|
|
|
382
389
|
if (!container) return;
|
|
383
390
|
// Promote the oldest queued sibling (if any) before deciding whether
|
|
384
391
|
// to release. The queue is FIFO; queued items live at the tail.
|
|
385
|
-
const queued = container.querySelector('feed-item-ui[
|
|
386
|
-
if (queued) queued.removeAttribute('
|
|
392
|
+
const queued = container.querySelector('feed-item-ui[queued]');
|
|
393
|
+
if (queued) queued.removeAttribute('queued');
|
|
387
394
|
if (container.children.length > 0) return;
|
|
388
395
|
try { container.hidePopover?.(); } catch { /* noop */ }
|
|
389
396
|
container.remove();
|
package/components/feed/feed.css
CHANGED
|
@@ -3,16 +3,16 @@
|
|
|
3
3
|
Per docs/specs/feed-channel.md (SPEC-FEED-CHANNEL-001).
|
|
4
4
|
═══════════════════════════════════════════════════════════════ */
|
|
5
5
|
|
|
6
|
-
/* Safari 17.x bug — same as toast: `:scope[
|
|
6
|
+
/* Safari 17.x bug — same as toast: `:scope[open]` flavor B
|
|
7
7
|
doesn't reliably restyle on attribute toggling inside @scope.
|
|
8
|
-
Selectors moved out as plain feed-item-ui[
|
|
9
|
-
feed-item-ui[
|
|
8
|
+
Selectors moved out as plain feed-item-ui[…] rules. */
|
|
9
|
+
feed-item-ui[open] {
|
|
10
10
|
transition: transform var(--feed-item-duration) var(--feed-item-easing),
|
|
11
11
|
opacity var(--feed-item-duration) var(--feed-item-easing);
|
|
12
12
|
transform: translateY(0);
|
|
13
13
|
opacity: 1;
|
|
14
14
|
}
|
|
15
|
-
feed-item-ui[
|
|
15
|
+
feed-item-ui[closing] {
|
|
16
16
|
transition: transform var(--feed-item-duration) var(--feed-item-easing),
|
|
17
17
|
opacity var(--feed-item-duration) var(--feed-item-easing);
|
|
18
18
|
opacity: 0;
|
|
@@ -182,19 +182,19 @@ feed-item-ui[data-closing] {
|
|
|
182
182
|
}
|
|
183
183
|
}
|
|
184
184
|
|
|
185
|
-
/* Phase 2 max-queue: items above [max] are appended with [
|
|
185
|
+
/* Phase 2 max-queue: items above [max] are appended with [queued]
|
|
186
186
|
and stay invisible until a visible sibling dismisses (at which point
|
|
187
187
|
`releaseContainerIfEmpty` strips the attribute). Display:none keeps
|
|
188
188
|
them out of the layout AND screen-reader-invisible — items not yet
|
|
189
189
|
shown shouldn't be announced. */
|
|
190
|
-
feed-item-ui[
|
|
190
|
+
feed-item-ui[queued] {
|
|
191
191
|
display: none;
|
|
192
192
|
}
|
|
193
193
|
|
|
194
194
|
/* Reduced-motion: skip slide-in/out, keep opacity. */
|
|
195
195
|
@media (prefers-reduced-motion: reduce) {
|
|
196
|
-
feed-item-ui[
|
|
197
|
-
feed-item-ui[
|
|
196
|
+
feed-item-ui[open],
|
|
197
|
+
feed-item-ui[closing] {
|
|
198
198
|
transition: opacity var(--feed-item-duration) var(--feed-item-easing);
|
|
199
199
|
transform: none !important;
|
|
200
200
|
}
|
|
@@ -5,7 +5,7 @@ name: UIFeedContainer
|
|
|
5
5
|
tag: feed-ui
|
|
6
6
|
status: stable
|
|
7
7
|
component: Feed
|
|
8
|
-
category:
|
|
8
|
+
category: feedback
|
|
9
9
|
version: 1
|
|
10
10
|
description: >-
|
|
11
11
|
Shared top-layer feed channel. Per .claude/docs/specs/feed-channel.md
|
|
@@ -67,3 +67,16 @@ a2ui:
|
|
|
67
67
|
reason: 'Imperative API ownership.'
|
|
68
68
|
- rule: 'For inline persistent alerts inside content regions use <alert-ui> instead; feed is ephemeral overlay.'
|
|
69
69
|
reason: 'Surface boundary.'
|
|
70
|
+
- rule: 'Not the generation target for a new transient notification — author `Toast` instead. <toast-ui> is a thin declarative facade that already posts into this channel and self-removes on connect (SPEC-FEED-CHANNEL-001 Phase 4); `<feed-ui>`/`<feed-item-ui>` are the imperative/programmatic infrastructure underneath it, reached via `UIFeed.post()` or a declared `<toast-ui>`, never by placing `<feed-ui>`/`<feed-item-ui>` directly in generated markup.'
|
|
71
|
+
reason: 'Taught-default ruling (#1363 C6 / #1375) — cross-references <toast-ui>''s own a2ui rules.'
|
|
72
|
+
anti_patterns:
|
|
73
|
+
- wrong: |
|
|
74
|
+
{"component": "Feed", "children": [{"component": "FeedItem", "variant": "success", "text": "Saved successfully."}]}
|
|
75
|
+
why: |
|
|
76
|
+
<feed-ui> is a lazily-mounted per-position singleton reached via
|
|
77
|
+
UIFeed.get()/.post(); statically nesting <feed-item-ui> children in
|
|
78
|
+
generated markup bypasses that container lifecycle. Declarative
|
|
79
|
+
transient notifications are <toast-ui>'s job — it already dissolves
|
|
80
|
+
into this same channel on connect (SPEC-FEED-CHANNEL-001 Phase 4).
|
|
81
|
+
fix: |
|
|
82
|
+
{"component": "Toast", "variant": "success", "text": "Saved successfully."}
|
|
@@ -16,8 +16,8 @@
|
|
|
16
16
|
"component": {
|
|
17
17
|
"const": "Header"
|
|
18
18
|
},
|
|
19
|
-
"
|
|
20
|
-
"description": "Bare attribute — enables default header padding. The container parent's own `padding` prop sets the scale.",
|
|
19
|
+
"padded": {
|
|
20
|
+
"description": "Bare attribute — enables default header padding. The container parent's own `padding` prop sets the scale. Renamed from `[padding]` (gh#1335) — a boolean can't share a name with the global Scale-grammar `[padding]` attribute (ADR-0053).",
|
|
21
21
|
"type": "boolean",
|
|
22
22
|
"default": false
|
|
23
23
|
}
|
|
@@ -47,6 +47,7 @@
|
|
|
47
47
|
"header"
|
|
48
48
|
],
|
|
49
49
|
"name": "UIHeader",
|
|
50
|
+
"parts": {},
|
|
50
51
|
"related": [
|
|
51
52
|
"avatar",
|
|
52
53
|
"input",
|