@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,77 +1,17 @@
1
- import { UIElement } from '../../core/element.js';
2
- import { renderMarkdown } from '../../core/markdown.js';
3
-
4
1
  /**
5
- * <richtext-ui>Renders markdown to styled HTML.
2
+ * `<richtext-ui>`auto-registers the tag on import.
6
3
  *
7
- * Takes markdown as a `src` URL (fetched) or `markdown` property (inline),
8
- * converts it to HTML, and displays it with prose-appropriate typography.
4
+ * For non-side-effect class import (test isolation, tag override), use
5
+ * the `class` subpath:
9
6
  *
10
- * Usage:
11
- * <richtext-ui src="/docs/readme.md"></richtext-ui>
12
- * <richtext-ui markdown="# Hello\nSome **bold** text."></richtext-ui>
7
+ * import { UIRichText } from '@adia-ai/web-components/components/richtext/class';
13
8
  *
14
- * Programmatic:
15
- * const el = document.querySelector('richtext-ui');
16
- * el.markdown = '# Title\nParagraph text.';
9
+ * @see ../../USAGE.md#registration--auto-vs-explicit
17
10
  */
18
- class UIRichText extends UIElement {
19
- static properties = {
20
- src: { type: String, default: '', reflect: true },
21
- // Markdown bodies can be arbitrarily large; reflecting to the attribute
22
- // would bloat the DOM (and break parsing on multi-line content with
23
- // unescaped quotes). The property is the source of truth.
24
- markdown: { type: String, default: '', reflect: false },
25
- };
26
-
27
- static template = () => null;
28
-
29
- #bodyEl = null;
30
- #lastSrc = '';
31
- #lastMd = '';
32
-
33
- connected() {
34
- if (!this.#bodyEl) {
35
- this.#bodyEl = document.createElement('div');
36
- this.#bodyEl.setAttribute('data-richtext-body', '');
37
- this.appendChild(this.#bodyEl);
38
- }
39
- }
40
-
41
- render() {
42
- // Fetch from URL
43
- if (this.src && this.src !== this.#lastSrc) {
44
- this.#lastSrc = this.src;
45
- this.#lastMd = '';
46
- this.#load();
47
- return;
48
- }
49
11
 
50
- // Inline markdown
51
- if (this.markdown && this.markdown !== this.#lastMd) {
52
- this.#lastMd = this.markdown;
53
- this.#lastSrc = '';
54
- this.#bodyEl.innerHTML = renderMarkdown(this.markdown);
55
- }
56
- }
12
+ import { defineIfFree } from '../../core/register.js';
13
+ import { UIRichText } from './class.js';
57
14
 
58
- async #load() {
59
- try {
60
- const res = await fetch(this.src);
61
- if (!this.isConnected) return;
62
- if (!res.ok) {
63
- this.#bodyEl.innerHTML = `<p>Failed to load: ${this.src}</p>`;
64
- return;
65
- }
66
- const md = await res.text();
67
- if (!this.isConnected) return;
68
- this.#bodyEl.innerHTML = renderMarkdown(md);
69
- } catch (e) {
70
- if (!this.isConnected) return;
71
- this.#bodyEl.innerHTML = `<p>Error: ${e.message}</p>`;
72
- }
73
- }
74
- }
15
+ defineIfFree('richtext-ui', UIRichText);
75
16
 
76
- customElements.define('richtext-ui', UIRichText);
77
17
  export { UIRichText };
@@ -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: UIRichtext
5
3
  tag: richtext-ui
@@ -9,81 +7,48 @@ version: 1
9
7
  description: Renders markdown to styled HTML.
10
8
  props:
11
9
  markdown:
12
- description: "Component property: markdown."
10
+ description: 'Component property: markdown.'
13
11
  type: string
14
- default: ""
12
+ default: ''
15
13
  src:
16
- description: "Source URL (image, iframe, etc.)."
14
+ description: Source URL (image, iframe, etc.).
17
15
  type: string
18
- default: ""
16
+ default: ''
19
17
  events: {}
20
18
  slots:
21
19
  default:
22
- description: "Default slot — primary child content."
20
+ description: Default slot — primary child content.
23
21
  states:
24
- - name: idle
25
- description: Default, ready for interaction.
22
+ - name: idle
23
+ description: Default, ready for interaction.
26
24
  traits: []
27
25
  tokens: {}
28
26
  a2ui:
29
27
  rules: []
30
28
  anti_patterns: []
31
29
  examples:
32
- - name: basic-richtext
33
- description: Basic Richtext usage
34
- a2ui: >-
35
- [
36
- {
37
- "id": "root",
38
- "component": "Card",
39
- "children": [
40
- "sec"
41
- ]
42
- },
43
- {
44
- "id": "sec",
45
- "component": "Section",
46
- "children": [
47
- "comp"
48
- ]
49
- },
50
- {
51
- "id": "comp",
52
- "component": "Richtext",
53
- "src": "/images/example.jpg"
54
- }
55
- ]
56
- - name: markdown
57
- description: Inline markdown text rendered to styled HTML via the markdown attribute.
58
- a2ui: >-
59
- [
60
- {
61
- "id": "root",
62
- "component": "Richtext",
63
- "markdown": "# Hello world\n\nWelcome to **AdiaUI**. This paragraph was parsed from markdown:\n\n- Lists\n- Render\n- Cleanly\n\n`inline code` and [links](https://example.com) work too."
64
- }
65
- ]
66
- - name: src
67
- description: Fetch a remote markdown file via src and render it; useful for docs pages.
68
- a2ui: >-
69
- [
70
- {
71
- "id": "root",
72
- "component": "Richtext",
73
- "src": "/README.md"
74
- }
75
- ]
76
- - name: code-blocks
77
- description: Richtext with fenced code blocks; whitespace preserved and monospace styling applied.
78
- a2ui: >-
79
- [
80
- {
81
- "id": "root",
82
- "component": "Richtext",
83
- "markdown": "## Example\n\n```js\nfunction greet(name) {\n return `Hello, ${name}!`;\n}\n```\n\nInline `code` also works."
84
- }
85
- ]
30
+ - name: basic-richtext
31
+ description: Basic Richtext usage
32
+ a2ui: "[\n {\n \"id\": \"root\",\n \"component\": \"Card\",\n \"children\": [\n \"sec\"\n ]\n },\n {\n\
33
+ \ \"id\": \"sec\",\n \"component\": \"Section\",\n \"children\": [\n \"comp\"\n ]\n },\n {\n \"\
34
+ id\": \"comp\",\n \"component\": \"Richtext\",\n \"src\": \"/images/example.jpg\"\n }\n]"
35
+ - name: markdown
36
+ description: Inline markdown text rendered to styled HTML via the markdown attribute.
37
+ a2ui: "[\n {\n \"id\": \"root\",\n \"component\": \"Richtext\",\n \"markdown\": \"# Hello world\\n\\nWelcome to\
38
+ \ **AdiaUI**. This paragraph was parsed from markdown:\\n\\n- Lists\\n- Render\\n- Cleanly\\n\\n`inline code` and [links](https://example.com)\
39
+ \ work too.\"\n }\n]"
40
+ - name: src
41
+ description: Fetch a remote markdown file via src and render it; useful for docs pages.
42
+ a2ui: "[\n {\n \"id\": \"root\",\n \"component\": \"Richtext\",\n \"src\": \"/README.md\"\n }\n]"
43
+ - name: code-blocks
44
+ description: Richtext with fenced code blocks; whitespace preserved and monospace styling applied.
45
+ a2ui: "[\n {\n \"id\": \"root\",\n \"component\": \"Richtext\",\n \"markdown\": \"## Example\\n\\n```js\\nfunction\
46
+ \ greet(name) {\\n return `Hello, ${name}!`;\\n}\\n```\\n\\nInline `code` also works.\"\n }\n]"
86
47
  keywords:
87
- - richtext
88
- synonyms: {}
48
+ - richtext
49
+ synonyms:
50
+ tags:
51
+ - markdown
52
+ - md-render
53
+ - rich-text
89
54
  related: []
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Non-side-effect class export for `<row-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/row`
9
+ * (which imports this file + calls `defineIfFree()`).
10
+ *
11
+ * @see ../../USAGE.md#registration--auto-vs-explicit
12
+ */
13
+
14
+ /**
15
+ * row-ui — Flex row layout primitive.
16
+ *
17
+ * <row-ui gap="sm" justify="space-between" wrap>...</row-ui>
18
+ * <row-ui draggable>...</row-ui> wires the draggable trait, emits drag-end
19
+ */
20
+
21
+ import { UIElement } from '../../core/element.js';
22
+ import { draggable } from '../../traits/draggable/draggable.js';
23
+
24
+ export class UIRow extends UIElement {
25
+ static properties = {
26
+ justify: { type: String, default: 'start', reflect: true },
27
+ align: { type: String, default: 'center', reflect: true },
28
+ gap: { type: String, default: 'md', reflect: true },
29
+ grow: { type: Boolean, default: false, reflect: true },
30
+ wrap: { type: Boolean, default: false, reflect: true },
31
+ draggable: { type: Boolean, default: false, reflect: true },
32
+ };
33
+ static template = () => null;
34
+
35
+ #dragAttached = false;
36
+
37
+ connected() {
38
+ if (this.draggable && !this.#dragAttached) {
39
+ this.addTrait(draggable);
40
+ this.#dragAttached = true;
41
+ }
42
+ }
43
+
44
+ updated(changed) {
45
+ if (changed.has('draggable') && this.draggable && !this.#dragAttached) {
46
+ this.addTrait(draggable);
47
+ this.#dragAttached = true;
48
+ }
49
+ }
50
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * `<row-ui>` — Flex row layout primitive.
3
+ *
4
+ * @see https://ui-kit.exe.xyz/site/components/row
5
+ *
6
+ * Type declarations generated by scripts/build/dts-codegen.mjs from
7
+ * the component's `.a2ui.json` sidecar. Edit the source `.yaml`,
8
+ * run `npm run components`, then `npm run codegen:dts` to regenerate;
9
+ * or hand-author this file fully if rich event types are needed.
10
+ */
11
+
12
+ import { UIElement } from '../../core/element.js';
13
+
14
+ export class UIRow extends UIElement {
15
+ /** Align items */
16
+ align: string;
17
+ /** Enables drag handle + cursor:grab. Wires the draggable trait; dispatches drag-end. */
18
+ draggable: boolean;
19
+ /** Gap between children. Accepts either the named scale (xs/sm/md/lg/xl) or a numeric rung on the spacing scale ("1"…"16"). */
20
+ gap: string;
21
+ /** Fills remaining space in a flex parent. CSS-only attribute via :scope[grow] in row.css. */
22
+ grow: boolean;
23
+ /** Justify content */
24
+ justify: string;
25
+ /** Enable flex wrap */
26
+ wrap: boolean;
27
+ }
@@ -1,40 +1,17 @@
1
1
  /**
2
- * row-ui — Flex row layout primitive.
2
+ * `<row-ui>`auto-registers the tag on import.
3
3
  *
4
- * <row-ui gap="sm" justify="space-between" wrap>...</row-ui>
5
- * <row-ui draggable>...</row-ui> wires the draggable trait, emits drag-end
4
+ * For non-side-effect class import (test isolation, tag override), use
5
+ * the `class` subpath:
6
+ *
7
+ * import { UIRow } from '@adia-ai/web-components/components/row/class';
8
+ *
9
+ * @see ../../USAGE.md#registration--auto-vs-explicit
6
10
  */
7
11
 
8
- import { UIElement } from '../../core/element.js';
9
- import { draggable } from '../../traits/draggable/draggable.js';
10
-
11
- class UIRow extends UIElement {
12
- static properties = {
13
- justify: { type: String, default: 'start', reflect: true },
14
- align: { type: String, default: 'center', reflect: true },
15
- gap: { type: String, default: 'md', reflect: true },
16
- grow: { type: Boolean, default: false, reflect: true },
17
- wrap: { type: Boolean, default: false, reflect: true },
18
- draggable: { type: Boolean, default: false, reflect: true },
19
- };
20
- static template = () => null;
21
-
22
- #dragAttached = false;
23
-
24
- connected() {
25
- if (this.draggable && !this.#dragAttached) {
26
- this.addTrait(draggable);
27
- this.#dragAttached = true;
28
- }
29
- }
12
+ import { defineIfFree } from '../../core/register.js';
13
+ import { UIRow } from './class.js';
30
14
 
31
- updated(changed) {
32
- if (changed.has('draggable') && this.draggable && !this.#dragAttached) {
33
- this.addTrait(draggable);
34
- this.#dragAttached = true;
35
- }
36
- }
37
- }
38
- customElements.define('row-ui', UIRow);
15
+ defineIfFree('row-ui', UIRow);
39
16
 
40
17
  export { UIRow };
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Non-side-effect class export for `<search-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/search`
9
+ * (which imports this file + calls `defineIfFree()`).
10
+ *
11
+ * @see ../../USAGE.md#registration--auto-vs-explicit
12
+ */
13
+
14
+ /**
15
+ * <search-ui placeholder="Search..."></search-ui>
16
+ * <search-ui debounce="500"></search-ui>
17
+ *
18
+ * Search input with magnifying-glass icon, clear button, and debounce.
19
+ * Composes input-ui internally — no raw <input> stamping.
20
+ * Fires debounced 'search' event. Clear button resets and fires immediately.
21
+ */
22
+
23
+ import { UIFormElement } from '../../core/form.js';
24
+
25
+ export class UISearch extends UIFormElement {
26
+ static properties = {
27
+ ...UIFormElement.properties,
28
+ placeholder: { type: String, default: 'Search...', reflect: true },
29
+ debounce: { type: Number, default: 300, reflect: true },
30
+ };
31
+
32
+ static template = () => null;
33
+
34
+ #inputEl = null;
35
+ #suffixEl = null;
36
+ #timer = null;
37
+
38
+ connected() {
39
+ super.connected();
40
+ this.setAttribute('role', 'search');
41
+
42
+ if (!this.querySelector('input-ui')) {
43
+ this.innerHTML = `<input-ui
44
+ type="search"
45
+ prefix="magnifying-glass"
46
+ suffix="x-circle"
47
+ placeholder="${this.placeholder}"
48
+ ${this.disabled ? 'disabled' : ''}
49
+ ></input-ui>`;
50
+ }
51
+
52
+ this.#inputEl = this.querySelector('input-ui');
53
+ if (this.#inputEl) {
54
+ this.#inputEl.addEventListener('input', this.#onInput);
55
+ this.#inputEl.addEventListener('keydown', this.#onKeydown);
56
+ this.#suffixEl = this.#inputEl.querySelector('[slot="suffix"]');
57
+ if (this.#suffixEl) {
58
+ this.#suffixEl.style.cursor = 'pointer';
59
+ this.#suffixEl.addEventListener('click', this.#onClear);
60
+ }
61
+ }
62
+ }
63
+
64
+ render() {
65
+ if (!this.#inputEl) return;
66
+
67
+ this.#inputEl.setAttribute('placeholder', this.placeholder);
68
+ if (this.disabled) this.#inputEl.setAttribute('disabled', '');
69
+ else this.#inputEl.removeAttribute('disabled');
70
+
71
+ // Reflect value for CSS (clear button visibility)
72
+ this.setAttribute('value', this.value || '');
73
+ }
74
+
75
+ #onInput = () => {
76
+ this.value = this.#inputEl.value;
77
+ this.syncValue(this.value);
78
+ this.dispatchEvent(new CustomEvent('input', { bubbles: true, detail: { value: this.value } }));
79
+
80
+ clearTimeout(this.#timer);
81
+ this.#timer = setTimeout(() => {
82
+ this.dispatchEvent(new CustomEvent('search', {
83
+ bubbles: true,
84
+ detail: { value: this.value },
85
+ }));
86
+ }, this.debounce || 300);
87
+ };
88
+
89
+ #onKeydown = (e) => {
90
+ if (e.key === 'Enter') {
91
+ clearTimeout(this.#timer);
92
+ this.dispatchEvent(new CustomEvent('search', {
93
+ bubbles: true,
94
+ detail: { value: this.value },
95
+ }));
96
+ }
97
+ if (e.key === 'Escape') {
98
+ this.#onClear();
99
+ }
100
+ };
101
+
102
+ #onClear = () => {
103
+ clearTimeout(this.#timer);
104
+ this.value = '';
105
+ if (this.#inputEl) this.#inputEl.value = '';
106
+ this.syncValue('');
107
+ this.setAttribute('value', '');
108
+ this.dispatchEvent(new CustomEvent('input', { bubbles: true, detail: { value: this.value } }));
109
+ this.dispatchEvent(new CustomEvent('search', {
110
+ bubbles: true,
111
+ detail: { value: '' },
112
+ }));
113
+ this.#inputEl?.focus();
114
+ };
115
+
116
+ focus() { this.#inputEl?.focus(); }
117
+
118
+ clear() { this.#onClear(); }
119
+
120
+ disconnected() {
121
+ super.disconnected();
122
+ clearTimeout(this.#timer);
123
+ this.#timer = null;
124
+ if (this.#inputEl) {
125
+ this.#inputEl.removeEventListener('input', this.#onInput);
126
+ this.#inputEl.removeEventListener('keydown', this.#onKeydown);
127
+ }
128
+ if (this.#suffixEl) {
129
+ this.#suffixEl.removeEventListener('click', this.#onClear);
130
+ }
131
+ this.#inputEl = null;
132
+ this.#suffixEl = null;
133
+ }
134
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * `<search-ui>` — Search input with debounce + clear button + Enter-to-search.
3
+ *
4
+ * @see https://ui-kit.exe.xyz/site/components/search
5
+ */
6
+
7
+ import { UIFormElement } from '../../core/form.js';
8
+
9
+ export interface SearchInputEventDetail {
10
+ value: string;
11
+ }
12
+ export type SearchInputEvent = CustomEvent<SearchInputEventDetail>;
13
+
14
+ export interface SearchEventDetail {
15
+ value: string;
16
+ }
17
+ /** Fired after debounce OR on Enter — your "do the search" trigger. */
18
+ export type SearchEvent = CustomEvent<SearchEventDetail>;
19
+
20
+ export class UISearch extends UIFormElement {
21
+ placeholder: string;
22
+ /** Debounce delay in ms before `search` event fires. */
23
+ debounce: number;
24
+
25
+ /** Programmatically focus the inner input. */
26
+ focus(): void;
27
+
28
+ addEventListener<K extends keyof HTMLElementEventMap>(
29
+ type: K,
30
+ listener: (this: UISearch, ev: HTMLElementEventMap[K]) => unknown,
31
+ options?: boolean | AddEventListenerOptions,
32
+ ): void;
33
+ addEventListener(type: 'input', listener: (ev: SearchInputEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
34
+ addEventListener(type: 'search', listener: (ev: SearchEvent) => unknown, options?: boolean | AddEventListenerOptions): void;
35
+ }
@@ -1,124 +1,17 @@
1
1
  /**
2
- * <search-ui placeholder="Search..."></search-ui>
3
- * <search-ui debounce="500"></search-ui>
2
+ * `<search-ui>` — auto-registers the tag on import.
4
3
  *
5
- * Search input with magnifying-glass icon, clear button, and debounce.
6
- * Composes input-ui internally — no raw <input> stamping.
7
- * Fires debounced 'search' event. Clear button resets and fires immediately.
4
+ * For non-side-effect class import (test isolation, tag override), use
5
+ * the `class` subpath:
6
+ *
7
+ * import { UISearch } from '@adia-ai/web-components/components/search/class';
8
+ *
9
+ * @see ../../USAGE.md#registration--auto-vs-explicit
8
10
  */
9
11
 
10
- import { UIFormElement } from '../../core/form.js';
11
-
12
- class UISearch extends UIFormElement {
13
- static properties = {
14
- ...UIFormElement.properties,
15
- placeholder: { type: String, default: 'Search...', reflect: true },
16
- debounce: { type: Number, default: 300, reflect: true },
17
- };
18
-
19
- static template = () => null;
20
-
21
- #inputEl = null;
22
- #suffixEl = null;
23
- #timer = null;
24
-
25
- connected() {
26
- super.connected();
27
- this.setAttribute('role', 'search');
28
-
29
- if (!this.querySelector('input-ui')) {
30
- this.innerHTML = `<input-ui
31
- type="search"
32
- prefix="magnifying-glass"
33
- suffix="x-circle"
34
- placeholder="${this.placeholder}"
35
- ${this.disabled ? 'disabled' : ''}
36
- ></input-ui>`;
37
- }
38
-
39
- this.#inputEl = this.querySelector('input-ui');
40
- if (this.#inputEl) {
41
- this.#inputEl.addEventListener('input', this.#onInput);
42
- this.#inputEl.addEventListener('keydown', this.#onKeydown);
43
- this.#suffixEl = this.#inputEl.querySelector('[slot="suffix"]');
44
- if (this.#suffixEl) {
45
- this.#suffixEl.style.cursor = 'pointer';
46
- this.#suffixEl.addEventListener('click', this.#onClear);
47
- }
48
- }
49
- }
50
-
51
- render() {
52
- if (!this.#inputEl) return;
53
-
54
- this.#inputEl.setAttribute('placeholder', this.placeholder);
55
- if (this.disabled) this.#inputEl.setAttribute('disabled', '');
56
- else this.#inputEl.removeAttribute('disabled');
57
-
58
- // Reflect value for CSS (clear button visibility)
59
- this.setAttribute('value', this.value || '');
60
- }
61
-
62
- #onInput = () => {
63
- this.value = this.#inputEl.value;
64
- this.syncValue(this.value);
65
- this.dispatchEvent(new CustomEvent('input', { bubbles: true, detail: { value: this.value } }));
66
-
67
- clearTimeout(this.#timer);
68
- this.#timer = setTimeout(() => {
69
- this.dispatchEvent(new CustomEvent('search', {
70
- bubbles: true,
71
- detail: { value: this.value },
72
- }));
73
- }, this.debounce || 300);
74
- };
75
-
76
- #onKeydown = (e) => {
77
- if (e.key === 'Enter') {
78
- clearTimeout(this.#timer);
79
- this.dispatchEvent(new CustomEvent('search', {
80
- bubbles: true,
81
- detail: { value: this.value },
82
- }));
83
- }
84
- if (e.key === 'Escape') {
85
- this.#onClear();
86
- }
87
- };
88
-
89
- #onClear = () => {
90
- clearTimeout(this.#timer);
91
- this.value = '';
92
- if (this.#inputEl) this.#inputEl.value = '';
93
- this.syncValue('');
94
- this.setAttribute('value', '');
95
- this.dispatchEvent(new CustomEvent('input', { bubbles: true, detail: { value: this.value } }));
96
- this.dispatchEvent(new CustomEvent('search', {
97
- bubbles: true,
98
- detail: { value: '' },
99
- }));
100
- this.#inputEl?.focus();
101
- };
102
-
103
- focus() { this.#inputEl?.focus(); }
104
-
105
- clear() { this.#onClear(); }
12
+ import { defineIfFree } from '../../core/register.js';
13
+ import { UISearch } from './class.js';
106
14
 
107
- disconnected() {
108
- super.disconnected();
109
- clearTimeout(this.#timer);
110
- this.#timer = null;
111
- if (this.#inputEl) {
112
- this.#inputEl.removeEventListener('input', this.#onInput);
113
- this.#inputEl.removeEventListener('keydown', this.#onKeydown);
114
- }
115
- if (this.#suffixEl) {
116
- this.#suffixEl.removeEventListener('click', this.#onClear);
117
- }
118
- this.#inputEl = null;
119
- this.#suffixEl = null;
120
- }
121
- }
122
- customElements.define('search-ui', UISearch);
15
+ defineIfFree('search-ui', UISearch);
123
16
 
124
17
  export { UISearch };