@adia-ai/web-components 0.6.34 → 0.6.35

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 (271) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/color/index.js +1 -1
  3. package/components/accordion/accordion-item.yaml +2 -2
  4. package/components/accordion/accordion.js +1 -1
  5. package/components/action-list/action-item.yaml +2 -2
  6. package/components/action-list/action-list.js +1 -1
  7. package/components/agent-artifact/{class.js → agent-artifact.class.js} +1 -1
  8. package/components/agent-artifact/agent-artifact.js +1 -1
  9. package/components/agent-feedback-bar/agent-feedback-bar.js +1 -1
  10. package/components/agent-questions/agent-questions.js +1 -1
  11. package/components/agent-reasoning/agent-reasoning.js +1 -1
  12. package/components/agent-suggestions/agent-suggestions.js +1 -1
  13. package/components/alert/alert.a2ui.json +64 -1
  14. package/components/alert/{class.js → alert.class.js} +189 -2
  15. package/components/alert/alert.css +78 -0
  16. package/components/alert/alert.d.ts +14 -0
  17. package/components/alert/alert.js +1 -1
  18. package/components/alert/alert.test.js +184 -0
  19. package/components/alert/alert.yaml +114 -1
  20. package/components/avatar/avatar-group.yaml +2 -2
  21. package/components/avatar/avatar.js +1 -1
  22. package/components/badge/badge.js +1 -1
  23. package/components/block/block.js +1 -1
  24. package/components/breadcrumb/breadcrumb.js +1 -1
  25. package/components/button/button.js +1 -1
  26. package/components/calendar-grid/calendar-grid.a2ui.json +10 -0
  27. package/components/calendar-grid/{class.js → calendar-grid.class.js} +30 -4
  28. package/components/calendar-grid/calendar-grid.css +20 -0
  29. package/components/calendar-grid/calendar-grid.d.ts +4 -0
  30. package/components/calendar-grid/calendar-grid.js +1 -1
  31. package/components/calendar-grid/calendar-grid.yaml +20 -0
  32. package/components/calendar-picker/calendar-picker.js +1 -1
  33. package/components/card/card.js +1 -1
  34. package/components/chart/chart.js +1 -1
  35. package/components/chart-legend/chart-legend.js +1 -1
  36. package/components/chat-thread/chat-input.a2ui.json +1 -1
  37. package/components/chat-thread/chat-input.js +6 -1
  38. package/components/chat-thread/chat-input.yaml +4 -1
  39. package/components/chat-thread/chat-thread.js +1 -1
  40. package/components/check/check.js +1 -1
  41. package/components/code/code.js +1 -1
  42. package/components/col/col.js +1 -1
  43. package/components/color-input/color-input.js +1 -1
  44. package/components/color-picker/color-picker.js +1 -1
  45. package/components/combobox/combobox.js +1 -1
  46. package/components/command/command.js +1 -1
  47. package/components/date-range-picker/{class.js → date-range-picker.class.js} +18 -2
  48. package/components/date-range-picker/date-range-picker.css +51 -5
  49. package/components/date-range-picker/date-range-picker.js +1 -1
  50. package/components/datetime-picker/{class.js → datetime-picker.class.js} +1 -1
  51. package/components/datetime-picker/datetime-picker.js +1 -1
  52. package/components/demo-toggle/demo-toggle.js +1 -1
  53. package/components/description-list/description-list.js +1 -1
  54. package/components/divider/divider.js +1 -1
  55. package/components/drawer/drawer.js +1 -1
  56. package/components/embed/embed.js +1 -1
  57. package/components/empty-state/empty-state.js +1 -1
  58. package/components/feed/feed.js +1 -1
  59. package/components/field/field.js +1 -1
  60. package/components/field/field.test.js +1 -1
  61. package/components/fields/fields.js +1 -1
  62. package/components/grid/grid.js +1 -1
  63. package/components/heatmap/heatmap.js +1 -1
  64. package/components/icon/icon.js +1 -1
  65. package/components/image/image.js +1 -1
  66. package/components/index.js +3 -0
  67. package/components/inline-message/inline-message.a2ui.json +143 -0
  68. package/components/inline-message/inline-message.class.js +169 -0
  69. package/components/inline-message/inline-message.css +75 -0
  70. package/components/inline-message/inline-message.d.ts +31 -0
  71. package/components/inline-message/inline-message.examples.md +19 -0
  72. package/components/inline-message/inline-message.js +17 -0
  73. package/components/inline-message/inline-message.test.js +203 -0
  74. package/components/inline-message/inline-message.yaml +205 -0
  75. package/components/input/input.css +1 -1
  76. package/components/input/input.js +1 -1
  77. package/components/input/input.yaml +5 -4
  78. package/components/inspector/inspector.js +1 -1
  79. package/components/integration-card/integration-card.js +1 -1
  80. package/components/kbd/kbd.js +1 -1
  81. package/components/link/link.js +1 -1
  82. package/components/list/list-item.yaml +2 -2
  83. package/components/list/list.js +1 -1
  84. package/components/list-window/list-window.js +1 -1
  85. package/components/loading-overlay/loading-overlay.a2ui.json +176 -0
  86. package/components/loading-overlay/loading-overlay.class.js +203 -0
  87. package/components/loading-overlay/loading-overlay.css +81 -0
  88. package/components/loading-overlay/loading-overlay.d.ts +24 -0
  89. package/components/loading-overlay/loading-overlay.examples.md +50 -0
  90. package/components/loading-overlay/loading-overlay.js +17 -0
  91. package/components/loading-overlay/loading-overlay.test.js +257 -0
  92. package/components/loading-overlay/loading-overlay.yaml +260 -0
  93. package/components/menu/menu-divider.yaml +1 -1
  94. package/components/menu/menu-item.yaml +1 -1
  95. package/components/menu/menu.a2ui.json +3 -0
  96. package/components/menu/menu.js +1 -1
  97. package/components/menu/menu.yaml +7 -0
  98. package/components/modal/{class.js → modal.class.js} +12 -1
  99. package/components/modal/modal.css +11 -1
  100. package/components/modal/modal.js +1 -1
  101. package/components/nav/nav.js +1 -1
  102. package/components/nav-group/nav-group.js +1 -1
  103. package/components/nav-item/nav-item.js +1 -1
  104. package/components/noodles/noodles.js +1 -1
  105. package/components/option-card/option-card.js +1 -1
  106. package/components/otp-input/otp-input.js +1 -1
  107. package/components/page/page.js +1 -1
  108. package/components/pagination/pagination.js +1 -1
  109. package/components/pane/pane.js +1 -1
  110. package/components/pipeline-status/pipeline-status.js +1 -1
  111. package/components/popover/popover.a2ui.json +8 -1
  112. package/components/popover/popover.js +1 -1
  113. package/components/popover/popover.yaml +14 -1
  114. package/components/progress/progress.js +1 -1
  115. package/components/progress-row/progress-row.js +1 -1
  116. package/components/radio/radio.js +1 -1
  117. package/components/range/range.js +1 -1
  118. package/components/rating/rating.js +1 -1
  119. package/components/richtext/richtext.js +1 -1
  120. package/components/row/row.js +1 -1
  121. package/components/search/search.js +1 -1
  122. package/components/segment/segment.js +1 -1
  123. package/components/segmented/segmented.js +1 -1
  124. package/components/select/select.a2ui.json +58 -4
  125. package/components/select/{class.js → select.class.js} +415 -6
  126. package/components/select/select.css +158 -0
  127. package/components/select/select.d.ts +31 -1
  128. package/components/select/select.js +1 -1
  129. package/components/select/select.test.js +202 -0
  130. package/components/select/select.yaml +126 -5
  131. package/components/skeleton/skeleton.js +1 -1
  132. package/components/slider/slider.js +1 -1
  133. package/components/spinner/spinner.a2ui.json +3 -2
  134. package/components/spinner/{class.js → spinner.class.js} +33 -3
  135. package/components/spinner/spinner.css +91 -35
  136. package/components/spinner/spinner.d.ts +2 -2
  137. package/components/spinner/spinner.js +1 -1
  138. package/components/spinner/spinner.test.js +49 -11
  139. package/components/spinner/spinner.yaml +9 -1
  140. package/components/stack/stack.js +1 -1
  141. package/components/step-progress/step-progress.js +1 -1
  142. package/components/stepper/stepper-item.yaml +1 -1
  143. package/components/stepper/stepper.js +1 -1
  144. package/components/stream/stream.js +1 -1
  145. package/components/swatch/swatch.js +1 -1
  146. package/components/swiper/swiper.js +1 -1
  147. package/components/switch/switch.js +1 -1
  148. package/components/table/table.css +1 -1
  149. package/components/table/table.js +1 -1
  150. package/components/table-toolbar/{class.js → table-toolbar.class.js} +1 -1
  151. package/components/table-toolbar/table-toolbar.js +1 -1
  152. package/components/tabs/tab.yaml +2 -2
  153. package/components/tabs/tabs.js +1 -1
  154. package/components/tag/tag.js +1 -1
  155. package/components/tags-input/tags-input.a2ui.json +337 -0
  156. package/components/tags-input/tags-input.class.js +776 -0
  157. package/components/tags-input/tags-input.css +201 -0
  158. package/components/tags-input/tags-input.d.ts +120 -0
  159. package/components/tags-input/tags-input.examples.md +92 -0
  160. package/components/tags-input/tags-input.js +17 -0
  161. package/components/tags-input/tags-input.test.js +368 -0
  162. package/components/tags-input/tags-input.yaml +367 -0
  163. package/components/text/text.js +1 -1
  164. package/components/textarea/textarea.a2ui.json +1 -1
  165. package/components/textarea/textarea.js +1 -1
  166. package/components/textarea/textarea.yaml +11 -8
  167. package/components/time-picker/time-picker.js +1 -1
  168. package/components/timeline/timeline-item.yaml +2 -2
  169. package/components/timeline/{class.js → timeline.class.js} +1 -1
  170. package/components/timeline/timeline.js +1 -1
  171. package/components/toast/toast.js +1 -1
  172. package/components/toggle-group/toggle-group.js +1 -1
  173. package/components/toggle-group/toggle-option.yaml +1 -1
  174. package/components/toggle-scheme/toggle-scheme.js +1 -1
  175. package/components/toolbar/toolbar-group.yaml +1 -1
  176. package/components/toolbar/toolbar.js +1 -1
  177. package/components/tooltip/tooltip.js +1 -1
  178. package/components/tree/tree-item.yaml +1 -1
  179. package/components/tree/tree.js +1 -1
  180. package/components/upload/upload.js +1 -1
  181. package/dist/web-components.min.css +1 -1
  182. package/dist/web-components.min.js +111 -90
  183. package/package.json +3 -3
  184. package/styles/components.css +3 -0
  185. /package/components/accordion/{class.js → accordion.class.js} +0 -0
  186. /package/components/action-list/{class.js → action-list.class.js} +0 -0
  187. /package/components/agent-feedback-bar/{class.js → agent-feedback-bar.class.js} +0 -0
  188. /package/components/agent-questions/{class.js → agent-questions.class.js} +0 -0
  189. /package/components/agent-reasoning/{class.js → agent-reasoning.class.js} +0 -0
  190. /package/components/agent-suggestions/{class.js → agent-suggestions.class.js} +0 -0
  191. /package/components/avatar/{class.js → avatar.class.js} +0 -0
  192. /package/components/badge/{class.js → badge.class.js} +0 -0
  193. /package/components/block/{class.js → block.class.js} +0 -0
  194. /package/components/breadcrumb/{class.js → breadcrumb.class.js} +0 -0
  195. /package/components/button/{class.js → button.class.js} +0 -0
  196. /package/components/calendar-picker/{class.js → calendar-picker.class.js} +0 -0
  197. /package/components/card/{class.js → card.class.js} +0 -0
  198. /package/components/chart/{class.js → chart.class.js} +0 -0
  199. /package/components/chart-legend/{class.js → chart-legend.class.js} +0 -0
  200. /package/components/chat-thread/{class.js → chat-thread.class.js} +0 -0
  201. /package/components/check/{class.js → check.class.js} +0 -0
  202. /package/components/code/{class.js → code.class.js} +0 -0
  203. /package/components/col/{class.js → col.class.js} +0 -0
  204. /package/components/color-input/{class.js → color-input.class.js} +0 -0
  205. /package/components/color-picker/{class.js → color-picker.class.js} +0 -0
  206. /package/components/combobox/{class.js → combobox.class.js} +0 -0
  207. /package/components/command/{class.js → command.class.js} +0 -0
  208. /package/components/demo-toggle/{class.js → demo-toggle.class.js} +0 -0
  209. /package/components/description-list/{class.js → description-list.class.js} +0 -0
  210. /package/components/divider/{class.js → divider.class.js} +0 -0
  211. /package/components/drawer/{class.js → drawer.class.js} +0 -0
  212. /package/components/embed/{class.js → embed.class.js} +0 -0
  213. /package/components/empty-state/{class.js → empty-state.class.js} +0 -0
  214. /package/components/feed/{class.js → feed.class.js} +0 -0
  215. /package/components/field/{class.js → field.class.js} +0 -0
  216. /package/components/fields/{class.js → fields.class.js} +0 -0
  217. /package/components/grid/{class.js → grid.class.js} +0 -0
  218. /package/components/heatmap/{class.js → heatmap.class.js} +0 -0
  219. /package/components/icon/{class.js → icon.class.js} +0 -0
  220. /package/components/image/{class.js → image.class.js} +0 -0
  221. /package/components/input/{class.js → input.class.js} +0 -0
  222. /package/components/inspector/{class.js → inspector.class.js} +0 -0
  223. /package/components/integration-card/{class.js → integration-card.class.js} +0 -0
  224. /package/components/kbd/{class.js → kbd.class.js} +0 -0
  225. /package/components/link/{class.js → link.class.js} +0 -0
  226. /package/components/list/{class.js → list.class.js} +0 -0
  227. /package/components/list-window/{class.js → list-window.class.js} +0 -0
  228. /package/components/menu/{class.js → menu.class.js} +0 -0
  229. /package/components/nav/{class.js → nav.class.js} +0 -0
  230. /package/components/nav-group/{class.js → nav-group.class.js} +0 -0
  231. /package/components/nav-item/{class.js → nav-item.class.js} +0 -0
  232. /package/components/noodles/{class.js → noodles.class.js} +0 -0
  233. /package/components/option-card/{class.js → option-card.class.js} +0 -0
  234. /package/components/otp-input/{class.js → otp-input.class.js} +0 -0
  235. /package/components/page/{class.js → page.class.js} +0 -0
  236. /package/components/pagination/{class.js → pagination.class.js} +0 -0
  237. /package/components/pane/{class.js → pane.class.js} +0 -0
  238. /package/components/pipeline-status/{class.js → pipeline-status.class.js} +0 -0
  239. /package/components/popover/{class.js → popover.class.js} +0 -0
  240. /package/components/progress/{class.js → progress.class.js} +0 -0
  241. /package/components/progress-row/{class.js → progress-row.class.js} +0 -0
  242. /package/components/radio/{class.js → radio.class.js} +0 -0
  243. /package/components/range/{class.js → range.class.js} +0 -0
  244. /package/components/rating/{class.js → rating.class.js} +0 -0
  245. /package/components/richtext/{class.js → richtext.class.js} +0 -0
  246. /package/components/row/{class.js → row.class.js} +0 -0
  247. /package/components/search/{class.js → search.class.js} +0 -0
  248. /package/components/segment/{class.js → segment.class.js} +0 -0
  249. /package/components/segmented/{class.js → segmented.class.js} +0 -0
  250. /package/components/skeleton/{class.js → skeleton.class.js} +0 -0
  251. /package/components/slider/{class.js → slider.class.js} +0 -0
  252. /package/components/stack/{class.js → stack.class.js} +0 -0
  253. /package/components/step-progress/{class.js → step-progress.class.js} +0 -0
  254. /package/components/stepper/{class.js → stepper.class.js} +0 -0
  255. /package/components/stream/{class.js → stream.class.js} +0 -0
  256. /package/components/swatch/{class.js → swatch.class.js} +0 -0
  257. /package/components/swiper/{class.js → swiper.class.js} +0 -0
  258. /package/components/switch/{class.js → switch.class.js} +0 -0
  259. /package/components/table/{class.js → table.class.js} +0 -0
  260. /package/components/tabs/{class.js → tabs.class.js} +0 -0
  261. /package/components/tag/{class.js → tag.class.js} +0 -0
  262. /package/components/text/{class.js → text.class.js} +0 -0
  263. /package/components/textarea/{class.js → textarea.class.js} +0 -0
  264. /package/components/time-picker/{class.js → time-picker.class.js} +0 -0
  265. /package/components/toast/{class.js → toast.class.js} +0 -0
  266. /package/components/toggle-group/{class.js → toggle-group.class.js} +0 -0
  267. /package/components/toggle-scheme/{class.js → toggle-scheme.class.js} +0 -0
  268. /package/components/toolbar/{class.js → toolbar.class.js} +0 -0
  269. /package/components/tooltip/{class.js → tooltip.class.js} +0 -0
  270. /package/components/tree/{class.js → tree.class.js} +0 -0
  271. /package/components/upload/{class.js → upload.class.js} +0 -0
@@ -0,0 +1,367 @@
1
+ # Hand-authored — SPEC-042 (2026-05-24).
2
+ # Edit this file; run `npm run build:components` to regenerate a2ui.json.
3
+ $schema: ../../../../scripts/schemas/component.yaml.schema.json
4
+ name: UITagsInput
5
+ tag: tags-input-ui
6
+ status: experimental
7
+ component: TagsInput
8
+ category: input
9
+ version: 1
10
+ description: |
11
+ Free-form token input — type a value, press Enter (or the configured
12
+ delimiter) to commit it as a chip; Backspace from the empty inline
13
+ input removes the last chip. Distinct from <select-ui multiple>
14
+ (SPEC-040), which is constrained to a fixed option list — tags-input
15
+ is for OPEN sets (labels, email recipients, keyword inputs). Per
16
+ ADR-0025 the inline editor is a contenteditable surface (NO native
17
+ `<input>` wrap). Form-bearing via UIFormElement + ElementInternals:
18
+ the form value is a JSON-serialized string array under `[name]`.
19
+ Each rendered chip is a `<tag-ui removable>`; the `remove` event
20
+ delegates back to the host. Optional autocompletion: when
21
+ `.suggestions` is non-empty, a popover renders below the field and
22
+ the host announces as a combobox per WAI-APG.
23
+ # Per ADR-0027 — primitives that programmatically create other primitives
24
+ # do NOT auto-import them. Consumer (or demo shell) must explicitly import.
25
+ composes:
26
+ - tag-ui # rendered per committed token
27
+ - icon-ui # spinner glyph for async validators
28
+ props:
29
+ name:
30
+ description: Form field name. Serializes the token list as JSON under this key.
31
+ type: string
32
+ default: ""
33
+ reflect: true
34
+ value:
35
+ description: |-
36
+ Current token list (string array). Setting `.value = ['a','b']`
37
+ replaces the rendered chips. Reflection skipped — array values
38
+ do not round-trip through attribute strings.
39
+ type: array
40
+ default: []
41
+ dynamic: true
42
+ placeholder:
43
+ description: Placeholder text for the inline input when no chips are committed.
44
+ type: string
45
+ default: Add tag…
46
+ reflect: true
47
+ delimiter:
48
+ description: |-
49
+ Inline character that commits the typed value as a chip. The
50
+ sentinel `enter` disables in-line commit — only the Enter key
51
+ (or programmatic `addToken`) commits. Default is `,`.
52
+ type: string
53
+ default: ","
54
+ reflect: true
55
+ pasteSplit:
56
+ description: |-
57
+ Regex character-class fragment matched against pasted text to
58
+ split it into multiple tokens. Default `,\n` splits on commas
59
+ and newlines. Use `""` to disable paste-splitting entirely.
60
+ type: string
61
+ default: ",\n"
62
+ attribute: paste-split
63
+ reflect: true
64
+ max:
65
+ description: Maximum number of tokens. `0` (default) means unlimited.
66
+ type: number
67
+ default: 0
68
+ reflect: true
69
+ min:
70
+ description: Minimum required tokens for form validity.
71
+ type: number
72
+ default: 0
73
+ reflect: true
74
+ minLength:
75
+ description: Minimum per-token character count after `transform` is applied.
76
+ type: number
77
+ default: 1
78
+ attribute: min-length
79
+ reflect: true
80
+ maxLength:
81
+ description: Maximum per-token character count. `0` (default) means unlimited.
82
+ type: number
83
+ default: 0
84
+ attribute: max-length
85
+ reflect: true
86
+ unique:
87
+ description: Reject duplicate tokens silently (no `invalid` event for accidental dups).
88
+ type: boolean
89
+ default: true
90
+ reflect: true
91
+ transform:
92
+ description: |-
93
+ Normalize tokens on commit. `lowercase` lowercases, `trim` strips
94
+ leading + trailing whitespace, `strip-spaces` removes all
95
+ whitespace, `""` (default) preserves the typed value.
96
+ type: string
97
+ default: ""
98
+ enum:
99
+ - ""
100
+ - lowercase
101
+ - trim
102
+ - strip-spaces
103
+ reflect: true
104
+ suggestions:
105
+ description: |-
106
+ Optional autocomplete strings rendered in a popover below the
107
+ field. Suggestions are hints, not gates — the typed value still
108
+ wins on commit. JS property only (array reflection skipped).
109
+ type: array
110
+ default: []
111
+ dynamic: true
112
+ validateFn:
113
+ description: |-
114
+ Per-token validator. Sync `(value, index) => boolean` rejects
115
+ false synchronously; async `(value, index) => Promise<boolean>`
116
+ flips the host into `[validating]` while pending. JS property
117
+ only — not serializable in A2UI JSON; wire post-mount.
118
+ type: object
119
+ default: null
120
+ dynamic: true
121
+ disabled:
122
+ description: Block all interaction; dim the field.
123
+ type: boolean
124
+ default: false
125
+ reflect: true
126
+ readonly:
127
+ description: Block edits; allow inspection (chips render without remove buttons).
128
+ type: boolean
129
+ default: false
130
+ reflect: true
131
+ required:
132
+ description: Required for form validation. Empty array fails `:invalid`.
133
+ type: boolean
134
+ default: false
135
+ reflect: true
136
+ size:
137
+ description: |-
138
+ Sizing scale via universal `[size]` attribute system. Matches
139
+ Input + Combobox sizing tokens so a TagsInput rendered alongside
140
+ either feels coherent in a form row.
141
+ type: string
142
+ default: md
143
+ enum: [sm, md, lg]
144
+ reflect: true
145
+ events:
146
+ change:
147
+ description: Fired after `value` changes (token added or removed).
148
+ detail:
149
+ value:
150
+ type: array
151
+ description: Current token list (string array).
152
+ added:
153
+ type: array
154
+ description: Tokens added by this change (`[]` when only removals occurred).
155
+ removed:
156
+ type: array
157
+ description: Tokens removed by this change (`[]` when only additions occurred).
158
+ input:
159
+ description: Fired on each keystroke in the inline input (pre-commit).
160
+ detail:
161
+ query:
162
+ type: string
163
+ description: Current typed text in the inline input.
164
+ commit:
165
+ description: |-
166
+ Fired immediately before a token is committed. Call
167
+ `event.preventDefault()` to reject the candidate token.
168
+ detail:
169
+ value:
170
+ type: string
171
+ description: Candidate token text (post-transform).
172
+ accepted:
173
+ type: boolean
174
+ description: True unless the consumer calls `preventDefault()`.
175
+ invalid:
176
+ description: |-
177
+ Fired when a candidate token is rejected. Reasons cover all
178
+ built-in validators and the user-supplied `validateFn`.
179
+ detail:
180
+ value:
181
+ type: string
182
+ description: Rejected token text.
183
+ reason:
184
+ type: string
185
+ description: One of `duplicate` / `too-short` / `too-long` / `validator` / `max`.
186
+ slots:
187
+ chip:
188
+ description: |-
189
+ Custom chip template — receives `{value, index}` per token.
190
+ When absent, each token renders as a default
191
+ `<tag-ui removable text="<value>">`.
192
+ states:
193
+ - name: idle
194
+ description: No tokens; no typed text.
195
+ - name: populated
196
+ description: One or more tokens committed.
197
+ attribute: populated
198
+ - name: editing
199
+ description: User is typing into the inline input.
200
+ attribute: editing
201
+ - name: suggesting
202
+ description: Suggestion popover is open.
203
+ attribute: suggesting
204
+ - name: validating
205
+ description: Async `validateFn` is in flight.
206
+ attribute: validating
207
+ - name: disabled
208
+ description: Non-interactive; dimmed.
209
+ attribute: disabled
210
+ - name: readonly
211
+ description: Read-only; chips render without remove affordance.
212
+ attribute: readonly
213
+ traits: []
214
+ tokens:
215
+ --tags-input-bg:
216
+ description: Host background color.
217
+ --tags-input-fg:
218
+ description: Host foreground (typed-text color).
219
+ --tags-input-border:
220
+ description: Host border color (idle).
221
+ --tags-input-border-hover:
222
+ description: Host border color on hover.
223
+ --tags-input-radius:
224
+ description: Host border radius.
225
+ --tags-input-px:
226
+ description: Horizontal padding inside the chip-cluster wrapper.
227
+ --tags-input-py:
228
+ description: Vertical padding inside the chip-cluster wrapper.
229
+ --tags-input-gap:
230
+ description: Gap between chips and the inline input.
231
+ --tags-input-placeholder-fg:
232
+ description: Placeholder color for the empty inline input.
233
+ --tags-input-focus-ring:
234
+ description: Focus-ring box-shadow when the host is focus-within.
235
+ --tags-input-chip-bg-invalid:
236
+ description: Chip background color when a chip is marked invalid (validator rejection echo).
237
+ requiredIcons:
238
+ - circle-notch
239
+ a2ui:
240
+ rules:
241
+ - >-
242
+ Use <tags-input-ui> for OPEN-SET free-form token entry — labels,
243
+ keywords, email recipients, comma-separated lists. For CLOSED
244
+ option sets (pick N from a fixed list), use <select-ui multiple>
245
+ (SPEC-040) — that primitive gates the value against `options[]`.
246
+ - >-
247
+ `TagsInput.value` MUST be a string array. Pass `["a","b"]`, not
248
+ the comma-joined string `"a,b"`. The host parses string-form
249
+ `value` attributes as JSON; non-array shapes throw `invalid`.
250
+ - >-
251
+ `delimiter: "enter"` disables in-line character commits; only
252
+ the Enter key (or programmatic `addToken`) commits. Use this
253
+ when the token grammar legitimately includes the default `,`.
254
+ - >-
255
+ `unique: true` (default) silently coalesces accidental duplicate
256
+ adds. Do NOT emit `invalid` for those — the contract specifies
257
+ silent dedup for ergonomic typing.
258
+ - >-
259
+ `validateFn` is a JS property, NOT serializable in A2UI JSON.
260
+ Wire validators post-mount via DOM scripting; A2UI authors
261
+ should not expect to declare a validator in the JSON payload.
262
+ - >-
263
+ Chips are rendered automatically from `value`. Do NOT slot
264
+ individual <tag-ui> children manually — that decouples the
265
+ rendered DOM from the form value and breaks Backspace removal.
266
+ anti_patterns:
267
+ - wrong: |
268
+ {"component": "TagsInput", "options": [{"id": "a", "label": "A"}]}
269
+ why: |
270
+ TagsInput does NOT accept `options`. It is the OPEN-set primitive — any
271
+ typed string is valid. For closed option lists, use the multi-select
272
+ primitive with `multiple: true`.
273
+ fix: |
274
+ {"component": "Select", "multiple": true, "options": [{"id": "a", "label": "A"}]}
275
+ - wrong: |
276
+ {"component": "TagsInput", "value": "bug,high-priority"}
277
+ why: |
278
+ Comma-separated string is invalid for `value`. The contract requires
279
+ a string array.
280
+ fix: |
281
+ {"component": "TagsInput", "value": ["bug", "high-priority"]}
282
+ - wrong: |
283
+ {"component": "TagsInput", "children": [
284
+ {"component": "Tag", "text": "Tag 1"}
285
+ ]}
286
+ why: |
287
+ Chips are rendered automatically from `value`. Slotting Tag children
288
+ decouples the rendered DOM from the form value and breaks Backspace
289
+ removal + the `change` event payload.
290
+ fix: |
291
+ {"component": "TagsInput", "value": ["Tag 1"]}
292
+ examples:
293
+ - name: canonical-labels
294
+ description: Label input with lowercase normalization + max 10 tags + 2 pre-committed values.
295
+ a2ui: >-
296
+ [
297
+ {"id": "root", "component": "Card", "children": ["sec"]},
298
+ {"id": "sec", "component": "Section", "children": ["field"]},
299
+ {
300
+ "id": "field",
301
+ "component": "Field",
302
+ "label": "Labels",
303
+ "children": ["tags"]
304
+ },
305
+ {
306
+ "id": "tags",
307
+ "component": "TagsInput",
308
+ "name": "labels",
309
+ "placeholder": "Add a label, press Enter",
310
+ "transform": "lowercase",
311
+ "max": 10,
312
+ "value": ["bug", "high-priority"]
313
+ }
314
+ ]
315
+ - name: email-recipients
316
+ description: Recipient picker with Enter-only commit (commas are legal in display names).
317
+ a2ui: >-
318
+ [
319
+ {
320
+ "id": "to",
321
+ "component": "TagsInput",
322
+ "name": "to",
323
+ "placeholder": "Email…",
324
+ "delimiter": "enter",
325
+ "transform": "trim"
326
+ }
327
+ ]
328
+ keywords:
329
+ - tags-input
330
+ - tag-input
331
+ - token-input
332
+ - chips-input
333
+ - chip-input
334
+ - labels
335
+ - recipients
336
+ - keywords
337
+ - tags
338
+ - email-input
339
+ - multi-value-input
340
+ synonyms:
341
+ tags-input:
342
+ - tag-input
343
+ - chip-input
344
+ - token-input
345
+ - tokenizer
346
+ token-input:
347
+ - tags-input
348
+ - chip-input
349
+ - tokenizer
350
+ chips-input:
351
+ - tags-input
352
+ - chip-input
353
+ - token-input
354
+ labels:
355
+ - tags
356
+ - tag-input
357
+ - labels-input
358
+ recipients:
359
+ - email-input
360
+ - tags-input
361
+ - to-field
362
+ related:
363
+ - tag
364
+ - select
365
+ - combobox
366
+ - field
367
+ - input
@@ -10,7 +10,7 @@
10
10
  */
11
11
 
12
12
  import { defineIfFree } from '../../core/register.js';
13
- import { UIText } from './class.js';
13
+ import { UIText } from './text.class.js';
14
14
 
15
15
  defineIfFree('text-ui', UIText);
16
16
 
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://adiaui.dev/a2ui/v0_9/components/Textarea.json",
4
4
  "title": "Textarea",
5
- "description": "Multi-line text input primitive — the host IS the contenteditable\nsurface (per ADR-0025, no native <textarea> wrapped underneath).\nForm-bearing via UIFormElement: [name], [value], [required],\n[disabled], [readonly], fires `change` on blur and `input` per\nkeystroke. Enter inserts a newline does NOT fire `submit` (for\nEnter-to-send composers use <chat-input-ui submit-on-enter> inside\n<chat-composer>). Wrap in <field-ui label=\"…\"> for the canonical\nlabeled stack.\n",
5
+ "description": "Multi-line text input primitive — the host IS the contenteditable\nsurface (per ADR-0025, no native <textarea> wrapped underneath).\nForm-bearing via UIFormElement: [name], [value], [required],\n[disabled], [readonly], fires `change` on blur and `input` per\nkeystroke. Enter (without Shift) dispatches a bubbling `submit`\nevent — Shift+Enter inserts a newline. This is unconditional;\nthere is no opt-in/opt-out attribute. For Enter-to-send composers\nuse <chat-input-ui> inside <chat-composer>. Wrap in <field-ui\nlabel=\"…\"> for the canonical labeled stack.\n",
6
6
  "type": "object",
7
7
  "allOf": [
8
8
  {
@@ -10,7 +10,7 @@
10
10
  */
11
11
 
12
12
  import { defineIfFree } from '../../core/register.js';
13
- import { UITextarea } from './class.js';
13
+ import { UITextarea } from './textarea.class.js';
14
14
 
15
15
  defineIfFree('textarea-ui', UITextarea);
16
16
 
@@ -12,10 +12,11 @@ description: |
12
12
  surface (per ADR-0025, no native <textarea> wrapped underneath).
13
13
  Form-bearing via UIFormElement: [name], [value], [required],
14
14
  [disabled], [readonly], fires `change` on blur and `input` per
15
- keystroke. Enter inserts a newline does NOT fire `submit` (for
16
- Enter-to-send composers use <chat-input-ui submit-on-enter> inside
17
- <chat-composer>). Wrap in <field-ui label="…"> for the canonical
18
- labeled stack.
15
+ keystroke. Enter (without Shift) dispatches a bubbling `submit`
16
+ event — Shift+Enter inserts a newline. This is unconditional;
17
+ there is no opt-in/opt-out attribute. For Enter-to-send composers
18
+ use <chat-input-ui> inside <chat-composer>. Wrap in <field-ui
19
+ label="…"> for the canonical labeled stack.
19
20
  props:
20
21
  disabled:
21
22
  description: Disables interaction, removes contenteditable, and dims the control. Inherited from UIFormElement.
@@ -116,10 +117,12 @@ a2ui:
116
117
  control user resize. Never substitute a native <textarea> just
117
118
  to get rows / resize.
118
119
  - >-
119
- Enter inserts a newline <textarea-ui> does NOT emit a `submit`
120
- event. For Enter-to-send multi-line composers, use
121
- <chat-input-ui submit-on-enter> inside <chat-composer>, not
122
- textarea-ui.
120
+ Enter (without Shift) dispatches a bubbling `submit` event;
121
+ Shift+Enter inserts a newline. This is unconditional there
122
+ is no opt-in/opt-out attribute. For chat composer surfaces
123
+ wrap inside <chat-composer> + <chat-input-ui> (which adds the
124
+ send button + model picker + paste-to-attach plumbing on top
125
+ of the same Enter→submit semantics).
123
126
  anti_patterns: []
124
127
  examples:
125
128
  - name: basic-textarea
@@ -10,7 +10,7 @@
10
10
  */
11
11
 
12
12
  import { defineIfFree } from '../../core/register.js';
13
- import { UITimePicker } from './class.js';
13
+ import { UITimePicker } from './time-picker.class.js';
14
14
 
15
15
  defineIfFree('time-picker-ui', UITimePicker);
16
16
 
@@ -1,9 +1,9 @@
1
1
  # Edit this file; run `npm run build:components` to regenerate a2ui.json.
2
2
  #
3
3
  # §176 (v0.5.5): authored to close the §175 baseline-orphan class. The
4
- # component already existed as a sibling class in the parent's class.js
4
+ # component already existed as a sibling class in the parent's timeline.class.js
5
5
  # + was registered alongside the parent (e.g. UIList + UIListItem both
6
- # from list/class.js). The catalog just lacked its own entry. With the
6
+ # from list/list.class.js). The catalog just lacked its own entry. With the
7
7
  # §172 sibling-yaml scanner, this file gets picked up next to the parent
8
8
  # yaml.
9
9
 
@@ -88,7 +88,7 @@ export class UITimelineItem extends UIElement {
88
88
  };
89
89
 
90
90
  // §205 (v0.5.7): dynamic chevron icons stamped on expanded-state ternary
91
- // (class.js:167). Per FEEDBACK-16 §1 + §209 slot-11 ternary-walker discovery.
91
+ // (timeline.class.js:167). Per FEEDBACK-16 §1 + §209 slot-11 ternary-walker discovery.
92
92
  // Note: `this.icon` consumer-supplied — not declared here.
93
93
  static requiredIcons = ['caret-down', 'caret-right'];
94
94
 
@@ -10,7 +10,7 @@
10
10
  */
11
11
 
12
12
  import { defineIfFree } from '../../core/register.js';
13
- import { UITimeline, UITimelineItem } from './class.js';
13
+ import { UITimeline, UITimelineItem } from './timeline.class.js';
14
14
 
15
15
  defineIfFree('timeline-ui', UITimeline);
16
16
  defineIfFree('timeline-item-ui', UITimelineItem);
@@ -10,7 +10,7 @@
10
10
  */
11
11
 
12
12
  import { defineIfFree } from '../../core/register.js';
13
- import { UIToast } from './class.js';
13
+ import { UIToast } from './toast.class.js';
14
14
 
15
15
  defineIfFree('toast-ui', UIToast);
16
16
 
@@ -10,7 +10,7 @@
10
10
  */
11
11
 
12
12
  import { defineIfFree } from '../../core/register.js';
13
- import { UIToggleOption, UIToggleGroup } from './class.js';
13
+ import { UIToggleOption, UIToggleGroup } from './toggle-group.class.js';
14
14
 
15
15
  defineIfFree('toggle-option-ui', UIToggleOption);
16
16
  defineIfFree('toggle-group-ui', UIToggleGroup);
@@ -1,7 +1,7 @@
1
1
  # Edit this file; run `npm run build:components` to regenerate a2ui.json.
2
2
  #
3
3
  # §228 (v0.5.9): authored to close the §229 baseline class-export-undeclared
4
- # drift for UIToggleOption. Ships as a sibling class in toggle-group/class.js
4
+ # drift for UIToggleOption. Ships as a sibling class in toggle-group/toggle-group.class.js
5
5
  # + is registered alongside UIToggleGroup.
6
6
 
7
7
  # Child component of <toggle-group-ui>. Surface only inside that parent.
@@ -10,7 +10,7 @@
10
10
  */
11
11
 
12
12
  import { defineIfFree } from '../../core/register.js';
13
- import { UIToggleScheme } from './class.js';
13
+ import { UIToggleScheme } from './toggle-scheme.class.js';
14
14
 
15
15
  defineIfFree('toggle-scheme-ui', UIToggleScheme);
16
16
 
@@ -1,7 +1,7 @@
1
1
  # Edit this file; run `npm run build:components` to regenerate a2ui.json.
2
2
  #
3
3
  # §228 (v0.5.9): authored to close the §229 baseline class-export-undeclared
4
- # drift for UIToolbarGroup. Ships as a sibling class in toolbar/class.js
4
+ # drift for UIToolbarGroup. Ships as a sibling class in toolbar/toolbar.class.js
5
5
  # + is registered alongside UIToolbar.
6
6
 
7
7
  # Child component of <toolbar-ui>. Groups a set of action buttons inside
@@ -10,7 +10,7 @@
10
10
  */
11
11
 
12
12
  import { defineIfFree } from '../../core/register.js';
13
- import { UIToolbar, UIToolbarGroup } from './class.js';
13
+ import { UIToolbar, UIToolbarGroup } from './toolbar.class.js';
14
14
 
15
15
  defineIfFree('toolbar-ui', UIToolbar);
16
16
  defineIfFree('toolbar-group-ui', UIToolbarGroup);
@@ -10,7 +10,7 @@
10
10
  */
11
11
 
12
12
  import { defineIfFree } from '../../core/register.js';
13
- import { UITooltip } from './class.js';
13
+ import { UITooltip } from './tooltip.class.js';
14
14
 
15
15
  defineIfFree('tooltip-ui', UITooltip);
16
16
 
@@ -2,7 +2,7 @@
2
2
  #
3
3
  # §184 (v0.5.5): authored to close FEEDBACK-08 §1 — tree-item-ui badge
4
4
  # attribute + general orphan-class catalog gap. tree-item-ui has shipped
5
- # since v0.0.x co-located in tree/class.js (UITreeItem) but never had its
5
+ # since v0.0.x co-located in tree/tree.class.js (UITreeItem) but never had its
6
6
  # own catalog entry. With §172 sibling-yaml scanner, this file is picked
7
7
  # up next to the parent yaml. Mirrors the v0.5.5 §176 sibling-yaml
8
8
  # baseline-orphan closure pattern.
@@ -10,7 +10,7 @@
10
10
  */
11
11
 
12
12
  import { defineIfFree } from '../../core/register.js';
13
- import { UITree, UITreeItem } from './class.js';
13
+ import { UITree, UITreeItem } from './tree.class.js';
14
14
 
15
15
  defineIfFree('tree-ui', UITree);
16
16
  defineIfFree('tree-item-ui', UITreeItem);
@@ -10,7 +10,7 @@
10
10
  */
11
11
 
12
12
  import { defineIfFree } from '../../core/register.js';
13
- import { UIUpload } from './class.js';
13
+ import { UIUpload } from './upload.class.js';
14
14
 
15
15
  defineIfFree('upload-ui', UIUpload);
16
16