@adia-ai/web-components 0.4.6 → 0.4.8
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/README.md +39 -0
- package/USAGE.md +29 -9
- package/components/accordion/accordion.a2ui.json +3 -0
- package/components/accordion/accordion.d.ts +27 -0
- package/components/accordion/accordion.js +10 -117
- package/components/accordion/accordion.yaml +4 -0
- package/components/accordion/class.js +132 -0
- package/components/action-list/action-list.a2ui.json +3 -0
- package/components/action-list/action-list.d.ts +25 -0
- package/components/action-list/action-list.js +9 -140
- package/components/action-list/action-list.yaml +4 -0
- package/components/action-list/class.js +156 -0
- package/components/agent-artifact/agent-artifact.a2ui.json +4 -0
- package/components/agent-artifact/agent-artifact.d.ts +35 -0
- package/components/agent-artifact/agent-artifact.js +8 -181
- package/components/agent-artifact/agent-artifact.yaml +5 -0
- package/components/agent-artifact/class.js +200 -0
- package/components/agent-feedback-bar/agent-feedback-bar.a2ui.json +3 -0
- package/components/agent-feedback-bar/agent-feedback-bar.d.ts +33 -0
- package/components/agent-feedback-bar/agent-feedback-bar.js +8 -143
- package/components/agent-feedback-bar/agent-feedback-bar.yaml +4 -0
- package/components/agent-feedback-bar/class.js +162 -0
- package/components/agent-questions/agent-questions.a2ui.json +3 -0
- package/components/agent-questions/agent-questions.d.ts +33 -0
- package/components/agent-questions/agent-questions.js +8 -180
- package/components/agent-questions/agent-questions.yaml +4 -0
- package/components/agent-questions/class.js +199 -0
- package/components/agent-reasoning/agent-reasoning.a2ui.json +4 -0
- package/components/agent-reasoning/agent-reasoning.d.ts +37 -0
- package/components/agent-reasoning/agent-reasoning.js +8 -494
- package/components/agent-reasoning/agent-reasoning.yaml +5 -0
- package/components/agent-reasoning/class.js +513 -0
- package/components/agent-suggestions/agent-suggestions.a2ui.json +3 -0
- package/components/agent-suggestions/agent-suggestions.d.ts +31 -0
- package/components/agent-suggestions/agent-suggestions.js +8 -78
- package/components/agent-suggestions/agent-suggestions.yaml +4 -0
- package/components/agent-suggestions/class.js +97 -0
- package/components/agent-trace/agent-trace.a2ui.json +1 -0
- package/components/agent-trace/agent-trace.d.ts +29 -0
- package/components/alert/alert.a2ui.json +1 -0
- package/components/alert/alert.d.ts +39 -0
- package/components/alert/alert.js +8 -175
- package/components/alert/class.js +194 -0
- package/components/aside/aside.a2ui.json +1 -0
- package/components/avatar/avatar.a2ui.json +3 -0
- package/components/avatar/avatar.d.ts +28 -0
- package/components/avatar/avatar.js +9 -159
- package/components/avatar/avatar.yaml +4 -0
- package/components/avatar/class.js +173 -0
- package/components/badge/badge.a2ui.json +3 -0
- package/components/badge/badge.d.ts +28 -0
- package/components/badge/badge.js +9 -75
- package/components/badge/badge.yaml +4 -0
- package/components/badge/class.js +93 -0
- package/components/block/block.a2ui.json +1 -0
- package/components/block/block.d.ts +20 -0
- package/components/block/block.js +9 -15
- package/components/block/class.js +33 -0
- package/components/breadcrumb/breadcrumb.a2ui.json +5 -0
- package/components/breadcrumb/breadcrumb.d.ts +24 -0
- package/components/breadcrumb/breadcrumb.js +8 -113
- package/components/breadcrumb/breadcrumb.yaml +6 -0
- package/components/breadcrumb/class.js +132 -0
- package/components/button/button.a2ui.json +3 -0
- package/components/button/button.d.ts +44 -0
- package/components/button/button.js +15 -66
- package/components/button/button.yaml +5 -0
- package/components/button/class.js +80 -0
- package/components/calendar-picker/calendar-picker.a2ui.json +7 -1
- package/components/calendar-picker/calendar-picker.js +8 -332
- package/components/calendar-picker/calendar-picker.yaml +51 -177
- package/components/calendar-picker/class.js +351 -0
- package/components/canvas/canvas.a2ui.json +7 -1
- package/components/canvas/canvas.d.ts +33 -0
- package/components/canvas/canvas.yaml +29 -36
- package/components/card/card.a2ui.json +4 -0
- package/components/card/card.d.ts +37 -0
- package/components/card/card.js +9 -50
- package/components/card/card.yaml +171 -433
- package/components/card/class.js +68 -0
- package/components/chart/chart.a2ui.json +1 -0
- package/components/chart/chart.d.ts +55 -0
- package/components/chart/chart.js +8 -2131
- package/components/chart/class.js +2150 -0
- package/components/chart-legend/chart-legend.a2ui.json +4 -0
- package/components/chart-legend/chart-legend.d.ts +37 -0
- package/components/chart-legend/chart-legend.js +8 -197
- package/components/chart-legend/chart-legend.yaml +5 -0
- package/components/chart-legend/class.js +215 -0
- package/components/chat-thread/chat-thread.a2ui.json +1 -0
- package/components/chat-thread/chat-thread.d.ts +27 -0
- package/components/chat-thread/chat-thread.js +8 -157
- package/components/chat-thread/class.js +176 -0
- package/components/check/check.a2ui.json +1 -0
- package/components/check/check.js +11 -52
- package/components/check/class.js +68 -0
- package/components/code/class.js +501 -0
- package/components/code/code.a2ui.json +1 -0
- package/components/code/code.js +8 -482
- package/components/col/class.js +30 -0
- package/components/col/col.a2ui.json +1 -0
- package/components/col/col.d.ts +24 -0
- package/components/col/col.js +10 -13
- package/components/color-picker/class.js +550 -0
- package/components/color-picker/color-picker.a2ui.json +3 -0
- package/components/color-picker/color-picker.js +8 -531
- package/components/color-picker/color-picker.yaml +4 -0
- package/components/command/class.js +364 -0
- package/components/command/command.a2ui.json +4 -0
- package/components/command/command.d.ts +31 -0
- package/components/command/command.js +8 -345
- package/components/command/command.yaml +105 -124
- package/components/demo-toggle/class.js +153 -0
- package/components/demo-toggle/demo-toggle.a2ui.json +1 -0
- package/components/demo-toggle/demo-toggle.d.ts +33 -0
- package/components/demo-toggle/demo-toggle.js +8 -135
- package/components/description-list/class.js +86 -0
- package/components/description-list/description-list.a2ui.json +1 -0
- package/components/description-list/description-list.d.ts +22 -0
- package/components/description-list/description-list.js +8 -67
- package/components/divider/class.js +57 -0
- package/components/divider/divider.a2ui.json +1 -0
- package/components/divider/divider.d.ts +20 -0
- package/components/divider/divider.js +10 -40
- package/components/drawer/class.js +306 -0
- package/components/drawer/drawer.a2ui.json +1 -0
- package/components/drawer/drawer.d.ts +35 -0
- package/components/drawer/drawer.js +8 -287
- package/components/embed/class.js +73 -0
- package/components/embed/embed.a2ui.json +1 -0
- package/components/embed/embed.d.ts +24 -0
- package/components/embed/embed.js +9 -55
- package/components/empty-state/class.js +108 -0
- package/components/empty-state/empty-state.a2ui.json +3 -0
- package/components/empty-state/empty-state.d.ts +22 -0
- package/components/empty-state/empty-state.js +9 -90
- package/components/empty-state/empty-state.yaml +4 -0
- package/components/feed/class.js +381 -0
- package/components/feed/feed.a2ui.json +9 -1
- package/components/feed/feed.d.ts +29 -0
- package/components/feed/feed.js +9 -367
- package/components/feed/feed.yaml +8 -1
- package/components/field/class.js +266 -0
- package/components/field/field.a2ui.json +1 -0
- package/components/field/field.d.ts +24 -0
- package/components/field/field.js +8 -247
- package/components/fields/class.js +106 -0
- package/components/fields/fields.a2ui.json +1 -0
- package/components/fields/fields.d.ts +20 -0
- package/components/fields/fields.js +8 -87
- package/components/footer/footer.a2ui.json +1 -0
- package/components/grid/class.js +31 -0
- package/components/grid/grid.a2ui.json +1 -0
- package/components/grid/grid.d.ts +24 -0
- package/components/grid/grid.js +10 -14
- package/components/header/header.a2ui.json +1 -0
- package/components/heatmap/class.js +305 -0
- package/components/heatmap/heatmap.a2ui.json +1 -0
- package/components/heatmap/heatmap.d.ts +43 -0
- package/components/heatmap/heatmap.js +8 -286
- package/components/icon/class.js +54 -0
- package/components/icon/icon.a2ui.json +1 -0
- package/components/icon/icon.d.ts +24 -0
- package/components/icon/icon.js +13 -40
- package/components/image/class.js +112 -0
- package/components/image/image.a2ui.json +3 -0
- package/components/image/image.d.ts +34 -0
- package/components/image/image.js +9 -94
- package/components/image/image.yaml +4 -0
- package/components/index.js +8 -0
- package/components/input/class.js +773 -0
- package/components/input/input.a2ui.json +7 -0
- package/components/input/input.js +8 -755
- package/components/input/input.yaml +177 -442
- package/components/inspector/class.js +142 -0
- package/components/inspector/inspector.a2ui.json +13 -1
- package/components/inspector/inspector.d.ts +18 -0
- package/components/inspector/inspector.js +8 -124
- package/components/inspector/inspector.yaml +21 -30
- package/components/kbd/class.js +34 -0
- package/components/kbd/kbd.a2ui.json +4 -0
- package/components/kbd/kbd.d.ts +18 -0
- package/components/kbd/kbd.js +10 -17
- package/components/kbd/kbd.yaml +54 -185
- package/components/link/class.js +187 -0
- package/components/link/link.a2ui.json +1 -0
- package/components/link/link.d.ts +65 -0
- package/components/link/link.js +8 -168
- package/components/list/class.js +249 -0
- package/components/list/list.a2ui.json +3 -0
- package/components/list/list.d.ts +33 -0
- package/components/list/list.js +9 -231
- package/components/list/list.yaml +4 -0
- package/components/menu/class.js +332 -0
- package/components/menu/menu.a2ui.json +3 -0
- package/components/menu/menu.d.ts +31 -0
- package/components/menu/menu.js +11 -316
- package/components/menu/menu.yaml +4 -0
- package/components/modal/class.js +231 -0
- package/components/modal/modal.a2ui.json +6 -1
- package/components/modal/modal.d.ts +33 -0
- package/components/modal/modal.js +8 -212
- package/components/modal/modal.yaml +19 -39
- package/components/nav/class.js +150 -0
- package/components/nav/nav.a2ui.json +1 -0
- package/components/nav/nav.d.ts +41 -0
- package/components/nav/nav.js +8 -131
- package/components/nav-group/class.js +152 -0
- package/components/nav-group/nav-group.a2ui.json +1 -0
- package/components/nav-group/nav-group.d.ts +45 -0
- package/components/nav-group/nav-group.js +9 -134
- package/components/nav-item/class.js +86 -0
- package/components/nav-item/nav-item.a2ui.json +1 -0
- package/components/nav-item/nav-item.d.ts +47 -0
- package/components/nav-item/nav-item.js +10 -69
- package/components/noodles/class.js +510 -0
- package/components/noodles/noodles.a2ui.json +1 -0
- package/components/noodles/noodles.d.ts +47 -0
- package/components/noodles/noodles.js +9 -493
- package/components/option-card/class.js +167 -0
- package/components/option-card/option-card.a2ui.json +3 -0
- package/components/option-card/option-card.js +8 -149
- package/components/option-card/option-card.yaml +4 -0
- package/components/otp-input/class.js +180 -0
- package/components/otp-input/otp-input.a2ui.json +6 -1
- package/components/otp-input/otp-input.js +9 -162
- package/components/otp-input/otp-input.yaml +45 -174
- package/components/page/class.js +97 -0
- package/components/page/page.a2ui.json +1 -0
- package/components/page/page.d.ts +47 -0
- package/components/page/page.js +8 -79
- package/components/pagination/class.js +195 -0
- package/components/pagination/pagination.a2ui.json +1 -0
- package/components/pagination/pagination.d.ts +33 -0
- package/components/pagination/pagination.js +9 -177
- package/components/pane/class.js +186 -0
- package/components/pane/pane.a2ui.json +20 -2
- package/components/pane/pane.d.ts +41 -0
- package/components/pane/pane.js +8 -167
- package/components/pane/pane.yaml +64 -158
- package/components/pipeline-status/class.js +189 -0
- package/components/pipeline-status/pipeline-status.a2ui.json +8 -1
- package/components/pipeline-status/pipeline-status.d.ts +22 -0
- package/components/pipeline-status/pipeline-status.js +9 -172
- package/components/pipeline-status/pipeline-status.yaml +34 -72
- package/components/popover/class.js +194 -0
- package/components/popover/popover.a2ui.json +1 -0
- package/components/popover/popover.d.ts +24 -0
- package/components/popover/popover.js +9 -176
- package/components/progress/class.js +74 -0
- package/components/progress/progress.a2ui.json +4 -0
- package/components/progress/progress.d.ts +20 -0
- package/components/progress/progress.js +10 -57
- package/components/progress/progress.yaml +124 -287
- package/components/progress-row/class.js +110 -0
- package/components/progress-row/progress-row.a2ui.json +3 -0
- package/components/progress-row/progress-row.d.ts +24 -0
- package/components/progress-row/progress-row.js +8 -92
- package/components/progress-row/progress-row.yaml +4 -0
- package/components/radio/class.js +83 -0
- package/components/radio/radio.a2ui.json +1 -0
- package/components/radio/radio.js +11 -67
- package/components/range/class.js +194 -0
- package/components/range/range.a2ui.json +1 -0
- package/components/range/range.js +9 -176
- package/components/rating/class.js +148 -0
- package/components/rating/rating.a2ui.json +1 -0
- package/components/rating/rating.js +9 -130
- package/components/richtext/class.js +87 -0
- package/components/richtext/richtext.a2ui.json +8 -1
- package/components/richtext/richtext.d.ts +20 -0
- package/components/richtext/richtext.js +8 -68
- package/components/richtext/richtext.yaml +30 -65
- package/components/row/class.js +50 -0
- package/components/row/row.a2ui.json +1 -0
- package/components/row/row.d.ts +37 -0
- package/components/row/row.js +10 -33
- package/components/search/class.js +134 -0
- package/components/search/search.a2ui.json +1 -0
- package/components/search/search.js +10 -117
- package/components/section/section.a2ui.json +1 -0
- package/components/segment/class.js +62 -0
- package/components/segment/segment.a2ui.json +3 -0
- package/components/segment/segment.d.ts +26 -0
- package/components/segment/segment.js +10 -45
- package/components/segment/segment.yaml +4 -0
- package/components/segmented/class.js +165 -0
- package/components/segmented/segmented.a2ui.json +5 -0
- package/components/segmented/segmented.js +10 -148
- package/components/segmented/segmented.yaml +41 -59
- package/components/select/class.js +408 -0
- package/components/select/select.a2ui.json +3 -0
- package/components/select/select.js +15 -396
- package/components/select/select.yaml +4 -0
- package/components/skeleton/class.js +52 -0
- package/components/skeleton/skeleton.a2ui.json +1 -0
- package/components/skeleton/skeleton.d.ts +24 -0
- package/components/skeleton/skeleton.js +8 -34
- package/components/slider/class.js +184 -0
- package/components/slider/slider.a2ui.json +1 -0
- package/components/slider/slider.js +9 -166
- package/components/stack/class.js +28 -0
- package/components/stack/stack.a2ui.json +1 -0
- package/components/stack/stack.d.ts +18 -0
- package/components/stack/stack.js +10 -11
- package/components/stat/stat.a2ui.json +1 -0
- package/components/step-progress/class.js +98 -0
- package/components/step-progress/step-progress.a2ui.json +1 -0
- package/components/step-progress/step-progress.d.ts +28 -0
- package/components/step-progress/step-progress.js +8 -79
- package/components/stepper/class.js +126 -0
- package/components/stepper/stepper.a2ui.json +3 -0
- package/components/stepper/stepper.d.ts +20 -0
- package/components/stepper/stepper.js +9 -112
- package/components/stepper/stepper.yaml +4 -0
- package/components/stream/class.js +109 -0
- package/components/stream/stream.a2ui.json +1 -0
- package/components/stream/stream.d.ts +33 -0
- package/components/stream/stream.js +8 -90
- package/components/swatch/class.js +131 -0
- package/components/swatch/swatch.a2ui.json +1 -0
- package/components/swatch/swatch.d.ts +29 -0
- package/components/swatch/swatch.js +8 -112
- package/components/swiper/class.js +373 -0
- package/components/swiper/swiper.a2ui.json +7 -0
- package/components/swiper/swiper.d.ts +45 -0
- package/components/swiper/swiper.js +8 -354
- package/components/swiper/swiper.yaml +72 -212
- package/components/switch/class.js +63 -0
- package/components/switch/switch.a2ui.json +7 -1
- package/components/switch/switch.js +11 -47
- package/components/switch/switch.yaml +70 -265
- package/components/table/class.js +1453 -0
- package/components/table/table.a2ui.json +7 -0
- package/components/table/table.d.ts +55 -0
- package/components/table/table.js +8 -1435
- package/components/table/table.yaml +8 -0
- package/components/table-toolbar/class.js +680 -0
- package/components/table-toolbar/table-toolbar.a2ui.json +12 -0
- package/components/table-toolbar/table-toolbar.d.ts +49 -0
- package/components/table-toolbar/table-toolbar.js +8 -689
- package/components/table-toolbar/table-toolbar.yaml +13 -0
- package/components/tabs/class.js +242 -0
- package/components/tabs/tabs.a2ui.json +3 -0
- package/components/tabs/tabs.d.ts +31 -0
- package/components/tabs/tabs.js +8 -223
- package/components/tabs/tabs.yaml +4 -0
- package/components/tag/class.js +99 -0
- package/components/tag/tag.a2ui.json +1 -0
- package/components/tag/tag.d.ts +37 -0
- package/components/tag/tag.js +8 -80
- package/components/text/class.js +46 -0
- package/components/text/text.a2ui.json +1 -0
- package/components/text/text.d.ts +26 -0
- package/components/text/text.js +9 -28
- package/components/textarea/class.js +134 -0
- package/components/textarea/textarea.a2ui.json +1 -0
- package/components/textarea/textarea.js +11 -118
- package/components/timeline/class.js +176 -0
- package/components/timeline/timeline.a2ui.json +18 -1
- package/components/timeline/timeline.d.ts +36 -0
- package/components/timeline/timeline.js +9 -162
- package/components/timeline/timeline.yaml +14 -1
- package/components/toast/class.js +92 -0
- package/components/toast/toast.a2ui.json +1 -0
- package/components/toast/toast.d.ts +33 -0
- package/components/toast/toast.js +9 -76
- package/components/toggle-group/class.js +154 -0
- package/components/toggle-group/toggle-group.a2ui.json +1 -0
- package/components/toggle-group/toggle-group.d.ts +29 -0
- package/components/toggle-group/toggle-group.js +11 -140
- package/components/toggle-scheme/class.js +286 -0
- package/components/toggle-scheme/toggle-scheme.a2ui.json +3 -0
- package/components/toggle-scheme/toggle-scheme.d.ts +51 -0
- package/components/toggle-scheme/toggle-scheme.js +8 -268
- package/components/toggle-scheme/toggle-scheme.yaml +4 -0
- package/components/toolbar/class.js +388 -0
- package/components/toolbar/toolbar.a2ui.json +3 -0
- package/components/toolbar/toolbar.d.ts +24 -0
- package/components/toolbar/toolbar.js +10 -376
- package/components/toolbar/toolbar.yaml +4 -0
- package/components/tooltip/class.js +299 -0
- package/components/tooltip/tooltip.a2ui.json +1 -0
- package/components/tooltip/tooltip.d.ts +28 -0
- package/components/tooltip/tooltip.js +8 -280
- package/components/tree/class.js +245 -0
- package/components/tree/tree.a2ui.json +3 -0
- package/components/tree/tree.d.ts +25 -0
- package/components/tree/tree.js +9 -244
- package/components/tree/tree.yaml +4 -0
- package/components/upload/class.js +199 -0
- package/components/upload/upload.a2ui.json +1 -0
- package/components/upload/upload.js +11 -183
- package/core/icons-phosphor.js +93 -0
- package/core/icons.js +92 -90
- package/core/index.js +5 -0
- package/index.d.ts +160 -5
- package/index.js +7 -0
- package/package.json +7 -2
|
@@ -1,296 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* `<drawer-ui>` — auto-registers the tag on import.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* Exit animation plays before dialog.close() via [data-closing].
|
|
4
|
+
* For non-side-effect class import (test isolation, tag override), use
|
|
5
|
+
* the `class` subpath:
|
|
7
6
|
*
|
|
8
|
-
*
|
|
9
|
-
* <drawer-ui side="right" size="md">
|
|
10
|
-
* <header>Title block</header>
|
|
11
|
-
* <section>Body content</section>
|
|
12
|
-
* <footer>Action buttons</footer>
|
|
13
|
-
* </drawer-ui>
|
|
7
|
+
* import { UIDrawer } from '@adia-ai/web-components/components/drawer/class';
|
|
14
8
|
*
|
|
15
|
-
*
|
|
16
|
-
* <drawer-ui>
|
|
17
|
-
* <header slot="header">…</header>
|
|
18
|
-
* <section slot="body">…</section>
|
|
19
|
-
* <footer slot="footer">…</footer>
|
|
20
|
-
* </drawer-ui>
|
|
21
|
-
*
|
|
22
|
-
* Title-only (stamps an empty header with a close button):
|
|
23
|
-
* <drawer-ui text="Settings" side="right"></drawer-ui>
|
|
24
|
-
*
|
|
25
|
-
* API:
|
|
26
|
-
* drawer.show() · drawer.hide() · drawer.open = true|false
|
|
27
|
-
*
|
|
28
|
-
* Events:
|
|
29
|
-
* close — fired after the drawer finishes closing
|
|
9
|
+
* @see ../../USAGE.md#registration--auto-vs-explicit
|
|
30
10
|
*/
|
|
31
11
|
|
|
32
|
-
import {
|
|
33
|
-
|
|
34
|
-
class UIDrawer extends UIElement {
|
|
35
|
-
#bound = false;
|
|
36
|
-
#closing = false;
|
|
37
|
-
#previousFocus = null;
|
|
38
|
-
#closeTimer = null;
|
|
39
|
-
#dialogRef = null;
|
|
40
|
-
|
|
41
|
-
static properties = {
|
|
42
|
-
text: { type: String, default: '', reflect: true },
|
|
43
|
-
side: { type: String, default: 'right', reflect: true },
|
|
44
|
-
size: { type: String, default: 'md', reflect: true },
|
|
45
|
-
permanent: { type: Boolean, default: false, reflect: true },
|
|
46
|
-
open: { type: Boolean, default: false, reflect: true },
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
static parts = {
|
|
50
|
-
dialog: '<dialog slot="dialog"></dialog>',
|
|
51
|
-
panel: '<div slot="panel"></div>',
|
|
52
|
-
header: '<header slot="header"></header>',
|
|
53
|
-
close: '<button-ui slot="close" icon="x" variant="ghost" size="sm" aria-label="Close"></button-ui>',
|
|
54
|
-
body: '<section slot="body"></section>',
|
|
55
|
-
footer: '<footer slot="footer"></footer>',
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
// No template — drawer composes from authored light-DOM children. An empty
|
|
59
|
-
// html`` result would trigger stamp() → replaceChildren(), wiping authored
|
|
60
|
-
// [slot=header|body|footer] before render() can migrate them into the panel.
|
|
61
|
-
|
|
62
|
-
constructor() {
|
|
63
|
-
super();
|
|
64
|
-
// Safari requires <dialog>.showModal() to be invoked synchronously inside
|
|
65
|
-
// the click handler. The reactive system schedules render() in a microtask
|
|
66
|
-
// after the property change, which Safari treats as outside the user-gesture
|
|
67
|
-
// window and silently no-ops the showModal. Wrap the auto-installed `open`
|
|
68
|
-
// setter so dialog state syncs in the same synchronous frame as the
|
|
69
|
-
// assignment. See docs/BROWSER-COMPAT.md §3a (Flavor C).
|
|
70
|
-
const desc = Object.getOwnPropertyDescriptor(this, 'open');
|
|
71
|
-
if (desc?.set) {
|
|
72
|
-
const origSet = desc.set;
|
|
73
|
-
Object.defineProperty(this, 'open', {
|
|
74
|
-
get: desc.get,
|
|
75
|
-
set: (v) => {
|
|
76
|
-
origSet.call(this, v);
|
|
77
|
-
this.#syncDialog();
|
|
78
|
-
},
|
|
79
|
-
configurable: true,
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
#onPress = (e) => {
|
|
85
|
-
if (e.target.closest('[slot="close"]')) this.open = false;
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
#onDialogCancel = (e) => {
|
|
89
|
-
e.preventDefault();
|
|
90
|
-
if (!this.permanent) this.open = false;
|
|
91
|
-
};
|
|
92
|
-
|
|
93
|
-
#onDialogClose = () => {
|
|
94
|
-
this.open = false;
|
|
95
|
-
this.#previousFocus?.focus();
|
|
96
|
-
this.#previousFocus = null;
|
|
97
|
-
this.dispatchEvent(new Event('close', { bubbles: true }));
|
|
98
|
-
};
|
|
99
|
-
|
|
100
|
-
#onDialogClick = (e) => {
|
|
101
|
-
if (e.target === this.#dialogRef && !this.permanent) this.open = false;
|
|
102
|
-
};
|
|
103
|
-
|
|
104
|
-
connected() {
|
|
105
|
-
this.addEventListener('press', this.#onPress);
|
|
106
|
-
|
|
107
|
-
// Bind dialog listeners as soon as the dialog part is available.
|
|
108
|
-
const dialog = this.ensure('dialog');
|
|
109
|
-
if (dialog && !this.#bound) {
|
|
110
|
-
this.#bound = true;
|
|
111
|
-
this.#dialogRef = dialog;
|
|
112
|
-
dialog.addEventListener('cancel', this.#onDialogCancel);
|
|
113
|
-
dialog.addEventListener('close', this.#onDialogClose);
|
|
114
|
-
dialog.addEventListener('click', this.#onDialogClick);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
disconnected() {
|
|
119
|
-
this.removeEventListener('press', this.#onPress);
|
|
120
|
-
if (this.#dialogRef) {
|
|
121
|
-
this.#dialogRef.removeEventListener('cancel', this.#onDialogCancel);
|
|
122
|
-
this.#dialogRef.removeEventListener('close', this.#onDialogClose);
|
|
123
|
-
this.#dialogRef.removeEventListener('click', this.#onDialogClick);
|
|
124
|
-
}
|
|
125
|
-
if (this.#closeTimer != null) {
|
|
126
|
-
clearTimeout(this.#closeTimer);
|
|
127
|
-
this.#closeTimer = null;
|
|
128
|
-
}
|
|
129
|
-
this.#bound = false;
|
|
130
|
-
this.#dialogRef = null;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
#getDuration() {
|
|
134
|
-
const raw = getComputedStyle(this).getPropertyValue('--drawer-duration').trim();
|
|
135
|
-
return parseFloat(raw) || 200;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
/**
|
|
139
|
-
* Adopt a slotted part into the panel. Accepts either an explicit
|
|
140
|
-
* [slot="X"] element OR a bare tag matching the card-ui convention
|
|
141
|
-
* (<header> → header, <section> → body, <footer> → footer). The tag is only
|
|
142
|
-
* adopted when no slot attribute is set, so authors can still opt into
|
|
143
|
-
* explicit slotting. The slot attribute is normalized onto the adopted
|
|
144
|
-
* element so downstream CSS selectors (`[slot="header"]`) match in both
|
|
145
|
-
* cases.
|
|
146
|
-
*/
|
|
147
|
-
#adoptSlot(slot, panel, mode = 'append') {
|
|
148
|
-
const fallbackTag = { header: 'header', body: 'section', footer: 'footer' }[slot];
|
|
149
|
-
const isMatch = (c) => c.getAttribute('slot') === slot
|
|
150
|
-
|| (fallbackTag && !c.getAttribute('slot') && c.localName === fallbackTag);
|
|
151
|
-
|
|
152
|
-
const inDirect = [...this.children].find(isMatch);
|
|
153
|
-
const inPanel = [...panel.children].find(c => c.getAttribute('slot') === slot);
|
|
154
|
-
|
|
155
|
-
if (inDirect && inPanel && inDirect !== inPanel) {
|
|
156
|
-
// User provided their own after we stamped a default — drop the stamp.
|
|
157
|
-
inPanel.remove();
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
const el = inDirect || inPanel || (() => {
|
|
161
|
-
const blueprint = this.constructor._pp?.[slot];
|
|
162
|
-
if (!blueprint) return null;
|
|
163
|
-
const clone = blueprint.cloneNode(true);
|
|
164
|
-
clone.setAttribute('data-stamped', '');
|
|
165
|
-
return clone;
|
|
166
|
-
})();
|
|
167
|
-
if (!el) return null;
|
|
168
|
-
|
|
169
|
-
if (el.getAttribute('slot') !== slot) el.setAttribute('slot', slot);
|
|
170
|
-
|
|
171
|
-
if (el.parentElement !== panel) {
|
|
172
|
-
if (mode === 'prepend') panel.prepend(el);
|
|
173
|
-
else panel.appendChild(el);
|
|
174
|
-
}
|
|
175
|
-
return el;
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
render() {
|
|
179
|
-
const dialog = this.ensure('dialog');
|
|
180
|
-
|
|
181
|
-
if (this.text) {
|
|
182
|
-
dialog.setAttribute('aria-label', this.text);
|
|
183
|
-
this.setAttribute('aria-label', this.text);
|
|
184
|
-
} else {
|
|
185
|
-
dialog.removeAttribute('aria-label');
|
|
186
|
-
this.removeAttribute('aria-label');
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
const panel = this.ensure('panel');
|
|
190
|
-
if (panel.parentElement !== dialog) dialog.appendChild(panel);
|
|
191
|
-
|
|
192
|
-
const header = this.#adoptSlot('header', panel, 'prepend');
|
|
193
|
-
|
|
194
|
-
// text="…" shorthand: stamp a [slot="heading"] into the header so the
|
|
195
|
-
// card-ui grid picks it up. Any author-supplied heading wins.
|
|
196
|
-
if (header) {
|
|
197
|
-
let stampedHeading = header.querySelector(':scope > [slot="heading"][data-stamped]');
|
|
198
|
-
const hasAuthorHeading = [...header.children].some(c =>
|
|
199
|
-
!c.hasAttribute('data-stamped') &&
|
|
200
|
-
(c.getAttribute('slot') === 'heading' || /^h[1-6]$/.test(c.localName))
|
|
201
|
-
);
|
|
202
|
-
if (this.text && !hasAuthorHeading) {
|
|
203
|
-
if (!stampedHeading) {
|
|
204
|
-
stampedHeading = document.createElement('span');
|
|
205
|
-
stampedHeading.setAttribute('slot', 'heading');
|
|
206
|
-
stampedHeading.setAttribute('data-stamped', '');
|
|
207
|
-
header.prepend(stampedHeading);
|
|
208
|
-
}
|
|
209
|
-
if (stampedHeading.textContent !== this.text) stampedHeading.textContent = this.text;
|
|
210
|
-
} else if (stampedHeading) {
|
|
211
|
-
stampedHeading.remove();
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
if (!this.permanent) {
|
|
216
|
-
const close = this.ensure('close');
|
|
217
|
-
if (header && close.parentElement !== header) header.appendChild(close);
|
|
218
|
-
} else {
|
|
219
|
-
this.drop('close');
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
// Body — multiple sections allowed (card-ui parity). Accepts either
|
|
223
|
-
// bare <section> tags or explicit [slot="body"]. If the author provides
|
|
224
|
-
// none, stamp an empty default so title-only drawers still lay out.
|
|
225
|
-
const authorSections = [...this.children].filter(c =>
|
|
226
|
-
c.getAttribute('slot') === 'body'
|
|
227
|
-
|| (c.localName === 'section' && !c.getAttribute('slot'))
|
|
228
|
-
);
|
|
229
|
-
if (authorSections.length === 0) {
|
|
230
|
-
this.#adoptSlot('body', panel, 'append');
|
|
231
|
-
} else {
|
|
232
|
-
for (const s of authorSections) {
|
|
233
|
-
if (s.getAttribute('slot') !== 'body') s.setAttribute('slot', 'body');
|
|
234
|
-
if (s.parentElement !== panel) panel.appendChild(s);
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
// Footer is opt-in — only mounted if the author supplied one (either
|
|
239
|
-
// [slot="footer"] or a bare <footer> tag, card-ui style).
|
|
240
|
-
const userFooter = [...this.children].find(c =>
|
|
241
|
-
c.getAttribute('slot') === 'footer' || (!c.getAttribute('slot') && c.localName === 'footer')
|
|
242
|
-
);
|
|
243
|
-
if (userFooter) {
|
|
244
|
-
if (userFooter.getAttribute('slot') !== 'footer') userFooter.setAttribute('slot', 'footer');
|
|
245
|
-
if (userFooter.parentElement !== panel) panel.appendChild(userFooter);
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
// Sync open state — also syncs synchronously from the `open` setter
|
|
249
|
-
// (see constructor) so showModal() runs in the click handler's gesture
|
|
250
|
-
// frame on Safari.
|
|
251
|
-
this.#syncDialog();
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
#syncDialog() {
|
|
255
|
-
const dialog = this.#dialogRef;
|
|
256
|
-
if (!dialog) return;
|
|
257
|
-
if (this.open && !dialog.open) {
|
|
258
|
-
this.#closing = false;
|
|
259
|
-
this.#previousFocus = document.activeElement;
|
|
260
|
-
dialog.showModal();
|
|
261
|
-
// Synchronous reflow instead of rAF — Safari throttles
|
|
262
|
-
// requestAnimationFrame when a top-layer dialog is open, sometimes
|
|
263
|
-
// delaying [data-open] (and the slide-in transition) by tens of
|
|
264
|
-
// seconds. Forcing a reflow keeps the animation start in the same
|
|
265
|
-
// synchronous frame. See docs/BROWSER-COMPAT.md §3a (Flavor C).
|
|
266
|
-
void dialog.offsetHeight;
|
|
267
|
-
dialog.setAttribute('data-open', '');
|
|
268
|
-
} else if (!this.open && dialog.open && !this.#closing) {
|
|
269
|
-
this.#animateClose(dialog);
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
#animateClose(dialog) {
|
|
274
|
-
this.#closing = true;
|
|
275
|
-
// Set [data-closing] FIRST (carries the transition spec), force a
|
|
276
|
-
// reflow, THEN remove [data-open]. If both attribute changes batch
|
|
277
|
-
// into a single style update, Safari can skip the slide-out animation
|
|
278
|
-
// entirely.
|
|
279
|
-
dialog.setAttribute('data-closing', '');
|
|
280
|
-
void dialog.offsetHeight;
|
|
281
|
-
dialog.removeAttribute('data-open');
|
|
282
|
-
|
|
283
|
-
this.#closeTimer = setTimeout(() => {
|
|
284
|
-
this.#closeTimer = null;
|
|
285
|
-
this.#closing = false;
|
|
286
|
-
dialog.removeAttribute('data-closing');
|
|
287
|
-
if (dialog.open) dialog.close();
|
|
288
|
-
}, this.#getDuration());
|
|
289
|
-
}
|
|
12
|
+
import { defineIfFree } from '../../core/register.js';
|
|
13
|
+
import { UIDrawer } from './class.js';
|
|
290
14
|
|
|
291
|
-
|
|
292
|
-
hide() { this.open = false; }
|
|
293
|
-
}
|
|
294
|
-
customElements.define('drawer-ui', UIDrawer);
|
|
15
|
+
defineIfFree('drawer-ui', UIDrawer);
|
|
295
16
|
|
|
296
17
|
export { UIDrawer };
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Non-side-effect class export for `<embed-ui>`.
|
|
3
|
+
*
|
|
4
|
+
* Importing this file gives you the class(es) without auto-registering the tag.
|
|
5
|
+
* Useful for test isolation, subclassing with tag-name override, or selective
|
|
6
|
+
* composition.
|
|
7
|
+
*
|
|
8
|
+
* The auto-register path stays at `@adia-ai/web-components/components/embed`
|
|
9
|
+
* (which imports this file + calls `defineIfFree()`).
|
|
10
|
+
*
|
|
11
|
+
* @see ../../USAGE.md#registration--auto-vs-explicit
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* <embed-ui src="https://example.com" height="400" aspect="16/9"></embed-ui>
|
|
16
|
+
*
|
|
17
|
+
* Responsive sandboxed iframe wrapper.
|
|
18
|
+
*
|
|
19
|
+
* Properties:
|
|
20
|
+
* src — iframe URL
|
|
21
|
+
* height — iframe height (default '400')
|
|
22
|
+
* width — iframe width (default '100%')
|
|
23
|
+
* aspect — optional CSS aspect-ratio (e.g. '16/9')
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
import { UIElement } from '../../core/element.js';
|
|
27
|
+
|
|
28
|
+
export class UIEmbed extends UIElement {
|
|
29
|
+
static properties = {
|
|
30
|
+
src: { type: String, default: '', reflect: true },
|
|
31
|
+
height: { type: String, default: '400', reflect: true },
|
|
32
|
+
width: { type: String, default: '100%', reflect: true },
|
|
33
|
+
aspect: { type: String, default: '', reflect: true },
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
static template = () => null;
|
|
37
|
+
|
|
38
|
+
#iframe = null;
|
|
39
|
+
|
|
40
|
+
connected() {
|
|
41
|
+
if (!this.#iframe) {
|
|
42
|
+
this.#iframe = document.createElement('iframe');
|
|
43
|
+
this.#iframe.setAttribute('sandbox', 'allow-scripts allow-same-origin');
|
|
44
|
+
this.#iframe.setAttribute('loading', 'lazy');
|
|
45
|
+
this.#iframe.setAttribute('allowfullscreen', '');
|
|
46
|
+
this.appendChild(this.#iframe);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
render() {
|
|
51
|
+
if (!this.#iframe) return;
|
|
52
|
+
|
|
53
|
+
if (this.src) this.#iframe.src = this.src;
|
|
54
|
+
|
|
55
|
+
if (this.aspect) {
|
|
56
|
+
this.style.aspectRatio = this.aspect;
|
|
57
|
+
this.#iframe.style.width = '100%';
|
|
58
|
+
this.#iframe.style.height = '100%';
|
|
59
|
+
this.style.width = this.width;
|
|
60
|
+
this.style.height = '';
|
|
61
|
+
} else {
|
|
62
|
+
this.style.aspectRatio = '';
|
|
63
|
+
this.#iframe.style.width = '100%';
|
|
64
|
+
this.#iframe.style.height = this.height.match(/^\d+$/) ? `${this.height}px` : this.height;
|
|
65
|
+
this.style.width = this.width;
|
|
66
|
+
this.style.height = '';
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
disconnected() {
|
|
71
|
+
this.#iframe = null;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<embed-ui>` — Responsive sandboxed iframe wrapper.
|
|
3
|
+
*
|
|
4
|
+
* @see https://ui-kit.exe.xyz/site/components/embed
|
|
5
|
+
*
|
|
6
|
+
* Type declarations generated by scripts/build/dts-codegen.mjs from
|
|
7
|
+
* the component's `.a2ui.json` sidecar. Edit the source `.yaml`,
|
|
8
|
+
* run `npm run build:components`, then `npm run codegen:dts` to
|
|
9
|
+
* regenerate; or hand-author this file fully if rich event types are
|
|
10
|
+
* needed beyond what the yaml `events:` block can express.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { UIElement } from '../../core/element.js';
|
|
14
|
+
|
|
15
|
+
export class UIEmbed extends UIElement {
|
|
16
|
+
/** CSS aspect-ratio (e.g. 16/9) */
|
|
17
|
+
aspect: string;
|
|
18
|
+
/** Iframe height. Plain numbers treated as pixels. */
|
|
19
|
+
height: string;
|
|
20
|
+
/** URL to load in the iframe */
|
|
21
|
+
src: string;
|
|
22
|
+
/** Iframe width. Any CSS width value. */
|
|
23
|
+
width: string;
|
|
24
|
+
}
|
|
@@ -1,63 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* `<embed-ui>` — auto-registers the tag on import.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* For non-side-effect class import (test isolation, tag override), use
|
|
5
|
+
* the `class` subpath:
|
|
5
6
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* width — iframe width (default '100%')
|
|
10
|
-
* aspect — optional CSS aspect-ratio (e.g. '16/9')
|
|
7
|
+
* import { UIEmbed } from '@adia-ai/web-components/components/embed/class';
|
|
8
|
+
*
|
|
9
|
+
* @see ../../USAGE.md#registration--auto-vs-explicit
|
|
11
10
|
*/
|
|
12
11
|
|
|
13
|
-
import {
|
|
14
|
-
|
|
15
|
-
class UIEmbed extends UIElement {
|
|
16
|
-
static properties = {
|
|
17
|
-
src: { type: String, default: '', reflect: true },
|
|
18
|
-
height: { type: String, default: '400', reflect: true },
|
|
19
|
-
width: { type: String, default: '100%', reflect: true },
|
|
20
|
-
aspect: { type: String, default: '', reflect: true },
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
static template = () => null;
|
|
24
|
-
|
|
25
|
-
#iframe = null;
|
|
26
|
-
|
|
27
|
-
connected() {
|
|
28
|
-
if (!this.#iframe) {
|
|
29
|
-
this.#iframe = document.createElement('iframe');
|
|
30
|
-
this.#iframe.setAttribute('sandbox', 'allow-scripts allow-same-origin');
|
|
31
|
-
this.#iframe.setAttribute('loading', 'lazy');
|
|
32
|
-
this.#iframe.setAttribute('allowfullscreen', '');
|
|
33
|
-
this.appendChild(this.#iframe);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
render() {
|
|
38
|
-
if (!this.#iframe) return;
|
|
39
|
-
|
|
40
|
-
if (this.src) this.#iframe.src = this.src;
|
|
41
|
-
|
|
42
|
-
if (this.aspect) {
|
|
43
|
-
this.style.aspectRatio = this.aspect;
|
|
44
|
-
this.#iframe.style.width = '100%';
|
|
45
|
-
this.#iframe.style.height = '100%';
|
|
46
|
-
this.style.width = this.width;
|
|
47
|
-
this.style.height = '';
|
|
48
|
-
} else {
|
|
49
|
-
this.style.aspectRatio = '';
|
|
50
|
-
this.#iframe.style.width = '100%';
|
|
51
|
-
this.#iframe.style.height = this.height.match(/^\d+$/) ? `${this.height}px` : this.height;
|
|
52
|
-
this.style.width = this.width;
|
|
53
|
-
this.style.height = '';
|
|
54
|
-
}
|
|
55
|
-
}
|
|
12
|
+
import { defineIfFree } from '../../core/register.js';
|
|
13
|
+
import { UIEmbed } from './class.js';
|
|
56
14
|
|
|
57
|
-
|
|
58
|
-
this.#iframe = null;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
customElements.define('embed-ui', UIEmbed);
|
|
15
|
+
defineIfFree('embed-ui', UIEmbed);
|
|
62
16
|
|
|
63
17
|
export { UIEmbed };
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Non-side-effect class export for `<empty-state-ui>`.
|
|
3
|
+
*
|
|
4
|
+
* Importing this file gives you the class(es) without auto-registering the tag.
|
|
5
|
+
* Useful for test isolation, subclassing with tag-name override, or selective
|
|
6
|
+
* composition.
|
|
7
|
+
*
|
|
8
|
+
* The auto-register path stays at `@adia-ai/web-components/components/empty-state`
|
|
9
|
+
* (which imports this file + calls `defineIfFree()`).
|
|
10
|
+
*
|
|
11
|
+
* @see ../../USAGE.md#registration--auto-vs-explicit
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* <empty-state-ui icon="magnifying-glass" heading="No results" description="Try adjusting your search.">
|
|
16
|
+
* <button-ui slot="action" text="Clear filters" variant="outline"></button-ui>
|
|
17
|
+
* </empty-state-ui>
|
|
18
|
+
*
|
|
19
|
+
* Placeholder for empty views — icon, heading, description, and action slot.
|
|
20
|
+
* The action slot is user-provided (not stamped by the component).
|
|
21
|
+
*
|
|
22
|
+
* Note: Uses 'heading' attribute instead of 'title' to avoid native tooltip.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
import { UIElement } from '../../core/element.js';
|
|
26
|
+
|
|
27
|
+
export class UIEmptyState extends UIElement {
|
|
28
|
+
static properties = {
|
|
29
|
+
icon: { type: String, default: '', reflect: true },
|
|
30
|
+
heading: { type: String, default: '', reflect: true },
|
|
31
|
+
description: { type: String, default: '', reflect: true },
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
static template = () => null;
|
|
35
|
+
|
|
36
|
+
#iconEl = null;
|
|
37
|
+
#headingEl = null;
|
|
38
|
+
#descEl = null;
|
|
39
|
+
|
|
40
|
+
// Mark slot elements we create so render() never overrides consumer-provided ones.
|
|
41
|
+
// See ADR-0010 (slot content is source of truth).
|
|
42
|
+
#stampMark(el) { el.dataset.emptyStateStamped = '1'; return el; }
|
|
43
|
+
#wasStamped(el) { return el?.dataset?.emptyStateStamped === '1'; }
|
|
44
|
+
|
|
45
|
+
connected() {
|
|
46
|
+
this.#iconEl = this.querySelector(':scope > [slot="icon"]');
|
|
47
|
+
if (!this.#iconEl) {
|
|
48
|
+
this.#iconEl = this.#stampMark(document.createElement('icon-ui'));
|
|
49
|
+
this.#iconEl.setAttribute('slot', 'icon');
|
|
50
|
+
this.#iconEl.setAttribute('size', 'lg');
|
|
51
|
+
this.insertBefore(this.#iconEl, this.firstChild);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
this.#headingEl = this.querySelector(':scope > [slot="heading"]');
|
|
55
|
+
if (!this.#headingEl) {
|
|
56
|
+
this.#headingEl = this.#stampMark(document.createElement('span'));
|
|
57
|
+
this.#headingEl.setAttribute('slot', 'heading');
|
|
58
|
+
this.insertBefore(this.#headingEl, this.querySelector('[slot="action"]'));
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
this.#descEl = this.querySelector(':scope > [slot="description"]');
|
|
62
|
+
if (!this.#descEl) {
|
|
63
|
+
this.#descEl = this.#stampMark(document.createElement('span'));
|
|
64
|
+
this.#descEl.setAttribute('slot', 'description');
|
|
65
|
+
this.insertBefore(this.#descEl, this.querySelector('[slot="action"]'));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
render() {
|
|
70
|
+
if (!this.#iconEl) return;
|
|
71
|
+
|
|
72
|
+
// Icon — only mutate stamped elements; visibility follows the source of truth.
|
|
73
|
+
if (this.#wasStamped(this.#iconEl)) {
|
|
74
|
+
if (this.icon) {
|
|
75
|
+
this.#iconEl.setAttribute('name', this.icon);
|
|
76
|
+
this.#iconEl.hidden = false;
|
|
77
|
+
} else {
|
|
78
|
+
this.#iconEl.hidden = true;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Heading — same policy.
|
|
83
|
+
if (this.#wasStamped(this.#headingEl)) {
|
|
84
|
+
if (this.heading) {
|
|
85
|
+
this.#headingEl.textContent = this.heading;
|
|
86
|
+
this.#headingEl.hidden = false;
|
|
87
|
+
} else {
|
|
88
|
+
this.#headingEl.hidden = true;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Description — same policy.
|
|
93
|
+
if (this.#wasStamped(this.#descEl)) {
|
|
94
|
+
if (this.description) {
|
|
95
|
+
this.#descEl.textContent = this.description;
|
|
96
|
+
this.#descEl.hidden = false;
|
|
97
|
+
} else {
|
|
98
|
+
this.#descEl.hidden = true;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
disconnected() {
|
|
104
|
+
this.#iconEl = null;
|
|
105
|
+
this.#headingEl = null;
|
|
106
|
+
this.#descEl = null;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<empty-state-ui>` — Placeholder for empty views with icon, heading, description, and action slot.
|
|
3
|
+
*
|
|
4
|
+
* @see https://ui-kit.exe.xyz/site/components/empty-state
|
|
5
|
+
*
|
|
6
|
+
* Type declarations generated by scripts/build/dts-codegen.mjs from
|
|
7
|
+
* the component's `.a2ui.json` sidecar. Edit the source `.yaml`,
|
|
8
|
+
* run `npm run build:components`, then `npm run codegen:dts` to
|
|
9
|
+
* regenerate; or hand-author this file fully if rich event types are
|
|
10
|
+
* needed beyond what the yaml `events:` block can express.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { UIElement } from '../../core/element.js';
|
|
14
|
+
|
|
15
|
+
export class UIEmptyState extends UIElement {
|
|
16
|
+
/** Secondary descriptive text below the heading */
|
|
17
|
+
description: string;
|
|
18
|
+
/** Primary heading text. Uses 'heading' instead of 'title' to avoid native tooltip. */
|
|
19
|
+
heading: string;
|
|
20
|
+
/** Icon name displayed above the heading */
|
|
21
|
+
icon: string;
|
|
22
|
+
}
|