@adia-ai/web-components 0.8.40 → 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 +50 -3
- package/MIGRATION.md +1042 -16
- 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-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.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.yaml +6 -2
- package/components/alert/alert.a2ui.json +1 -0
- package/components/alert/alert.css +1 -1
- 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.d.ts +1 -1
- package/components/avatar/avatar.yaml +4 -4
- package/components/badge/badge.a2ui.json +1 -0
- 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.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 +120 -171
- 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 +31 -1
- 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 +9 -4
- package/components/chart/chart.class.js +6 -6
- package/components/chart/chart.css +6 -4
- package/components/chart/chart.d.ts +1 -1
- package/components/chart/chart.yaml +5 -3
- 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.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/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.yaml +2 -2
- package/components/command/command.a2ui.json +12 -10
- package/components/command/command.class.js +3 -2
- 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.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/display-field/display-field.a2ui.json +1 -0
- package/components/divider/divider.a2ui.json +1 -0
- package/components/drawer/drawer.a2ui.json +1 -3
- package/components/drawer/drawer.css +1 -1
- 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 +6 -6
- 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/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.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 +4 -4
- 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.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 +14 -14
- 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/kbd/kbd.a2ui.json +1 -0
- 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 +12 -1
- 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-group/nav-group.a2ui.json +1 -0
- package/components/nav-group/nav-group.class.js +3 -1
- package/components/nav-item/nav-item.a2ui.json +1 -0
- 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/otp-input/otp-input.a2ui.json +3 -2
- package/components/otp-input/otp-input.yaml +9 -2
- package/components/page/page.a2ui.json +13 -0
- 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/pane/pane.a2ui.json +6 -0
- package/components/pane/pane.class.js +3 -3
- package/components/pane/pane.css +2 -2
- 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.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 +3 -2
- package/components/qr-code/qr-code.class.js +4 -4
- package/components/qr-code/qr-code.css +1 -1
- package/components/qr-code/qr-code.yaml +5 -3
- 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 +2 -2
- package/components/range/range.yaml +3 -0
- package/components/rating/rating.a2ui.json +1 -0
- package/components/relative-time/relative-time.a2ui.json +1 -0
- package/components/richtext/richtext.a2ui.json +2 -1
- 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 +15 -0
- 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 +15 -13
- 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/stack/stack.a2ui.json +1 -0
- package/components/stat/stat.a2ui.json +1 -0
- package/components/stat/stat.js +2 -2
- package/components/step-progress/step-progress.a2ui.json +1 -0
- 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.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/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 -0
- package/components/table/table.class.js +14 -12
- package/components/table/table.css +11 -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 +1 -1
- 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 +8 -0
- 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/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 +10 -6
- 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.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/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.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/toggle-group/toggle-group.a2ui.json +7 -3
- package/components/toggle-group/toggle-group.class.js +40 -1
- package/components/toggle-group/toggle-group.css +6 -1
- package/components/toggle-group/toggle-group.d.ts +2 -2
- package/components/toggle-group/toggle-group.yaml +21 -12
- package/components/toggle-group/toggle-option.a2ui.json +7 -3
- package/components/toggle-group/toggle-option.yaml +13 -7
- 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/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.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.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 +437 -489
- 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/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
package/traits/_catalog.json
CHANGED
|
@@ -28,7 +28,8 @@
|
|
|
28
28
|
"data-error-shake-amplitude",
|
|
29
29
|
"data-error-shake-duration",
|
|
30
30
|
"data-error-shake-trigger"
|
|
31
|
-
]
|
|
31
|
+
],
|
|
32
|
+
"prefixes": []
|
|
32
33
|
},
|
|
33
34
|
{
|
|
34
35
|
"name": "fade-presence",
|
|
@@ -42,7 +43,8 @@
|
|
|
42
43
|
"fade-in-done",
|
|
43
44
|
"fade-out-done"
|
|
44
45
|
],
|
|
45
|
-
"config": []
|
|
46
|
+
"config": [],
|
|
47
|
+
"prefixes": []
|
|
46
48
|
},
|
|
47
49
|
{
|
|
48
50
|
"name": "ripple",
|
|
@@ -52,7 +54,8 @@
|
|
|
52
54
|
"data-ripple-active"
|
|
53
55
|
],
|
|
54
56
|
"events": [],
|
|
55
|
-
"config": []
|
|
57
|
+
"config": [],
|
|
58
|
+
"prefixes": []
|
|
56
59
|
},
|
|
57
60
|
{
|
|
58
61
|
"name": "scale-press",
|
|
@@ -62,7 +65,8 @@
|
|
|
62
65
|
"data-scale-press-active"
|
|
63
66
|
],
|
|
64
67
|
"events": [],
|
|
65
|
-
"config": []
|
|
68
|
+
"config": [],
|
|
69
|
+
"prefixes": []
|
|
66
70
|
},
|
|
67
71
|
{
|
|
68
72
|
"name": "spring-animate",
|
|
@@ -75,6 +79,9 @@
|
|
|
75
79
|
"config": [
|
|
76
80
|
"data-spring-stiffness",
|
|
77
81
|
"data-spring-damping"
|
|
82
|
+
],
|
|
83
|
+
"prefixes": [
|
|
84
|
+
"spring"
|
|
78
85
|
]
|
|
79
86
|
},
|
|
80
87
|
{
|
|
@@ -90,7 +97,8 @@
|
|
|
90
97
|
"config": [
|
|
91
98
|
"data-success-checkmark-position",
|
|
92
99
|
"data-success-checkmark-trigger"
|
|
93
|
-
]
|
|
100
|
+
],
|
|
101
|
+
"prefixes": []
|
|
94
102
|
},
|
|
95
103
|
{
|
|
96
104
|
"name": "tilt-hover",
|
|
@@ -100,7 +108,8 @@
|
|
|
100
108
|
"data-tilt-hover-active"
|
|
101
109
|
],
|
|
102
110
|
"events": [],
|
|
103
|
-
"config": []
|
|
111
|
+
"config": [],
|
|
112
|
+
"prefixes": []
|
|
104
113
|
},
|
|
105
114
|
{
|
|
106
115
|
"name": "announcer",
|
|
@@ -117,6 +126,9 @@
|
|
|
117
126
|
"data-announce-message",
|
|
118
127
|
"data-announce-priority",
|
|
119
128
|
"data-announce-throttle"
|
|
129
|
+
],
|
|
130
|
+
"prefixes": [
|
|
131
|
+
"announce"
|
|
120
132
|
]
|
|
121
133
|
},
|
|
122
134
|
{
|
|
@@ -129,6 +141,9 @@
|
|
|
129
141
|
"events": [],
|
|
130
142
|
"config": [
|
|
131
143
|
"data-pulse-interval"
|
|
144
|
+
],
|
|
145
|
+
"prefixes": [
|
|
146
|
+
"pulse"
|
|
132
147
|
]
|
|
133
148
|
},
|
|
134
149
|
{
|
|
@@ -148,6 +163,9 @@
|
|
|
148
163
|
"data-count-suffix",
|
|
149
164
|
"data-count-decimals",
|
|
150
165
|
"data-count-locale"
|
|
166
|
+
],
|
|
167
|
+
"prefixes": [
|
|
168
|
+
"count"
|
|
151
169
|
]
|
|
152
170
|
},
|
|
153
171
|
{
|
|
@@ -160,6 +178,9 @@
|
|
|
160
178
|
"events": [],
|
|
161
179
|
"config": [
|
|
162
180
|
"data-haptic-pattern"
|
|
181
|
+
],
|
|
182
|
+
"prefixes": [
|
|
183
|
+
"haptic"
|
|
163
184
|
]
|
|
164
185
|
},
|
|
165
186
|
{
|
|
@@ -172,6 +193,9 @@
|
|
|
172
193
|
"events": [],
|
|
173
194
|
"config": [
|
|
174
195
|
"data-sound-type"
|
|
196
|
+
],
|
|
197
|
+
"prefixes": [
|
|
198
|
+
"sound"
|
|
175
199
|
]
|
|
176
200
|
},
|
|
177
201
|
{
|
|
@@ -186,7 +210,8 @@
|
|
|
186
210
|
],
|
|
187
211
|
"config": [
|
|
188
212
|
"data-typewriter-speed"
|
|
189
|
-
]
|
|
213
|
+
],
|
|
214
|
+
"prefixes": []
|
|
190
215
|
},
|
|
191
216
|
{
|
|
192
217
|
"name": "dirty-state",
|
|
@@ -197,7 +222,8 @@
|
|
|
197
222
|
"data-dirty-state-pristine"
|
|
198
223
|
],
|
|
199
224
|
"events": [],
|
|
200
|
-
"config": []
|
|
225
|
+
"config": [],
|
|
226
|
+
"prefixes": []
|
|
201
227
|
},
|
|
202
228
|
{
|
|
203
229
|
"name": "input-mask",
|
|
@@ -213,6 +239,9 @@
|
|
|
213
239
|
"config": [
|
|
214
240
|
"data-mask-pattern",
|
|
215
241
|
"data-mask-strip-on-commit"
|
|
242
|
+
],
|
|
243
|
+
"prefixes": [
|
|
244
|
+
"mask"
|
|
216
245
|
]
|
|
217
246
|
},
|
|
218
247
|
{
|
|
@@ -225,7 +254,8 @@
|
|
|
225
254
|
"events": [
|
|
226
255
|
"reset-applied"
|
|
227
256
|
],
|
|
228
|
-
"config": []
|
|
257
|
+
"config": [],
|
|
258
|
+
"prefixes": []
|
|
229
259
|
},
|
|
230
260
|
{
|
|
231
261
|
"name": "validation",
|
|
@@ -241,6 +271,9 @@
|
|
|
241
271
|
],
|
|
242
272
|
"config": [
|
|
243
273
|
"data-validate"
|
|
274
|
+
],
|
|
275
|
+
"prefixes": [
|
|
276
|
+
"validate"
|
|
244
277
|
]
|
|
245
278
|
},
|
|
246
279
|
{
|
|
@@ -251,7 +284,8 @@
|
|
|
251
284
|
"data-active-state-active"
|
|
252
285
|
],
|
|
253
286
|
"events": [],
|
|
254
|
-
"config": []
|
|
287
|
+
"config": [],
|
|
288
|
+
"prefixes": []
|
|
255
289
|
},
|
|
256
290
|
{
|
|
257
291
|
"name": "droppable",
|
|
@@ -267,7 +301,8 @@
|
|
|
267
301
|
"dnd-drop-leave",
|
|
268
302
|
"dnd-drop-receive"
|
|
269
303
|
],
|
|
270
|
-
"config": []
|
|
304
|
+
"config": [],
|
|
305
|
+
"prefixes": []
|
|
271
306
|
},
|
|
272
307
|
{
|
|
273
308
|
"name": "droppable-collection",
|
|
@@ -280,7 +315,8 @@
|
|
|
280
315
|
"events": [
|
|
281
316
|
"dnd-collection-drop"
|
|
282
317
|
],
|
|
283
|
-
"config": []
|
|
318
|
+
"config": [],
|
|
319
|
+
"prefixes": []
|
|
284
320
|
},
|
|
285
321
|
{
|
|
286
322
|
"name": "focusable",
|
|
@@ -290,7 +326,8 @@
|
|
|
290
326
|
"data-focusable-keyboard"
|
|
291
327
|
],
|
|
292
328
|
"events": [],
|
|
293
|
-
"config": []
|
|
329
|
+
"config": [],
|
|
330
|
+
"prefixes": []
|
|
294
331
|
},
|
|
295
332
|
{
|
|
296
333
|
"name": "hoverable",
|
|
@@ -300,7 +337,8 @@
|
|
|
300
337
|
"data-hoverable-hover"
|
|
301
338
|
],
|
|
302
339
|
"events": [],
|
|
303
|
-
"config": []
|
|
340
|
+
"config": [],
|
|
341
|
+
"prefixes": []
|
|
304
342
|
},
|
|
305
343
|
{
|
|
306
344
|
"name": "long-press",
|
|
@@ -320,7 +358,8 @@
|
|
|
320
358
|
"data-long-press-duration",
|
|
321
359
|
"data-long-press-tolerance",
|
|
322
360
|
"data-long-press-progress-interval"
|
|
323
|
-
]
|
|
361
|
+
],
|
|
362
|
+
"prefixes": []
|
|
324
363
|
},
|
|
325
364
|
{
|
|
326
365
|
"name": "pressable",
|
|
@@ -332,7 +371,8 @@
|
|
|
332
371
|
"events": [
|
|
333
372
|
"press"
|
|
334
373
|
],
|
|
335
|
-
"config": []
|
|
374
|
+
"config": [],
|
|
375
|
+
"prefixes": []
|
|
336
376
|
},
|
|
337
377
|
{
|
|
338
378
|
"name": "confetti",
|
|
@@ -342,7 +382,8 @@
|
|
|
342
382
|
"data-confetti-active"
|
|
343
383
|
],
|
|
344
384
|
"events": [],
|
|
345
|
-
"config": []
|
|
385
|
+
"config": [],
|
|
386
|
+
"prefixes": []
|
|
346
387
|
},
|
|
347
388
|
{
|
|
348
389
|
"name": "confetti-burst",
|
|
@@ -354,7 +395,8 @@
|
|
|
354
395
|
"events": [
|
|
355
396
|
"confetti-burst-done"
|
|
356
397
|
],
|
|
357
|
-
"config": []
|
|
398
|
+
"config": [],
|
|
399
|
+
"prefixes": []
|
|
358
400
|
},
|
|
359
401
|
{
|
|
360
402
|
"name": "magnetic-hover",
|
|
@@ -364,7 +406,8 @@
|
|
|
364
406
|
"data-magnetic-hover-active"
|
|
365
407
|
],
|
|
366
408
|
"events": [],
|
|
367
|
-
"config": []
|
|
409
|
+
"config": [],
|
|
410
|
+
"prefixes": []
|
|
368
411
|
},
|
|
369
412
|
{
|
|
370
413
|
"name": "arrow-grid-nav",
|
|
@@ -383,6 +426,9 @@
|
|
|
383
426
|
"config": [
|
|
384
427
|
"data-grid-columns",
|
|
385
428
|
"data-grid-mode"
|
|
429
|
+
],
|
|
430
|
+
"prefixes": [
|
|
431
|
+
"grid"
|
|
386
432
|
]
|
|
387
433
|
},
|
|
388
434
|
{
|
|
@@ -397,7 +443,8 @@
|
|
|
397
443
|
],
|
|
398
444
|
"config": [
|
|
399
445
|
"data-focus-restore-on-mount"
|
|
400
|
-
]
|
|
446
|
+
],
|
|
447
|
+
"prefixes": []
|
|
401
448
|
},
|
|
402
449
|
{
|
|
403
450
|
"name": "focus-trap",
|
|
@@ -409,7 +456,8 @@
|
|
|
409
456
|
"events": [
|
|
410
457
|
"focus-trap-escape"
|
|
411
458
|
],
|
|
412
|
-
"config": []
|
|
459
|
+
"config": [],
|
|
460
|
+
"prefixes": []
|
|
413
461
|
},
|
|
414
462
|
{
|
|
415
463
|
"name": "hotkey",
|
|
@@ -422,7 +470,8 @@
|
|
|
422
470
|
"config": [
|
|
423
471
|
"data-hotkey",
|
|
424
472
|
"data-hotkey-global"
|
|
425
|
-
]
|
|
473
|
+
],
|
|
474
|
+
"prefixes": []
|
|
426
475
|
},
|
|
427
476
|
{
|
|
428
477
|
"name": "keyboard-nav",
|
|
@@ -439,7 +488,8 @@
|
|
|
439
488
|
"nav-home",
|
|
440
489
|
"nav-end"
|
|
441
490
|
],
|
|
442
|
-
"config": []
|
|
491
|
+
"config": [],
|
|
492
|
+
"prefixes": []
|
|
443
493
|
},
|
|
444
494
|
{
|
|
445
495
|
"name": "keyboard-reorderable",
|
|
@@ -455,7 +505,8 @@
|
|
|
455
505
|
"dnd-drop",
|
|
456
506
|
"dnd-drop-cancel"
|
|
457
507
|
],
|
|
458
|
-
"config": []
|
|
508
|
+
"config": [],
|
|
509
|
+
"prefixes": []
|
|
459
510
|
},
|
|
460
511
|
{
|
|
461
512
|
"name": "roving-tabindex",
|
|
@@ -463,7 +514,8 @@
|
|
|
463
514
|
"description": "Focus management within composite widgets",
|
|
464
515
|
"attributes": [],
|
|
465
516
|
"events": [],
|
|
466
|
-
"config": []
|
|
517
|
+
"config": [],
|
|
518
|
+
"prefixes": []
|
|
467
519
|
},
|
|
468
520
|
{
|
|
469
521
|
"name": "typeahead",
|
|
@@ -475,7 +527,8 @@
|
|
|
475
527
|
"events": [
|
|
476
528
|
"typeahead-match"
|
|
477
529
|
],
|
|
478
|
-
"config": []
|
|
530
|
+
"config": [],
|
|
531
|
+
"prefixes": []
|
|
479
532
|
},
|
|
480
533
|
{
|
|
481
534
|
"name": "anchor-positioning",
|
|
@@ -493,6 +546,9 @@
|
|
|
493
546
|
"data-anchor",
|
|
494
547
|
"data-anchor-placement",
|
|
495
548
|
"data-anchor-gap"
|
|
549
|
+
],
|
|
550
|
+
"prefixes": [
|
|
551
|
+
"anchor"
|
|
496
552
|
]
|
|
497
553
|
},
|
|
498
554
|
{
|
|
@@ -509,6 +565,9 @@
|
|
|
509
565
|
],
|
|
510
566
|
"config": [
|
|
511
567
|
"data-intersection-threshold"
|
|
568
|
+
],
|
|
569
|
+
"prefixes": [
|
|
570
|
+
"intersection"
|
|
512
571
|
]
|
|
513
572
|
},
|
|
514
573
|
{
|
|
@@ -521,7 +580,8 @@
|
|
|
521
580
|
"events": [],
|
|
522
581
|
"config": [
|
|
523
582
|
"data-portal-target"
|
|
524
|
-
]
|
|
583
|
+
],
|
|
584
|
+
"prefixes": []
|
|
525
585
|
},
|
|
526
586
|
{
|
|
527
587
|
"name": "resize-observer",
|
|
@@ -535,7 +595,10 @@
|
|
|
535
595
|
"events": [
|
|
536
596
|
"element-resize"
|
|
537
597
|
],
|
|
538
|
-
"config": []
|
|
598
|
+
"config": [],
|
|
599
|
+
"prefixes": [
|
|
600
|
+
"resize"
|
|
601
|
+
]
|
|
539
602
|
},
|
|
540
603
|
{
|
|
541
604
|
"name": "scroll-lock",
|
|
@@ -545,7 +608,8 @@
|
|
|
545
608
|
"data-scroll-lock-active"
|
|
546
609
|
],
|
|
547
610
|
"events": [],
|
|
548
|
-
"config": []
|
|
611
|
+
"config": [],
|
|
612
|
+
"prefixes": []
|
|
549
613
|
},
|
|
550
614
|
{
|
|
551
615
|
"name": "scroll-progress",
|
|
@@ -561,6 +625,9 @@
|
|
|
561
625
|
"config": [
|
|
562
626
|
"data-scroll-progress-mode",
|
|
563
627
|
"data-scroll-container"
|
|
628
|
+
],
|
|
629
|
+
"prefixes": [
|
|
630
|
+
"scroll-container"
|
|
564
631
|
]
|
|
565
632
|
},
|
|
566
633
|
{
|
|
@@ -571,7 +638,8 @@
|
|
|
571
638
|
"data-drag-ghost-active"
|
|
572
639
|
],
|
|
573
640
|
"events": [],
|
|
574
|
-
"config": []
|
|
641
|
+
"config": [],
|
|
642
|
+
"prefixes": []
|
|
575
643
|
},
|
|
576
644
|
{
|
|
577
645
|
"name": "draggable",
|
|
@@ -583,7 +651,8 @@
|
|
|
583
651
|
"events": [
|
|
584
652
|
"drag-end"
|
|
585
653
|
],
|
|
586
|
-
"config": []
|
|
654
|
+
"config": [],
|
|
655
|
+
"prefixes": []
|
|
587
656
|
},
|
|
588
657
|
{
|
|
589
658
|
"name": "draggable-list-item",
|
|
@@ -601,7 +670,8 @@
|
|
|
601
670
|
],
|
|
602
671
|
"config": [
|
|
603
672
|
"data-draggable-list-item-ghost"
|
|
604
|
-
]
|
|
673
|
+
],
|
|
674
|
+
"prefixes": []
|
|
605
675
|
},
|
|
606
676
|
{
|
|
607
677
|
"name": "drop-target",
|
|
@@ -620,7 +690,8 @@
|
|
|
620
690
|
],
|
|
621
691
|
"config": [
|
|
622
692
|
"data-drop-target-accepts"
|
|
623
|
-
]
|
|
693
|
+
],
|
|
694
|
+
"prefixes": []
|
|
624
695
|
},
|
|
625
696
|
{
|
|
626
697
|
"name": "inertia-drag",
|
|
@@ -632,7 +703,8 @@
|
|
|
632
703
|
"events": [
|
|
633
704
|
"drag-end"
|
|
634
705
|
],
|
|
635
|
-
"config": []
|
|
706
|
+
"config": [],
|
|
707
|
+
"prefixes": []
|
|
636
708
|
},
|
|
637
709
|
{
|
|
638
710
|
"name": "layout-animation",
|
|
@@ -648,6 +720,9 @@
|
|
|
648
720
|
"data-layout-animate-duration",
|
|
649
721
|
"data-layout-animate-easing",
|
|
650
722
|
"data-layout-animate-trigger"
|
|
723
|
+
],
|
|
724
|
+
"prefixes": [
|
|
725
|
+
"layout-animate"
|
|
651
726
|
]
|
|
652
727
|
},
|
|
653
728
|
{
|
|
@@ -661,7 +736,8 @@
|
|
|
661
736
|
"events": [
|
|
662
737
|
"resize-end"
|
|
663
738
|
],
|
|
664
|
-
"config": []
|
|
739
|
+
"config": [],
|
|
740
|
+
"prefixes": []
|
|
665
741
|
},
|
|
666
742
|
{
|
|
667
743
|
"name": "snap-to-grid",
|
|
@@ -673,6 +749,9 @@
|
|
|
673
749
|
"events": [],
|
|
674
750
|
"config": [
|
|
675
751
|
"data-snap-grid"
|
|
752
|
+
],
|
|
753
|
+
"prefixes": [
|
|
754
|
+
"snap-grid"
|
|
676
755
|
]
|
|
677
756
|
},
|
|
678
757
|
{
|
|
@@ -687,7 +766,8 @@
|
|
|
687
766
|
],
|
|
688
767
|
"config": [
|
|
689
768
|
"data-tossable-bounds"
|
|
690
|
-
]
|
|
769
|
+
],
|
|
770
|
+
"prefixes": []
|
|
691
771
|
},
|
|
692
772
|
{
|
|
693
773
|
"name": "view-transition",
|
|
@@ -704,7 +784,8 @@
|
|
|
704
784
|
"data-view-transition-name",
|
|
705
785
|
"data-view-transition-duration",
|
|
706
786
|
"data-view-transition-easing"
|
|
707
|
-
]
|
|
787
|
+
],
|
|
788
|
+
"prefixes": []
|
|
708
789
|
},
|
|
709
790
|
{
|
|
710
791
|
"name": "glow-focus",
|
|
@@ -714,7 +795,8 @@
|
|
|
714
795
|
"data-glow-focus-active"
|
|
715
796
|
],
|
|
716
797
|
"events": [],
|
|
717
|
-
"config": []
|
|
798
|
+
"config": [],
|
|
799
|
+
"prefixes": []
|
|
718
800
|
},
|
|
719
801
|
{
|
|
720
802
|
"name": "gradient-shift",
|
|
@@ -724,7 +806,8 @@
|
|
|
724
806
|
"data-gradient-shift-active"
|
|
725
807
|
],
|
|
726
808
|
"events": [],
|
|
727
|
-
"config": []
|
|
809
|
+
"config": [],
|
|
810
|
+
"prefixes": []
|
|
728
811
|
},
|
|
729
812
|
{
|
|
730
813
|
"name": "noise-texture",
|
|
@@ -736,6 +819,9 @@
|
|
|
736
819
|
"events": [],
|
|
737
820
|
"config": [
|
|
738
821
|
"data-noise-strength"
|
|
822
|
+
],
|
|
823
|
+
"prefixes": [
|
|
824
|
+
"noise"
|
|
739
825
|
]
|
|
740
826
|
},
|
|
741
827
|
{
|
|
@@ -748,7 +834,8 @@
|
|
|
748
834
|
"events": [],
|
|
749
835
|
"config": [
|
|
750
836
|
"data-parallax-strength"
|
|
751
|
-
]
|
|
837
|
+
],
|
|
838
|
+
"prefixes": []
|
|
752
839
|
},
|
|
753
840
|
{
|
|
754
841
|
"name": "shimmer-loading",
|
|
@@ -758,7 +845,8 @@
|
|
|
758
845
|
"data-shimmer-loading-active"
|
|
759
846
|
],
|
|
760
847
|
"events": [],
|
|
761
|
-
"config": []
|
|
848
|
+
"config": [],
|
|
849
|
+
"prefixes": []
|
|
762
850
|
}
|
|
763
851
|
]
|
|
764
852
|
}
|
|
@@ -45,6 +45,7 @@ export const anchorPositioning = defineTrait({
|
|
|
45
45
|
],
|
|
46
46
|
events: ['anchor-placed'],
|
|
47
47
|
config: ['data-anchor', 'data-anchor-placement', 'data-anchor-gap'],
|
|
48
|
+
prefixes: ['anchor'], // ADR-0060 — grandfathered: config uses data-anchor(-*), not data-anchor-positioning-*
|
|
48
49
|
setup({ host }) {
|
|
49
50
|
const anchorSel = host.getAttribute('data-anchor');
|
|
50
51
|
const placement = host.getAttribute('data-anchor-placement') || 'bottom';
|
|
@@ -50,6 +50,7 @@ export const announcer = defineTrait({
|
|
|
50
50
|
'data-announce-priority',
|
|
51
51
|
'data-announce-throttle',
|
|
52
52
|
],
|
|
53
|
+
prefixes: ['announce'], // ADR-0060 — grandfathered: config uses data-announce-*, not data-announcer-*
|
|
53
54
|
setup({ host }) {
|
|
54
55
|
const eventName = host.getAttribute('data-announce-on');
|
|
55
56
|
if (!eventName) {
|
|
@@ -27,6 +27,7 @@ export const arrowGridNav = defineTrait({
|
|
|
27
27
|
attributes: ['data-arrow-grid-nav-active', 'data-grid-active-row', 'data-grid-active-col'],
|
|
28
28
|
events: ['grid-activate', 'grid-edge', 'grid-cell-change'],
|
|
29
29
|
config: ['data-grid-columns', 'data-grid-mode'],
|
|
30
|
+
prefixes: ['grid'], // ADR-0060 — grandfathered; grazes chart/heatmap's bare `data-grid` anatomy marker (burn-down, not a fail)
|
|
30
31
|
setup({ host }) {
|
|
31
32
|
let activeRow = 0;
|
|
32
33
|
let activeCol = 0;
|
|
@@ -8,6 +8,7 @@ export const attentionPulse = defineTrait({
|
|
|
8
8
|
attributes: ['data-attention-pulse-active'],
|
|
9
9
|
events: [],
|
|
10
10
|
config: ['data-pulse-interval'],
|
|
11
|
+
prefixes: ['pulse'], // ADR-0060 — grandfathered: data-pulse-interval predates data-attention-pulse-*
|
|
11
12
|
setup({ host }) {
|
|
12
13
|
// Reduced-motion: mark active but suppress the pulse animation.
|
|
13
14
|
if (prefersReducedMotion()) {
|
|
@@ -7,6 +7,7 @@ export const countUp = defineTrait({
|
|
|
7
7
|
description: 'Animated numeric transitions',
|
|
8
8
|
attributes: ['data-count-up-active'],
|
|
9
9
|
events: ['count-up-done'],
|
|
10
|
+
prefixes: ['count'], // ADR-0060 — grandfathered: config uses data-count-*, not data-count-up-*
|
|
10
11
|
config: [
|
|
11
12
|
'data-count-up-target',
|
|
12
13
|
'data-count-duration',
|
package/traits/define.js
CHANGED
|
@@ -31,10 +31,84 @@
|
|
|
31
31
|
* class MyButton extends UIElement {
|
|
32
32
|
* static traits = [pressable];
|
|
33
33
|
* }
|
|
34
|
+
*
|
|
35
|
+
* ADR-0060 — the `data-*` namespace-ownership gate. Every trait owns
|
|
36
|
+
* `data-{name}` (exact) and `data-{name}-*` (family) by default. A trait
|
|
37
|
+
* whose `attributes`/`config` use any other prefix must declare it via the
|
|
38
|
+
* optional `prefixes: string[]` field (bare words, no `data-` and no
|
|
39
|
+
* trailing hyphen — e.g. `prefixes: ['count']` grants `data-count` +
|
|
40
|
+
* `data-count-*`). Two checks run at registration time:
|
|
41
|
+
*
|
|
42
|
+
* 1. Ownership — every declared `attributes`/`config` name must fall
|
|
43
|
+
* under the trait's own name or one of its registered prefixes, or
|
|
44
|
+
* `defineTrait()` throws.
|
|
45
|
+
* 2. Exclusivity — a registered prefix can never overlap another trait's
|
|
46
|
+
* registered prefix, nor another trait's own name (checked against
|
|
47
|
+
* whatever is already in the registry at call time; the trait catalog
|
|
48
|
+
* build imports every trait file, so the check achieves full pairwise
|
|
49
|
+
* coverage once `build:traits`/`verify:traits` runs). Two *bare* trait
|
|
50
|
+
* names naturally being prefixes of each other (`droppable` /
|
|
51
|
+
* `droppable-collection`, `confetti` / `confetti-burst`, `draggable` /
|
|
52
|
+
* `draggable-list-item`) is not a claim conflict — neither side
|
|
53
|
+
* registered a prefix — so it is not checked.
|
|
34
54
|
*/
|
|
35
55
|
|
|
36
56
|
const registry = new Map();
|
|
37
57
|
|
|
58
|
+
// name === `data-${root}` or name starts with `data-${root}-`.
|
|
59
|
+
function ownsName(root, name) {
|
|
60
|
+
return name === `data-${root}` || name.startsWith(`data-${root}-`);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Two "roots" (a bare trait name or a registered prefix) collide if they're
|
|
64
|
+
// equal, or one is a hyphen-bounded prefix of the other — either would let
|
|
65
|
+
// two different data-* families claim the same attribute name.
|
|
66
|
+
function rootsOverlap(a, b) {
|
|
67
|
+
return a === b || a.startsWith(`${b}-`) || b.startsWith(`${a}-`);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function assertOwnership(spec) {
|
|
71
|
+
const roots = [spec.name, ...(spec.prefixes || [])];
|
|
72
|
+
const unowned = [...(spec.attributes || []), ...(spec.config || [])]
|
|
73
|
+
.filter((name) => !roots.some((root) => ownsName(root, name)));
|
|
74
|
+
if (unowned.length > 0) {
|
|
75
|
+
throw new Error(
|
|
76
|
+
`Trait "${spec.name}" declares attribute(s) outside its owned data-* namespace: ${unowned.join(', ')}. ` +
|
|
77
|
+
`A trait owns "data-${spec.name}" / "data-${spec.name}-*" by default; register any other prefix via ` +
|
|
78
|
+
`defineTrait({ ..., prefixes: [...] }) (ADR-0060) or rename the attribute.`
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function assertPrefixExclusivity(spec) {
|
|
84
|
+
const myPrefixes = spec.prefixes || [];
|
|
85
|
+
for (const [otherName, otherFactory] of registry) {
|
|
86
|
+
if (otherName === spec.name) continue;
|
|
87
|
+
const other = otherFactory.schema;
|
|
88
|
+
const otherRoots = [other.name, ...(other.prefixes || [])];
|
|
89
|
+
for (const p of myPrefixes) {
|
|
90
|
+
for (const otherRoot of otherRoots) {
|
|
91
|
+
if (rootsOverlap(p, otherRoot)) {
|
|
92
|
+
throw new Error(
|
|
93
|
+
`Trait "${spec.name}"'s registered prefix "${p}" overlaps trait "${other.name}"'s owned namespace ` +
|
|
94
|
+
`("${otherRoot}"). Registered prefixes must be globally exclusive across the trait registry (ADR-0060).`
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// The reverse direction: an already-registered trait's own registered
|
|
100
|
+
// prefix must not overlap this new trait's bare name either.
|
|
101
|
+
for (const otherPrefix of other.prefixes || []) {
|
|
102
|
+
if (rootsOverlap(otherPrefix, spec.name)) {
|
|
103
|
+
throw new Error(
|
|
104
|
+
`Trait "${spec.name}"'s name overlaps trait "${other.name}"'s registered prefix "${otherPrefix}". ` +
|
|
105
|
+
`Registered prefixes must be globally exclusive across the trait registry (ADR-0060).`
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
38
112
|
const KNOWN_CATEGORIES = new Set([
|
|
39
113
|
'input-interaction',
|
|
40
114
|
'keyboard-navigation',
|
|
@@ -56,6 +130,9 @@ export function defineTrait(spec) {
|
|
|
56
130
|
}
|
|
57
131
|
if (!spec.description) throw new Error(`Trait "${spec.name}" requires a description`);
|
|
58
132
|
|
|
133
|
+
assertOwnership(spec);
|
|
134
|
+
assertPrefixExclusivity(spec);
|
|
135
|
+
|
|
59
136
|
const schema = Object.freeze({
|
|
60
137
|
name: spec.name,
|
|
61
138
|
category: spec.category,
|
|
@@ -63,6 +140,7 @@ export function defineTrait(spec) {
|
|
|
63
140
|
attributes: Object.freeze(spec.attributes || []),
|
|
64
141
|
events: Object.freeze(spec.events || []),
|
|
65
142
|
config: Object.freeze(spec.config || []),
|
|
143
|
+
prefixes: Object.freeze(spec.prefixes || []),
|
|
66
144
|
});
|
|
67
145
|
|
|
68
146
|
function factory() {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { defineTrait } from '../define.js';
|
|
2
|
+
import { isElement } from '../../core/dom.js';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* `focus-restore` — capture the previously-focused element on connect,
|
|
@@ -35,7 +36,7 @@ const FOCUSABLE_SELECTOR =
|
|
|
35
36
|
'a[href], [role="button"][tabindex], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), [tabindex]:not([tabindex="-1"]), [contenteditable]';
|
|
36
37
|
|
|
37
38
|
function isFocusable(el) {
|
|
38
|
-
if (!el || !(el
|
|
39
|
+
if (!el || !isElement(el)) return false;
|
|
39
40
|
if (typeof el.focus !== 'function') return false;
|
|
40
41
|
if (el.hasAttribute('disabled')) return false;
|
|
41
42
|
// Element must still be connected to the document for focus to land.
|