@adia-ai/web-components 0.4.5 → 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/README.md +63 -24
- package/USAGE.md +604 -0
- 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.d.ts +27 -0
- 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.d.ts +30 -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.d.ts +39 -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.d.ts +37 -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/index.js +1 -0
- package/components/input/class.js +773 -0
- package/components/input/input.a2ui.json +3 -0
- package/components/input/input.d.ts +61 -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.d.ts +30 -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.d.ts +25 -0
- 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.css +10 -0
- package/components/pane/pane.d.ts +31 -0
- package/components/pane/pane.js +8 -143
- 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.d.ts +28 -0
- package/components/radio/radio.js +11 -67
- package/components/range/class.js +194 -0
- package/components/range/range.d.ts +31 -0
- package/components/range/range.js +9 -176
- package/components/rating/class.js +148 -0
- package/components/rating/rating.d.ts +33 -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.d.ts +35 -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.d.ts +24 -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.d.ts +57 -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.d.ts +31 -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.d.ts +30 -0
- 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.d.ts +31 -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.a2ui.json +197 -0
- package/components/toggle-scheme/toggle-scheme.css +20 -0
- package/components/toggle-scheme/toggle-scheme.d.ts +41 -0
- package/components/toggle-scheme/toggle-scheme.js +17 -0
- package/components/toggle-scheme/toggle-scheme.yaml +173 -0
- 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.d.ts +27 -0
- package/components/upload/upload.js +11 -183
- package/core/element.d.ts +174 -0
- package/core/form.d.ts +108 -0
- package/core/index.d.ts +11 -0
- package/core/index.js +1 -0
- package/core/register.d.ts +25 -0
- package/core/register.js +58 -0
- package/core/signals.d.ts +94 -0
- package/core/template.d.ts +70 -0
- package/index.d.ts +315 -0
- package/package.json +25 -6
- package/traits/CATEGORIES.md +1 -1
|
@@ -1,122 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* <a href="/"><icon-ui name="house"></icon-ui></a>
|
|
4
|
-
* <a href="#">Workspace</a>
|
|
5
|
-
* <span>Current page</span>
|
|
6
|
-
* </breadcrumb-ui>
|
|
2
|
+
* `<breadcrumb-ui>` — auto-registers the tag on import.
|
|
7
3
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
4
|
+
* For non-side-effect class import (test isolation, tag override), use
|
|
5
|
+
* the `class` subpath:
|
|
10
6
|
*
|
|
11
|
-
*
|
|
12
|
-
* • Default — text-only crumbs
|
|
13
|
-
* • Icon-leading — first child is `<icon-ui>` (or a link wrapping one)
|
|
14
|
-
* • Collapsed — `[collapse]` hides middle crumbs into a `…` overflow
|
|
15
|
-
* popover; keeps `[collapse-keep-leading]` (default 1) and
|
|
16
|
-
* `[collapse-keep-trailing]` (default 2) visible at the edges.
|
|
7
|
+
* import { UIBreadcrumb } from '@adia-ai/web-components/components/breadcrumb/class';
|
|
17
8
|
*
|
|
18
|
-
*
|
|
19
|
-
* z-index battles inside scrolling containers).
|
|
9
|
+
* @see ../../USAGE.md#registration--auto-vs-explicit
|
|
20
10
|
*/
|
|
21
11
|
|
|
22
|
-
import {
|
|
12
|
+
import { defineIfFree } from '../../core/register.js';
|
|
13
|
+
import { UIBreadcrumb } from './class.js';
|
|
23
14
|
|
|
24
|
-
|
|
25
|
-
static properties = {
|
|
26
|
-
separator: { type: String, default: '/', reflect: true },
|
|
27
|
-
collapse: { type: Boolean, default: false, reflect: true },
|
|
28
|
-
collapseKeepLeading: { type: Number, default: 1, attribute: 'collapse-keep-leading', reflect: true },
|
|
29
|
-
collapseKeepTrailing: { type: Number, default: 2, attribute: 'collapse-keep-trailing', reflect: true },
|
|
30
|
-
};
|
|
15
|
+
defineIfFree('breadcrumb-ui', UIBreadcrumb);
|
|
31
16
|
|
|
32
|
-
static template = () => null;
|
|
33
|
-
|
|
34
|
-
connected() {
|
|
35
|
-
this.setAttribute('role', 'navigation');
|
|
36
|
-
this.setAttribute('aria-label', 'Breadcrumb');
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
render() {
|
|
40
|
-
// Strip prior chrome so render is idempotent across attribute changes.
|
|
41
|
-
this.querySelectorAll('[data-sep], [data-overflow]').forEach(el => el.remove());
|
|
42
|
-
|
|
43
|
-
const items = Array.from(this.children).filter(c =>
|
|
44
|
-
!c.hasAttribute('data-sep') && !c.hasAttribute('data-overflow')
|
|
45
|
-
);
|
|
46
|
-
const last = items.length - 1;
|
|
47
|
-
|
|
48
|
-
// Reset per-item chrome
|
|
49
|
-
items.forEach((child, i) => {
|
|
50
|
-
child.setAttribute('data-item', '');
|
|
51
|
-
child.removeAttribute('data-collapsed');
|
|
52
|
-
if (i === last) child.setAttribute('aria-current', 'page');
|
|
53
|
-
else child.removeAttribute('aria-current');
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
const keepLeading = Math.max(0, this.collapseKeepLeading | 0);
|
|
57
|
-
const keepTrailing = Math.max(0, this.collapseKeepTrailing | 0);
|
|
58
|
-
const minLen = keepLeading + keepTrailing + 1;
|
|
59
|
-
const shouldCollapse = this.collapse && items.length >= Math.max(minLen, 4);
|
|
60
|
-
|
|
61
|
-
if (shouldCollapse) {
|
|
62
|
-
const collapsed = items.slice(keepLeading, items.length - keepTrailing);
|
|
63
|
-
collapsed.forEach(el => el.setAttribute('data-collapsed', ''));
|
|
64
|
-
|
|
65
|
-
const overflow = this.#buildOverflow(collapsed);
|
|
66
|
-
if (keepLeading > 0) items[keepLeading - 1].after(overflow);
|
|
67
|
-
else this.prepend(overflow);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
// Stamp separators between every consecutive visible sibling.
|
|
71
|
-
const visible = Array.from(this.children).filter(c =>
|
|
72
|
-
!c.hasAttribute('data-sep') && !c.hasAttribute('data-collapsed')
|
|
73
|
-
);
|
|
74
|
-
for (let i = 0; i < visible.length - 1; i++) {
|
|
75
|
-
const sep = document.createElement('span');
|
|
76
|
-
sep.setAttribute('data-sep', '');
|
|
77
|
-
sep.setAttribute('aria-hidden', 'true');
|
|
78
|
-
sep.textContent = this.separator;
|
|
79
|
-
visible[i].after(sep);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
#buildOverflow(collapsedItems) {
|
|
84
|
-
// Use <menu-ui> as the canonical popover-list primitive — same surface
|
|
85
|
-
// tokens as select-ui's listbox + menu-ui's action menu, with keyboard
|
|
86
|
-
// nav, top-layer rendering, and anchor positioning for free.
|
|
87
|
-
const menu = document.createElement('menu-ui');
|
|
88
|
-
menu.setAttribute('data-overflow', '');
|
|
89
|
-
menu.setAttribute('data-item', '');
|
|
90
|
-
menu.setAttribute('placement', 'bottom-start');
|
|
91
|
-
|
|
92
|
-
const trigger = document.createElement('button-ui');
|
|
93
|
-
trigger.setAttribute('slot', 'trigger');
|
|
94
|
-
trigger.setAttribute('text', '…');
|
|
95
|
-
trigger.setAttribute('variant', 'ghost');
|
|
96
|
-
trigger.setAttribute('size', 'sm');
|
|
97
|
-
trigger.setAttribute('aria-label', 'Show collapsed crumbs');
|
|
98
|
-
menu.appendChild(trigger);
|
|
99
|
-
|
|
100
|
-
for (const item of collapsedItems) {
|
|
101
|
-
const mi = document.createElement('menu-item-ui');
|
|
102
|
-
mi.setAttribute('text', item.textContent.trim());
|
|
103
|
-
// Encode the link target as the menu-item value; navigated on action.
|
|
104
|
-
if (item.tagName === 'A' && item.hasAttribute('href')) {
|
|
105
|
-
mi.setAttribute('value', item.getAttribute('href'));
|
|
106
|
-
}
|
|
107
|
-
menu.appendChild(mi);
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
// menu-ui dispatches `action` with `detail: { value, text }` on item
|
|
111
|
-
// activation. Navigate to the encoded href; ignore placeholder `#`.
|
|
112
|
-
menu.addEventListener('action', (e) => {
|
|
113
|
-
const href = e.detail?.value;
|
|
114
|
-
if (href && href !== '#') window.location.href = href;
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
return menu;
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
customElements.define('breadcrumb-ui', UIBreadcrumb);
|
|
122
17
|
export { UIBreadcrumb };
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Non-side-effect class export for `<breadcrumb-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/breadcrumb`
|
|
9
|
+
* (which imports this file + calls `defineIfFree()`).
|
|
10
|
+
*
|
|
11
|
+
* @see ../../USAGE.md#registration--auto-vs-explicit
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* <breadcrumb-ui separator="/">
|
|
16
|
+
* <a href="/"><icon-ui name="house"></icon-ui></a>
|
|
17
|
+
* <a href="#">Workspace</a>
|
|
18
|
+
* <span>Current page</span>
|
|
19
|
+
* </breadcrumb-ui>
|
|
20
|
+
*
|
|
21
|
+
* Trail with auto-inserted separators. Items can be plain elements or
|
|
22
|
+
* `<a href>` links; the last item is marked `aria-current="page"`.
|
|
23
|
+
*
|
|
24
|
+
* Variants:
|
|
25
|
+
* • Default — text-only crumbs
|
|
26
|
+
* • Icon-leading — first child is `<icon-ui>` (or a link wrapping one)
|
|
27
|
+
* • Collapsed — `[collapse]` hides middle crumbs into a `…` overflow
|
|
28
|
+
* popover; keeps `[collapse-keep-leading]` (default 1) and
|
|
29
|
+
* `[collapse-keep-trailing]` (default 2) visible at the edges.
|
|
30
|
+
*
|
|
31
|
+
* The overflow uses `<popover-ui>` so it rides the top-layer (no
|
|
32
|
+
* z-index battles inside scrolling containers).
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
import { UIElement } from '../../core/element.js';
|
|
36
|
+
|
|
37
|
+
export class UIBreadcrumb extends UIElement {
|
|
38
|
+
static properties = {
|
|
39
|
+
separator: { type: String, default: '/', reflect: true },
|
|
40
|
+
collapse: { type: Boolean, default: false, reflect: true },
|
|
41
|
+
collapseKeepLeading: { type: Number, default: 1, attribute: 'collapse-keep-leading', reflect: true },
|
|
42
|
+
collapseKeepTrailing: { type: Number, default: 2, attribute: 'collapse-keep-trailing', reflect: true },
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
static template = () => null;
|
|
46
|
+
|
|
47
|
+
connected() {
|
|
48
|
+
this.setAttribute('role', 'navigation');
|
|
49
|
+
this.setAttribute('aria-label', 'Breadcrumb');
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
render() {
|
|
53
|
+
// Strip prior chrome so render is idempotent across attribute changes.
|
|
54
|
+
this.querySelectorAll('[data-sep], [data-overflow]').forEach(el => el.remove());
|
|
55
|
+
|
|
56
|
+
const items = Array.from(this.children).filter(c =>
|
|
57
|
+
!c.hasAttribute('data-sep') && !c.hasAttribute('data-overflow')
|
|
58
|
+
);
|
|
59
|
+
const last = items.length - 1;
|
|
60
|
+
|
|
61
|
+
// Reset per-item chrome
|
|
62
|
+
items.forEach((child, i) => {
|
|
63
|
+
child.setAttribute('data-item', '');
|
|
64
|
+
child.removeAttribute('data-collapsed');
|
|
65
|
+
if (i === last) child.setAttribute('aria-current', 'page');
|
|
66
|
+
else child.removeAttribute('aria-current');
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
const keepLeading = Math.max(0, this.collapseKeepLeading | 0);
|
|
70
|
+
const keepTrailing = Math.max(0, this.collapseKeepTrailing | 0);
|
|
71
|
+
const minLen = keepLeading + keepTrailing + 1;
|
|
72
|
+
const shouldCollapse = this.collapse && items.length >= Math.max(minLen, 4);
|
|
73
|
+
|
|
74
|
+
if (shouldCollapse) {
|
|
75
|
+
const collapsed = items.slice(keepLeading, items.length - keepTrailing);
|
|
76
|
+
collapsed.forEach(el => el.setAttribute('data-collapsed', ''));
|
|
77
|
+
|
|
78
|
+
const overflow = this.#buildOverflow(collapsed);
|
|
79
|
+
if (keepLeading > 0) items[keepLeading - 1].after(overflow);
|
|
80
|
+
else this.prepend(overflow);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Stamp separators between every consecutive visible sibling.
|
|
84
|
+
const visible = Array.from(this.children).filter(c =>
|
|
85
|
+
!c.hasAttribute('data-sep') && !c.hasAttribute('data-collapsed')
|
|
86
|
+
);
|
|
87
|
+
for (let i = 0; i < visible.length - 1; i++) {
|
|
88
|
+
const sep = document.createElement('span');
|
|
89
|
+
sep.setAttribute('data-sep', '');
|
|
90
|
+
sep.setAttribute('aria-hidden', 'true');
|
|
91
|
+
sep.textContent = this.separator;
|
|
92
|
+
visible[i].after(sep);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
#buildOverflow(collapsedItems) {
|
|
97
|
+
// Use <menu-ui> as the canonical popover-list primitive — same surface
|
|
98
|
+
// tokens as select-ui's listbox + menu-ui's action menu, with keyboard
|
|
99
|
+
// nav, top-layer rendering, and anchor positioning for free.
|
|
100
|
+
const menu = document.createElement('menu-ui');
|
|
101
|
+
menu.setAttribute('data-overflow', '');
|
|
102
|
+
menu.setAttribute('data-item', '');
|
|
103
|
+
menu.setAttribute('placement', 'bottom-start');
|
|
104
|
+
|
|
105
|
+
const trigger = document.createElement('button-ui');
|
|
106
|
+
trigger.setAttribute('slot', 'trigger');
|
|
107
|
+
trigger.setAttribute('text', '…');
|
|
108
|
+
trigger.setAttribute('variant', 'ghost');
|
|
109
|
+
trigger.setAttribute('size', 'sm');
|
|
110
|
+
trigger.setAttribute('aria-label', 'Show collapsed crumbs');
|
|
111
|
+
menu.appendChild(trigger);
|
|
112
|
+
|
|
113
|
+
for (const item of collapsedItems) {
|
|
114
|
+
const mi = document.createElement('menu-item-ui');
|
|
115
|
+
mi.setAttribute('text', item.textContent.trim());
|
|
116
|
+
// Encode the link target as the menu-item value; navigated on action.
|
|
117
|
+
if (item.tagName === 'A' && item.hasAttribute('href')) {
|
|
118
|
+
mi.setAttribute('value', item.getAttribute('href'));
|
|
119
|
+
}
|
|
120
|
+
menu.appendChild(mi);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// menu-ui dispatches `action` with `detail: { value, text }` on item
|
|
124
|
+
// activation. Navigate to the encoded href; ignore placeholder `#`.
|
|
125
|
+
menu.addEventListener('action', (e) => {
|
|
126
|
+
const href = e.detail?.value;
|
|
127
|
+
if (href && href !== '#') window.location.href = href;
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
return menu;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<button-ui>` — Clickable button with text, icon, and variant support. Supports submit type for forms.
|
|
3
|
+
*
|
|
4
|
+
* @see https://ui-kit.exe.xyz/site/components/button
|
|
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 UIButton extends UIElement {
|
|
15
|
+
/** HTML button type (button, submit, reset) */
|
|
16
|
+
type: string;
|
|
17
|
+
/** Semantic intent — composes with [variant]. `<button-ui variant="solid" color="danger">` = filled destructive action; `<button-ui variant="outline" color="success">` = outlined success affordance. */
|
|
18
|
+
color: 'default' | 'accent' | 'info' | 'success' | 'warning' | 'danger';
|
|
19
|
+
/** Disables interaction and prevents click/press events */
|
|
20
|
+
disabled: boolean;
|
|
21
|
+
/** Leading Phosphor icon name (rendered before text). */
|
|
22
|
+
icon: string;
|
|
23
|
+
/** Sizing scale (xs/sm/md/lg/xl). */
|
|
24
|
+
size: 'xs' | 'sm' | 'md' | 'lg' | 'xl';
|
|
25
|
+
/** Makes the button stretch to fill the parent's width */
|
|
26
|
+
stretch: boolean;
|
|
27
|
+
/** Button text, rendered via CSS attr(text) on ::after */
|
|
28
|
+
text: string;
|
|
29
|
+
/** Button label. Renderer routes this to the `text` attribute, which is rendered via CSS attr(text) on ::after and mirrored to aria-label. */
|
|
30
|
+
textContent: string;
|
|
31
|
+
/** Visual style — `solid` (default fill), `outline`, `ghost`. `default` / `primary` are aliases of `solid`. Style is independent of semantic intent — to express destructive / success / info / warning intent, set [color="…"] alongside.
|
|
32
|
+
For **inline navigation** (Terms of Service, Privacy Policy, footer links, "Sign in" / "Sign up" cross-page affordances) use `<link-ui>` instead — it carries proper `<a href>` semantics, keyboard handling (Enter only, no Space), middle-click open-new-tab, and screen-reader announces "link" instead of "button". Mixing navigation and action affordances under the same primitive is a category error fixed at this junction. */
|
|
33
|
+
variant: 'default' | 'solid' | 'outline' | 'ghost' | 'primary' | 'secondary' | 'soft' | 'current';
|
|
34
|
+
}
|
|
@@ -1,68 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
class
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
static template = () => null;
|
|
18
|
-
|
|
19
|
-
connected() {
|
|
20
|
-
this.setAttribute('role', 'button');
|
|
21
|
-
this.setAttribute('tabindex', '0');
|
|
22
|
-
this.addEventListener('click', this.#onClick);
|
|
23
|
-
this.addEventListener('keydown', this.#onKey);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
render() {
|
|
27
|
-
// Don't clobber a user-provided aria-label with an empty string when
|
|
28
|
-
// text is unset (e.g. icon-only button with author-set aria-label).
|
|
29
|
-
// Only auto-set when we have meaningful text to put there.
|
|
30
|
-
if (this.text) this.setAttribute('aria-label', this.text);
|
|
31
|
-
if (this.icon) {
|
|
32
|
-
const existing = this.querySelector('icon-ui');
|
|
33
|
-
if (!existing || existing.name !== this.icon) {
|
|
34
|
-
if (existing) existing.remove();
|
|
35
|
-
const iconEl = document.createElement('icon-ui');
|
|
36
|
-
iconEl.setAttribute('name', this.icon);
|
|
37
|
-
this.prepend(iconEl);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
#onClick = (e) => {
|
|
43
|
-
if (this.disabled) { e.stopPropagation(); return; }
|
|
44
|
-
if (this.type === 'submit') {
|
|
45
|
-
const form = this.closest('form');
|
|
46
|
-
if (form?.requestSubmit) form.requestSubmit();
|
|
47
|
-
} else if (this.type === 'reset') {
|
|
48
|
-
const form = this.closest('form');
|
|
49
|
-
if (form?.reset) form.reset();
|
|
50
|
-
}
|
|
51
|
-
this.dispatchEvent(new Event('press', { bubbles: true }));
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
#onKey = (e) => {
|
|
55
|
-
if (e.key === 'Enter' || e.key === ' ') {
|
|
56
|
-
e.preventDefault();
|
|
57
|
-
this.click();
|
|
58
|
-
}
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
disconnected() {
|
|
62
|
-
this.removeEventListener('click', this.#onClick);
|
|
63
|
-
this.removeEventListener('keydown', this.#onKey);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
customElements.define('button-ui', UIButton);
|
|
1
|
+
/**
|
|
2
|
+
* `<button-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 { UIButton } from '@adia-ai/web-components/components/button/class';
|
|
8
|
+
*
|
|
9
|
+
* @see ../../USAGE.md#registration--auto-vs-explicit
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { defineIfFree } from '../../core/register.js';
|
|
13
|
+
import { UIButton } from './class.js';
|
|
14
|
+
|
|
15
|
+
defineIfFree('button-ui', UIButton);
|
|
67
16
|
|
|
68
17
|
export { UIButton };
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `UIButton` class — non-side-effect export.
|
|
3
|
+
*
|
|
4
|
+
* Importing this file gives you the class without auto-registering the
|
|
5
|
+
* tag. Useful for:
|
|
6
|
+
* - Test isolation (register under a different tag in a test)
|
|
7
|
+
* - Subclassing with tag-name override
|
|
8
|
+
* - Tree-shaking-conscious bundles that compose primitives selectively
|
|
9
|
+
*
|
|
10
|
+
* The auto-register path stays at `@adia-ai/web-components/components/button`
|
|
11
|
+
* (which imports this file + calls `customElements.define`).
|
|
12
|
+
*
|
|
13
|
+
* @see ../../USAGE.md#registration--auto-vs-explicit
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { UIElement, signal, html } from '../../core/element.js';
|
|
17
|
+
import { getIcon } from '../../core/icons.js';
|
|
18
|
+
|
|
19
|
+
export class UIButton extends UIElement {
|
|
20
|
+
static properties = {
|
|
21
|
+
text: { type: String, default: '', reflect: true },
|
|
22
|
+
textContent: { type: String, default: '' },
|
|
23
|
+
variant: { type: String, default: 'solid', reflect: true },
|
|
24
|
+
color: { type: String, default: '', reflect: true },
|
|
25
|
+
size: { type: String, default: 'md', reflect: true },
|
|
26
|
+
disabled: { type: Boolean, default: false, reflect: true },
|
|
27
|
+
stretch: { type: Boolean, default: false, reflect: true },
|
|
28
|
+
icon: { type: String, default: '', reflect: true },
|
|
29
|
+
type: { type: String, default: 'button', reflect: true },
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
static template = () => null;
|
|
33
|
+
|
|
34
|
+
connected() {
|
|
35
|
+
this.setAttribute('role', 'button');
|
|
36
|
+
this.setAttribute('tabindex', '0');
|
|
37
|
+
this.addEventListener('click', this.#onClick);
|
|
38
|
+
this.addEventListener('keydown', this.#onKey);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
render() {
|
|
42
|
+
// Don't clobber a user-provided aria-label with an empty string when
|
|
43
|
+
// text is unset (e.g. icon-only button with author-set aria-label).
|
|
44
|
+
// Only auto-set when we have meaningful text to put there.
|
|
45
|
+
if (this.text) this.setAttribute('aria-label', this.text);
|
|
46
|
+
if (this.icon) {
|
|
47
|
+
const existing = this.querySelector('icon-ui');
|
|
48
|
+
if (!existing || existing.name !== this.icon) {
|
|
49
|
+
if (existing) existing.remove();
|
|
50
|
+
const iconEl = document.createElement('icon-ui');
|
|
51
|
+
iconEl.setAttribute('name', this.icon);
|
|
52
|
+
this.prepend(iconEl);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
#onClick = (e) => {
|
|
58
|
+
if (this.disabled) { e.stopPropagation(); return; }
|
|
59
|
+
if (this.type === 'submit') {
|
|
60
|
+
const form = this.closest('form');
|
|
61
|
+
if (form?.requestSubmit) form.requestSubmit();
|
|
62
|
+
} else if (this.type === 'reset') {
|
|
63
|
+
const form = this.closest('form');
|
|
64
|
+
if (form?.reset) form.reset();
|
|
65
|
+
}
|
|
66
|
+
this.dispatchEvent(new Event('press', { bubbles: true }));
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
#onKey = (e) => {
|
|
70
|
+
if (e.key === 'Enter' || e.key === ' ') {
|
|
71
|
+
e.preventDefault();
|
|
72
|
+
this.click();
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
disconnected() {
|
|
77
|
+
this.removeEventListener('click', this.#onClick);
|
|
78
|
+
this.removeEventListener('keydown', this.#onKey);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<calendar-picker-ui>` — Date picker with popover-anchored calendar grid.
|
|
3
|
+
*
|
|
4
|
+
* @see https://ui-kit.exe.xyz/site/components/calendar-picker
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { UIFormElement } from '../../core/form.js';
|
|
8
|
+
|
|
9
|
+
export interface CalendarPickerChangeEventDetail {
|
|
10
|
+
/** Selected date in ISO-8601 form (e.g. `"2026-05-12"`). */
|
|
11
|
+
value: string;
|
|
12
|
+
}
|
|
13
|
+
export type CalendarPickerChangeEvent = CustomEvent<CalendarPickerChangeEventDetail>;
|
|
14
|
+
|
|
15
|
+
export class UICalendarPicker extends UIFormElement {
|
|
16
|
+
/** ISO-date string of the selected day. */
|
|
17
|
+
value: string;
|
|
18
|
+
/** Open/closed reflected state. */
|
|
19
|
+
open: boolean;
|
|
20
|
+
|
|
21
|
+
addEventListener<K extends keyof HTMLElementEventMap>(
|
|
22
|
+
type: K,
|
|
23
|
+
listener: (this: UICalendarPicker, ev: HTMLElementEventMap[K]) => unknown,
|
|
24
|
+
options?: boolean | AddEventListenerOptions,
|
|
25
|
+
): void;
|
|
26
|
+
addEventListener(type: 'change', listener: (ev: CalendarPickerChangeEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
|
|
27
|
+
}
|