@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.
Files changed (284) hide show
  1. package/USAGE.md +29 -9
  2. package/components/accordion/accordion.d.ts +17 -0
  3. package/components/accordion/accordion.js +10 -117
  4. package/components/accordion/class.js +132 -0
  5. package/components/action-list/action-list.d.ts +15 -0
  6. package/components/action-list/action-list.js +9 -140
  7. package/components/action-list/class.js +156 -0
  8. package/components/agent-artifact/agent-artifact.d.ts +25 -0
  9. package/components/agent-artifact/agent-artifact.js +8 -181
  10. package/components/agent-artifact/class.js +200 -0
  11. package/components/agent-feedback-bar/agent-feedback-bar.d.ts +21 -0
  12. package/components/agent-feedback-bar/agent-feedback-bar.js +8 -143
  13. package/components/agent-feedback-bar/class.js +162 -0
  14. package/components/agent-questions/agent-questions.d.ts +23 -0
  15. package/components/agent-questions/agent-questions.js +8 -180
  16. package/components/agent-questions/class.js +199 -0
  17. package/components/agent-reasoning/agent-reasoning.d.ts +23 -0
  18. package/components/agent-reasoning/agent-reasoning.js +8 -494
  19. package/components/agent-reasoning/class.js +513 -0
  20. package/components/agent-suggestions/agent-suggestions.d.ts +21 -0
  21. package/components/agent-suggestions/agent-suggestions.js +8 -78
  22. package/components/agent-suggestions/class.js +97 -0
  23. package/components/agent-trace/agent-trace.d.ts +19 -0
  24. package/components/alert/alert.d.ts +29 -0
  25. package/components/alert/alert.js +8 -175
  26. package/components/alert/class.js +194 -0
  27. package/components/avatar/avatar.d.ts +27 -0
  28. package/components/avatar/avatar.js +9 -159
  29. package/components/avatar/class.js +173 -0
  30. package/components/badge/badge.d.ts +27 -0
  31. package/components/badge/badge.js +9 -75
  32. package/components/badge/class.js +93 -0
  33. package/components/block/block.d.ts +19 -0
  34. package/components/block/block.js +9 -15
  35. package/components/block/class.js +33 -0
  36. package/components/breadcrumb/breadcrumb.d.ts +23 -0
  37. package/components/breadcrumb/breadcrumb.js +8 -113
  38. package/components/breadcrumb/class.js +132 -0
  39. package/components/button/button.d.ts +34 -0
  40. package/components/button/button.js +15 -66
  41. package/components/button/class.js +80 -0
  42. package/components/calendar-picker/calendar-picker.a2ui.json +6 -1
  43. package/components/calendar-picker/calendar-picker.js +8 -332
  44. package/components/calendar-picker/calendar-picker.yaml +51 -177
  45. package/components/calendar-picker/class.js +351 -0
  46. package/components/canvas/canvas.a2ui.json +6 -1
  47. package/components/canvas/canvas.d.ts +17 -0
  48. package/components/canvas/canvas.yaml +19 -36
  49. package/components/card/card.a2ui.json +3 -0
  50. package/components/card/card.d.ts +27 -0
  51. package/components/card/card.js +9 -50
  52. package/components/card/card.yaml +171 -433
  53. package/components/card/class.js +68 -0
  54. package/components/chart/chart.d.ts +41 -0
  55. package/components/chart/chart.js +8 -2131
  56. package/components/chart/class.js +2150 -0
  57. package/components/chart-legend/chart-legend.d.ts +27 -0
  58. package/components/chart-legend/chart-legend.js +8 -197
  59. package/components/chart-legend/class.js +215 -0
  60. package/components/chat-thread/chat-thread.d.ts +17 -0
  61. package/components/chat-thread/chat-thread.js +8 -157
  62. package/components/chat-thread/class.js +176 -0
  63. package/components/check/check.js +11 -52
  64. package/components/check/class.js +68 -0
  65. package/components/code/class.js +501 -0
  66. package/components/code/code.js +8 -482
  67. package/components/col/class.js +30 -0
  68. package/components/col/col.d.ts +23 -0
  69. package/components/col/col.js +10 -13
  70. package/components/color-picker/class.js +550 -0
  71. package/components/color-picker/color-picker.js +8 -531
  72. package/components/command/class.js +364 -0
  73. package/components/command/command.a2ui.json +3 -0
  74. package/components/command/command.d.ts +19 -0
  75. package/components/command/command.js +8 -345
  76. package/components/command/command.yaml +105 -124
  77. package/components/demo-toggle/class.js +153 -0
  78. package/components/demo-toggle/demo-toggle.d.ts +23 -0
  79. package/components/demo-toggle/demo-toggle.js +8 -135
  80. package/components/description-list/class.js +86 -0
  81. package/components/description-list/description-list.d.ts +21 -0
  82. package/components/description-list/description-list.js +8 -67
  83. package/components/divider/class.js +57 -0
  84. package/components/divider/divider.d.ts +19 -0
  85. package/components/divider/divider.js +10 -40
  86. package/components/drawer/class.js +306 -0
  87. package/components/drawer/drawer.d.ts +25 -0
  88. package/components/drawer/drawer.js +8 -287
  89. package/components/embed/class.js +73 -0
  90. package/components/embed/embed.d.ts +23 -0
  91. package/components/embed/embed.js +9 -55
  92. package/components/empty-state/class.js +108 -0
  93. package/components/empty-state/empty-state.d.ts +21 -0
  94. package/components/empty-state/empty-state.js +9 -90
  95. package/components/feed/class.js +381 -0
  96. package/components/feed/feed.d.ts +19 -0
  97. package/components/feed/feed.js +9 -367
  98. package/components/field/class.js +266 -0
  99. package/components/field/field.d.ts +23 -0
  100. package/components/field/field.js +8 -247
  101. package/components/fields/class.js +106 -0
  102. package/components/fields/fields.d.ts +19 -0
  103. package/components/fields/fields.js +8 -87
  104. package/components/grid/class.js +31 -0
  105. package/components/grid/grid.d.ts +23 -0
  106. package/components/grid/grid.js +10 -14
  107. package/components/heatmap/class.js +305 -0
  108. package/components/heatmap/heatmap.d.ts +31 -0
  109. package/components/heatmap/heatmap.js +8 -286
  110. package/components/icon/class.js +54 -0
  111. package/components/icon/icon.d.ts +23 -0
  112. package/components/icon/icon.js +13 -40
  113. package/components/image/class.js +112 -0
  114. package/components/image/image.d.ts +33 -0
  115. package/components/image/image.js +9 -94
  116. package/components/input/class.js +773 -0
  117. package/components/input/input.a2ui.json +3 -0
  118. package/components/input/input.js +8 -755
  119. package/components/input/input.yaml +171 -442
  120. package/components/inspector/class.js +142 -0
  121. package/components/inspector/inspector.a2ui.json +8 -1
  122. package/components/inspector/inspector.d.ts +17 -0
  123. package/components/inspector/inspector.js +8 -124
  124. package/components/inspector/inspector.yaml +15 -30
  125. package/components/kbd/class.js +34 -0
  126. package/components/kbd/kbd.a2ui.json +3 -0
  127. package/components/kbd/kbd.d.ts +17 -0
  128. package/components/kbd/kbd.js +10 -17
  129. package/components/kbd/kbd.yaml +54 -185
  130. package/components/link/class.js +187 -0
  131. package/components/link/link.d.ts +55 -0
  132. package/components/link/link.js +8 -168
  133. package/components/list/class.js +249 -0
  134. package/components/list/list.d.ts +23 -0
  135. package/components/list/list.js +9 -231
  136. package/components/menu/class.js +332 -0
  137. package/components/menu/menu.d.ts +21 -0
  138. package/components/menu/menu.js +11 -316
  139. package/components/modal/class.js +231 -0
  140. package/components/modal/modal.a2ui.json +5 -1
  141. package/components/modal/modal.d.ts +23 -0
  142. package/components/modal/modal.js +8 -212
  143. package/components/modal/modal.yaml +19 -39
  144. package/components/nav/class.js +150 -0
  145. package/components/nav/nav.d.ts +31 -0
  146. package/components/nav/nav.js +8 -131
  147. package/components/nav-group/class.js +152 -0
  148. package/components/nav-group/nav-group.d.ts +35 -0
  149. package/components/nav-group/nav-group.js +9 -134
  150. package/components/nav-item/class.js +86 -0
  151. package/components/nav-item/nav-item.d.ts +37 -0
  152. package/components/nav-item/nav-item.js +10 -69
  153. package/components/noodles/class.js +510 -0
  154. package/components/noodles/noodles.d.ts +33 -0
  155. package/components/noodles/noodles.js +9 -493
  156. package/components/option-card/class.js +167 -0
  157. package/components/option-card/option-card.js +8 -149
  158. package/components/otp-input/class.js +180 -0
  159. package/components/otp-input/otp-input.a2ui.json +5 -1
  160. package/components/otp-input/otp-input.js +9 -162
  161. package/components/otp-input/otp-input.yaml +45 -174
  162. package/components/page/class.js +97 -0
  163. package/components/page/page.d.ts +46 -0
  164. package/components/page/page.js +8 -79
  165. package/components/pagination/class.js +195 -0
  166. package/components/pagination/pagination.d.ts +23 -0
  167. package/components/pagination/pagination.js +9 -177
  168. package/components/pane/class.js +186 -0
  169. package/components/pane/pane.a2ui.json +12 -1
  170. package/components/pane/pane.d.ts +31 -0
  171. package/components/pane/pane.js +8 -167
  172. package/components/pane/pane.yaml +57 -157
  173. package/components/pipeline-status/class.js +189 -0
  174. package/components/pipeline-status/pipeline-status.a2ui.json +7 -1
  175. package/components/pipeline-status/pipeline-status.d.ts +21 -0
  176. package/components/pipeline-status/pipeline-status.js +9 -172
  177. package/components/pipeline-status/pipeline-status.yaml +34 -72
  178. package/components/popover/class.js +194 -0
  179. package/components/popover/popover.d.ts +23 -0
  180. package/components/popover/popover.js +9 -176
  181. package/components/progress/class.js +74 -0
  182. package/components/progress/progress.a2ui.json +3 -0
  183. package/components/progress/progress.d.ts +19 -0
  184. package/components/progress/progress.js +10 -57
  185. package/components/progress/progress.yaml +124 -287
  186. package/components/progress-row/class.js +110 -0
  187. package/components/progress-row/progress-row.d.ts +23 -0
  188. package/components/progress-row/progress-row.js +8 -92
  189. package/components/radio/class.js +83 -0
  190. package/components/radio/radio.js +11 -67
  191. package/components/range/class.js +194 -0
  192. package/components/range/range.js +9 -176
  193. package/components/rating/class.js +148 -0
  194. package/components/rating/rating.js +9 -130
  195. package/components/richtext/class.js +87 -0
  196. package/components/richtext/richtext.a2ui.json +7 -1
  197. package/components/richtext/richtext.d.ts +19 -0
  198. package/components/richtext/richtext.js +8 -68
  199. package/components/richtext/richtext.yaml +30 -65
  200. package/components/row/class.js +50 -0
  201. package/components/row/row.d.ts +27 -0
  202. package/components/row/row.js +10 -33
  203. package/components/search/class.js +134 -0
  204. package/components/search/search.js +10 -117
  205. package/components/segment/class.js +62 -0
  206. package/components/segment/segment.d.ts +25 -0
  207. package/components/segment/segment.js +10 -45
  208. package/components/segmented/class.js +165 -0
  209. package/components/segmented/segmented.a2ui.json +4 -0
  210. package/components/segmented/segmented.js +10 -148
  211. package/components/segmented/segmented.yaml +41 -59
  212. package/components/select/class.js +408 -0
  213. package/components/select/select.js +15 -396
  214. package/components/skeleton/class.js +52 -0
  215. package/components/skeleton/skeleton.d.ts +23 -0
  216. package/components/skeleton/skeleton.js +8 -34
  217. package/components/slider/class.js +184 -0
  218. package/components/slider/slider.js +9 -166
  219. package/components/stack/class.js +28 -0
  220. package/components/stack/stack.d.ts +17 -0
  221. package/components/stack/stack.js +10 -11
  222. package/components/step-progress/class.js +98 -0
  223. package/components/step-progress/step-progress.d.ts +27 -0
  224. package/components/step-progress/step-progress.js +8 -79
  225. package/components/stepper/class.js +126 -0
  226. package/components/stepper/stepper.d.ts +19 -0
  227. package/components/stepper/stepper.js +9 -112
  228. package/components/stream/class.js +109 -0
  229. package/components/stream/stream.d.ts +19 -0
  230. package/components/stream/stream.js +8 -90
  231. package/components/swatch/class.js +131 -0
  232. package/components/swatch/swatch.d.ts +28 -0
  233. package/components/swatch/swatch.js +8 -112
  234. package/components/swiper/class.js +373 -0
  235. package/components/swiper/swiper.a2ui.json +4 -0
  236. package/components/swiper/swiper.d.ts +31 -0
  237. package/components/swiper/swiper.js +8 -354
  238. package/components/swiper/swiper.yaml +68 -212
  239. package/components/switch/class.js +63 -0
  240. package/components/switch/switch.a2ui.json +6 -1
  241. package/components/switch/switch.js +11 -47
  242. package/components/switch/switch.yaml +70 -265
  243. package/components/table/class.js +1453 -0
  244. package/components/table/table.d.ts +37 -0
  245. package/components/table/table.js +8 -1435
  246. package/components/table-toolbar/class.js +680 -0
  247. package/components/table-toolbar/table-toolbar.d.ts +33 -0
  248. package/components/table-toolbar/table-toolbar.js +8 -689
  249. package/components/tabs/class.js +242 -0
  250. package/components/tabs/tabs.d.ts +21 -0
  251. package/components/tabs/tabs.js +8 -223
  252. package/components/tag/class.js +99 -0
  253. package/components/tag/tag.d.ts +27 -0
  254. package/components/tag/tag.js +8 -80
  255. package/components/text/class.js +46 -0
  256. package/components/text/text.d.ts +25 -0
  257. package/components/text/text.js +9 -28
  258. package/components/textarea/class.js +134 -0
  259. package/components/textarea/textarea.js +11 -118
  260. package/components/timeline/class.js +176 -0
  261. package/components/timeline/timeline.d.ts +19 -0
  262. package/components/timeline/timeline.js +9 -162
  263. package/components/toast/class.js +92 -0
  264. package/components/toast/toast.d.ts +23 -0
  265. package/components/toast/toast.js +9 -76
  266. package/components/toggle-group/class.js +154 -0
  267. package/components/toggle-group/toggle-group.d.ts +19 -0
  268. package/components/toggle-group/toggle-group.js +11 -140
  269. package/components/toggle-scheme/class.js +286 -0
  270. package/components/toggle-scheme/toggle-scheme.d.ts +41 -0
  271. package/components/toggle-scheme/toggle-scheme.js +8 -268
  272. package/components/toolbar/class.js +388 -0
  273. package/components/toolbar/toolbar.d.ts +23 -0
  274. package/components/toolbar/toolbar.js +10 -376
  275. package/components/tooltip/class.js +299 -0
  276. package/components/tooltip/tooltip.d.ts +27 -0
  277. package/components/tooltip/tooltip.js +8 -280
  278. package/components/tree/class.js +245 -0
  279. package/components/tree/tree.d.ts +15 -0
  280. package/components/tree/tree.js +9 -244
  281. package/components/upload/class.js +199 -0
  282. package/components/upload/upload.js +11 -183
  283. package/index.d.ts +159 -5
  284. package/package.json +5 -1
@@ -1,354 +1,17 @@
1
- import { UIElement } from '../../core/element.js';
2
-
3
1
  /**
4
- * <command-ui>Searchable command palette.
2
+ * `<command-ui>`auto-registers the tag on import.
5
3
  *
6
- * Usage:
7
- * <command-ui placeholder="Search...">
8
- * <optgroup label="Navigation">
9
- * <option value="home" data-icon="home" data-shortcut="⌘H">Go Home</option>
10
- * </optgroup>
11
- * </command-ui>
4
+ * For non-side-effect class import (test isolation, tag override), use
5
+ * the `class` subpath:
12
6
  *
13
- * Attributes on <option>:
14
- * data-icon — icon name (renders icon-ui)
15
- * data-shortcut — keyboard shortcut hint
16
- * data-keywords — extra searchable text
17
- * disabled — skips in navigation
7
+ * import { UICommand } from '@adia-ai/web-components/components/command/class';
18
8
  *
19
- * Events:
20
- * select — { detail: { value, label } }
21
- * dismiss — Escape pressed
9
+ * @see ../../USAGE.md#registration--auto-vs-explicit
22
10
  */
23
- class UICommand extends UIElement {
24
- static properties = {
25
- placeholder: { type: String, default: 'Type a command...', reflect: true },
26
- open: { type: Boolean, default: false, reflect: true },
27
- };
28
-
29
- static template = () => null;
30
-
31
- #items = [];
32
- #recents = [];
33
- #activeIdx = -1;
34
- #inputEl = null;
35
- #listEl = null;
36
- #focusRaf = null;
37
- #footerEl = null;
38
- #bound = false;
39
- #itemByEl = new WeakMap();
40
-
41
- static #RECENTS_MAX = 3;
42
-
43
- #onListClick = (e) => {
44
- const el = e.target instanceof Element ? e.target.closest('[role="option"]:not([aria-disabled])') : null;
45
- if (!el) return;
46
- const item = this.#itemByEl.get(el);
47
- if (item) this.#select(item);
48
- };
49
-
50
- #onListPointerOver = (e) => {
51
- const el = e.target instanceof Element ? e.target.closest('[role="option"]:not([aria-disabled])') : null;
52
- if (!el) return;
53
- const idx = parseInt(el.dataset.idx);
54
- if (Number.isFinite(idx) && idx !== this.#activeIdx) this.#activate(idx);
55
- };
56
-
57
- connected() {
58
- if (!this.#bound) {
59
- this.#bound = true;
60
- this.addEventListener('keydown', this.#onKeydown);
61
- }
62
- }
63
-
64
- render() {
65
- // Stamp internal structure once
66
- if (!this.#inputEl) {
67
- // Parse options from declarative children before replacing innerHTML
68
- this.#parseOptions();
69
-
70
- this.innerHTML = `
71
- <header>
72
- <icon-ui name="magnifying-glass" slot="icon"></icon-ui>
73
- <input type="text" placeholder="${this.placeholder}" slot="input" />
74
- </header>
75
- <section slot="list"></section>
76
- <footer>
77
- <span data-hint><kbd>↑</kbd><kbd>↓</kbd> Navigate</span>
78
- <span data-hint><kbd>↵</kbd> Select</span>
79
- <span data-hint><kbd>⎋</kbd> Close</span>
80
- </footer>
81
- `;
82
-
83
- this.#inputEl = this.querySelector('input');
84
- this.#listEl = this.querySelector('[slot="list"]');
85
- this.#footerEl = this.querySelector('footer');
86
-
87
- this.#inputEl.addEventListener('input', this.#onInput);
88
- // Delegated item handlers — handler identity is stable so teardown is symmetric.
89
- this.#listEl.addEventListener('click', this.#onListClick);
90
- this.#listEl.addEventListener('pointerover', this.#onListPointerOver);
91
- this.#renderItems();
92
- }
93
-
94
- if (this.open) {
95
- this.#focusRaf = requestAnimationFrame(() => {
96
- this.#focusRaf = null;
97
- this.#inputEl?.focus();
98
- });
99
- }
100
- }
101
-
102
- // ── Public API ──
103
-
104
- get value() { return this.#inputEl?.value || ''; }
105
- set value(v) {
106
- if (!this.#inputEl) return;
107
- const next = v ?? '';
108
- this.#inputEl.value = next;
109
- // Keep the rendered list in sync with the visible input — the host
110
- // commonly clears value on (re)open, and consumers expect to see the
111
- // full list (plus recents) rather than the previous filter's residue.
112
- this.#renderItems(next);
113
- }
114
-
115
- focus() { this.#inputEl?.focus(); }
116
-
117
- setItems(items) {
118
- this.#items = items;
119
- this.#renderItems();
120
- }
121
-
122
- // ── Parse declarative <option>/<optgroup> ──
123
-
124
- #parseOptions() {
125
- const items = [];
126
- for (const child of this.children) {
127
- if (child.tagName === 'OPTGROUP') {
128
- const group = { label: child.label, items: [] };
129
- for (const opt of child.querySelectorAll('option')) {
130
- group.items.push(this.#optionToItem(opt));
131
- }
132
- items.push(group);
133
- } else if (child.tagName === 'OPTION') {
134
- items.push(this.#optionToItem(child));
135
- }
136
- }
137
- this.#items = items;
138
- }
139
-
140
- #optionToItem(opt) {
141
- return {
142
- value: opt.value,
143
- label: opt.textContent.trim(),
144
- icon: opt.dataset.icon || '',
145
- shortcut: opt.dataset.shortcut || '',
146
- keywords: opt.dataset.keywords || '',
147
- disabled: opt.disabled,
148
- };
149
- }
150
-
151
- // ── Render ──
152
-
153
- #renderItems(filter = '') {
154
- if (!this.#listEl) return;
155
- this.#listEl.innerHTML = '';
156
- this.#activeIdx = -1;
157
- const q = filter.toLowerCase();
158
-
159
- const flat = this.#items;
160
- let visibleCount = 0;
161
-
162
- // Recents — only when no filter is applied. Resolved against the
163
- // current item set so a stale recent (item removed via setItems)
164
- // is silently dropped.
165
- if (!q && this.#recents.length) {
166
- const resolved = this.#recents
167
- .map(v => this.#findItem(v))
168
- .filter(it => it && !it.disabled);
169
- if (resolved.length) {
170
- const groupEl = document.createElement('div');
171
- groupEl.setAttribute('data-group', '');
172
- groupEl.setAttribute('data-recent', '');
173
- groupEl.innerHTML = `<div data-group-label>Recent</div>`;
174
- for (const item of resolved) {
175
- groupEl.appendChild(this.#createItemEl(item, visibleCount));
176
- visibleCount++;
177
- }
178
- this.#listEl.appendChild(groupEl);
179
- }
180
- }
181
-
182
- for (const entry of flat) {
183
- if (entry.items) {
184
- // Group
185
- const filtered = entry.items.filter(i => this.#matches(i, q));
186
- if (!filtered.length) continue;
187
-
188
- const groupEl = document.createElement('div');
189
- groupEl.setAttribute('data-group', '');
190
- groupEl.innerHTML = `<div data-group-label>${entry.label}</div>`;
191
-
192
- for (const item of filtered) {
193
- groupEl.appendChild(this.#createItemEl(item, visibleCount));
194
- visibleCount++;
195
- }
196
- this.#listEl.appendChild(groupEl);
197
- } else {
198
- if (!this.#matches(entry, q)) continue;
199
- this.#listEl.appendChild(this.#createItemEl(entry, visibleCount));
200
- visibleCount++;
201
- }
202
- }
203
-
204
- // Empty state
205
- if (!visibleCount) {
206
- const empty = document.createElement('div');
207
- empty.setAttribute('data-empty', '');
208
- empty.textContent = 'No results found.';
209
- this.#listEl.appendChild(empty);
210
- }
211
-
212
- // Activate first non-disabled
213
- if (visibleCount > 0) this.#activate(0);
214
- }
215
-
216
- #findItem(value) {
217
- for (const entry of this.#items) {
218
- if (entry.items) {
219
- const hit = entry.items.find(i => i.value === value);
220
- if (hit) return hit;
221
- } else if (entry.value === value) {
222
- return entry;
223
- }
224
- }
225
- return null;
226
- }
227
-
228
- #pushRecent(value) {
229
- if (!value) return;
230
- this.#recents = [value, ...this.#recents.filter(v => v !== value)]
231
- .slice(0, UICommand.#RECENTS_MAX);
232
- }
233
-
234
- #createItemEl(item, idx) {
235
- const el = document.createElement('div');
236
- el.setAttribute('role', 'option');
237
- el.setAttribute('data-value', item.value);
238
- el.setAttribute('data-idx', idx);
239
- if (item.disabled) el.setAttribute('aria-disabled', 'true');
240
-
241
- el.innerHTML = `
242
- ${item.icon ? `<icon-ui name="${item.icon}"></icon-ui>` : ''}
243
- <span data-text>${item.label}</span>
244
- ${item.shortcut ? `<span data-shortcut>${item.shortcut}</span>` : ''}
245
- `;
246
-
247
- this.#itemByEl.set(el, item);
248
- return el;
249
- }
250
-
251
- #matches(item, q) {
252
- if (!q) return true;
253
- return (item.label || '').toLowerCase().includes(q) ||
254
- (item.value || '').toLowerCase().includes(q) ||
255
- (item.keywords || '').toLowerCase().includes(q);
256
- }
257
-
258
- // ── Navigation ──
259
-
260
- #activate(idx) {
261
- const options = this.#listEl.querySelectorAll('[role="option"]:not([aria-disabled])');
262
- const prev = this.#listEl.querySelector('[data-active]');
263
- if (prev) prev.removeAttribute('data-active');
264
-
265
- const target = [...options].find(el => parseInt(el.dataset.idx) === idx);
266
- if (target) {
267
- target.setAttribute('data-active', '');
268
- target.scrollIntoView({ block: 'nearest' });
269
- this.#activeIdx = idx;
270
- }
271
- }
272
-
273
- #moveActive(dir) {
274
- const options = [...this.#listEl.querySelectorAll('[role="option"]:not([aria-disabled])')];
275
- if (!options.length) return;
276
-
277
- const currentEl = this.#listEl.querySelector('[data-active]');
278
- const currentPos = currentEl ? options.indexOf(currentEl) : -1;
279
- let next = currentPos + dir;
280
- if (next < 0) next = options.length - 1;
281
- if (next >= options.length) next = 0;
282
-
283
- this.#activate(parseInt(options[next].dataset.idx));
284
- }
285
-
286
- #select(item) {
287
- this.#pushRecent(item.value);
288
- this.dispatchEvent(new CustomEvent('select', {
289
- bubbles: true,
290
- detail: { value: item.value, label: item.label },
291
- }));
292
- }
293
-
294
- #selectActive() {
295
- const active = this.#listEl.querySelector('[data-active]');
296
- if (!active) return;
297
- const value = active.dataset.value;
298
- const label = active.querySelector('[data-text]')?.textContent || '';
299
- this.#pushRecent(value);
300
- this.dispatchEvent(new CustomEvent('select', {
301
- bubbles: true,
302
- detail: { value, label },
303
- }));
304
- }
305
-
306
- // ── Events ──
307
-
308
- #onInput = () => {
309
- this.#renderItems(this.#inputEl.value);
310
- };
311
11
 
312
- #onKeydown = (e) => {
313
- switch (e.key) {
314
- case 'ArrowDown':
315
- e.preventDefault();
316
- this.#moveActive(1);
317
- break;
318
- case 'ArrowUp':
319
- e.preventDefault();
320
- this.#moveActive(-1);
321
- break;
322
- case 'Enter':
323
- e.preventDefault();
324
- this.#selectActive();
325
- break;
326
- case 'Tab':
327
- e.preventDefault();
328
- this.#selectActive();
329
- break;
330
- case 'Escape':
331
- e.preventDefault();
332
- this.dispatchEvent(new Event('dismiss', { bubbles: true }));
333
- break;
334
- }
335
- };
12
+ import { defineIfFree } from '../../core/register.js';
13
+ import { UICommand } from './class.js';
336
14
 
337
- disconnected() {
338
- if (this.#focusRaf != null) {
339
- cancelAnimationFrame(this.#focusRaf);
340
- this.#focusRaf = null;
341
- }
342
- this.removeEventListener('keydown', this.#onKeydown);
343
- this.#inputEl?.removeEventListener('input', this.#onInput);
344
- this.#listEl?.removeEventListener('click', this.#onListClick);
345
- this.#listEl?.removeEventListener('pointerover', this.#onListPointerOver);
346
- this.#inputEl = null;
347
- this.#listEl = null;
348
- this.#footerEl = null;
349
- this.#bound = false;
350
- }
351
- }
15
+ defineIfFree('command-ui', UICommand);
352
16
 
353
- customElements.define('command-ui', UICommand);
354
17
  export { UICommand };
@@ -1,5 +1,3 @@
1
- # Generated by scripts/migrate-yamls-to-v1.mjs — migrated to v1 contract.
2
- # Edit this file; run `npm run build:components` to regenerate a2ui.json.
3
1
  $schema: ../../../../scripts/schemas/component.yaml.schema.json
4
2
  name: UICommand
5
3
  tag: command-ui
@@ -32,155 +30,138 @@ slots:
32
30
  search:
33
31
  description: Search input with combobox role
34
32
  states:
35
- - name: idle
36
- description: Default, ready for interaction.
33
+ - name: idle
34
+ description: Default, ready for interaction.
37
35
  traits: []
38
36
  tokens: {}
39
37
  a2ui:
40
38
  rules: []
41
39
  anti_patterns: []
42
40
  examples:
43
- - name: basic-command
44
- description: Basic Command usage
45
- a2ui: >-
46
- [
47
- {
48
- "id": "root",
49
- "component": "Card",
50
- "children": [
51
- "sec"
52
- ]
53
- },
54
- {
55
- "id": "sec",
56
- "component": "Section",
57
- "children": [
58
- "comp"
59
- ]
60
- },
61
- {
62
- "id": "comp",
63
- "component": "Command",
64
- "placeholder": "Enter command..."
65
- }
66
- ]
41
+ - name: basic-command
42
+ description: Basic Command usage
43
+ a2ui: "[\n {\n \"id\": \"root\",\n \"component\": \"Card\",\n \"children\": [\n \"sec\"\n ]\n },\n {\n\
44
+ \ \"id\": \"sec\",\n \"component\": \"Section\",\n \"children\": [\n \"comp\"\n ]\n },\n {\n \"\
45
+ id\": \"comp\",\n \"component\": \"Command\",\n \"placeholder\": \"Enter command...\"\n }\n]"
67
46
  keywords:
68
- - command
69
- - assistant
70
- - copilot
71
- - ai
72
- - prompt
73
- - console
74
- - menu
75
- - terminal
76
- - search
77
- - find
78
- - lookup
79
- - autocomplete
80
- - typeahead
81
- - spotlight
82
- - omnibar
83
- - combobox
84
- - palette
85
- - shortcut
86
- - hotkey
87
- - keyboard
88
- - keybinding
47
+ - command
48
+ - assistant
49
+ - copilot
50
+ - ai
51
+ - prompt
52
+ - console
53
+ - menu
54
+ - terminal
55
+ - search
56
+ - find
57
+ - lookup
58
+ - autocomplete
59
+ - typeahead
60
+ - spotlight
61
+ - omnibar
62
+ - combobox
63
+ - palette
64
+ - shortcut
65
+ - hotkey
66
+ - keyboard
67
+ - keybinding
89
68
  synonyms:
90
69
  ai:
91
- - chat
92
- - streaming
93
- - response
94
- - command
70
+ - chat
71
+ - streaming
72
+ - response
73
+ - command
95
74
  assistant:
96
- - chat
97
- - streaming
98
- - response
99
- - command
75
+ - chat
76
+ - streaming
77
+ - response
78
+ - command
100
79
  autocomplete:
101
- - search
102
- - command
103
- - palette
104
- - tag
80
+ - search
81
+ - command
82
+ - palette
83
+ - tag
105
84
  combobox:
106
- - search
107
- - command
108
- - select
85
+ - search
86
+ - command
87
+ - select
109
88
  command:
110
- - command
111
- - palette
112
- - kbd
113
- - shortcut
89
+ - command
90
+ - palette
91
+ - kbd
92
+ - shortcut
114
93
  console:
115
- - dashboard
116
- - table
117
- - data
118
- - sidebar
119
- - command
94
+ - dashboard
95
+ - table
96
+ - data
97
+ - sidebar
98
+ - command
120
99
  copilot:
121
- - chat
122
- - streaming
123
- - response
124
- - command
100
+ - chat
101
+ - streaming
102
+ - response
103
+ - command
125
104
  find:
126
- - search
127
- - filter
128
- - command
105
+ - search
106
+ - filter
107
+ - command
129
108
  hotkey:
130
- - kbd
131
- - shortcut
132
- - command
109
+ - kbd
110
+ - shortcut
111
+ - command
133
112
  keybinding:
134
- - kbd
135
- - shortcut
136
- - command
113
+ - kbd
114
+ - shortcut
115
+ - command
137
116
  keyboard:
138
- - kbd
139
- - shortcut
140
- - command
117
+ - kbd
118
+ - shortcut
119
+ - command
141
120
  lookup:
142
- - search
143
- - filter
144
- - command
121
+ - search
122
+ - filter
123
+ - command
145
124
  menu:
146
- - nav
147
- - sidebar
148
- - popover
149
- - menu
150
- - command
125
+ - nav
126
+ - sidebar
127
+ - popover
128
+ - menu
129
+ - command
151
130
  omnibar:
152
- - command
153
- - palette
154
- - search
131
+ - command
132
+ - palette
133
+ - search
155
134
  palette:
156
- - color
157
- - picker
158
- - command
159
- - palette
135
+ - color
136
+ - picker
137
+ - command
138
+ - palette
160
139
  prompt:
161
- - chat
162
- - streaming
163
- - command
164
- - palette
140
+ - chat
141
+ - streaming
142
+ - command
143
+ - palette
165
144
  search:
166
- - search
167
- - filter
168
- - command
169
- - palette
145
+ - search
146
+ - filter
147
+ - command
148
+ - palette
170
149
  shortcut:
171
- - kbd
172
- - shortcut
173
- - command
150
+ - kbd
151
+ - shortcut
152
+ - command
174
153
  spotlight:
175
- - command
176
- - palette
177
- - search
154
+ - command
155
+ - palette
156
+ - search
178
157
  terminal:
179
- - code
180
- - block
181
- - command
158
+ - code
159
+ - block
160
+ - command
182
161
  typeahead:
183
- - search
184
- - command
185
- - palette
162
+ - search
163
+ - command
164
+ - palette
165
+ tags:
166
+ - CommandPalette
186
167
  related: []