@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,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Non-side-effect class export for `<action-list-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/action-list`
|
|
9
|
+
* (which imports this file + calls `defineIfFree()`).
|
|
10
|
+
*
|
|
11
|
+
* @see ../../USAGE.md#registration--auto-vs-explicit
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* <action-list-ui>
|
|
16
|
+
* <action-item-ui icon="plus" text="New Project" value="new"></action-item-ui>
|
|
17
|
+
* <action-item-ui icon="users" text="Invite Team" value="invite"></action-item-ui>
|
|
18
|
+
* <action-item-ui icon="download" text="Export Data" value="export"></action-item-ui>
|
|
19
|
+
* </action-list-ui>
|
|
20
|
+
*
|
|
21
|
+
* Inline (non-dropdown) list of command actions. Think of it as a menu that
|
|
22
|
+
* stays open — useful for quick-actions cards, settings rails, sidebar shortcuts.
|
|
23
|
+
*
|
|
24
|
+
* Differs from <menu-ui> (which renders in a popover) and <list-ui> (which is
|
|
25
|
+
* passive — no hover/click semantics).
|
|
26
|
+
*
|
|
27
|
+
* Fires `action` CustomEvent with { value, text, item } when an item is clicked
|
|
28
|
+
* or activated via keyboard (Enter / Space). Keyboard nav: ArrowUp/Down, Home/End.
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
import { UIElement } from '../../core/element.js';
|
|
32
|
+
|
|
33
|
+
export class UIActionList extends UIElement {
|
|
34
|
+
static properties = {};
|
|
35
|
+
static template = () => null;
|
|
36
|
+
|
|
37
|
+
#bound = false;
|
|
38
|
+
|
|
39
|
+
connected() {
|
|
40
|
+
this.setAttribute('role', 'list');
|
|
41
|
+
if (!this.#bound) {
|
|
42
|
+
this.#bound = true;
|
|
43
|
+
this.addEventListener('click', this.#onClick);
|
|
44
|
+
this.addEventListener('keydown', this.#onKey);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
disconnected() {
|
|
49
|
+
this.removeEventListener('click', this.#onClick);
|
|
50
|
+
this.removeEventListener('keydown', this.#onKey);
|
|
51
|
+
this.#bound = false;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
#items() {
|
|
55
|
+
return Array.from(this.querySelectorAll(':scope > action-item-ui:not([disabled])'));
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
#onClick = (e) => {
|
|
59
|
+
const item = e.target.closest('action-item-ui');
|
|
60
|
+
if (!item || item.hasAttribute('disabled')) return;
|
|
61
|
+
if (!this.contains(item)) return;
|
|
62
|
+
this.dispatchEvent(new CustomEvent('action', {
|
|
63
|
+
bubbles: true,
|
|
64
|
+
detail: { value: item.getAttribute('value') || '', text: item.getAttribute('text') || item.textContent.trim(), item },
|
|
65
|
+
}));
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
#onKey = (e) => {
|
|
69
|
+
const items = this.#items();
|
|
70
|
+
if (!items.length) return;
|
|
71
|
+
const active = document.activeElement?.closest?.('action-item-ui');
|
|
72
|
+
const i = active ? items.indexOf(active) : -1;
|
|
73
|
+
const focus = (idx) => {
|
|
74
|
+
const next = items[(idx + items.length) % items.length];
|
|
75
|
+
next?.focus?.({ preventScroll: true });
|
|
76
|
+
};
|
|
77
|
+
switch (e.key) {
|
|
78
|
+
case 'ArrowDown': e.preventDefault(); focus(i + 1); break;
|
|
79
|
+
case 'ArrowUp': e.preventDefault(); focus(i - 1); break;
|
|
80
|
+
case 'Home': e.preventDefault(); focus(0); break;
|
|
81
|
+
case 'End': e.preventDefault(); focus(items.length - 1); break;
|
|
82
|
+
case 'Enter':
|
|
83
|
+
case ' ': {
|
|
84
|
+
if (active) { e.preventDefault(); active.click(); }
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export class UIActionItem extends UIElement {
|
|
92
|
+
static properties = {
|
|
93
|
+
icon: { type: String, default: '', reflect: true },
|
|
94
|
+
text: { type: String, default: '', reflect: true },
|
|
95
|
+
value: { type: String, default: '', reflect: true },
|
|
96
|
+
variant: { type: String, default: 'default', reflect: true },
|
|
97
|
+
disabled: { type: Boolean, default: false, reflect: true },
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
static template = () => null;
|
|
101
|
+
|
|
102
|
+
connected() {
|
|
103
|
+
this.setAttribute('role', 'listitem');
|
|
104
|
+
if (!this.hasAttribute('tabindex')) this.setAttribute('tabindex', '0');
|
|
105
|
+
this.#stamp();
|
|
106
|
+
this.#syncAria();
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
#stamp() {
|
|
110
|
+
if (this.querySelector('[slot="text"]')) return;
|
|
111
|
+
|
|
112
|
+
if (this.icon) {
|
|
113
|
+
const iconEl = document.createElement('icon-ui');
|
|
114
|
+
iconEl.setAttribute('slot', 'icon');
|
|
115
|
+
iconEl.setAttribute('name', this.icon);
|
|
116
|
+
this.appendChild(iconEl);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (this.text) {
|
|
120
|
+
const span = document.createElement('span');
|
|
121
|
+
span.setAttribute('slot', 'text');
|
|
122
|
+
span.textContent = this.text;
|
|
123
|
+
this.appendChild(span);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
#syncAria() {
|
|
128
|
+
if (this.disabled) {
|
|
129
|
+
this.setAttribute('aria-disabled', 'true');
|
|
130
|
+
this.setAttribute('tabindex', '-1');
|
|
131
|
+
} else {
|
|
132
|
+
this.removeAttribute('aria-disabled');
|
|
133
|
+
this.setAttribute('tabindex', '0');
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
render() {
|
|
138
|
+
const iconEl = this.querySelector('[slot="icon"]');
|
|
139
|
+
if (this.icon) {
|
|
140
|
+
if (iconEl) iconEl.setAttribute('name', this.icon);
|
|
141
|
+
else {
|
|
142
|
+
const el = document.createElement('icon-ui');
|
|
143
|
+
el.setAttribute('slot', 'icon');
|
|
144
|
+
el.setAttribute('name', this.icon);
|
|
145
|
+
this.prepend(el);
|
|
146
|
+
}
|
|
147
|
+
} else if (iconEl) {
|
|
148
|
+
iconEl.remove();
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const textEl = this.querySelector('[slot="text"]');
|
|
152
|
+
if (textEl) textEl.textContent = this.text;
|
|
153
|
+
|
|
154
|
+
this.#syncAria();
|
|
155
|
+
}
|
|
156
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<agent-artifact-ui>` — Inline container for structured agent artifacts (A2UI, JSON, tickets).
|
|
3
|
+
*
|
|
4
|
+
* @see https://ui-kit.exe.xyz/site/components/agent-artifact
|
|
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 AgentArtifactArtifactToggleEvent = CustomEvent<unknown>;
|
|
16
|
+
|
|
17
|
+
export class UIAgentArtifact extends UIElement {
|
|
18
|
+
/** Header title. */
|
|
19
|
+
title: string;
|
|
20
|
+
/** Start collapsed. */
|
|
21
|
+
collapsed: boolean;
|
|
22
|
+
/** icon-ui name in header. */
|
|
23
|
+
icon: string;
|
|
24
|
+
/** Badge label; value is normalized to uppercase before rendering. */
|
|
25
|
+
kind: string;
|
|
26
|
+
/** neutral | accent | warning | danger */
|
|
27
|
+
tone: string;
|
|
28
|
+
|
|
29
|
+
addEventListener<K extends keyof HTMLElementEventMap>(
|
|
30
|
+
type: K,
|
|
31
|
+
listener: (this: UIAgentArtifact, ev: HTMLElementEventMap[K]) => unknown,
|
|
32
|
+
options?: boolean | AddEventListenerOptions,
|
|
33
|
+
): void;
|
|
34
|
+
addEventListener(type: 'artifact-toggle', listener: (ev: AgentArtifactArtifactToggleEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
35
|
+
}
|
|
@@ -1,190 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* `<agent-artifact-ui>` — auto-registers the tag on import.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* "primary" (e.g. "Open in canvas") and "secondary" (e.g. "Download"). The
|
|
7
|
-
* artifact body goes in the default slot.
|
|
4
|
+
* For non-side-effect class import (test isolation, tag override), use
|
|
5
|
+
* the `class` subpath:
|
|
8
6
|
*
|
|
9
|
-
*
|
|
7
|
+
* import { UIAgentArtifact } from '@adia-ai/web-components/components/agent-artifact/class';
|
|
10
8
|
*
|
|
11
|
-
*
|
|
12
|
-
* <agent-artifact-ui title="product-card" kind="A2UI" icon="layout">
|
|
13
|
-
* <button-ui slot="primary" text="Open in canvas" icon="arrows-out-simple"></button-ui>
|
|
14
|
-
* <button-ui slot="secondary" text="Copy" icon="copy"></button-ui>
|
|
15
|
-
* <code-ui language="json">{…}</code-ui>
|
|
16
|
-
* </agent-artifact-ui>
|
|
17
|
-
*
|
|
18
|
-
* Attributes:
|
|
19
|
-
* title — header title (string)
|
|
20
|
-
* kind — small badge, e.g. "A2UI", "JSON", "TICKET" (value is
|
|
21
|
-
* normalized to uppercase before rendering)
|
|
22
|
-
* icon — icon-ui name for the header
|
|
23
|
-
* collapsed — start collapsed (body hidden)
|
|
24
|
-
* tone — neutral (default) | accent | warning | danger
|
|
25
|
-
*
|
|
26
|
-
* Events:
|
|
27
|
-
* artifact-toggle — detail: { collapsed }
|
|
9
|
+
* @see ../../USAGE.md#registration--auto-vs-explicit
|
|
28
10
|
*/
|
|
29
11
|
|
|
30
|
-
import {
|
|
31
|
-
|
|
32
|
-
const TONE_TO_BADGE_VARIANT = {
|
|
33
|
-
neutral: 'default',
|
|
34
|
-
accent: 'accent',
|
|
35
|
-
warning: 'warning',
|
|
36
|
-
danger: 'danger',
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
class UIAgentArtifact extends UIElement {
|
|
40
|
-
static properties = {
|
|
41
|
-
title: { type: String, default: '', reflect: true },
|
|
42
|
-
kind: { type: String, default: '', reflect: true },
|
|
43
|
-
icon: { type: String, default: '', reflect: true },
|
|
44
|
-
collapsed: { type: Boolean, default: false, reflect: true },
|
|
45
|
-
tone: { type: String, default: 'neutral', reflect: true },
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
static template = () => null;
|
|
49
|
-
|
|
50
|
-
#headerEl = null;
|
|
51
|
-
#iconEl = null;
|
|
52
|
-
#titleEl = null;
|
|
53
|
-
#kindEl = null;
|
|
54
|
-
#chevronEl = null;
|
|
55
|
-
#bodyEl = null;
|
|
56
|
-
|
|
57
|
-
connected() {
|
|
58
|
-
this.#build();
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
disconnected() {
|
|
62
|
-
this.#headerEl?.removeEventListener('click', this.#onHeaderClick);
|
|
63
|
-
this.#headerEl?.removeEventListener('keydown', this.#onHeaderKey);
|
|
64
|
-
this.#headerEl = this.#iconEl = this.#titleEl = null;
|
|
65
|
-
this.#kindEl = this.#chevronEl = this.#bodyEl = null;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
#onHeaderClick = (e) => {
|
|
69
|
-
// Ignore clicks that land on header action buttons
|
|
70
|
-
if (e.target.closest('[slot="primary"], [slot="secondary"]')) return;
|
|
71
|
-
this.collapsed = !this.collapsed;
|
|
72
|
-
this.dispatchEvent(new CustomEvent('artifact-toggle', {
|
|
73
|
-
bubbles: true, detail: { collapsed: this.collapsed },
|
|
74
|
-
}));
|
|
75
|
-
this.render();
|
|
76
|
-
};
|
|
77
|
-
|
|
78
|
-
// Keyboard activation — Space/Enter toggle (matches role="button" semantics).
|
|
79
|
-
#onHeaderKey = (e) => {
|
|
80
|
-
if (e.key === ' ' || e.key === 'Enter') {
|
|
81
|
-
// Don't fire when the focus is on a slotted action button — let those
|
|
82
|
-
// handle their own activation.
|
|
83
|
-
if (e.target.closest('[slot="primary"], [slot="secondary"]')) return;
|
|
84
|
-
e.preventDefault();
|
|
85
|
-
this.#onHeaderClick(e);
|
|
86
|
-
}
|
|
87
|
-
};
|
|
88
|
-
|
|
89
|
-
render() {
|
|
90
|
-
if (!this.#headerEl) return;
|
|
91
|
-
|
|
92
|
-
if (this.#iconEl) {
|
|
93
|
-
if (this.icon) { this.#iconEl.setAttribute('name', this.icon); this.#iconEl.hidden = false; }
|
|
94
|
-
else { this.#iconEl.hidden = true; }
|
|
95
|
-
}
|
|
96
|
-
if (this.#titleEl) {
|
|
97
|
-
this.#titleEl.textContent = this.title || '';
|
|
98
|
-
this.#titleEl.hidden = !this.title;
|
|
99
|
-
}
|
|
100
|
-
if (this.#kindEl) {
|
|
101
|
-
this.#kindEl.setAttribute('text', (this.kind || '').toUpperCase());
|
|
102
|
-
this.#kindEl.setAttribute('variant', TONE_TO_BADGE_VARIANT[this.tone] || 'default');
|
|
103
|
-
this.#kindEl.hidden = !this.kind;
|
|
104
|
-
}
|
|
105
|
-
if (this.#chevronEl) {
|
|
106
|
-
this.#chevronEl.setAttribute('name', this.collapsed ? 'caret-right' : 'caret-down');
|
|
107
|
-
}
|
|
108
|
-
if (this.#bodyEl) {
|
|
109
|
-
this.#bodyEl.hidden = this.collapsed;
|
|
110
|
-
}
|
|
111
|
-
if (this.#headerEl) {
|
|
112
|
-
this.#headerEl.setAttribute('aria-expanded', String(!this.collapsed));
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
#build() {
|
|
117
|
-
// We operate in a slotted model: the author's children that match
|
|
118
|
-
// slot="primary"/slot="secondary" live in the header; the rest is body.
|
|
119
|
-
// We build scaffolding DOM around those children without reparenting.
|
|
120
|
-
//
|
|
121
|
-
// To keep the Light-DOM approach consistent, we wrap existing children
|
|
122
|
-
// into a body container if one isn't already present.
|
|
123
|
-
|
|
124
|
-
// Capture any existing non-slotted children to put into the body wrapper
|
|
125
|
-
const existingBodyNodes = Array.from(this.childNodes).filter((n) => {
|
|
126
|
-
if (n.nodeType === 1) {
|
|
127
|
-
const slot = /** @type {Element} */ (n).getAttribute?.('slot') || '';
|
|
128
|
-
return slot !== 'primary' && slot !== 'secondary';
|
|
129
|
-
}
|
|
130
|
-
return true;
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
// Clear — we'll rebuild, preserving slotted action buttons
|
|
134
|
-
const primaryBtns = this.querySelectorAll(':scope > [slot="primary"]');
|
|
135
|
-
const secondaryBtns = this.querySelectorAll(':scope > [slot="secondary"]');
|
|
136
|
-
|
|
137
|
-
this.innerHTML = '';
|
|
138
|
-
|
|
139
|
-
// Header — keyboard-focusable button-style row that toggles collapsed.
|
|
140
|
-
// role/tabindex make Space/Enter activate it the same as click.
|
|
141
|
-
this.#headerEl = document.createElement('div');
|
|
142
|
-
this.#headerEl.setAttribute('data-artifact-header', '');
|
|
143
|
-
this.#headerEl.setAttribute('role', 'button');
|
|
144
|
-
this.#headerEl.setAttribute('tabindex', '0');
|
|
145
|
-
this.#headerEl.setAttribute('aria-expanded', String(!this.collapsed));
|
|
146
|
-
this.#headerEl.addEventListener('click', this.#onHeaderClick);
|
|
147
|
-
this.#headerEl.addEventListener('keydown', this.#onHeaderKey);
|
|
148
|
-
|
|
149
|
-
this.#iconEl = document.createElement('icon-ui');
|
|
150
|
-
this.#iconEl.setAttribute('data-artifact-icon', '');
|
|
151
|
-
this.#iconEl.setAttribute('color', 'muted');
|
|
152
|
-
if (this.icon) this.#iconEl.setAttribute('name', this.icon);
|
|
153
|
-
else this.#iconEl.hidden = true;
|
|
154
|
-
|
|
155
|
-
this.#titleEl = document.createElement('span');
|
|
156
|
-
this.#titleEl.setAttribute('data-artifact-title', '');
|
|
157
|
-
if (this.title) this.#titleEl.textContent = this.title;
|
|
158
|
-
else this.#titleEl.hidden = true;
|
|
159
|
-
|
|
160
|
-
this.#kindEl = document.createElement('badge-ui');
|
|
161
|
-
this.#kindEl.setAttribute('data-artifact-kind', '');
|
|
162
|
-
this.#kindEl.setAttribute('size', 'sm');
|
|
163
|
-
this.#kindEl.setAttribute('variant', TONE_TO_BADGE_VARIANT[this.tone] || 'default');
|
|
164
|
-
if (this.kind) this.#kindEl.setAttribute('text', this.kind.toUpperCase());
|
|
165
|
-
else this.#kindEl.hidden = true;
|
|
166
|
-
|
|
167
|
-
const actions = document.createElement('span');
|
|
168
|
-
actions.setAttribute('data-artifact-actions', '');
|
|
169
|
-
for (const btn of secondaryBtns) actions.appendChild(btn);
|
|
170
|
-
for (const btn of primaryBtns) actions.appendChild(btn);
|
|
171
|
-
|
|
172
|
-
this.#chevronEl = document.createElement('icon-ui');
|
|
173
|
-
this.#chevronEl.setAttribute('color', 'muted');
|
|
174
|
-
this.#chevronEl.setAttribute('data-artifact-chevron', '');
|
|
175
|
-
this.#chevronEl.setAttribute('name', this.collapsed ? 'caret-right' : 'caret-down');
|
|
176
|
-
|
|
177
|
-
this.#headerEl.append(this.#iconEl, this.#titleEl, this.#kindEl, actions, this.#chevronEl);
|
|
178
|
-
|
|
179
|
-
// Body
|
|
180
|
-
this.#bodyEl = document.createElement('div');
|
|
181
|
-
this.#bodyEl.setAttribute('data-artifact-body', '');
|
|
182
|
-
for (const n of existingBodyNodes) this.#bodyEl.appendChild(n);
|
|
183
|
-
if (this.collapsed) this.#bodyEl.hidden = true;
|
|
12
|
+
import { defineIfFree } from '../../core/register.js';
|
|
13
|
+
import { UIAgentArtifact } from './class.js';
|
|
184
14
|
|
|
185
|
-
|
|
186
|
-
}
|
|
187
|
-
}
|
|
15
|
+
defineIfFree('agent-artifact-ui', UIAgentArtifact);
|
|
188
16
|
|
|
189
|
-
customElements.define('agent-artifact-ui', UIAgentArtifact);
|
|
190
17
|
export { UIAgentArtifact };
|
|
@@ -7,6 +7,11 @@ component: AgentArtifact
|
|
|
7
7
|
category: agent
|
|
8
8
|
version: 1
|
|
9
9
|
description: Inline container for structured agent artifacts (A2UI, JSON, tickets).
|
|
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
|
|
14
|
+
- badge-ui
|
|
10
15
|
props:
|
|
11
16
|
kind:
|
|
12
17
|
description: Badge label; value is normalized to uppercase before rendering.
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Non-side-effect class export for `<agent-artifact-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/agent-artifact`
|
|
9
|
+
* (which imports this file + calls `defineIfFree()`).
|
|
10
|
+
*
|
|
11
|
+
* @see ../../USAGE.md#registration--auto-vs-explicit
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* <agent-artifact-ui> — Inline container for a structured agent artifact.
|
|
16
|
+
*
|
|
17
|
+
* Wraps an artifact (A2UI UI, JSON blob, ticket, code, etc.) with a compact
|
|
18
|
+
* header showing a title + icon + optional kind badge, and two action slots:
|
|
19
|
+
* "primary" (e.g. "Open in canvas") and "secondary" (e.g. "Download"). The
|
|
20
|
+
* artifact body goes in the default slot.
|
|
21
|
+
*
|
|
22
|
+
* The host can attach any node (code-ui, canvas-ui, div, etc.) as the body.
|
|
23
|
+
*
|
|
24
|
+
* Usage:
|
|
25
|
+
* <agent-artifact-ui title="product-card" kind="A2UI" icon="layout">
|
|
26
|
+
* <button-ui slot="primary" text="Open in canvas" icon="arrows-out-simple"></button-ui>
|
|
27
|
+
* <button-ui slot="secondary" text="Copy" icon="copy"></button-ui>
|
|
28
|
+
* <code-ui language="json">{…}</code-ui>
|
|
29
|
+
* </agent-artifact-ui>
|
|
30
|
+
*
|
|
31
|
+
* Attributes:
|
|
32
|
+
* title — header title (string)
|
|
33
|
+
* kind — small badge, e.g. "A2UI", "JSON", "TICKET" (value is
|
|
34
|
+
* normalized to uppercase before rendering)
|
|
35
|
+
* icon — icon-ui name for the header
|
|
36
|
+
* collapsed — start collapsed (body hidden)
|
|
37
|
+
* tone — neutral (default) | accent | warning | danger
|
|
38
|
+
*
|
|
39
|
+
* Events:
|
|
40
|
+
* artifact-toggle — detail: { collapsed }
|
|
41
|
+
*/
|
|
42
|
+
|
|
43
|
+
import { UIElement } from '../../core/element.js';
|
|
44
|
+
|
|
45
|
+
const TONE_TO_BADGE_VARIANT = {
|
|
46
|
+
neutral: 'default',
|
|
47
|
+
accent: 'accent',
|
|
48
|
+
warning: 'warning',
|
|
49
|
+
danger: 'danger',
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
export class UIAgentArtifact extends UIElement {
|
|
53
|
+
static properties = {
|
|
54
|
+
title: { type: String, default: '', reflect: true },
|
|
55
|
+
kind: { type: String, default: '', reflect: true },
|
|
56
|
+
icon: { type: String, default: '', reflect: true },
|
|
57
|
+
collapsed: { type: Boolean, default: false, reflect: true },
|
|
58
|
+
tone: { type: String, default: 'neutral', reflect: true },
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
static template = () => null;
|
|
62
|
+
|
|
63
|
+
#headerEl = null;
|
|
64
|
+
#iconEl = null;
|
|
65
|
+
#titleEl = null;
|
|
66
|
+
#kindEl = null;
|
|
67
|
+
#chevronEl = null;
|
|
68
|
+
#bodyEl = null;
|
|
69
|
+
|
|
70
|
+
connected() {
|
|
71
|
+
this.#build();
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
disconnected() {
|
|
75
|
+
this.#headerEl?.removeEventListener('click', this.#onHeaderClick);
|
|
76
|
+
this.#headerEl?.removeEventListener('keydown', this.#onHeaderKey);
|
|
77
|
+
this.#headerEl = this.#iconEl = this.#titleEl = null;
|
|
78
|
+
this.#kindEl = this.#chevronEl = this.#bodyEl = null;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
#onHeaderClick = (e) => {
|
|
82
|
+
// Ignore clicks that land on header action buttons
|
|
83
|
+
if (e.target.closest('[slot="primary"], [slot="secondary"]')) return;
|
|
84
|
+
this.collapsed = !this.collapsed;
|
|
85
|
+
this.dispatchEvent(new CustomEvent('artifact-toggle', {
|
|
86
|
+
bubbles: true, detail: { collapsed: this.collapsed },
|
|
87
|
+
}));
|
|
88
|
+
this.render();
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
// Keyboard activation — Space/Enter toggle (matches role="button" semantics).
|
|
92
|
+
#onHeaderKey = (e) => {
|
|
93
|
+
if (e.key === ' ' || e.key === 'Enter') {
|
|
94
|
+
// Don't fire when the focus is on a slotted action button — let those
|
|
95
|
+
// handle their own activation.
|
|
96
|
+
if (e.target.closest('[slot="primary"], [slot="secondary"]')) return;
|
|
97
|
+
e.preventDefault();
|
|
98
|
+
this.#onHeaderClick(e);
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
render() {
|
|
103
|
+
if (!this.#headerEl) return;
|
|
104
|
+
|
|
105
|
+
if (this.#iconEl) {
|
|
106
|
+
if (this.icon) { this.#iconEl.setAttribute('name', this.icon); this.#iconEl.hidden = false; }
|
|
107
|
+
else { this.#iconEl.hidden = true; }
|
|
108
|
+
}
|
|
109
|
+
if (this.#titleEl) {
|
|
110
|
+
this.#titleEl.textContent = this.title || '';
|
|
111
|
+
this.#titleEl.hidden = !this.title;
|
|
112
|
+
}
|
|
113
|
+
if (this.#kindEl) {
|
|
114
|
+
this.#kindEl.setAttribute('text', (this.kind || '').toUpperCase());
|
|
115
|
+
this.#kindEl.setAttribute('variant', TONE_TO_BADGE_VARIANT[this.tone] || 'default');
|
|
116
|
+
this.#kindEl.hidden = !this.kind;
|
|
117
|
+
}
|
|
118
|
+
if (this.#chevronEl) {
|
|
119
|
+
this.#chevronEl.setAttribute('name', this.collapsed ? 'caret-right' : 'caret-down');
|
|
120
|
+
}
|
|
121
|
+
if (this.#bodyEl) {
|
|
122
|
+
this.#bodyEl.hidden = this.collapsed;
|
|
123
|
+
}
|
|
124
|
+
if (this.#headerEl) {
|
|
125
|
+
this.#headerEl.setAttribute('aria-expanded', String(!this.collapsed));
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
#build() {
|
|
130
|
+
// We operate in a slotted model: the author's children that match
|
|
131
|
+
// slot="primary"/slot="secondary" live in the header; the rest is body.
|
|
132
|
+
// We build scaffolding DOM around those children without reparenting.
|
|
133
|
+
//
|
|
134
|
+
// To keep the Light-DOM approach consistent, we wrap existing children
|
|
135
|
+
// into a body container if one isn't already present.
|
|
136
|
+
|
|
137
|
+
// Capture any existing non-slotted children to put into the body wrapper
|
|
138
|
+
const existingBodyNodes = Array.from(this.childNodes).filter((n) => {
|
|
139
|
+
if (n.nodeType === 1) {
|
|
140
|
+
const slot = /** @type {Element} */ (n).getAttribute?.('slot') || '';
|
|
141
|
+
return slot !== 'primary' && slot !== 'secondary';
|
|
142
|
+
}
|
|
143
|
+
return true;
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
// Clear — we'll rebuild, preserving slotted action buttons
|
|
147
|
+
const primaryBtns = this.querySelectorAll(':scope > [slot="primary"]');
|
|
148
|
+
const secondaryBtns = this.querySelectorAll(':scope > [slot="secondary"]');
|
|
149
|
+
|
|
150
|
+
this.innerHTML = '';
|
|
151
|
+
|
|
152
|
+
// Header — keyboard-focusable button-style row that toggles collapsed.
|
|
153
|
+
// role/tabindex make Space/Enter activate it the same as click.
|
|
154
|
+
this.#headerEl = document.createElement('div');
|
|
155
|
+
this.#headerEl.setAttribute('data-artifact-header', '');
|
|
156
|
+
this.#headerEl.setAttribute('role', 'button');
|
|
157
|
+
this.#headerEl.setAttribute('tabindex', '0');
|
|
158
|
+
this.#headerEl.setAttribute('aria-expanded', String(!this.collapsed));
|
|
159
|
+
this.#headerEl.addEventListener('click', this.#onHeaderClick);
|
|
160
|
+
this.#headerEl.addEventListener('keydown', this.#onHeaderKey);
|
|
161
|
+
|
|
162
|
+
this.#iconEl = document.createElement('icon-ui');
|
|
163
|
+
this.#iconEl.setAttribute('data-artifact-icon', '');
|
|
164
|
+
this.#iconEl.setAttribute('color', 'muted');
|
|
165
|
+
if (this.icon) this.#iconEl.setAttribute('name', this.icon);
|
|
166
|
+
else this.#iconEl.hidden = true;
|
|
167
|
+
|
|
168
|
+
this.#titleEl = document.createElement('span');
|
|
169
|
+
this.#titleEl.setAttribute('data-artifact-title', '');
|
|
170
|
+
if (this.title) this.#titleEl.textContent = this.title;
|
|
171
|
+
else this.#titleEl.hidden = true;
|
|
172
|
+
|
|
173
|
+
this.#kindEl = document.createElement('badge-ui');
|
|
174
|
+
this.#kindEl.setAttribute('data-artifact-kind', '');
|
|
175
|
+
this.#kindEl.setAttribute('size', 'sm');
|
|
176
|
+
this.#kindEl.setAttribute('variant', TONE_TO_BADGE_VARIANT[this.tone] || 'default');
|
|
177
|
+
if (this.kind) this.#kindEl.setAttribute('text', this.kind.toUpperCase());
|
|
178
|
+
else this.#kindEl.hidden = true;
|
|
179
|
+
|
|
180
|
+
const actions = document.createElement('span');
|
|
181
|
+
actions.setAttribute('data-artifact-actions', '');
|
|
182
|
+
for (const btn of secondaryBtns) actions.appendChild(btn);
|
|
183
|
+
for (const btn of primaryBtns) actions.appendChild(btn);
|
|
184
|
+
|
|
185
|
+
this.#chevronEl = document.createElement('icon-ui');
|
|
186
|
+
this.#chevronEl.setAttribute('color', 'muted');
|
|
187
|
+
this.#chevronEl.setAttribute('data-artifact-chevron', '');
|
|
188
|
+
this.#chevronEl.setAttribute('name', this.collapsed ? 'caret-right' : 'caret-down');
|
|
189
|
+
|
|
190
|
+
this.#headerEl.append(this.#iconEl, this.#titleEl, this.#kindEl, actions, this.#chevronEl);
|
|
191
|
+
|
|
192
|
+
// Body
|
|
193
|
+
this.#bodyEl = document.createElement('div');
|
|
194
|
+
this.#bodyEl.setAttribute('data-artifact-body', '');
|
|
195
|
+
for (const n of existingBodyNodes) this.#bodyEl.appendChild(n);
|
|
196
|
+
if (this.collapsed) this.#bodyEl.hidden = true;
|
|
197
|
+
|
|
198
|
+
this.append(this.#headerEl, this.#bodyEl);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<agent-feedback-bar-ui>` — Thumbs + save row under an agent response.
|
|
3
|
+
*
|
|
4
|
+
* @see https://ui-kit.exe.xyz/site/components/agent-feedback-bar
|
|
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 AgentFeedbackBarFeedbackRateEvent = CustomEvent<unknown>;
|
|
16
|
+
export type AgentFeedbackBarFeedbackSaveEvent = CustomEvent<unknown>;
|
|
17
|
+
|
|
18
|
+
export class UIAgentFeedbackBar extends UIElement {
|
|
19
|
+
/** Disable all actions. */
|
|
20
|
+
disabled: boolean;
|
|
21
|
+
/** Save button icon. */
|
|
22
|
+
saveIcon: string;
|
|
23
|
+
/** Save button text; empty hides it. */
|
|
24
|
+
saveLabel: string;
|
|
25
|
+
|
|
26
|
+
addEventListener<K extends keyof HTMLElementEventMap>(
|
|
27
|
+
type: K,
|
|
28
|
+
listener: (this: UIAgentFeedbackBar, ev: HTMLElementEventMap[K]) => unknown,
|
|
29
|
+
options?: boolean | AddEventListenerOptions,
|
|
30
|
+
): void;
|
|
31
|
+
addEventListener(type: 'feedback-rate', listener: (ev: AgentFeedbackBarFeedbackRateEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
32
|
+
addEventListener(type: 'feedback-save', listener: (ev: AgentFeedbackBarFeedbackSaveEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
33
|
+
}
|