@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
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Non-side-effect class export for `<timeline-ui>` (+ co-located primitives).
|
|
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/timeline`
|
|
9
|
+
* (which imports this file + calls `defineIfFree()`).
|
|
10
|
+
*
|
|
11
|
+
* @see ../../USAGE.md#registration--auto-vs-explicit
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* <timeline-ui> — Vertical (or horizontal) event / progress log.
|
|
16
|
+
*
|
|
17
|
+
* Each <timeline-item-ui> is one entry, with its own state via the `status`
|
|
18
|
+
* enum (idle | active | completed | error), optional icon, duration, and an
|
|
19
|
+
* expandable outcomes list. `[spinner]` is an orthogonal presentation hint
|
|
20
|
+
* that animates the dot as a ring when combined with `status="active"`.
|
|
21
|
+
*
|
|
22
|
+
* <timeline-ui>
|
|
23
|
+
* <timeline-item-ui text="Shipped" time="2h ago" status="completed"></timeline-item-ui>
|
|
24
|
+
* <timeline-item-ui text="Delivery" time="now" status="active" spinner></timeline-item-ui>
|
|
25
|
+
* <timeline-item-ui text="Received"></timeline-item-ui>
|
|
26
|
+
* </timeline-ui>
|
|
27
|
+
*
|
|
28
|
+
* For agent reasoning / pipeline views, set size="sm" and use
|
|
29
|
+
* duration, outcomes, spinner, status="error"
|
|
30
|
+
*
|
|
31
|
+
* <timeline-ui size="sm">
|
|
32
|
+
* <timeline-item-ui text="search" duration="850ms" status="completed"></timeline-item-ui>
|
|
33
|
+
* <timeline-item-ui text="generate" status="active" spinner></timeline-item-ui>
|
|
34
|
+
* </timeline-ui>
|
|
35
|
+
*
|
|
36
|
+
* For wizard / numbered-circle patterns, use the dedicated <stepper-ui>.
|
|
37
|
+
*
|
|
38
|
+
* Attributes (container):
|
|
39
|
+
* orientation — vertical (default) | horizontal
|
|
40
|
+
* size — md (default) | sm
|
|
41
|
+
*
|
|
42
|
+
* Attributes (item):
|
|
43
|
+
* text — primary label
|
|
44
|
+
* description — secondary text (optional)
|
|
45
|
+
* time — right-aligned timestamp (optional; mutually exclusive with duration)
|
|
46
|
+
* duration — right-aligned duration label (e.g. "850ms", "2s"); also set when live=true
|
|
47
|
+
* icon — icon-ui name (replaces the dot when set)
|
|
48
|
+
* variant — default | success | accent | warning | danger (colors the dot/icon)
|
|
49
|
+
* completed — boolean; renders "done" state
|
|
50
|
+
* active — boolean; renders "active" state
|
|
51
|
+
* error — boolean; renders "error" state (red dot)
|
|
52
|
+
* spinner — boolean; spinning dot while active
|
|
53
|
+
*
|
|
54
|
+
* JS (item):
|
|
55
|
+
* .outcomes = string[] // renders an expandable sub-list under the row
|
|
56
|
+
*/
|
|
57
|
+
|
|
58
|
+
import { UIElement } from '../../core/element.js';
|
|
59
|
+
|
|
60
|
+
// ── Container ──────────────────────────────────────────────────
|
|
61
|
+
|
|
62
|
+
export class UITimeline extends UIElement {
|
|
63
|
+
static properties = {
|
|
64
|
+
orientation: { type: String, default: 'vertical', reflect: true },
|
|
65
|
+
size: { type: String, default: 'md', reflect: true },
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
static template = () => null;
|
|
69
|
+
|
|
70
|
+
render() {
|
|
71
|
+
const items = [...this.querySelectorAll(':scope > timeline-item-ui')];
|
|
72
|
+
for (const item of items) item.removeAttribute('data-last');
|
|
73
|
+
const last = items[items.length - 1];
|
|
74
|
+
if (last) last.setAttribute('data-last', '');
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export class UITimelineItem extends UIElement {
|
|
79
|
+
static properties = {
|
|
80
|
+
text: { type: String, default: '', reflect: true },
|
|
81
|
+
description: { type: String, default: '', reflect: true },
|
|
82
|
+
time: { type: String, default: '', reflect: true },
|
|
83
|
+
duration: { type: String, default: '', reflect: true },
|
|
84
|
+
icon: { type: String, default: '', reflect: true },
|
|
85
|
+
variant: { type: String, default: 'default', reflect: true },
|
|
86
|
+
status: { type: String, default: 'idle', reflect: true },
|
|
87
|
+
spinner: { type: Boolean, default: false, reflect: true },
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
static template = () => null;
|
|
91
|
+
|
|
92
|
+
#outcomes = [];
|
|
93
|
+
#expanded = false;
|
|
94
|
+
|
|
95
|
+
get outcomes() { return this.#outcomes; }
|
|
96
|
+
set outcomes(v) {
|
|
97
|
+
this.#outcomes = Array.isArray(v) ? v.slice() : [];
|
|
98
|
+
this.render();
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
connected() {
|
|
102
|
+
if (!this.querySelector(':scope > [slot="label"]')) {
|
|
103
|
+
// Author provided just text/time — stamp the default slot structure
|
|
104
|
+
this.innerHTML = `
|
|
105
|
+
<span slot="label"></span>
|
|
106
|
+
<span slot="description"></span>
|
|
107
|
+
<span slot="time"></span>
|
|
108
|
+
`;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
render() {
|
|
113
|
+
const label = this.querySelector(':scope > [slot="label"]');
|
|
114
|
+
const desc = this.querySelector(':scope > [slot="description"]');
|
|
115
|
+
const time = this.querySelector(':scope > [slot="time"]');
|
|
116
|
+
if (label) label.textContent = this.text;
|
|
117
|
+
if (desc) desc.textContent = this.description;
|
|
118
|
+
if (time) time.textContent = this.duration || this.time;
|
|
119
|
+
|
|
120
|
+
if (this.icon) {
|
|
121
|
+
let iconEl = this.querySelector(':scope > [slot="icon"]');
|
|
122
|
+
if (!iconEl) {
|
|
123
|
+
iconEl = document.createElement('icon-ui');
|
|
124
|
+
iconEl.setAttribute('slot', 'icon');
|
|
125
|
+
this.prepend(iconEl);
|
|
126
|
+
}
|
|
127
|
+
iconEl.setAttribute('name', this.icon);
|
|
128
|
+
} else {
|
|
129
|
+
this.querySelector(':scope > [slot="icon"]')?.remove();
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Outcomes sub-list + toggle chevron
|
|
133
|
+
let body = this.querySelector(':scope > [slot="outcomes"]');
|
|
134
|
+
if (this.#outcomes.length > 0) {
|
|
135
|
+
if (!body) {
|
|
136
|
+
body = document.createElement('ul');
|
|
137
|
+
body.setAttribute('slot', 'outcomes');
|
|
138
|
+
this.appendChild(body);
|
|
139
|
+
}
|
|
140
|
+
body.innerHTML = '';
|
|
141
|
+
for (const o of this.#outcomes) {
|
|
142
|
+
const li = document.createElement('li');
|
|
143
|
+
li.textContent = o;
|
|
144
|
+
body.appendChild(li);
|
|
145
|
+
}
|
|
146
|
+
body.hidden = !this.#expanded;
|
|
147
|
+
|
|
148
|
+
// Toggle chevron lives on the row — we stamp a button once
|
|
149
|
+
let toggle = this.querySelector(':scope > [data-timeline-toggle]');
|
|
150
|
+
if (!toggle) {
|
|
151
|
+
toggle = document.createElement('button');
|
|
152
|
+
toggle.type = 'button';
|
|
153
|
+
toggle.setAttribute('data-timeline-toggle', '');
|
|
154
|
+
toggle.setAttribute('aria-label', 'Toggle details');
|
|
155
|
+
toggle.addEventListener('click', (e) => {
|
|
156
|
+
e.stopPropagation();
|
|
157
|
+
this.#expanded = !this.#expanded;
|
|
158
|
+
this.render();
|
|
159
|
+
this.dispatchEvent(new CustomEvent('timeline-toggle', {
|
|
160
|
+
bubbles: true, detail: { expanded: this.#expanded },
|
|
161
|
+
}));
|
|
162
|
+
});
|
|
163
|
+
this.appendChild(toggle);
|
|
164
|
+
}
|
|
165
|
+
toggle.innerHTML = '';
|
|
166
|
+
const caret = document.createElement('icon-ui');
|
|
167
|
+
caret.setAttribute('name', this.#expanded ? 'caret-down' : 'caret-right');
|
|
168
|
+
caret.setAttribute('color', 'muted');
|
|
169
|
+
caret.setAttribute('size', 'sm');
|
|
170
|
+
toggle.appendChild(caret);
|
|
171
|
+
} else {
|
|
172
|
+
this.querySelector(':scope > [data-timeline-toggle]')?.remove();
|
|
173
|
+
body?.remove();
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
@@ -42,7 +42,24 @@
|
|
|
42
42
|
"x-adiaui": {
|
|
43
43
|
"anti_patterns": [],
|
|
44
44
|
"category": "display",
|
|
45
|
-
"
|
|
45
|
+
"composes": [
|
|
46
|
+
"icon-ui"
|
|
47
|
+
],
|
|
48
|
+
"events": {
|
|
49
|
+
"timeline-toggle": {
|
|
50
|
+
"description": "Fired when a collapsible timeline item is expanded or collapsed. Detail carries the toggled item's id + new open state.",
|
|
51
|
+
"detail": {
|
|
52
|
+
"id": {
|
|
53
|
+
"description": "Item id (matches the timeline-item-ui's data-id attr).",
|
|
54
|
+
"type": "string"
|
|
55
|
+
},
|
|
56
|
+
"open": {
|
|
57
|
+
"description": "New open state after the toggle.",
|
|
58
|
+
"type": "boolean"
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
},
|
|
46
63
|
"examples": [
|
|
47
64
|
{
|
|
48
65
|
"description": "Order tracking card with a timeline showing order status milestones from placed to delivered.",
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<timeline-ui>` — Timeline and step wizard. Two modes: timeline (per-item state) and steps (parent-driven).
|
|
3
|
+
*
|
|
4
|
+
* @see https://ui-kit.exe.xyz/site/components/timeline
|
|
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 interface TimelineToggleEventDetail {
|
|
16
|
+
/** Item id (matches the timeline-item-ui's data-id attr). */
|
|
17
|
+
id: string;
|
|
18
|
+
/** New open state after the toggle. */
|
|
19
|
+
open: boolean;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export type TimelineToggleEvent = CustomEvent<TimelineToggleEventDetail>;
|
|
23
|
+
|
|
24
|
+
export class UITimeline extends UIElement {
|
|
25
|
+
/** Layout direction */
|
|
26
|
+
orientation: 'vertical' | 'horizontal';
|
|
27
|
+
/** Rail size preset — use `sm` for agent-reasoning/pipeline views; `md` is the default. */
|
|
28
|
+
size: 'sm' | 'md';
|
|
29
|
+
|
|
30
|
+
addEventListener<K extends keyof HTMLElementEventMap>(
|
|
31
|
+
type: K,
|
|
32
|
+
listener: (this: UITimeline, ev: HTMLElementEventMap[K]) => unknown,
|
|
33
|
+
options?: boolean | AddEventListenerOptions,
|
|
34
|
+
): void;
|
|
35
|
+
addEventListener(type: 'timeline-toggle', listener: (ev: TimelineToggleEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
36
|
+
}
|
|
@@ -1,171 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* `<timeline-ui>` — auto-registers the tag on import.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* expandable outcomes list. `[spinner]` is an orthogonal presentation hint
|
|
7
|
-
* that animates the dot as a ring when combined with `status="active"`.
|
|
4
|
+
* For non-side-effect class import (test isolation, tag override), use
|
|
5
|
+
* the `class` subpath:
|
|
8
6
|
*
|
|
9
|
-
*
|
|
10
|
-
* <timeline-item-ui text="Shipped" time="2h ago" status="completed"></timeline-item-ui>
|
|
11
|
-
* <timeline-item-ui text="Delivery" time="now" status="active" spinner></timeline-item-ui>
|
|
12
|
-
* <timeline-item-ui text="Received"></timeline-item-ui>
|
|
13
|
-
* </timeline-ui>
|
|
7
|
+
* import { UITimeline, UITimelineItem } from '@adia-ai/web-components/components/timeline/class';
|
|
14
8
|
*
|
|
15
|
-
*
|
|
16
|
-
* duration, outcomes, spinner, status="error"
|
|
17
|
-
*
|
|
18
|
-
* <timeline-ui size="sm">
|
|
19
|
-
* <timeline-item-ui text="search" duration="850ms" status="completed"></timeline-item-ui>
|
|
20
|
-
* <timeline-item-ui text="generate" status="active" spinner></timeline-item-ui>
|
|
21
|
-
* </timeline-ui>
|
|
22
|
-
*
|
|
23
|
-
* For wizard / numbered-circle patterns, use the dedicated <stepper-ui>.
|
|
24
|
-
*
|
|
25
|
-
* Attributes (container):
|
|
26
|
-
* orientation — vertical (default) | horizontal
|
|
27
|
-
* size — md (default) | sm
|
|
28
|
-
*
|
|
29
|
-
* Attributes (item):
|
|
30
|
-
* text — primary label
|
|
31
|
-
* description — secondary text (optional)
|
|
32
|
-
* time — right-aligned timestamp (optional; mutually exclusive with duration)
|
|
33
|
-
* duration — right-aligned duration label (e.g. "850ms", "2s"); also set when live=true
|
|
34
|
-
* icon — icon-ui name (replaces the dot when set)
|
|
35
|
-
* variant — default | success | accent | warning | danger (colors the dot/icon)
|
|
36
|
-
* completed — boolean; renders "done" state
|
|
37
|
-
* active — boolean; renders "active" state
|
|
38
|
-
* error — boolean; renders "error" state (red dot)
|
|
39
|
-
* spinner — boolean; spinning dot while active
|
|
40
|
-
*
|
|
41
|
-
* JS (item):
|
|
42
|
-
* .outcomes = string[] // renders an expandable sub-list under the row
|
|
9
|
+
* @see ../../USAGE.md#registration--auto-vs-explicit
|
|
43
10
|
*/
|
|
44
11
|
|
|
45
|
-
import {
|
|
46
|
-
|
|
47
|
-
// ── Container ──────────────────────────────────────────────────
|
|
48
|
-
|
|
49
|
-
class UITimeline extends UIElement {
|
|
50
|
-
static properties = {
|
|
51
|
-
orientation: { type: String, default: 'vertical', reflect: true },
|
|
52
|
-
size: { type: String, default: 'md', reflect: true },
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
static template = () => null;
|
|
56
|
-
|
|
57
|
-
render() {
|
|
58
|
-
const items = [...this.querySelectorAll(':scope > timeline-item-ui')];
|
|
59
|
-
for (const item of items) item.removeAttribute('data-last');
|
|
60
|
-
const last = items[items.length - 1];
|
|
61
|
-
if (last) last.setAttribute('data-last', '');
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
customElements.define('timeline-ui', UITimeline);
|
|
66
|
-
|
|
67
|
-
// ── Item ───────────────────────────────────────────────────────
|
|
68
|
-
|
|
69
|
-
class UITimelineItem extends UIElement {
|
|
70
|
-
static properties = {
|
|
71
|
-
text: { type: String, default: '', reflect: true },
|
|
72
|
-
description: { type: String, default: '', reflect: true },
|
|
73
|
-
time: { type: String, default: '', reflect: true },
|
|
74
|
-
duration: { type: String, default: '', reflect: true },
|
|
75
|
-
icon: { type: String, default: '', reflect: true },
|
|
76
|
-
variant: { type: String, default: 'default', reflect: true },
|
|
77
|
-
status: { type: String, default: 'idle', reflect: true },
|
|
78
|
-
spinner: { type: Boolean, default: false, reflect: true },
|
|
79
|
-
};
|
|
80
|
-
|
|
81
|
-
static template = () => null;
|
|
82
|
-
|
|
83
|
-
#outcomes = [];
|
|
84
|
-
#expanded = false;
|
|
85
|
-
|
|
86
|
-
get outcomes() { return this.#outcomes; }
|
|
87
|
-
set outcomes(v) {
|
|
88
|
-
this.#outcomes = Array.isArray(v) ? v.slice() : [];
|
|
89
|
-
this.render();
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
connected() {
|
|
93
|
-
if (!this.querySelector(':scope > [slot="label"]')) {
|
|
94
|
-
// Author provided just text/time — stamp the default slot structure
|
|
95
|
-
this.innerHTML = `
|
|
96
|
-
<span slot="label"></span>
|
|
97
|
-
<span slot="description"></span>
|
|
98
|
-
<span slot="time"></span>
|
|
99
|
-
`;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
render() {
|
|
104
|
-
const label = this.querySelector(':scope > [slot="label"]');
|
|
105
|
-
const desc = this.querySelector(':scope > [slot="description"]');
|
|
106
|
-
const time = this.querySelector(':scope > [slot="time"]');
|
|
107
|
-
if (label) label.textContent = this.text;
|
|
108
|
-
if (desc) desc.textContent = this.description;
|
|
109
|
-
if (time) time.textContent = this.duration || this.time;
|
|
110
|
-
|
|
111
|
-
if (this.icon) {
|
|
112
|
-
let iconEl = this.querySelector(':scope > [slot="icon"]');
|
|
113
|
-
if (!iconEl) {
|
|
114
|
-
iconEl = document.createElement('icon-ui');
|
|
115
|
-
iconEl.setAttribute('slot', 'icon');
|
|
116
|
-
this.prepend(iconEl);
|
|
117
|
-
}
|
|
118
|
-
iconEl.setAttribute('name', this.icon);
|
|
119
|
-
} else {
|
|
120
|
-
this.querySelector(':scope > [slot="icon"]')?.remove();
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
// Outcomes sub-list + toggle chevron
|
|
124
|
-
let body = this.querySelector(':scope > [slot="outcomes"]');
|
|
125
|
-
if (this.#outcomes.length > 0) {
|
|
126
|
-
if (!body) {
|
|
127
|
-
body = document.createElement('ul');
|
|
128
|
-
body.setAttribute('slot', 'outcomes');
|
|
129
|
-
this.appendChild(body);
|
|
130
|
-
}
|
|
131
|
-
body.innerHTML = '';
|
|
132
|
-
for (const o of this.#outcomes) {
|
|
133
|
-
const li = document.createElement('li');
|
|
134
|
-
li.textContent = o;
|
|
135
|
-
body.appendChild(li);
|
|
136
|
-
}
|
|
137
|
-
body.hidden = !this.#expanded;
|
|
138
|
-
|
|
139
|
-
// Toggle chevron lives on the row — we stamp a button once
|
|
140
|
-
let toggle = this.querySelector(':scope > [data-timeline-toggle]');
|
|
141
|
-
if (!toggle) {
|
|
142
|
-
toggle = document.createElement('button');
|
|
143
|
-
toggle.type = 'button';
|
|
144
|
-
toggle.setAttribute('data-timeline-toggle', '');
|
|
145
|
-
toggle.setAttribute('aria-label', 'Toggle details');
|
|
146
|
-
toggle.addEventListener('click', (e) => {
|
|
147
|
-
e.stopPropagation();
|
|
148
|
-
this.#expanded = !this.#expanded;
|
|
149
|
-
this.render();
|
|
150
|
-
this.dispatchEvent(new CustomEvent('timeline-toggle', {
|
|
151
|
-
bubbles: true, detail: { expanded: this.#expanded },
|
|
152
|
-
}));
|
|
153
|
-
});
|
|
154
|
-
this.appendChild(toggle);
|
|
155
|
-
}
|
|
156
|
-
toggle.innerHTML = '';
|
|
157
|
-
const caret = document.createElement('icon-ui');
|
|
158
|
-
caret.setAttribute('name', this.#expanded ? 'caret-down' : 'caret-right');
|
|
159
|
-
caret.setAttribute('color', 'muted');
|
|
160
|
-
caret.setAttribute('size', 'sm');
|
|
161
|
-
toggle.appendChild(caret);
|
|
162
|
-
} else {
|
|
163
|
-
this.querySelector(':scope > [data-timeline-toggle]')?.remove();
|
|
164
|
-
body?.remove();
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
}
|
|
12
|
+
import { defineIfFree } from '../../core/register.js';
|
|
13
|
+
import { UITimeline, UITimelineItem } from './class.js';
|
|
168
14
|
|
|
169
|
-
|
|
15
|
+
defineIfFree('timeline-ui', UITimeline);
|
|
16
|
+
defineIfFree('timeline-item-ui', UITimelineItem);
|
|
170
17
|
|
|
171
18
|
export { UITimeline, UITimelineItem };
|
|
@@ -7,6 +7,10 @@ component: Timeline
|
|
|
7
7
|
category: display
|
|
8
8
|
version: 1
|
|
9
9
|
description: "Timeline and step wizard. Two modes: timeline (per-item state) and steps (parent-driven)."
|
|
10
|
+
# Per ADR-0027 — primitives that programmatically create other primitives
|
|
11
|
+
# do NOT auto-import them. Consumer (or demo shell) must explicitly import.
|
|
12
|
+
composes:
|
|
13
|
+
- icon-ui
|
|
10
14
|
props:
|
|
11
15
|
orientation:
|
|
12
16
|
description: Layout direction
|
|
@@ -21,7 +25,16 @@ props:
|
|
|
21
25
|
default: md
|
|
22
26
|
reflect: true
|
|
23
27
|
enum: [sm, md]
|
|
24
|
-
events:
|
|
28
|
+
events:
|
|
29
|
+
timeline-toggle:
|
|
30
|
+
description: Fired when a collapsible timeline item is expanded or collapsed. Detail carries the toggled item's id + new open state.
|
|
31
|
+
detail:
|
|
32
|
+
id:
|
|
33
|
+
type: string
|
|
34
|
+
description: Item id (matches the timeline-item-ui's data-id attr).
|
|
35
|
+
open:
|
|
36
|
+
type: boolean
|
|
37
|
+
description: New open state after the toggle.
|
|
25
38
|
slots:
|
|
26
39
|
default:
|
|
27
40
|
description: Accepts <timeline-item-ui> children.
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Non-side-effect class export for `<toast-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/toast`
|
|
9
|
+
* (which imports this file + calls `defineIfFree()`).
|
|
10
|
+
*
|
|
11
|
+
* @see ../../USAGE.md#registration--auto-vs-explicit
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* <toast-ui> — Thin facade over `<feed-ui>` / `UIFeed.post()`.
|
|
16
|
+
*
|
|
17
|
+
* Phase 4 of `docs/specs/feed-channel.md` (SPEC-FEED-CHANNEL-001) —
|
|
18
|
+
* toast-ui no longer owns its own per-position container. Both
|
|
19
|
+
* declarative `<toast-ui>` and imperative `UIToast.show()` paths
|
|
20
|
+
* route through `UIFeed`. The element exists for back-compat:
|
|
21
|
+
* authoring `<toast-ui text="…">` still produces a feed item.
|
|
22
|
+
*
|
|
23
|
+
* // Imperative API (delegates to UIFeed.post)
|
|
24
|
+
* UIToast.show({ text: 'Saved!', variant: 'success' });
|
|
25
|
+
*
|
|
26
|
+
* // Global event channel — same shape, same delegation.
|
|
27
|
+
* window.dispatchEvent(new CustomEvent('toast', {
|
|
28
|
+
* detail: { text: 'Saved!', variant: 'success' }
|
|
29
|
+
* }));
|
|
30
|
+
*
|
|
31
|
+
* // Declarative — auto-posts and removes self on connect.
|
|
32
|
+
* <toast-ui text="Saved!" variant="success"></toast-ui>
|
|
33
|
+
*
|
|
34
|
+
* The legacy `[data-toast-container]` per-position-Map plumbing was
|
|
35
|
+
* retired in this migration; the lane infrastructure now lives in
|
|
36
|
+
* `<feed-ui>` (see ../feed/feed.js).
|
|
37
|
+
*/
|
|
38
|
+
|
|
39
|
+
import { UIElement, html } from '../../core/element.js';
|
|
40
|
+
import { UIFeed } from '../feed/feed.js';
|
|
41
|
+
|
|
42
|
+
export class UIToast extends UIElement {
|
|
43
|
+
static properties = {
|
|
44
|
+
text: { type: String, default: '', reflect: true },
|
|
45
|
+
variant: { type: String, default: 'info', reflect: true },
|
|
46
|
+
duration: { type: Number, default: 4000, reflect: true },
|
|
47
|
+
position: { type: String, default: 'bottom-right', reflect: true },
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
static template = () => html``;
|
|
51
|
+
|
|
52
|
+
connected() {
|
|
53
|
+
/* Declarative path: post into UIFeed and remove self. The
|
|
54
|
+
element is fire-and-forget — its only job is to forward the
|
|
55
|
+
authored attributes to the feed, then dissolve. Re-entrant
|
|
56
|
+
guard keeps this safe under HMR / dev-mode re-attachment. */
|
|
57
|
+
if (this.__routedToFeed) return;
|
|
58
|
+
this.__routedToFeed = true;
|
|
59
|
+
UIFeed.post({
|
|
60
|
+
text: this.text,
|
|
61
|
+
variant: this.variant === 'error' ? 'danger' : this.variant,
|
|
62
|
+
duration: this.duration,
|
|
63
|
+
position: this.position,
|
|
64
|
+
});
|
|
65
|
+
/* Schedule removal so the calling code can read the attributes
|
|
66
|
+
if it inspected this element on the same microtask. */
|
|
67
|
+
queueMicrotask(() => { try { this.remove(); } catch { /* noop */ } });
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Static facade — delegates to UIFeed.post(). Kept for back-compat
|
|
72
|
+
* with consumer code shaped like `customElements.get('toast-ui').show(...)`
|
|
73
|
+
* or `UIToast.show(...)`. New code should call UIFeed.post()
|
|
74
|
+
* directly.
|
|
75
|
+
*
|
|
76
|
+
* @param {Object} opts
|
|
77
|
+
* @param {string} opts.text
|
|
78
|
+
* @param {string} [opts.variant='info'] — `error` aliases to `danger`.
|
|
79
|
+
* @param {number} [opts.duration=4000]
|
|
80
|
+
* @param {string} [opts.position='bottom-right']
|
|
81
|
+
* @returns {{id:string|null, dismiss:function, update:function}} FeedHandle.
|
|
82
|
+
*/
|
|
83
|
+
static show(opts = {}) {
|
|
84
|
+
const { text, variant = 'info', duration = 4000, position = 'bottom-right' } = opts;
|
|
85
|
+
return UIFeed.post({
|
|
86
|
+
text,
|
|
87
|
+
variant: variant === 'error' ? 'danger' : variant,
|
|
88
|
+
duration,
|
|
89
|
+
position,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<toast-ui>` — Notification popup with auto-dismiss. Animated enter/exit.
|
|
3
|
+
*
|
|
4
|
+
* @see https://ui-kit.exe.xyz/site/components/toast
|
|
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 type ToastCloseEvent = CustomEvent<unknown>;
|
|
16
|
+
|
|
17
|
+
export class UIToast extends UIElement {
|
|
18
|
+
/** Auto-dismiss time in milliseconds. 0 disables auto-dismiss. */
|
|
19
|
+
duration: number;
|
|
20
|
+
/** Screen position */
|
|
21
|
+
position: 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right';
|
|
22
|
+
/** Toast message text */
|
|
23
|
+
text: string;
|
|
24
|
+
/** Semantic variant — `default | info | success | warning | danger`. `primary` and `muted` are style hints; canonical "neutral but interesting" tone is `info`. */
|
|
25
|
+
variant: 'default' | 'info' | 'success' | 'warning' | 'danger' | 'primary' | 'muted' | 'neutral';
|
|
26
|
+
|
|
27
|
+
addEventListener<K extends keyof HTMLElementEventMap>(
|
|
28
|
+
type: K,
|
|
29
|
+
listener: (this: UIToast, ev: HTMLElementEventMap[K]) => unknown,
|
|
30
|
+
options?: boolean | AddEventListenerOptions,
|
|
31
|
+
): void;
|
|
32
|
+
addEventListener(type: 'close', listener: (ev: ToastCloseEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
33
|
+
}
|