@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
package/components/tag/tag.js
CHANGED
|
@@ -1,89 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* `<tag-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
|
-
* Sizes: sm, md (default)
|
|
7
|
+
* import { UITag } from '@adia-ai/web-components/components/tag/class';
|
|
9
8
|
*
|
|
10
|
-
*
|
|
11
|
-
* remove — { detail: { text, value } } fired when dismiss is clicked
|
|
9
|
+
* @see ../../USAGE.md#registration--auto-vs-explicit
|
|
12
10
|
*/
|
|
13
11
|
|
|
14
|
-
import {
|
|
12
|
+
import { defineIfFree } from '../../core/register.js';
|
|
13
|
+
import { UITag } from './class.js';
|
|
15
14
|
|
|
16
|
-
|
|
17
|
-
static properties = {
|
|
18
|
-
text: { type: String, default: '', reflect: true },
|
|
19
|
-
textContent: { type: String, default: '' },
|
|
20
|
-
variant: { type: String, default: 'default', reflect: true },
|
|
21
|
-
size: { type: String, default: 'md', reflect: true },
|
|
22
|
-
removable: { type: Boolean, default: false, reflect: true },
|
|
23
|
-
disabled: { type: Boolean, default: false, reflect: true },
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
static parts = {
|
|
27
|
-
dismiss: '<button slot="dismiss" type="button" aria-label="Remove"><icon-ui name="x"></icon-ui></button>',
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
static template = () => null;
|
|
31
|
-
|
|
32
|
-
#onClick = (e) => {
|
|
33
|
-
if (this.disabled) return;
|
|
34
|
-
if (e.target.closest('[slot="dismiss"]')) {
|
|
35
|
-
this.dispatchEvent(new CustomEvent('remove', {
|
|
36
|
-
bubbles: true,
|
|
37
|
-
detail: { text: this.text, value: this.text },
|
|
38
|
-
}));
|
|
39
|
-
this.remove();
|
|
40
|
-
}
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
#onKeydown = (e) => {
|
|
44
|
-
if (this.disabled) return;
|
|
45
|
-
if (e.target.closest('[slot="dismiss"]') && (e.key === 'Enter' || e.key === ' ')) {
|
|
46
|
-
e.preventDefault();
|
|
47
|
-
this.dispatchEvent(new CustomEvent('remove', {
|
|
48
|
-
bubbles: true,
|
|
49
|
-
detail: { text: this.text, value: this.text },
|
|
50
|
-
}));
|
|
51
|
-
this.remove();
|
|
52
|
-
}
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
connected() {
|
|
56
|
-
this.setAttribute('role', 'status');
|
|
57
|
-
this.setAttribute('tabindex', '0');
|
|
58
|
-
|
|
59
|
-
this.addEventListener('click', this.#onClick);
|
|
60
|
-
this.addEventListener('keydown', this.#onKeydown);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
disconnected() {
|
|
64
|
-
this.removeEventListener('click', this.#onClick);
|
|
65
|
-
this.removeEventListener('keydown', this.#onKeydown);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
render() {
|
|
69
|
-
if (this.text) this.setAttribute('aria-label', this.text);
|
|
70
|
-
|
|
71
|
-
if (this.disabled) {
|
|
72
|
-
this.setAttribute('aria-disabled', 'true');
|
|
73
|
-
this.setAttribute('tabindex', '-1');
|
|
74
|
-
} else {
|
|
75
|
-
this.removeAttribute('aria-disabled');
|
|
76
|
-
this.setAttribute('tabindex', '0');
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
if (this.removable && !this.disabled) {
|
|
80
|
-
const btn = this.ensure('dismiss');
|
|
81
|
-
if (btn && btn.parentElement !== this) this.appendChild(btn);
|
|
82
|
-
} else {
|
|
83
|
-
this.drop('dismiss');
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
customElements.define('tag-ui', UITag);
|
|
15
|
+
defineIfFree('tag-ui', UITag);
|
|
88
16
|
|
|
89
17
|
export { UITag };
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Non-side-effect class export for `<text-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/text`
|
|
9
|
+
* (which imports this file + calls `defineIfFree()`).
|
|
10
|
+
*
|
|
11
|
+
* @see ../../USAGE.md#registration--auto-vs-explicit
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* <text-ui variant="heading">Hello World</text-ui>
|
|
16
|
+
* <text-ui truncate>Long text that gets cut off...</text-ui>
|
|
17
|
+
* <text-ui variant="body" lines="3">Multi-line clamped content...</text-ui>
|
|
18
|
+
*
|
|
19
|
+
* Typography wrapper that applies role tokens.
|
|
20
|
+
*
|
|
21
|
+
* Properties:
|
|
22
|
+
* variant — body | heading | title | display | caption | label | kicker | code
|
|
23
|
+
* truncate — single-line truncation with ellipsis
|
|
24
|
+
* lines — multi-line clamp count (0 = no clamp)
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
import { UIElement } from '../../core/element.js';
|
|
28
|
+
|
|
29
|
+
export class UIText extends UIElement {
|
|
30
|
+
static properties = {
|
|
31
|
+
variant: { type: String, default: 'body', reflect: true },
|
|
32
|
+
strong: { type: Boolean, default: false, reflect: true },
|
|
33
|
+
truncate: { type: Boolean, default: false, reflect: true },
|
|
34
|
+
lines: { type: Number, default: 0, reflect: true },
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
static template = () => null;
|
|
38
|
+
|
|
39
|
+
render() {
|
|
40
|
+
if (this.lines > 0) {
|
|
41
|
+
this.style.setProperty('--_text-lines', String(this.lines));
|
|
42
|
+
} else {
|
|
43
|
+
this.style.removeProperty('--_text-lines');
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<text-ui>` — Typography wrapper that applies role tokens. Supports truncation and line clamping.
|
|
3
|
+
*
|
|
4
|
+
* @see https://ui-kit.exe.xyz/site/components/text
|
|
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 UIText extends UIElement {
|
|
15
|
+
/** Multi-line clamp count (0 = no clamp) */
|
|
16
|
+
lines: number;
|
|
17
|
+
/** When true, applies stronger emphasis (heavier weight + accent color). Styled via :scope[strong] in text.css. Use instead of variant=heading when you want a single emphasized word inline in body copy. */
|
|
18
|
+
strong: boolean;
|
|
19
|
+
/** Display text content. The main payload field for Text components extracted from HTML. */
|
|
20
|
+
textContent: string;
|
|
21
|
+
/** Single-line truncation with ellipsis. Ignored when `lines` is set. */
|
|
22
|
+
truncate: boolean;
|
|
23
|
+
/** Typography variant — sets role tokens (size/weight/tracking/color). */
|
|
24
|
+
variant: 'body' | 'heading' | 'subheading' | 'title' | 'subsection' | 'display' | 'caption' | 'label' | 'kicker' | 'deck' | 'section' | 'metric' | 'code' | 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';
|
|
25
|
+
}
|
package/components/text/text.js
CHANGED
|
@@ -1,36 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* <text-ui truncate>Long text that gets cut off...</text-ui>
|
|
4
|
-
* <text-ui variant="body" lines="3">Multi-line clamped content...</text-ui>
|
|
2
|
+
* `<text-ui>` — auto-registers the tag on import.
|
|
5
3
|
*
|
|
6
|
-
*
|
|
4
|
+
* For non-side-effect class import (test isolation, tag override), use
|
|
5
|
+
* the `class` subpath:
|
|
7
6
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* lines — multi-line clamp count (0 = no clamp)
|
|
7
|
+
* import { UIText } from '@adia-ai/web-components/components/text/class';
|
|
8
|
+
*
|
|
9
|
+
* @see ../../USAGE.md#registration--auto-vs-explicit
|
|
12
10
|
*/
|
|
13
11
|
|
|
14
|
-
import {
|
|
15
|
-
|
|
16
|
-
class UIText extends UIElement {
|
|
17
|
-
static properties = {
|
|
18
|
-
variant: { type: String, default: 'body', reflect: true },
|
|
19
|
-
strong: { type: Boolean, default: false, reflect: true },
|
|
20
|
-
truncate: { type: Boolean, default: false, reflect: true },
|
|
21
|
-
lines: { type: Number, default: 0, reflect: true },
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
static template = () => null;
|
|
12
|
+
import { defineIfFree } from '../../core/register.js';
|
|
13
|
+
import { UIText } from './class.js';
|
|
25
14
|
|
|
26
|
-
|
|
27
|
-
if (this.lines > 0) {
|
|
28
|
-
this.style.setProperty('--_text-lines', String(this.lines));
|
|
29
|
-
} else {
|
|
30
|
-
this.style.removeProperty('--_text-lines');
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
customElements.define('text-ui', UIText);
|
|
15
|
+
defineIfFree('text-ui', UIText);
|
|
35
16
|
|
|
36
17
|
export { UIText };
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Non-side-effect class export for `<textarea-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/textarea`
|
|
9
|
+
* (which imports this file + calls `defineIfFree()`).
|
|
10
|
+
*
|
|
11
|
+
* @see ../../USAGE.md#registration--auto-vs-explicit
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* <textarea-ui> — Multiline text input. The host IS the interactive surface.
|
|
16
|
+
* Uses contenteditable for text entry, ElementInternals for form participation.
|
|
17
|
+
* No native <textarea> inside.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { UIFormElement } from '../../core/form.js';
|
|
21
|
+
|
|
22
|
+
export class UITextarea extends UIFormElement {
|
|
23
|
+
static properties = {
|
|
24
|
+
...UIFormElement.properties,
|
|
25
|
+
placeholder: { type: String, default: '', reflect: true },
|
|
26
|
+
label: { type: String, default: '', reflect: true },
|
|
27
|
+
rows: { type: Number, default: 3, reflect: true },
|
|
28
|
+
resize: { type: String, default: 'vertical', reflect: true },
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
static template = () => null;
|
|
32
|
+
|
|
33
|
+
#textEl = null;
|
|
34
|
+
|
|
35
|
+
connected() {
|
|
36
|
+
super.connected();
|
|
37
|
+
this.setAttribute('role', 'textbox');
|
|
38
|
+
this.setAttribute('aria-multiline', 'true');
|
|
39
|
+
|
|
40
|
+
if (!this.querySelector('[slot="text"]')) {
|
|
41
|
+
this.innerHTML = `
|
|
42
|
+
${this.label ? `<label slot="label" label="${this.label}"></label>` : ''}
|
|
43
|
+
<div slot="text" contenteditable="plaintext-only" tabindex="0"
|
|
44
|
+
${this.value ? '' : 'data-empty=""'}
|
|
45
|
+
data-placeholder="${this.placeholder}"></div>
|
|
46
|
+
`;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
this.#textEl = this.querySelector('[slot="text"]');
|
|
50
|
+
if (this.value) this.#textEl.textContent = this.value;
|
|
51
|
+
|
|
52
|
+
if (this.#textEl) {
|
|
53
|
+
this.#textEl.addEventListener('input', this.#onInput);
|
|
54
|
+
this.#textEl.addEventListener('keydown', this.#onKeydown);
|
|
55
|
+
this.#textEl.addEventListener('blur', this.#onBlur);
|
|
56
|
+
this.#textEl.addEventListener('paste', this.#onPaste);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
render() {
|
|
61
|
+
if (!this.#textEl) return;
|
|
62
|
+
|
|
63
|
+
this.#textEl.setAttribute('data-placeholder', this.placeholder);
|
|
64
|
+
|
|
65
|
+
if (this.disabled || this.readonly) {
|
|
66
|
+
this.#textEl.contentEditable = 'false';
|
|
67
|
+
} else {
|
|
68
|
+
this.#textEl.contentEditable = 'plaintext-only';
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Sync programmatic `value` assignments (form.reset(), trait writes,
|
|
72
|
+
// controlled-input patterns) into the contenteditable surface. Skip
|
|
73
|
+
// when the surface already matches to avoid clobbering an in-flight
|
|
74
|
+
// edit's caret.
|
|
75
|
+
const text = this.value || '';
|
|
76
|
+
if (this.#textEl.textContent !== text) {
|
|
77
|
+
this.#textEl.textContent = text;
|
|
78
|
+
this.#textEl.toggleAttribute('data-empty', !text);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const label = this.querySelector('[slot="label"]');
|
|
82
|
+
if (label && this.label) label.setAttribute('label', this.label);
|
|
83
|
+
|
|
84
|
+
this.setAttribute('aria-label', this.label || this.placeholder || '');
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
#onInput = () => {
|
|
88
|
+
const text = this.#textEl.textContent || '';
|
|
89
|
+
this.value = text;
|
|
90
|
+
this.#textEl.toggleAttribute('data-empty', !text);
|
|
91
|
+
this.syncValue(text);
|
|
92
|
+
this.dispatchEvent(new CustomEvent('input', { bubbles: true, detail: { value: this.value } }));
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
#onKeydown = (e) => {
|
|
96
|
+
// Enter without shift submits; shift+enter inserts newline
|
|
97
|
+
if (e.key === 'Enter' && !e.shiftKey) {
|
|
98
|
+
e.preventDefault();
|
|
99
|
+
this.dispatchEvent(new Event('submit', { bubbles: true }));
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
#onBlur = () => {
|
|
104
|
+
this.dispatchEvent(new CustomEvent('change', { bubbles: true, detail: { value: this.value } }));
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
#onPaste = (e) => {
|
|
108
|
+
e.preventDefault();
|
|
109
|
+
const text = e.clipboardData?.getData('text/plain') || '';
|
|
110
|
+
document.execCommand('insertText', false, text);
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
focus() { this.#textEl?.focus(); }
|
|
114
|
+
|
|
115
|
+
clear() {
|
|
116
|
+
this.value = '';
|
|
117
|
+
if (this.#textEl) {
|
|
118
|
+
this.#textEl.textContent = '';
|
|
119
|
+
this.#textEl.setAttribute('data-empty', '');
|
|
120
|
+
}
|
|
121
|
+
this.syncValue('');
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
disconnected() {
|
|
125
|
+
super.disconnected();
|
|
126
|
+
if (this.#textEl) {
|
|
127
|
+
this.#textEl.removeEventListener('input', this.#onInput);
|
|
128
|
+
this.#textEl.removeEventListener('keydown', this.#onKeydown);
|
|
129
|
+
this.#textEl.removeEventListener('blur', this.#onBlur);
|
|
130
|
+
this.#textEl.removeEventListener('paste', this.#onPaste);
|
|
131
|
+
}
|
|
132
|
+
this.#textEl = null;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
@@ -1,124 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* `<textarea-ui>` — auto-registers the tag on import.
|
|
3
|
+
*
|
|
4
|
+
* For non-side-effect class import (test isolation, tag override), use
|
|
5
|
+
* the `class` subpath:
|
|
6
|
+
*
|
|
7
|
+
* import { UITextarea } from '@adia-ai/web-components/components/textarea/class';
|
|
8
|
+
*
|
|
9
|
+
* @see ../../USAGE.md#registration--auto-vs-explicit
|
|
5
10
|
*/
|
|
6
11
|
|
|
7
|
-
import {
|
|
12
|
+
import { defineIfFree } from '../../core/register.js';
|
|
13
|
+
import { UITextarea } from './class.js';
|
|
8
14
|
|
|
9
|
-
|
|
10
|
-
static properties = {
|
|
11
|
-
...UIFormElement.properties,
|
|
12
|
-
placeholder: { type: String, default: '', reflect: true },
|
|
13
|
-
label: { type: String, default: '', reflect: true },
|
|
14
|
-
rows: { type: Number, default: 3, reflect: true },
|
|
15
|
-
resize: { type: String, default: 'vertical', reflect: true },
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
static template = () => null;
|
|
19
|
-
|
|
20
|
-
#textEl = null;
|
|
21
|
-
|
|
22
|
-
connected() {
|
|
23
|
-
super.connected();
|
|
24
|
-
this.setAttribute('role', 'textbox');
|
|
25
|
-
this.setAttribute('aria-multiline', 'true');
|
|
26
|
-
|
|
27
|
-
if (!this.querySelector('[slot="text"]')) {
|
|
28
|
-
this.innerHTML = `
|
|
29
|
-
${this.label ? `<label slot="label" label="${this.label}"></label>` : ''}
|
|
30
|
-
<div slot="text" contenteditable="plaintext-only" tabindex="0"
|
|
31
|
-
${this.value ? '' : 'data-empty=""'}
|
|
32
|
-
data-placeholder="${this.placeholder}"></div>
|
|
33
|
-
`;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
this.#textEl = this.querySelector('[slot="text"]');
|
|
37
|
-
if (this.value) this.#textEl.textContent = this.value;
|
|
38
|
-
|
|
39
|
-
if (this.#textEl) {
|
|
40
|
-
this.#textEl.addEventListener('input', this.#onInput);
|
|
41
|
-
this.#textEl.addEventListener('keydown', this.#onKeydown);
|
|
42
|
-
this.#textEl.addEventListener('blur', this.#onBlur);
|
|
43
|
-
this.#textEl.addEventListener('paste', this.#onPaste);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
render() {
|
|
48
|
-
if (!this.#textEl) return;
|
|
49
|
-
|
|
50
|
-
this.#textEl.setAttribute('data-placeholder', this.placeholder);
|
|
51
|
-
|
|
52
|
-
if (this.disabled || this.readonly) {
|
|
53
|
-
this.#textEl.contentEditable = 'false';
|
|
54
|
-
} else {
|
|
55
|
-
this.#textEl.contentEditable = 'plaintext-only';
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// Sync programmatic `value` assignments (form.reset(), trait writes,
|
|
59
|
-
// controlled-input patterns) into the contenteditable surface. Skip
|
|
60
|
-
// when the surface already matches to avoid clobbering an in-flight
|
|
61
|
-
// edit's caret.
|
|
62
|
-
const text = this.value || '';
|
|
63
|
-
if (this.#textEl.textContent !== text) {
|
|
64
|
-
this.#textEl.textContent = text;
|
|
65
|
-
this.#textEl.toggleAttribute('data-empty', !text);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
const label = this.querySelector('[slot="label"]');
|
|
69
|
-
if (label && this.label) label.setAttribute('label', this.label);
|
|
70
|
-
|
|
71
|
-
this.setAttribute('aria-label', this.label || this.placeholder || '');
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
#onInput = () => {
|
|
75
|
-
const text = this.#textEl.textContent || '';
|
|
76
|
-
this.value = text;
|
|
77
|
-
this.#textEl.toggleAttribute('data-empty', !text);
|
|
78
|
-
this.syncValue(text);
|
|
79
|
-
this.dispatchEvent(new CustomEvent('input', { bubbles: true, detail: { value: this.value } }));
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
#onKeydown = (e) => {
|
|
83
|
-
// Enter without shift submits; shift+enter inserts newline
|
|
84
|
-
if (e.key === 'Enter' && !e.shiftKey) {
|
|
85
|
-
e.preventDefault();
|
|
86
|
-
this.dispatchEvent(new Event('submit', { bubbles: true }));
|
|
87
|
-
}
|
|
88
|
-
};
|
|
89
|
-
|
|
90
|
-
#onBlur = () => {
|
|
91
|
-
this.dispatchEvent(new CustomEvent('change', { bubbles: true, detail: { value: this.value } }));
|
|
92
|
-
};
|
|
93
|
-
|
|
94
|
-
#onPaste = (e) => {
|
|
95
|
-
e.preventDefault();
|
|
96
|
-
const text = e.clipboardData?.getData('text/plain') || '';
|
|
97
|
-
document.execCommand('insertText', false, text);
|
|
98
|
-
};
|
|
99
|
-
|
|
100
|
-
focus() { this.#textEl?.focus(); }
|
|
101
|
-
|
|
102
|
-
clear() {
|
|
103
|
-
this.value = '';
|
|
104
|
-
if (this.#textEl) {
|
|
105
|
-
this.#textEl.textContent = '';
|
|
106
|
-
this.#textEl.setAttribute('data-empty', '');
|
|
107
|
-
}
|
|
108
|
-
this.syncValue('');
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
disconnected() {
|
|
112
|
-
super.disconnected();
|
|
113
|
-
if (this.#textEl) {
|
|
114
|
-
this.#textEl.removeEventListener('input', this.#onInput);
|
|
115
|
-
this.#textEl.removeEventListener('keydown', this.#onKeydown);
|
|
116
|
-
this.#textEl.removeEventListener('blur', this.#onBlur);
|
|
117
|
-
this.#textEl.removeEventListener('paste', this.#onPaste);
|
|
118
|
-
}
|
|
119
|
-
this.#textEl = null;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
customElements.define('textarea-ui', UITextarea);
|
|
15
|
+
defineIfFree('textarea-ui', UITextarea);
|
|
123
16
|
|
|
124
17
|
export { UITextarea };
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Non-side-effect class export for `<timeline-ui>` (+ co-located primitives).
|
|
3
|
+
*
|
|
4
|
+
* Importing this file gives you the class(es) without auto-registering the tag.
|
|
5
|
+
* Useful for test isolation, subclassing with tag-name override, or selective
|
|
6
|
+
* composition.
|
|
7
|
+
*
|
|
8
|
+
* The auto-register path stays at `@adia-ai/web-components/components/timeline`
|
|
9
|
+
* (which imports this file + calls `defineIfFree()`).
|
|
10
|
+
*
|
|
11
|
+
* @see ../../USAGE.md#registration--auto-vs-explicit
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* <timeline-ui> — Vertical (or horizontal) event / progress log.
|
|
16
|
+
*
|
|
17
|
+
* Each <timeline-item-ui> is one entry, with its own state via the `status`
|
|
18
|
+
* enum (idle | active | completed | error), optional icon, duration, and an
|
|
19
|
+
* expandable outcomes list. `[spinner]` is an orthogonal presentation hint
|
|
20
|
+
* that animates the dot as a ring when combined with `status="active"`.
|
|
21
|
+
*
|
|
22
|
+
* <timeline-ui>
|
|
23
|
+
* <timeline-item-ui text="Shipped" time="2h ago" status="completed"></timeline-item-ui>
|
|
24
|
+
* <timeline-item-ui text="Delivery" time="now" status="active" spinner></timeline-item-ui>
|
|
25
|
+
* <timeline-item-ui text="Received"></timeline-item-ui>
|
|
26
|
+
* </timeline-ui>
|
|
27
|
+
*
|
|
28
|
+
* For agent reasoning / pipeline views, set size="sm" and use
|
|
29
|
+
* duration, outcomes, spinner, status="error"
|
|
30
|
+
*
|
|
31
|
+
* <timeline-ui size="sm">
|
|
32
|
+
* <timeline-item-ui text="search" duration="850ms" status="completed"></timeline-item-ui>
|
|
33
|
+
* <timeline-item-ui text="generate" status="active" spinner></timeline-item-ui>
|
|
34
|
+
* </timeline-ui>
|
|
35
|
+
*
|
|
36
|
+
* For wizard / numbered-circle patterns, use the dedicated <stepper-ui>.
|
|
37
|
+
*
|
|
38
|
+
* Attributes (container):
|
|
39
|
+
* orientation — vertical (default) | horizontal
|
|
40
|
+
* size — md (default) | sm
|
|
41
|
+
*
|
|
42
|
+
* Attributes (item):
|
|
43
|
+
* text — primary label
|
|
44
|
+
* description — secondary text (optional)
|
|
45
|
+
* time — right-aligned timestamp (optional; mutually exclusive with duration)
|
|
46
|
+
* duration — right-aligned duration label (e.g. "850ms", "2s"); also set when live=true
|
|
47
|
+
* icon — icon-ui name (replaces the dot when set)
|
|
48
|
+
* variant — default | success | accent | warning | danger (colors the dot/icon)
|
|
49
|
+
* completed — boolean; renders "done" state
|
|
50
|
+
* active — boolean; renders "active" state
|
|
51
|
+
* error — boolean; renders "error" state (red dot)
|
|
52
|
+
* spinner — boolean; spinning dot while active
|
|
53
|
+
*
|
|
54
|
+
* JS (item):
|
|
55
|
+
* .outcomes = string[] // renders an expandable sub-list under the row
|
|
56
|
+
*/
|
|
57
|
+
|
|
58
|
+
import { UIElement } from '../../core/element.js';
|
|
59
|
+
|
|
60
|
+
// ── Container ──────────────────────────────────────────────────
|
|
61
|
+
|
|
62
|
+
export class UITimeline extends UIElement {
|
|
63
|
+
static properties = {
|
|
64
|
+
orientation: { type: String, default: 'vertical', reflect: true },
|
|
65
|
+
size: { type: String, default: 'md', reflect: true },
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
static template = () => null;
|
|
69
|
+
|
|
70
|
+
render() {
|
|
71
|
+
const items = [...this.querySelectorAll(':scope > timeline-item-ui')];
|
|
72
|
+
for (const item of items) item.removeAttribute('data-last');
|
|
73
|
+
const last = items[items.length - 1];
|
|
74
|
+
if (last) last.setAttribute('data-last', '');
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export class UITimelineItem extends UIElement {
|
|
79
|
+
static properties = {
|
|
80
|
+
text: { type: String, default: '', reflect: true },
|
|
81
|
+
description: { type: String, default: '', reflect: true },
|
|
82
|
+
time: { type: String, default: '', reflect: true },
|
|
83
|
+
duration: { type: String, default: '', reflect: true },
|
|
84
|
+
icon: { type: String, default: '', reflect: true },
|
|
85
|
+
variant: { type: String, default: 'default', reflect: true },
|
|
86
|
+
status: { type: String, default: 'idle', reflect: true },
|
|
87
|
+
spinner: { type: Boolean, default: false, reflect: true },
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
static template = () => null;
|
|
91
|
+
|
|
92
|
+
#outcomes = [];
|
|
93
|
+
#expanded = false;
|
|
94
|
+
|
|
95
|
+
get outcomes() { return this.#outcomes; }
|
|
96
|
+
set outcomes(v) {
|
|
97
|
+
this.#outcomes = Array.isArray(v) ? v.slice() : [];
|
|
98
|
+
this.render();
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
connected() {
|
|
102
|
+
if (!this.querySelector(':scope > [slot="label"]')) {
|
|
103
|
+
// Author provided just text/time — stamp the default slot structure
|
|
104
|
+
this.innerHTML = `
|
|
105
|
+
<span slot="label"></span>
|
|
106
|
+
<span slot="description"></span>
|
|
107
|
+
<span slot="time"></span>
|
|
108
|
+
`;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
render() {
|
|
113
|
+
const label = this.querySelector(':scope > [slot="label"]');
|
|
114
|
+
const desc = this.querySelector(':scope > [slot="description"]');
|
|
115
|
+
const time = this.querySelector(':scope > [slot="time"]');
|
|
116
|
+
if (label) label.textContent = this.text;
|
|
117
|
+
if (desc) desc.textContent = this.description;
|
|
118
|
+
if (time) time.textContent = this.duration || this.time;
|
|
119
|
+
|
|
120
|
+
if (this.icon) {
|
|
121
|
+
let iconEl = this.querySelector(':scope > [slot="icon"]');
|
|
122
|
+
if (!iconEl) {
|
|
123
|
+
iconEl = document.createElement('icon-ui');
|
|
124
|
+
iconEl.setAttribute('slot', 'icon');
|
|
125
|
+
this.prepend(iconEl);
|
|
126
|
+
}
|
|
127
|
+
iconEl.setAttribute('name', this.icon);
|
|
128
|
+
} else {
|
|
129
|
+
this.querySelector(':scope > [slot="icon"]')?.remove();
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Outcomes sub-list + toggle chevron
|
|
133
|
+
let body = this.querySelector(':scope > [slot="outcomes"]');
|
|
134
|
+
if (this.#outcomes.length > 0) {
|
|
135
|
+
if (!body) {
|
|
136
|
+
body = document.createElement('ul');
|
|
137
|
+
body.setAttribute('slot', 'outcomes');
|
|
138
|
+
this.appendChild(body);
|
|
139
|
+
}
|
|
140
|
+
body.innerHTML = '';
|
|
141
|
+
for (const o of this.#outcomes) {
|
|
142
|
+
const li = document.createElement('li');
|
|
143
|
+
li.textContent = o;
|
|
144
|
+
body.appendChild(li);
|
|
145
|
+
}
|
|
146
|
+
body.hidden = !this.#expanded;
|
|
147
|
+
|
|
148
|
+
// Toggle chevron lives on the row — we stamp a button once
|
|
149
|
+
let toggle = this.querySelector(':scope > [data-timeline-toggle]');
|
|
150
|
+
if (!toggle) {
|
|
151
|
+
toggle = document.createElement('button');
|
|
152
|
+
toggle.type = 'button';
|
|
153
|
+
toggle.setAttribute('data-timeline-toggle', '');
|
|
154
|
+
toggle.setAttribute('aria-label', 'Toggle details');
|
|
155
|
+
toggle.addEventListener('click', (e) => {
|
|
156
|
+
e.stopPropagation();
|
|
157
|
+
this.#expanded = !this.#expanded;
|
|
158
|
+
this.render();
|
|
159
|
+
this.dispatchEvent(new CustomEvent('timeline-toggle', {
|
|
160
|
+
bubbles: true, detail: { expanded: this.#expanded },
|
|
161
|
+
}));
|
|
162
|
+
});
|
|
163
|
+
this.appendChild(toggle);
|
|
164
|
+
}
|
|
165
|
+
toggle.innerHTML = '';
|
|
166
|
+
const caret = document.createElement('icon-ui');
|
|
167
|
+
caret.setAttribute('name', this.#expanded ? 'caret-down' : 'caret-right');
|
|
168
|
+
caret.setAttribute('color', 'muted');
|
|
169
|
+
caret.setAttribute('size', 'sm');
|
|
170
|
+
toggle.appendChild(caret);
|
|
171
|
+
} else {
|
|
172
|
+
this.querySelector(':scope > [data-timeline-toggle]')?.remove();
|
|
173
|
+
body?.remove();
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<timeline-ui>` — Timeline and step wizard. Two modes: timeline (per-item state) and steps (parent-driven).
|
|
3
|
+
*
|
|
4
|
+
* @see https://ui-kit.exe.xyz/site/components/timeline
|
|
5
|
+
*
|
|
6
|
+
* Type declarations generated by scripts/build/dts-codegen.mjs from
|
|
7
|
+
* the component's `.a2ui.json` sidecar. Edit the source `.yaml`,
|
|
8
|
+
* run `npm run 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 UITimeline extends UIElement {
|
|
15
|
+
/** Layout direction */
|
|
16
|
+
orientation: 'vertical' | 'horizontal';
|
|
17
|
+
/** Rail size preset — use `sm` for agent-reasoning/pipeline views; `md` is the default. */
|
|
18
|
+
size: 'sm' | 'md';
|
|
19
|
+
}
|