@adia-ai/web-components 0.4.6 → 0.4.7
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/USAGE.md +29 -9
- package/components/accordion/accordion.d.ts +17 -0
- package/components/accordion/accordion.js +10 -117
- package/components/accordion/class.js +132 -0
- package/components/action-list/action-list.d.ts +15 -0
- package/components/action-list/action-list.js +9 -140
- package/components/action-list/class.js +156 -0
- package/components/agent-artifact/agent-artifact.d.ts +25 -0
- package/components/agent-artifact/agent-artifact.js +8 -181
- package/components/agent-artifact/class.js +200 -0
- package/components/agent-feedback-bar/agent-feedback-bar.d.ts +21 -0
- package/components/agent-feedback-bar/agent-feedback-bar.js +8 -143
- package/components/agent-feedback-bar/class.js +162 -0
- package/components/agent-questions/agent-questions.d.ts +23 -0
- package/components/agent-questions/agent-questions.js +8 -180
- package/components/agent-questions/class.js +199 -0
- package/components/agent-reasoning/agent-reasoning.d.ts +23 -0
- package/components/agent-reasoning/agent-reasoning.js +8 -494
- package/components/agent-reasoning/class.js +513 -0
- package/components/agent-suggestions/agent-suggestions.d.ts +21 -0
- package/components/agent-suggestions/agent-suggestions.js +8 -78
- package/components/agent-suggestions/class.js +97 -0
- package/components/agent-trace/agent-trace.d.ts +19 -0
- package/components/alert/alert.d.ts +29 -0
- package/components/alert/alert.js +8 -175
- package/components/alert/class.js +194 -0
- package/components/avatar/avatar.d.ts +27 -0
- package/components/avatar/avatar.js +9 -159
- package/components/avatar/class.js +173 -0
- package/components/badge/badge.d.ts +27 -0
- package/components/badge/badge.js +9 -75
- package/components/badge/class.js +93 -0
- package/components/block/block.d.ts +19 -0
- package/components/block/block.js +9 -15
- package/components/block/class.js +33 -0
- package/components/breadcrumb/breadcrumb.d.ts +23 -0
- package/components/breadcrumb/breadcrumb.js +8 -113
- package/components/breadcrumb/class.js +132 -0
- package/components/button/button.d.ts +34 -0
- package/components/button/button.js +15 -66
- package/components/button/class.js +80 -0
- package/components/calendar-picker/calendar-picker.a2ui.json +6 -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 +6 -1
- package/components/canvas/canvas.d.ts +17 -0
- package/components/canvas/canvas.yaml +19 -36
- package/components/card/card.a2ui.json +3 -0
- package/components/card/card.d.ts +27 -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.d.ts +41 -0
- package/components/chart/chart.js +8 -2131
- package/components/chart/class.js +2150 -0
- package/components/chart-legend/chart-legend.d.ts +27 -0
- package/components/chart-legend/chart-legend.js +8 -197
- package/components/chart-legend/class.js +215 -0
- package/components/chat-thread/chat-thread.d.ts +17 -0
- package/components/chat-thread/chat-thread.js +8 -157
- package/components/chat-thread/class.js +176 -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.js +8 -482
- package/components/col/class.js +30 -0
- package/components/col/col.d.ts +23 -0
- package/components/col/col.js +10 -13
- package/components/color-picker/class.js +550 -0
- package/components/color-picker/color-picker.js +8 -531
- package/components/command/class.js +364 -0
- package/components/command/command.a2ui.json +3 -0
- package/components/command/command.d.ts +19 -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.d.ts +23 -0
- package/components/demo-toggle/demo-toggle.js +8 -135
- package/components/description-list/class.js +86 -0
- package/components/description-list/description-list.d.ts +21 -0
- package/components/description-list/description-list.js +8 -67
- package/components/divider/class.js +57 -0
- package/components/divider/divider.d.ts +19 -0
- package/components/divider/divider.js +10 -40
- package/components/drawer/class.js +306 -0
- package/components/drawer/drawer.d.ts +25 -0
- package/components/drawer/drawer.js +8 -287
- package/components/embed/class.js +73 -0
- package/components/embed/embed.d.ts +23 -0
- package/components/embed/embed.js +9 -55
- package/components/empty-state/class.js +108 -0
- package/components/empty-state/empty-state.d.ts +21 -0
- package/components/empty-state/empty-state.js +9 -90
- package/components/feed/class.js +381 -0
- package/components/feed/feed.d.ts +19 -0
- package/components/feed/feed.js +9 -367
- package/components/field/class.js +266 -0
- package/components/field/field.d.ts +23 -0
- package/components/field/field.js +8 -247
- package/components/fields/class.js +106 -0
- package/components/fields/fields.d.ts +19 -0
- package/components/fields/fields.js +8 -87
- package/components/grid/class.js +31 -0
- package/components/grid/grid.d.ts +23 -0
- package/components/grid/grid.js +10 -14
- package/components/heatmap/class.js +305 -0
- package/components/heatmap/heatmap.d.ts +31 -0
- package/components/heatmap/heatmap.js +8 -286
- package/components/icon/class.js +54 -0
- package/components/icon/icon.d.ts +23 -0
- package/components/icon/icon.js +13 -40
- package/components/image/class.js +112 -0
- package/components/image/image.d.ts +33 -0
- package/components/image/image.js +9 -94
- package/components/input/class.js +773 -0
- package/components/input/input.a2ui.json +3 -0
- package/components/input/input.js +8 -755
- package/components/input/input.yaml +171 -442
- package/components/inspector/class.js +142 -0
- package/components/inspector/inspector.a2ui.json +8 -1
- package/components/inspector/inspector.d.ts +17 -0
- package/components/inspector/inspector.js +8 -124
- package/components/inspector/inspector.yaml +15 -30
- package/components/kbd/class.js +34 -0
- package/components/kbd/kbd.a2ui.json +3 -0
- package/components/kbd/kbd.d.ts +17 -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.d.ts +55 -0
- package/components/link/link.js +8 -168
- package/components/list/class.js +249 -0
- package/components/list/list.d.ts +23 -0
- package/components/list/list.js +9 -231
- package/components/menu/class.js +332 -0
- package/components/menu/menu.d.ts +21 -0
- package/components/menu/menu.js +11 -316
- package/components/modal/class.js +231 -0
- package/components/modal/modal.a2ui.json +5 -1
- package/components/modal/modal.d.ts +23 -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.d.ts +31 -0
- package/components/nav/nav.js +8 -131
- package/components/nav-group/class.js +152 -0
- package/components/nav-group/nav-group.d.ts +35 -0
- package/components/nav-group/nav-group.js +9 -134
- package/components/nav-item/class.js +86 -0
- package/components/nav-item/nav-item.d.ts +37 -0
- package/components/nav-item/nav-item.js +10 -69
- package/components/noodles/class.js +510 -0
- package/components/noodles/noodles.d.ts +33 -0
- package/components/noodles/noodles.js +9 -493
- package/components/option-card/class.js +167 -0
- package/components/option-card/option-card.js +8 -149
- package/components/otp-input/class.js +180 -0
- package/components/otp-input/otp-input.a2ui.json +5 -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.d.ts +46 -0
- package/components/page/page.js +8 -79
- package/components/pagination/class.js +195 -0
- package/components/pagination/pagination.d.ts +23 -0
- package/components/pagination/pagination.js +9 -177
- package/components/pane/class.js +186 -0
- package/components/pane/pane.a2ui.json +12 -1
- package/components/pane/pane.d.ts +31 -0
- package/components/pane/pane.js +8 -167
- package/components/pane/pane.yaml +57 -157
- package/components/pipeline-status/class.js +189 -0
- package/components/pipeline-status/pipeline-status.a2ui.json +7 -1
- package/components/pipeline-status/pipeline-status.d.ts +21 -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.d.ts +23 -0
- package/components/popover/popover.js +9 -176
- package/components/progress/class.js +74 -0
- package/components/progress/progress.a2ui.json +3 -0
- package/components/progress/progress.d.ts +19 -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.d.ts +23 -0
- package/components/progress-row/progress-row.js +8 -92
- package/components/radio/class.js +83 -0
- package/components/radio/radio.js +11 -67
- package/components/range/class.js +194 -0
- package/components/range/range.js +9 -176
- package/components/rating/class.js +148 -0
- package/components/rating/rating.js +9 -130
- package/components/richtext/class.js +87 -0
- package/components/richtext/richtext.a2ui.json +7 -1
- package/components/richtext/richtext.d.ts +19 -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.d.ts +27 -0
- package/components/row/row.js +10 -33
- package/components/search/class.js +134 -0
- package/components/search/search.js +10 -117
- package/components/segment/class.js +62 -0
- package/components/segment/segment.d.ts +25 -0
- package/components/segment/segment.js +10 -45
- package/components/segmented/class.js +165 -0
- package/components/segmented/segmented.a2ui.json +4 -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.js +15 -396
- package/components/skeleton/class.js +52 -0
- package/components/skeleton/skeleton.d.ts +23 -0
- package/components/skeleton/skeleton.js +8 -34
- package/components/slider/class.js +184 -0
- package/components/slider/slider.js +9 -166
- package/components/stack/class.js +28 -0
- package/components/stack/stack.d.ts +17 -0
- package/components/stack/stack.js +10 -11
- package/components/step-progress/class.js +98 -0
- package/components/step-progress/step-progress.d.ts +27 -0
- package/components/step-progress/step-progress.js +8 -79
- package/components/stepper/class.js +126 -0
- package/components/stepper/stepper.d.ts +19 -0
- package/components/stepper/stepper.js +9 -112
- package/components/stream/class.js +109 -0
- package/components/stream/stream.d.ts +19 -0
- package/components/stream/stream.js +8 -90
- package/components/swatch/class.js +131 -0
- package/components/swatch/swatch.d.ts +28 -0
- package/components/swatch/swatch.js +8 -112
- package/components/swiper/class.js +373 -0
- package/components/swiper/swiper.a2ui.json +4 -0
- package/components/swiper/swiper.d.ts +31 -0
- package/components/swiper/swiper.js +8 -354
- package/components/swiper/swiper.yaml +68 -212
- package/components/switch/class.js +63 -0
- package/components/switch/switch.a2ui.json +6 -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.d.ts +37 -0
- package/components/table/table.js +8 -1435
- package/components/table-toolbar/class.js +680 -0
- package/components/table-toolbar/table-toolbar.d.ts +33 -0
- package/components/table-toolbar/table-toolbar.js +8 -689
- package/components/tabs/class.js +242 -0
- package/components/tabs/tabs.d.ts +21 -0
- package/components/tabs/tabs.js +8 -223
- package/components/tag/class.js +99 -0
- package/components/tag/tag.d.ts +27 -0
- package/components/tag/tag.js +8 -80
- package/components/text/class.js +46 -0
- package/components/text/text.d.ts +25 -0
- package/components/text/text.js +9 -28
- package/components/textarea/class.js +134 -0
- package/components/textarea/textarea.js +11 -118
- package/components/timeline/class.js +176 -0
- package/components/timeline/timeline.d.ts +19 -0
- package/components/timeline/timeline.js +9 -162
- package/components/toast/class.js +92 -0
- package/components/toast/toast.d.ts +23 -0
- package/components/toast/toast.js +9 -76
- package/components/toggle-group/class.js +154 -0
- package/components/toggle-group/toggle-group.d.ts +19 -0
- package/components/toggle-group/toggle-group.js +11 -140
- package/components/toggle-scheme/class.js +286 -0
- package/components/toggle-scheme/toggle-scheme.d.ts +41 -0
- package/components/toggle-scheme/toggle-scheme.js +8 -268
- package/components/toolbar/class.js +388 -0
- package/components/toolbar/toolbar.d.ts +23 -0
- package/components/toolbar/toolbar.js +10 -376
- package/components/tooltip/class.js +299 -0
- package/components/tooltip/tooltip.d.ts +27 -0
- package/components/tooltip/tooltip.js +8 -280
- package/components/tree/class.js +245 -0
- package/components/tree/tree.d.ts +15 -0
- package/components/tree/tree.js +9 -244
- package/components/upload/class.js +199 -0
- package/components/upload/upload.js +11 -183
- package/index.d.ts +159 -5
- package/package.json +5 -1
|
@@ -0,0 +1,25 @@
|
|
|
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 components`, then `npm run codegen:dts` to regenerate;
|
|
9
|
+
* or hand-author this file fully if rich event types are needed.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { UIElement } from '../../core/element.js';
|
|
13
|
+
|
|
14
|
+
export class UIAgentArtifact extends UIElement {
|
|
15
|
+
/** Header title. */
|
|
16
|
+
title: string;
|
|
17
|
+
/** Start collapsed. */
|
|
18
|
+
collapsed: boolean;
|
|
19
|
+
/** icon-ui name in header. */
|
|
20
|
+
icon: string;
|
|
21
|
+
/** Badge label; value is normalized to uppercase before rendering. */
|
|
22
|
+
kind: string;
|
|
23
|
+
/** neutral | accent | warning | danger */
|
|
24
|
+
tone: string;
|
|
25
|
+
}
|
|
@@ -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 };
|
|
@@ -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,21 @@
|
|
|
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 components`, then `npm run codegen:dts` to regenerate;
|
|
9
|
+
* or hand-author this file fully if rich event types are needed.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { UIElement } from '../../core/element.js';
|
|
13
|
+
|
|
14
|
+
export class UIAgentFeedbackBar extends UIElement {
|
|
15
|
+
/** Disable all actions. */
|
|
16
|
+
disabled: boolean;
|
|
17
|
+
/** Save button icon. */
|
|
18
|
+
saveIcon: string;
|
|
19
|
+
/** Save button text; empty hides it. */
|
|
20
|
+
saveLabel: string;
|
|
21
|
+
}
|
|
@@ -1,152 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* `<agent-feedback-bar-ui>` — auto-registers the tag on import.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* For non-side-effect class import (test isolation, tag override), use
|
|
5
|
+
* the `class` subpath:
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
* <agent-feedback-bar-ui
|
|
9
|
-
* save-label="Save pattern"
|
|
10
|
-
* save-icon="bookmark-simple"
|
|
11
|
-
* ></agent-feedback-bar-ui>
|
|
7
|
+
* import { UIAgentFeedbackBar } from '@adia-ai/web-components/components/agent-feedback-bar/class';
|
|
12
8
|
*
|
|
13
|
-
*
|
|
14
|
-
* el.addEventListener('feedback-save', async () => {
|
|
15
|
-
* const name = await savePattern(...);
|
|
16
|
-
* el.setStatus(`Saved as "${name}"`, { lock: 'save' });
|
|
17
|
-
* });
|
|
18
|
-
*
|
|
19
|
-
* Attributes:
|
|
20
|
-
* save-label — text of the save button (empty → save button hidden)
|
|
21
|
-
* save-icon — icon for the save button (default: bookmark-simple)
|
|
22
|
-
* disabled — disable all actions
|
|
23
|
-
*
|
|
24
|
-
* Events:
|
|
25
|
-
* feedback-rate — detail: { rating: 1..5 } (thumbs-up = 5, thumbs-down = 2)
|
|
26
|
-
* feedback-save — detail: {} (save action pressed)
|
|
27
|
-
*
|
|
28
|
-
* JS API:
|
|
29
|
-
* .setStatus(text, { lock? }) lock='rate'|'save'|'all' disables matching buttons
|
|
30
|
-
* .reset() clear status, re-enable buttons
|
|
9
|
+
* @see ../../USAGE.md#registration--auto-vs-explicit
|
|
31
10
|
*/
|
|
32
11
|
|
|
33
|
-
import {
|
|
34
|
-
|
|
35
|
-
class UIAgentFeedbackBar extends UIElement {
|
|
36
|
-
static properties = {
|
|
37
|
-
saveLabel: { type: String, default: '', reflect: true, attribute: 'save-label' },
|
|
38
|
-
saveIcon: { type: String, default: 'bookmark-simple', reflect: true, attribute: 'save-icon' },
|
|
39
|
-
disabled: { type: Boolean, default: false, reflect: true },
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
static template = () => null;
|
|
43
|
-
|
|
44
|
-
#upEl = null;
|
|
45
|
-
#downEl = null;
|
|
46
|
-
#saveEl = null;
|
|
47
|
-
#statusEl = null;
|
|
48
|
-
#rated = false;
|
|
49
|
-
#saved = false;
|
|
50
|
-
|
|
51
|
-
connected() {
|
|
52
|
-
this.#build();
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
disconnected() {
|
|
56
|
-
this.#upEl?.removeEventListener('press', this.#onUp);
|
|
57
|
-
this.#downEl?.removeEventListener('press', this.#onDown);
|
|
58
|
-
this.#saveEl?.removeEventListener('press', this.#onSave);
|
|
59
|
-
this.#upEl = this.#downEl = this.#saveEl = this.#statusEl = null;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
setStatus(text, { lock = '' } = {}) {
|
|
63
|
-
if (!this.#statusEl) return;
|
|
64
|
-
this.#statusEl.textContent = text || '';
|
|
65
|
-
if (lock === 'rate' || lock === 'all') {
|
|
66
|
-
this.#rated = true;
|
|
67
|
-
if (this.#upEl) this.#upEl.disabled = true;
|
|
68
|
-
if (this.#downEl) this.#downEl.disabled = true;
|
|
69
|
-
}
|
|
70
|
-
if (lock === 'save' || lock === 'all') {
|
|
71
|
-
this.#saved = true;
|
|
72
|
-
if (this.#saveEl) this.#saveEl.disabled = true;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
reset() {
|
|
77
|
-
this.#rated = false;
|
|
78
|
-
this.#saved = false;
|
|
79
|
-
if (this.#statusEl) this.#statusEl.textContent = '';
|
|
80
|
-
if (this.#upEl) this.#upEl.disabled = false;
|
|
81
|
-
if (this.#downEl) this.#downEl.disabled = false;
|
|
82
|
-
if (this.#saveEl) this.#saveEl.disabled = false;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
#onUp = () => { if (!this.#rated && !this.disabled) this.#emitRate(5); };
|
|
86
|
-
#onDown = () => { if (!this.#rated && !this.disabled) this.#emitRate(2); };
|
|
87
|
-
#onSave = () => { if (!this.#saved && !this.disabled) this.#emitSave(); };
|
|
88
|
-
|
|
89
|
-
#emitRate(rating) {
|
|
90
|
-
this.dispatchEvent(new CustomEvent('feedback-rate', {
|
|
91
|
-
bubbles: true, detail: { rating },
|
|
92
|
-
}));
|
|
93
|
-
// Host owns lock — but pre-set a generic ack as a courtesy.
|
|
94
|
-
if (!this.#statusEl?.textContent) {
|
|
95
|
-
this.setStatus(rating >= 4 ? 'Thanks!' : 'Noted', { lock: 'rate' });
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
#emitSave() {
|
|
100
|
-
this.dispatchEvent(new CustomEvent('feedback-save', {
|
|
101
|
-
bubbles: true, detail: {},
|
|
102
|
-
}));
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
render() {
|
|
106
|
-
// Re-sync attributes (label/icon) that may have changed.
|
|
107
|
-
const label = this.saveLabel;
|
|
108
|
-
const icon = this.saveIcon;
|
|
109
|
-
if (this.#saveEl) {
|
|
110
|
-
if (label) {
|
|
111
|
-
this.#saveEl.setAttribute('text', label);
|
|
112
|
-
this.#saveEl.hidden = false;
|
|
113
|
-
} else {
|
|
114
|
-
this.#saveEl.hidden = true;
|
|
115
|
-
}
|
|
116
|
-
if (icon) this.#saveEl.setAttribute('icon', icon);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
#build() {
|
|
121
|
-
this.innerHTML = '';
|
|
122
|
-
|
|
123
|
-
this.#upEl = makeButton({ icon: 'thumbs-up' });
|
|
124
|
-
this.#downEl = makeButton({ icon: 'thumbs-down' });
|
|
125
|
-
this.#saveEl = makeButton({
|
|
126
|
-
icon: this.saveIcon || 'bookmark-simple',
|
|
127
|
-
text: this.saveLabel || '',
|
|
128
|
-
});
|
|
129
|
-
if (!this.saveLabel) this.#saveEl.hidden = true;
|
|
130
|
-
|
|
131
|
-
this.#upEl.addEventListener('press', this.#onUp);
|
|
132
|
-
this.#downEl.addEventListener('press', this.#onDown);
|
|
133
|
-
this.#saveEl.addEventListener('press', this.#onSave);
|
|
134
|
-
|
|
135
|
-
this.#statusEl = document.createElement('span');
|
|
136
|
-
this.#statusEl.setAttribute('data-feedback-status', '');
|
|
137
|
-
|
|
138
|
-
this.append(this.#upEl, this.#downEl, this.#saveEl, this.#statusEl);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
12
|
+
import { defineIfFree } from '../../core/register.js';
|
|
13
|
+
import { UIAgentFeedbackBar } from './class.js';
|
|
141
14
|
|
|
142
|
-
|
|
143
|
-
const btn = document.createElement('button-ui');
|
|
144
|
-
btn.setAttribute('icon', icon);
|
|
145
|
-
btn.setAttribute('variant', 'ghost');
|
|
146
|
-
btn.setAttribute('size', 'sm');
|
|
147
|
-
if (text) btn.setAttribute('text', text);
|
|
148
|
-
return btn;
|
|
149
|
-
}
|
|
15
|
+
defineIfFree('agent-feedback-bar-ui', UIAgentFeedbackBar);
|
|
150
16
|
|
|
151
|
-
customElements.define('agent-feedback-bar-ui', UIAgentFeedbackBar);
|
|
152
17
|
export { UIAgentFeedbackBar };
|