@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
|
@@ -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 };
|
|
@@ -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,23 @@
|
|
|
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 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 UIToast extends UIElement {
|
|
15
|
+
/** Auto-dismiss time in milliseconds. 0 disables auto-dismiss. */
|
|
16
|
+
duration: number;
|
|
17
|
+
/** Screen position */
|
|
18
|
+
position: 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right';
|
|
19
|
+
/** Toast message text */
|
|
20
|
+
text: string;
|
|
21
|
+
/** Semantic variant — `default | info | success | warning | danger`. `primary` and `muted` are style hints; canonical "neutral but interesting" tone is `info`. */
|
|
22
|
+
variant: 'default' | 'info' | 'success' | 'warning' | 'danger' | 'primary' | 'muted' | 'neutral';
|
|
23
|
+
}
|
|
@@ -1,88 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* `<toast-ui>` — auto-registers the tag on import.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* declarative `<toast-ui>` and imperative `UIToast.show()` paths
|
|
7
|
-
* route through `UIFeed`. The element exists for back-compat:
|
|
8
|
-
* authoring `<toast-ui text="…">` still produces a feed item.
|
|
4
|
+
* For non-side-effect class import (test isolation, tag override), use
|
|
5
|
+
* the `class` subpath:
|
|
9
6
|
*
|
|
10
|
-
*
|
|
11
|
-
* UIToast.show({ text: 'Saved!', variant: 'success' });
|
|
7
|
+
* import { UIToast } from '@adia-ai/web-components/components/toast/class';
|
|
12
8
|
*
|
|
13
|
-
*
|
|
14
|
-
* window.dispatchEvent(new CustomEvent('toast', {
|
|
15
|
-
* detail: { text: 'Saved!', variant: 'success' }
|
|
16
|
-
* }));
|
|
17
|
-
*
|
|
18
|
-
* // Declarative — auto-posts and removes self on connect.
|
|
19
|
-
* <toast-ui text="Saved!" variant="success"></toast-ui>
|
|
20
|
-
*
|
|
21
|
-
* The legacy `[data-toast-container]` per-position-Map plumbing was
|
|
22
|
-
* retired in this migration; the lane infrastructure now lives in
|
|
23
|
-
* `<feed-ui>` (see ../feed/feed.js).
|
|
9
|
+
* @see ../../USAGE.md#registration--auto-vs-explicit
|
|
24
10
|
*/
|
|
25
11
|
|
|
26
|
-
import {
|
|
27
|
-
import {
|
|
28
|
-
|
|
29
|
-
class UIToast extends UIElement {
|
|
30
|
-
static properties = {
|
|
31
|
-
text: { type: String, default: '', reflect: true },
|
|
32
|
-
variant: { type: String, default: 'info', reflect: true },
|
|
33
|
-
duration: { type: Number, default: 4000, reflect: true },
|
|
34
|
-
position: { type: String, default: 'bottom-right', reflect: true },
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
static template = () => html``;
|
|
12
|
+
import { defineIfFree } from '../../core/register.js';
|
|
13
|
+
import { UIToast } from './class.js';
|
|
38
14
|
|
|
39
|
-
|
|
40
|
-
/* Declarative path: post into UIFeed and remove self. The
|
|
41
|
-
element is fire-and-forget — its only job is to forward the
|
|
42
|
-
authored attributes to the feed, then dissolve. Re-entrant
|
|
43
|
-
guard keeps this safe under HMR / dev-mode re-attachment. */
|
|
44
|
-
if (this.__routedToFeed) return;
|
|
45
|
-
this.__routedToFeed = true;
|
|
46
|
-
UIFeed.post({
|
|
47
|
-
text: this.text,
|
|
48
|
-
variant: this.variant === 'error' ? 'danger' : this.variant,
|
|
49
|
-
duration: this.duration,
|
|
50
|
-
position: this.position,
|
|
51
|
-
});
|
|
52
|
-
/* Schedule removal so the calling code can read the attributes
|
|
53
|
-
if it inspected this element on the same microtask. */
|
|
54
|
-
queueMicrotask(() => { try { this.remove(); } catch { /* noop */ } });
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Static facade — delegates to UIFeed.post(). Kept for back-compat
|
|
59
|
-
* with consumer code shaped like `customElements.get('toast-ui').show(...)`
|
|
60
|
-
* or `UIToast.show(...)`. New code should call UIFeed.post()
|
|
61
|
-
* directly.
|
|
62
|
-
*
|
|
63
|
-
* @param {Object} opts
|
|
64
|
-
* @param {string} opts.text
|
|
65
|
-
* @param {string} [opts.variant='info'] — `error` aliases to `danger`.
|
|
66
|
-
* @param {number} [opts.duration=4000]
|
|
67
|
-
* @param {string} [opts.position='bottom-right']
|
|
68
|
-
* @returns {{id:string|null, dismiss:function, update:function}} FeedHandle.
|
|
69
|
-
*/
|
|
70
|
-
static show(opts = {}) {
|
|
71
|
-
const { text, variant = 'info', duration = 4000, position = 'bottom-right' } = opts;
|
|
72
|
-
return UIFeed.post({
|
|
73
|
-
text,
|
|
74
|
-
variant: variant === 'error' ? 'danger' : variant,
|
|
75
|
-
duration,
|
|
76
|
-
position,
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
}
|
|
15
|
+
defineIfFree('toast-ui', UIToast);
|
|
80
16
|
|
|
81
17
|
/* Idempotent install of the global 'toast' CustomEvent listener.
|
|
82
18
|
Same shape as the historical channel — code that posts via
|
|
83
19
|
`window.dispatchEvent(new CustomEvent('toast', {detail:{…}}))`
|
|
84
|
-
keeps working.
|
|
85
|
-
delegates to UIFeed.post(). */
|
|
20
|
+
keeps working. Delegates to UIToast.show() → UIFeed.post(). */
|
|
86
21
|
if (typeof window !== 'undefined' && !window.__adiaToastListenerInstalled) {
|
|
87
22
|
window.__adiaToastListenerInstalled = true;
|
|
88
23
|
window.addEventListener('toast', (e) => {
|
|
@@ -90,6 +25,4 @@ if (typeof window !== 'undefined' && !window.__adiaToastListenerInstalled) {
|
|
|
90
25
|
});
|
|
91
26
|
}
|
|
92
27
|
|
|
93
|
-
customElements.define('toast-ui', UIToast);
|
|
94
|
-
|
|
95
28
|
export { UIToast };
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Non-side-effect class export for `<toggle-option-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/toggle-group`
|
|
9
|
+
* (which imports this file + calls `defineIfFree()`).
|
|
10
|
+
*
|
|
11
|
+
* @see ../../USAGE.md#registration--auto-vs-explicit
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* <toggle-group-ui value="bold,italic">
|
|
16
|
+
* <toggle-option-ui value="bold" icon="text-b"></toggle-option-ui>
|
|
17
|
+
* <toggle-option-ui value="italic" icon="text-italic"></toggle-option-ui>
|
|
18
|
+
* <toggle-option-ui value="underline" icon="text-underline"></toggle-option-ui>
|
|
19
|
+
* </toggle-group-ui>
|
|
20
|
+
*
|
|
21
|
+
* Multi-select button group (unlike segmented which is single-select).
|
|
22
|
+
*
|
|
23
|
+
* Properties:
|
|
24
|
+
* value — comma-separated selected values
|
|
25
|
+
* single — restrict to one active option at a time (default false: multi-select)
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
import { UIElement } from '../../core/element.js';
|
|
29
|
+
|
|
30
|
+
// ── Toggle Option ──
|
|
31
|
+
//
|
|
32
|
+
// Parent-managed. Selection state flows through `toggle-group-ui`'s `value`
|
|
33
|
+
// (and `single` mode flag). Items don't expose `checked` — parent applies
|
|
34
|
+
// `data-selected` on the DOM element when the item's `value` is part of the
|
|
35
|
+
// group's comma-separated `value` list. Consistent with native `<option>`
|
|
36
|
+
// inside `<select>`.
|
|
37
|
+
|
|
38
|
+
export class UIToggleOption extends UIElement {
|
|
39
|
+
static properties = {
|
|
40
|
+
value: { type: String, default: '', reflect: true },
|
|
41
|
+
text: { type: String, default: '', reflect: true },
|
|
42
|
+
icon: { type: String, default: '', reflect: true },
|
|
43
|
+
disabled: { type: Boolean, default: false, reflect: true },
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
static template = () => null;
|
|
47
|
+
|
|
48
|
+
#stamped = false;
|
|
49
|
+
|
|
50
|
+
connected() {
|
|
51
|
+
this.setAttribute('role', 'button');
|
|
52
|
+
this.setAttribute('tabindex', '0');
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
render() {
|
|
56
|
+
if (!this.#stamped) {
|
|
57
|
+
this.#stamped = true;
|
|
58
|
+
this.#stamp();
|
|
59
|
+
}
|
|
60
|
+
if (this.disabled) this.setAttribute('aria-disabled', 'true');
|
|
61
|
+
else this.removeAttribute('aria-disabled');
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
#stamp() {
|
|
65
|
+
let inner = '';
|
|
66
|
+
if (this.icon) inner += `<icon-ui name="${this.icon}"></icon-ui>`;
|
|
67
|
+
if (this.text) inner += `<span data-text>${this.text}</span>`;
|
|
68
|
+
this.innerHTML = inner;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
disconnected() {
|
|
72
|
+
this.#stamped = false;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export class UIToggleGroup extends UIElement {
|
|
77
|
+
static properties = {
|
|
78
|
+
value: { type: String, default: '', reflect: true },
|
|
79
|
+
single: { type: Boolean, default: false, reflect: true },
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
static template = () => null;
|
|
83
|
+
|
|
84
|
+
#bound = false;
|
|
85
|
+
|
|
86
|
+
get #valueSet() {
|
|
87
|
+
return new Set(this.value ? this.value.split(',').map(v => v.trim()).filter(Boolean) : []);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
connected() {
|
|
91
|
+
if (!this.#bound) {
|
|
92
|
+
this.#bound = true;
|
|
93
|
+
this.addEventListener('click', this.#onClick);
|
|
94
|
+
this.addEventListener('keydown', this.#onKey);
|
|
95
|
+
}
|
|
96
|
+
this.setAttribute('role', 'group');
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
render() {
|
|
100
|
+
const selected = this.#valueSet;
|
|
101
|
+
for (const opt of this.querySelectorAll('toggle-option-ui')) {
|
|
102
|
+
const optVal = opt.value || opt.getAttribute('value') || '';
|
|
103
|
+
if (selected.has(optVal)) {
|
|
104
|
+
opt.setAttribute('data-selected', '');
|
|
105
|
+
opt.setAttribute('aria-pressed', 'true');
|
|
106
|
+
} else {
|
|
107
|
+
opt.removeAttribute('data-selected');
|
|
108
|
+
opt.setAttribute('aria-pressed', 'false');
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
#toggle(opt) {
|
|
114
|
+
if (opt.disabled) return;
|
|
115
|
+
const optVal = opt.value || opt.getAttribute('value') || '';
|
|
116
|
+
if (!optVal) return;
|
|
117
|
+
|
|
118
|
+
const selected = this.#valueSet;
|
|
119
|
+
|
|
120
|
+
if (this.single) {
|
|
121
|
+
if (selected.has(optVal)) {
|
|
122
|
+
selected.clear();
|
|
123
|
+
} else {
|
|
124
|
+
selected.clear();
|
|
125
|
+
selected.add(optVal);
|
|
126
|
+
}
|
|
127
|
+
} else {
|
|
128
|
+
if (selected.has(optVal)) selected.delete(optVal);
|
|
129
|
+
else selected.add(optVal);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
this.value = [...selected].join(',');
|
|
133
|
+
this.dispatchEvent(new CustomEvent('change', { bubbles: true, detail: { value: this.value } }));
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
#onClick = (e) => {
|
|
137
|
+
const opt = e.target.closest('toggle-option-ui');
|
|
138
|
+
if (opt && this.contains(opt)) this.#toggle(opt);
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
#onKey = (e) => {
|
|
142
|
+
if (e.key === 'Enter' || e.key === ' ') {
|
|
143
|
+
e.preventDefault();
|
|
144
|
+
const opt = e.target.closest('toggle-option-ui');
|
|
145
|
+
if (opt && this.contains(opt)) this.#toggle(opt);
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
disconnected() {
|
|
150
|
+
this.removeEventListener('click', this.#onClick);
|
|
151
|
+
this.removeEventListener('keydown', this.#onKey);
|
|
152
|
+
this.#bound = false;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<toggle-group-ui>` — Multi-select button group (unlike segmented which is single-select).
|
|
3
|
+
*
|
|
4
|
+
* @see https://ui-kit.exe.xyz/site/components/toggle-group
|
|
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 UIToggleGroup extends UIElement {
|
|
15
|
+
/** When true, restrict to one active option (single-select). */
|
|
16
|
+
single: boolean;
|
|
17
|
+
/** Comma-separated selected values */
|
|
18
|
+
value: string;
|
|
19
|
+
}
|