@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
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Non-side-effect class export for `<nav-group-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/nav-group`
|
|
9
|
+
* (which imports this file + calls `defineIfFree()`).
|
|
10
|
+
*
|
|
11
|
+
* @see ../../USAGE.md#registration--auto-vs-explicit
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* <nav-group-ui> — Collapsible labeled group of nav items inside <nav-ui>.
|
|
16
|
+
*
|
|
17
|
+
* Consolidates the prior `app-nav-group-ui` + `section-nav-group-ui`
|
|
18
|
+
* per ADR-0015 § Nav consolidation. Behavior is unified; the parent
|
|
19
|
+
* <nav-ui>'s [variant] drives the visual treatment.
|
|
20
|
+
*
|
|
21
|
+
* Has icon, label, optional badge, and a caret indicating open/closed.
|
|
22
|
+
* When the parent <nav-ui> is collapsed (primary variant), clicking the
|
|
23
|
+
* group opens a popover with its children instead of toggling inline
|
|
24
|
+
* expansion. When [collapsible] (or always for primary variant), inline
|
|
25
|
+
* click + keyboard toggle is supported.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
import { UIElement } from '../../core/element.js';
|
|
29
|
+
import { anchorPopover } from '../../core/anchor.js';
|
|
30
|
+
|
|
31
|
+
export class UINavGroup extends UIElement {
|
|
32
|
+
static properties = {
|
|
33
|
+
text: { type: String, default: '', reflect: true },
|
|
34
|
+
icon: { type: String, default: '', reflect: true },
|
|
35
|
+
badge: { type: String, default: '', reflect: true },
|
|
36
|
+
open: { type: Boolean, default: false, reflect: true },
|
|
37
|
+
collapsible: { type: Boolean, default: true, reflect: true },
|
|
38
|
+
variant: { type: String, default: '', reflect: true },
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
static template = () => null;
|
|
42
|
+
|
|
43
|
+
#popover = null;
|
|
44
|
+
#anchorCleanup = null;
|
|
45
|
+
#headerEl = null;
|
|
46
|
+
|
|
47
|
+
#onHeaderKey = (e) => {
|
|
48
|
+
if (!this.collapsible) return;
|
|
49
|
+
if (e.key === 'Enter' || e.key === ' ') {
|
|
50
|
+
e.preventDefault();
|
|
51
|
+
this.open = !this.open;
|
|
52
|
+
this.dispatchEvent(new CustomEvent('group-toggle', {
|
|
53
|
+
bubbles: true,
|
|
54
|
+
detail: { text: this.text, open: this.open },
|
|
55
|
+
}));
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
connected() {
|
|
60
|
+
this.setAttribute('role', 'group');
|
|
61
|
+
|
|
62
|
+
if (!this.querySelector(':scope > [slot="header"]')) {
|
|
63
|
+
this.#headerEl = document.createElement('div');
|
|
64
|
+
this.#headerEl.setAttribute('slot', 'header');
|
|
65
|
+
this.#headerEl.setAttribute('tabindex', '0');
|
|
66
|
+
this.#headerEl.innerHTML = `
|
|
67
|
+
<span slot="icon">${this.icon ? `<icon-ui name="${this.icon}"></icon-ui>` : ''}</span>
|
|
68
|
+
<span slot="text">${this.text}</span>
|
|
69
|
+
${this.badge ? `<span slot="badge">${this.badge}</span>` : ''}
|
|
70
|
+
<icon-ui slot="caret" name="caret-right"></icon-ui>
|
|
71
|
+
`;
|
|
72
|
+
this.prepend(this.#headerEl);
|
|
73
|
+
} else {
|
|
74
|
+
this.#headerEl = this.querySelector(':scope > [slot="header"]');
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
this.#headerEl?.addEventListener('keydown', this.#onHeaderKey);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
render() {
|
|
81
|
+
const textEl = this.querySelector('[slot="header"] [slot="text"]');
|
|
82
|
+
if (textEl) textEl.textContent = this.text;
|
|
83
|
+
|
|
84
|
+
const badgeEl = this.querySelector('[slot="header"] [slot="badge"]');
|
|
85
|
+
if (badgeEl) badgeEl.textContent = this.badge;
|
|
86
|
+
|
|
87
|
+
this.setAttribute('aria-expanded', String(this.open));
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
showPopover() {
|
|
91
|
+
if (!this.#popover) {
|
|
92
|
+
this.#popover = document.createElement('div');
|
|
93
|
+
this.#popover.setAttribute('slot', 'popover');
|
|
94
|
+
this.#popover.setAttribute('popover', 'auto');
|
|
95
|
+
|
|
96
|
+
const label = document.createElement('div');
|
|
97
|
+
label.setAttribute('slot', 'popover-label');
|
|
98
|
+
label.textContent = this.text;
|
|
99
|
+
this.#popover.appendChild(label);
|
|
100
|
+
|
|
101
|
+
for (const child of this.querySelectorAll(':scope > nav-item-ui')) {
|
|
102
|
+
const opt = document.createElement('div');
|
|
103
|
+
opt.setAttribute('role', 'option');
|
|
104
|
+
opt.dataset.sourceValue = child.getAttribute('value') || '';
|
|
105
|
+
opt.textContent = child.text;
|
|
106
|
+
opt.addEventListener('click', () => {
|
|
107
|
+
const nav = this.closest('nav-ui');
|
|
108
|
+
if (nav) nav.select(child);
|
|
109
|
+
this.#popover.hidePopover();
|
|
110
|
+
});
|
|
111
|
+
this.#popover.appendChild(opt);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
this.appendChild(this.#popover);
|
|
115
|
+
|
|
116
|
+
this.#popover.addEventListener('toggle', (e) => {
|
|
117
|
+
if (e.newState === 'closed') {
|
|
118
|
+
this.#anchorCleanup?.();
|
|
119
|
+
this.#anchorCleanup = null;
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
for (const opt of this.#popover.querySelectorAll('[role="option"]')) {
|
|
125
|
+
const srcValue = opt.dataset.sourceValue;
|
|
126
|
+
const src = srcValue
|
|
127
|
+
? this.querySelector(`:scope > nav-item-ui[value="${srcValue}"]`)
|
|
128
|
+
: null;
|
|
129
|
+
if (src?.hasAttribute('selected')) {
|
|
130
|
+
opt.setAttribute('aria-current', 'page');
|
|
131
|
+
opt.setAttribute('aria-selected', 'true');
|
|
132
|
+
} else {
|
|
133
|
+
opt.removeAttribute('aria-current');
|
|
134
|
+
opt.removeAttribute('aria-selected');
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
this.#popover.showPopover();
|
|
139
|
+
|
|
140
|
+
this.#anchorCleanup?.();
|
|
141
|
+
this.#anchorCleanup = anchorPopover(this, this.#popover, {
|
|
142
|
+
placement: 'right', gap: 4,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
disconnected() {
|
|
147
|
+
this.#headerEl?.removeEventListener('keydown', this.#onHeaderKey);
|
|
148
|
+
this.#anchorCleanup?.();
|
|
149
|
+
this.#anchorCleanup = null;
|
|
150
|
+
this.#popover?.hidePopover?.();
|
|
151
|
+
}
|
|
152
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<nav-group-ui>` — Collapsible labeled group of <nav-item-ui> children inside <nav-ui>.
|
|
3
|
+
Consolidates the prior `app-nav-group-ui` + `section-nav-group-ui`
|
|
4
|
+
per ADR-0015 § Nav consolidation.
|
|
5
|
+
|
|
6
|
+
When the parent <nav-ui> is collapsed (primary variant), clicking the
|
|
7
|
+
group opens a popover with its children instead of toggling inline
|
|
8
|
+
expansion. Inline click + keyboard (Enter/Space) toggle is supported
|
|
9
|
+
when [collapsible] (default true).
|
|
10
|
+
|
|
11
|
+
*
|
|
12
|
+
* @see https://ui-kit.exe.xyz/site/components/nav-group
|
|
13
|
+
*
|
|
14
|
+
* Type declarations generated by scripts/build/dts-codegen.mjs from
|
|
15
|
+
* the component's `.a2ui.json` sidecar. Edit the source `.yaml`,
|
|
16
|
+
* run `npm run components`, then `npm run codegen:dts` to regenerate;
|
|
17
|
+
* or hand-author this file fully if rich event types are needed.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { UIElement } from '../../core/element.js';
|
|
21
|
+
|
|
22
|
+
export class UINavGroup extends UIElement {
|
|
23
|
+
/** Optional trailing badge (count, label). */
|
|
24
|
+
badge: string;
|
|
25
|
+
/** When true, the header row toggles the open state on click/keyboard. */
|
|
26
|
+
collapsible: boolean;
|
|
27
|
+
/** Optional leading icon name (resolved via <icon-ui>). */
|
|
28
|
+
icon: string;
|
|
29
|
+
/** Inline-expanded state. Toggled by header click when [collapsible]. */
|
|
30
|
+
open: boolean;
|
|
31
|
+
/** Visible group label. */
|
|
32
|
+
text: string;
|
|
33
|
+
/** Visual treatment. Default ('') renders as a primary-rail group (icon row, caret, collapsible). 'section' renders the header as a static kicker label with always-visible children. When the parent <nav-ui> carries variant="section", this group inherits it via CSS cascade unless an explicit variant is set on the group. */
|
|
34
|
+
variant: '' | 'section';
|
|
35
|
+
}
|
|
@@ -1,142 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* `<nav-group-ui>` — auto-registers the tag on import.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* <nav-ui>'s [variant] drives the visual treatment.
|
|
4
|
+
* For non-side-effect class import (test isolation, tag override), use
|
|
5
|
+
* the `class` subpath:
|
|
7
6
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* expansion. When [collapsible] (or always for primary variant), inline
|
|
12
|
-
* click + keyboard toggle is supported.
|
|
7
|
+
* import { UINavGroup } from '@adia-ai/web-components/components/nav-group/class';
|
|
8
|
+
*
|
|
9
|
+
* @see ../../USAGE.md#registration--auto-vs-explicit
|
|
13
10
|
*/
|
|
14
11
|
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
|
|
18
|
-
class UINavGroup extends UIElement {
|
|
19
|
-
static properties = {
|
|
20
|
-
text: { type: String, default: '', reflect: true },
|
|
21
|
-
icon: { type: String, default: '', reflect: true },
|
|
22
|
-
badge: { type: String, default: '', reflect: true },
|
|
23
|
-
open: { type: Boolean, default: false, reflect: true },
|
|
24
|
-
collapsible: { type: Boolean, default: true, reflect: true },
|
|
25
|
-
variant: { type: String, default: '', reflect: true },
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
static template = () => null;
|
|
29
|
-
|
|
30
|
-
#popover = null;
|
|
31
|
-
#anchorCleanup = null;
|
|
32
|
-
#headerEl = null;
|
|
33
|
-
|
|
34
|
-
#onHeaderKey = (e) => {
|
|
35
|
-
if (!this.collapsible) return;
|
|
36
|
-
if (e.key === 'Enter' || e.key === ' ') {
|
|
37
|
-
e.preventDefault();
|
|
38
|
-
this.open = !this.open;
|
|
39
|
-
this.dispatchEvent(new CustomEvent('group-toggle', {
|
|
40
|
-
bubbles: true,
|
|
41
|
-
detail: { text: this.text, open: this.open },
|
|
42
|
-
}));
|
|
43
|
-
}
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
connected() {
|
|
47
|
-
this.setAttribute('role', 'group');
|
|
48
|
-
|
|
49
|
-
if (!this.querySelector(':scope > [slot="header"]')) {
|
|
50
|
-
this.#headerEl = document.createElement('div');
|
|
51
|
-
this.#headerEl.setAttribute('slot', 'header');
|
|
52
|
-
this.#headerEl.setAttribute('tabindex', '0');
|
|
53
|
-
this.#headerEl.innerHTML = `
|
|
54
|
-
<span slot="icon">${this.icon ? `<icon-ui name="${this.icon}"></icon-ui>` : ''}</span>
|
|
55
|
-
<span slot="text">${this.text}</span>
|
|
56
|
-
${this.badge ? `<span slot="badge">${this.badge}</span>` : ''}
|
|
57
|
-
<icon-ui slot="caret" name="caret-right"></icon-ui>
|
|
58
|
-
`;
|
|
59
|
-
this.prepend(this.#headerEl);
|
|
60
|
-
} else {
|
|
61
|
-
this.#headerEl = this.querySelector(':scope > [slot="header"]');
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
this.#headerEl?.addEventListener('keydown', this.#onHeaderKey);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
render() {
|
|
68
|
-
const textEl = this.querySelector('[slot="header"] [slot="text"]');
|
|
69
|
-
if (textEl) textEl.textContent = this.text;
|
|
70
|
-
|
|
71
|
-
const badgeEl = this.querySelector('[slot="header"] [slot="badge"]');
|
|
72
|
-
if (badgeEl) badgeEl.textContent = this.badge;
|
|
73
|
-
|
|
74
|
-
this.setAttribute('aria-expanded', String(this.open));
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
showPopover() {
|
|
78
|
-
if (!this.#popover) {
|
|
79
|
-
this.#popover = document.createElement('div');
|
|
80
|
-
this.#popover.setAttribute('slot', 'popover');
|
|
81
|
-
this.#popover.setAttribute('popover', 'auto');
|
|
82
|
-
|
|
83
|
-
const label = document.createElement('div');
|
|
84
|
-
label.setAttribute('slot', 'popover-label');
|
|
85
|
-
label.textContent = this.text;
|
|
86
|
-
this.#popover.appendChild(label);
|
|
87
|
-
|
|
88
|
-
for (const child of this.querySelectorAll(':scope > nav-item-ui')) {
|
|
89
|
-
const opt = document.createElement('div');
|
|
90
|
-
opt.setAttribute('role', 'option');
|
|
91
|
-
opt.dataset.sourceValue = child.getAttribute('value') || '';
|
|
92
|
-
opt.textContent = child.text;
|
|
93
|
-
opt.addEventListener('click', () => {
|
|
94
|
-
const nav = this.closest('nav-ui');
|
|
95
|
-
if (nav) nav.select(child);
|
|
96
|
-
this.#popover.hidePopover();
|
|
97
|
-
});
|
|
98
|
-
this.#popover.appendChild(opt);
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
this.appendChild(this.#popover);
|
|
102
|
-
|
|
103
|
-
this.#popover.addEventListener('toggle', (e) => {
|
|
104
|
-
if (e.newState === 'closed') {
|
|
105
|
-
this.#anchorCleanup?.();
|
|
106
|
-
this.#anchorCleanup = null;
|
|
107
|
-
}
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
for (const opt of this.#popover.querySelectorAll('[role="option"]')) {
|
|
112
|
-
const srcValue = opt.dataset.sourceValue;
|
|
113
|
-
const src = srcValue
|
|
114
|
-
? this.querySelector(`:scope > nav-item-ui[value="${srcValue}"]`)
|
|
115
|
-
: null;
|
|
116
|
-
if (src?.hasAttribute('selected')) {
|
|
117
|
-
opt.setAttribute('aria-current', 'page');
|
|
118
|
-
opt.setAttribute('aria-selected', 'true');
|
|
119
|
-
} else {
|
|
120
|
-
opt.removeAttribute('aria-current');
|
|
121
|
-
opt.removeAttribute('aria-selected');
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
this.#popover.showPopover();
|
|
126
|
-
|
|
127
|
-
this.#anchorCleanup?.();
|
|
128
|
-
this.#anchorCleanup = anchorPopover(this, this.#popover, {
|
|
129
|
-
placement: 'right', gap: 4,
|
|
130
|
-
});
|
|
131
|
-
}
|
|
12
|
+
import { defineIfFree } from '../../core/register.js';
|
|
13
|
+
import { UINavGroup } from './class.js';
|
|
132
14
|
|
|
133
|
-
|
|
134
|
-
this.#headerEl?.removeEventListener('keydown', this.#onHeaderKey);
|
|
135
|
-
this.#anchorCleanup?.();
|
|
136
|
-
this.#anchorCleanup = null;
|
|
137
|
-
this.#popover?.hidePopover?.();
|
|
138
|
-
}
|
|
139
|
-
}
|
|
15
|
+
defineIfFree('nav-group-ui', UINavGroup);
|
|
140
16
|
|
|
141
|
-
customElements.define('nav-group-ui', UINavGroup);
|
|
142
17
|
export { UINavGroup };
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Non-side-effect class export for `<nav-item-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/nav-item`
|
|
9
|
+
* (which imports this file + calls `defineIfFree()`).
|
|
10
|
+
*
|
|
11
|
+
* @see ../../USAGE.md#registration--auto-vs-explicit
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* <nav-item-ui> — Single navigation link inside <nav-ui> (optionally
|
|
16
|
+
* nested under <nav-group-ui>). Consolidates the prior
|
|
17
|
+
* `app-nav-item-ui` + `section-nav-item-ui` per ADR-0015 § Nav consolidation.
|
|
18
|
+
*
|
|
19
|
+
* Supports icon, label, optional badge, selected/disabled state, and
|
|
20
|
+
* keyboard activation (Enter/Space). Selection is managed by the parent
|
|
21
|
+
* <nav-ui>; clicking or keyboard-activating an item calls nav.select(this)
|
|
22
|
+
* and dispatches `nav-select` (bubbles, detail: { item, text, value }).
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
import { UIElement } from '../../core/element.js';
|
|
26
|
+
|
|
27
|
+
export class UINavItem extends UIElement {
|
|
28
|
+
static properties = {
|
|
29
|
+
text: { type: String, default: '', reflect: true },
|
|
30
|
+
icon: { type: String, default: '', reflect: true },
|
|
31
|
+
value: { type: String, default: '', reflect: true },
|
|
32
|
+
badge: { type: String, default: '', reflect: true },
|
|
33
|
+
selected: { type: Boolean, default: false, reflect: true },
|
|
34
|
+
disabled: { type: Boolean, default: false, reflect: true },
|
|
35
|
+
variant: { type: String, default: '', reflect: true },
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
static template = () => null;
|
|
39
|
+
|
|
40
|
+
#onClick = (e) => {
|
|
41
|
+
if (this.disabled) { e.preventDefault(); return; }
|
|
42
|
+
const parent = this.closest('nav-ui');
|
|
43
|
+
parent?.select?.(this);
|
|
44
|
+
this.dispatchEvent(new CustomEvent('nav-select', {
|
|
45
|
+
bubbles: true,
|
|
46
|
+
detail: { item: this, text: this.text, value: this.value },
|
|
47
|
+
}));
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
#onKey = (e) => {
|
|
51
|
+
if (this.disabled) return;
|
|
52
|
+
if (e.key === 'Enter' || e.key === ' ') {
|
|
53
|
+
e.preventDefault();
|
|
54
|
+
this.#onClick(e);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
connected() {
|
|
59
|
+
this.setAttribute('role', 'link');
|
|
60
|
+
this.setAttribute('tabindex', this.disabled ? '-1' : '0');
|
|
61
|
+
|
|
62
|
+
if (!this.querySelector('[slot="text"]')) {
|
|
63
|
+
this.innerHTML = `
|
|
64
|
+
<span slot="icon">${this.icon ? `<icon-ui name="${this.icon}"></icon-ui>` : ''}</span>
|
|
65
|
+
<span slot="text">${this.text}</span>
|
|
66
|
+
${this.badge ? `<span slot="badge">${this.badge}</span>` : ''}
|
|
67
|
+
`;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
this.addEventListener('click', this.#onClick);
|
|
71
|
+
this.addEventListener('keydown', this.#onKey);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
render() {
|
|
75
|
+
const textEl = this.querySelector('[slot="text"]');
|
|
76
|
+
if (textEl) textEl.textContent = this.text;
|
|
77
|
+
this.setAttribute('tabindex', this.disabled ? '-1' : '0');
|
|
78
|
+
if (this.selected) this.setAttribute('aria-current', 'page');
|
|
79
|
+
else this.removeAttribute('aria-current');
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
disconnected() {
|
|
83
|
+
this.removeEventListener('click', this.#onClick);
|
|
84
|
+
this.removeEventListener('keydown', this.#onKey);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<nav-item-ui>` — Single navigation link inside <nav-ui> (optionally nested under
|
|
3
|
+
<nav-group-ui>). Consolidates the prior `app-nav-item-ui` +
|
|
4
|
+
`section-nav-item-ui` per ADR-0015 § Nav consolidation.
|
|
5
|
+
|
|
6
|
+
Supports icon, label, optional badge, selected/disabled state, and
|
|
7
|
+
keyboard activation (Enter/Space). Selection is managed by the parent
|
|
8
|
+
<nav-ui>; clicking or activating an item calls nav.select(this) and
|
|
9
|
+
bubbles a `nav-select` event.
|
|
10
|
+
|
|
11
|
+
*
|
|
12
|
+
* @see https://ui-kit.exe.xyz/site/components/nav-item
|
|
13
|
+
*
|
|
14
|
+
* Type declarations generated by scripts/build/dts-codegen.mjs from
|
|
15
|
+
* the component's `.a2ui.json` sidecar. Edit the source `.yaml`,
|
|
16
|
+
* run `npm run components`, then `npm run codegen:dts` to regenerate;
|
|
17
|
+
* or hand-author this file fully if rich event types are needed.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { UIElement } from '../../core/element.js';
|
|
21
|
+
|
|
22
|
+
export class UINavItem extends UIElement {
|
|
23
|
+
/** Optional trailing badge. */
|
|
24
|
+
badge: string;
|
|
25
|
+
/** Suppresses click/keyboard activation; greyed visually. */
|
|
26
|
+
disabled: boolean;
|
|
27
|
+
/** Optional leading icon name. */
|
|
28
|
+
icon: string;
|
|
29
|
+
/** Set by the parent <nav-ui>'s select() method. */
|
|
30
|
+
selected: boolean;
|
|
31
|
+
/** Visible item label. */
|
|
32
|
+
text: string;
|
|
33
|
+
/** Identifier — typically a route or anchor. */
|
|
34
|
+
value: string;
|
|
35
|
+
/** Visual treatment. Default ('') renders as a primary-rail item (reserved icon space, in-icon selected accent). 'section' renders flat — no icon space when absent, left-edge accent bar for selected. When the parent <nav-ui> carries variant="section", this item inherits it via CSS cascade unless an explicit variant is set. */
|
|
36
|
+
variant: '' | 'section';
|
|
37
|
+
}
|
|
@@ -1,76 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* nested under <nav-group-ui>). Consolidates the prior
|
|
4
|
-
* `app-nav-item-ui` + `section-nav-item-ui` per ADR-0015 § Nav consolidation.
|
|
2
|
+
* `<nav-item-ui>` — auto-registers the tag on import.
|
|
5
3
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
4
|
+
* For non-side-effect class import (test isolation, tag override), use
|
|
5
|
+
* the `class` subpath:
|
|
6
|
+
*
|
|
7
|
+
* import { UINavItem } from '@adia-ai/web-components/components/nav-item/class';
|
|
8
|
+
*
|
|
9
|
+
* @see ../../USAGE.md#registration--auto-vs-explicit
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
-
import {
|
|
13
|
-
|
|
14
|
-
class UINavItem extends UIElement {
|
|
15
|
-
static properties = {
|
|
16
|
-
text: { type: String, default: '', reflect: true },
|
|
17
|
-
icon: { type: String, default: '', reflect: true },
|
|
18
|
-
value: { type: String, default: '', reflect: true },
|
|
19
|
-
badge: { type: String, default: '', reflect: true },
|
|
20
|
-
selected: { type: Boolean, default: false, reflect: true },
|
|
21
|
-
disabled: { type: Boolean, default: false, reflect: true },
|
|
22
|
-
variant: { type: String, default: '', reflect: true },
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
static template = () => null;
|
|
26
|
-
|
|
27
|
-
#onClick = (e) => {
|
|
28
|
-
if (this.disabled) { e.preventDefault(); return; }
|
|
29
|
-
const parent = this.closest('nav-ui');
|
|
30
|
-
parent?.select?.(this);
|
|
31
|
-
this.dispatchEvent(new CustomEvent('nav-select', {
|
|
32
|
-
bubbles: true,
|
|
33
|
-
detail: { item: this, text: this.text, value: this.value },
|
|
34
|
-
}));
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
#onKey = (e) => {
|
|
38
|
-
if (this.disabled) return;
|
|
39
|
-
if (e.key === 'Enter' || e.key === ' ') {
|
|
40
|
-
e.preventDefault();
|
|
41
|
-
this.#onClick(e);
|
|
42
|
-
}
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
connected() {
|
|
46
|
-
this.setAttribute('role', 'link');
|
|
47
|
-
this.setAttribute('tabindex', this.disabled ? '-1' : '0');
|
|
48
|
-
|
|
49
|
-
if (!this.querySelector('[slot="text"]')) {
|
|
50
|
-
this.innerHTML = `
|
|
51
|
-
<span slot="icon">${this.icon ? `<icon-ui name="${this.icon}"></icon-ui>` : ''}</span>
|
|
52
|
-
<span slot="text">${this.text}</span>
|
|
53
|
-
${this.badge ? `<span slot="badge">${this.badge}</span>` : ''}
|
|
54
|
-
`;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
this.addEventListener('click', this.#onClick);
|
|
58
|
-
this.addEventListener('keydown', this.#onKey);
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
render() {
|
|
62
|
-
const textEl = this.querySelector('[slot="text"]');
|
|
63
|
-
if (textEl) textEl.textContent = this.text;
|
|
64
|
-
this.setAttribute('tabindex', this.disabled ? '-1' : '0');
|
|
65
|
-
if (this.selected) this.setAttribute('aria-current', 'page');
|
|
66
|
-
else this.removeAttribute('aria-current');
|
|
67
|
-
}
|
|
12
|
+
import { defineIfFree } from '../../core/register.js';
|
|
13
|
+
import { UINavItem } from './class.js';
|
|
68
14
|
|
|
69
|
-
|
|
70
|
-
this.removeEventListener('click', this.#onClick);
|
|
71
|
-
this.removeEventListener('keydown', this.#onKey);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
15
|
+
defineIfFree('nav-item-ui', UINavItem);
|
|
74
16
|
|
|
75
|
-
customElements.define('nav-item-ui', UINavItem);
|
|
76
17
|
export { UINavItem };
|