@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.
Files changed (316) hide show
  1. package/README.md +63 -24
  2. package/USAGE.md +604 -0
  3. package/components/accordion/accordion.d.ts +17 -0
  4. package/components/accordion/accordion.js +10 -117
  5. package/components/accordion/class.js +132 -0
  6. package/components/action-list/action-list.d.ts +15 -0
  7. package/components/action-list/action-list.js +9 -140
  8. package/components/action-list/class.js +156 -0
  9. package/components/agent-artifact/agent-artifact.d.ts +25 -0
  10. package/components/agent-artifact/agent-artifact.js +8 -181
  11. package/components/agent-artifact/class.js +200 -0
  12. package/components/agent-feedback-bar/agent-feedback-bar.d.ts +21 -0
  13. package/components/agent-feedback-bar/agent-feedback-bar.js +8 -143
  14. package/components/agent-feedback-bar/class.js +162 -0
  15. package/components/agent-questions/agent-questions.d.ts +23 -0
  16. package/components/agent-questions/agent-questions.js +8 -180
  17. package/components/agent-questions/class.js +199 -0
  18. package/components/agent-reasoning/agent-reasoning.d.ts +23 -0
  19. package/components/agent-reasoning/agent-reasoning.js +8 -494
  20. package/components/agent-reasoning/class.js +513 -0
  21. package/components/agent-suggestions/agent-suggestions.d.ts +21 -0
  22. package/components/agent-suggestions/agent-suggestions.js +8 -78
  23. package/components/agent-suggestions/class.js +97 -0
  24. package/components/agent-trace/agent-trace.d.ts +19 -0
  25. package/components/alert/alert.d.ts +29 -0
  26. package/components/alert/alert.js +8 -175
  27. package/components/alert/class.js +194 -0
  28. package/components/avatar/avatar.d.ts +27 -0
  29. package/components/avatar/avatar.js +9 -159
  30. package/components/avatar/class.js +173 -0
  31. package/components/badge/badge.d.ts +27 -0
  32. package/components/badge/badge.js +9 -75
  33. package/components/badge/class.js +93 -0
  34. package/components/block/block.d.ts +19 -0
  35. package/components/block/block.js +9 -15
  36. package/components/block/class.js +33 -0
  37. package/components/breadcrumb/breadcrumb.d.ts +23 -0
  38. package/components/breadcrumb/breadcrumb.js +8 -113
  39. package/components/breadcrumb/class.js +132 -0
  40. package/components/button/button.d.ts +34 -0
  41. package/components/button/button.js +15 -66
  42. package/components/button/class.js +80 -0
  43. package/components/calendar-picker/calendar-picker.a2ui.json +6 -1
  44. package/components/calendar-picker/calendar-picker.d.ts +27 -0
  45. package/components/calendar-picker/calendar-picker.js +8 -332
  46. package/components/calendar-picker/calendar-picker.yaml +51 -177
  47. package/components/calendar-picker/class.js +351 -0
  48. package/components/canvas/canvas.a2ui.json +6 -1
  49. package/components/canvas/canvas.d.ts +17 -0
  50. package/components/canvas/canvas.yaml +19 -36
  51. package/components/card/card.a2ui.json +3 -0
  52. package/components/card/card.d.ts +27 -0
  53. package/components/card/card.js +9 -50
  54. package/components/card/card.yaml +171 -433
  55. package/components/card/class.js +68 -0
  56. package/components/chart/chart.d.ts +41 -0
  57. package/components/chart/chart.js +8 -2131
  58. package/components/chart/class.js +2150 -0
  59. package/components/chart-legend/chart-legend.d.ts +27 -0
  60. package/components/chart-legend/chart-legend.js +8 -197
  61. package/components/chart-legend/class.js +215 -0
  62. package/components/chat-thread/chat-thread.d.ts +17 -0
  63. package/components/chat-thread/chat-thread.js +8 -157
  64. package/components/chat-thread/class.js +176 -0
  65. package/components/check/check.d.ts +30 -0
  66. package/components/check/check.js +11 -52
  67. package/components/check/class.js +68 -0
  68. package/components/code/class.js +501 -0
  69. package/components/code/code.d.ts +39 -0
  70. package/components/code/code.js +8 -482
  71. package/components/col/class.js +30 -0
  72. package/components/col/col.d.ts +23 -0
  73. package/components/col/col.js +10 -13
  74. package/components/color-picker/class.js +550 -0
  75. package/components/color-picker/color-picker.d.ts +37 -0
  76. package/components/color-picker/color-picker.js +8 -531
  77. package/components/command/class.js +364 -0
  78. package/components/command/command.a2ui.json +3 -0
  79. package/components/command/command.d.ts +19 -0
  80. package/components/command/command.js +8 -345
  81. package/components/command/command.yaml +105 -124
  82. package/components/demo-toggle/class.js +153 -0
  83. package/components/demo-toggle/demo-toggle.d.ts +23 -0
  84. package/components/demo-toggle/demo-toggle.js +8 -135
  85. package/components/description-list/class.js +86 -0
  86. package/components/description-list/description-list.d.ts +21 -0
  87. package/components/description-list/description-list.js +8 -67
  88. package/components/divider/class.js +57 -0
  89. package/components/divider/divider.d.ts +19 -0
  90. package/components/divider/divider.js +10 -40
  91. package/components/drawer/class.js +306 -0
  92. package/components/drawer/drawer.d.ts +25 -0
  93. package/components/drawer/drawer.js +8 -287
  94. package/components/embed/class.js +73 -0
  95. package/components/embed/embed.d.ts +23 -0
  96. package/components/embed/embed.js +9 -55
  97. package/components/empty-state/class.js +108 -0
  98. package/components/empty-state/empty-state.d.ts +21 -0
  99. package/components/empty-state/empty-state.js +9 -90
  100. package/components/feed/class.js +381 -0
  101. package/components/feed/feed.d.ts +19 -0
  102. package/components/feed/feed.js +9 -367
  103. package/components/field/class.js +266 -0
  104. package/components/field/field.d.ts +23 -0
  105. package/components/field/field.js +8 -247
  106. package/components/fields/class.js +106 -0
  107. package/components/fields/fields.d.ts +19 -0
  108. package/components/fields/fields.js +8 -87
  109. package/components/grid/class.js +31 -0
  110. package/components/grid/grid.d.ts +23 -0
  111. package/components/grid/grid.js +10 -14
  112. package/components/heatmap/class.js +305 -0
  113. package/components/heatmap/heatmap.d.ts +31 -0
  114. package/components/heatmap/heatmap.js +8 -286
  115. package/components/icon/class.js +54 -0
  116. package/components/icon/icon.d.ts +23 -0
  117. package/components/icon/icon.js +13 -40
  118. package/components/image/class.js +112 -0
  119. package/components/image/image.d.ts +33 -0
  120. package/components/image/image.js +9 -94
  121. package/components/index.js +1 -0
  122. package/components/input/class.js +773 -0
  123. package/components/input/input.a2ui.json +3 -0
  124. package/components/input/input.d.ts +61 -0
  125. package/components/input/input.js +8 -755
  126. package/components/input/input.yaml +171 -442
  127. package/components/inspector/class.js +142 -0
  128. package/components/inspector/inspector.a2ui.json +8 -1
  129. package/components/inspector/inspector.d.ts +17 -0
  130. package/components/inspector/inspector.js +8 -124
  131. package/components/inspector/inspector.yaml +15 -30
  132. package/components/kbd/class.js +34 -0
  133. package/components/kbd/kbd.a2ui.json +3 -0
  134. package/components/kbd/kbd.d.ts +17 -0
  135. package/components/kbd/kbd.js +10 -17
  136. package/components/kbd/kbd.yaml +54 -185
  137. package/components/link/class.js +187 -0
  138. package/components/link/link.d.ts +55 -0
  139. package/components/link/link.js +8 -168
  140. package/components/list/class.js +249 -0
  141. package/components/list/list.d.ts +23 -0
  142. package/components/list/list.js +9 -231
  143. package/components/menu/class.js +332 -0
  144. package/components/menu/menu.d.ts +21 -0
  145. package/components/menu/menu.js +11 -316
  146. package/components/modal/class.js +231 -0
  147. package/components/modal/modal.a2ui.json +5 -1
  148. package/components/modal/modal.d.ts +23 -0
  149. package/components/modal/modal.js +8 -212
  150. package/components/modal/modal.yaml +19 -39
  151. package/components/nav/class.js +150 -0
  152. package/components/nav/nav.d.ts +31 -0
  153. package/components/nav/nav.js +8 -131
  154. package/components/nav-group/class.js +152 -0
  155. package/components/nav-group/nav-group.d.ts +35 -0
  156. package/components/nav-group/nav-group.js +9 -134
  157. package/components/nav-item/class.js +86 -0
  158. package/components/nav-item/nav-item.d.ts +37 -0
  159. package/components/nav-item/nav-item.js +10 -69
  160. package/components/noodles/class.js +510 -0
  161. package/components/noodles/noodles.d.ts +33 -0
  162. package/components/noodles/noodles.js +9 -493
  163. package/components/option-card/class.js +167 -0
  164. package/components/option-card/option-card.d.ts +30 -0
  165. package/components/option-card/option-card.js +8 -149
  166. package/components/otp-input/class.js +180 -0
  167. package/components/otp-input/otp-input.a2ui.json +5 -1
  168. package/components/otp-input/otp-input.d.ts +25 -0
  169. package/components/otp-input/otp-input.js +9 -162
  170. package/components/otp-input/otp-input.yaml +45 -174
  171. package/components/page/class.js +97 -0
  172. package/components/page/page.d.ts +46 -0
  173. package/components/page/page.js +8 -79
  174. package/components/pagination/class.js +195 -0
  175. package/components/pagination/pagination.d.ts +23 -0
  176. package/components/pagination/pagination.js +9 -177
  177. package/components/pane/class.js +186 -0
  178. package/components/pane/pane.a2ui.json +12 -1
  179. package/components/pane/pane.css +10 -0
  180. package/components/pane/pane.d.ts +31 -0
  181. package/components/pane/pane.js +8 -143
  182. package/components/pane/pane.yaml +57 -157
  183. package/components/pipeline-status/class.js +189 -0
  184. package/components/pipeline-status/pipeline-status.a2ui.json +7 -1
  185. package/components/pipeline-status/pipeline-status.d.ts +21 -0
  186. package/components/pipeline-status/pipeline-status.js +9 -172
  187. package/components/pipeline-status/pipeline-status.yaml +34 -72
  188. package/components/popover/class.js +194 -0
  189. package/components/popover/popover.d.ts +23 -0
  190. package/components/popover/popover.js +9 -176
  191. package/components/progress/class.js +74 -0
  192. package/components/progress/progress.a2ui.json +3 -0
  193. package/components/progress/progress.d.ts +19 -0
  194. package/components/progress/progress.js +10 -57
  195. package/components/progress/progress.yaml +124 -287
  196. package/components/progress-row/class.js +110 -0
  197. package/components/progress-row/progress-row.d.ts +23 -0
  198. package/components/progress-row/progress-row.js +8 -92
  199. package/components/radio/class.js +83 -0
  200. package/components/radio/radio.d.ts +28 -0
  201. package/components/radio/radio.js +11 -67
  202. package/components/range/class.js +194 -0
  203. package/components/range/range.d.ts +31 -0
  204. package/components/range/range.js +9 -176
  205. package/components/rating/class.js +148 -0
  206. package/components/rating/rating.d.ts +33 -0
  207. package/components/rating/rating.js +9 -130
  208. package/components/richtext/class.js +87 -0
  209. package/components/richtext/richtext.a2ui.json +7 -1
  210. package/components/richtext/richtext.d.ts +19 -0
  211. package/components/richtext/richtext.js +8 -68
  212. package/components/richtext/richtext.yaml +30 -65
  213. package/components/row/class.js +50 -0
  214. package/components/row/row.d.ts +27 -0
  215. package/components/row/row.js +10 -33
  216. package/components/search/class.js +134 -0
  217. package/components/search/search.d.ts +35 -0
  218. package/components/search/search.js +10 -117
  219. package/components/segment/class.js +62 -0
  220. package/components/segment/segment.d.ts +25 -0
  221. package/components/segment/segment.js +10 -45
  222. package/components/segmented/class.js +165 -0
  223. package/components/segmented/segmented.a2ui.json +4 -0
  224. package/components/segmented/segmented.d.ts +24 -0
  225. package/components/segmented/segmented.js +10 -148
  226. package/components/segmented/segmented.yaml +41 -59
  227. package/components/select/class.js +408 -0
  228. package/components/select/select.d.ts +57 -0
  229. package/components/select/select.js +15 -396
  230. package/components/skeleton/class.js +52 -0
  231. package/components/skeleton/skeleton.d.ts +23 -0
  232. package/components/skeleton/skeleton.js +8 -34
  233. package/components/slider/class.js +184 -0
  234. package/components/slider/slider.d.ts +31 -0
  235. package/components/slider/slider.js +9 -166
  236. package/components/stack/class.js +28 -0
  237. package/components/stack/stack.d.ts +17 -0
  238. package/components/stack/stack.js +10 -11
  239. package/components/step-progress/class.js +98 -0
  240. package/components/step-progress/step-progress.d.ts +27 -0
  241. package/components/step-progress/step-progress.js +8 -79
  242. package/components/stepper/class.js +126 -0
  243. package/components/stepper/stepper.d.ts +19 -0
  244. package/components/stepper/stepper.js +9 -112
  245. package/components/stream/class.js +109 -0
  246. package/components/stream/stream.d.ts +19 -0
  247. package/components/stream/stream.js +8 -90
  248. package/components/swatch/class.js +131 -0
  249. package/components/swatch/swatch.d.ts +28 -0
  250. package/components/swatch/swatch.js +8 -112
  251. package/components/swiper/class.js +373 -0
  252. package/components/swiper/swiper.a2ui.json +4 -0
  253. package/components/swiper/swiper.d.ts +31 -0
  254. package/components/swiper/swiper.js +8 -354
  255. package/components/swiper/swiper.yaml +68 -212
  256. package/components/switch/class.js +63 -0
  257. package/components/switch/switch.a2ui.json +6 -1
  258. package/components/switch/switch.d.ts +30 -0
  259. package/components/switch/switch.js +11 -47
  260. package/components/switch/switch.yaml +70 -265
  261. package/components/table/class.js +1453 -0
  262. package/components/table/table.d.ts +37 -0
  263. package/components/table/table.js +8 -1435
  264. package/components/table-toolbar/class.js +680 -0
  265. package/components/table-toolbar/table-toolbar.d.ts +33 -0
  266. package/components/table-toolbar/table-toolbar.js +8 -689
  267. package/components/tabs/class.js +242 -0
  268. package/components/tabs/tabs.d.ts +21 -0
  269. package/components/tabs/tabs.js +8 -223
  270. package/components/tag/class.js +99 -0
  271. package/components/tag/tag.d.ts +27 -0
  272. package/components/tag/tag.js +8 -80
  273. package/components/text/class.js +46 -0
  274. package/components/text/text.d.ts +25 -0
  275. package/components/text/text.js +9 -28
  276. package/components/textarea/class.js +134 -0
  277. package/components/textarea/textarea.d.ts +31 -0
  278. package/components/textarea/textarea.js +11 -118
  279. package/components/timeline/class.js +176 -0
  280. package/components/timeline/timeline.d.ts +19 -0
  281. package/components/timeline/timeline.js +9 -162
  282. package/components/toast/class.js +92 -0
  283. package/components/toast/toast.d.ts +23 -0
  284. package/components/toast/toast.js +9 -76
  285. package/components/toggle-group/class.js +154 -0
  286. package/components/toggle-group/toggle-group.d.ts +19 -0
  287. package/components/toggle-group/toggle-group.js +11 -140
  288. package/components/toggle-scheme/class.js +286 -0
  289. package/components/toggle-scheme/toggle-scheme.a2ui.json +197 -0
  290. package/components/toggle-scheme/toggle-scheme.css +20 -0
  291. package/components/toggle-scheme/toggle-scheme.d.ts +41 -0
  292. package/components/toggle-scheme/toggle-scheme.js +17 -0
  293. package/components/toggle-scheme/toggle-scheme.yaml +173 -0
  294. package/components/toolbar/class.js +388 -0
  295. package/components/toolbar/toolbar.d.ts +23 -0
  296. package/components/toolbar/toolbar.js +10 -376
  297. package/components/tooltip/class.js +299 -0
  298. package/components/tooltip/tooltip.d.ts +27 -0
  299. package/components/tooltip/tooltip.js +8 -280
  300. package/components/tree/class.js +245 -0
  301. package/components/tree/tree.d.ts +15 -0
  302. package/components/tree/tree.js +9 -244
  303. package/components/upload/class.js +199 -0
  304. package/components/upload/upload.d.ts +27 -0
  305. package/components/upload/upload.js +11 -183
  306. package/core/element.d.ts +174 -0
  307. package/core/form.d.ts +108 -0
  308. package/core/index.d.ts +11 -0
  309. package/core/index.js +1 -0
  310. package/core/register.d.ts +25 -0
  311. package/core/register.js +58 -0
  312. package/core/signals.d.ts +94 -0
  313. package/core/template.d.ts +70 -0
  314. package/index.d.ts +315 -0
  315. package/package.json +25 -6
  316. package/traits/CATEGORIES.md +1 -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: []