@fusion.dev/helix-headless 0.143.0 → 0.145.0

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 (314) hide show
  1. package/custom-elements.json +16990 -1383
  2. package/dist/accordion/item/accordion-item.d.ts +48 -12
  3. package/dist/accordion/item/accordion-item.js +26 -5
  4. package/dist/accordion/root/accordion-root.d.ts +6 -0
  5. package/dist/accordion/root/accordion-root.js +7 -1
  6. package/dist/announcement/root/announcement-root.d.ts +21 -1
  7. package/dist/announcement/root/announcement-root.js +36 -1
  8. package/dist/app-header/root/app-header-root.d.ts +7 -0
  9. package/dist/app-header/root/app-header-root.js +5 -1
  10. package/dist/app-header/sectioning.d.ts +7 -0
  11. package/dist/app-header/sectioning.js +26 -0
  12. package/dist/area-chart/root/area-chart-root.d.ts +12 -4
  13. package/dist/area-chart/root/area-chart-root.js +24 -7
  14. package/dist/avatar/root/avatar-root.d.ts +14 -0
  15. package/dist/avatar/root/avatar-root.js +23 -9
  16. package/dist/badge/root/badge-root.d.ts +11 -7
  17. package/dist/badge/root/badge-root.js +1 -1
  18. package/dist/bar-chart/root/bar-chart-root.d.ts +12 -3
  19. package/dist/bar-chart/root/bar-chart-root.js +17 -10
  20. package/dist/breadcrumbs/root/breadcrumbs-root.d.ts +32 -1
  21. package/dist/breadcrumbs/root/breadcrumbs-root.js +25 -2
  22. package/dist/button/root/button-root.d.ts +47 -1
  23. package/dist/button/root/button-root.js +38 -4
  24. package/dist/callout/root/callout-root.d.ts +18 -1
  25. package/dist/callout/root/callout-root.js +15 -4
  26. package/dist/canvas/root/canvas-root.d.ts +38 -3
  27. package/dist/canvas/root/canvas-root.js +121 -40
  28. package/dist/card/root/card-root.d.ts +30 -1
  29. package/dist/card/root/card-root.js +38 -5
  30. package/dist/carousel/root/carousel-root.d.ts +90 -0
  31. package/dist/carousel/root/carousel-root.js +134 -12
  32. package/dist/chat/composer/chat-composer.d.ts +38 -6
  33. package/dist/chat/composer/chat-composer.js +42 -9
  34. package/dist/chat/message/chat-message.d.ts +32 -1
  35. package/dist/chat/message/chat-message.js +25 -9
  36. package/dist/chat/naming.d.ts +22 -0
  37. package/dist/chat/naming.js +12 -0
  38. package/dist/chat/relative-clock.d.ts +39 -0
  39. package/dist/chat/relative-clock.js +31 -0
  40. package/dist/chat/root/chat-root.d.ts +36 -0
  41. package/dist/chat/root/chat-root.js +24 -1
  42. package/dist/checkbox/root/checkbox-root.js +2 -0
  43. package/dist/checkbox-group/root/checkbox-group-root.d.ts +53 -3
  44. package/dist/checkbox-group/root/checkbox-group-root.js +71 -22
  45. package/dist/code-block/lines.d.ts +13 -0
  46. package/dist/code-block/lines.js +2 -0
  47. package/dist/code-block/root/code-block-root.d.ts +38 -1
  48. package/dist/code-block/root/code-block-root.js +28 -7
  49. package/dist/color-input/root/color-input-root.d.ts +34 -1
  50. package/dist/color-input/root/color-input-root.js +23 -4
  51. package/dist/color-picker/channels.d.ts +26 -0
  52. package/dist/color-picker/channels.js +84 -0
  53. package/dist/color-picker/root/color-picker-root.d.ts +81 -5
  54. package/dist/color-picker/root/color-picker-root.js +103 -10
  55. package/dist/combobox/root/combobox-root.d.ts +38 -3
  56. package/dist/combobox/root/combobox-root.js +64 -2
  57. package/dist/command/root/command-root.d.ts +30 -4
  58. package/dist/command/root/command-root.js +33 -3
  59. package/dist/copy-button/from.d.ts +22 -0
  60. package/dist/copy-button/from.js +28 -0
  61. package/dist/copy-button/root/copy-button-root.d.ts +47 -1
  62. package/dist/copy-button/root/copy-button-root.js +44 -8
  63. package/dist/data-table/root/data-table-root.d.ts +150 -2
  64. package/dist/data-table/root/data-table-root.js +303 -29
  65. package/dist/data-table/tree.d.ts +40 -0
  66. package/dist/data-table/tree.js +55 -0
  67. package/dist/date-input/root/date-input-root.d.ts +73 -4
  68. package/dist/date-input/root/date-input-root.js +93 -43
  69. package/dist/date-picker/root/date-picker-root.d.ts +145 -1
  70. package/dist/date-picker/root/date-picker-root.js +239 -48
  71. package/dist/description-list/item/description-list-item.d.ts +17 -2
  72. package/dist/description-list/item/description-list-item.js +15 -2
  73. package/dist/description-list/root/description-list-root.d.ts +27 -1
  74. package/dist/description-list/root/description-list-root.js +26 -1
  75. package/dist/dialog/description.d.ts +9 -0
  76. package/dist/dialog/description.js +14 -0
  77. package/dist/dialog/root/dialog-root.d.ts +64 -1
  78. package/dist/dialog/root/dialog-root.js +49 -23
  79. package/dist/donut-chart/root/donut-chart-root.d.ts +25 -4
  80. package/dist/donut-chart/root/donut-chart-root.js +21 -6
  81. package/dist/drawer/root/drawer-root.d.ts +63 -2
  82. package/dist/drawer/root/drawer-root.js +95 -19
  83. package/dist/drawer/swipe-start.d.ts +9 -0
  84. package/dist/drawer/swipe-start.js +12 -0
  85. package/dist/drilldown/item/drilldown-item.d.ts +11 -6
  86. package/dist/drilldown/item/drilldown-item.js +8 -5
  87. package/dist/drilldown/root/drilldown-root.d.ts +11 -0
  88. package/dist/drilldown/root/drilldown-root.js +8 -3
  89. package/dist/element-events.generated.js +61 -13
  90. package/dist/empty/root/empty-root.d.ts +1 -1
  91. package/dist/file-input/root/file-input-root.d.ts +47 -0
  92. package/dist/file-input/root/file-input-root.js +60 -22
  93. package/dist/file-input/screen.d.ts +35 -0
  94. package/dist/file-input/screen.js +49 -0
  95. package/dist/filter-input/menu/filter-menu.d.ts +3 -0
  96. package/dist/filter-input/menu/filter-menu.js +8 -4
  97. package/dist/filter-input/root/filter-input-root.d.ts +38 -4
  98. package/dist/filter-input/root/filter-input-root.js +67 -3
  99. package/dist/filter-input/suggest.d.ts +17 -0
  100. package/dist/filter-input/suggest.js +23 -0
  101. package/dist/format-date/options.d.ts +33 -0
  102. package/dist/format-date/options.js +42 -0
  103. package/dist/format-date/root/format-date-root.d.ts +51 -0
  104. package/dist/format-date/root/format-date-root.js +58 -38
  105. package/dist/heatmap/root/heatmap-root.d.ts +23 -6
  106. package/dist/heatmap/root/heatmap-root.js +24 -13
  107. package/dist/icon/index.d.ts +2 -0
  108. package/dist/icon/index.js +2 -0
  109. package/dist/icon/registry.d.ts +37 -0
  110. package/dist/icon/registry.js +83 -0
  111. package/dist/icon/root/icon-root.d.ts +30 -4
  112. package/dist/icon/root/icon-root.js +41 -6
  113. package/dist/icon/root/index.d.ts +2 -0
  114. package/dist/icon/root/index.js +2 -0
  115. package/dist/icon/set.d.ts +1 -0
  116. package/dist/icon/set.js +3 -0
  117. package/dist/image/root/image-root.d.ts +14 -0
  118. package/dist/image/root/image-root.js +23 -2
  119. package/dist/input/root/input-root.d.ts +11 -0
  120. package/dist/input/root/input-root.js +16 -1
  121. package/dist/kbd/root/kbd-root.d.ts +20 -13
  122. package/dist/kbd/root/kbd-root.js +35 -37
  123. package/dist/kbd/shortcut.d.ts +18 -0
  124. package/dist/kbd/shortcut.js +35 -0
  125. package/dist/legend/hidden-series.d.ts +8 -0
  126. package/dist/legend/hidden-series.js +13 -0
  127. package/dist/legend/root/legend-root.d.ts +56 -0
  128. package/dist/legend/root/legend-root.js +54 -5
  129. package/dist/lightbox/item/lightbox-item.d.ts +15 -0
  130. package/dist/lightbox/item/lightbox-item.js +10 -1
  131. package/dist/lightbox/root/lightbox-root.d.ts +61 -1
  132. package/dist/lightbox/root/lightbox-root.js +94 -4
  133. package/dist/line-chart/root/line-chart-root.d.ts +11 -3
  134. package/dist/line-chart/root/line-chart-root.js +19 -5
  135. package/dist/list/item/list-item.d.ts +68 -1
  136. package/dist/list/item/list-item.js +66 -4
  137. package/dist/list/numbering.d.ts +14 -0
  138. package/dist/list/numbering.js +8 -0
  139. package/dist/list/root/list-root.d.ts +106 -9
  140. package/dist/list/root/list-root.js +189 -4
  141. package/dist/list/selection.d.ts +19 -0
  142. package/dist/list/selection.js +21 -0
  143. package/dist/listbox/root/listbox-root.d.ts +74 -3
  144. package/dist/listbox/root/listbox-root.js +86 -9
  145. package/dist/loader/busy.d.ts +17 -0
  146. package/dist/loader/busy.js +24 -0
  147. package/dist/loader/root/loader-root.d.ts +37 -0
  148. package/dist/loader/root/loader-root.js +52 -3
  149. package/dist/map/root/map-root.d.ts +6 -2
  150. package/dist/map/root/map-root.js +5 -2
  151. package/dist/megamenu/root/megamenu-root.d.ts +21 -0
  152. package/dist/megamenu/root/megamenu-root.js +16 -2
  153. package/dist/menu/index.d.ts +1 -0
  154. package/dist/menu/index.js +1 -0
  155. package/dist/menu/item/menu-item.d.ts +38 -11
  156. package/dist/menu/item/menu-item.js +33 -1
  157. package/dist/menu/root/menu-root.d.ts +25 -1
  158. package/dist/menu/root/menu-root.js +63 -6
  159. package/dist/menu/section/menu-section.d.ts +55 -0
  160. package/dist/menu/section/menu-section.js +60 -0
  161. package/dist/meter/root/meter-root.d.ts +7 -0
  162. package/dist/meter/root/meter-root.js +6 -3
  163. package/dist/navigation/root/navigation-root.d.ts +16 -1
  164. package/dist/navigation/root/navigation-root.js +27 -1
  165. package/dist/notifications/feed-keys.d.ts +10 -0
  166. package/dist/notifications/feed-keys.js +14 -0
  167. package/dist/notifications/notification/notification.d.ts +17 -0
  168. package/dist/notifications/notification/notification.js +21 -2
  169. package/dist/notifications/root/notifications-root.d.ts +60 -0
  170. package/dist/notifications/root/notifications-root.js +76 -1
  171. package/dist/number-input/root/number-input-root.d.ts +47 -0
  172. package/dist/number-input/root/number-input-root.js +58 -22
  173. package/dist/object-inspector/root/object-inspector-root.d.ts +98 -16
  174. package/dist/object-inspector/root/object-inspector-root.js +180 -80
  175. package/dist/object-inspector/rows.d.ts +57 -0
  176. package/dist/object-inspector/rows.js +86 -0
  177. package/dist/option/root/option-root.d.ts +54 -5
  178. package/dist/option/root/option-root.js +34 -5
  179. package/dist/outline/levels.d.ts +31 -0
  180. package/dist/outline/levels.js +23 -0
  181. package/dist/outline/root/outline-root.d.ts +68 -3
  182. package/dist/outline/root/outline-root.js +73 -8
  183. package/dist/pagination/size/pagination-size.d.ts +11 -2
  184. package/dist/pagination/size/pagination-size.js +19 -4
  185. package/dist/pin-input/format.d.ts +7 -0
  186. package/dist/pin-input/format.js +16 -0
  187. package/dist/pin-input/root/pin-input-root.d.ts +21 -0
  188. package/dist/pin-input/root/pin-input-root.js +29 -2
  189. package/dist/popover/root/popover-root.d.ts +62 -4
  190. package/dist/popover/root/popover-root.js +53 -5
  191. package/dist/progress/root/progress-root.d.ts +7 -0
  192. package/dist/progress/root/progress-root.js +9 -3
  193. package/dist/qr-code/export.d.ts +31 -0
  194. package/dist/qr-code/export.js +10 -0
  195. package/dist/qr-code/root/qr-code-root.d.ts +26 -0
  196. package/dist/qr-code/root/qr-code-root.js +49 -2
  197. package/dist/radio/group/radio-group.d.ts +17 -0
  198. package/dist/radio/group/radio-group.js +14 -1
  199. package/dist/rating/root/rating-root.d.ts +25 -0
  200. package/dist/rating/root/rating-root.js +46 -4
  201. package/dist/scatter-chart/root/scatter-chart-root.d.ts +17 -3
  202. package/dist/scatter-chart/root/scatter-chart-root.js +25 -7
  203. package/dist/scroll-area/root/scroll-area-root.d.ts +113 -0
  204. package/dist/scroll-area/root/scroll-area-root.js +218 -3
  205. package/dist/scroll-area/scrollbar.d.ts +65 -0
  206. package/dist/scroll-area/scrollbar.js +24 -0
  207. package/dist/select/root/select-root.d.ts +24 -0
  208. package/dist/select/root/select-root.js +21 -7
  209. package/dist/skeleton/root/skeleton-root.d.ts +25 -0
  210. package/dist/skeleton/root/skeleton-root.js +17 -2
  211. package/dist/slider/root/slider-root.d.ts +39 -0
  212. package/dist/slider/root/slider-root.js +45 -9
  213. package/dist/splitter/root/splitter-root.d.ts +13 -0
  214. package/dist/splitter/root/splitter-root.js +20 -2
  215. package/dist/splitter/snap.d.ts +9 -0
  216. package/dist/splitter/snap.js +12 -0
  217. package/dist/stat/root/stat-root.d.ts +2 -0
  218. package/dist/stat/root/stat-root.js +1 -1
  219. package/dist/steps/reach.d.ts +15 -0
  220. package/dist/steps/reach.js +12 -0
  221. package/dist/steps/root/steps-root.d.ts +30 -0
  222. package/dist/steps/root/steps-root.js +53 -0
  223. package/dist/steps/step/step.d.ts +39 -2
  224. package/dist/steps/step/step.js +29 -7
  225. package/dist/switch/root/switch-root.d.ts +12 -2
  226. package/dist/switch/root/switch-root.js +6 -1
  227. package/dist/table/column/table-column.d.ts +11 -0
  228. package/dist/table/column/table-column.js +6 -1
  229. package/dist/table/root/table-root.d.ts +101 -0
  230. package/dist/table/root/table-root.js +166 -5
  231. package/dist/table/row/table-row.d.ts +47 -1
  232. package/dist/table/row/table-row.js +39 -2
  233. package/dist/tabs/panel/tab-panel.d.ts +9 -5
  234. package/dist/tabs/panel/tab-panel.js +3 -4
  235. package/dist/tabs/root/tabs-root.d.ts +25 -1
  236. package/dist/tabs/root/tabs-root.js +21 -3
  237. package/dist/tabs/tab/tab.d.ts +36 -4
  238. package/dist/tabs/tab/tab.js +46 -3
  239. package/dist/tag/group/tag-group.d.ts +107 -0
  240. package/dist/tag/group/tag-group.js +157 -0
  241. package/dist/tag/index.d.ts +1 -0
  242. package/dist/tag/index.js +1 -0
  243. package/dist/tag/root/tag-root.d.ts +60 -0
  244. package/dist/tag/root/tag-root.js +74 -18
  245. package/dist/tag/selection.d.ts +10 -0
  246. package/dist/tag/selection.js +12 -0
  247. package/dist/textarea/grow.d.ts +22 -0
  248. package/dist/textarea/grow.js +20 -0
  249. package/dist/textarea/root/textarea-root.d.ts +9 -0
  250. package/dist/textarea/root/textarea-root.js +9 -1
  251. package/dist/time-input/root/time-input-root.d.ts +44 -5
  252. package/dist/time-input/root/time-input-root.js +69 -39
  253. package/dist/time-picker/root/time-picker-root.d.ts +54 -8
  254. package/dist/time-picker/root/time-picker-root.js +121 -91
  255. package/dist/timeline/group/timeline-group.d.ts +46 -0
  256. package/dist/timeline/group/timeline-group.js +37 -0
  257. package/dist/timeline/index.d.ts +1 -0
  258. package/dist/timeline/index.js +1 -0
  259. package/dist/timeline/root/timeline-root.d.ts +10 -3
  260. package/dist/toast/hotkey.d.ts +22 -0
  261. package/dist/toast/hotkey.js +23 -0
  262. package/dist/toast/item/toast-item.d.ts +26 -18
  263. package/dist/toast/item/toast-item.js +55 -48
  264. package/dist/toast/root/toast-root.d.ts +42 -8
  265. package/dist/toast/root/toast-root.js +64 -4
  266. package/dist/toggle/group/toggle-group.d.ts +57 -15
  267. package/dist/toggle/group/toggle-group.js +69 -9
  268. package/dist/toggle/root/toggle-root.d.ts +12 -1
  269. package/dist/toggle/root/toggle-root.js +11 -3
  270. package/dist/toolbar/root/toolbar-root.d.ts +13 -0
  271. package/dist/toolbar/root/toolbar-root.js +15 -5
  272. package/dist/tooltip/focus-target.d.ts +6 -0
  273. package/dist/tooltip/focus-target.js +9 -0
  274. package/dist/tooltip/root/tooltip-root.d.ts +42 -17
  275. package/dist/tooltip/root/tooltip-root.js +50 -9
  276. package/dist/tour/naming.d.ts +30 -0
  277. package/dist/tour/naming.js +10 -0
  278. package/dist/tour/root/tour-root.d.ts +35 -0
  279. package/dist/tour/root/tour-root.js +56 -5
  280. package/dist/tour/stop/tour-stop.d.ts +53 -8
  281. package/dist/tour/stop/tour-stop.js +45 -15
  282. package/dist/tour/wait.d.ts +11 -0
  283. package/dist/tour/wait.js +19 -0
  284. package/dist/tree/item/tree-item.d.ts +54 -1
  285. package/dist/tree/item/tree-item.js +89 -20
  286. package/dist/tree/root/tree-root.d.ts +37 -0
  287. package/dist/tree/root/tree-root.js +51 -6
  288. package/dist/tree/selection.d.ts +24 -0
  289. package/dist/tree/selection.js +26 -0
  290. package/dist/trend/root/trend-root.d.ts +13 -0
  291. package/dist/trend/root/trend-root.js +14 -9
  292. package/dist/video/media-events.d.ts +49 -0
  293. package/dist/video/media-events.js +39 -0
  294. package/dist/video/root/video-root.d.ts +99 -13
  295. package/dist/video/root/video-root.js +84 -47
  296. package/dist/video-playlist/menu/video-playlist-menu.d.ts +3 -0
  297. package/dist/video-playlist/menu/video-playlist-menu.js +2 -1
  298. package/dist/video-playlist/order.d.ts +41 -0
  299. package/dist/video-playlist/order.js +34 -0
  300. package/dist/video-playlist/root/video-playlist-root.d.ts +70 -2
  301. package/dist/video-playlist/root/video-playlist-root.js +60 -16
  302. package/dist/virtual-list/controls.d.ts +4 -0
  303. package/dist/virtual-list/controls.js +30 -0
  304. package/dist/virtual-list/fill.d.ts +30 -0
  305. package/dist/virtual-list/fill.js +39 -0
  306. package/dist/virtual-list/keys.d.ts +15 -0
  307. package/dist/virtual-list/keys.js +24 -0
  308. package/dist/virtual-list/root/virtual-list-root.d.ts +155 -23
  309. package/dist/virtual-list/root/virtual-list-root.js +175 -34
  310. package/lint.json +1 -1
  311. package/package.json +5 -5
  312. package/types/jsx.d.ts +8871 -1286
  313. package/types/svelte.d.ts +3 -0
  314. package/types/vue.d.ts +1918 -269
package/types/vue.d.ts CHANGED
@@ -94,6 +94,7 @@ import type {
94
94
  HelixHeadlessMegamenu,
95
95
  HelixHeadlessMenuItem,
96
96
  HelixHeadlessMenu,
97
+ HelixHeadlessMenuSection,
97
98
  HelixHeadlessMeter,
98
99
  HelixHeadlessNavigation,
99
100
  HelixHeadlessNotificationGroup,
@@ -141,10 +142,12 @@ import type {
141
142
  HelixHeadlessTabPanel,
142
143
  HelixHeadlessTabs,
143
144
  HelixHeadlessTab,
145
+ HelixHeadlessTagGroup,
144
146
  HelixHeadlessTag,
145
147
  HelixHeadlessTextarea,
146
148
  HelixHeadlessTimeInput,
147
149
  HelixHeadlessTimePicker,
150
+ HelixHeadlessTimelineGroup,
148
151
  HelixHeadlessTimelineItem,
149
152
  HelixHeadlessTimeline,
150
153
  HelixHeadlessToastItem,
@@ -183,6 +186,7 @@ import type {
183
186
  HelixSelectEvent,
184
187
  HelixActivateEvent,
185
188
  HelixSendEvent,
189
+ HelixTypingEvent,
186
190
  HelixBeforePinEvent,
187
191
  HelixHistoryEvent,
188
192
  HelixPinEvent,
@@ -193,13 +197,17 @@ import type {
193
197
  HelixSampleStartEvent,
194
198
  HelixCreateEvent,
195
199
  HelixFilterEvent,
200
+ HelixCopyErrorEvent,
201
+ HelixExpandEvent,
196
202
  HelixFilteredEvent,
203
+ HelixLoadMoreEvent,
197
204
  HelixNavigateEvent,
198
205
  HelixReorderEvent,
199
206
  HelixReorderedEvent,
200
207
  HelixSelectedEvent,
201
208
  HelixSortEvent,
202
209
  HelixSortedEvent,
210
+ HelixRejectEvent,
203
211
  HelixFacetEvent,
204
212
  HelixBeforeActivateEvent,
205
213
  HelixGraphFilterEvent,
@@ -210,7 +218,9 @@ import type {
210
218
  HelixGraphSignalEvent,
211
219
  HelixGraphZoomEvent,
212
220
  HelixResizeEvent,
221
+ HelixClearEvent,
213
222
  HelixShortcutEvent,
223
+ HelixActionEvent,
214
224
  HelixMapPartChangeEvent,
215
225
  HelixMapClusterEvent,
216
226
  HelixMapPanEvent,
@@ -218,6 +228,7 @@ import type {
218
228
  HelixMapRotateEvent,
219
229
  HelixMapTiltEvent,
220
230
  HelixMapZoomEvent,
231
+ HelixToggleEvent,
221
232
  HelixReadEvent,
222
233
  HelixCompleteEvent,
223
234
  HelixBeforeCollapseEvent,
@@ -225,8 +236,11 @@ import type {
225
236
  HelixCollapseEvent,
226
237
  HelixResizedEvent,
227
238
  HelixTourAskEvent,
239
+ HelixLoadEvent,
240
+ HelixEndEvent,
228
241
  HelixNextEvent,
229
242
  HelixPreviousEvent,
243
+ HelixRangeChangeEvent,
230
244
  } from "@fusion.dev/helix-headless";
231
245
  import type { HTMLAttributes, PublicProps, EmitFn, EmitsToProps } from "vue";
232
246
 
@@ -314,6 +328,22 @@ too. */
314
328
  Unset takes the accordion's `heading-level`, and 3 where that is unset
315
329
  too. */
316
330
  headingLevel?: (HelixHeadlessAccordionItem["headingLevel"]) | undefined;
331
+ /** Whether find in page searches the section while it is closed, and opens it
332
+ on a match.
333
+
334
+ Off by default. A closed section is then `hidden="until-found"`, which
335
+ hides through `content-visibility`, so a stylesheet that animates the
336
+ section closed shows an empty box for the length of that animation. The
337
+ accordion's own `hidden-until-found` turns it on for every section. */
338
+ "hidden-until-found"?: (HelixHeadlessAccordionItem["hiddenUntilFound"]) | undefined;
339
+ /** Whether find in page searches the section while it is closed, and opens it
340
+ on a match.
341
+
342
+ Off by default. A closed section is then `hidden="until-found"`, which
343
+ hides through `content-visibility`, so a stylesheet that animates the
344
+ section closed shows an empty box for the length of that animation. The
345
+ accordion's own `hidden-until-found` turns it on for every section. */
346
+ hiddenUntilFound?: (HelixHeadlessAccordionItem["hiddenUntilFound"]) | undefined;
317
347
  /** A group name. Opening an item closes the other items with the same name,
318
348
  as `<details name>` does.
319
349
 
@@ -370,6 +400,14 @@ Unset is 3. An item's own `heading-level` wins over this. */
370
400
 
371
401
  Unset is 3. An item's own `heading-level` wins over this. */
372
402
  headingLevel?: (HelixHeadlessAccordion["headingLevel"]) | undefined;
403
+ /** Whether find in page searches every closed section, and opens the one it
404
+ matches in. Each item's own `hidden-until-found` turns it on for that item
405
+ alone. */
406
+ "hidden-until-found"?: (HelixHeadlessAccordion["hiddenUntilFound"]) | undefined;
407
+ /** Whether find in page searches every closed section, and opens the one it
408
+ matches in. Each item's own `hidden-until-found` turns it on for that item
409
+ alone. */
410
+ hiddenUntilFound?: (HelixHeadlessAccordion["hiddenUntilFound"]) | undefined;
373
411
  /** How many sections may be open at once.
374
412
 
375
413
  Absent is `multiple`, so nothing closes unexpectedly and the default costs
@@ -398,6 +436,12 @@ export type HelixHeadlessAnnouncementHelixDismissElementEvent =
398
436
  HelixHeadlessAnnouncementElementEvent<HelixDismissEvent>;
399
437
 
400
438
  export type HelixHeadlessAnnouncementVueProps = {
439
+ /** How long the announcement stays, in milliseconds, before it sends
440
+ `helix-dismiss`. When it is not set, it stays until it is dismissed.
441
+
442
+ Read once when the announcement is first rendered, as `Toast` reads its
443
+ own. The clock stops while the pointer or focus is on the announcement. */
444
+ duration?: (HelixHeadlessAnnouncement["duration"]) | undefined;
401
445
  /** The band's color.
402
446
 
403
447
  Paint only: unlike `Callout`, no value here draws a mark, changes the label,
@@ -438,7 +482,7 @@ would catch. */
438
482
  };
439
483
 
440
484
  export type HelixHeadlessAnnouncementVueEvents = {
441
- /** The dismiss button was pressed. The announcement does not remove itself, so remove it in response. Cancelable. */
485
+ /** The dismiss button was pressed, or `duration` ran out. The announcement does not remove itself, so remove it in response. Cancelable. */
442
486
  "helix-dismiss": HelixHeadlessAnnouncementHelixDismissElementEvent;
443
487
  };
444
488
 
@@ -590,6 +634,24 @@ export type HelixHeadlessAvatarElementEvent<E = Event> = TypedEvent<
590
634
  >;
591
635
 
592
636
  export type HelixHeadlessAvatarVueProps = {
637
+ /** How long, in milliseconds, a picture may take before the initials stand
638
+ in for it while it loads.
639
+
640
+ Absent keeps the picture's place empty until it arrives or fails. Set,
641
+ the initials show once the wait is over and the picture
642
+ replaces them when it arrives, so a slow connection shows who it is
643
+ without a cached picture flashing initials first. Radix's `delayMs` is the
644
+ same idea. */
645
+ "fallback-delay"?: (HelixHeadlessAvatar["fallbackDelay"] | `${number}`) | undefined;
646
+ /** How long, in milliseconds, a picture may take before the initials stand
647
+ in for it while it loads.
648
+
649
+ Absent keeps the picture's place empty until it arrives or fails. Set,
650
+ the initials show once the wait is over and the picture
651
+ replaces them when it arrives, so a slow connection shows who it is
652
+ without a cached picture flashing initials first. Radix's `delayMs` is the
653
+ same idea. */
654
+ fallbackDelay?: (HelixHeadlessAvatar["fallbackDelay"]) | undefined;
593
655
  /** Name of the person or entity.
594
656
 
595
657
  Used for the label and the initials. */
@@ -802,6 +864,12 @@ export type HelixHeadlessBreadcrumbsVueProps = {
802
864
  /** The landmark's name, read by screen readers. An `aria-label` on the host
803
865
  wins over it. */
804
866
  label?: (HelixHeadlessBreadcrumbs["label"]) | undefined;
867
+ /** The trail as data, drawn as crumbs before any you slot. The last item is the
868
+ current page.
869
+
870
+ React Aria's `items`. A property only: a trail is built by script, and an
871
+ attribute would put the whole path into the markup twice. */
872
+ items?: (HelixHeadlessBreadcrumbs["items"]) | undefined;
805
873
  };
806
874
 
807
875
  export type HelixHeadlessBreadcrumbsVueEvents = {};
@@ -908,6 +976,22 @@ Lives here rather than only on `IconButton` so the two share one render.
908
976
  An icon-only button without it is a control a screen reader announces as
909
977
  "button" and nothing else. */
910
978
  label?: (HelixHeadlessButton["label"]) | undefined;
979
+ /** Whether the action the button started is still running.
980
+
981
+ A pending button keeps focus and stays in the tab order, and refuses every
982
+ press: a click, Enter and Space, and Enter in a field of its form. The
983
+ click does not reach your listeners. The inner control carries
984
+ `aria-busy` and `aria-disabled`, and when the button becomes pending while
985
+ it has focus, a reader hears `pending-label`. The styled button draws a
986
+ turning ring over its words.
987
+
988
+ `disabled` takes the button out of reach. Use `pending` for the wait after
989
+ a press, so focus stays where the reader left it. */
990
+ pending?: (HelixHeadlessButton["pending"]) | undefined;
991
+ /** What a reader hears when the button becomes pending while it has focus. */
992
+ "pending-label"?: (HelixHeadlessButton["pendingLabel"]) | undefined;
993
+ /** What a reader hears when the button becomes pending while it has focus. */
994
+ pendingLabel?: (HelixHeadlessButton["pendingLabel"]) | undefined;
911
995
  /** What activating the button does to its form. */
912
996
  type?: (HelixHeadlessButton["type"]) | undefined;
913
997
  /** The value this button submits under its own `name`, as a native submit
@@ -1007,6 +1091,15 @@ invoker without an id in the same tree needs. */
1007
1091
 
1008
1092
  export type HelixHeadlessButtonVueEvents = {};
1009
1093
 
1094
+ /** `HelixHeadlessCallout` component event */
1095
+ export type HelixHeadlessCalloutElementEvent<E = Event> = TypedEvent<
1096
+ HelixHeadlessCallout,
1097
+ E
1098
+ >;
1099
+ /** `helix-dismiss` event type */
1100
+ export type HelixHeadlessCalloutHelixDismissElementEvent =
1101
+ HelixHeadlessCalloutElementEvent<HelixDismissEvent>;
1102
+
1010
1103
  export type HelixHeadlessCalloutVueProps = {
1011
1104
  /** What kind of attention the passage needs.
1012
1105
 
@@ -1025,9 +1118,28 @@ Absent is the English for the tone: "Error", "Information", "Note",
1025
1118
  Absent is the English for the tone: "Error", "Information", "Note",
1026
1119
  "Success" or "Warning". */
1027
1120
  toneLabel?: (HelixHeadlessCallout["toneLabel"]) | undefined;
1121
+ /** Whether the element shows a control that dismisses it. */
1122
+ dismissible?: (HelixHeadlessCallout["dismissible"]) | undefined;
1123
+ /** The dismiss control's label, read by screen readers.
1124
+
1125
+ `attribute` is spelled out because Lit lowercases a property name to
1126
+ derive one rather than dash-casing it, so this would otherwise be
1127
+ reachable only as `dismisslabel`, which nobody would guess and no linter
1128
+ would catch. */
1129
+ "dismiss-label"?: (HelixHeadlessCallout["dismissLabel"]) | undefined;
1130
+ /** The dismiss control's label, read by screen readers.
1131
+
1132
+ `attribute` is spelled out because Lit lowercases a property name to
1133
+ derive one rather than dash-casing it, so this would otherwise be
1134
+ reachable only as `dismisslabel`, which nobody would guess and no linter
1135
+ would catch. */
1136
+ dismissLabel?: (HelixHeadlessCallout["dismissLabel"]) | undefined;
1028
1137
  };
1029
1138
 
1030
- export type HelixHeadlessCalloutVueEvents = {};
1139
+ export type HelixHeadlessCalloutVueEvents = {
1140
+ /** The dismiss button was pressed. The callout does not remove itself, so remove it in response. Cancelable. */
1141
+ "helix-dismiss": HelixHeadlessCalloutHelixDismissElementEvent;
1142
+ };
1031
1143
 
1032
1144
  export type HelixHeadlessCanvasEdgeVueProps = {
1033
1145
  /** The name of the card the connection starts from. */
@@ -1593,6 +1705,10 @@ twice what this says once.
1593
1705
  Reflected and undefaulted, so a card that has not asked reads as a card
1594
1706
  with no attribute on it and the stylesheet only describes the departure. */
1595
1707
  mediaPlacement?: (HelixHeadlessCard["mediaPlacement"]) | undefined;
1708
+ /** */
1709
+ "aria-labelledby"?: unknown;
1710
+ /** */
1711
+ "aria-label"?: unknown;
1596
1712
  };
1597
1713
 
1598
1714
  export type HelixHeadlessCardVueEvents = {};
@@ -1675,6 +1791,18 @@ read out in English. */
1675
1791
  label?: (HelixHeadlessCarousel["label"]) | undefined;
1676
1792
  /** Whether moving past either end wraps to the other. */
1677
1793
  loop?: (HelixHeadlessCarousel["loop"]) | undefined;
1794
+ /** Whether a mouse can drag the track from slide to slide.
1795
+
1796
+ Off unless asked for, because a press on a slide is then the start of a
1797
+ drag, and text in a slide can no longer be selected with the mouse. A drag
1798
+ of a few pixels or less is still a press. */
1799
+ "mouse-drag"?: (HelixHeadlessCarousel["mouseDrag"]) | undefined;
1800
+ /** Whether a mouse can drag the track from slide to slide.
1801
+
1802
+ Off unless asked for, because a press on a slide is then the start of a
1803
+ drag, and text in a slide can no longer be selected with the mouse. A drag
1804
+ of a few pixels or less is still a press. */
1805
+ mouseDrag?: (HelixHeadlessCarousel["mouseDrag"]) | undefined;
1678
1806
  /** The name of the control that moves to the next slide. */
1679
1807
  "next-label"?: (HelixHeadlessCarousel["nextLabel"]) | undefined;
1680
1808
  /** The name of the control that moves to the next slide. */
@@ -1816,6 +1944,14 @@ case is the absent attribute, and the styles read it that way. */
1816
1944
  "previous-label"?: (HelixHeadlessCarousel["previousLabel"]) | undefined;
1817
1945
  /** The name of the control that moves to the previous slide. */
1818
1946
  previousLabel?: (HelixHeadlessCarousel["previousLabel"]) | undefined;
1947
+ /** The word screen readers announce in place of the carousel's role, set as
1948
+ `aria-roledescription`. Translate it with the rest of your text, or empty
1949
+ it to leave the role as `group`. */
1950
+ "role-label"?: (HelixHeadlessCarousel["roleLabel"]) | undefined;
1951
+ /** The word screen readers announce in place of the carousel's role, set as
1952
+ `aria-roledescription`. Translate it with the rest of your text, or empty
1953
+ it to leave the role as `group`. */
1954
+ roleLabel?: (HelixHeadlessCarousel["roleLabel"]) | undefined;
1819
1955
  /** The name of each slide, with `{index}` and `{count}` filled in. */
1820
1956
  "slide-label"?: (HelixHeadlessCarousel["slideLabel"]) | undefined;
1821
1957
  /** The name of each slide, with `{index}` and `{count}` filled in. */
@@ -1851,10 +1987,11 @@ export type HelixHeadlessChatComposerElementEvent<E = Event> = TypedEvent<
1851
1987
  /** `helix-send` event type */
1852
1988
  export type HelixHeadlessChatComposerHelixSendElementEvent =
1853
1989
  HelixHeadlessChatComposerElementEvent<HelixSendEvent>;
1990
+ /** `helix-typing` event type */
1991
+ export type HelixHeadlessChatComposerHelixTypingElementEvent =
1992
+ HelixHeadlessChatComposerElementEvent<HelixTypingEvent>;
1854
1993
 
1855
1994
  export type HelixHeadlessChatComposerVueProps = {
1856
- /** Whether the composer blocks input, such as while a turn is being sent. */
1857
- disabled?: (HelixHeadlessChatComposer["disabled"]) | undefined;
1858
1995
  /** The field's name, read by screen readers. */
1859
1996
  label?: (HelixHeadlessChatComposer["label"]) | undefined;
1860
1997
  /** Placeholder text shown in an empty field. */
@@ -1881,16 +2018,50 @@ button only.
1881
2018
  `button` is what a composer holding several paragraphs wants, where Enter
1882
2019
  has to mean a new line and nothing else. */
1883
2020
  submitOn?: (HelixHeadlessChatComposer["submitOn"]) | undefined;
2021
+ /** How long after the last keystroke the user still counts as typing, in
2022
+ milliseconds. */
2023
+ "typing-timeout"?: (HelixHeadlessChatComposer["typingTimeout"] | `${number}`) | undefined;
2024
+ /** How long after the last keystroke the user still counts as typing, in
2025
+ milliseconds. */
2026
+ typingTimeout?: (HelixHeadlessChatComposer["typingTimeout"]) | undefined;
1884
2027
  /** The text the user has written.
1885
2028
 
1886
2029
  It follows typing, so reading it gives the draft. Set it to seed a draft or
1887
2030
  to replace the one in the field, and set it to `''` to clear it. */
1888
2031
  value?: (HelixHeadlessChatComposer["value"]) | undefined;
2032
+ /** Whether the control is disabled and cannot be used.
2033
+
2034
+ Reflected, because the styled tier selects on it, and mirrored to
2035
+ `aria-disabled` rather than removing the element from the accessibility
2036
+ tree, so a screen reader can still announce that the control exists.
2037
+
2038
+ The mirror itself is in `willUpdate` below, here rather than in each
2039
+ control, because here is where `disabled` is. */
2040
+ disabled?: (HelixHeadlessChatComposer["disabled"]) | undefined;
2041
+ /** The name the control's value is submitted under.
2042
+
2043
+ **Reflected, and it is the exception to "reflect only what CSS selects
2044
+ on".** The platform builds a form's entry list from the `name` *content
2045
+ attribute*, not from the property, so a control named through the property
2046
+ submitted under no name at all and was silently dropped. Measured: two
2047
+ inputs in one form, one named by attribute and one by property, and the
2048
+ form carried a single entry.
2049
+
2050
+ Safe for a React consumer, which is what the rule is protecting: React
2051
+ renders a custom element's props as attributes on the server, so the name
2052
+ is already in the markup being hydrated and reflecting it writes what is
2053
+ there. It is only a change to the markup when a consumer assigns it
2054
+ imperatively later, and nothing is hydrating by then.
2055
+
2056
+ Here rather than on each control. */
2057
+ name?: (HelixHeadlessChatComposer["name"]) | undefined;
1889
2058
  };
1890
2059
 
1891
2060
  export type HelixHeadlessChatComposerVueEvents = {
1892
2061
  /** Fired when the user sends their turn, and cancelable. */
1893
2062
  "helix-send": HelixHeadlessChatComposerHelixSendElementEvent;
2063
+ /** The user started or stopped writing, with `typing` saying which, as the composer's `typing` does. */
2064
+ "helix-typing": HelixHeadlessChatComposerHelixTypingElementEvent;
1894
2065
  /** The user changed the text. Read it from `value`, for a typing indicator or a saved draft. Sent on the composer and does not bubble. */
1895
2066
  input: HelixHeadlessChatComposerElementEvent;
1896
2067
  };
@@ -1915,6 +2086,18 @@ participants is the ordinary case for anything worth building this for.
1915
2086
  `me` and `them` are the conventional values and the stylesheet knows them;
1916
2087
  anything else is a name the consumer styles. */
1917
2088
  author?: (HelixHeadlessChatMessage["author"]) | undefined;
2089
+ /** The author's name, as a screen reader says it at the start of the turn,
2090
+ such as "Support" or "Ada Lovelace".
2091
+
2092
+ Empty reads "You" for `me`, the `author` itself where it is a name, and
2093
+ nothing for `them`. */
2094
+ "author-label"?: (HelixHeadlessChatMessage["authorLabel"]) | undefined;
2095
+ /** The author's name, as a screen reader says it at the start of the turn,
2096
+ such as "Support" or "Ada Lovelace".
2097
+
2098
+ Empty reads "You" for `me`, the `author` itself where it is a name, and
2099
+ nothing for `them`. */
2100
+ authorLabel?: (HelixHeadlessChatMessage["authorLabel"]) | undefined;
1918
2101
  /** Label for a message that did not send. */
1919
2102
  "failed-label"?: (HelixHeadlessChatMessage["failedLabel"]) | undefined;
1920
2103
  /** Label for a message that did not send. */
@@ -1995,6 +2178,18 @@ only the consumer knows whether the server has anything older. */
1995
2178
  historyText?: (HelixHeadlessChat["historyText"]) | undefined;
1996
2179
  /** The conversation's name, read by screen readers. */
1997
2180
  label?: (HelixHeadlessChat["label"]) | undefined;
2181
+ /** The word a screen reader says for `me` when it names a turn. */
2182
+ "me-label"?: (HelixHeadlessChat["meLabel"]) | undefined;
2183
+ /** The word a screen reader says for `me` when it names a turn. */
2184
+ meLabel?: (HelixHeadlessChat["meLabel"]) | undefined;
2185
+ /** The name a screen reader gives a turn with both an author and a time.
2186
+ `{author}` is who wrote it and `{time}` is when, as the turn shows it. A
2187
+ turn with only one of the two is named by that one. */
2188
+ "message-label"?: (HelixHeadlessChat["messageLabel"]) | undefined;
2189
+ /** The name a screen reader gives a turn with both an author and a time.
2190
+ `{author}` is who wrote it and `{time}` is when, as the turn shows it. A
2191
+ turn with only one of the two is named by that one. */
2192
+ messageLabel?: (HelixHeadlessChat["messageLabel"]) | undefined;
1998
2193
  /** Whether the transcript follows new turns to the bottom.
1999
2194
 
2000
2195
  The reader's scrolling asks first: `helix-before-pin` is cancelable, so a
@@ -2066,10 +2261,19 @@ export type HelixHeadlessCheckboxGroupHelixBeforeChangeElementEvent =
2066
2261
  HelixHeadlessCheckboxGroupElementEvent<HelixBeforeChangeEvent>;
2067
2262
 
2068
2263
  export type HelixHeadlessCheckboxGroupVueProps = {
2264
+ /** Whether a box above the set checks or unchecks every enabled box. */
2265
+ "select-all"?: (HelixHeadlessCheckboxGroup["selectAll"]) | undefined;
2266
+ /** Whether a box above the set checks or unchecks every enabled box. */
2267
+ selectAll?: (HelixHeadlessCheckboxGroup["selectAll"]) | undefined;
2268
+ /** The words beside the box `select-all` draws. */
2269
+ "select-all-label"?: (HelixHeadlessCheckboxGroup["selectAllLabel"]) | undefined;
2270
+ /** The words beside the box `select-all` draws. */
2271
+ selectAllLabel?: (HelixHeadlessCheckboxGroup["selectAllLabel"]) | undefined;
2069
2272
  /** The checked values, comma separated.
2070
2273
 
2071
2274
  Read from the boxes once they are known, so a box a script ticks directly
2072
- is in it at once. Written, it is pushed onto the boxes. */
2275
+ is in it at once. Written, it is pushed onto the boxes. A box whose value
2276
+ holds a comma cannot be named here: use `values`. */
2073
2277
  value?: (HelixHeadlessCheckboxGroup["value"]) | undefined;
2074
2278
  /** */
2075
2279
  "aria-label"?: unknown;
@@ -2127,6 +2331,11 @@ imperatively later, and nothing is hydrating by then.
2127
2331
 
2128
2332
  Here rather than on each control. */
2129
2333
  name?: (HelixHeadlessCheckboxGroup["name"]) | undefined;
2334
+ /** The checked values, as a list, in the order the boxes are written.
2335
+
2336
+ The same set as `value`, and the one to use where a value may hold a
2337
+ comma. Written, it checks exactly those boxes and unchecks the rest. */
2338
+ values?: (HelixHeadlessCheckboxGroup["values"]) | undefined;
2130
2339
  };
2131
2340
 
2132
2341
  export type HelixHeadlessCheckboxGroupVueEvents = {
@@ -2171,6 +2380,28 @@ stylesheets. */
2171
2380
  "default-checked"?: (HelixHeadlessCheckbox["defaultChecked"]) | undefined;
2172
2381
  /** Whether the control starts checked. A form reset returns it to this state. */
2173
2382
  defaultChecked?: (HelixHeadlessCheckbox["defaultChecked"]) | undefined;
2383
+ /** Whether a reader can see and focus the control and cannot change it. A
2384
+ read-only control still submits its value.
2385
+
2386
+ React Aria's `isReadOnly`. A native checkbox has no read-only state, so
2387
+ the press is refused at the inner control, which keeps its box as it
2388
+ was, and the control says `aria-readonly`. A script can still set
2389
+ `checked`, as it can set the value of a read-only text field.
2390
+
2391
+ The attribute is `readonly`, which is the platform's spelling for the
2392
+ text fields. */
2393
+ readonly?: (HelixHeadlessCheckbox["readOnly"]) | undefined;
2394
+ /** Whether a reader can see and focus the control and cannot change it. A
2395
+ read-only control still submits its value.
2396
+
2397
+ React Aria's `isReadOnly`. A native checkbox has no read-only state, so
2398
+ the press is refused at the inner control, which keeps its box as it
2399
+ was, and the control says `aria-readonly`. A script can still set
2400
+ `checked`, as it can set the value of a read-only text field.
2401
+
2402
+ The attribute is `readonly`, which is the platform's spelling for the
2403
+ text fields. */
2404
+ readOnly?: (HelixHeadlessCheckbox["readOnly"]) | undefined;
2174
2405
  /** */
2175
2406
  "aria-label"?: unknown;
2176
2407
  /** The validation message shown under the control. It replaces the
@@ -2243,9 +2474,17 @@ export type HelixHeadlessCodeBlockVueProps = {
2243
2474
  "copied-label"?: (HelixHeadlessCodeBlock["copiedLabel"]) | undefined;
2244
2475
  /** The copy button's name and tooltip text after a copy. */
2245
2476
  copiedLabel?: (HelixHeadlessCodeBlock["copiedLabel"]) | undefined;
2246
- /** The copy button's name and tooltip text before a copy. */
2477
+ /** The copy button's name and tooltip text before a copy.
2478
+
2479
+ Where the block has a name, the button says it too, such as "Copy code,
2480
+ app.ts", so each copy button on a page with several blocks is told apart.
2481
+ In a diff, that is each file's own name. */
2247
2482
  "copy-label"?: (HelixHeadlessCodeBlock["copyLabel"]) | undefined;
2248
- /** The copy button's name and tooltip text before a copy. */
2483
+ /** The copy button's name and tooltip text before a copy.
2484
+
2485
+ Where the block has a name, the button says it too, such as "Copy code,
2486
+ app.ts", so each copy button on a page with several blocks is told apart.
2487
+ In a diff, that is each file's own name. */
2249
2488
  copyLabel?: (HelixHeadlessCodeBlock["copyLabel"]) | undefined;
2250
2489
  /** Whether the content is a unified diff, drawn as the lines it changed.
2251
2490
 
@@ -2257,6 +2496,20 @@ Reflected, because the stylesheet paints a diff differently from code, and
2257
2496
  In a diff, each file is named from the patch, and this names a patch that
2258
2497
  carries no name of its own. */
2259
2498
  label?: (HelixHeadlessCodeBlock["label"]) | undefined;
2499
+ /** Whether the lines are numbered in a gutter beside the code.
2500
+
2501
+ The numbers are hidden from the accessibility tree and are not part of a
2502
+ copy, which takes the code alone. Reflected, because the stylesheet lays
2503
+ the gutter out beside the code. A diff numbers its lines from its hunks
2504
+ whether or not this is set. */
2505
+ "line-numbers"?: (HelixHeadlessCodeBlock["lineNumbers"]) | undefined;
2506
+ /** Whether the lines are numbered in a gutter beside the code.
2507
+
2508
+ The numbers are hidden from the accessibility tree and are not part of a
2509
+ copy, which takes the code alone. Reflected, because the stylesheet lays
2510
+ the gutter out beside the code. A diff numbers its lines from its hunks
2511
+ whether or not this is set. */
2512
+ lineNumbers?: (HelixHeadlessCodeBlock["lineNumbers"]) | undefined;
2260
2513
  /** Whether to leave the copy button off.
2261
2514
 
2262
2515
  Negative, which is not a style choice. A boolean attribute is true whenever
@@ -2303,6 +2556,17 @@ Absent is unified, each removal above its replacement, which fits any
2303
2556
  width. `split` sets the old version beside the new one. Optional rather
2304
2557
  than defaulted, so the host carries no attribute the consumer did not write. */
2305
2558
  variant?: (HelixHeadlessCodeBlock["variant"]) | undefined;
2559
+ /** Turns the code into highlighted markup, which the block draws in place of
2560
+ the plain text.
2561
+
2562
+ Called with the code as written and returning HTML, such as the output of
2563
+ Shiki's `codeToHtml` or Prism's `highlight`. **The markup is drawn as
2564
+ given**, so it has to escape the code it was handed, which those
2565
+ highlighters do. Bind the language in the function you pass. The code
2566
+ stays in the slot, so the copy button copies it as written and a reader
2567
+ without the script still has it. Not called on a server, which has no code
2568
+ to read, nor for a diff. */
2569
+ highlight?: (HelixHeadlessCodeBlock["highlight"]) | undefined;
2306
2570
  };
2307
2571
 
2308
2572
  export type HelixHeadlessCodeBlockVueEvents = {};
@@ -2339,6 +2603,26 @@ point.** The field holds a color, so a browser offering to fill it with a
2339
2603
  saved address is competing for the same keystrokes as the picker. A
2340
2604
  consumer who wants autofill can still ask. */
2341
2605
  autocomplete?: (HelixHeadlessColorInput["autocomplete"]) | undefined;
2606
+ /** Whether the panel shows a number field for each channel of the color.
2607
+ Passed to the panel; see Color Picker's `channel-fields`. */
2608
+ "channel-fields"?: (HelixHeadlessColorInput["channelFields"]) | undefined;
2609
+ /** Whether the panel shows a number field for each channel of the color.
2610
+ Passed to the panel; see Color Picker's `channel-fields`. */
2611
+ channelFields?: (HelixHeadlessColorInput["channelFields"]) | undefined;
2612
+ /** The words a color's name is spoken in, as JSON keyed by their English,
2613
+ such as `{"red": "rot", "vibrant": "kräftiges"}`.
2614
+
2615
+ Passed to the panel, whose square, hue ramp and presets say the color's
2616
+ name, and read by the swatch in `swatch`, which says it before the value.
2617
+ Color Picker lists the keys. */
2618
+ "color-words"?: (HelixHeadlessColorInput["colorWords"]) | undefined;
2619
+ /** The words a color's name is spoken in, as JSON keyed by their English,
2620
+ such as `{"red": "rot", "vibrant": "kräftiges"}`.
2621
+
2622
+ Passed to the panel, whose square, hue ramp and presets say the color's
2623
+ name, and read by the swatch in `swatch`, which says it before the value.
2624
+ Color Picker lists the keys. */
2625
+ colorWords?: (HelixHeadlessColorInput["colorWords"]) | undefined;
2342
2626
  /** The syntax the value is written in: `hex`, `rgb`, or `hsl`.
2343
2627
 
2344
2628
  **Undefaulted, because it reflects.** The two together stamp an attribute
@@ -2539,6 +2823,10 @@ ramps. A consumer who wants autofill can still ask. */
2539
2823
  "bad-input-message"?: (HelixHeadlessColorPicker["badInputMessage"]) | undefined;
2540
2824
  /** The message shown when the value is text that is not a color. */
2541
2825
  badInputMessage?: (HelixHeadlessColorPicker["badInputMessage"]) | undefined;
2826
+ /** What the blue channel's field is called, in `channel-fields`. */
2827
+ "blue-label"?: (HelixHeadlessColorPicker["blueLabel"]) | undefined;
2828
+ /** What the blue channel's field is called, in `channel-fields`. */
2829
+ blueLabel?: (HelixHeadlessColorPicker["blueLabel"]) | undefined;
2542
2830
  /** What the square's vertical ramp is called.
2543
2831
 
2544
2832
  **Every word the picker speaks is a property**, so a page in another
@@ -2549,6 +2837,50 @@ language hears its own rather than English between its own labels. */
2549
2837
  **Every word the picker speaks is a property**, so a page in another
2550
2838
  language hears its own rather than English between its own labels. */
2551
2839
  brightnessLabel?: (HelixHeadlessColorPicker["brightnessLabel"]) | undefined;
2840
+ /** Whether the picker shows a number field for each channel of the color, as
2841
+ React Aria's ColorField does with `channel`: red, green and blue for hex
2842
+ and rgb, hue, saturation and lightness for hsl, and the opacity with
2843
+ `alpha`.
2844
+
2845
+ For a reader who has the numbers from a brand guide, and for a keyboard,
2846
+ where typing 128 is quicker than holding an arrow key. The fields follow
2847
+ the syntax the format toggle sets. */
2848
+ "channel-fields"?: (HelixHeadlessColorPicker["channelFields"]) | undefined;
2849
+ /** Whether the picker shows a number field for each channel of the color, as
2850
+ React Aria's ColorField does with `channel`: red, green and blue for hex
2851
+ and rgb, hue, saturation and lightness for hsl, and the opacity with
2852
+ `alpha`.
2853
+
2854
+ For a reader who has the numbers from a brand guide, and for a keyboard,
2855
+ where typing 128 is quicker than holding an arrow key. The fields follow
2856
+ the syntax the format toggle sets. */
2857
+ channelFields?: (HelixHeadlessColorPicker["channelFields"]) | undefined;
2858
+ /** The words a color's name is spoken in, as JSON keyed by their English,
2859
+ such as `{"red": "rot", "vibrant": "kräftiges"}`.
2860
+
2861
+ **A color is named the way React Aria names one**, as "vibrant red" or
2862
+ "dark grayish blue", and the keys are the ones `@react-stately/color`
2863
+ translates, so a table a page already has for it can be handed over whole.
2864
+ `colorName` and `transparentColorName` are the two sentences that put the
2865
+ words together. A word left out is spoken in English.
2866
+
2867
+ The name follows the numbers on the square, follows the number on the hue
2868
+ ramp, and names each preset, so a reader who cannot see the color hears
2869
+ which one it is. */
2870
+ "color-words"?: (HelixHeadlessColorPicker["colorWords"]) | undefined;
2871
+ /** The words a color's name is spoken in, as JSON keyed by their English,
2872
+ such as `{"red": "rot", "vibrant": "kräftiges"}`.
2873
+
2874
+ **A color is named the way React Aria names one**, as "vibrant red" or
2875
+ "dark grayish blue", and the keys are the ones `@react-stately/color`
2876
+ translates, so a table a page already has for it can be handed over whole.
2877
+ `colorName` and `transparentColorName` are the two sentences that put the
2878
+ words together. A word left out is spoken in English.
2879
+
2880
+ The name follows the numbers on the square, follows the number on the hue
2881
+ ramp, and names each preset, so a reader who cannot see the color hears
2882
+ which one it is. */
2883
+ colorWords?: (HelixHeadlessColorPicker["colorWords"]) | undefined;
2552
2884
  /** The text the sample shows for a moment after it copies the value. */
2553
2885
  "copied-label"?: (HelixHeadlessColorPicker["copiedLabel"]) | undefined;
2554
2886
  /** The text the sample shows for a moment after it copies the value. */
@@ -2572,6 +2904,10 @@ Only what is written. Everything is read whatever this says, so a picker on
2572
2904
  "format-label"?: (HelixHeadlessColorPicker["formatLabel"]) | undefined;
2573
2905
  /** What the syntax toggle is called, with `{format}` filled in. */
2574
2906
  formatLabel?: (HelixHeadlessColorPicker["formatLabel"]) | undefined;
2907
+ /** What the green channel's field is called, in `channel-fields`. */
2908
+ "green-label"?: (HelixHeadlessColorPicker["greenLabel"]) | undefined;
2909
+ /** What the green channel's field is called, in `channel-fields`. */
2910
+ greenLabel?: (HelixHeadlessColorPicker["greenLabel"]) | undefined;
2575
2911
  /** What the hue channel is called. */
2576
2912
  "hue-label"?: (HelixHeadlessColorPicker["hueLabel"]) | undefined;
2577
2913
  /** What the hue channel is called. */
@@ -2584,6 +2920,12 @@ the label, the hint and the feedback, and a second message inside the panel
2584
2920
  would be the same error said twice. What is left for the picker is the one
2585
2921
  thing the field cannot draw from outside, the mark on the answer itself. */
2586
2922
  invalid?: (HelixHeadlessColorPicker["invalid"]) | undefined;
2923
+ /** What the lightness channel's field is called, in `channel-fields` with
2924
+ hsl. */
2925
+ "lightness-label"?: (HelixHeadlessColorPicker["lightnessLabel"]) | undefined;
2926
+ /** What the lightness channel's field is called, in `channel-fields` with
2927
+ hsl. */
2928
+ lightnessLabel?: (HelixHeadlessColorPicker["lightnessLabel"]) | undefined;
2587
2929
  /** Hides the eyedropper. Without it, the eyedropper appears in browsers that
2588
2930
  support one. */
2589
2931
  "no-eyedropper"?: (HelixHeadlessColorPicker["noEyedropper"]) | undefined;
@@ -2680,6 +3022,10 @@ letting it move would show `rgb` over a hex it is no longer allowed to
2680
3022
  restate. The eyedropper clears the screen and runs a system sampler, so
2681
3023
  letting it open would take a color from the reader and drop it. */
2682
3024
  readOnly?: (HelixHeadlessColorPicker["readOnly"]) | undefined;
3025
+ /** What the red channel's field is called, in `channel-fields`. */
3026
+ "red-label"?: (HelixHeadlessColorPicker["redLabel"]) | undefined;
3027
+ /** What the red channel's field is called, in `channel-fields`. */
3028
+ redLabel?: (HelixHeadlessColorPicker["redLabel"]) | undefined;
2683
3029
  /** Requires a color before the form can submit.
2684
3030
 
2685
3031
  **A color is exactly as requirable as a date**, which is the comparison
@@ -2806,6 +3152,24 @@ export type HelixHeadlessComboboxToggleElementEvent =
2806
3152
  HelixHeadlessComboboxElementEvent<ToggleEvent>;
2807
3153
 
2808
3154
  export type HelixHeadlessComboboxVueProps = {
3155
+ /** Whether text that names no option is taken as the value, as React Aria's
3156
+ `allowsCustomValue`.
3157
+
3158
+ For a field where the list is a help and not the whole of the answer, a
3159
+ city or a job title. What was typed becomes the value when the reader
3160
+ leaves the field or presses Enter with nothing highlighted, and text that
3161
+ names an option takes that option. Unlike `creatable`, no event asks
3162
+ first and no option is expected to be added: the value is the text. */
3163
+ "allows-custom-value"?: (HelixHeadlessCombobox["allowsCustomValue"]) | undefined;
3164
+ /** Whether text that names no option is taken as the value, as React Aria's
3165
+ `allowsCustomValue`.
3166
+
3167
+ For a field where the list is a help and not the whole of the answer, a
3168
+ city or a job title. What was typed becomes the value when the reader
3169
+ leaves the field or presses Enter with nothing highlighted, and text that
3170
+ names an option takes that option. Unlike `creatable`, no event asks
3171
+ first and no option is expected to be added: the value is the text. */
3172
+ allowsCustomValue?: (HelixHeadlessCombobox["allowsCustomValue"]) | undefined;
2809
3173
  /** What the browser may autofill in the text field, as a platform token.
2810
3174
 
2811
3175
  **Defaults to `off`, which is not the platform's default and is the
@@ -2884,6 +3248,20 @@ filled in.
2884
3248
  **The name goes in**, so a row of them is heard as which one each
2885
3249
  removes rather than as "Remove" said once per chosen option. */
2886
3250
  removeLabel?: (HelixHeadlessCombobox["removeLabel"]) | undefined;
3251
+ /** What a screen reader hears when typing leaves one option. `{count}` is
3252
+ the count. */
3253
+ "result-label"?: (HelixHeadlessCombobox["resultLabel"]) | undefined;
3254
+ /** What a screen reader hears when typing leaves one option. `{count}` is
3255
+ the count. */
3256
+ resultLabel?: (HelixHeadlessCombobox["resultLabel"]) | undefined;
3257
+ /** What a screen reader hears when typing leaves any other number of
3258
+ options. `{count}` is the count, and `Intl.PluralRules` picks between the
3259
+ two. */
3260
+ "results-label"?: (HelixHeadlessCombobox["resultsLabel"]) | undefined;
3261
+ /** What a screen reader hears when typing leaves any other number of
3262
+ options. `{count}` is the count, and `Intl.PluralRules` picks between the
3263
+ two. */
3264
+ resultsLabel?: (HelixHeadlessCombobox["resultsLabel"]) | undefined;
2887
3265
  /** Whether the field completes the word as the user types.
2888
3266
 
2889
3267
  `suggest` rather than `autocomplete`, which is a real HTML attribute this
@@ -3045,6 +3423,14 @@ export type HelixHeadlessCommandVueProps = {
3045
3423
  "empty-text"?: (HelixHeadlessCommand["emptyText"]) | undefined;
3046
3424
  /** The text shown when the filter matches no commands. */
3047
3425
  emptyText?: (HelixHeadlessCommand["emptyText"]) | undefined;
3426
+ /** How long typing rests before the commands are filtered, in milliseconds,
3427
+ so a palette filtered on a server sends one `helix-filter` for a word.
3428
+ `0` filters on every keystroke. See Listbox's `filter-delay`. */
3429
+ "filter-delay"?: (HelixHeadlessCommand["filterDelay"] | `${number}`) | undefined;
3430
+ /** How long typing rests before the commands are filtered, in milliseconds,
3431
+ so a palette filtered on a server sends one `helix-filter` for a word.
3432
+ `0` filters on every keystroke. See Listbox's `filter-delay`. */
3433
+ filterDelay?: (HelixHeadlessCommand["filterDelay"]) | undefined;
3048
3434
  /** The key that opens the palette, written as `mod+k`, `shift+p`, or `k`.
3049
3435
 
3050
3436
  Empty turns it off, for a consumer who opens the palette from a button or
@@ -3064,6 +3450,20 @@ Passed to the list, which shows `loading-text` and tells screen readers. */
3064
3450
  loadingText?: (HelixHeadlessCommand["loadingText"]) | undefined;
3065
3451
  /** The text shown in the filter field before anything is typed. */
3066
3452
  placeholder?: (HelixHeadlessCommand["placeholder"]) | undefined;
3453
+ /** What a screen reader hears when typing leaves one command. `{count}` is
3454
+ the count. */
3455
+ "result-label"?: (HelixHeadlessCommand["resultLabel"]) | undefined;
3456
+ /** What a screen reader hears when typing leaves one command. `{count}` is
3457
+ the count. */
3458
+ resultLabel?: (HelixHeadlessCommand["resultLabel"]) | undefined;
3459
+ /** What a screen reader hears when typing leaves any other number of
3460
+ commands. `{count}` is the count, and `Intl.PluralRules` picks between the
3461
+ two. */
3462
+ "results-label"?: (HelixHeadlessCommand["resultsLabel"]) | undefined;
3463
+ /** What a screen reader hears when typing leaves any other number of
3464
+ commands. `{count}` is the count, and `Intl.PluralRules` picks between the
3465
+ two. */
3466
+ resultsLabel?: (HelixHeadlessCommand["resultsLabel"]) | undefined;
3067
3467
  /** Whether the element starts open. Ignored once `open` is written. */
3068
3468
  "default-open"?: (HelixHeadlessCommand["defaultOpen"]) | undefined;
3069
3469
  /** Whether the element starts open. Ignored once `open` is written. */
@@ -3090,7 +3490,7 @@ export type HelixHeadlessCommandVueEvents = {
3090
3490
  "helix-before-open": HelixHeadlessCommandHelixBeforeOpenElementEvent;
3091
3491
  /** Fired as the user types, with the text the list is filtered by. Cancelable: cancel it to leave the list unfiltered and filter the commands yourself, for example on a server while `loading` is set. */
3092
3492
  "helix-filter": HelixHeadlessCommandHelixFilterElementEvent;
3093
- /** A command was chosen. Cancelable: cancel it to keep the palette open. */
3493
+ /** A command was chosen, with its `href` where the option is a link. Cancelable: cancel it to keep the palette open, and to keep the browser from following the link. */
3094
3494
  "helix-select": HelixHeadlessCommandHelixSelectElementEvent;
3095
3495
  /** The palette opened or closed. The event carries `newState` and `oldState`. */
3096
3496
  toggle: HelixHeadlessCommandToggleElementEvent;
@@ -3104,6 +3504,9 @@ export type HelixHeadlessCopyButtonElementEvent<E = Event> = TypedEvent<
3104
3504
  /** `helix-copy` event type */
3105
3505
  export type HelixHeadlessCopyButtonHelixCopyElementEvent =
3106
3506
  HelixHeadlessCopyButtonElementEvent<HelixCopyEvent>;
3507
+ /** `helix-copy-error` event type */
3508
+ export type HelixHeadlessCopyButtonHelixCopyErrorElementEvent =
3509
+ HelixHeadlessCopyButtonElementEvent<HelixCopyErrorEvent>;
3107
3510
 
3108
3511
  export type HelixHeadlessCopyButtonVueProps = {
3109
3512
  /** The button's name and tooltip text after a copy.
@@ -3116,6 +3519,17 @@ dash-casing it, and `copiedlabel` is not what anyone would type. */
3116
3519
  `attribute` written out, because Lit lowercases a property name rather than
3117
3520
  dash-casing it, and `copiedlabel` is not what anyone would type. */
3118
3521
  copiedLabel?: (HelixHeadlessCopyButton["copiedLabel"]) | undefined;
3522
+ /** The button's name and tooltip text after a press that put nothing on the
3523
+ clipboard. */
3524
+ "error-label"?: (HelixHeadlessCopyButton["errorLabel"]) | undefined;
3525
+ /** The button's name and tooltip text after a press that put nothing on the
3526
+ clipboard. */
3527
+ errorLabel?: (HelixHeadlessCopyButton["errorLabel"]) | undefined;
3528
+ /** The element to copy from, by its id: `key` for its text, `key[value]` for
3529
+ an attribute, and `key.value` for a property. Read at the press, and used
3530
+ in place of `value`. An element that is not there copies nothing, which is
3531
+ a failed copy. */
3532
+ from?: (HelixHeadlessCopyButton["from"]) | undefined;
3119
3533
  /** The button's name and tooltip text before a copy.
3120
3534
 
3121
3535
  Defaulted rather than left empty. An icon-only control must be named, and
@@ -3129,74 +3543,22 @@ whatever its `type`. Declared here so its own page says what it holds. */
3129
3543
  value?: (HelixHeadlessCopyButton["value"]) | undefined;
3130
3544
  /** */
3131
3545
  "aria-label"?: unknown;
3132
- /** What to send when the button is activated, and what to send it to.
3133
-
3134
- The platform's invoker attributes, forwarded onto the inner `<button>`
3135
- rather than left on the host: only a real button is recognized as an
3136
- invoker, so `commandfor` written on a custom element resolves nothing and
3137
- the trigger silently does nothing at all. A wrapper has to hand them down,
3138
- the same way `label` becomes `aria-label` in there.
3139
-
3140
- ```html
3141
- <helix-headless-button commandfor="confirm" command="--show">Delete…</helix-headless-button>
3142
- ```
3143
-
3144
- `commandFor` spells its attribute out, because Lit lowercases a property
3145
- name to derive one rather than dash-casing it, and what a consumer writes
3146
- is the platform's `commandfor`. */
3147
- command?: (HelixHeadlessCopyButton["command"]) | undefined;
3148
- /** The id of the element the command is sent to. */
3149
- commandfor?: (HelixHeadlessCopyButton["commandFor"]) | undefined;
3150
- /** The id of the element the command is sent to. */
3151
- commandFor?: (HelixHeadlessCopyButton["commandFor"]) | undefined;
3152
- /** Where this button's submission goes, overriding the form's own.
3153
-
3154
- **The five `form*` overrides work by writing the form and putting it back**,
3155
- which is the only mechanism available and is closer to the platform than it
3156
- sounds. `requestSubmit(submitter)` is how a native submitter carries these,
3157
- and it refuses ours twice over: the inner `<button>` is `type="button"` so
3158
- it is not a submit button, and it sits in this shadow root so its form owner
3159
- is not the consumer's form. Both throw. So the submission is started with no
3160
- submitter and the overrides are applied to the form for the duration of it.
3161
-
3162
- The whole submit algorithm runs synchronously inside `requestSubmit()`, so
3163
- the window is one call and a `finally` closes it whether or not a listener
3164
- refused. What a `submit` handler observes during that window is the form a
3165
- native submitter would have given it, which is the point. */
3166
- formaction?: (HelixHeadlessCopyButton["formAction"]) | undefined;
3167
- /** Where this button's submission goes, overriding the form's own.
3168
-
3169
- **The five `form*` overrides work by writing the form and putting it back**,
3170
- which is the only mechanism available and is closer to the platform than it
3171
- sounds. `requestSubmit(submitter)` is how a native submitter carries these,
3172
- and it refuses ours twice over: the inner `<button>` is `type="button"` so
3173
- it is not a submit button, and it sits in this shadow root so its form owner
3174
- is not the consumer's form. Both throw. So the submission is started with no
3175
- submitter and the overrides are applied to the form for the duration of it.
3176
-
3177
- The whole submit algorithm runs synchronously inside `requestSubmit()`, so
3178
- the window is one call and a `finally` closes it whether or not a listener
3179
- refused. What a `submit` handler observes during that window is the form a
3180
- native submitter would have given it, which is the point. */
3181
- formAction?: (HelixHeadlessCopyButton["formAction"]) | undefined;
3182
- /** How the submission is encoded, overriding the form's own. */
3183
- formenctype?: (HelixHeadlessCopyButton["formEnctype"]) | undefined;
3184
- /** How the submission is encoded, overriding the form's own. */
3185
- formEnctype?: (HelixHeadlessCopyButton["formEnctype"]) | undefined;
3186
- /** Which HTTP method the submission uses, overriding the form's own. */
3187
- formmethod?: (HelixHeadlessCopyButton["formMethod"]) | undefined;
3188
- /** Which HTTP method the submission uses, overriding the form's own. */
3189
- formMethod?: (HelixHeadlessCopyButton["formMethod"]) | undefined;
3190
- /** Whether this submission skips the form's validation. */
3191
- formnovalidate?: (HelixHeadlessCopyButton["formNoValidate"]) | undefined;
3192
- /** Whether this submission skips the form's validation. */
3193
- formNoValidate?: (HelixHeadlessCopyButton["formNoValidate"]) | undefined;
3194
- /** Which browsing context the response lands in, overriding the form's own. */
3195
- formtarget?: (HelixHeadlessCopyButton["formTarget"]) | undefined;
3196
- /** Which browsing context the response lands in, overriding the form's own. */
3197
- formTarget?: (HelixHeadlessCopyButton["formTarget"]) | undefined;
3198
- /** What activating the button does to its form. */
3199
- type?: (HelixHeadlessCopyButton["type"]) | undefined;
3546
+ /** Whether the action the button started is still running.
3547
+
3548
+ A pending button keeps focus and stays in the tab order, and refuses every
3549
+ press: a click, Enter and Space, and Enter in a field of its form. The
3550
+ click does not reach your listeners. The inner control carries
3551
+ `aria-busy` and `aria-disabled`, and when the button becomes pending while
3552
+ it has focus, a reader hears `pending-label`. The styled button draws a
3553
+ turning ring over its words.
3554
+
3555
+ `disabled` takes the button out of reach. Use `pending` for the wait after
3556
+ a press, so focus stays where the reader left it. */
3557
+ pending?: (HelixHeadlessCopyButton["pending"]) | undefined;
3558
+ /** What a reader hears when the button becomes pending while it has focus. */
3559
+ "pending-label"?: (HelixHeadlessCopyButton["pendingLabel"]) | undefined;
3560
+ /** What a reader hears when the button becomes pending while it has focus. */
3561
+ pendingLabel?: (HelixHeadlessCopyButton["pendingLabel"]) | undefined;
3200
3562
  /** Whether the control is disabled and cannot be used.
3201
3563
 
3202
3564
  Reflected, because the styled tier selects on it, and mirrored to
@@ -3223,31 +3585,6 @@ imperatively later, and nothing is hydrating by then.
3223
3585
 
3224
3586
  Here rather than on each control. */
3225
3587
  name?: (HelixHeadlessCopyButton["name"]) | undefined;
3226
- /** Whether this button is a disclosure trigger, and whether its panel is open.
3227
-
3228
- **Set by whatever owns the panel, and a property rather than an attribute
3229
- for the reason `Menu` already states about its items**: an attribute
3230
- written onto a consumer's element after it upgrades is a hydration mismatch
3231
- waiting to happen. Measured 28 Aug 2026 against React 19.2.8, server markup
3232
- hydrated with the definitions loaded either side of `hydrateRoot`:
3233
- `Megamenu` and `SpeedDial` wrote `aria-expanded` onto the slotted trigger
3234
- and React reported "some attributes of the server rendered HTML didn't
3235
- match the client properties. This won't be patched up" in both orders;
3236
- `Popover` and `Menu`, which write nothing, were clean in both.
3237
-
3238
- **A property crosses that gap because React never looks at one.** It diffs
3239
- the attributes it rendered, and this one is `attribute: false`, so the state
3240
- travels to the inner `<button>` and lands inside a shadow root React does
3241
- not own and cannot compare. The consumer's own element is left exactly as
3242
- they served it and the reader is still told what the control does.
3243
-
3244
- `undefined` renders nothing at all, so a button that is not a trigger
3245
- carries no `aria-expanded`: the resting state is the attribute's absence,
3246
- which is the rule every reflected property here follows.
3247
-
3248
- A consumer who wants to say this statically writes `aria-expanded` on the
3249
- host instead, which `AriaForwardController` carries to the same place. */
3250
- expanded?: (HelixHeadlessCopyButton["expanded"]) | undefined;
3251
3588
  /** Whether the button holds its group's tab stop.
3252
3589
 
3253
3590
  A toolbar keeps one tab stop across its children, and the obvious way to do
@@ -3259,14 +3596,6 @@ and the stop lands on the inner control inside the shadow root.
3259
3596
  No attribute, because it is coordination between elements rather than
3260
3597
  anything a consumer sets. */
3261
3598
  focusable?: (HelixHeadlessCopyButton["focusable"]) | undefined;
3262
- /** What kind of panel this button opens, where it opens one: `menu` for a
3263
- `Menu`.
3264
-
3265
- Set by the component that owns the panel, as a property for the reason
3266
- `expanded` gives above. It is what makes a reader say the button opens a
3267
- menu. Read from Chromium's tree, a Menu's trigger was a plain button that
3268
- reported collapsed and expanded and no popup. */
3269
- popup?: (HelixHeadlessCopyButton["popup"]) | undefined;
3270
3599
  /** The element this button's command is sent to, resolved.
3271
3600
 
3272
3601
  The platform's own accessor, because the resolution is otherwise kept
@@ -3280,6 +3609,8 @@ invoker without an id in the same tree needs. */
3280
3609
  export type HelixHeadlessCopyButtonVueEvents = {
3281
3610
  /** Fired after the clipboard write succeeds. */
3282
3611
  "helix-copy": HelixHeadlessCopyButtonHelixCopyElementEvent;
3612
+ /** Fired when a press put nothing on the clipboard: the browser did not allow the write, or there was nothing to copy. */
3613
+ "helix-copy-error": HelixHeadlessCopyButtonHelixCopyErrorElementEvent;
3283
3614
  };
3284
3615
 
3285
3616
  /** `HelixHeadlessDataTable` component event */
@@ -3290,12 +3621,18 @@ export type HelixHeadlessDataTableElementEvent<E = Event> = TypedEvent<
3290
3621
  /** `helix-activate` event type */
3291
3622
  export type HelixHeadlessDataTableHelixActivateElementEvent =
3292
3623
  HelixHeadlessDataTableElementEvent<HelixActivateEvent>;
3624
+ /** `helix-expand` event type */
3625
+ export type HelixHeadlessDataTableHelixExpandElementEvent =
3626
+ HelixHeadlessDataTableElementEvent<HelixExpandEvent>;
3293
3627
  /** `helix-filter` event type */
3294
3628
  export type HelixHeadlessDataTableHelixFilterElementEvent =
3295
3629
  HelixHeadlessDataTableElementEvent<HelixFilterEvent>;
3296
3630
  /** `helix-filtered` event type */
3297
3631
  export type HelixHeadlessDataTableHelixFilteredElementEvent =
3298
3632
  HelixHeadlessDataTableElementEvent<HelixFilteredEvent>;
3633
+ /** `helix-load-more` event type */
3634
+ export type HelixHeadlessDataTableHelixLoadMoreElementEvent =
3635
+ HelixHeadlessDataTableElementEvent<HelixLoadMoreEvent>;
3299
3636
  /** `helix-navigate` event type */
3300
3637
  export type HelixHeadlessDataTableHelixNavigateElementEvent =
3301
3638
  HelixHeadlessDataTableElementEvent<HelixNavigateEvent>;
@@ -3323,6 +3660,24 @@ export type HelixHeadlessDataTableVueProps = {
3323
3660
  "ascending-label"?: (HelixHeadlessDataTable["ascendingLabel"]) | undefined;
3324
3661
  /** The word for an ascending sort, in `sorted-label`. */
3325
3662
  ascendingLabel?: (HelixHeadlessDataTable["ascendingLabel"]) | undefined;
3663
+ /** The field that holds a row's child rows, as an array. Set it, and `row-key`,
3664
+ and the grid becomes a tree grid.
3665
+
3666
+ Reflected, because the styled tier indents a tree grid's row headers by
3667
+ it. No default, so a table that sets none writes nothing onto its host. */
3668
+ "child-field"?: (HelixHeadlessDataTable["childField"]) | undefined;
3669
+ /** The field that holds a row's child rows, as an array. Set it, and `row-key`,
3670
+ and the grid becomes a tree grid.
3671
+
3672
+ Reflected, because the styled tier indents a tree grid's row headers by
3673
+ it. No default, so a table that sets none writes nothing onto its host. */
3674
+ childField?: (HelixHeadlessDataTable["childField"]) | undefined;
3675
+ /** The keys of the rows open at the start, separated by commas. Used until
3676
+ `expanded` is set. */
3677
+ "default-expanded"?: (HelixHeadlessDataTable["defaultExpanded"]) | undefined;
3678
+ /** The keys of the rows open at the start, separated by commas. Used until
3679
+ `expanded` is set. */
3680
+ defaultExpanded?: (HelixHeadlessDataTable["defaultExpanded"]) | undefined;
3326
3681
  /** The starting search query, used until `filter` is set. */
3327
3682
  "default-filter"?: (HelixHeadlessDataTable["defaultFilter"]) | undefined;
3328
3683
  /** The starting search query, used until `filter` is set. */
@@ -3361,6 +3716,9 @@ replaces this with what each row came to as it draws. It still has to be
3361
3716
  close, because it is what the scrollbar is built from before anything has
3362
3717
  been measured. */
3363
3718
  estimate?: (HelixHeadlessDataTable["estimate"]) | undefined;
3719
+ /** The keys of the open rows in a tree grid, separated by commas, the shape of
3720
+ `selected`. A reader's press writes it and then sends `helix-expand`. */
3721
+ expanded?: (HelixHeadlessDataTable["expanded"]) | undefined;
3364
3722
  /** The search query. A row is shown when the query matches any of its columns.
3365
3723
 
3366
3724
  One query rather than a predicate per column, which is what a reader means
@@ -3375,6 +3733,22 @@ replaced with the page it jumps to. */
3375
3733
  gapLabel?: (HelixHeadlessDataTable["gapLabel"]) | undefined;
3376
3734
  /** The grid's name, read by screen readers. */
3377
3735
  label?: (HelixHeadlessDataTable["label"]) | undefined;
3736
+ /** Draws a row after the last one with a button that asks for more rows.
3737
+
3738
+ The button sends `helix-load-more`, and a `windowed` table sends it by
3739
+ itself once a reader scrolls within one screen of the end. Turn it off
3740
+ when there are no more rows to load. */
3741
+ "load-more"?: (HelixHeadlessDataTable["loadMore"]) | undefined;
3742
+ /** Draws a row after the last one with a button that asks for more rows.
3743
+
3744
+ The button sends `helix-load-more`, and a `windowed` table sends it by
3745
+ itself once a reader scrolls within one screen of the end. Turn it off
3746
+ when there are no more rows to load. */
3747
+ loadMore?: (HelixHeadlessDataTable["loadMore"]) | undefined;
3748
+ /** The words on the button in the `more` row. */
3749
+ "load-more-label"?: (HelixHeadlessDataTable["loadMoreLabel"]) | undefined;
3750
+ /** The words on the button in the `more` row. */
3751
+ loadMoreLabel?: (HelixHeadlessDataTable["loadMoreLabel"]) | undefined;
3378
3752
  /** Where filtering, sorting, and paging happen. `client` does them in the
3379
3753
  table, and `server` leaves them to your code.
3380
3754
 
@@ -3582,10 +3956,14 @@ holds and reordering it under them is a mutation they did not ask for. */
3582
3956
  export type HelixHeadlessDataTableVueEvents = {
3583
3957
  /** Fired after the page changes, with the new page as a string in `detail.value`. */
3584
3958
  "helix-activate": HelixHeadlessDataTableHelixActivateElementEvent;
3959
+ /** Fired after a row opens or closes, with every open row's key, separated by commas, which `expanded` also holds. */
3960
+ "helix-expand": HelixHeadlessDataTableHelixExpandElementEvent;
3585
3961
  /** The search query is about to change. Cancelable: cancel it to keep the current query. */
3586
3962
  "helix-filter": HelixHeadlessDataTableHelixFilterElementEvent;
3587
3963
  /** Fired after the search query changes, with the new query. */
3588
3964
  "helix-filtered": HelixHeadlessDataTableHelixFilteredElementEvent;
3965
+ /** Fired when a reader asks for more rows, by the `load-more` row's button or by scrolling a `windowed` table near its end. */
3966
+ "helix-load-more": HelixHeadlessDataTableHelixLoadMoreElementEvent;
3589
3967
  /** Another page was requested. Cancelable: cancel it to stay on the current page. */
3590
3968
  "helix-navigate": HelixHeadlessDataTableHelixNavigateElementEvent;
3591
3969
  /** The columns are about to move. The event carries every field in the new order. Cancelable: cancel it to keep the current order. */
@@ -3705,6 +4083,12 @@ and is Sunday otherwise. */
3705
4083
  locale?: (HelixHeadlessDateInput["locale"]) | undefined;
3706
4084
  /** The latest date that can be chosen, as `YYYY-MM-DD`. */
3707
4085
  max?: (HelixHeadlessDateInput["max"]) | undefined;
4086
+ /** How far the calendar's heading steps back from the days: `month` or
4087
+ `year`. Handed to the calendar; see Date Picker's `max-view`. */
4088
+ "max-view"?: (HelixHeadlessDateInput["maxView"]) | undefined;
4089
+ /** How far the calendar's heading steps back from the days: `month` or
4090
+ `year`. Handed to the calendar; see Date Picker's `max-view`. */
4091
+ maxView?: (HelixHeadlessDateInput["maxView"]) | undefined;
3708
4092
  /** The earliest date that can be chosen, as `YYYY-MM-DD`. */
3709
4093
  min?: (HelixHeadlessDateInput["min"]) | undefined;
3710
4094
  /** How many dates can be held at once.
@@ -3720,16 +4104,38 @@ an end in April otherwise means paging between them and losing sight of the
3720
4104
  first. The panel is sized by its content, so this widens it, and where the
3721
4105
  window has no room for that width it shows one month until there is. */
3722
4106
  months?: (HelixHeadlessDateInput["months"]) | undefined;
4107
+ /** The name of the calendar's heading where it shows the months, with
4108
+ `{heading}` filled in. */
4109
+ "month-view-label"?: (HelixHeadlessDateInput["monthViewLabel"]) | undefined;
4110
+ /** The name of the calendar's heading where it shows the months, with
4111
+ `{heading}` filled in. */
4112
+ monthViewLabel?: (HelixHeadlessDateInput["monthViewLabel"]) | undefined;
3723
4113
  /** The name of the calendar's control that moves to the next month. */
3724
4114
  "next-label"?: (HelixHeadlessDateInput["nextLabel"]) | undefined;
3725
4115
  /** The name of the calendar's control that moves to the next month. */
3726
4116
  nextLabel?: (HelixHeadlessDateInput["nextLabel"]) | undefined;
4117
+ /** The name of the calendar's control that moves forward a year. */
4118
+ "next-year-label"?: (HelixHeadlessDateInput["nextYearLabel"]) | undefined;
4119
+ /** The name of the calendar's control that moves forward a year. */
4120
+ nextYearLabel?: (HelixHeadlessDateInput["nextYearLabel"]) | undefined;
4121
+ /** The name of the calendar's control that moves forward a page of years. */
4122
+ "next-years-label"?: (HelixHeadlessDateInput["nextYearsLabel"]) | undefined;
4123
+ /** The name of the calendar's control that moves forward a page of years. */
4124
+ nextYearsLabel?: (HelixHeadlessDateInput["nextYearsLabel"]) | undefined;
3727
4125
  /** The text the field shows before a date is entered. */
3728
4126
  placeholder?: (HelixHeadlessDateInput["placeholder"]) | undefined;
3729
4127
  /** The name of the calendar's control that moves to the previous month. */
3730
4128
  "previous-label"?: (HelixHeadlessDateInput["previousLabel"]) | undefined;
3731
4129
  /** The name of the calendar's control that moves to the previous month. */
3732
4130
  previousLabel?: (HelixHeadlessDateInput["previousLabel"]) | undefined;
4131
+ /** The name of the calendar's control that moves back a year. */
4132
+ "previous-year-label"?: (HelixHeadlessDateInput["previousYearLabel"]) | undefined;
4133
+ /** The name of the calendar's control that moves back a year. */
4134
+ previousYearLabel?: (HelixHeadlessDateInput["previousYearLabel"]) | undefined;
4135
+ /** The name of the calendar's control that moves back a page of years. */
4136
+ "previous-years-label"?: (HelixHeadlessDateInput["previousYearsLabel"]) | undefined;
4137
+ /** The name of the calendar's control that moves back a page of years. */
4138
+ previousYearsLabel?: (HelixHeadlessDateInput["previousYearsLabel"]) | undefined;
3733
4139
  /** The message shown when a range holds more than two dates.
3734
4140
 
3735
4141
  **Every sentence a control raises in the browser's bubble is a property**,
@@ -3785,6 +4191,26 @@ platform's base. */
3785
4191
  "unavailable-message"?: (HelixHeadlessDateInput["unavailableMessage"]) | undefined;
3786
4192
  /** The message shown when `disable-dates` or `disable-days` bars a date. */
3787
4193
  unavailableMessage?: (HelixHeadlessDateInput["unavailableMessage"]) | undefined;
4194
+ /** The name of the calendar's heading where it shows a page of years, with
4195
+ `{heading}` filled in. */
4196
+ "year-view-label"?: (HelixHeadlessDateInput["yearViewLabel"]) | undefined;
4197
+ /** The name of the calendar's heading where it shows a page of years, with
4198
+ `{heading}` filled in. */
4199
+ yearViewLabel?: (HelixHeadlessDateInput["yearViewLabel"]) | undefined;
4200
+ /** What a screen reader hears for a segment with nothing in it, which a
4201
+ sighted reader sees as dashes. */
4202
+ "empty-segment-label"?: (HelixHeadlessDateInput["emptySegmentLabel"]) | undefined;
4203
+ /** What a screen reader hears for a segment with nothing in it, which a
4204
+ sighted reader sees as dashes. */
4205
+ emptySegmentLabel?: (HelixHeadlessDateInput["emptySegmentLabel"]) | undefined;
4206
+ /** Whether the field is a row of segments, one for each part of the date or
4207
+ time, in place of a line of text.
4208
+
4209
+ Each segment is set with digits or the arrow keys, in the order the
4210
+ locale writes them, so a reader types a date the way they write one and
4211
+ no format has to be read back. The picker still opens from the trigger
4212
+ and with Alt+Down. */
4213
+ segmented?: (HelixHeadlessDateInput["segmented"]) | undefined;
3788
4214
  /** Whether the value is locked. A read-only control still submits its value.
3789
4215
 
3790
4216
  **Enforced by refusing every request in one place**, which is the seam this
@@ -3925,6 +4351,14 @@ imperatively later, and nothing is hydrating by then.
3925
4351
 
3926
4352
  Here rather than on each control. */
3927
4353
  name?: (HelixHeadlessDateInput["name"]) | undefined;
4354
+ /** What each day in the calendar shows, in place of its number: a function
4355
+ given the date as `YYYY-MM-DD`. Handed to the calendar; see Date Picker's
4356
+ `dayContent`. */
4357
+ dayContent?: (HelixHeadlessDateInput["dayContent"]) | undefined;
4358
+ /** A rule for which dates cannot be chosen: a function given the date as
4359
+ `YYYY-MM-DD` that returns `true` to bar it. The calendar offers such a date
4360
+ as unavailable, and a typed one is invalid, as with `disable-dates`. */
4361
+ isDateUnavailable?: (HelixHeadlessDateInput["isDateUnavailable"]) | undefined;
3928
4362
  /** The value as a `Date`, at midnight UTC, or `null` while there is no date.
3929
4363
 
3930
4364
  The platform's own pair on `<input type="date">`, and this control holds the
@@ -4017,6 +4451,24 @@ Absent uses the runtime's own. */
4017
4451
  locale?: (HelixHeadlessDatePicker["locale"]) | undefined;
4018
4452
  /** Latest selectable date, as `YYYY-MM-DD`. */
4019
4453
  max?: (HelixHeadlessDatePicker["max"]) | undefined;
4454
+ /** How far the heading lets a reader step back from the days: `month` to a
4455
+ year's months, or `year` to a page of years and then its months.
4456
+
4457
+ Absent, the heading is text and the calendar moves a month at a time. Set,
4458
+ the heading is a button that shows the months, and from there the years,
4459
+ so a birth date forty years back is three presses rather than four hundred
4460
+ and eighty. Choosing a year shows its months, and choosing a month shows
4461
+ its days. */
4462
+ "max-view"?: (HelixHeadlessDatePicker["maxView"]) | undefined;
4463
+ /** How far the heading lets a reader step back from the days: `month` to a
4464
+ year's months, or `year` to a page of years and then its months.
4465
+
4466
+ Absent, the heading is text and the calendar moves a month at a time. Set,
4467
+ the heading is a button that shows the months, and from there the years,
4468
+ so a birth date forty years back is three presses rather than four hundred
4469
+ and eighty. Choosing a year shows its months, and choosing a month shows
4470
+ its days. */
4471
+ maxView?: (HelixHeadlessDatePicker["maxView"]) | undefined;
4020
4472
  /** Earliest selectable date, as `YYYY-MM-DD`. */
4021
4473
  min?: (HelixHeadlessDatePicker["min"]) | undefined;
4022
4474
  /** How many dates can be held at once. */
@@ -4030,10 +4482,24 @@ can drive the view. Reading gives the month on show; writing sets it, and
4030
4482
  month?: (HelixHeadlessDatePicker["month"]) | undefined;
4031
4483
  /** How many months to show, side by side. */
4032
4484
  months?: (HelixHeadlessDatePicker["months"]) | undefined;
4485
+ /** The name of the heading where it shows the months, with `{heading}`
4486
+ filled in as the month on show. */
4487
+ "month-view-label"?: (HelixHeadlessDatePicker["monthViewLabel"]) | undefined;
4488
+ /** The name of the heading where it shows the months, with `{heading}`
4489
+ filled in as the month on show. */
4490
+ monthViewLabel?: (HelixHeadlessDatePicker["monthViewLabel"]) | undefined;
4033
4491
  /** Accessible name for the control that pages forward. */
4034
4492
  "next-label"?: (HelixHeadlessDatePicker["nextLabel"]) | undefined;
4035
4493
  /** Accessible name for the control that pages forward. */
4036
4494
  nextLabel?: (HelixHeadlessDatePicker["nextLabel"]) | undefined;
4495
+ /** Accessible name for the control that moves forward a year, in the months. */
4496
+ "next-year-label"?: (HelixHeadlessDatePicker["nextYearLabel"]) | undefined;
4497
+ /** Accessible name for the control that moves forward a year, in the months. */
4498
+ nextYearLabel?: (HelixHeadlessDatePicker["nextYearLabel"]) | undefined;
4499
+ /** Accessible name for the control that moves forward a page, in the years. */
4500
+ "next-years-label"?: (HelixHeadlessDatePicker["nextYearsLabel"]) | undefined;
4501
+ /** Accessible name for the control that moves forward a page, in the years. */
4502
+ nextYearsLabel?: (HelixHeadlessDatePicker["nextYearsLabel"]) | undefined;
4037
4503
  /** Accessible name for the control that pages back.
4038
4504
 
4039
4505
  A property because a calendar rendering its own month names from `locale`
@@ -4048,6 +4514,14 @@ would otherwise still announce its controls in English. `attribute:`
4048
4514
  spelled out, since Lit lowercases a camelCase name rather than dash-casing
4049
4515
  it. */
4050
4516
  previousLabel?: (HelixHeadlessDatePicker["previousLabel"]) | undefined;
4517
+ /** Accessible name for the control that moves back a year, in the months. */
4518
+ "previous-year-label"?: (HelixHeadlessDatePicker["previousYearLabel"]) | undefined;
4519
+ /** Accessible name for the control that moves back a year, in the months. */
4520
+ previousYearLabel?: (HelixHeadlessDatePicker["previousYearLabel"]) | undefined;
4521
+ /** Accessible name for the control that moves back a page, in the years. */
4522
+ "previous-years-label"?: (HelixHeadlessDatePicker["previousYearsLabel"]) | undefined;
4523
+ /** Accessible name for the control that moves back a page, in the years. */
4524
+ previousYearsLabel?: (HelixHeadlessDatePicker["previousYearsLabel"]) | undefined;
4051
4525
  /** The validation message for a date after `max`. `{max}` is replaced with
4052
4526
  `max`, written as a date in `locale`. */
4053
4527
  "range-overflow-message"?: (HelixHeadlessDatePicker["rangeOverflowMessage"]) | undefined;
@@ -4112,6 +4586,17 @@ bars. */
4112
4586
  "value-missing-message"?: (HelixHeadlessDatePicker["valueMissingMessage"]) | undefined;
4113
4587
  /** The validation message for a required date picker with no date chosen. */
4114
4588
  valueMissingMessage?: (HelixHeadlessDatePicker["valueMissingMessage"]) | undefined;
4589
+ /** What the calendar shows: the days of a month, the months of a year, or a
4590
+ page of years. `day` unless `max-view` lets a reader step back.
4591
+
4592
+ Not reflected, being state. Set it to open on the months or the years. */
4593
+ view?: (HelixHeadlessDatePicker["view"]) | undefined;
4594
+ /** The name of the heading where it shows a page of years, with `{heading}`
4595
+ filled in as the year on show. */
4596
+ "year-view-label"?: (HelixHeadlessDatePicker["yearViewLabel"]) | undefined;
4597
+ /** The name of the heading where it shows a page of years, with `{heading}`
4598
+ filled in as the year on show. */
4599
+ yearViewLabel?: (HelixHeadlessDatePicker["yearViewLabel"]) | undefined;
4115
4600
  /** The value the control starts with. A form reset returns it to this value. */
4116
4601
  "default-value"?: (HelixHeadlessDatePicker["defaultValue"]) | undefined;
4117
4602
  /** The value the control starts with. A form reset returns it to this value. */
@@ -4149,6 +4634,24 @@ imperatively later, and nothing is hydrating by then.
4149
4634
 
4150
4635
  Here rather than on each control. */
4151
4636
  name?: (HelixHeadlessDatePicker["name"]) | undefined;
4637
+ /** What each day shows, in place of its number: a function given the date as
4638
+ `YYYY-MM-DD` that returns text, an element or a Lit template.
4639
+
4640
+ For a price or a dot under the number, as React Aria's `CalendarCell`
4641
+ takes children. The cell is still named by its whole date, so what you
4642
+ draw here is for the eye; say anything a reader must hear in the date's
4643
+ description elsewhere. Return the day's number with it where it should
4644
+ still show. A property only, there being no way to write a function in
4645
+ markup. */
4646
+ dayContent?: (HelixHeadlessDatePicker["dayContent"]) | undefined;
4647
+ /** A rule for which dates cannot be chosen: a function given the date as
4648
+ `YYYY-MM-DD` that returns `true` to bar it.
4649
+
4650
+ For what a list cannot say, such as the second Tuesday of each month or
4651
+ the days a server has fully booked. It bars a date as `disable-dates`
4652
+ does, in the grid and in validation. A property only, as React Aria's
4653
+ `isDateUnavailable` is a prop. */
4654
+ isDateUnavailable?: (HelixHeadlessDatePicker["isDateUnavailable"]) | undefined;
4152
4655
  /** The value as a `Date`, at midnight UTC, or `null` while there is no date.
4153
4656
 
4154
4657
  The platform's own pair on `<input type="date">`, and this control holds the
@@ -4202,6 +4705,9 @@ labels line up, and lining up is a fact about all of them.
4202
4705
  a reflecting default writes an attribute onto markup the consumer rendered,
4203
4706
  and React reports that as a hydration mismatch. */
4204
4707
  direction?: (HelixHeadlessDescriptionList["direction"]) | undefined;
4708
+ /** The list's name, read by screen readers, such as "Server details". It
4709
+ makes the list a named group. */
4710
+ label?: (HelixHeadlessDescriptionList["label"]) | undefined;
4205
4711
  };
4206
4712
 
4207
4713
  export type HelixHeadlessDescriptionListVueEvents = {};
@@ -4222,6 +4728,16 @@ export type HelixHeadlessDialogToggleElementEvent =
4222
4728
  HelixHeadlessDialogElementEvent<ToggleEvent>;
4223
4729
 
4224
4730
  export type HelixHeadlessDialogVueProps = {
4731
+ /** Makes the dialog an alert dialog, for a message that interrupts to ask for
4732
+ an answer, such as a confirmation before something is deleted.
4733
+
4734
+ The `<dialog>` takes `role="alertdialog"`, so a screen reader announces the
4735
+ dialog and its description as it opens. Everything else stays the same:
4736
+ the dialog is modal, Escape asks to close it, and `persistent` still
4737
+ refuses that.
4738
+
4739
+ Not reflected, because no stylesheet selects on it. */
4740
+ alert?: (HelixHeadlessDialog["alert"]) | undefined;
4225
4741
  /** Which close requests the browser handles on its own.
4226
4742
 
4227
4743
  `<dialog closedby>`, forwarded, and safe to forward because every path it
@@ -4244,6 +4760,17 @@ the property this component exists to keep.
4244
4760
  Absent by default, which is the platform's `auto` and this library's rule
4245
4761
  that a resting value is an attribute's absence. */
4246
4762
  closedBy?: (HelixHeadlessDialog["closedBy"]) | undefined;
4763
+ /** Draws a control that closes the dialog, in the corner where the title is.
4764
+
4765
+ Pressing it is `close()`, so it sends `helix-before-close` like every other
4766
+ way out, and `persistent` does not disable it. */
4767
+ dismissible?: (HelixHeadlessDialog["dismissible"]) | undefined;
4768
+ /** The close control's accessible name. Translate it with the rest of your
4769
+ interface. */
4770
+ "dismiss-label"?: (HelixHeadlessDialog["dismissLabel"]) | undefined;
4771
+ /** The close control's accessible name. Translate it with the rest of your
4772
+ interface. */
4773
+ dismissLabel?: (HelixHeadlessDialog["dismissLabel"]) | undefined;
4247
4774
  /** Accessible name for the dialog. When it is empty, the heading in the
4248
4775
  `header` slot names the dialog. */
4249
4776
  label?: (HelixHeadlessDialog["label"]) | undefined;
@@ -4451,6 +4978,24 @@ default assigned to the property would reflect onto every host and put a
4451
4978
  `placement="end"` into markup no consumer wrote. So what this tier
4452
4979
  guarantees is the absence, and a sheet selects on it. */
4453
4980
  placement?: (HelixHeadlessDrawer["placement"]) | undefined;
4981
+ /** The fractions of the panel a reader can leave on screen, as a list such as
4982
+ `0.5 1`. The drawer opens at the smallest, and a swipe comes to rest at the
4983
+ nearest, or closes the drawer below the smallest.
4984
+
4985
+ Empty is `1`: the whole panel, and a swipe either closes it or puts it
4986
+ back. */
4987
+ "snap-points"?: (HelixHeadlessDrawer["snapPoints"]) | undefined;
4988
+ /** The fractions of the panel a reader can leave on screen, as a list such as
4989
+ `0.5 1`. The drawer opens at the smallest, and a swipe comes to rest at the
4990
+ nearest, or closes the drawer below the smallest.
4991
+
4992
+ Empty is `1`: the whole panel, and a swipe either closes it or puts it
4993
+ back. */
4994
+ snapPoints?: (HelixHeadlessDrawer["snapPoints"]) | undefined;
4995
+ /** Whether a touch or a pen can swipe the drawer away. `swipe="false"` turns
4996
+ it off, for a panel whose content has its own use for the gesture, such as
4997
+ a map. */
4998
+ swipe?: (HelixHeadlessDrawer["swipe"]) | undefined;
4454
4999
  /** Whether the element starts open. Ignored once `open` is written. */
4455
5000
  "default-open"?: (HelixHeadlessDrawer["defaultOpen"]) | undefined;
4456
5001
  /** Whether the element starts open. Ignored once `open` is written. */
@@ -4522,14 +5067,6 @@ elements, and writing `tabindex` onto a host the consumer rendered is a
4522
5067
  change a React consumer's hydration reports and does not patch up. The stop
4523
5068
  lands inside this shadow root instead. */
4524
5069
  focusable?: (HelixHeadlessDrilldownItem["focusable"]) | undefined;
4525
- /** Whether the page showing is the one this row is on.
4526
-
4527
- Written by the stack. */
4528
- onPage?: (HelixHeadlessDrilldownItem["onPage"]) | undefined;
4529
- /** Whether this row's own page is the one showing.
4530
-
4531
- Written by the stack. */
4532
- showingPage?: (HelixHeadlessDrilldownItem["showingPage"]) | undefined;
4533
5070
  };
4534
5071
 
4535
5072
  export type HelixHeadlessDrilldownItemVueEvents = {
@@ -4603,6 +5140,9 @@ export type HelixHeadlessFileInputElementEvent<E = Event> = TypedEvent<
4603
5140
  /** `helix-before-change` event type */
4604
5141
  export type HelixHeadlessFileInputHelixBeforeChangeElementEvent =
4605
5142
  HelixHeadlessFileInputElementEvent<HelixBeforeChangeEvent>;
5143
+ /** `helix-reject` event type */
5144
+ export type HelixHeadlessFileInputHelixRejectElementEvent =
5145
+ HelixHeadlessFileInputElementEvent<HelixRejectEvent>;
4606
5146
 
4607
5147
  export type HelixHeadlessFileInputVueProps = {
4608
5148
  /** Which files the picker offers and a drop takes, as a native `accept` list.
@@ -4612,12 +5152,31 @@ filter is the only check the platform makes and a drop never meets it. */
4612
5152
  accept?: (HelixHeadlessFileInput["accept"]) | undefined;
4613
5153
  /** Which camera or microphone a mobile picker should offer, if any. */
4614
5154
  capture?: (HelixHeadlessFileInput["capture"]) | undefined;
5155
+ /** Whether the picker chooses a folder, and the field takes every file in
5156
+ it. The platform's `webkitdirectory`. */
5157
+ directory?: (HelixHeadlessFileInput["directory"]) | undefined;
4615
5158
  /** Language tag the sizes are written in.
4616
5159
 
4617
5160
  Absent uses the runtime's own. */
4618
5161
  locale?: (HelixHeadlessFileInput["locale"]) | undefined;
5162
+ /** The most files the field holds, under `multiple`. Files past it are
5163
+ refused. */
5164
+ "max-files"?: (HelixHeadlessFileInput["maxFiles"] | `${number}`) | undefined;
5165
+ /** The most files the field holds, under `multiple`. Files past it are
5166
+ refused. */
5167
+ maxFiles?: (HelixHeadlessFileInput["maxFiles"]) | undefined;
5168
+ /** The most bytes one file may have. A larger one is refused. */
5169
+ "max-file-size"?: (HelixHeadlessFileInput["maxFileSize"] | `${number}`) | undefined;
5170
+ /** The most bytes one file may have. A larger one is refused. */
5171
+ maxFileSize?: (HelixHeadlessFileInput["maxFileSize"]) | undefined;
4619
5172
  /** Whether more than one file can be chosen. */
4620
5173
  multiple?: (HelixHeadlessFileInput["multiple"]) | undefined;
5174
+ /** What a reader hears when files are refused, with `{count}` and `{names}`
5175
+ filled in. */
5176
+ "rejected-text"?: (HelixHeadlessFileInput["rejectedText"]) | undefined;
5177
+ /** What a reader hears when files are refused, with `{count}` and `{names}`
5178
+ filled in. */
5179
+ rejectedText?: (HelixHeadlessFileInput["rejectedText"]) | undefined;
4621
5180
  /** The accessible name of the control that removes a file. `{name}` is
4622
5181
  replaced with the file's name.
4623
5182
 
@@ -4692,6 +5251,9 @@ imperatively later, and nothing is hydrating by then.
4692
5251
 
4693
5252
  Here rather than on each control. */
4694
5253
  name?: (HelixHeadlessFileInput["name"]) | undefined;
5254
+ /** Your own check on each arriving file, which returns why it is refused, or
5255
+ nothing to take it. A property, since a function cannot be an attribute. */
5256
+ validate?: (HelixHeadlessFileInput["validate"]) | undefined;
4695
5257
  };
4696
5258
 
4697
5259
  export type HelixHeadlessFileInputVueEvents = {
@@ -4699,6 +5261,8 @@ export type HelixHeadlessFileInputVueEvents = {
4699
5261
  change: HelixHeadlessFileInputElementEvent;
4700
5262
  /** Fired before the chosen files change, with their names, and cancelable. Canceling it keeps the files the field had, even when the browser has already written a new pick. */
4701
5263
  "helix-before-change": HelixHeadlessFileInputHelixBeforeChangeElementEvent;
5264
+ /** Fired when files arrive and some are left out. `detail.files` lists each with its `reason`: `type`, `size`, `count` or `invalid`, and your `validate` message. */
5265
+ "helix-reject": HelixHeadlessFileInputHelixRejectElementEvent;
4702
5266
  /** Fired after the value changes. */
4703
5267
  input: HelixHeadlessFileInputElementEvent;
4704
5268
  };
@@ -4912,10 +5476,26 @@ an icon. */
4912
5476
  /** The name of the clear button, read by screen readers. The button shows only
4913
5477
  an icon. */
4914
5478
  clearLabel?: (HelixHeadlessFilterInput["clearLabel"]) | undefined;
5479
+ /** Whether the panel narrows itself to the suggestions that hold the term
5480
+ being typed, as React Aria's Autocomplete filters. Off, the panel shows
5481
+ what you slot and you narrow it. */
5482
+ "filter-suggestions"?: (HelixHeadlessFilterInput["filterSuggestions"]) | undefined;
5483
+ /** Whether the panel narrows itself to the suggestions that hold the term
5484
+ being typed, as React Aria's Autocomplete filters. Off, the panel shows
5485
+ what you slot and you narrow it. */
5486
+ filterSuggestions?: (HelixHeadlessFilterInput["filterSuggestions"]) | undefined;
4915
5487
  /** The text shown while the field is empty.
4916
5488
 
4917
5489
  Not a label: it goes when typing starts. */
4918
5490
  placeholder?: (HelixHeadlessFilterInput["placeholder"]) | undefined;
5491
+ /** What a reader hears for one suggestion, with `{count}` filled in. */
5492
+ "suggestion-label"?: (HelixHeadlessFilterInput["suggestionLabel"]) | undefined;
5493
+ /** What a reader hears for one suggestion, with `{count}` filled in. */
5494
+ suggestionLabel?: (HelixHeadlessFilterInput["suggestionLabel"]) | undefined;
5495
+ /** What a reader hears for any other number of suggestions, with `{count}` filled in. */
5496
+ "suggestions-label"?: (HelixHeadlessFilterInput["suggestionsLabel"]) | undefined;
5497
+ /** What a reader hears for any other number of suggestions, with `{count}` filled in. */
5498
+ suggestionsLabel?: (HelixHeadlessFilterInput["suggestionsLabel"]) | undefined;
4919
5499
  /** Whether the element starts open. Ignored once `open` is written. */
4920
5500
  "default-open"?: (HelixHeadlessFilterInput["defaultOpen"]) | undefined;
4921
5501
  /** Whether the element starts open. Ignored once `open` is written. */
@@ -5056,6 +5636,12 @@ Lit's server shim, `textContent`, `children`, `firstChild` and
5056
5636
  it. An element rendered on a server needs the attribute; one rendered in a
5057
5637
  browser may use either. */
5058
5638
  date?: (HelixHeadlessFormatDate["date"]) | undefined;
5639
+ /** The locale's own pattern for the date: `full`, `long`, `medium`, or
5640
+ `short`. Set, it stands in for `weekday`, `day`, `month`, `year` and `era`. */
5641
+ "date-style"?: (HelixHeadlessFormatDate["dateStyle"]) | undefined;
5642
+ /** The locale's own pattern for the date: `full`, `long`, `medium`, or
5643
+ `short`. Set, it stands in for `weekday`, `day`, `month`, `year` and `era`. */
5644
+ dateStyle?: (HelixHeadlessFormatDate["dateStyle"]) | undefined;
5059
5645
  /** How the day of the month is written, where a date is shown. */
5060
5646
  day?: (HelixHeadlessFormatDate["day"]) | undefined;
5061
5647
  /** Shows how long ago the timestamp was, in a compact form such as "3h", in
@@ -5065,8 +5651,22 @@ Reflected, because it is the one property that decides which of two readings
5065
5651
  this is and a stylesheet has a reason to know: a compact reading is a fixed
5066
5652
  few characters and a date is not. */
5067
5653
  elapsed?: (HelixHeadlessFormatDate["elapsed"]) | undefined;
5654
+ /** How the era is written, such as AD, where a date is shown. */
5655
+ era?: (HelixHeadlessFormatDate["era"]) | undefined;
5068
5656
  /** How the hour is written, where a time of day is shown. */
5069
5657
  hour?: (HelixHeadlessFormatDate["hour"]) | undefined;
5658
+ /** The clock a time of day is written on: `h12` or `h11` for twelve hours,
5659
+ `h23` or `h24` for twenty-four.
5660
+
5661
+ Absent is the locale's own, which is right unless your product shows every
5662
+ reader the same clock whatever their language. */
5663
+ "hour-cycle"?: (HelixHeadlessFormatDate["hourCycle"]) | undefined;
5664
+ /** The clock a time of day is written on: `h12` or `h11` for twelve hours,
5665
+ `h23` or `h24` for twenty-four.
5666
+
5667
+ Absent is the locale's own, which is right unless your product shows every
5668
+ reader the same clock whatever their language. */
5669
+ hourCycle?: (HelixHeadlessFormatDate["hourCycle"]) | undefined;
5070
5670
  /** The locale to format the timestamp in.
5071
5671
 
5072
5672
  Empty is the runtime's own. */
@@ -5075,8 +5675,26 @@ Empty is the runtime's own. */
5075
5675
  minute?: (HelixHeadlessFormatDate["minute"]) | undefined;
5076
5676
  /** How the month is written, where a date is shown. */
5077
5677
  month?: (HelixHeadlessFormatDate["month"]) | undefined;
5678
+ /** Whether a `relative` reading may use a word for a number: `auto` says
5679
+ "yesterday" and "now", and `always` says "1 day ago" and "in 0 seconds". */
5680
+ numeric?: (HelixHeadlessFormatDate["numeric"]) | undefined;
5681
+ /** Shows how long ago the timestamp was, or how long until it, in words, in
5682
+ place of the date: `long` ("3 hours ago"), `short` ("3 hr. ago") or
5683
+ `narrow` ("3h ago").
5684
+
5685
+ The reading refreshes as it goes stale, as `elapsed` does, and the whole
5686
+ date is its title. `elapsed` wins where both are set. */
5687
+ relative?: (HelixHeadlessFormatDate["relative"]) | undefined;
5078
5688
  /** How the second is written, where a time of day is shown. */
5079
5689
  second?: (HelixHeadlessFormatDate["second"]) | undefined;
5690
+ /** The locale's own pattern for the time of day: `full`, `long`, `medium`, or
5691
+ `short`. Set, it stands in for `hour`, `minute`, `second` and
5692
+ `time-zone-name`. */
5693
+ "time-style"?: (HelixHeadlessFormatDate["timeStyle"]) | undefined;
5694
+ /** The locale's own pattern for the time of day: `full`, `long`, `medium`, or
5695
+ `short`. Set, it stands in for `hour`, `minute`, `second` and
5696
+ `time-zone-name`. */
5697
+ timeStyle?: (HelixHeadlessFormatDate["timeStyle"]) | undefined;
5080
5698
  /** The time zone to read the timestamp in.
5081
5699
 
5082
5700
  Empty is the runtime's own. */
@@ -5584,6 +6202,22 @@ Lives here rather than only on `IconButton` so the two share one render.
5584
6202
  An icon-only button without it is a control a screen reader announces as
5585
6203
  "button" and nothing else. */
5586
6204
  label?: (HelixHeadlessIconButton["label"]) | undefined;
6205
+ /** Whether the action the button started is still running.
6206
+
6207
+ A pending button keeps focus and stays in the tab order, and refuses every
6208
+ press: a click, Enter and Space, and Enter in a field of its form. The
6209
+ click does not reach your listeners. The inner control carries
6210
+ `aria-busy` and `aria-disabled`, and when the button becomes pending while
6211
+ it has focus, a reader hears `pending-label`. The styled button draws a
6212
+ turning ring over its words.
6213
+
6214
+ `disabled` takes the button out of reach. Use `pending` for the wait after
6215
+ a press, so focus stays where the reader left it. */
6216
+ pending?: (HelixHeadlessIconButton["pending"]) | undefined;
6217
+ /** What a reader hears when the button becomes pending while it has focus. */
6218
+ "pending-label"?: (HelixHeadlessIconButton["pendingLabel"]) | undefined;
6219
+ /** What a reader hears when the button becomes pending while it has focus. */
6220
+ pendingLabel?: (HelixHeadlessIconButton["pendingLabel"]) | undefined;
5587
6221
  /** What activating the button does to its form. */
5588
6222
  type?: (HelixHeadlessIconButton["type"]) | undefined;
5589
6223
  /** The value this button submits under its own `name`, as a native submit
@@ -5706,8 +6340,12 @@ disagreeing with its own name for every reader who meant the left. */
5706
6340
  so it is what markup can carry, and resolving one means an index of the
5707
6341
  whole set that no bundler can shake: 15 kB for a consumer who renders one
5708
6342
  mark. An attribute is the only thing an HTML author can write, and that is
5709
- worth the index; a consumer who would rather not pay it hands over the
5710
- value instead. */
6343
+ worth the index; a consumer who would rather not pay it imports the
6344
+ element from `icon/root` and registers the glyphs it names, or hands over
6345
+ the value instead.
6346
+
6347
+ A name written `prefix:name` asks the library registered under that
6348
+ prefix. */
5711
6349
  name?: (HelixHeadlessIcon["name"]) | undefined;
5712
6350
  /** The icon to draw, as an object you import.
5713
6351
 
@@ -5725,8 +6363,10 @@ for. Set both and this wins, the value being the more specific statement. */
5725
6363
  };
5726
6364
 
5727
6365
  export type HelixHeadlessIconVueEvents = {
5728
- /** `name` matches no icon in the set, so nothing is drawn. */
6366
+ /** `name` matches no registered icon and no library answers it, so nothing is drawn. */
5729
6367
  error: HelixHeadlessIconElementEvent;
6368
+ /** A glyph a library gave later for `name` is drawn. */
6369
+ load: HelixHeadlessIconElementEvent;
5730
6370
  };
5731
6371
 
5732
6372
  /** `HelixHeadlessImage` component event */
@@ -5780,6 +6420,18 @@ ninety-nine pictures. */
5780
6420
  picture worth putting in a component is usually below the fold and the one
5781
6421
  that is not is the exception worth writing down. */
5782
6422
  loading?: (HelixHeadlessImage["loading"]) | undefined;
6423
+ /** How long, in milliseconds, the placeholder waits before it shows.
6424
+
6425
+ Absent or `0` shows it at once. A picture that arrives inside
6426
+ the wait never shows a placeholder at all, so a cached or fast image does
6427
+ not flash one. Radix's `delayMs` on its avatar fallback is the same idea. */
6428
+ "placeholder-delay"?: (HelixHeadlessImage["placeholderDelay"] | `${number}`) | undefined;
6429
+ /** How long, in milliseconds, the placeholder waits before it shows.
6430
+
6431
+ Absent or `0` shows it at once. A picture that arrives inside
6432
+ the wait never shows a placeholder at all, so a cached or fast image does
6433
+ not flash one. Radix's `delayMs` on its avatar fallback is the same idea. */
6434
+ placeholderDelay?: (HelixHeadlessImage["placeholderDelay"]) | undefined;
5783
6435
  /** How much of the referring URL to send with the request. */
5784
6436
  referrerpolicy?: (HelixHeadlessImage["referrerPolicy"]) | undefined;
5785
6437
  /** How much of the referring URL to send with the request. */
@@ -5826,6 +6478,9 @@ export type HelixHeadlessInputElementEvent<E = Event> = TypedEvent<
5826
6478
  /** `helix-before-change` event type */
5827
6479
  export type HelixHeadlessInputHelixBeforeChangeElementEvent =
5828
6480
  HelixHeadlessInputElementEvent<HelixBeforeChangeEvent>;
6481
+ /** `helix-clear` event type */
6482
+ export type HelixHeadlessInputHelixClearElementEvent =
6483
+ HelixHeadlessInputElementEvent<HelixClearEvent>;
5829
6484
 
5830
6485
  export type HelixHeadlessInputVueProps = {
5831
6486
  /** Whether a phone capitalizes as the reader types: `off`, `sentences`,
@@ -6028,6 +6683,8 @@ export type HelixHeadlessInputVueEvents = {
6028
6683
  change: HelixHeadlessInputElementEvent;
6029
6684
  /** The text is about to change. Cancelable: cancel it to keep the current text. */
6030
6685
  "helix-before-change": HelixHeadlessInputHelixBeforeChangeElementEvent;
6686
+ /** Fired after the clear button has emptied the field, after `input` and `change`. */
6687
+ "helix-clear": HelixHeadlessInputHelixClearElementEvent;
6031
6688
  /** Fired as the value changes. */
6032
6689
  input: HelixHeadlessInputElementEvent;
6033
6690
  };
@@ -6042,6 +6699,13 @@ export type HelixHeadlessKbdHelixShortcutElementEvent =
6042
6699
  HelixHeadlessKbdElementEvent<HelixShortcutEvent>;
6043
6700
 
6044
6701
  export type HelixHeadlessKbdVueProps = {
6702
+ /** The id of the control the shortcut works, which is given the chord as its
6703
+ `aria-keyshortcuts`.
6704
+
6705
+ Names an element in the same tree, the way `Tooltip.for` does. Separate
6706
+ from `within`, which says where the key listens: a key can describe a
6707
+ shortcut the page binds itself. */
6708
+ for?: (HelixHeadlessKbd["for"]) | undefined;
6045
6709
  /** The key or chord to show, such as `mod+k`, `?`, or `/`.
6046
6710
 
6047
6711
  `mod` is the platform's own command modifier, which is the reason to write
@@ -6070,6 +6734,15 @@ export type HelixHeadlessKbdVueEvents = {
6070
6734
  "helix-shortcut": HelixHeadlessKbdHelixShortcutElementEvent;
6071
6735
  };
6072
6736
 
6737
+ /** `HelixHeadlessLegend` component event */
6738
+ export type HelixHeadlessLegendElementEvent<E = Event> = TypedEvent<
6739
+ HelixHeadlessLegend,
6740
+ E
6741
+ >;
6742
+ /** `helix-before-change` event type */
6743
+ export type HelixHeadlessLegendHelixBeforeChangeElementEvent =
6744
+ HelixHeadlessLegendElementEvent<HelixBeforeChangeEvent>;
6745
+
6073
6746
  export type HelixHeadlessLegendVueProps = {
6074
6747
  /** How the entries are read from the table: `series`, `categories`, or
6075
6748
  `measures`.
@@ -6098,14 +6771,40 @@ shadow root reads a table in that root rather than one in the document.
6098
6771
  **In React this arrives as a property and not as an attribute**, the way
6099
6772
  `Tooltip.for` does, so it does not reflect and nothing styles on it. */
6100
6773
  for?: (HelixHeadlessLegend["for"]) | undefined;
6774
+ /** The series hidden on the table, by name, separated by commas: what
6775
+ `toggles` hides and shows.
6776
+
6777
+ Set it to start with series hidden. Every chart reading the same table
6778
+ draws without them. Commas only, because a column's heading may hold a
6779
+ space. For a ring the names are the rows. */
6780
+ "hidden-series"?: (HelixHeadlessLegend["hiddenSeries"]) | undefined;
6781
+ /** The series hidden on the table, by name, separated by commas: what
6782
+ `toggles` hides and shows.
6783
+
6784
+ Set it to start with series hidden. Every chart reading the same table
6785
+ draws without them. Commas only, because a column's heading may hold a
6786
+ space. For a ring the names are the rows. */
6787
+ hiddenSeries?: (HelixHeadlessLegend["hiddenSeries"]) | undefined;
6101
6788
  /** The name of the list, which a screen reader announces before its entries.
6102
6789
 
6103
6790
  Absent names the list after the table's caption, so a page with several
6104
6791
  charts has a legend list for each that says which chart it keys. */
6105
6792
  label?: (HelixHeadlessLegend["label"]) | undefined;
6793
+ /** Makes each entry a button that hides or shows its series in every chart
6794
+ reading the same table.
6795
+
6796
+ Absent, the legend only displays, which is what it did before this
6797
+ existed. Reflected, because the styled tier draws a button differently
6798
+ from a plain entry. */
6799
+ toggles?: (HelixHeadlessLegend["toggles"]) | undefined;
6106
6800
  };
6107
6801
 
6108
- export type HelixHeadlessLegendVueEvents = {};
6802
+ export type HelixHeadlessLegendVueEvents = {
6803
+ /** Fired once a toggle has hidden or shown a series. */
6804
+ change: HelixHeadlessLegendElementEvent;
6805
+ /** Fired before a toggle hides or shows a series, with the `hidden-series` it would leave. Cancelable. */
6806
+ "helix-before-change": HelixHeadlessLegendHelixBeforeChangeElementEvent;
6807
+ };
6109
6808
 
6110
6809
  export type HelixHeadlessLightboxItemVueProps = {
6111
6810
  /** Whether this item is the one shown.
@@ -6143,6 +6842,19 @@ export type HelixHeadlessLightboxToggleElementEvent =
6143
6842
  HelixHeadlessLightboxElementEvent<ToggleEvent>;
6144
6843
 
6145
6844
  export type HelixHeadlessLightboxVueProps = {
6845
+ /** Draws the viewer's own previous, next and close controls over the picture.
6846
+
6847
+ Off by default, for a viewer whose chrome you compose in the `header` and
6848
+ `footer` slots. The controls hide with the rest of the chrome while the
6849
+ reader is idle, and the previous and next ones say they are unavailable at
6850
+ either end of a set that does not `loop`. */
6851
+ controls?: (HelixHeadlessLightbox["controls"]) | undefined;
6852
+ /** The close control's accessible name. Translate it with the rest of your
6853
+ interface. */
6854
+ "dismiss-label"?: (HelixHeadlessLightbox["dismissLabel"]) | undefined;
6855
+ /** The close control's accessible name. Translate it with the rest of your
6856
+ interface. */
6857
+ dismissLabel?: (HelixHeadlessLightbox["dismissLabel"]) | undefined;
6146
6858
  /** How long the user can be idle before the header and footer hide, in
6147
6859
  milliseconds.
6148
6860
 
@@ -6161,6 +6873,28 @@ keep the chrome up is the consumer's to decide with this. */
6161
6873
  label?: (HelixHeadlessLightbox["label"]) | undefined;
6162
6874
  /** Whether moving past the last item returns to the first. */
6163
6875
  loop?: (HelixHeadlessLightbox["loop"]) | undefined;
6876
+ /** The next control's accessible name. */
6877
+ "next-label"?: (HelixHeadlessLightbox["nextLabel"]) | undefined;
6878
+ /** The next control's accessible name. */
6879
+ nextLabel?: (HelixHeadlessLightbox["nextLabel"]) | undefined;
6880
+ /** The previous control's accessible name. */
6881
+ "previous-label"?: (HelixHeadlessLightbox["previousLabel"]) | undefined;
6882
+ /** The previous control's accessible name. */
6883
+ previousLabel?: (HelixHeadlessLightbox["previousLabel"]) | undefined;
6884
+ /** The name of an item with no `label` of its own, with `{index}` and
6885
+ `{count}` filled in. */
6886
+ "slide-label"?: (HelixHeadlessLightbox["slideLabel"]) | undefined;
6887
+ /** The name of an item with no `label` of its own, with `{index}` and
6888
+ `{count}` filled in. */
6889
+ slideLabel?: (HelixHeadlessLightbox["slideLabel"]) | undefined;
6890
+ /** The word screen readers announce in place of an item's role, set as
6891
+ `aria-roledescription`. Translate it with the rest of your text, or empty
6892
+ it to leave the role as `group`. */
6893
+ "slide-role-label"?: (HelixHeadlessLightbox["slideRoleLabel"]) | undefined;
6894
+ /** The word screen readers announce in place of an item's role, set as
6895
+ `aria-roledescription`. Translate it with the rest of your text, or empty
6896
+ it to leave the role as `group`. */
6897
+ slideRoleLabel?: (HelixHeadlessLightbox["slideRoleLabel"]) | undefined;
6164
6898
  /** The status text that says which item is shown, with `{index}`, `{count}`
6165
6899
  and the item's `{label}` filled in.
6166
6900
 
@@ -6344,7 +7078,27 @@ writes them, whatever this says. */
6344
7078
 
6345
7079
  export type HelixHeadlessLineChartVueEvents = {};
6346
7080
 
7081
+ /** `HelixHeadlessListItem` component event */
7082
+ export type HelixHeadlessListItemElementEvent<E = Event> = TypedEvent<
7083
+ HelixHeadlessListItem,
7084
+ E
7085
+ >;
7086
+ /** `helix-action` event type */
7087
+ export type HelixHeadlessListItemHelixActionElementEvent =
7088
+ HelixHeadlessListItemElementEvent<HelixActionEvent>;
7089
+
6347
7090
  export type HelixHeadlessListItemVueProps = {
7091
+ /** Marks the row a reader is on: `page` for the page they are reading, `step`,
7092
+ `location`, `date` or `time` for those, and written bare for the current
7093
+ one of a set. It is `aria-current` on the row's link, or on the row where
7094
+ it has none.
7095
+
7096
+ Not reflected, as a state never is. `row-current` is the part a
7097
+ stylesheet draws it from. */
7098
+ current?: (HelixHeadlessListItem["current"]) | undefined;
7099
+ /** Takes the row out of reach in a list with `selection-mode`: the arrow keys
7100
+ pass over it and it cannot be selected or acted on. */
7101
+ disabled?: (HelixHeadlessListItem["disabled"]) | undefined;
6348
7102
  /** The URL the row links to. Leave it empty for a row that is not a link.
6349
7103
 
6350
7104
  Empty rather than optional, and unset by default: a list is not always a
@@ -6356,9 +7110,39 @@ to the current page on every row a consumer never asked to be one. */
6356
7110
  rel?: (HelixHeadlessListItem["rel"]) | undefined;
6357
7111
  /** Where the link opens. Use it for a row that leaves the site. */
6358
7112
  target?: (HelixHeadlessListItem["target"]) | undefined;
7113
+ /** What the row stands for in its list's `value`.
7114
+
7115
+ Absent is the row's own words. */
7116
+ value?: (HelixHeadlessListItem["value"]) | undefined;
7117
+ /** Whether the row holds its list's tab stop.
7118
+
7119
+ Written by a list with `selection-mode` on every row it holds, and unset
7120
+ otherwise, which is how a row knows it is a row of a grid. No attribute:
7121
+ it is coordination between elements, as `Tag.focusable` is. */
7122
+ focusable?: (HelixHeadlessListItem["focusable"]) | undefined;
7123
+ /** Whether the row is selected, in a list that selects.
7124
+
7125
+ Written by the list from its own `value`, and unset where nothing can be
7126
+ selected, which keeps `aria-selected` off a list that does not select. */
7127
+ selected?: (HelixHeadlessListItem["selected"]) | undefined;
7128
+ };
7129
+
7130
+ export type HelixHeadlessListItemVueEvents = {
7131
+ /** The reader pressed Enter on the row, or pressed the row in a list that selects nothing, in a list with `selection-mode`. Read the row from `target`. A row with `href` follows its link instead. */
7132
+ "helix-action": HelixHeadlessListItemHelixActionElementEvent;
6359
7133
  };
6360
7134
 
6361
- export type HelixHeadlessListItemVueEvents = {};
7135
+ /** `HelixHeadlessList` component event */
7136
+ export type HelixHeadlessListElementEvent<E = Event> = TypedEvent<
7137
+ HelixHeadlessList,
7138
+ E
7139
+ >;
7140
+ /** `helix-action` event type */
7141
+ export type HelixHeadlessListHelixActionElementEvent =
7142
+ HelixHeadlessListElementEvent<HelixActionEvent>;
7143
+ /** `helix-before-change` event type */
7144
+ export type HelixHeadlessListHelixBeforeChangeElementEvent =
7145
+ HelixHeadlessListElementEvent<HelixBeforeChangeEvent>;
6362
7146
 
6363
7147
  export type HelixHeadlessListVueProps = {
6364
7148
  /** The kind of list, which follows from the content.
@@ -6384,6 +7168,20 @@ has to survive with the stylesheet turned off.
6384
7168
  kind?: (HelixHeadlessList["kind"]) | undefined;
6385
7169
  /** The list's name, read by screen readers. */
6386
7170
  label?: (HelixHeadlessList["label"]) | undefined;
7171
+ /** Numbers an ordered list downward, so the count falls row by row and ends at
7172
+ its last row, as `<ol reversed>` does. */
7173
+ reversed?: (HelixHeadlessList["reversed"]) | undefined;
7174
+ /** Makes the list interactive: `single` selects one row, `multiple` any
7175
+ number, and `none` moves and acts without selecting. Unset is a list a
7176
+ reader reads, with no tab stop of its own. */
7177
+ "selection-mode"?: (HelixHeadlessList["selectionMode"]) | undefined;
7178
+ /** Makes the list interactive: `single` selects one row, `multiple` any
7179
+ number, and `none` moves and acts without selecting. Unset is a list a
7180
+ reader reads, with no tab stop of its own. */
7181
+ selectionMode?: (HelixHeadlessList["selectionMode"]) | undefined;
7182
+ /** The number of an ordered list's first row, as `<ol start>` is. Unset counts
7183
+ from one, or down from the number of rows where `reversed`. */
7184
+ start?: (HelixHeadlessList["start"]) | undefined;
6387
7185
  /** The markers an ordered list draws. It takes the five values of `<ol type>`.
6388
7186
 
6389
7187
  Reflected, because this is one of the things a stylesheet selects on, each
@@ -6391,18 +7189,24 @@ value mapping to a `list-style-type`. The platform's spellings rather than
6391
7189
  the CSS ones, so `<helix-headless-list kind="ordered" type="i">` is what a
6392
7190
  consumer would have written on an `<ol>`.
6393
7191
 
6394
- **`start` and `reversed` are both absent and neither can be done here.**
6395
- This renders no `<ol>`: the rows are slotted and numbered by the CSS
6396
- `list-item` counter, and that counter is not author-resettable. Measured in
6397
- Chrome 148, `counter-reset: list-item 4` moves nothing on a `<div>`, on a
6398
- `<ul>`, or even on a real `<ol>`, while `<ol start="5">` does and a *named*
6399
- counter with explicit `::before` content does. So the markers would have to
6400
- be rebuilt out of generated content to gain a start, which is a different
6401
- component. `type` is only `list-style-type` and works. */
7192
+ `type` is only `list-style-type`. `start` and `reversed` move the count
7193
+ itself. */
6402
7194
  type?: (HelixHeadlessList["type"]) | undefined;
7195
+ /** The selected rows' values, separated by commas, in a list that selects.
7196
+
7197
+ Set it to start with rows selected. A row's value is its `value`, or its
7198
+ words where it has none. */
7199
+ value?: (HelixHeadlessList["value"]) | undefined;
6403
7200
  };
6404
7201
 
6405
- export type HelixHeadlessListVueEvents = {};
7202
+ export type HelixHeadlessListVueEvents = {
7203
+ /** Fired once a press has changed which rows are selected. */
7204
+ change: HelixHeadlessListElementEvent;
7205
+ /** Sent from a row when the reader acts on it: Enter, or a press in a list that selects nothing. Read the row from `target`. A row with `href` follows its link instead. */
7206
+ "helix-action": HelixHeadlessListHelixActionElementEvent;
7207
+ /** Fired before a press changes which rows are selected, with the `value` it would leave. Cancelable. */
7208
+ "helix-before-change": HelixHeadlessListHelixBeforeChangeElementEvent;
7209
+ };
6406
7210
 
6407
7211
  /** `HelixHeadlessListbox` component event */
6408
7212
  export type HelixHeadlessListboxElementEvent<E = Event> = TypedEvent<
@@ -6456,6 +7260,22 @@ filtering already does: `filter`, the empty state and the keyboard are all
6456
7260
  this component's. A select, a combobox and a command palette drawing their
6457
7261
  own search boxes would be three copies of one field. */
6458
7262
  filterable?: (HelixHeadlessListbox["filterable"]) | undefined;
7263
+ /** How long typing in the filter field rests before the list is filtered, in
7264
+ milliseconds. `0` filters on every keystroke.
7265
+
7266
+ For a list filtered on a server, where `helix-filter` starts a request: a
7267
+ reader typing a word sends one request for the word, not one for each
7268
+ letter. Enter and the arrow keys filter at once on what is typed, so they
7269
+ act on the list the reader expects. */
7270
+ "filter-delay"?: (HelixHeadlessListbox["filterDelay"] | `${number}`) | undefined;
7271
+ /** How long typing in the filter field rests before the list is filtered, in
7272
+ milliseconds. `0` filters on every keystroke.
7273
+
7274
+ For a list filtered on a server, where `helix-filter` starts a request: a
7275
+ reader typing a word sends one request for the word, not one for each
7276
+ letter. Enter and the arrow keys filter at once on what is typed, so they
7277
+ act on the list the reader expects. */
7278
+ filterDelay?: (HelixHeadlessListbox["filterDelay"]) | undefined;
6459
7279
  /** Placeholder text for the filter field. */
6460
7280
  "filter-label"?: (HelixHeadlessListbox["filterLabel"]) | undefined;
6461
7281
  /** Placeholder text for the filter field. */
@@ -6469,6 +7289,26 @@ a reader can move through the options before closing the panel on one. */
6469
7289
  manual?: (HelixHeadlessListbox["manual"]) | undefined;
6470
7290
  /** Whether more than one option can be chosen. */
6471
7291
  multiple?: (HelixHeadlessListbox["multiple"]) | undefined;
7292
+ /** What a screen reader hears when a filter leaves one option. `{count}` is
7293
+ the count. */
7294
+ "result-label"?: (HelixHeadlessListbox["resultLabel"]) | undefined;
7295
+ /** What a screen reader hears when a filter leaves one option. `{count}` is
7296
+ the count. */
7297
+ resultLabel?: (HelixHeadlessListbox["resultLabel"]) | undefined;
7298
+ /** What a screen reader hears when a filter leaves any other number of
7299
+ options. `{count}` is the count.
7300
+
7301
+ **Two sentences, chosen by `Intl.PluralRules`**, which is Data Table's
7302
+ pair: a language with more forms than two picks the one for its `one` and
7303
+ writes the rest here. */
7304
+ "results-label"?: (HelixHeadlessListbox["resultsLabel"]) | undefined;
7305
+ /** What a screen reader hears when a filter leaves any other number of
7306
+ options. `{count}` is the count.
7307
+
7308
+ **Two sentences, chosen by `Intl.PluralRules`**, which is Data Table's
7309
+ pair: a language with more forms than two picks the one for its `one` and
7310
+ writes the rest here. */
7311
+ resultsLabel?: (HelixHeadlessListbox["resultsLabel"]) | undefined;
6472
7312
  /** Whether the rows are still loading.
6473
7313
 
6474
7314
  Reflected, because a stylesheet needs it: the rows that are already there
@@ -6571,6 +7411,18 @@ export type HelixHeadlessListboxVueEvents = {
6571
7411
  };
6572
7412
 
6573
7413
  export type HelixHeadlessLoaderVueProps = {
7414
+ /** How long the loader waits before it shows, in milliseconds, so work that
7415
+ finishes quickly never flashes one.
7416
+
7417
+ Absent shows it at once. Hidden in the served markup too, so a page that
7418
+ loads quickly never draws it. */
7419
+ delay?: (HelixHeadlessLoader["delay"]) | undefined;
7420
+ /** The id of the region being loaded, which is marked `aria-busy` while the
7421
+ loader is on the page.
7422
+
7423
+ Names an element in the same tree. In React it arrives as a property, the
7424
+ way `Tooltip.for` does. */
7425
+ for?: (HelixHeadlessLoader["for"]) | undefined;
6574
7426
  /** The loader's name, announced by screen readers while the work is in
6575
7427
  progress. */
6576
7428
  label?: (HelixHeadlessLoader["label"]) | undefined;
@@ -6918,6 +7770,9 @@ export type HelixHeadlessMapHelixMapTiltElementEvent =
6918
7770
  /** `helix-map-zoom` event type */
6919
7771
  export type HelixHeadlessMapHelixMapZoomElementEvent =
6920
7772
  HelixHeadlessMapElementEvent<HelixMapZoomEvent>;
7773
+ /** `helix-toggle` event type */
7774
+ export type HelixHeadlessMapHelixToggleElementEvent =
7775
+ HelixHeadlessMapElementEvent<HelixToggleEvent>;
6921
7776
 
6922
7777
  export type HelixHeadlessMapVueProps = {
6923
7778
  /** The map's rotation, in degrees clockwise from north. `connectMap` keeps it
@@ -7222,6 +8077,8 @@ export type HelixHeadlessMapVueEvents = {
7222
8077
  "helix-map-tilt": HelixHeadlessMapHelixMapTiltElementEvent;
7223
8078
  /** A zoom button or key was pressed, with a direction. Zoom your map in response. */
7224
8079
  "helix-map-zoom": HelixHeadlessMapHelixMapZoomElementEvent;
8080
+ /** A layer's tile in the layers menu showed or hid it. Sent from the layer once its `hidden` attribute holds the choice, with `checked` true when it is shown. */
8081
+ "helix-toggle": HelixHeadlessMapHelixToggleElementEvent;
7225
8082
  };
7226
8083
 
7227
8084
  /** `HelixHeadlessMapRoute` component event */
@@ -7491,37 +8348,24 @@ So the anchor *is* the row, carrying `menuitem` and the `tabindex` the menu
7491
8348
  roves, which is the same maneuver `Tree.Item` makes and the reason `href`
7492
8349
  changes the markup rather than only adding an attribute.
7493
8350
 
7494
- **`Option` cannot have this and the reason is worth knowing**, since a
7495
- command palette is the obvious place to want it. A listbox has to keep
7496
- focus somewhere else, in the text field for a combobox, so it says which
7497
- option is current with `aria-activedescendant`. That reference can only
7498
- point at the option's host, measured: assigning
7499
- `ariaActiveDescendantElement` an element inside a sibling shadow root reads
7500
- back `null`. So `role="option"` is pinned to the host, and an anchor under
7501
- it hits the naming failure above. A menu has no such constraint because
7502
- focus really moves to the row. */
8351
+ **`Option` takes an `href` too, and keeps its role a different way.** A
8352
+ listbox keeps focus somewhere else, in the text field for a combobox, and
8353
+ names the current option with `aria-activedescendant`, which can only point
8354
+ at the option's host. So an option stays `role="option"` on its host, draws
8355
+ no anchor, and follows its link through an anchor made for the moment. A
8356
+ menu has no such constraint, because focus really moves to the row. */
7503
8357
  href?: (HelixHeadlessMenuItem["href"]) | undefined;
7504
8358
  /** The link's `rel`. Set it whenever you set `target="_blank"`. */
7505
8359
  rel?: (HelixHeadlessMenuItem["rel"]) | undefined;
8360
+ /** The row's keyboard shortcut as a chord, such as `mod+s`, shown after the
8361
+ label in the platform's glyphs and given to the row as
8362
+ `aria-keyshortcuts`. `mod` is Command on an Apple keyboard and Control
8363
+ elsewhere. Showing a shortcut does not bind it. */
8364
+ shortcut?: (HelixHeadlessMenuItem["shortcut"]) | undefined;
7506
8365
  /** Where the link opens, for rows that should open outside the current page. */
7507
8366
  target?: (HelixHeadlessMenuItem["target"]) | undefined;
7508
8367
  /** The row's value, sent in `helix-select` when the row is chosen. */
7509
8368
  value?: (HelixHeadlessMenuItem["value"]) | undefined;
7510
- /** Whether the row is on the menu page that is showing.
7511
-
7512
- Set by the menu, and a property rather than an attribute for that reason.
7513
- Public because the menu has to reach it, and not something a consumer
7514
- writes: which page is open is the menu's business. */
7515
- onPage?: (HelixHeadlessMenuItem["onPage"]) | undefined;
7516
- /** Whether the page showing is this row's submenu, or one below it.
7517
-
7518
- Separate from `onPage`, and it has to be. A row that opened a page is not
7519
- itself on that page, so both are false for it, and rendering nothing on
7520
- that basis takes its `slot[name="submenu"]` with it: the rows inside have
7521
- nowhere to be assigned and are never laid out. Every row on the way down to
7522
- the open page has to keep its slot, not only the one directly above it.
7523
- Three levels deep, the topmost row holds the slot the middle one lives in. */
7524
- showingSubmenu?: (HelixHeadlessMenuItem["showingSubmenu"]) | undefined;
7525
8369
  };
7526
8370
 
7527
8371
  export type HelixHeadlessMenuItemVueEvents = {
@@ -7554,6 +8398,9 @@ export type HelixHeadlessMenuVueProps = {
7554
8398
  "back-label"?: (HelixHeadlessMenu["backLabel"]) | undefined;
7555
8399
  /** The text of the row that returns from a submenu. */
7556
8400
  backLabel?: (HelixHeadlessMenu["backLabel"]) | undefined;
8401
+ /** Whether the menu is the trigger's context menu: it opens where the reader
8402
+ asks for one, with a right-click, a long press, Shift+F10 or the menu key. */
8403
+ context?: (HelixHeadlessMenu["context"]) | undefined;
7557
8404
  /** Accessible name for the surface.
7558
8405
 
7559
8406
  Empty by default, which names the surface by its trigger, so a menu opened
@@ -7610,6 +8457,14 @@ export type HelixHeadlessMenuVueEvents = {
7610
8457
  toggle: HelixHeadlessMenuToggleElementEvent;
7611
8458
  };
7612
8459
 
8460
+ export type HelixHeadlessMenuSectionVueProps = {
8461
+ /** The heading's words, when they are plain text. Content in the `heading`
8462
+ slot replaces it. */
8463
+ label?: (HelixHeadlessMenuSection["label"]) | undefined;
8464
+ };
8465
+
8466
+ export type HelixHeadlessMenuSectionVueEvents = {};
8467
+
7613
8468
  export type HelixHeadlessMeterVueProps = {
7614
8469
  /** Sets the band directly, for a rule that `low`, `high`, and `optimum` cannot
7615
8470
  express.
@@ -7643,7 +8498,10 @@ no reader. */
7643
8498
 
7644
8499
  Absent leaves the range unbanded. */
7645
8500
  high?: (HelixHeadlessMeter["high"]) | undefined;
7646
- /** Accessible name for the reading. */
8501
+ /** Accessible name for the reading.
8502
+
8503
+ A visible label in the `label` slot names it instead, with the words it
8504
+ shows, so the name and the label cannot disagree. */
7647
8505
  label?: (HelixHeadlessMeter["label"]) | undefined;
7648
8506
  /** The locale the percentage is written in, such as `fr` for `72 %`.
7649
8507
 
@@ -7713,6 +8571,11 @@ fair summary of a task and a poor one of a quantity. */
7713
8571
  export type HelixHeadlessMeterVueEvents = {};
7714
8572
 
7715
8573
  export type HelixHeadlessNavigationVueProps = {
8574
+ /** Whether the arrow keys move focus between the destinations.
8575
+
8576
+ Off by default, so a page whose readers scroll with the arrow keys while
8577
+ a link has focus keeps doing so. */
8578
+ arrows?: (HelixHeadlessNavigation["arrows"]) | undefined;
7716
8579
  /** The landmark's name, read by screen readers.
7717
8580
 
7718
8581
  An `aria-label` or `aria-labelledby` on the host names the landmark too,
@@ -7874,6 +8737,9 @@ export type HelixHeadlessNotificationsElementEvent<E = Event> = TypedEvent<
7874
8737
  /** `helix-dismiss` event type */
7875
8738
  export type HelixHeadlessNotificationsHelixDismissElementEvent =
7876
8739
  HelixHeadlessNotificationsElementEvent<HelixDismissEvent>;
8740
+ /** `helix-load-more` event type */
8741
+ export type HelixHeadlessNotificationsHelixLoadMoreElementEvent =
8742
+ HelixHeadlessNotificationsElementEvent<HelixLoadMoreEvent>;
7877
8743
  /** `helix-read` event type */
7878
8744
  export type HelixHeadlessNotificationsHelixReadElementEvent =
7879
8745
  HelixHeadlessNotificationsElementEvent<HelixReadEvent>;
@@ -7881,6 +8747,16 @@ export type HelixHeadlessNotificationsHelixReadElementEvent =
7881
8747
  export type HelixHeadlessNotificationsVueProps = {
7882
8748
  /** The feed's name, read by screen readers. */
7883
8749
  label?: (HelixHeadlessNotifications["label"]) | undefined;
8750
+ /** Whether to draw a button after the list that asks for the next page, by
8751
+ sending `helix-load-more`. Take it off once there is nothing more. */
8752
+ "load-more"?: (HelixHeadlessNotifications["loadMore"]) | undefined;
8753
+ /** Whether to draw a button after the list that asks for the next page, by
8754
+ sending `helix-load-more`. Take it off once there is nothing more. */
8755
+ loadMore?: (HelixHeadlessNotifications["loadMore"]) | undefined;
8756
+ /** The text of the `load-more` button. */
8757
+ "load-more-label"?: (HelixHeadlessNotifications["loadMoreLabel"]) | undefined;
8758
+ /** The text of the `load-more` button. */
8759
+ loadMoreLabel?: (HelixHeadlessNotifications["loadMoreLabel"]) | undefined;
7884
8760
  /** Whether to draw a control that marks everything read. */
7885
8761
  "mark-all"?: (HelixHeadlessNotifications["markAll"]) | undefined;
7886
8762
  /** Whether to draw a control that marks everything read. */
@@ -7889,6 +8765,12 @@ export type HelixHeadlessNotificationsVueProps = {
7889
8765
  "mark-all-label"?: (HelixHeadlessNotifications["markAllLabel"]) | undefined;
7890
8766
  /** Label for the mark-all control. */
7891
8767
  markAllLabel?: (HelixHeadlessNotifications["markAllLabel"]) | undefined;
8768
+ /** How many notifications there are in all, where the feed holds only some of
8769
+ them, read as each row's `aria-setsize`. `-1` says the count is unknown.
8770
+
8771
+ Unset, the browser counts the rows it can see, which is right for a feed
8772
+ that holds everything. */
8773
+ total?: (HelixHeadlessNotifications["total"]) | undefined;
7892
8774
  /** The text shown and announced when there are no rows and none are loading. */
7893
8775
  "empty-text"?: (HelixHeadlessNotifications["emptyText"]) | undefined;
7894
8776
  /** The text shown and announced when there are no rows and none are loading. */
@@ -7908,6 +8790,8 @@ say that without the component knowing what a row looks like. */
7908
8790
  export type HelixHeadlessNotificationsVueEvents = {
7909
8791
  /** Fired when the user dismisses a row. The row dispatches it, and you can listen for it on the feed. Cancelable: cancel it to keep the row. */
7910
8792
  "helix-dismiss": HelixHeadlessNotificationsHelixDismissElementEvent;
8793
+ /** Fired when a reader presses the `load-more` button, asking for the next page of the feed. */
8794
+ "helix-load-more": HelixHeadlessNotificationsHelixLoadMoreElementEvent;
7911
8795
  /** Fired by an item when it is marked read or unread, and by the feed when everything is marked read. Cancelable. */
7912
8796
  "helix-read": HelixHeadlessNotificationsHelixReadElementEvent;
7913
8797
  };
@@ -7949,6 +8833,22 @@ reach the bubble. Absent is the control's own sentence, in English. */
7949
8833
  "decrement-label"?: (HelixHeadlessNumberInput["decrementLabel"]) | undefined;
7950
8834
  /** The name of the step down button, read by screen readers. */
7951
8835
  decrementLabel?: (HelixHeadlessNumberInput["decrementLabel"]) | undefined;
8836
+ /** `Intl.NumberFormat` options the number is shown with while the field is
8837
+ not being edited: a currency, a percent, a unit, or a number of decimals.
8838
+ Written as JSON in the attribute.
8839
+
8840
+ ```html
8841
+ <helix-number-input format-options='{"style":"currency","currency":"EUR"}'></helix-number-input>
8842
+ ``` */
8843
+ "format-options"?: (HelixHeadlessNumberInput["formatOptions"]) | undefined;
8844
+ /** `Intl.NumberFormat` options the number is shown with while the field is
8845
+ not being edited: a currency, a percent, a unit, or a number of decimals.
8846
+ Written as JSON in the attribute.
8847
+
8848
+ ```html
8849
+ <helix-number-input format-options='{"style":"currency","currency":"EUR"}'></helix-number-input>
8850
+ ``` */
8851
+ formatOptions?: (HelixHeadlessNumberInput["formatOptions"]) | undefined;
7952
8852
  /** The name of the step up button, read by screen readers. */
7953
8853
  "increment-label"?: (HelixHeadlessNumberInput["incrementLabel"]) | undefined;
7954
8854
  /** The name of the step up button, read by screen readers. */
@@ -8000,6 +8900,12 @@ filled in. */
8000
8900
  readonly?: (HelixHeadlessNumberInput["readOnly"]) | undefined;
8001
8901
  /** Prevents editing. The value is still submitted with the form. */
8002
8902
  readOnly?: (HelixHeadlessNumberInput["readOnly"]) | undefined;
8903
+ /** What the field is described as on iOS and iPadOS, where it carries no
8904
+ spinbutton role. See the class description. */
8905
+ "role-description"?: (HelixHeadlessNumberInput["roleDescription"]) | undefined;
8906
+ /** What the field is described as on iOS and iPadOS, where it carries no
8907
+ spinbutton role. See the class description. */
8908
+ roleDescription?: (HelixHeadlessNumberInput["roleDescription"]) | undefined;
8003
8909
  /** Makes the label a grip that changes the value when it is dragged.
8004
8910
 
8005
8911
  The label is what is dragged, so this adds no chrome at all. Still opt-in,
@@ -8032,6 +8938,10 @@ A unit slotted into `end` is drawn beside the number and is not part of
8032
8938
  what the spinbutton announces, so it goes here too. Empty announces the
8033
8939
  number alone. */
8034
8940
  valueText?: (HelixHeadlessNumberInput["valueText"]) | undefined;
8941
+ /** Whether the mouse wheel steps the number while the field has focus, as
8942
+ React Aria's NumberField does unless told not to. Off, the wheel scrolls
8943
+ the page, which is what a reader passing over a form expects. */
8944
+ wheel?: (HelixHeadlessNumberInput["wheel"]) | undefined;
8035
8945
  /** The value the control starts with. A form reset returns it to this value. */
8036
8946
  "default-value"?: (HelixHeadlessNumberInput["defaultValue"]) | undefined;
8037
8947
  /** The value the control starts with. A form reset returns it to this value. */
@@ -8121,11 +9031,31 @@ export type HelixHeadlessObjectInspectorElementEvent<E = Event> = TypedEvent<
8121
9031
  HelixHeadlessObjectInspector,
8122
9032
  E
8123
9033
  >;
9034
+ /** `helix-activate` event type */
9035
+ export type HelixHeadlessObjectInspectorHelixActivateElementEvent =
9036
+ HelixHeadlessObjectInspectorElementEvent<HelixActivateEvent>;
9037
+ /** `helix-before-activate` event type */
9038
+ export type HelixHeadlessObjectInspectorHelixBeforeActivateElementEvent =
9039
+ HelixHeadlessObjectInspectorElementEvent<HelixBeforeActivateEvent>;
8124
9040
  /** `helix-copy` event type */
8125
9041
  export type HelixHeadlessObjectInspectorHelixCopyElementEvent =
8126
9042
  HelixHeadlessObjectInspectorElementEvent<HelixCopyEvent>;
9043
+ /** `helix-filter` event type */
9044
+ export type HelixHeadlessObjectInspectorHelixFilterElementEvent =
9045
+ HelixHeadlessObjectInspectorElementEvent<HelixFilterEvent>;
9046
+ /** `helix-filtered` event type */
9047
+ export type HelixHeadlessObjectInspectorHelixFilteredElementEvent =
9048
+ HelixHeadlessObjectInspectorElementEvent<HelixFilteredEvent>;
8127
9049
 
8128
9050
  export type HelixHeadlessObjectInspectorVueProps = {
9051
+ /** The active row's path, such as `/meta/tags/0`, and the empty string for the
9052
+ root.
9053
+
9054
+ Reading gives the row the keys are on. Writing moves there, opening the
9055
+ branches around it, and sends no event, the way a script's write to any
9056
+ current value sends none. A path the value does not hold moves to the
9057
+ nearest branch above it that it does. */
9058
+ active?: (HelixHeadlessObjectInspector["active"]) | undefined;
8129
9059
  /** The copy button's accessible name on a row with a key, with the key filled
8130
9060
  in as `{name}`.
8131
9061
 
@@ -8156,6 +9086,15 @@ reader sees the shape of the value before its contents. `0` starts with the
8156
9086
  root closed; a large number opens everything, which on a big value is the
8157
9087
  wall of text this exists to avoid. */
8158
9088
  defaultDepth?: (HelixHeadlessObjectInspector["defaultDepth"]) | undefined;
9089
+ /** Text the tree is narrowed to: the entries whose key or value holds it,
9090
+ ignoring case, and the branches that lead to them. Empty shows everything. */
9091
+ filter?: (HelixHeadlessObjectInspector["filter"]) | undefined;
9092
+ /** Whether to show a field that sets `filter`. */
9093
+ filterable?: (HelixHeadlessObjectInspector["filterable"]) | undefined;
9094
+ /** The filter field's placeholder and accessible name. */
9095
+ "filter-label"?: (HelixHeadlessObjectInspector["filterLabel"]) | undefined;
9096
+ /** The filter field's placeholder and accessible name. */
9097
+ filterLabel?: (HelixHeadlessObjectInspector["filterLabel"]) | undefined;
8159
9098
  /** The id of a `<script type="application/json">` holding the value.
8160
9099
 
8161
9100
  Read once the document exists, and again whenever this changes. Text that
@@ -8204,6 +9143,16 @@ who set the property. This button is positioned out of the flow and takes no
8204
9143
  room, so nothing selects on it, and reflection exists so that a selector can
8205
9144
  reach a value. */
8206
9145
  noCopy?: (HelixHeadlessObjectInspector["noCopy"]) | undefined;
9146
+ /** What a screen reader hears when a filter matches one entry. `{count}` is the count. */
9147
+ "result-label"?: (HelixHeadlessObjectInspector["resultLabel"]) | undefined;
9148
+ /** What a screen reader hears when a filter matches one entry. `{count}` is the count. */
9149
+ resultLabel?: (HelixHeadlessObjectInspector["resultLabel"]) | undefined;
9150
+ /** What a screen reader hears when a filter matches any other number of
9151
+ entries. `{count}` is the count. The two are chosen by `Intl.PluralRules`. */
9152
+ "results-label"?: (HelixHeadlessObjectInspector["resultsLabel"]) | undefined;
9153
+ /** What a screen reader hears when a filter matches any other number of
9154
+ entries. `{count}` is the count. The two are chosen by `Intl.PluralRules`. */
9155
+ resultsLabel?: (HelixHeadlessObjectInspector["resultsLabel"]) | undefined;
8207
9156
  /** The tree's accessible name when `label` is empty and the host names it
8208
9157
  with neither `aria-label` nor `aria-labelledby`. */
8209
9158
  "tree-label"?: (HelixHeadlessObjectInspector["treeLabel"]) | undefined;
@@ -8215,6 +9164,11 @@ with neither `aria-label` nor `aria-labelledby`. */
8215
9164
  For a value of thousands of entries. Reflected, because the box it scrolls
8216
9165
  needs a height, which is a stylesheet rule reading this attribute. */
8217
9166
  windowed?: (HelixHeadlessObjectInspector["windowed"]) | undefined;
9167
+ /** The open branches, by path, in no set order.
9168
+
9169
+ Writing opens exactly these and closes every other, keeping the active row
9170
+ where it stays visible. A property, never an attribute. */
9171
+ expanded?: (HelixHeadlessObjectInspector["expanded"]) | undefined;
8218
9172
  /** The value to show, when your code already holds it as an object.
8219
9173
 
8220
9174
  Takes precedence over `for`. Anything JSON can say is drawn; anything else
@@ -8223,8 +9177,16 @@ is shown as its string. */
8223
9177
  };
8224
9178
 
8225
9179
  export type HelixHeadlessObjectInspectorVueEvents = {
9180
+ /** The active row moved, by a key or a click. The detail's `value` is its path. */
9181
+ "helix-activate": HelixHeadlessObjectInspectorHelixActivateElementEvent;
9182
+ /** The active row is about to move, with its new path. Cancelable: cancel it to keep the row where it is. */
9183
+ "helix-before-activate": HelixHeadlessObjectInspectorHelixBeforeActivateElementEvent;
8226
9184
  /** A value was put on the clipboard, from the copy button or the keyboard. */
8227
9185
  "helix-copy": HelixHeadlessObjectInspectorHelixCopyElementEvent;
9186
+ /** Text was typed in the filter field, with what it now holds. Cancelable: cancel it to keep the filter as it was. */
9187
+ "helix-filter": HelixHeadlessObjectInspectorHelixFilterElementEvent;
9188
+ /** The filter field changed `filter`, which now holds the text. */
9189
+ "helix-filtered": HelixHeadlessObjectInspectorHelixFilteredElementEvent;
8228
9190
  };
8229
9191
 
8230
9192
  export type HelixHeadlessOptionGroupVueProps = {
@@ -8310,6 +9272,24 @@ string is not a fact a selector needs. */
8310
9272
  description?: (HelixHeadlessOption["description"]) | undefined;
8311
9273
  /** Prevents the option from being chosen. */
8312
9274
  disabled?: (HelixHeadlessOption["disabled"]) | undefined;
9275
+ /** Whether following the link downloads what it names. Only meaningful
9276
+ beside an `href`. */
9277
+ download?: (HelixHeadlessOption["download"]) | undefined;
9278
+ /** The URL the option links to. Setting it makes the option a link: choosing
9279
+ it, with a press, Enter or a click, follows the link and selects nothing,
9280
+ as React Aria's items with `href` do. Command, Control and Shift open it
9281
+ where they open a link, in a new tab or a new window.
9282
+
9283
+ `helix-select` is said first with the `href` in it, and canceling it keeps
9284
+ the browser from following, so a client-side router follows it instead.
9285
+
9286
+ **The option stays an option**, and an anchor is never drawn inside it:
9287
+ `role="option"` sits on the host, where a listbox's
9288
+ `aria-activedescendant` can name it, and an `<a>` inside would be exposed
9289
+ as a link within the option and take its name (Menu Item's `href` records
9290
+ the measurement). The link is followed through an anchor made for the
9291
+ moment, which `followLink` describes. */
9292
+ href?: (HelixHeadlessOption["href"]) | undefined;
8313
9293
  /** A shorter name for this choice, for where the row does not fit.
8314
9294
 
8315
9295
  `<option label>`'s own meaning: the text a chooser shows when it has less
@@ -8321,10 +9301,30 @@ simply the accessible name.
8321
9301
  `<option label>` does: written the platform's way, a select listed a row of
8322
9302
  nothing for every choice. */
8323
9303
  label?: (HelixHeadlessOption["label"]) | undefined;
9304
+ /** The link's `rel`. Set it whenever you set `target="_blank"`. */
9305
+ rel?: (HelixHeadlessOption["rel"]) | undefined;
8324
9306
  /** Whether this choice is currently chosen.
8325
9307
 
8326
9308
  Written by the listbox. */
8327
9309
  selected?: (HelixHeadlessOption["selected"]) | undefined;
9310
+ /** Where the link opens, such as `_blank`, for an option with an `href`. */
9311
+ target?: (HelixHeadlessOption["target"]) | undefined;
9312
+ /** The words a reader types to reach this choice, where the row's own words
9313
+ are not them: typeahead, a filter and a combobox match against it, and a
9314
+ select's trigger shows it.
9315
+
9316
+ For a row whose content is a picture, an avatar beside a name and a role,
9317
+ or a name written in another script, as React Aria's `textValue`. Empty
9318
+ reads the row's words, then `label`. */
9319
+ "text-value"?: (HelixHeadlessOption["textValue"]) | undefined;
9320
+ /** The words a reader types to reach this choice, where the row's own words
9321
+ are not them: typeahead, a filter and a combobox match against it, and a
9322
+ select's trigger shows it.
9323
+
9324
+ For a row whose content is a picture, an avatar beside a name and a role,
9325
+ or a name written in another script, as React Aria's `textValue`. Empty
9326
+ reads the row's words, then `label`. */
9327
+ textValue?: (HelixHeadlessOption["textValue"]) | undefined;
8328
9328
  /** The value that identifies the option, and that a form submits. */
8329
9329
  value?: (HelixHeadlessOption["value"]) | undefined;
8330
9330
  /** Whether the markup declares this option selected. A form reset returns to it.
@@ -8356,7 +9356,7 @@ change of its own rather than a property being added. */
8356
9356
  };
8357
9357
 
8358
9358
  export type HelixHeadlessOptionVueEvents = {
8359
- /** The option was chosen. Cancelable: canceling it leaves the selection as it was. */
9359
+ /** The option was chosen. Cancelable: canceling it leaves the selection as it was, and keeps the browser from following an option's `href`. */
8360
9360
  "helix-select": HelixHeadlessOptionHelixSelectElementEvent;
8361
9361
  };
8362
9362
 
@@ -8390,7 +9390,8 @@ read at the click rather than cached, because a reader can change it while
8390
9390
  the page is open and this is the only motion in the component that
8391
9391
  JavaScript rather than CSS decides. */
8392
9392
  behavior?: (HelixHeadlessOutline["behavior"]) | undefined;
8393
- /** The navigation's name, read by screen readers. */
9393
+ /** The navigation's name, read by screen readers. A heading in the `heading`
9394
+ slot names it in place of this. */
8394
9395
  label?: (HelixHeadlessOutline["label"]) | undefined;
8395
9396
  /** How far below the top of the scroll container a heading counts as reached,
8396
9397
  in pixels. The scroll container is the window or the panel the sections
@@ -8600,6 +9601,32 @@ Reading gives the real one; writing declares it the consumer's, and
8600
9601
  `default-value` seeds one this element owns. Same accessor pair as
8601
9602
  `Pagination.page` and the calendar's `month`. */
8602
9603
  value?: (HelixHeadlessPaginationSize["value"]) | undefined;
9604
+ /** Whether the control is disabled and cannot be used.
9605
+
9606
+ Reflected, because the styled tier selects on it, and mirrored to
9607
+ `aria-disabled` rather than removing the element from the accessibility
9608
+ tree, so a screen reader can still announce that the control exists.
9609
+
9610
+ The mirror itself is in `willUpdate` below, here rather than in each
9611
+ control, because here is where `disabled` is. */
9612
+ disabled?: (HelixHeadlessPaginationSize["disabled"]) | undefined;
9613
+ /** The name the control's value is submitted under.
9614
+
9615
+ **Reflected, and it is the exception to "reflect only what CSS selects
9616
+ on".** The platform builds a form's entry list from the `name` *content
9617
+ attribute*, not from the property, so a control named through the property
9618
+ submitted under no name at all and was silently dropped. Measured: two
9619
+ inputs in one form, one named by attribute and one by property, and the
9620
+ form carried a single entry.
9621
+
9622
+ Safe for a React consumer, which is what the rule is protecting: React
9623
+ renders a custom element's props as attributes on the server, so the name
9624
+ is already in the markup being hydrated and reflecting it writes what is
9625
+ there. It is only a change to the markup when a consumer assigns it
9626
+ imperatively later, and nothing is hydrating by then.
9627
+
9628
+ Here rather than on each control. */
9629
+ name?: (HelixHeadlessPaginationSize["name"]) | undefined;
8603
9630
  };
8604
9631
 
8605
9632
  export type HelixHeadlessPaginationSizeVueEvents = {
@@ -8663,10 +9690,18 @@ that lets a phone offer the code out of a message. Later cells stay `off`
8663
9690
  for the reason in the class comment above, that six cells each offering
8664
9691
  the same code is one offer made six times. */
8665
9692
  autocomplete?: (HelixHeadlessPinInput["autocomplete"]) | undefined;
9693
+ /** Whether the form is submitted once the last box is filled, as Web
9694
+ Awesome's `autosubmit` and Radix's `autoSubmit`. Only for a code the field
9695
+ took: a refused last character submits nothing. */
9696
+ autosubmit?: (HelixHeadlessPinInput["autosubmit"]) | undefined;
8666
9697
  /** Accessible name for one box, with `{index}` and `{length}` filled in. */
8667
9698
  "cell-label"?: (HelixHeadlessPinInput["cellLabel"]) | undefined;
8668
9699
  /** Accessible name for one box, with `{index}` and `{length}` filled in. */
8669
9700
  cellLabel?: (HelixHeadlessPinInput["cellLabel"]) | undefined;
9701
+ /** Separators drawn between the boxes: `#` or `*` for a box and anything
9702
+ else as it is written, so `###-###` draws a dash after the third. The
9703
+ separators are hidden from screen readers and are not part of the value. */
9704
+ format?: (HelixHeadlessPinInput["format"]) | undefined;
8670
9705
  /** How many characters the code has. */
8671
9706
  length?: (HelixHeadlessPinInput["length"]) | undefined;
8672
9707
  /** Whether the characters are hidden, the way a password is. */
@@ -8808,8 +9843,17 @@ export type HelixHeadlessPopoverToggleElementEvent =
8808
9843
  HelixHeadlessPopoverElementEvent<ToggleEvent>;
8809
9844
 
8810
9845
  export type HelixHeadlessPopoverVueProps = {
8811
- /** The panel's name, read by screen readers. */
9846
+ /** Draws a point on the panel's edge facing the trigger.
9847
+
9848
+ Off by default, which is the house style: a panel that opens from its
9849
+ trigger already reads as belonging to it. */
9850
+ arrow?: (HelixHeadlessPopover["arrow"]) | undefined;
9851
+ /** The panel's name, read by screen readers. Left at `Popover`, the first
9852
+ heading in the panel names it instead. */
8812
9853
  label?: (HelixHeadlessPopover["label"]) | undefined;
9854
+ /** Keeps `Tab` inside the panel while it is open, and marks the panel
9855
+ `aria-modal`. A press outside and Escape still close it. */
9856
+ modal?: (HelixHeadlessPopover["modal"]) | undefined;
8813
9857
  /** Space between the trigger and the panel, in pixels. */
8814
9858
  offset?: (HelixHeadlessPopover["offset"]) | undefined;
8815
9859
  /** Preferred side.
@@ -8858,7 +9902,10 @@ Not `Loader`, which is the other thing this could be. A loader says the
8858
9902
  page is busy; a bar says a named piece of work is running, and keeps its
8859
9903
  place in the layout when the answer arrives and it becomes determinate. */
8860
9904
  indeterminate?: (HelixHeadlessProgress["indeterminate"]) | undefined;
8861
- /** Accessible name for what is in progress. */
9905
+ /** Accessible name for what is in progress.
9906
+
9907
+ A visible label in the `label` slot names it instead, with the words it
9908
+ shows, so the name and the label cannot disagree. */
8862
9909
  label?: (HelixHeadlessProgress["label"]) | undefined;
8863
9910
  /** The locale the percentage is written in, such as `fr` for `72 %`.
8864
9911
 
@@ -9003,6 +10050,22 @@ not touch, and React reads that as a hydration mismatch. The absent
9003
10050
  attribute *is* the column, which the stylesheet reads as the base rule, so
9004
10051
  only `horizontal` has to be named. */
9005
10052
  orientation?: (HelixHeadlessRadioGroup["orientation"]) | undefined;
10053
+ /** Whether a reader can see and focus the answer and cannot change it. A
10054
+ read-only group still submits its value.
10055
+
10056
+ React Aria's `isReadOnly`. A press on a radio is refused. The arrow keys,
10057
+ Home and End move focus between the radios and choose nothing, so a reader
10058
+ can hear every choice, and Tab still reaches the answer. The group says
10059
+ `aria-readonly`. A script can still set `value`. */
10060
+ readonly?: (HelixHeadlessRadioGroup["readOnly"]) | undefined;
10061
+ /** Whether a reader can see and focus the answer and cannot change it. A
10062
+ read-only group still submits its value.
10063
+
10064
+ React Aria's `isReadOnly`. A press on a radio is refused. The arrow keys,
10065
+ Home and End move focus between the radios and choose nothing, so a reader
10066
+ can hear every choice, and Tab still reaches the answer. The group says
10067
+ `aria-readonly`. A script can still set `value`. */
10068
+ readOnly?: (HelixHeadlessRadioGroup["readOnly"]) | undefined;
9006
10069
  /** The value the control starts with. A form reset returns it to this value. */
9007
10070
  "default-value"?: (HelixHeadlessRadioGroup["defaultValue"]) | undefined;
9008
10071
  /** The value the control starts with. A form reset returns it to this value. */
@@ -9173,8 +10236,15 @@ export type HelixHeadlessRatingElementEvent<E = Event> = TypedEvent<
9173
10236
  /** `helix-before-change` event type */
9174
10237
  export type HelixHeadlessRatingHelixBeforeChangeElementEvent =
9175
10238
  HelixHeadlessRatingElementEvent<HelixBeforeChangeEvent>;
10239
+ /** `helix-clear` event type */
10240
+ export type HelixHeadlessRatingHelixClearElementEvent =
10241
+ HelixHeadlessRatingElementEvent<HelixClearEvent>;
9176
10242
 
9177
10243
  export type HelixHeadlessRatingVueProps = {
10244
+ /** Whether a reader can take the rating back to unrated: by pressing the
10245
+ chosen score again, or with Backspace or Delete. Zag's rating group
10246
+ clears the same way. */
10247
+ clearable?: (HelixHeadlessRating["clearable"]) | undefined;
9178
10248
  /** How many marks there are. */
9179
10249
  max?: (HelixHeadlessRating["max"]) | undefined;
9180
10250
  /** The lowest score that can be given. A cleared rating shows this score.
@@ -9361,6 +10431,8 @@ export type HelixHeadlessRatingVueEvents = {
9361
10431
  change: HelixHeadlessRatingElementEvent;
9362
10432
  /** The score is about to change. Cancelable: cancel it to keep the current score. */
9363
10433
  "helix-before-change": HelixHeadlessRatingHelixBeforeChangeElementEvent;
10434
+ /** The rating went back to unrated, under `clearable`. Sent after `input` and `change`. */
10435
+ "helix-clear": HelixHeadlessRatingHelixClearElementEvent;
9364
10436
  /** The score changed. */
9365
10437
  input: HelixHeadlessRatingElementEvent;
9366
10438
  };
@@ -9405,14 +10477,44 @@ writes them, whatever this says. */
9405
10477
 
9406
10478
  export type HelixHeadlessScatterChartVueEvents = {};
9407
10479
 
10480
+ /** `HelixHeadlessScrollArea` component event */
10481
+ export type HelixHeadlessScrollAreaElementEvent<E = Event> = TypedEvent<
10482
+ HelixHeadlessScrollArea,
10483
+ E
10484
+ >;
10485
+
9408
10486
  export type HelixHeadlessScrollAreaVueProps = {
10487
+ /** How long the scrollbars stay after the content stops moving, or the pointer
10488
+ leaves, in milliseconds. Read under `scrollbars="scroll"` and
10489
+ `scrollbars="hover"`. */
10490
+ "hide-delay"?: (HelixHeadlessScrollArea["hideDelay"] | `${number}`) | undefined;
10491
+ /** How long the scrollbars stay after the content stops moving, or the pointer
10492
+ leaves, in milliseconds. Read under `scrollbars="scroll"` and
10493
+ `scrollbars="hover"`. */
10494
+ hideDelay?: (HelixHeadlessScrollArea["hideDelay"]) | undefined;
9409
10495
  /** The region's name, read by screen readers.
9410
10496
 
9411
10497
  Without one there is no region: see the note on the class. */
9412
10498
  label?: (HelixHeadlessScrollArea["label"]) | undefined;
10499
+ /** Draws scrollbars of the component's own in place of the browser's, and
10500
+ says when they show.
10501
+
10502
+ - `auto`: on each axis that has content past it.
10503
+ - `always`: on each axis that can scroll, whether or not it has anything to
10504
+ scroll, so the scrollbar is there before the content grows.
10505
+ - `scroll`: while the content is moving, and for `hide-delay` after.
10506
+ - `hover`: as `scroll`, and while the pointer is over the scroll area.
10507
+
10508
+ Absent keeps the browser's scrollbars. */
10509
+ scrollbars?: (HelixHeadlessScrollArea["scrollbars"]) | undefined;
9413
10510
  };
9414
10511
 
9415
- export type HelixHeadlessScrollAreaVueEvents = {};
10512
+ export type HelixHeadlessScrollAreaVueEvents = {
10513
+ /** The content scrolled. Sent from the host, because the viewport's own does not leave the shadow root. Does not bubble. */
10514
+ scroll: HelixHeadlessScrollAreaElementEvent;
10515
+ /** The content stopped scrolling. Sent from the host, as `scroll` is. Does not bubble. */
10516
+ scrollend: HelixHeadlessScrollAreaElementEvent;
10517
+ };
9416
10518
 
9417
10519
  /** `HelixHeadlessSelect` component event */
9418
10520
  export type HelixHeadlessSelectElementEvent<E = Event> = TypedEvent<
@@ -9543,6 +10645,15 @@ imperatively later, and nothing is hydrating by then.
9543
10645
 
9544
10646
  Here rather than on each control. */
9545
10647
  name?: (HelixHeadlessSelect["name"]) | undefined;
10648
+ /** What the trigger shows for the chosen options: a function given them, in
10649
+ the order they appear, that returns text, an element or a Lit template.
10650
+
10651
+ For a trigger that shows more than the words, an avatar beside a name or a
10652
+ count of a long set, as React Aria's `SelectValue` takes children. The
10653
+ trigger is named by what this draws, so keep the words in it. Nothing
10654
+ chosen still shows `placeholder`. A property only, there being no way to
10655
+ write a function in markup. */
10656
+ valueContent?: (HelixHeadlessSelect["valueContent"]) | undefined;
9546
10657
  /** Which option is chosen, as an index, or `-1` where none is.
9547
10658
 
9548
10659
  Read off the listbox this renders, which owns the options and is where the
@@ -9575,6 +10686,12 @@ profile".
9575
10686
 
9576
10687
  Absent hides the placeholder from screen readers. */
9577
10688
  label?: (HelixHeadlessSkeleton["label"]) | undefined;
10689
+ /** Whether the content inside is still loading, which keeps it inert and
10690
+ draws the placeholder over it.
10691
+
10692
+ Absent shows the content. An empty skeleton is a placeholder whatever
10693
+ this says. Reflected, because the styled tier hides the content on it. */
10694
+ loading?: (HelixHeadlessSkeleton["loading"]) | undefined;
9578
10695
  };
9579
10696
 
9580
10697
  export type HelixHeadlessSkeletonVueEvents = {};
@@ -9606,6 +10723,25 @@ export type HelixHeadlessSliderHelixBeforeChangeElementEvent =
9606
10723
  HelixHeadlessSliderElementEvent<HelixBeforeChangeEvent>;
9607
10724
 
9608
10725
  export type HelixHeadlessSliderVueProps = {
10726
+ /** `Intl.NumberFormat` options the value is written with: a currency, a
10727
+ percent, a unit, or a number of decimals. Written as JSON in the
10728
+ attribute.
10729
+
10730
+ ```html
10731
+ <helix-slider format-options='{"style":"currency","currency":"USD"}'></helix-slider>
10732
+ ``` */
10733
+ "format-options"?: (HelixHeadlessSlider["formatOptions"]) | undefined;
10734
+ /** `Intl.NumberFormat` options the value is written with: a currency, a
10735
+ percent, a unit, or a number of decimals. Written as JSON in the
10736
+ attribute.
10737
+
10738
+ ```html
10739
+ <helix-slider format-options='{"style":"currency","currency":"USD"}'></helix-slider>
10740
+ ``` */
10741
+ formatOptions?: (HelixHeadlessSlider["formatOptions"]) | undefined;
10742
+ /** The locale `format-options` writes the value in, such as `de-DE`. Empty is
10743
+ the reader's own. */
10744
+ locale?: (HelixHeadlessSlider["locale"]) | undefined;
9609
10745
  /** Shows the value at each mark. */
9610
10746
  "marker-labels"?: (HelixHeadlessSlider["markerLabels"]) | undefined;
9611
10747
  /** Shows the value at each mark. */
@@ -9648,6 +10784,12 @@ property, like every other word a control speaks. */
9648
10784
  "minimum-label"?: (HelixHeadlessSlider["minimumLabel"]) | undefined;
9649
10785
  /** The name of a range's lower thumb, read after the slider's label. */
9650
10786
  minimumLabel?: (HelixHeadlessSlider["minimumLabel"]) | undefined;
10787
+ /** How many steps a range's two thumbs stay apart, as Zag's
10788
+ `minStepsBetweenThumbs`. A thumb pushed closer stops there. */
10789
+ "min-steps-between-thumbs"?: (HelixHeadlessSlider["minStepsBetweenThumbs"] | `${number}`) | undefined;
10790
+ /** How many steps a range's two thumbs stay apart, as Zag's
10791
+ `minStepsBetweenThumbs`. A thumb pushed closer stops there. */
10792
+ minStepsBetweenThumbs?: (HelixHeadlessSlider["minStepsBetweenThumbs"]) | undefined;
9651
10793
  /** The direction the track runs. `vertical` stands it on end.
9652
10794
 
9653
10795
  For a level rather than a quantity: a fader, a channel, anything a reader
@@ -9744,6 +10886,10 @@ imperatively later, and nothing is hydrating by then.
9744
10886
 
9745
10887
  Here rather than on each control. */
9746
10888
  name?: (HelixHeadlessSlider["name"]) | undefined;
10889
+ /** Writes a value as text, in place of `format-options`: words for a scale,
10890
+ or anything `Intl.NumberFormat` cannot say. A property, since a function
10891
+ cannot be written in an attribute. */
10892
+ formatter?: (HelixHeadlessSlider["formatter"]) | undefined;
9747
10893
  };
9748
10894
 
9749
10895
  export type HelixHeadlessSliderVueEvents = {
@@ -10045,6 +11191,15 @@ Reading gives where it is; writing declares it the consumer's, and
10045
11191
  `default-position` seeds one this element owns. The same accessor pair
10046
11192
  `Pagination.page` and the calendar's `month` carry. */
10047
11193
  position?: (HelixHeadlessSplitter["position"]) | undefined;
11194
+ /** Where a dragged divider snaps, comma separated, as Web Awesome's split
11195
+ panel does: a bare number is a percentage and a length such as `240px` is
11196
+ measured along the splitter, so `snap="25, 50, 75"` or `snap="240px, 50"`.
11197
+ The arrow keys move by `step` and do not snap. */
11198
+ snap?: (HelixHeadlessSplitter["snap"]) | undefined;
11199
+ /** How close a drag has to come to a snap point to land on it, in pixels. */
11200
+ "snap-threshold"?: (HelixHeadlessSplitter["snapThreshold"] | `${number}`) | undefined;
11201
+ /** How close a drag has to come to a snap point to land on it, in pixels. */
11202
+ snapThreshold?: (HelixHeadlessSplitter["snapThreshold"]) | undefined;
10048
11203
  /** How far one arrow key press moves the divider, as a percentage. */
10049
11204
  step?: (HelixHeadlessSplitter["step"]) | undefined;
10050
11205
  };
@@ -10120,6 +11275,9 @@ export type HelixHeadlessStepsVueProps = {
10120
11275
  A list of stages is a landmark a reader arrives at out of order, so it
10121
11276
  needs a name of its own rather than borrowing the heading above it. */
10122
11277
  label?: (HelixHeadlessSteps["label"]) | undefined;
11278
+ /** Whether a reader has to finish each stage, or pass an `optional` one,
11279
+ before going on to the next. */
11280
+ linear?: (HelixHeadlessSteps["linear"]) | undefined;
10123
11281
  /** Which way the steps run.
10124
11282
 
10125
11283
  Absent is a row, which is what a form header wants, with each name under
@@ -10183,10 +11341,19 @@ export type HelixHeadlessStepHelixSelectElementEvent =
10183
11341
  export type HelixHeadlessStepVueProps = {
10184
11342
  /** Whether this stage is finished. */
10185
11343
  complete?: (HelixHeadlessStep["complete"]) | undefined;
11344
+ /** The words that tell a screen reader the stage is finished. Translate it
11345
+ with the page. */
11346
+ "complete-label"?: (HelixHeadlessStep["completeLabel"]) | undefined;
11347
+ /** The words that tell a screen reader the stage is finished. Translate it
11348
+ with the page. */
11349
+ completeLabel?: (HelixHeadlessStep["completeLabel"]) | undefined;
10186
11350
  /** Whether this is the current stage. */
10187
11351
  current?: (HelixHeadlessStep["current"]) | undefined;
10188
11352
  /** Whether the stage is disabled, so the user cannot go to it. */
10189
11353
  disabled?: (HelixHeadlessStep["disabled"]) | undefined;
11354
+ /** Whether a reader may pass the stage without finishing it, in a sequence
11355
+ with `linear`. Ark UI's skippable step. */
11356
+ optional?: (HelixHeadlessStep["optional"]) | undefined;
10190
11357
  /** The value the step sends in `helix-select`. */
10191
11358
  value?: (HelixHeadlessStep["value"]) | undefined;
10192
11359
  };
@@ -10221,6 +11388,28 @@ stylesheets. */
10221
11388
  "default-checked"?: (HelixHeadlessSwitch["defaultChecked"]) | undefined;
10222
11389
  /** Whether the control starts checked. A form reset returns it to this state. */
10223
11390
  defaultChecked?: (HelixHeadlessSwitch["defaultChecked"]) | undefined;
11391
+ /** Whether a reader can see and focus the control and cannot change it. A
11392
+ read-only control still submits its value.
11393
+
11394
+ React Aria's `isReadOnly`. A native checkbox has no read-only state, so
11395
+ the press is refused at the inner control, which keeps its box as it
11396
+ was, and the control says `aria-readonly`. A script can still set
11397
+ `checked`, as it can set the value of a read-only text field.
11398
+
11399
+ The attribute is `readonly`, which is the platform's spelling for the
11400
+ text fields. */
11401
+ readonly?: (HelixHeadlessSwitch["readOnly"]) | undefined;
11402
+ /** Whether a reader can see and focus the control and cannot change it. A
11403
+ read-only control still submits its value.
11404
+
11405
+ React Aria's `isReadOnly`. A native checkbox has no read-only state, so
11406
+ the press is refused at the inner control, which keeps its box as it
11407
+ was, and the control says `aria-readonly`. A script can still set
11408
+ `checked`, as it can set the value of a read-only text field.
11409
+
11410
+ The attribute is `readonly`, which is the platform's spelling for the
11411
+ text fields. */
11412
+ readOnly?: (HelixHeadlessSwitch["readOnly"]) | undefined;
10224
11413
  /** */
10225
11414
  "aria-label"?: unknown;
10226
11415
  /** The validation message shown under the control. It replaces the
@@ -10304,6 +11493,9 @@ export type HelixHeadlessTableColumnElementEvent<E = Event> = TypedEvent<
10304
11493
  /** `helix-before-resize` event type */
10305
11494
  export type HelixHeadlessTableColumnHelixBeforeResizeElementEvent =
10306
11495
  HelixHeadlessTableColumnElementEvent<HelixBeforeResizeEvent>;
11496
+ /** `helix-resized` event type */
11497
+ export type HelixHeadlessTableColumnHelixResizedElementEvent =
11498
+ HelixHeadlessTableColumnElementEvent<HelixResizedEvent>;
10307
11499
 
10308
11500
  export type HelixHeadlessTableColumnVueProps = {
10309
11501
  /** The key this column reads out of a row.
@@ -10345,6 +11537,22 @@ replaced with the heading text. */
10345
11537
  /** The accessible name of the separator that resizes the column. `{name}` is
10346
11538
  replaced with the heading text. */
10347
11539
  resizeLabel?: (HelixHeadlessTableColumn["resizeLabel"]) | undefined;
11540
+ /** Makes this column's cells the headers of their rows, in `DataTable`.
11541
+
11542
+ A screen reader moving along a row or down a column names the row by its
11543
+ row header, so the cell that identifies a row, a file's name say, is the
11544
+ one to mark. Where no column sets it, `DataTable` makes the first column
11545
+ with a `field` the row header. A `Table`'s cells are your markup, so there
11546
+ a cell is a row header through its own `header` attribute. */
11547
+ "row-header"?: (HelixHeadlessTableColumn["rowHeader"]) | undefined;
11548
+ /** Makes this column's cells the headers of their rows, in `DataTable`.
11549
+
11550
+ A screen reader moving along a row or down a column names the row by its
11551
+ row header, so the cell that identifies a row, a file's name say, is the
11552
+ one to mark. Where no column sets it, `DataTable` makes the first column
11553
+ with a `field` the row header. A `Table`'s cells are your markup, so there
11554
+ a cell is a row header through its own `header` attribute. */
11555
+ rowHeader?: (HelixHeadlessTableColumn["rowHeader"]) | undefined;
10348
11556
  /** Whether the table can be sorted by this column.
10349
11557
 
10350
11558
  Ignored without a `field`, and silently: a column with nothing to sort by
@@ -10472,6 +11680,8 @@ correct default: the raw value is what an API sorted by. */
10472
11680
  export type HelixHeadlessTableColumnVueEvents = {
10473
11681
  /** The column is about to be resized, with the requested width. Cancelable: cancel it to keep the current width. */
10474
11682
  "helix-before-resize": HelixHeadlessTableColumnHelixBeforeResizeElementEvent;
11683
+ /** Fired after the column is resized, with the new width. */
11684
+ "helix-resized": HelixHeadlessTableColumnHelixResizedElementEvent;
10475
11685
  };
10476
11686
 
10477
11687
  /** `HelixHeadlessTable` component event */
@@ -10479,9 +11689,18 @@ export type HelixHeadlessTableElementEvent<E = Event> = TypedEvent<
10479
11689
  HelixHeadlessTable,
10480
11690
  E
10481
11691
  >;
11692
+ /** `helix-select` event type */
11693
+ export type HelixHeadlessTableHelixSelectElementEvent =
11694
+ HelixHeadlessTableElementEvent<HelixSelectEvent>;
11695
+ /** `helix-selected` event type */
11696
+ export type HelixHeadlessTableHelixSelectedElementEvent =
11697
+ HelixHeadlessTableElementEvent<HelixSelectedEvent>;
10482
11698
  /** `helix-sort` event type */
10483
11699
  export type HelixHeadlessTableHelixSortElementEvent =
10484
11700
  HelixHeadlessTableElementEvent<HelixSortEvent>;
11701
+ /** `helix-sorted` event type */
11702
+ export type HelixHeadlessTableHelixSortedElementEvent =
11703
+ HelixHeadlessTableElementEvent<HelixSortedEvent>;
10485
11704
 
10486
11705
  export type HelixHeadlessTableVueProps = {
10487
11706
  /** The word for an ascending sort, in `sorted-label`. */
@@ -10517,6 +11736,12 @@ and a list here would be a second way to say what that says. This table's
10517
11736
  cells are markup, and a table written as rows of cells with no column
10518
11737
  declared in it has nowhere else to be sized from. */
10519
11738
  columns?: (HelixHeadlessTable["columns"]) | undefined;
11739
+ /** The keys selected at the start, separated by commas. Used until `selected`
11740
+ is set. */
11741
+ "default-selected"?: (HelixHeadlessTable["defaultSelected"]) | undefined;
11742
+ /** The keys selected at the start, separated by commas. Used until `selected`
11743
+ is set. */
11744
+ defaultSelected?: (HelixHeadlessTable["defaultSelected"]) | undefined;
10520
11745
  /** The starting sort order, used until `sort` is set. */
10521
11746
  "default-sort"?: (HelixHeadlessTable["defaultSort"]) | undefined;
10522
11747
  /** The starting sort order, used until `sort` is set. */
@@ -10530,6 +11755,31 @@ declared in it has nowhere else to be sized from. */
10530
11755
  An `aria-label` or `aria-labelledby` on the host names the table too, and
10531
11756
  wins over this. */
10532
11757
  label?: (HelixHeadlessTable["label"]) | undefined;
11758
+ /** Adds a column of checkboxes for selecting rows. Each row is known by its
11759
+ `value`, and by its place among the rows as written where it has none. */
11760
+ selectable?: (HelixHeadlessTable["selectable"]) | undefined;
11761
+ /** The name of the checkbox in the heading that selects every row. */
11762
+ "select-all-label"?: (HelixHeadlessTable["selectAllLabel"]) | undefined;
11763
+ /** The name of the checkbox in the heading that selects every row. */
11764
+ selectAllLabel?: (HelixHeadlessTable["selectAllLabel"]) | undefined;
11765
+ /** The keys of the selected rows, separated by commas.
11766
+
11767
+ A reader's press fires `helix-select` first, and refusing it leaves the
11768
+ selection as it was. `default-selected` seeds a selection this element
11769
+ then owns. */
11770
+ selected?: (HelixHeadlessTable["selected"]) | undefined;
11771
+ /** What screen readers hear when the chosen rows change. `{count}` is how many
11772
+ rows are chosen. */
11773
+ "selected-label"?: (HelixHeadlessTable["selectedLabel"]) | undefined;
11774
+ /** What screen readers hear when the chosen rows change. `{count}` is how many
11775
+ rows are chosen. */
11776
+ selectedLabel?: (HelixHeadlessTable["selectedLabel"]) | undefined;
11777
+ /** The name of a row's checkbox. `{row}` is replaced with the words of the
11778
+ row's first cell. */
11779
+ "select-row-label"?: (HelixHeadlessTable["selectRowLabel"]) | undefined;
11780
+ /** The name of a row's checkbox. `{row}` is replaced with the words of the
11781
+ row's first cell. */
11782
+ selectRowLabel?: (HelixHeadlessTable["selectRowLabel"]) | undefined;
10533
11783
  /** The sort order, as `field:direction`, where `field` is a sortable column's
10534
11784
  `field`.
10535
11785
 
@@ -10565,11 +11815,21 @@ say that without the component knowing what a row looks like. */
10565
11815
  };
10566
11816
 
10567
11817
  export type HelixHeadlessTableVueEvents = {
11818
+ /** The selection is about to change. The event carries every selected key, separated by commas. Cancelable: cancel it to keep the current selection. */
11819
+ "helix-select": HelixHeadlessTableHelixSelectElementEvent;
11820
+ /** Fired after the selection changes, with every selected key, separated by commas. */
11821
+ "helix-selected": HelixHeadlessTableHelixSelectedElementEvent;
10568
11822
  /** A different sort order was requested, as `field:direction`, or empty for the order the rows were written in. Cancelable: cancel it to keep the current order. */
10569
11823
  "helix-sort": HelixHeadlessTableHelixSortElementEvent;
11824
+ /** Fired after the sort order changes, with the new order. */
11825
+ "helix-sorted": HelixHeadlessTableHelixSortedElementEvent;
10570
11826
  };
10571
11827
 
10572
- export type HelixHeadlessTableRowVueProps = {};
11828
+ export type HelixHeadlessTableRowVueProps = {
11829
+ /** The key the table's `selected` lists this row by. Left empty, the row is
11830
+ known by its place among the rows as written. */
11831
+ value?: (HelixHeadlessTableRow["value"]) | undefined;
11832
+ };
10573
11833
 
10574
11834
  export type HelixHeadlessTableRowVueEvents = {};
10575
11835
 
@@ -10585,10 +11845,9 @@ because it is coordination between elements rather than anything a consumer
10585
11845
  writes: the tab already says it.
10586
11846
 
10587
11847
  A string and not a reference: an IDREF resolves only in the tree it is
10588
- written in, and an element reference cannot reach a sibling shadow tree
10589
- either, so `aria-labelledby` to the tab's own id leaves the panel with no
10590
- accessible name. `aria-label` on a `tabpanel` is how the pattern names one
10591
- anyway. */
11848
+ written in, and the tab's control is inside the tab's shadow root, which no
11849
+ reference from the light DOM can reach. `aria-label` on a `tabpanel` is how
11850
+ the pattern names one anyway. */
10592
11851
  label?: (HelixHeadlessTabPanel["label"]) | undefined;
10593
11852
  };
10594
11853
 
@@ -10622,6 +11881,11 @@ Automatic is the default because showing a panel is usually cheap. Set this
10622
11881
  where it is not, so a reader arrowing past four tabs does not load four
10623
11882
  panels on the way. */
10624
11883
  manual?: (HelixHeadlessTabs["manual"]) | undefined;
11884
+ /** The direction the tabs run. `vertical` sets them in a column beside the
11885
+ panels and tells a screen reader the list is vertical.
11886
+
11887
+ Optional, so the resting row writes no attribute onto the host. */
11888
+ orientation?: (HelixHeadlessTabs["orientation"]) | undefined;
10625
11889
  /** How the row of tabs is drawn.
10626
11890
 
10627
11891
  Unset is a raised pill on the selected tab with nothing behind the row,
@@ -10683,6 +11947,13 @@ export type HelixHeadlessTabHelixSelectElementEvent =
10683
11947
  HelixHeadlessTabElementEvent<HelixSelectEvent>;
10684
11948
 
10685
11949
  export type HelixHeadlessTabVueProps = {
11950
+ /** The URL the tab links to. Setting it renders the tab as a link, for a set
11951
+ of tabs that are pages of a site. */
11952
+ href?: (HelixHeadlessTab["href"]) | undefined;
11953
+ /** The link's `rel`, for a tab with an `href`. */
11954
+ rel?: (HelixHeadlessTab["rel"]) | undefined;
11955
+ /** Where the link opens, such as `_blank`, for a tab with an `href`. */
11956
+ target?: (HelixHeadlessTab["target"]) | undefined;
10686
11957
  /** Whether the item is disabled and cannot be chosen. */
10687
11958
  disabled?: (HelixHeadlessTab["disabled"]) | undefined;
10688
11959
  /** Whether the item is selected.
@@ -10701,6 +11972,47 @@ export type HelixHeadlessTabVueEvents = {
10701
11972
  "helix-select": HelixHeadlessTabHelixSelectElementEvent;
10702
11973
  };
10703
11974
 
11975
+ /** `HelixHeadlessTagGroup` component event */
11976
+ export type HelixHeadlessTagGroupElementEvent<E = Event> = TypedEvent<
11977
+ HelixHeadlessTagGroup,
11978
+ E
11979
+ >;
11980
+ /** `helix-before-change` event type */
11981
+ export type HelixHeadlessTagGroupHelixBeforeChangeElementEvent =
11982
+ HelixHeadlessTagGroupElementEvent<HelixBeforeChangeEvent>;
11983
+ /** `helix-dismiss` event type */
11984
+ export type HelixHeadlessTagGroupHelixDismissElementEvent =
11985
+ HelixHeadlessTagGroupElementEvent<HelixDismissEvent>;
11986
+
11987
+ export type HelixHeadlessTagGroupVueProps = {
11988
+ /** The name of the set, such as "Filters", which a screen reader announces
11989
+ before its tags. */
11990
+ label?: (HelixHeadlessTagGroup["label"]) | undefined;
11991
+ /** How many tags a reader can select: `single`, `multiple`, or none.
11992
+
11993
+ Absent selects nothing, and the tags carry no selected state at all. */
11994
+ "selection-mode"?: (HelixHeadlessTagGroup["selectionMode"]) | undefined;
11995
+ /** How many tags a reader can select: `single`, `multiple`, or none.
11996
+
11997
+ Absent selects nothing, and the tags carry no selected state at all. */
11998
+ selectionMode?: (HelixHeadlessTagGroup["selectionMode"]) | undefined;
11999
+ /** The selected tags' values, separated by commas, since a value may hold a
12000
+ space.
12001
+
12002
+ Set it to start with tags selected. A tag's value is its `value`, or its
12003
+ words where it has none. */
12004
+ value?: (HelixHeadlessTagGroup["value"]) | undefined;
12005
+ };
12006
+
12007
+ export type HelixHeadlessTagGroupVueEvents = {
12008
+ /** Fired once a press has changed which tags are selected. */
12009
+ change: HelixHeadlessTagGroupElementEvent;
12010
+ /** Fired before a press changes which tags are selected, with the `value` it would leave. Cancelable. */
12011
+ "helix-before-change": HelixHeadlessTagGroupHelixBeforeChangeElementEvent;
12012
+ /** A tag's remove button was pressed, or Delete or Backspace on the focused tag. Bubbles from that tag, which is its `target`; remove the tag in response. Cancelable. */
12013
+ "helix-dismiss": HelixHeadlessTagGroupHelixDismissElementEvent;
12014
+ };
12015
+
10704
12016
  /** `HelixHeadlessTag` component event */
10705
12017
  export type HelixHeadlessTagElementEvent<E = Event> = TypedEvent<
10706
12018
  HelixHeadlessTag,
@@ -10711,6 +12023,16 @@ export type HelixHeadlessTagHelixDismissElementEvent =
10711
12023
  HelixHeadlessTagElementEvent<HelixDismissEvent>;
10712
12024
 
10713
12025
  export type HelixHeadlessTagVueProps = {
12026
+ /** Takes the tag out of reach: its link and its remove button stop
12027
+ answering, and in a `Tag.Group` the arrow keys pass over it and it cannot
12028
+ be selected or removed. */
12029
+ disabled?: (HelixHeadlessTag["disabled"]) | undefined;
12030
+ /** Makes the label a link to this address. */
12031
+ href?: (HelixHeadlessTag["href"]) | undefined;
12032
+ /** What the tag stands for in its group's `value`.
12033
+
12034
+ Absent is the tag's own words, its category first. */
12035
+ value?: (HelixHeadlessTag["value"]) | undefined;
10714
12036
  /** Whether the element shows a control that dismisses it. */
10715
12037
  dismissible?: (HelixHeadlessTag["dismissible"]) | undefined;
10716
12038
  /** The dismiss control's label, read by screen readers.
@@ -10727,6 +12049,18 @@ derive one rather than dash-casing it, so this would otherwise be
10727
12049
  reachable only as `dismisslabel`, which nobody would guess and no linter
10728
12050
  would catch. */
10729
12051
  dismissLabel?: (HelixHeadlessTag["dismissLabel"]) | undefined;
12052
+ /** Whether the tag holds its group's tab stop.
12053
+
12054
+ Written by `Tag.Group` on every tag it holds, and unset outside one, which
12055
+ is how a tag knows it is a row. No attribute: it is coordination between
12056
+ elements, the same shape `Toggle.focusable` has. */
12057
+ focusable?: (HelixHeadlessTag["focusable"]) | undefined;
12058
+ /** Whether the tag is selected, in a `Tag.Group` that selects.
12059
+
12060
+ Written by the group from its own `value`, and unset where nothing can be
12061
+ selected, which is what keeps `aria-selected` off a set that does not
12062
+ select. */
12063
+ selected?: (HelixHeadlessTag["selected"]) | undefined;
10730
12064
  };
10731
12065
 
10732
12066
  export type HelixHeadlessTagVueEvents = {
@@ -10785,6 +12119,12 @@ element sends two entries, and that is what this does. */
10785
12119
  maxlength?: (HelixHeadlessTextarea["maxLength"] | `${number}`) | undefined;
10786
12120
  /** The most characters the value can have. */
10787
12121
  maxLength?: (HelixHeadlessTextarea["maxLength"]) | undefined;
12122
+ /** How many lines an `auto-grow` field grows to before it scrolls. Absent,
12123
+ it grows with all of its text. */
12124
+ "max-rows"?: (HelixHeadlessTextarea["maxRows"] | `${number}`) | undefined;
12125
+ /** How many lines an `auto-grow` field grows to before it scrolls. Absent,
12126
+ it grows with all of its text. */
12127
+ maxRows?: (HelixHeadlessTextarea["maxRows"]) | undefined;
10788
12128
  /** The fewest characters the value can have.
10789
12129
 
10790
12130
  Forwarded to the real `<textarea>` rather than checked here, which is what
@@ -10940,6 +12280,16 @@ a typed time, which is then invalid. */
10940
12280
  Handed to the list, which offers them as unavailable, and checked against
10941
12281
  a typed time, which is then invalid. */
10942
12282
  disableTimes?: (HelixHeadlessTimeInput["disableTimes"]) | undefined;
12283
+ /** The clock the times are written on: `h12` for twelve hours with a
12284
+ meridiem, `h23` for twenty-four. Absent is the locale's own.
12285
+
12286
+ Handed to the list. The value is `HH:mm` on twenty-four hours either way. */
12287
+ "hour-cycle"?: (HelixHeadlessTimeInput["hourCycle"]) | undefined;
12288
+ /** The clock the times are written on: `h12` for twelve hours with a
12289
+ meridiem, `h23` for twenty-four. Absent is the locale's own.
12290
+
12291
+ Handed to the list. The value is `HH:mm` on twenty-four hours either way. */
12292
+ hourCycle?: (HelixHeadlessTimeInput["hourCycle"]) | undefined;
10943
12293
  /** Language tag the times are written in.
10944
12294
 
10945
12295
  Absent uses the runtime's own. */
@@ -10991,7 +12341,12 @@ removes rather than as "Remove" said once per time. */
10991
12341
  **The name goes in**, so a row of them is heard as which one each
10992
12342
  removes rather than as "Remove" said once per time. */
10993
12343
  removeLabel?: (HelixHeadlessTimeInput["removeLabel"]) | undefined;
10994
- /** How far apart the offered times are, in minutes. */
12344
+ /** Whether times carry their seconds: the value is `HH:mm:ss`, a typed time
12345
+ may give them, the field writes them, and the list's `step` counts seconds.
12346
+ See Time Picker's `seconds`. */
12347
+ seconds?: (HelixHeadlessTimeInput["seconds"]) | undefined;
12348
+ /** How far apart the offered times are, in minutes, or in seconds with
12349
+ `seconds`. */
10995
12350
  step?: (HelixHeadlessTimeInput["step"]) | undefined;
10996
12351
  /** Whether the field shows the time in the local style or as the value
10997
12352
  itself.
@@ -11032,6 +12387,20 @@ not touch, and React reads that as a hydration mismatch. The absent
11032
12387
  attribute *is* the list, which the stylesheet reads as the base rule, so
11033
12388
  only the departure has to be named. */
11034
12389
  variant?: (HelixHeadlessTimeInput["variant"]) | undefined;
12390
+ /** What a screen reader hears for a segment with nothing in it, which a
12391
+ sighted reader sees as dashes. */
12392
+ "empty-segment-label"?: (HelixHeadlessTimeInput["emptySegmentLabel"]) | undefined;
12393
+ /** What a screen reader hears for a segment with nothing in it, which a
12394
+ sighted reader sees as dashes. */
12395
+ emptySegmentLabel?: (HelixHeadlessTimeInput["emptySegmentLabel"]) | undefined;
12396
+ /** Whether the field is a row of segments, one for each part of the date or
12397
+ time, in place of a line of text.
12398
+
12399
+ Each segment is set with digits or the arrow keys, in the order the
12400
+ locale writes them, so a reader types a date the way they write one and
12401
+ no format has to be read back. The picker still opens from the trigger
12402
+ and with Alt+Down. */
12403
+ segmented?: (HelixHeadlessTimeInput["segmented"]) | undefined;
11035
12404
  /** Whether the value is locked. A read-only control still submits its value.
11036
12405
 
11037
12406
  **Enforced by refusing every request in one place**, which is the seam this
@@ -11244,6 +12613,20 @@ A time not on the step is simply never offered, so it is not an error to
11244
12613
  name one, and naming every time in the list is how the empty state is
11245
12614
  reached honestly rather than by handing over an empty range. */
11246
12615
  disableTimes?: (HelixHeadlessTimePicker["disableTimes"]) | undefined;
12616
+ /** The clock the times are written on: `h12` for twelve hours with a
12617
+ meridiem, `h23` for twenty-four.
12618
+
12619
+ Absent is the locale's own, which is right for a reader's own form. Set it
12620
+ where every reader must see the same clock whatever their language, as a
12621
+ timetable does. The value is `HH:mm` on twenty-four hours either way. */
12622
+ "hour-cycle"?: (HelixHeadlessTimePicker["hourCycle"]) | undefined;
12623
+ /** The clock the times are written on: `h12` for twelve hours with a
12624
+ meridiem, `h23` for twenty-four.
12625
+
12626
+ Absent is the locale's own, which is right for a reader's own form. Set it
12627
+ where every reader must see the same clock whatever their language, as a
12628
+ timetable does. The value is `HH:mm` on twenty-four hours either way. */
12629
+ hourCycle?: (HelixHeadlessTimePicker["hourCycle"]) | undefined;
11247
12630
  /** What the wheel of hours is called, read by screen readers. */
11248
12631
  "hour-label"?: (HelixHeadlessTimePicker["hourLabel"]) | undefined;
11249
12632
  /** What the wheel of hours is called, read by screen readers. */
@@ -11340,7 +12723,20 @@ else set needs. */
11340
12723
  readOnly?: (HelixHeadlessTimePicker["readOnly"]) | undefined;
11341
12724
  /** Stops the form from submitting while no time is chosen. */
11342
12725
  required?: (HelixHeadlessTimePicker["required"]) | undefined;
11343
- /** How far apart the offered times are, in minutes.
12726
+ /** What the wheel of seconds is called, read by screen readers. */
12727
+ "second-label"?: (HelixHeadlessTimePicker["secondLabel"]) | undefined;
12728
+ /** What the wheel of seconds is called, read by screen readers. */
12729
+ secondLabel?: (HelixHeadlessTimePicker["secondLabel"]) | undefined;
12730
+ /** Whether times carry their seconds.
12731
+
12732
+ The value becomes `HH:mm:ss`, each time is written with its seconds, the
12733
+ wheels take a column of seconds, and `step` counts seconds, the unit
12734
+ `<input type="time">` counts in. A list at a step of one second is 86,400
12735
+ rows, so give `seconds` a `step` and bounds that keep it a list, or use
12736
+ the wheels. */
12737
+ seconds?: (HelixHeadlessTimePicker["seconds"]) | undefined;
12738
+ /** How far apart the offered times are, in minutes, or in seconds with
12739
+ `seconds`.
11344
12740
 
11345
12741
  Fifteen, which is four rows an hour and ninety-six in a day: enough that a
11346
12742
  reader scrolls rather than hunts, and few enough that the list is a list.
@@ -11442,6 +12838,19 @@ export type HelixHeadlessTimePickerVueEvents = {
11442
12838
  input: HelixHeadlessTimePickerElementEvent;
11443
12839
  };
11444
12840
 
12841
+ export type HelixHeadlessTimelineGroupVueProps = {
12842
+ /** The level of the group's heading, from 1 to 6. */
12843
+ "heading-level"?: (HelixHeadlessTimelineGroup["headingLevel"] | `${number}`) | undefined;
12844
+ /** The level of the group's heading, from 1 to 6. */
12845
+ headingLevel?: (HelixHeadlessTimelineGroup["headingLevel"]) | undefined;
12846
+ /** The heading, when it is plain text, such as "Today".
12847
+
12848
+ The fallback of the `heading` slot, so slotted content replaces it. */
12849
+ label?: (HelixHeadlessTimelineGroup["label"]) | undefined;
12850
+ };
12851
+
12852
+ export type HelixHeadlessTimelineGroupVueEvents = {};
12853
+
11445
12854
  export type HelixHeadlessTimelineItemVueProps = {
11446
12855
  /** When it happened, in machine-readable form. Setting it wraps the time in a
11447
12856
  `<time>` element.
@@ -11528,7 +12937,11 @@ export type HelixHeadlessToastHelixDismissElementEvent =
11528
12937
  HelixHeadlessToastElementEvent<HelixDismissEvent>;
11529
12938
 
11530
12939
  export type HelixHeadlessToastVueProps = {
11531
- /** Accessible name for the region, such as "Notifications". */
12940
+ /** The key that takes focus to the stack and back, such as `F8` or `Alt+T`:
12941
+ keys joined by `+`, the last one the key. Empty turns it off. */
12942
+ hotkey?: (HelixHeadlessToast["hotkey"]) | undefined;
12943
+ /** Accessible name for the region, with `{hotkey}` filled in. Translate it with
12944
+ the rest of your interface. */
11532
12945
  label?: (HelixHeadlessToast["label"]) | undefined;
11533
12946
  /** Which corner or edge the stack sits at.
11534
12947
 
@@ -11605,6 +13018,21 @@ reader while looking correct to everybody else. Worse, setting both draws
11605
13018
  it twice. One property moves the label the consumer already has to give,
11606
13019
  and cannot be used to remove it. */
11607
13020
  labelPlacement?: (HelixHeadlessToggleGroup["labelPlacement"]) | undefined;
13021
+ /** The direction the items run. `vertical` puts them in a column, and the up
13022
+ and down arrows move between them.
13023
+
13024
+ Optional, so the attribute is absent until a consumer writes it. */
13025
+ orientation?: (HelixHeadlessToggleGroup["orientation"]) | undefined;
13026
+ /** Whether one item is chosen, as a radio group, or several can be pressed,
13027
+ as a toolbar of buttons with `aria-pressed`.
13028
+
13029
+ Optional, so the attribute is absent until a consumer writes it. */
13030
+ "selection-mode"?: (HelixHeadlessToggleGroup["selectionMode"]) | undefined;
13031
+ /** Whether one item is chosen, as a radio group, or several can be pressed,
13032
+ as a toolbar of buttons with `aria-pressed`.
13033
+
13034
+ Optional, so the attribute is absent until a consumer writes it. */
13035
+ selectionMode?: (HelixHeadlessToggleGroup["selectionMode"]) | undefined;
11608
13036
  /** The value the control starts with. A form reset returns it to this value. */
11609
13037
  "default-value"?: (HelixHeadlessToggleGroup["defaultValue"]) | undefined;
11610
13038
  /** The value the control starts with. A form reset returns it to this value. */
@@ -11682,6 +13110,10 @@ work as before once focus is in it.
11682
13110
  No attribute: it is coordination between elements, and a consumer has no
11683
13111
  reason to set it. */
11684
13112
  focusable?: (HelixHeadlessToggleGroup["focusable"]) | undefined;
13113
+ /** The pressed values as a list, under `selection-mode="multiple"`, in the
13114
+ order the items are written. Written, it presses exactly those items.
13115
+ Where one item is chosen, it is that one value, or none. */
13116
+ values?: (HelixHeadlessToggleGroup["values"]) | undefined;
11685
13117
  };
11686
13118
 
11687
13119
  export type HelixHeadlessToggleGroupVueEvents = {
@@ -11752,6 +13184,11 @@ group sits in holds the stop. No attribute: it is coordination between
11752
13184
  elements, and `tabindex` on a host the consumer rendered is the change a
11753
13185
  React consumer's hydration reports and does not patch up. */
11754
13186
  focusable?: (HelixHeadlessToggle["focusable"]) | undefined;
13187
+ /** Whether the item is pressed, in a group where several can be, and
13188
+ `undefined` in a group where one is chosen.
13189
+
13190
+ Written by the group, like `selected`, so no attribute. */
13191
+ pressed?: (HelixHeadlessToggle["pressed"]) | undefined;
11755
13192
  };
11756
13193
 
11757
13194
  export type HelixHeadlessToggleVueEvents = {
@@ -11767,6 +13204,12 @@ and wins over this. */
11767
13204
  label?: (HelixHeadlessToolbar["label"]) | undefined;
11768
13205
  /** The direction the arrow keys move focus in. */
11769
13206
  orientation?: (HelixHeadlessToolbar["orientation"]) | undefined;
13207
+ /** Whether the arrow keys stop at the first and the last control. Unset, they
13208
+ wrap around from one end to the other. */
13209
+ "stop-at-ends"?: (HelixHeadlessToolbar["stopAtEnds"]) | undefined;
13210
+ /** Whether the arrow keys stop at the first and the last control. Unset, they
13211
+ wrap around from one end to the other. */
13212
+ stopAtEnds?: (HelixHeadlessToolbar["stopAtEnds"]) | undefined;
11770
13213
  };
11771
13214
 
11772
13215
  export type HelixHeadlessToolbarVueEvents = {};
@@ -11854,6 +13297,22 @@ worked. */
11854
13297
 
11855
13298
  It moves if that side does not fit. */
11856
13299
  placement?: (HelixHeadlessTooltip["placement"]) | undefined;
13300
+ /** What shows the bubble. Unset, it is a pointer resting on the trigger and
13301
+ keyboard focus. `focus` is keyboard focus alone, for a hint a pointer does
13302
+ not need, such as a shortcut a mouse reader has no use for. */
13303
+ "show-on"?: (HelixHeadlessTooltip["showOn"]) | undefined;
13304
+ /** What shows the bubble. Unset, it is a pointer resting on the trigger and
13305
+ keyboard focus. `focus` is keyboard focus alone, for a hint a pointer does
13306
+ not need, such as a shortcut a mouse reader has no use for. */
13307
+ showOn?: (HelixHeadlessTooltip["showOn"]) | undefined;
13308
+ /** How long after a tooltip hides the next one still shows at once, with no
13309
+ `delay`, in milliseconds. The same skip delay Radix uses. Zero makes every
13310
+ tooltip wait. */
13311
+ "skip-delay"?: (HelixHeadlessTooltip["skipDelay"] | `${number}`) | undefined;
13312
+ /** How long after a tooltip hides the next one still shows at once, with no
13313
+ `delay`, in milliseconds. The same skip delay Radix uses. Zero makes every
13314
+ tooltip wait. */
13315
+ skipDelay?: (HelixHeadlessTooltip["skipDelay"]) | undefined;
11857
13316
  /** The id of a box to keep the bubble inside. Defaults to the viewport.
11858
13317
 
11859
13318
  Resolved the way `for` is, so an id in the same tree, which is what lets a
@@ -11951,6 +13410,14 @@ The shape is `Carousel`'s, which is the nearest thing in the library: a
11951
13410
  "next-label"?: (HelixHeadlessTour["nextLabel"]) | undefined;
11952
13411
  /** Label for the control that goes on. */
11953
13412
  nextLabel?: (HelixHeadlessTour["nextLabel"]) | undefined;
13413
+ /** Draws each stop's place in the run in its panel, as well as saying it. */
13414
+ progress?: (HelixHeadlessTour["progress"]) | undefined;
13415
+ /** Each stop's place in the run, with `{index}` and `{count}` filled in.
13416
+ Translate it with the rest of your text. */
13417
+ "progress-label"?: (HelixHeadlessTour["progressLabel"]) | undefined;
13418
+ /** Each stop's place in the run, with `{index}` and `{count}` filled in.
13419
+ Translate it with the rest of your text. */
13420
+ progressLabel?: (HelixHeadlessTour["progressLabel"]) | undefined;
11954
13421
  /** Label for the control that leaves the tour. */
11955
13422
  "skip-label"?: (HelixHeadlessTour["skipLabel"]) | undefined;
11956
13423
  /** Label for the control that leaves the tour. */
@@ -12025,6 +13492,9 @@ closed tour, a closed tour shows nothing, and nothing can disagree. */
12025
13492
  first?: (HelixHeadlessTourStop["first"]) | undefined;
12026
13493
  /** The id of the element the stop points at. */
12027
13494
  for?: (HelixHeadlessTourStop["for"]) | undefined;
13495
+ /** The panel's name, where neither the `heading` slot nor the content holds a
13496
+ heading. */
13497
+ label?: (HelixHeadlessTourStop["label"]) | undefined;
12028
13498
  /** Whether the stop is the last one. Its next control then shows `doneLabel`. */
12029
13499
  last?: (HelixHeadlessTourStop["last"]) | undefined;
12030
13500
  /** Label for the control that goes on. */
@@ -12037,6 +13507,15 @@ closed tour, a closed tour shows nothing, and nothing can disagree. */
12037
13507
  "skip-label"?: (HelixHeadlessTourStop["skipLabel"]) | undefined;
12038
13508
  /** Label for the control that leaves the tour. */
12039
13509
  skipLabel?: (HelixHeadlessTourStop["skipLabel"]) | undefined;
13510
+ /** What kind of stop this is. Unset, it is a bubble pointing at its target.
13511
+
13512
+ - `dialog`: a panel in the middle of the window, over a backdrop
13513
+ - `floating`: a panel in a corner of the window
13514
+ - `wait`: nothing shown, while the tour waits for the target to be on the page
13515
+
13516
+ Reflected, because the styled tier places a dialog and a floating panel by
13517
+ it, and unset at rest, so no default is written onto the host. */
13518
+ type?: (HelixHeadlessTourStop["type"]) | undefined;
12040
13519
  };
12041
13520
 
12042
13521
  export type HelixHeadlessTourStopVueEvents = {
@@ -12055,6 +13534,9 @@ export type HelixHeadlessTreeItemHelixBeforeCloseElementEvent =
12055
13534
  /** `helix-before-open` event type */
12056
13535
  export type HelixHeadlessTreeItemHelixBeforeOpenElementEvent =
12057
13536
  HelixHeadlessTreeItemElementEvent<HelixBeforeOpenEvent>;
13537
+ /** `helix-load` event type */
13538
+ export type HelixHeadlessTreeItemHelixLoadElementEvent =
13539
+ HelixHeadlessTreeItemElementEvent<HelixLoadEvent>;
12058
13540
  /** `helix-select` event type */
12059
13541
  export type HelixHeadlessTreeItemHelixSelectElementEvent =
12060
13542
  HelixHeadlessTreeItemElementEvent<HelixSelectEvent>;
@@ -12063,12 +13545,20 @@ export type HelixHeadlessTreeItemToggleElementEvent =
12063
13545
  HelixHeadlessTreeItemElementEvent<ToggleEvent>;
12064
13546
 
12065
13547
  export type HelixHeadlessTreeItemVueProps = {
13548
+ /** Whether the item cannot be chosen, opened or followed. The arrow keys still
13549
+ reach it, so a reader knows it is there. */
13550
+ disabled?: (HelixHeadlessTreeItem["disabled"]) | undefined;
12066
13551
  /** The URL this node links to. Setting it makes the row a link.
12067
13552
 
12068
13553
  Unset by default, and unreflected: a tree of choosable nodes is not a tree
12069
13554
  of links, and an empty `href` written onto every row would be a link to the
12070
13555
  current page on every item a consumer never asked to be one. */
12071
13556
  href?: (HelixHeadlessTreeItem["href"]) | undefined;
13557
+ /** Whether the item is a branch whose children are loaded when it opens.
13558
+
13559
+ Opening it sends `helix-load`. Add the children to its `children` slot,
13560
+ and remove `lazy` once they are in, as Web Awesome's tree item does. */
13561
+ lazy?: (HelixHeadlessTreeItem["lazy"]) | undefined;
12072
13562
  /** The link's `rel` value, which describes how the linked page relates to this
12073
13563
  one.
12074
13564
 
@@ -12136,6 +13626,8 @@ export type HelixHeadlessTreeItemVueEvents = {
12136
13626
  "helix-before-close": HelixHeadlessTreeItemHelixBeforeCloseElementEvent;
12137
13627
  /** Fired before a branch opens, and cancelable. */
12138
13628
  "helix-before-open": HelixHeadlessTreeItemHelixBeforeOpenElementEvent;
13629
+ /** Fired when a `lazy` item opens, so you can load its children. */
13630
+ "helix-load": HelixHeadlessTreeItemHelixLoadElementEvent;
12139
13631
  /** Fired when the item is chosen, and cancelable. Canceling it changes nothing. */
12140
13632
  "helix-select": HelixHeadlessTreeItemHelixSelectElementEvent;
12141
13633
  /** Sent when the branch opens or closes, with `newState` and `oldState`. */
@@ -12198,6 +13690,16 @@ branch as a label; a headless consumer reads the attribute and the
12198
13690
  written here appears in the served markup of every tree anybody renders.
12199
13691
  The resting state is the absence of the attribute, which is `peer`. */
12200
13692
  nesting?: (HelixHeadlessTree["nesting"]) | undefined;
13693
+ /** Whether a reader can check many items. Unset, one item is chosen at a
13694
+ time.
13695
+
13696
+ Optional, so a tree of one choice writes no attribute onto the host. */
13697
+ "selection-mode"?: (HelixHeadlessTree["selectionMode"]) | undefined;
13698
+ /** Whether a reader can check many items. Unset, one item is chosen at a
13699
+ time.
13700
+
13701
+ Optional, so a tree of one choice writes no attribute onto the host. */
13702
+ selectionMode?: (HelixHeadlessTree["selectionMode"]) | undefined;
12201
13703
  /** The text shown and announced when there are no rows and none are loading. */
12202
13704
  "empty-text"?: (HelixHeadlessTree["emptyText"]) | undefined;
12203
13705
  /** The text shown and announced when there are no rows and none are loading. */
@@ -12229,6 +13731,9 @@ Ignored once `active` is written. */
12229
13731
 
12230
13732
  Ignored once `active` is written. */
12231
13733
  defaultActive?: (HelixHeadlessTree["defaultActive"]) | undefined;
13734
+ /** The checked values, as a list, under `selection-mode="multiple"`, and the
13735
+ chosen value alone otherwise. Writing it sets `active`. */
13736
+ values?: (HelixHeadlessTree["values"]) | undefined;
12232
13737
  };
12233
13738
 
12234
13739
  export type HelixHeadlessTreeVueEvents = {
@@ -12358,10 +13863,25 @@ export type HelixHeadlessVideoPlaylistHelixActivateElementEvent =
12358
13863
  /** `helix-before-activate` event type */
12359
13864
  export type HelixHeadlessVideoPlaylistHelixBeforeActivateElementEvent =
12360
13865
  HelixHeadlessVideoPlaylistElementEvent<HelixBeforeActivateEvent>;
13866
+ /** `helix-end` event type */
13867
+ export type HelixHeadlessVideoPlaylistHelixEndElementEvent =
13868
+ HelixHeadlessVideoPlaylistElementEvent<HelixEndEvent>;
12361
13869
 
12362
13870
  export type HelixHeadlessVideoPlaylistVueProps = {
12363
13871
  /** The list's name, read by screen readers. */
12364
13872
  label?: (HelixHeadlessVideoPlaylist["label"]) | undefined;
13873
+ /** What happens when an entry ends with no next one to go to. `one` plays the
13874
+ same entry again, and `all` goes from the last entry back to the first.
13875
+ Absent, the playlist stops on the last entry and sends `helix-end`.
13876
+
13877
+ `all` also lets the next and previous controls go round, so next on the
13878
+ last entry is the first. `one` changes only what an ending does: next and
13879
+ previous still move, being a reader asking for another entry. */
13880
+ repeat?: (HelixHeadlessVideoPlaylist["repeat"]) | undefined;
13881
+ /** Whether the entries play in a random order. The order starts from the
13882
+ entry that is current, and holds until shuffle is turned off or an entry
13883
+ arrives or leaves, so previous goes back through what has played. */
13884
+ shuffle?: (HelixHeadlessVideoPlaylist["shuffle"]) | undefined;
12365
13885
  /** The `value` of the current item.
12366
13886
 
12367
13887
  Not `option.active`, which is the option the keyboard is on: that is a
@@ -12386,6 +13906,8 @@ export type HelixHeadlessVideoPlaylistVueEvents = {
12386
13906
  "helix-activate": HelixHeadlessVideoPlaylistHelixActivateElementEvent;
12387
13907
  /** The current entry is about to change. Cancelable: cancel it to keep the current entry. */
12388
13908
  "helix-before-activate": HelixHeadlessVideoPlaylistHelixBeforeActivateElementEvent;
13909
+ /** The last entry finished playing, and the playlist stopped there. Not sent while `repeat` is set. */
13910
+ "helix-end": HelixHeadlessVideoPlaylistHelixEndElementEvent;
12389
13911
  };
12390
13912
 
12391
13913
  /** `HelixHeadlessVideo` component event */
@@ -12404,10 +13926,10 @@ export type HelixHeadlessVideoVueProps = {
12404
13926
  /** Whether the video starts playing on its own. Browsers allow this only while
12405
13927
  it is muted.
12406
13928
 
12407
- Forwarded rather than acted on. Whether an unprompted play is permitted is
12408
- the browser's policy and not this element's, and `play()` already swallows
12409
- the refusal: what follows a refused autoplay is a paused player showing its
12410
- start control, which is the correct thing to be looking at. */
13929
+ Forwarded to the video, which decides. Whether an unprompted play is
13930
+ permitted is the browser's policy, and what follows a refused autoplay is a
13931
+ paused player showing its start control, which is the correct thing to be
13932
+ looking at. */
12411
13933
  autoplay?: (HelixHeadlessVideo["autoplay"]) | undefined;
12412
13934
  /** The name of the captions control when the video has one track. The control
12413
13935
  turns that track on and off.
@@ -12641,6 +14163,12 @@ bar: two of the same control is worse than either placement. */
12641
14163
  "pip-label"?: (HelixHeadlessVideo["pipLabel"]) | undefined;
12642
14164
  /** What the control that floats the video over other windows is called. */
12643
14165
  pipLabel?: (HelixHeadlessVideo["pipLabel"]) | undefined;
14166
+ /** The name of the player when `label` is not set. The player is a group, and
14167
+ this is what a screen reader calls it on arriving. */
14168
+ "player-label"?: (HelixHeadlessVideo["playerLabel"]) | undefined;
14169
+ /** The name of the player when `label` is not set. The player is a group, and
14170
+ this is what a screen reader calls it on arriving. */
14171
+ playerLabel?: (HelixHeadlessVideo["playerLabel"]) | undefined;
12644
14172
  /** The name of the play control while pressing it would start the video. */
12645
14173
  "play-label"?: (HelixHeadlessVideo["playLabel"]) | undefined;
12646
14174
  /** The name of the play control while pressing it would start the video. */
@@ -12690,6 +14218,14 @@ nothing in it says "press to watch".
12690
14218
  behind a hero, a grid of eight thumbnails, anything where the video is
12691
14219
  decoration rather than something to start.
12692
14220
 
14221
+ **It is for the pointer, and the bar's Play is for everyone else.** Both
14222
+ play the video, so a keyboard met two stops called "Play" one after the
14223
+ other and a screen reader read the same button twice. The large one is out
14224
+ of the tab order and hidden from assistive technology while the bar is
14225
+ drawn, which is whenever it is: it shows only while the video is not
14226
+ playing, and the bar does not fade then. A press on it leaves focus on the
14227
+ player, so the keys go on working once it has gone.
14228
+
12693
14229
  A value rather than a boolean, so the resting state is the attribute's
12694
14230
  absence: a boolean defaulting to on would have to be spelled as its own
12695
14231
  negation. */
@@ -12707,6 +14243,14 @@ nothing in it says "press to watch".
12707
14243
  behind a hero, a grid of eight thumbnails, anything where the video is
12708
14244
  decoration rather than something to start.
12709
14245
 
14246
+ **It is for the pointer, and the bar's Play is for everyone else.** Both
14247
+ play the video, so a keyboard met two stops called "Play" one after the
14248
+ other and a screen reader read the same button twice. The large one is out
14249
+ of the tab order and hidden from assistive technology while the bar is
14250
+ drawn, which is whenever it is: it shows only while the video is not
14251
+ playing, and the bar does not fade then. A press on it leaves focus on the
14252
+ player, so the keys go on working once it has gone.
14253
+
12710
14254
  A value rather than a boolean, so the resting state is the attribute's
12711
14255
  absence: a boolean defaulting to on would have to be spelled as its own
12712
14256
  negation. */
@@ -12741,17 +14285,69 @@ past the end is the one write the platform answers with an exception. */
12741
14285
  };
12742
14286
 
12743
14287
  export type HelixHeadlessVideoVueEvents = {
12744
- /** The video reached its end. Relayed from the inner video, since the native event does not cross the shadow boundary. */
14288
+ /** The media stopped loading before it finished, without an error. */
14289
+ abort: HelixHeadlessVideoElementEvent;
14290
+ /** Enough has loaded to start playing. */
14291
+ canplay: HelixHeadlessVideoElementEvent;
14292
+ /** Enough has loaded to play to the end without stopping, at the current rate. */
14293
+ canplaythrough: HelixHeadlessVideoElementEvent;
14294
+ /** The duration changed, which it does once the metadata is in. */
14295
+ durationchange: HelixHeadlessVideoElementEvent;
14296
+ /** The media was reset, as when `src` changes. */
14297
+ emptied: HelixHeadlessVideoElementEvent;
14298
+ /** The video reached its end. */
12745
14299
  ended: HelixHeadlessVideoElementEvent;
14300
+ /** The source could not be loaded or played. The player shows `error-label` as well. */
14301
+ error: HelixHeadlessVideoElementEvent;
12746
14302
  /** The next video was requested. Load it in response. */
12747
14303
  "helix-next": HelixHeadlessVideoHelixNextElementEvent;
12748
14304
  /** The previous video was requested. Load it in response. */
12749
14305
  "helix-previous": HelixHeadlessVideoHelixPreviousElementEvent;
12750
- /** Playback paused. Relayed from the inner video. */
14306
+ /** The frame at the current position has loaded. */
14307
+ loadeddata: HelixHeadlessVideoElementEvent;
14308
+ /** The duration and the size of the video are known. */
14309
+ loadedmetadata: HelixHeadlessVideoElementEvent;
14310
+ /** The video started looking for its media. */
14311
+ loadstart: HelixHeadlessVideoElementEvent;
14312
+ /** Playback paused. */
12751
14313
  pause: HelixHeadlessVideoElementEvent;
12752
- /** Playback started. Relayed from the inner video. */
14314
+ /** Playback was asked to start. */
12753
14315
  play: HelixHeadlessVideoElementEvent;
12754
- };
14316
+ /** Playback started, or started again after waiting for data. */
14317
+ playing: HelixHeadlessVideoElementEvent;
14318
+ /** More of the media has downloaded. */
14319
+ progress: HelixHeadlessVideoElementEvent;
14320
+ /** The playback rate changed. Read `playbackRate`. */
14321
+ ratechange: HelixHeadlessVideoElementEvent;
14322
+ /** The video's own width or height changed. Read `videoWidth` and `videoHeight`. */
14323
+ resize: HelixHeadlessVideoElementEvent;
14324
+ /** A move to a new position finished. */
14325
+ seeked: HelixHeadlessVideoElementEvent;
14326
+ /** A move to a new position started. */
14327
+ seeking: HelixHeadlessVideoElementEvent;
14328
+ /** The browser is trying to load more data and none is arriving. */
14329
+ stalled: HelixHeadlessVideoElementEvent;
14330
+ /** Loading paused on purpose, as when `preload` asks for no more. */
14331
+ suspend: HelixHeadlessVideoElementEvent;
14332
+ /** The position changed. Read `currentTime`. */
14333
+ timeupdate: HelixHeadlessVideoElementEvent;
14334
+ /** The volume or the mute changed. Read `volume` and `muted`. */
14335
+ volumechange: HelixHeadlessVideoElementEvent;
14336
+ /** Playback stopped to wait for more data. */
14337
+ waiting: HelixHeadlessVideoElementEvent;
14338
+ };
14339
+
14340
+ /** `HelixHeadlessVirtualList` component event */
14341
+ export type HelixHeadlessVirtualListElementEvent<E = Event> = TypedEvent<
14342
+ HelixHeadlessVirtualList,
14343
+ E
14344
+ >;
14345
+ /** `helix-load-more` event type */
14346
+ export type HelixHeadlessVirtualListHelixLoadMoreElementEvent =
14347
+ HelixHeadlessVirtualListElementEvent<HelixLoadMoreEvent>;
14348
+ /** `helix-range-change` event type */
14349
+ export type HelixHeadlessVirtualListHelixRangeChangeElementEvent =
14350
+ HelixHeadlessVirtualListElementEvent<HelixRangeChangeEvent>;
12755
14351
 
12756
14352
  export type HelixHeadlessVirtualListVueProps = {
12757
14353
  /** The height of one row, in pixels, used to find the row at a scroll offset.
@@ -12759,7 +14355,8 @@ export type HelixHeadlessVirtualListVueProps = {
12759
14355
  An estimate rather than a measurement while `measured` is off, which is
12760
14356
  right whenever the rows really are one height and is the cheaper of the two. */
12761
14357
  estimate?: (HelixHeadlessVirtualList["estimate"]) | undefined;
12762
- /** The id of the script element that holds the rows as JSON. */
14358
+ /** The id of the script element that holds the items as JSON. `items` wins
14359
+ where both are set. */
12763
14360
  for?: (HelixHeadlessVirtualList["for"]) | undefined;
12764
14361
  /** The list's name, read by screen readers, because only some of its rows
12765
14362
  are rendered at a time.
@@ -12776,9 +14373,27 @@ disagree with itself; measuring is what a set of genuinely different
12776
14373
  heights needs and costs a read of each row as it renders. A list of
12777
14374
  one-line rows should leave this alone. */
12778
14375
  measured?: (HelixHeadlessVirtualList["measured"]) | undefined;
14376
+ /** The items, as an array. Set it as a property.
14377
+
14378
+ Each item is drawn by `renderItem`, or into the row `<template>` by its
14379
+ fields. A new array draws the new rows, so replace the array to change it.
14380
+ Left unset, the list reads the script that `for` names. */
14381
+ items?: (HelixHeadlessVirtualList["items"]) | undefined;
14382
+ /** Draws one item into its row, given the item and its index. Set it as a
14383
+ property.
14384
+
14385
+ It returns what Lit renders: a template from `html`, a string, or a DOM
14386
+ node. The list wraps each result in a `<div>` that carries the row's role
14387
+ and place in the set. Where it is unset, the row `<template>` is used. */
14388
+ renderItem?: (HelixHeadlessVirtualList["renderItem"]) | undefined;
12779
14389
  };
12780
14390
 
12781
- export type HelixHeadlessVirtualListVueEvents = {};
14391
+ export type HelixHeadlessVirtualListVueEvents = {
14392
+ /** Fired when a reader comes within one screen of the last item, once for each length of the set. */
14393
+ "helix-load-more": HelixHeadlessVirtualListHelixLoadMoreElementEvent;
14394
+ /** Fired when the items on screen change, with the new `first` and `last`, which `range` also holds. */
14395
+ "helix-range-change": HelixHeadlessVirtualListHelixRangeChangeElementEvent;
14396
+ };
12782
14397
 
12783
14398
  export type CustomCssProperties = {
12784
14399
  /** The width of an axis, in `ch`, set from the widest number on it. The chart sets it on the axis itself, and only when the categories run along the bottom. In a horizontal chart the axis is a row, one line high. */
@@ -12809,12 +14424,18 @@ export type CustomCssProperties = {
12809
14424
  "--color-picker-swatch"?: (string) | undefined;
12810
14425
  /** The alignment of the cell's column: `start`, `center`, or `end`. Unset when the column sets none. The component writes it on each cell it draws, and the stylesheet reads it. `Table` sets `--table-cell-align` for the same purpose. */
12811
14426
  "--data-table-cell-align"?: (string) | undefined;
14427
+ /** How deep a row is in a tree grid, from 1. The component writes it on each row header cell, and the stylesheet indents by it. */
14428
+ "--data-table-level"?: (string) | undefined;
12812
14429
  /** The column track list, worked out from the columns. The component writes it inline on the element that reads it, so setting it has no effect. Set a column's `width` to change it. */
12813
14430
  "--data-table-template"?: (string) | undefined;
12814
14431
  /** How many month columns are drawn, capped at two. `--date-picker-columns` overrides it. */
12815
14432
  "--date-picker-column-count"?: (string) | undefined;
12816
14433
  /** How thick the ring is drawn, derived from `hole`. */
12817
14434
  "--donut-chart-stroke"?: (string) | undefined;
14435
+ /** How far a swipe, or a snap point, has moved the panel across, in pixels, toward the right. */
14436
+ "--drawer-swipe-x"?: (string) | undefined;
14437
+ /** How far a swipe, or a snap point, has moved the panel down, in pixels. */
14438
+ "--drawer-swipe-y"?: (string) | undefined;
12818
14439
  /** How many rows the strip lays out. The component writes it from the data, and the stylesheet that draws the strip reads it. */
12819
14440
  "--heatmap-rows"?: (string) | undefined;
12820
14441
  /** The tone of the cell it is set on. The component writes it, and the stylesheet that paints the cell reads it. */
@@ -12847,6 +14468,10 @@ export type CustomCssProperties = {
12847
14468
  "--chart-terminus-x"?: (string) | undefined;
12848
14469
  /** Where a series' last reading sits vertically, as a percentage. Written by the component. */
12849
14470
  "--chart-terminus-y"?: (string) | undefined;
14471
+ /** The number of the first row, written where `start` or `reversed` moves it. */
14472
+ "--list-first"?: (string) | undefined;
14473
+ /** What each row adds to the number before it: `1`, or `-1` where `reversed`. */
14474
+ "--list-step"?: (string) | undefined;
12850
14475
  /** How far the needle turns to point north, as an angle. The frame writes it from `bearing`. */
12851
14476
  "--map-needle-turn"?: (string) | undefined;
12852
14477
  /** Where the panel starts, measured from the bar above it. */
@@ -12877,6 +14502,10 @@ export type CustomCssProperties = {
12877
14502
  "--chart-point-y"?: (string) | undefined;
12878
14503
  /** A tick's position along its axis, as a percentage. The component writes it. */
12879
14504
  "--chart-tick"?: (string) | undefined;
14505
+ /** How far along its axis the content is scrolled, from 0 at the start to 1 at the end. Written on each `scrollbar` part, so its thumb inherits it. Counted from the right on a right-to-left page. */
14506
+ "--scroll-area-scroll-fraction"?: (string) | undefined;
14507
+ /** The share of the track the thumb covers, from 0 to 1, which is how much of the content is in view. Written on each `scrollbar` part. */
14508
+ "--scroll-area-thumb-fraction"?: (string) | undefined;
12880
14509
  /** The value as a fraction of the range, 0 to 1. */
12881
14510
  "--slider-fraction"?: (string) | undefined;
12882
14511
  /** Where a range's filled span starts, as a fraction of the track, 0 to 1. */
@@ -12895,6 +14524,8 @@ export type CustomCssProperties = {
12895
14524
  "--table-template"?: (string) | undefined;
12896
14525
  /** How long this message stays, in milliseconds, for a progress hint. */
12897
14526
  "--toast-duration"?: (string) | undefined;
14527
+ /** How far a swipe has moved the message across, in pixels, toward the right. */
14528
+ "--toast-swipe-x"?: (string) | undefined;
12898
14529
  /** How deep this row sits, counting from one as `aria-level` does, for the indent. */
12899
14530
  "--tree-level"?: (string) | undefined;
12900
14531
  /** The media's own aspect ratio, once it is known. `--video-aspect-ratio` overrides it. */
@@ -12909,7 +14540,7 @@ export type CustomCssProperties = {
12909
14540
  // Note: Some tooling expects this augmentation under "@vue/runtime-core", while
12910
14541
  // other docs/examples use "vue". We emit both for compatibility.
12911
14542
  export interface WcToolkitVueGlobalComponents {
12912
- /** Holds its own open state. Used alone, outside an accordion, it works as a disclosure. The trigger sits inside a heading, so a screen reader lists the section with the page's headings. The level is the item's 'heading-level', then the accordion's, then 3. Content stays mounted when the item is closed, so it can animate and its text is present in server-rendered HTML. Closed content has both 'hidden' and 'inert'. 'hidden' collapses it when no stylesheet is loaded. 'inert' keeps it out of the tab order and the accessibility tree after the styled tier's 'display' overrides 'hidden'. */
14543
+ /** Holds its own open state. Used alone, outside an accordion, it works as a disclosure. The trigger sits inside a heading, so a screen reader lists the section with the page's headings. The level is the item's 'heading-level', then the accordion's, then 3. Content stays mounted when the item is closed, so it can animate and its text is present in server-rendered HTML. Closed content has both 'hidden' and 'inert'. 'hidden' collapses it when no stylesheet is loaded. 'inert' keeps it out of the tab order and the accessibility tree after the styled tier's 'display' overrides 'hidden'. Set 'hidden-until-found' and the browser's find in page searches a closed section too: a match opens it, with 'helix-before-open' first, as React Aria's disclosure does. The content is then 'hidden="until-found"' while closed, and not 'inert', since an inert region is never searched. */
12913
14544
  "helix-headless-accordion-item": DefineCustomElement<
12914
14545
  HelixHeadlessAccordionItem,
12915
14546
  HelixHeadlessAccordionItemVueProps,
@@ -12921,19 +14552,19 @@ export interface WcToolkitVueGlobalComponents {
12921
14552
  HelixHeadlessAccordionVueProps,
12922
14553
  HelixHeadlessAccordionVueEvents
12923
14554
  >;
12924
- /** An announcement is a banner above the page header with news about the whole site or session, such as a trial ending, a degraded service, or a change of terms. For a passage inside a document, use 'Callout', which stays where it is placed and cannot be dismissed. The announcement is always a polite live region, whatever its 'tone'. 'role="alert"' is assertive and interrupts a screen reader, so an announcement served with the page would interrupt on every page load. The live region is its own part. When the announcement appears after the page has loaded, the message is written into the region one frame later, so screen readers read it reliably, and the region is emptied seven seconds later, so the message is not in the page twice. When the announcement is in the served HTML, the region stays empty and nothing is read out. The dismiss button fires 'helix-dismiss', and the announcement stays in the document, so remove it in your listener. The event is cancelable, and 'dismiss()' returns 'false' when a listener calls 'preventDefault()'. When your listener removes an announcement whose dismiss button has focus, focus moves to the dismiss button of the announcement beside it. With no other announcement beside it, move focus yourself, for example to the page's main heading. */
14555
+ /** An announcement is a banner above the page header with news about the whole site or session, such as a trial ending, a degraded service, or a change of terms. For a passage inside a document, use 'Callout', which stays where it is placed and cannot be dismissed. The announcement is always a polite live region, whatever its 'tone'. 'role="alert"' is assertive and interrupts a screen reader, so an announcement served with the page would interrupt on every page load. The live region is its own part. When the announcement appears after the page has loaded, the message is written into the region one frame later, so screen readers read it reliably, and the region is emptied seven seconds later, so the message is not in the page twice. When the announcement is in the served HTML, the region stays empty and nothing is read out. The dismiss button fires 'helix-dismiss', and the announcement stays in the document, so remove it in your listener. The event is cancelable, and 'dismiss()' returns 'false' when a listener calls 'preventDefault()'. When your listener removes an announcement whose dismiss button has focus, focus moves to the dismiss button of the announcement beside it. With no other announcement beside it, move focus yourself, for example to the page's main heading. Set 'duration' to dismiss it after a time. The clock stops while the pointer or focus is on the announcement, and continues from what was left, so a reader partway through is not cut off. When the time runs out it sends 'helix-dismiss', as the button does. */
12925
14556
  "helix-headless-announcement": DefineCustomElement<
12926
14557
  HelixHeadlessAnnouncement,
12927
14558
  HelixHeadlessAnnouncementVueProps,
12928
14559
  HelixHeadlessAnnouncementVueEvents
12929
14560
  >;
12930
- /** Tracks whether the page has scrolled and sets the custom state 'scrolled', so the styled tier can lift the bar without a scroll handler of its own. The state is read when the element connects. A fresh load starts at the top, which matches the server markup, and a reload partway down the page is corrected on hydration. The element uses a custom state because an attribute such as 'data-scrolled', written onto its own host, is one the server did not send. A hydrating framework would report a mismatch whenever the page reloads far enough down. 'ElementInternals.states' is not in the DOM, so hydration has nothing to compare. Select the state with ':state(scrolled)'. The page is the window unless 'scroller' names the element that scrolls, for an app shell whose content scrolls inside a container. */
14561
+ /** Tracks whether the page has scrolled and sets the custom state 'scrolled', so the styled tier can lift the bar without a scroll handler of its own. The state is read when the element connects. A fresh load starts at the top, which matches the server markup, and a reload partway down the page is corrected on hydration. The element uses a custom state because an attribute such as 'data-scrolled', written onto its own host, is one the server did not send. A hydrating framework would report a mismatch whenever the page reloads far enough down. 'ElementInternals.states' is not in the DOM, so hydration has nothing to compare. Select the state with ':state(scrolled)'. The page is the window unless 'scroller' names the element that scrolls, for an app shell whose content scrolls inside a container. The host is the page's 'banner' landmark. Placed inside 'main', 'article', 'aside', 'nav' or 'section', it is a plain box instead, as a native '<header>' is there, so a header inside a card or a pane does not add a second banner. A server cannot see the ancestors, so it serves the banner and the browser corrects it when the element connects. */
12931
14562
  "helix-headless-app-header": DefineCustomElement<
12932
14563
  HelixHeadlessAppHeader,
12933
14564
  HelixHeadlessAppHeaderVueProps,
12934
14565
  HelixHeadlessAppHeaderVueEvents
12935
14566
  >;
12936
- /** Shows how a total is made up. Each numeric column of the table is a part, the parts add up to the total at each reading, and the top edge is that total. The thickness of a band is that part's amount. Use 'LineChart' with 'area' to show how each series moved: it fills each series from the floor separately, so the fills overlap. Use this chart to show the composition: it stacks the series. **The value axis always starts at zero**, as in 'BarChart', because a band's thickness is its value. For the same reason there is no streamgraph mode, which moves the baseline. To show how the composition changed, set 'share'. Band edges are straight between readings by default. A smoothed curve through one sum can dip below the curve through the sum beneath it, which draws a part as less than zero. Other curves: - 'curve="smooth"': for a stack read as an overall shape. - 'curve="step"': holds each reading and jumps at the midpoint, so stacked edges stay in order, as with 'straight'. Use it for a quantity that changes at a moment, such as a headcount or a price. 'share' draws each reading as 100 percent, so the top edge is flat and the bands show each part's share. Use it to see which part grew. The default shows whether the total grew. The drawing is 'aria-hidden'. The text summary gives the latest reading's total and each part's share of it, and the table beside the chart has every number. Every numeric column is a part, so leave a total column out of the table the chart reads, or it is counted twice. A negative reading is drawn as zero. */
14567
+ /** Shows how a total is made up. Each numeric column of the table is a part, the parts add up to the total at each reading, and the top edge is that total. The thickness of a band is that part's amount. Use 'LineChart' with 'area' to show how each series moved: it fills each series from the floor separately, so the fills overlap. Use this chart to show the composition: it stacks the series. **The value axis always starts at zero**, as in 'BarChart', because a band's thickness is its value. For the same reason there is no streamgraph mode, which moves the baseline. To show how the composition changed, set 'share'. Band edges are straight between readings by default. A smoothed curve through one sum can dip below the curve through the sum beneath it, which draws a part as less than zero. Other curves: - 'curve="smooth"': for a stack read as an overall shape. - 'curve="step"': holds each reading and jumps at the midpoint, so stacked edges stay in order, as with 'straight'. Use it for a quantity that changes at a moment, such as a headcount or a price. 'share' draws each reading as 100 percent, so the top edge is flat and the bands show each part's share. Use it to see which part grew. The default shows whether the total grew. The drawing is hidden from screen readers. The text summary gives the latest reading's total and each part's share of it, and the table beside the chart has every number. **The plot is read by key.** It takes focus, named by 'label' or the caption. The left and right arrows move from reading to reading, Home and End go to the first and the last, and the up and down arrows move among the series of a reading. The tooltip follows, the 'live' part says the reading in words, and Escape puts the tooltip away. Every numeric column is a part, so leave a total column out of the table the chart reads, or it is counted twice. A negative reading is drawn as zero. */
12937
14568
  "helix-headless-area-chart": DefineCustomElement<
12938
14569
  HelixHeadlessAreaChart,
12939
14570
  HelixHeadlessAreaChartVueProps,
@@ -12951,13 +14582,13 @@ export interface WcToolkitVueGlobalComponents {
12951
14582
  HelixHeadlessAvatarVueProps,
12952
14583
  HelixHeadlessAvatarVueEvents
12953
14584
  >;
12954
- /** Badge wraps the element it decorates and pins an indicator to its corner, so the wrapped element keeps its place in the layout. What the indicator shows depends on 'value': - A 'value' of zero shows no indicator. - No 'value' shows a dot. - Any other value shows the value. Above 'max', the indicator shows '{max}+', so its width stays the same as the count grows. A count is announced from its own text, and 'label' replaces that with a fuller name, such as '4 unread'. A dot needs a 'label'. Without one, the dot is a colored circle that screen readers do not announce. **The count is not part of the wrapped control's name.** It is a status of its own, read when it changes and when a reader moves to it, so focusing a button inside a badge announces the button's name alone. Where the count belongs in that name, write it into the control's own label, such as 'aria-label="Inbox, 8 unread"' on a button that reads "Inbox". The badge cannot add it: a reference from the control to the count would point into the badge's shadow root, which the platform does not allow. */
14585
+ /** Badge wraps the element it decorates and pins an indicator to its corner, so the wrapped element keeps its place in the layout. What the indicator shows depends on 'value': - A 'value' of zero shows no indicator. - No 'value' shows a dot. - Any other value shows the value. Above 'max', the indicator shows '{max}+', so its width stays the same as the count grows. A count is announced from its own text, and 'label' replaces that with a fuller name, such as '4 unread'. A dot needs a 'label'. Without one, the dot is a colored circle that screen readers do not announce. **A badge wrapped around a control is not part of the control's name.** It is a status of its own, read when it changes and when a reader moves to it, so focusing a button inside a badge announces the button's name alone. A reference from the control to the count would point into the badge's shadow root, which the platform does not allow. **Put the badge inside the control to have its count read with the control's name**, as Web Awesome and Shoelace do: '<button>Inbox <helix-badge value="8" label="8 unread"></helix-badge></button>' is the button "Inbox 8 unread", and stays current as the count changes. The styled tier's 'placement="inline"' draws the mark in the line for that case. */
12955
14586
  "helix-headless-badge": DefineCustomElement<
12956
14587
  HelixHeadlessBadge,
12957
14588
  HelixHeadlessBadgeVueProps,
12958
14589
  HelixHeadlessBadgeVueEvents
12959
14590
  >;
12960
- /** Every bar is measured from zero, and no property changes the baseline, because a bar's length is its value. To show the differences between values, use a line chart. The labels are HTML beside the drawing. An '<svg>' that fills its box scales the text inside it: the same 'font-size' renders at 10px in a narrow chart and 43px in a wide one, and SVG has no setting that keeps text at one size the way 'vector-effect' does for strokes. The table is the accessible representation, and the drawing is 'aria-hidden', so screen reader users get the numbers themselves. The 'summary' part names the chart, from 'label' or the table's caption, and gives each series' highest reading. The component writes the custom properties below with numbers it computes, and the stylesheet that draws the chart reads them. Do not set them yourself. */
14591
+ /** Every bar is measured from zero, and no property changes the baseline, because a bar's length is its value. To show the differences between values, use a line chart. The labels are HTML beside the drawing. An '<svg>' that fills its box scales the text inside it: the same 'font-size' renders at 10px in a narrow chart and 43px in a wide one, and SVG has no setting that keeps text at one size the way 'vector-effect' does for strokes. The table is the accessible representation, and the drawing is hidden from screen readers, so they get the numbers themselves. The 'summary' part names the chart, from 'label' or the table's caption, and gives each series' highest reading. **The plot is read by key.** It takes focus, named by 'label' or the caption. The arrows along the categories move from one to the next, which is left and right for columns and up and down for 'orientation="horizontal"'. Home and End go to the first and the last, and the other pair of arrows moves among the series of a category. The tooltip follows, the 'live' part says the reading in words, and Escape puts the tooltip away. The component writes the custom properties below with numbers it computes, and the stylesheet that draws the chart reads them. Do not set them yourself. */
12961
14592
  "helix-headless-bar-chart": DefineCustomElement<
12962
14593
  HelixHeadlessBarChart,
12963
14594
  HelixHeadlessBarChartVueProps,
@@ -12975,7 +14606,7 @@ export interface WcToolkitVueGlobalComponents {
12975
14606
  HelixHeadlessBreadcrumbVueProps,
12976
14607
  HelixHeadlessBreadcrumbVueEvents
12977
14608
  >;
12978
- /** The host is the navigation landmark, named "Breadcrumb" by default. An 'aria-label' on the host names the trail instead, and so does 'label'. When a page has more than one navigation landmark, screen reader users choose between them by name. The '<ol>' has an explicit 'role="list"', because Safari removes list semantics from a list with 'list-style: none', and the trail always hides its markers. The items are slotted directly, so they are '<ol>' children in the flat tree, and each item sets 'role="listitem"' on itself. The trail does not measure itself, and you write its overflow in markup: put the crumb that holds the folded items where the gap should appear. */
14609
+ /** The host is the navigation landmark, named "Breadcrumb" by default. An 'aria-label' on the host names the trail instead, and so does 'label'. When a page has more than one navigation landmark, screen reader users choose between them by name. The '<ol>' has an explicit 'role="list"', because Safari removes list semantics from a list with 'list-style: none', and the trail always hides its markers. The items are slotted directly, so they are '<ol>' children in the flat tree, and each item sets 'role="listitem"' on itself. The trail does not measure itself, and you write its overflow in markup: put the crumb that holds the folded items where the gap should appear. A trail built from data, such as a router's matched routes, takes 'items': an array of '{ label, href }', drawn as crumbs in order, the last one as the current page. Slotted crumbs follow them. Use one way or the other in a trail. */
12979
14610
  "helix-headless-breadcrumbs": DefineCustomElement<
12980
14611
  HelixHeadlessBreadcrumbs,
12981
14612
  HelixHeadlessBreadcrumbsVueProps,
@@ -12987,13 +14618,13 @@ export interface WcToolkitVueGlobalComponents {
12987
14618
  HelixHeadlessButtonGroupVueProps,
12988
14619
  HelixHeadlessButtonGroupVueEvents
12989
14620
  >;
12990
- /** Renders a real '<button>', so activation, focus, and other browser behavior come from the platform. **It never renders an anchor.** A router renders its own '<a>' to intercept a click, and it cannot render one inside the button's shadow root. For a link that looks like a button, use the base layer recipe on your own anchor: '<Link data-button="solid">' draws the same control. 'delegatesFocus' moves focus to the inner control. It is serialized into the server markup, so the button is reachable by keyboard before any JavaScript loads. The inner control is always 'type="button"', because a '<button type="submit">' inside a shadow root cannot submit a form outside it. To submit, the button calls 'requestSubmit()' on its form, which runs validation, unlike 'submit()'. A 'submit' listener reads 'event.submitter' as 'null', because the platform accepts only a native submit button there. The button's 'name' and 'value' are in the form data, so read them from 'new FormData(form)' to tell two submit buttons apart. As the first submit button in its form, it is the form's default button: Enter in a text field of the form presses it, as it presses a native one. */
14621
+ /** Renders a real '<button>', so activation, focus, and other browser behavior come from the platform. **It never renders an anchor.** A router renders its own '<a>' to intercept a click, and it cannot render one inside the button's shadow root. For a link that looks like a button, use the base layer recipe on your own anchor: '<Link data-button="solid">' draws the same control. 'delegatesFocus' moves focus to the inner control. It is serialized into the server markup, so the button is reachable by keyboard before any JavaScript loads. The inner control is always 'type="button"', because a '<button type="submit">' inside a shadow root cannot submit a form outside it. To submit, the button calls 'requestSubmit()' on its form, which runs validation, unlike 'submit()'. A 'submit' listener reads 'event.submitter' as 'null', because the platform accepts only a native submit button there. The button's 'name' and 'value' are in the form data, so read them from 'new FormData(form)' to tell two submit buttons apart. As the first submit button in its form, it is the form's default button: Enter in a text field of the form presses it, as it presses a native one. Set 'pending' while the action a press started is still running. The button keeps focus and refuses presses, and a reader on it hears 'pending-label'. */
12991
14622
  "helix-headless-button": DefineCustomElement<
12992
14623
  HelixHeadlessButton,
12993
14624
  HelixHeadlessButtonVueProps,
12994
14625
  HelixHeadlessButtonVueEvents
12995
14626
  >;
12996
- /** 'tone' is on the headless tier because it carries meaning. It picks the icon and the icon region's accessible name, so a screen reader announces "Error" for an error callout whether or not the color is seen. Set 'tone-label' to say the name in another language. The icon is the fallback content of a slot. Slot your own icon to replace it, and the default disappears with no extra check. The tone's name stays on the region around it. A callout sets a passage apart inside a document and is read where it sits. For page-level chrome above the masthead that is a live region and can be dismissed, use 'Announcement'. */
14627
+ /** 'tone' is on the headless tier because it carries meaning. It picks the icon and the icon region's accessible name, so a screen reader announces "Error" for an error callout whether or not the color is seen. Set 'tone-label' to say the name in another language. The icon is the fallback content of a slot. Slot your own icon to replace it, and the default disappears with no extra check. The tone's name stays on the region around it. Set 'dismissible' for a note a reader may put away, as Shoelace's 'closable' alert does. The button fires 'helix-dismiss' and the callout stays until a listener removes it, so the page decides whether it comes back. A callout sets a passage apart inside a document and is read where it sits. For page-level chrome above the masthead that is a live region and can be dismissed, use 'Announcement'. */
12997
14628
  "helix-headless-callout": DefineCustomElement<
12998
14629
  HelixHeadlessCallout,
12999
14630
  HelixHeadlessCalloutVueProps,
@@ -13017,37 +14648,37 @@ export interface WcToolkitVueGlobalComponents {
13017
14648
  HelixHeadlessCanvasVueProps,
13018
14649
  HelixHeadlessCanvasVueEvents
13019
14650
  >;
13020
- /** The header, body, and footer regions are slots, because they have no state, behavior, or API of their own. You bring your own markup, so a title can be a real '<h2>'. The host is the surface. The element itself takes the border, the radius, and the grid, so you style 'Card' directly and there is no wrapper part to reach through with '::part'. Name the card with 'aria-label' or 'aria-labelledby'. These are the only names that work with server rendering, because reading a title from the light DOM needs a DOM, and the server has none. */
14651
+ /** The header, body, and footer regions are slots, because they have no state, behavior, or API of their own. You bring your own markup, so a title can be a real '<h2>'. The host is the surface. The element itself takes the border, the radius, and the grid, so you style 'Card' directly and there is no wrapper part to reach through with '::part'. Name the card with 'aria-label' or 'aria-labelledby'. These are the only names that work with server rendering, because reading a title from the light DOM needs a DOM, and the server has none. **A named card is a group**, so a reader entering it hears its name; an unnamed one has no role, since a group with no name only adds "group" to what a reader says. 'header-actions' and 'footer-actions' hold controls at the end of the header's and the footer's line, as Web Awesome's card does. While one holds something, its line is a 'header-row' or 'footer-row' part; otherwise there is no wrapper and every region is a bare slot. A server cannot see slotted content, so served actions sit on their own line until the script runs. */
13021
14652
  "helix-headless-card": DefineCustomElement<
13022
14653
  HelixHeadlessCard,
13023
14654
  HelixHeadlessCardVueProps,
13024
14655
  HelixHeadlessCardVueEvents
13025
14656
  >;
13026
- /** The track is a scroll container with scroll snapping, so dragging, trackpad swipes, and the browser's momentum scrolling all work. The controls scroll the track. Slides are your own elements, and the carousel writes nothing onto them. It renders a pane for each slide with 'role="group"', 'aria-roledescription="slide"', and a name that gives the slide's position in the set, and assigns the slide into it. A screen reader announces the position, and a slide that is a link stays a link. See 'assign'. **Rotation stops on focus and on hover, and stays stopped** until the user starts it again, as the APG requires. The rotation control is labeled with the action it performs and is first in the tab order. Rotation goes on from the last slide to the first, with or without 'loop', which is about the reader's own moves. A move the reader makes is announced, the slide's position read from a polite live region. While the carousel rotates the region is off, so a screen reader is not interrupted every few seconds. The indicators are one tab stop. The arrow keys along the track move between them, Up and Down on a vertical carousel, and Home and End go to the first and the last. Without 'loop', Previous on the first slide and Next on the last are marked 'aria-disabled'. */
14657
+ /** The track is a scroll container with scroll snapping, so dragging, trackpad swipes, and the browser's momentum scrolling all work. The controls scroll the track. Slides are your own elements, and the carousel writes nothing onto them. It renders a pane for each slide with 'role="group"', 'aria-roledescription="slide"', and a name that gives the slide's position in the set, and assigns the slide into it. A screen reader announces the position, and a slide that is a link stays a link. See 'assign'. **Rotation stops on focus and on hover, and stays stopped** until the user starts it again, as the APG requires. The rotation control is labeled with the action it performs and is first in the tab order. Rotation goes on from the last slide to the first, with or without 'loop', which is about the reader's own moves. A move the reader makes is announced, the slide's position read from a polite live region. While the carousel rotates the region is off, so a screen reader is not interrupted every few seconds. The indicators are one tab stop. The arrow keys along the track move between them, Up and Down on a vertical carousel, and Home and End go to the first and the last. Without 'loop', Previous on the first slide and Next on the last are marked 'aria-disabled'. **'mouse-drag' lets a mouse drag the track**, which otherwise only a touch screen, a trackpad, or the scroll wheel moves. The drag follows the pointer with snapping off and settles on the nearest slide when it is let go, and that move is announced and refusable like a press of Next. A link in a slide is not followed at the end of a drag. The glyphs on Previous and Next can be replaced by slotting an icon of your own into 'previous-icon' and 'next-icon'. */
13027
14658
  "helix-headless-carousel": DefineCustomElement<
13028
14659
  HelixHeadlessCarousel,
13029
14660
  HelixHeadlessCarouselVueProps,
13030
14661
  HelixHeadlessCarouselVueEvents
13031
14662
  >;
13032
- /** The composer is a separate element so you can replace it. If you need attachments, slash commands, or a model picker, replace the composer and keep the transcript. By default, Enter sends and Shift+Enter starts a new line, the convention in messaging apps. Document editors mostly use the opposite, so 'submit-on' takes 'enter' or 'button'. Use 'button' for a long-form composer. The composer clears only when no listener cancels the send, so the text is kept when you cancel a send that failed. */
14663
+ /** The composer is a separate element so you can replace it. If you need attachments, slash commands, or a model picker, replace the composer and keep the transcript. By default, Enter sends and Shift+Enter starts a new line, the convention in messaging apps. Document editors mostly use the opposite, so 'submit-on' takes 'enter' or 'button'. Use 'button' for a long-form composer. The composer clears only when no listener cancels the send, so the text is kept when you cancel a send that failed. **In a form, the draft is the composer's value**, submitted under 'name'. A form reset puts back the 'value' the markup declared, and a '<fieldset disabled>' turns the composer off. Sending is still 'helix-send', and it does not submit the form. **'typing' says whether the user is writing**, and 'helix-typing' is sent each time it changes: when they start, and when they send or stop for 'typing-timeout' milliseconds. Pass it on to show "is typing" to the other side. */
13033
14664
  "helix-headless-chat-composer": DefineCustomElement<
13034
14665
  HelixHeadlessChatComposer,
13035
14666
  HelixHeadlessChatComposerVueProps,
13036
14667
  HelixHeadlessChatComposerVueEvents
13037
14668
  >;
13038
- /** A chat message carries its state: sending, arrived, streaming, or failed. A failed message has a retry control in the message, which fires 'helix-send'. 'streaming' is the state the others are arranged around. A streaming message changes height on every frame, so it is marked 'aria-busy' while it arrives and announced once when it settles. A screen reader cannot follow a stream read out character by character. */
14669
+ /** A chat message carries its state: sending, arrived, streaming, or failed. A failed message has a retry control in the message, which fires 'helix-send'. 'streaming' is the state the others are arranged around. A streaming message changes height on every frame, so it is marked 'aria-busy' while it arrives and announced once when it settles. A screen reader cannot follow a stream read out character by character. A screen reader names the turn by its author and its time, such as "You, 2 minutes ago". The author is 'author-label', or "You" for 'me', or the 'author' itself where it is a name; give a turn by 'them' an 'author-label' to name it. The chat it sits in holds the sentence and the word for 'me', so a page in another language sets them once there. The time moves on by itself, so "now" becomes "1 minute ago" while the page is open. */
13039
14670
  "helix-headless-chat-message": DefineCustomElement<
13040
14671
  HelixHeadlessChatMessage,
13041
14672
  HelixHeadlessChatMessageVueProps,
13042
14673
  HelixHeadlessChatMessageVueEvents
13043
14674
  >;
13044
- /** Chat has no positioning, no backdrop, and no trigger, so you can put it in any container, such as a page, a sidebar, a modal, or a floating panel. The transcript stays pinned to the bottom, including while a streamed answer grows, until the user scrolls more than 'threshold' away from it. With 'history' set to 'more', reaching the top fires 'helix-history'. Set 'loading' while you fetch, then prepend the older turns. The turn the user was reading stays in place on screen. The log is 'aria-live="off"'. A separate status region announces each new turn once, when it has finished arriving. It skips the user's own turns unless they failed to send, turns loaded as history, and the turns already there when the transcript opened. Pass the turns as children or as 'turns' data. Do not use both. Children render from the server and suit most conversations. 'turns' draws a long transcript one window at a time, so the log needs a block size of its own. A turn from 'turns' is drawn in the chat's shadow root, so style it through the forwarded 'message-*' parts. A turn by 'me' also gets each part with '-mine' added, and the turn's state adds 'message-meta-failed', 'message-content-sending', and 'message-content-streaming'. To style each participant differently, pass the turns as children. */
14675
+ /** Chat has no positioning, no backdrop, and no trigger, so you can put it in any container, such as a page, a sidebar, a modal, or a floating panel. The transcript stays pinned to the bottom, including while a streamed answer grows, until the user scrolls more than 'threshold' away from it. With 'history' set to 'more', reaching the top fires 'helix-history'. Set 'loading' while you fetch, then prepend the older turns. The turn the user was reading stays in place on screen. The log is 'aria-live="off"'. A separate status region announces each new turn once, when it has finished arriving. It skips the user's own turns unless they failed to send, turns loaded as history, and the turns already there when the transcript opened. Pass the turns as children or as 'turns' data. Do not use both. Children render from the server and suit most conversations. 'turns' draws a long transcript one window at a time, so the log needs a block size of its own. **A conversation is built from three elements.** The chat holds the transcript, a 'Chat.Message' stands for each turn, and a 'Chat.Composer' sits in the 'composer' slot. When the user sends, 'helix-send' reaches the chat: add their turn with 'author="me"' and 'state="sending"', then set 'state' to 'sent' or 'failed' when your server answers. Add the reply as a turn with 'state="streaming"', write its text as it arrives, and set 'state' to 'sent' when it is complete. While the user types, the composer sends 'helix-typing', which you can pass on to the other side. Show the other side's typing in the 'status' slot. A screen reader names each turn by its author and its time, such as "You, 2 minutes ago". Set 'me-label' and 'message-label' to say it in your language, and give each turn by 'them' an 'author-label'. A turn from 'turns' is drawn in the chat's shadow root, so style it through the forwarded 'message-*' parts. A turn by 'me' also gets each part with '-mine' added, and the turn's state adds 'message-meta-failed', 'message-content-sending', and 'message-content-streaming'. To style each participant differently, pass the turns as children. */
13045
14676
  "helix-headless-chat": DefineCustomElement<
13046
14677
  HelixHeadlessChat,
13047
14678
  HelixHeadlessChatVueProps,
13048
14679
  HelixHeadlessChatVueEvents
13049
14680
  >;
13050
- /** The host is the group. It has 'role="group"' through internals, and 'label' names it. Without a name, screen readers announce the checkboxes as separate controls. **Each checkbox submits its own value.** Checkboxes are already form-associated, and a native group is several inputs that share a name, so the group adds no form value of its own. It adds the grouping, a shared 'name' that you write once, and one place to read and write the whole set. 'value' is the checked values, separated by commas, in the order the checkboxes are written, read from the boxes themselves. Setting it checks exactly those values and unchecks the rest. A checkbox is a member wherever it sits inside the group, in a row or a grid cell of your own, unless another group inside this one holds it. A field of another kind inside the group, such as an "Other" text field, sends its own 'input' and 'change' past the group. **The group shows the message you set in 'feedback'.** It is form-associated only for validity and never calls 'setFormValue', so the browser does not generate a message for it. */
14681
+ /** The host is the group. It has 'role="group"' through internals, and 'label' names it. Without a name, screen readers announce the checkboxes as separate controls. **Each checkbox submits its own value.** Checkboxes are already form-associated, and a native group is several inputs that share a name, so the group adds no form value of its own. It adds the grouping, a shared 'name' that you write once, and one place to read and write the whole set. 'value' is the checked values, separated by commas, in the order the checkboxes are written, read from the boxes themselves. Setting it checks exactly those values and unchecks the rest. 'select-all' draws a box above the set that checks every enabled box, or unchecks them all once every one is checked. It shows a dash while only some are checked, and changes the set through the same cancelable 'helix-before-change' a box does. A checkbox is a member wherever it sits inside the group, in a row or a grid cell of your own, unless another group inside this one holds it. A field of another kind inside the group, such as an "Other" text field, sends its own 'input' and 'change' past the group. **The group shows the message you set in 'feedback'.** It is form-associated only for validity and never calls 'setFormValue', so the browser does not generate a message for it. */
13051
14682
  "helix-headless-checkbox-group": DefineCustomElement<
13052
14683
  HelixHeadlessCheckboxGroup,
13053
14684
  HelixHeadlessCheckboxGroupVueProps,
@@ -13059,7 +14690,7 @@ export interface WcToolkitVueGlobalComponents {
13059
14690
  HelixHeadlessCheckboxVueProps,
13060
14691
  HelixHeadlessCheckboxVueEvents
13061
14692
  >;
13062
- /** Renders a '<pre><code>' pair: 'pre' keeps the whitespace, and 'code' marks it as code. Long lines scroll inside the block and do not wrap, because a line break can be significant in code. A copy button is on by default. Set 'no-copy' to remove it. The button copies the slotted text, so there is no second copy of the code to keep in sync. For a fragment of code inside a sentence, use 'Code'. Set 'diff' to show a change. Put a unified diff, the output of 'git diff' or 'diff -u', in the same slot, and the block draws the lines it added and removed. The block never computes a diff itself. Line numbers come from the hunk headers and are hidden from the accessibility tree. Changed lines are '<ins>' and '<del>' with the '+' and '-' kept as text, so the change does not depend on color. Each file in the patch is its own block under its own name, and its copy button copies the new version of the file. 'variant="split"' shows the old version beside the new, each removal opposite its replacement. On the server, the slot renders as ordinary code, so a diff first appears as the patch text in a '<pre>'. The client makes the same first render, which keeps hydration clean, and draws the diff once it can read the content. Diff mode is experimental. The rest of the family is stable. */
14693
+ /** Renders a '<pre><code>' pair: 'pre' keeps the whitespace, and 'code' marks it as code. Long lines scroll inside the block and do not wrap, because a line break can be significant in code. A copy button is on by default. Set 'no-copy' to remove it. The button copies the slotted text, so there is no second copy of the code to keep in sync. For a fragment of code inside a sentence, use 'Code'. Set 'line-numbers' to number the lines in a gutter beside the code, hidden from the accessibility tree and left out of a copy. Set 'highlight' to a function that turns the code into highlighted markup, such as one wrapping Shiki or Prism, and the block draws what it returns; the code stays in the slot, so the copy button and the page's own text are the code as written. Set 'diff' to show a change. Put a unified diff, the output of 'git diff' or 'diff -u', in the same slot, and the block draws the lines it added and removed. The block never computes a diff itself. Line numbers come from the hunk headers and are hidden from the accessibility tree. Changed lines are '<ins>' and '<del>' with the '+' and '-' kept as text, so the change does not depend on color. Each file in the patch is its own block under its own name, and its copy button copies the new version of the file. 'variant="split"' shows the old version beside the new, each removal opposite its replacement. On the server, the slot renders as ordinary code, so a diff first appears as the patch text in a '<pre>'. The client makes the same first render, which keeps hydration clean, and draws the diff once it can read the content. Diff mode is experimental. The rest of the family is stable. */
13063
14694
  "helix-headless-code-block": DefineCustomElement<
13064
14695
  HelixHeadlessCodeBlock,
13065
14696
  HelixHeadlessCodeBlockVueProps,
@@ -13071,67 +14702,67 @@ export interface WcToolkitVueGlobalComponents {
13071
14702
  HelixHeadlessCodeVueProps,
13072
14703
  HelixHeadlessCodeVueEvents
13073
14704
  >;
13074
- /** A text field with a button that opens 'ColorPicker' in an overlay. 'ColorPicker' provides the square, the ramps, the eyedropper, and the syntax toggle, and you can also use it on its own, flat on the page. Color Input adds the field, the overlay, and the form value, the same arrangement Date Input has with 'DatePicker'. You can type or paste a color into the field without opening the picker. Color Input is a custom control, unlike '<input type="color">', so you can style the panel to match your interface. The field reads every color syntax, including '#f00', '#ff0000', 'rgb(255 0 0)', 'rgba(255,0,0,.5)', 'rgb(255 0 0 / 50%)', and 'hsl(0 100% 50%)'. It writes colors in the syntax that 'format' names. The field shows the value without reformatting it, because half-typed input does not survive a round trip through a formatter. Date Input does the same with dates. Typing sends 'input' on each keystroke and 'change' when you leave the field, as a text field does, so the message about a color it cannot read waits until you are done. Dragging in the panel sends 'input' as the color moves and 'change' when it settles. The component sets '--color-input-swatch', so do not set it yourself. It holds the resolved color, so the styled tier can paint the swatch without parsing the value. */
14705
+ /** A text field with a button that opens 'ColorPicker' in an overlay. 'ColorPicker' provides the square, the ramps, the eyedropper, and the syntax toggle, and you can also use it on its own, flat on the page. Color Input adds the field, the overlay, and the form value, the same arrangement Date Input has with 'DatePicker'. You can type or paste a color into the field without opening the picker. Color Input is a custom control, unlike '<input type="color">', so you can style the panel to match your interface. The field reads every color syntax, including '#f00', '#ff0000', 'rgb(255 0 0)', 'rgba(255,0,0,.5)', 'rgb(255 0 0 / 50%)', and 'hsl(0 100% 50%)'. It writes colors in the syntax that 'format' names. The field shows the value without reformatting it, because half-typed input does not survive a round trip through a formatter. Date Input does the same with dates. Typing sends 'input' on each keystroke and 'change' when you leave the field, as a text field does, so the message about a color it cannot read waits until you are done. Dragging in the panel sends 'input' as the color moves and 'change' when it settles. The trigger and ArrowDown open the panel with focus in the square. Tab moves between the panel's controls without leaving it, and Escape closes it and returns focus to the field. The component sets '--color-input-swatch', so do not set it yourself. It holds the resolved color, so the styled tier can paint the swatch without parsing the value. */
13075
14706
  "helix-headless-color-input": DefineCustomElement<
13076
14707
  HelixHeadlessColorInput,
13077
14708
  HelixHeadlessColorInputVueProps,
13078
14709
  HelixHeadlessColorInputVueEvents
13079
14710
  >;
13080
- /** The picker on its own, with no field around it, for a settings pane or a toolbar. Color Input shows this element in a panel behind a text field. The saturation and brightness square is two '<input type="range">' elements, laid over the square and made invisible, and the handle is drawn from their values. The keyboard behavior, the announcements, and the touch targets come from the platform, and there is no 'role="application"'. The picker works in HSB and derives the value from it. A value set from outside is read into the model once. Black is 'brightness: 0', which has no hue or saturation, so a model read back from the value would turn red into gray after you drag to the bottom of the square and back. The square is one tab stop. In it, the up and down arrows move brightness and the left and right arrows move saturation, and PageUp and PageDown move brightness by ten. The picker sends 'input' as the color moves and 'change' when a drag, a key, a typed value or a preset settles it, as '<input type="color">' does. */
14711
+ /** The picker on its own, with no field around it, for a settings pane or a toolbar. Color Input shows this element in a panel behind a text field. The saturation and brightness square is two '<input type="range">' elements, laid over the square and made invisible, and the handle is drawn from their values. The keyboard behavior, the announcements, and the touch targets come from the platform, and there is no 'role="application"'. The picker works in HSB and derives the value from it. A value set from outside is read into the model once. Black is 'brightness: 0', which has no hue or saturation, so a model read back from the value would turn red into gray after you drag to the bottom of the square and back. The square is one tab stop. In it, the up and down arrows move brightness and the left and right arrows move saturation, and PageUp and PageDown move brightness by ten. The picker sends 'input' as the color moves and 'change' when a drag, a key, a typed value or a preset settles it, as '<input type="color">' does. A screen reader hears the color's name, such as "vibrant red", after the two numbers on the square and after the number on the hue ramp, and each preset is named by its color. Set 'color-words' to speak the names in another language. */
13081
14712
  "helix-headless-color-picker": DefineCustomElement<
13082
14713
  HelixHeadlessColorPicker,
13083
14714
  HelixHeadlessColorPickerVueProps,
13084
14715
  HelixHeadlessColorPickerVueEvents
13085
14716
  >;
13086
- /** The list is a 'Listbox', which handles filtering, the empty state, the highlight, 'aria-activedescendant', and scrolling an option into view. This element handles the field, the panel, and the communication between them. The typed text and the value are separate. The text is a filter: it narrows the list and is then discarded. The value is the option you choose, and the field then shows that option's text. The filter clears on close, so a reopened combobox starts from the whole list. Focus stays in the text field. The arrow keys move through the list with the listbox's public 'navigate' method. 'role="combobox"' is on the input itself. ArrowDown and ArrowUp open the list on the chosen option, and Enter chooses the highlighted one. Space, Home, End and letters edit the text, and Enter in a closed field is left to the form. Emptying the field and leaving it clears a single choice; Escape puts the chosen words back. With 'multiple', each chosen option is a tag in the field with its own remove control. The panel stays open and the filter clears after each choice, so the next choice starts from the whole list. With 'creatable', the combobox offers a create row and fires 'helix-create'. It does not add the option. The options are your light DOM, and your framework would re-render over an element the combobox inserted, so add the option in your event handler. */
14717
+ /** The list is a 'Listbox', which handles filtering, the empty state, the highlight, 'aria-activedescendant', and scrolling an option into view. This element handles the field, the panel, and the communication between them. The typed text and the value are separate. The text is a filter: it narrows the list and is then discarded. The value is the option you choose, and the field then shows that option's text. The filter clears on close, so a reopened combobox starts from the whole list. Focus stays in the text field. The arrow keys move through the list with the listbox's public 'navigate' method. 'role="combobox"' is on the input itself. ArrowDown and ArrowUp open the list on the chosen option, and Enter chooses the highlighted one. As typing narrows the list, a screen reader hears how many options are left, such as "3 results". Space, Home, End and letters edit the text, and Enter in a closed field is left to the form. Emptying the field and leaving it clears a single choice; Escape puts the chosen words back, and a second Escape on the closed field clears the choice. With 'multiple', each chosen option is a tag in the field with its own remove control. The panel stays open and the filter clears after each choice, so the next choice starts from the whole list. With 'creatable', the combobox offers a create row and fires 'helix-create'. It does not add the option. The options are your light DOM, and your framework would re-render over an element the combobox inserted, so add the option in your event handler. */
13087
14718
  "helix-headless-combobox": DefineCustomElement<
13088
14719
  HelixHeadlessCombobox,
13089
14720
  HelixHeadlessComboboxVueProps,
13090
14721
  HelixHeadlessComboboxVueEvents
13091
14722
  >;
13092
- /** The list is a 'Listbox', which handles filtering, the empty state, the match highlight, 'aria-activedescendant', scrolling an option into view, and moving between options with the keyboard. The palette adds a dialog and a hotkey that opens it. The palette keeps no value. It is not a form control and submits nothing. Choosing an option dispatches 'helix-select' once. To remember the last command, store it yourself. The hotkey listener is on the document, so the hotkey works from anywhere on the page, including inside another control's text field, whether or not the palette is open. 'mod' means Command on a Mac and Control elsewhere, so you write one binding. The filter is cleared when the palette closes, so each opening starts from the full list. Combobox and Select do the same. */
14723
+ /** The list is a 'Listbox', which handles filtering, the empty state, the match highlight, 'aria-activedescendant', scrolling an option into view, and moving between options with the keyboard. The palette adds a dialog and a hotkey that opens it. The palette keeps no value. It is not a form control and submits nothing. Choosing an option dispatches 'helix-select' once. To remember the last command, store it yourself. An option with 'href' is a link to a page, which the browser follows once the palette has closed. The hotkey listener is on the document, so the hotkey works from anywhere on the page, including inside another control's text field, whether or not the palette is open. 'mod' means Command on a Mac and Control elsewhere, so you write one binding. The filter is cleared when the palette closes, so each opening starts from the full list. Combobox and Select do the same. As typing narrows the list, a screen reader hears how many commands are left, such as "3 commands". */
13093
14724
  "helix-headless-command": DefineCustomElement<
13094
14725
  HelixHeadlessCommand,
13095
14726
  HelixHeadlessCommandVueProps,
13096
14727
  HelixHeadlessCommandVueEvents
13097
14728
  >;
13098
- /** Copies text to the clipboard and confirms the copy. The platform gives no feedback for a clipboard write, so without a confirmation a press that copies looks the same as one that fails. The confirmation and the event wait for the write to finish. The browser can refuse a clipboard write, for example on an insecure origin, in a document that is not focused, or after a gesture that does not qualify. A refused write leaves the button unchanged. It replaces Button's render and its press, so it never submits a form or sends a command: 'type', 'command', 'commandfor' and the 'form*' overrides have no effect, and the 'start' and 'end' slots and the 'text' part are not rendered. An 'aria-label' on the element names it before a copy, in place of 'label'. */
14729
+ /** Copies text to the clipboard and confirms the copy. The platform gives no feedback for a clipboard write, so without a confirmation a press that copies looks the same as one that fails. The confirmation and the event wait for the write to finish. The browser can refuse a clipboard write, for example on an insecure origin, in a document that is not focused, or after a gesture that does not qualify. A refused write, or nothing to copy, names the button with 'error-label' for the same moment a copy shows 'copied-label', draws a cross, and sends 'helix-copy-error'. 'from' copies from another element on the page: its text, an attribute written 'id[attribute]', or a property written 'id.property', read at the press. It takes the place of 'value'. It replaces Button's render and its press, so it never submits a form or sends a command: 'type', 'command', 'commandfor' and the 'form*' overrides have no effect, and the 'start' and 'end' slots and the 'text' part are not rendered. An 'aria-label' on the element names it before a copy, in place of 'label'. */
13099
14730
  "helix-headless-copy-button": DefineCustomElement<
13100
14731
  HelixHeadlessCopyButton,
13101
14732
  HelixHeadlessCopyButtonVueProps,
13102
14733
  HelixHeadlessCopyButtonVueEvents
13103
14734
  >;
13104
- /** Declare the columns as 'TableColumn' children and pass the rows as an array. The schema stays readable in the HTML, and the rows can be windowed, which ten thousand row elements cannot be. '''html <helix-headless-data-table .rows=${rows} sort="name:asc" page-size="20"> <helix-headless-table-column field="name" sortable>Name</helix-headless-table-column> <helix-headless-table-column field="size" text-align="end" sortable .cell=${bytes}>Size</helix-headless-table-column> </helix-headless-data-table> ''' For a short table written out by hand, use 'Table', which takes rows as markup. Sort and filter apply to the whole set, including the rows on other pages. **The cell values do not server-render.** The headings and the row elements do. Reading a cell needs the columns, and Lit SSR does not pass the column children to this element, so a crawler sees an empty table of the right shape. Use 'Table' when the served HTML has to carry the values. 'selectable' adds a column of checkboxes, keyed on 'row-key': - A row is selected by its key, so the selection survives a sort, a filter, and a page change. - 'selected' holds the chosen keys, comma separated, the same shape 'Listbox' uses for a multiple choice. As with 'sort', writing it applies the selection, and 'default-selected' holds what the markup declared. - The checkbox in the heading selects every row in the result, across pages, and shows a dash while only some are chosen. To act on a single row, such as opening it, put a link or a button in a cell. The grid is one tab stop, and the arrow keys move between its cells, the headings included: - The arrow keys move one cell, and Home and End to the ends of the row. - Control with Home or End moves to the first or the last cell of the grid. - Page Up and Page Down move by the rows that fit in view. - Enter or F2 moves into the cell's controls, and Escape moves back to the cell. Tab moves between the controls of one cell. - Enter or Space on a sortable heading sorts by it, and Space on a row of a 'selectable' table selects it. The controls inside the cells leave the tab order, so Tab moves past the whole grid. A windowed table keeps the row holding focus drawn while the rest scroll away. People can resize and reorder the columns. 'resizable' on a column puts a separator on its edge. 'reorderable' on the table puts a grip on each heading that has a 'field', moved by dragging or with the arrow keys. The new order is written to 'order' as a list of fields. Your markup is not rewritten: the table assigns the headings to its header in that order. 'csv()' returns the result as text: every row that passes the filter, in the order and the columns on screen. Saving the file is up to you. 'DataTable' has no 'columns' attribute. Each 'TableColumn' is part of the schema, so you size a column with its own 'width'. 'Table' has 'columns' because its cells are markup you write and it can have no columns at all. Written on 'DataTable', 'columns' has no effect, so watch for it when you move a table from 'Table' to 'DataTable'. */
14735
+ /** Declare the columns as 'TableColumn' children and pass the rows as an array. The schema stays readable in the HTML, and the rows can be windowed, which ten thousand row elements cannot be. '''html <helix-headless-data-table .rows=${rows} sort="name:asc" page-size="20"> <helix-headless-table-column field="name" sortable>Name</helix-headless-table-column> <helix-headless-table-column field="size" text-align="end" sortable .cell=${bytes}>Size</helix-headless-table-column> </helix-headless-data-table> ''' For a short table written out by hand, use 'Table', which takes rows as markup. Sort and filter apply to the whole set, including the rows on other pages. **The cell values do not server-render.** The headings and the row elements do. Reading a cell needs the columns, and Lit SSR does not pass the column children to this element, so a crawler sees an empty table of the right shape. Use 'Table' when the served HTML has to carry the values. 'selectable' adds a column of checkboxes, keyed on 'row-key': - A row is selected by its key, so the selection survives a sort, a filter, and a page change. - 'selected' holds the chosen keys, comma separated, the same shape 'Listbox' uses for a multiple choice. As with 'sort', writing it applies the selection, and 'default-selected' holds what the markup declared. - The checkbox in the heading selects every row in the result, across pages, and shows a dash while only some are chosen. - Shift with a press on a checkbox selects every row between it and the row last chosen. To act on a single row, such as opening it, put a link or a button in a cell. The grid is one tab stop, and the arrow keys move between its cells, the headings included: - The arrow keys move one cell, and Home and End to the ends of the row. - Control with Home or End moves to the first or the last cell of the grid. - Page Up and Page Down move by the rows that fit in view. - Enter or F2 moves into the cell's controls, and Escape moves back to the cell. Tab moves between the controls of one cell. - Enter or Space on a sortable heading sorts by it, and Space on a row of a 'selectable' table selects it. - In a 'selectable' table, Shift with Up or Down selects the rows it moves across, Shift with Space selects every row from the one last chosen, and Control or Command with A selects every row. - Typing letters moves to the next row whose row header starts with them. Each row is named by its row header, the column marked 'row-header', or the first column with a 'field' where none is. A screen reader says it as a reader moves between rows. **Rows that hold rows.** 'child-field' names the field that holds a row's child rows, and the grid becomes a tree grid. The row header column draws a mark that a press opens and closes a row by, and 'expanded' holds the keys of the open rows, which 'row-key' names. Right on a closed row's header opens it, Left on an open one closes it, and Left on a child moves to its parent. A sort orders the rows under each parent, and a search shows the rows that lead to each match, open. 'load-more' adds a row after the last one with a button that sends 'helix-load-more'. A 'windowed' table also sends it by itself once a reader scrolls within one screen of the end, once for each number of rows. Add the next rows to 'rows', and set 'loading' while they are on their way. The controls inside the cells leave the tab order, so Tab moves past the whole grid. A windowed table keeps the row holding focus drawn while the rest scroll away. People can resize and reorder the columns. 'resizable' on a column puts a separator on its edge. 'reorderable' on the table puts a grip on each heading that has a 'field', moved by dragging or with the arrow keys. The new order is written to 'order' as a list of fields. Your markup is not rewritten: the table assigns the headings to its header in that order. 'csv()' returns the result as text: every row that passes the filter, in the order and the columns on screen. Saving the file is up to you. 'DataTable' has no 'columns' attribute. Each 'TableColumn' is part of the schema, so you size a column with its own 'width'. 'Table' has 'columns' because its cells are markup you write and it can have no columns at all. Written on 'DataTable', 'columns' has no effect, so watch for it when you move a table from 'Table' to 'DataTable'. */
13105
14736
  "helix-headless-data-table": DefineCustomElement<
13106
14737
  HelixHeadlessDataTable,
13107
14738
  HelixHeadlessDataTableVueProps,
13108
14739
  HelixHeadlessDataTableVueEvents
13109
14740
  >;
13110
- /** The calendar is 'DatePicker', which handles months, ranges, disabled days, the first day of the week, and the grid's keyboard behavior. The date input adds the field, the overlay, and the connection between them. You can type a date as well as pick one. The native '<input type="date">' gives a picker and locale formatting but allows almost no styling, so the field is a text field. Typing sends 'input' on each keystroke and 'change' when you leave the field, as a text field does. A date picked from the calendar sends both. The trigger opens the calendar with focus on the selected day, and Escape closes it and returns focus to the field. Focusing the field opens the calendar too, and Tab out of the field closes it again. */
14741
+ /** The calendar is 'DatePicker', which handles months, ranges, disabled days, the first day of the week, and the grid's keyboard behavior. The date input adds the field, the overlay, and the connection between them. You can type a date as well as pick one. The native '<input type="date">' gives a picker and locale formatting but allows almost no styling, so the field is a text field. Typing sends 'input' on each keystroke and 'change' when you leave the field, as a text field does. A date picked from the calendar sends both. The trigger and ArrowDown open the calendar with focus on the selected day, Tab moves between the calendar's controls without leaving it, and Escape closes it and returns focus to the field. A press into the field opens the calendar too. Tab into the field opens nothing, and Tab out of the field closes the calendar. With 'segmented', the field is a row of segments in place of the text: a month, a day and a year in the order the locale writes them, each set with digits or the arrow keys. Alt+Down opens the calendar from a segment. */
13111
14742
  "helix-headless-date-input": DefineCustomElement<
13112
14743
  HelixHeadlessDateInput,
13113
14744
  HelixHeadlessDateInputVueProps,
13114
14745
  HelixHeadlessDateInputVueEvents
13115
14746
  >;
13116
- /** A grid of days that follows the APG date grid pattern: - The grid is one tab stop. Only the focused cell is in the tab sequence. - Arrow keys move by day and by week. - 'PageUp' and 'PageDown' move by month. - 'Home' and 'End' move to the start and end of the week. **Dates are 'YYYY-MM-DD' strings, and every calculation is in UTC**, because a local-time 'Date' shifts across a time zone or daylight-saving boundary. 'month' sets which month the grid shows, separately from 'value', so paging selects nothing and you can control the view. When unset, it follows the first selected date, then the current month. 'mode' sets how many dates are held. Unset holds one, 'range' holds two and marks the dates between them, and 'multiple' toggles each date. All three read and write the same comma-separated 'value'. The month heading is a live region, so a screen reader hears the new month when Previous or Next is pressed. Neither moves past 'min' or 'max', and the keys stop at them too. A value outside the bounds, on a barred day, or off 'step' reports 'rangeUnderflow', 'rangeOverflow', 'badInput' or 'stepMismatch', so a form does not submit it. */
14747
+ /** A grid of days that follows the APG date grid pattern: - The grid is one tab stop. Only the focused cell is in the tab sequence. - Arrow keys move by day and by week. - 'PageUp' and 'PageDown' move by month. - 'Home' and 'End' move to the start and end of the week. **Dates are 'YYYY-MM-DD' strings, and every calculation is in UTC**, because a local-time 'Date' shifts across a time zone or daylight-saving boundary. 'month' sets which month the grid shows, separately from 'value', so paging selects nothing and you can control the view. When unset, it follows the first selected date, then the current month. 'mode' sets how many dates are held. Unset holds one, 'range' holds two and marks the dates between them, and 'multiple' toggles each date. All three read and write the same comma-separated 'value'. 'max-view' makes the heading a button that steps back to the months of the year, and with 'year' to a page of years, as Zag's date picker does. The arrows, Home, End and the page keys move there, Enter or a press chooses, and Escape goes back to the days. 'isDateUnavailable' and 'dayContent' are properties for a script: a rule that bars dates, and what each day shows in place of its number. The month heading is a live region, so a screen reader hears the new month when Previous or Next is pressed. Neither moves past 'min' or 'max', and the keys stop at them too. A value outside the bounds, on a barred day, or off 'step' reports 'rangeUnderflow', 'rangeOverflow', 'badInput' or 'stepMismatch', so a form does not submit it. */
13117
14748
  "helix-headless-date-picker": DefineCustomElement<
13118
14749
  HelixHeadlessDatePicker,
13119
14750
  HelixHeadlessDatePickerVueProps,
13120
14751
  HelixHeadlessDatePickerVueEvents
13121
14752
  >;
13122
- /** Each pair is its own element: the label is the '<dt>' and the value its '<dd>', and a screen reader hears them together however the list lays them out. The value is the default slot, because it varies and is often more than text, such as a tag, an avatar, or a link. The label is almost always text, so it is also a property. */
14753
+ /** Each pair is its own element: the label is the '<dt>' and the value its '<dd>', and a screen reader hears them together however the list lays them out. The value is the default slot, because it varies and is often more than text, such as a tag, an avatar, or a link. The label is almost always text, so it is also a property. **For a label with several values, write each value as a '<dd>'**, such as the authors of a paper. The item then puts your '<dd>' elements after its '<dt>' in place of its own, so a screen reader hears one term and each of its descriptions, as in a native '<dl>'. A server cannot see your elements, so the served item wraps them in its own '<dd>' until it runs. */
13123
14754
  "helix-headless-description-list-item": DefineCustomElement<
13124
14755
  HelixHeadlessDescriptionListItem,
13125
14756
  HelixHeadlessDescriptionListItemVueProps,
13126
14757
  HelixHeadlessDescriptionListItemVueEvents
13127
14758
  >;
13128
- /** Renders a '<dl>', with each item's label as a '<dt>' and its value as a '<dd>', for panels such as "Owner: Ada, Region: us-east, Created: 3 days ago". A screen reader announces which label goes with which value and how many pairs there are. **Each item renders its own term and description**, and the list takes the items through its slot. The accessibility tree is built from the flattened tree, so the pairs appear inside the list. Measured in Chromium, the result matches a plain '<dl>' with the same content node for node, both with a slotted label and with an item set to 'display: contents'. */
14759
+ /** Renders a '<dl>', with each item's label as a '<dt>' and its value as a '<dd>', for panels such as "Owner: Ada, Region: us-east, Created: 3 days ago". A screen reader announces which label goes with which value and how many pairs there are. **Each item renders its own term and description**, and the list takes the items through its slot. The accessibility tree is built from the flattened tree, so the pairs appear inside the list. Measured in Chromium, the result matches a plain '<dl>' with the same content node for node, both with a slotted label and with an item set to 'display: contents'. **A named list is a named group.** A '<dl>' takes no name in ARIA 1.2, so the list becomes a group around it when it has 'label', 'aria-label' or 'aria-labelledby', and the name lands on the group. Unnamed, the host adds nothing to the tree. */
13129
14760
  "helix-headless-description-list": DefineCustomElement<
13130
14761
  HelixHeadlessDescriptionList,
13131
14762
  HelixHeadlessDescriptionListVueProps,
13132
14763
  HelixHeadlessDescriptionListVueEvents
13133
14764
  >;
13134
- /** Renders a native '<dialog>' opened with 'showModal()'. The platform provides: - the top layer, so the dialog is above everything whatever the 'z-index' - a backdrop - closing with Escape - an inert page behind the dialog, unreachable by pointer, keyboard, or virtual cursor 'open' calls 'showModal()', and every way the dialog closes goes through 'requestOpen'. A native dialog closes three ways: the property, Escape, and a '<form method="dialog">' submit. Routing all three through 'requestOpen' keeps your state in step, so the dialog never closes while your state still says it is open, which would leave it impossible to reopen. The dialog's name is 'label' when you set it. Otherwise it is the heading in the 'header' slot, or the elements an 'aria-labelledby' on the host names. While it is open, the page behind it does not scroll. */
14765
+ /** Renders a native '<dialog>' opened with 'showModal()'. The platform provides: - the top layer, so the dialog is above everything whatever the 'z-index' - a backdrop - closing with Escape - an inert page behind the dialog, unreachable by pointer, keyboard, or virtual cursor 'open' calls 'showModal()', and every way the dialog closes goes through 'requestOpen'. A native dialog closes three ways: the property, Escape, and a '<form method="dialog">' submit. Routing all three through 'requestOpen' keeps your state in step, so the dialog never closes while your state still says it is open, which would leave it impossible to reopen. The dialog's name is 'label' when you set it. Otherwise it is the heading in the 'header' slot, or the elements an 'aria-labelledby' on the host names. While it is open, the page behind it does not scroll. The dialog is described by the words at the start of its body: the elements in the default slot before the first one that is or holds a control. A question above a form describes the dialog, and the form does not. An 'aria-describedby' on the host replaces it. Set 'alert' for a dialog that interrupts to ask for an answer, such as a confirmation before a deletion. It is an 'alertdialog', which a screen reader announces with its description as it opens. Set 'dismissible' to draw a close control, labeled by 'dismiss-label'. */
13135
14766
  "helix-headless-dialog": DefineCustomElement<
13136
14767
  HelixHeadlessDialog,
13137
14768
  HelixHeadlessDialogVueProps,
@@ -13143,13 +14774,13 @@ export interface WcToolkitVueGlobalComponents {
13143
14774
  HelixHeadlessDividerVueProps,
13144
14775
  HelixHeadlessDividerVueEvents
13145
14776
  >;
13146
- /** A donut chart divides one whole into parts, so the component reads one column. **The first column of numbers is the series, and each row is a slice.** Other Helix charts take one column per series. **Negative values are skipped.** An arc cannot show a negative number, so those rows are left out and the total is the sum of the remaining rows. The ring is 'aria-hidden'. The 'summary' part names the chart, from 'label' or the table's caption, and gives each slice's share, and the table beside the chart has every amount. */
14777
+ /** A donut chart divides one whole into parts, so the component reads one column. **The first column of numbers is the series, and each row is a slice.** Other Helix charts take one column per series. **Negative values are skipped.** An arc cannot show a negative number, so those rows are left out and the total is the sum of the remaining rows. The ring is hidden from screen readers. The 'summary' part names the chart, from 'label' or the table's caption, and gives each slice's share, and the table beside the chart has every amount. **The ring is read by key.** The plot takes focus, named by 'label' or the caption. Every arrow moves from slice to slice, the right and down arrows to the next, and Home and End go to the first and the last. The tooltip follows, the 'live' part says the slice in words, and Escape puts the tooltip away. */
13147
14778
  "helix-headless-donut-chart": DefineCustomElement<
13148
14779
  HelixHeadlessDonutChart,
13149
14780
  HelixHeadlessDonutChartVueProps,
13150
14781
  HelixHeadlessDonutChartVueEvents
13151
14782
  >;
13152
- /** Uses 'MixinControllerOpen', so 'open', 'defaultOpen', and the 'helix-before-open' and 'helix-before-close' events work the same way as on an accordion item. The drawer is modal by default, which means four things: - focus is trapped inside - Escape and a press outside close it - the page behind is covered - the page behind does not scroll A drawer with 'modal="false"' leaves the page usable and still closes on Escape. The panel's name is 'label' when you set it. Otherwise it is the heading in the 'header' slot, or the elements an 'aria-labelledby' on the host names. Content stays mounted when the drawer is closed, so it is in the server markup and can animate. A closed '<dialog>' is already out of the tab order and the accessibility tree, so the drawer does not write 'inert'. The 'role', 'aria-modal', and the scrim also come from the '<dialog>' element. 'drawer-root.ssr.spec.ts' checks that the panel has no hand-written 'inert' or 'role'. Open the drawer declaratively with the platform's invoker attributes: '''html <helix-headless-button commandfor="nav" command="--toggle">Menu</helix-headless-button> <helix-headless-drawer id="nav">…</helix-headless-drawer> ''' */
14783
+ /** Uses 'MixinControllerOpen', so 'open', 'defaultOpen', and the 'helix-before-open' and 'helix-before-close' events work the same way as on an accordion item. The drawer is modal by default, which means four things: - focus is trapped inside - Escape and a press outside close it - the page behind is covered - the page behind does not scroll A drawer with 'modal="false"' leaves the page usable and still closes on Escape, in a browser without 'closedby' as well. **A touch or a pen swipes it away**, toward the edge it came from, resolved against the writing direction. A swipe past halfway, or a quick one, closes it through the same request as every other way out. 'snap-points' lists the fractions of the panel a reader can leave on screen, such as '0.5 1' for a sheet that rests half open: it opens at the smallest, and a swipe settles at the nearest. While a swipe moves the panel, the distance is written on it as '--drawer-swipe-x' and '--drawer-swipe-y'. 'swipe="false"' turns swiping off. The panel's name is 'label' when you set it. Otherwise it is the heading in the 'header' slot, or the elements an 'aria-labelledby' on the host names. Content stays mounted when the drawer is closed, so it is in the server markup and can animate. A closed '<dialog>' is already out of the tab order and the accessibility tree, so the drawer does not write 'inert'. The 'role', 'aria-modal', and the scrim also come from the '<dialog>' element. 'drawer-root.ssr.spec.ts' checks that the panel has no hand-written 'inert' or 'role'. Open the drawer declaratively with the platform's invoker attributes: '''html <helix-headless-button commandfor="nav" command="--toggle">Menu</helix-headless-button> <helix-headless-drawer id="nav">…</helix-headless-drawer> ''' */
13153
14784
  "helix-headless-drawer": DefineCustomElement<
13154
14785
  HelixHeadlessDrawer,
13155
14786
  HelixHeadlessDrawerVueProps,
@@ -13161,7 +14792,7 @@ export interface WcToolkitVueGlobalComponents {
13161
14792
  HelixHeadlessDrilldownItemVueProps,
13162
14793
  HelixHeadlessDrilldownItemVueEvents
13163
14794
  >;
13164
- /** One panel whose content changes as you move between pages. Use it where there is no room for a second column, such as on a phone, or on a touch screen with no hover to open one. It is a region that stays where you put it, such as inside a drawer, a sidebar, or a settings panel. A 'Menu' opens from a trigger and closes when you are done. 'Menu' can drill into pages too, through the same controller. Rows are places to go and commands to run. Nothing here is form-associated and nothing is submitted. To choose a value, use a 'Listbox'. A row that opens a page contains that page, so the stack holds one reference and reads the rest from the DOM. The behavior lives in 'DrilldownController', which 'Menu' shares. The rows of the page showing are a 'menu', named by 'label' on the top page and by the page's title below it. The back button and the title sit above the menu. Disabled rows stay reachable with the arrow keys, and typing a letter moves to the next row whose name starts with it. */
14795
+ /** One panel whose content changes as you move between pages. Use it where there is no room for a second column, such as on a phone, or on a touch screen with no hover to open one. It is a region that stays where you put it, such as inside a drawer, a sidebar, or a settings panel. A 'Menu' opens from a trigger and closes when you are done. 'Menu' can drill into pages too, through the same controller. Rows are places to go and commands to run. Nothing here is form-associated and nothing is submitted. To choose a value, use a 'Listbox'. A row that opens a page contains that page, so the stack holds one reference and reads the rest from the DOM. The behavior lives in 'DrilldownController', which 'Menu' shares. After each move the host carries 'data-direction', 'forward' into a page or 'back' out of one, so a stylesheet can slide the new page in from the side the reader is going. The styled tier does, and holds still under reduced motion. The rows of the page showing are a 'menu', named by 'label' on the top page and by the page's title below it. The back button and the title sit above the menu. Disabled rows stay reachable with the arrow keys, and typing a letter moves to the next row whose name starts with it. */
13165
14796
  "helix-headless-drilldown": DefineCustomElement<
13166
14797
  HelixHeadlessDrilldown,
13167
14798
  HelixHeadlessDrilldownVueProps,
@@ -13173,7 +14804,7 @@ export interface WcToolkitVueGlobalComponents {
13173
14804
  HelixHeadlessEmptyVueProps,
13174
14805
  HelixHeadlessEmptyVueEvents
13175
14806
  >;
13176
- /** File Input keeps a real '<input type="file">' and makes it invisible. Only a file input opens the file picker: the browser opens it for a click on the input or on a '<label>' that points at it, and a script cannot open it on its own. A custom button would still call '.click()' on a hidden input, and a screen reader would find two controls. The input holds the label, the name, the validity, and the focus, and the visible trigger is a '<label for>'. The label is not focusable. The input is, and Enter and Space on it open the picker. */
14807
+ /** File Input keeps a real '<input type="file">' and makes it invisible. Only a file input opens the file picker: the browser opens it for a click on the input or on a '<label>' that points at it, and a script cannot open it on its own. A custom button would still call '.click()' on a hidden input, and a screen reader would find two controls. The input holds the label, the name, the validity, and the focus, and the visible trigger is a '<label for>'. The label is not focusable. The input is, and Enter and Space on it open the picker. Files arrive from the picker, a drop, or a paste onto the field, and each one is screened: 'accept', 'max-file-size', 'max-files' and your own 'validate' can refuse it. A refused file is left out, 'helix-reject' lists each one with its reason, and a reader hears 'rejected-text' with the names filled in. 'directory' asks the picker for a folder. */
13177
14808
  "helix-headless-file-input": DefineCustomElement<
13178
14809
  HelixHeadlessFileInput,
13179
14810
  HelixHeadlessFileInputVueProps,
@@ -13203,13 +14834,13 @@ export interface WcToolkitVueGlobalComponents {
13203
14834
  HelixHeadlessFilterOperatorVueProps,
13204
14835
  HelixHeadlessFilterOperatorVueEvents
13205
14836
  >;
13206
- /** Tokens are your own elements, slotted in. A filter can be a facet with a prefix, a saved query, or a range, and these belong to your model, so the element does not render tokens from a list of strings. Removing a token is a request the element fires, and you apply it. Combobox works the other way: its tokens show a selection it owns, drawn from the options it was given. 'value' is the typed text. Every keystroke fires 'input' with the text on the element, so a table can narrow as the user types. Tokens are not reported, because they are markup you already hold. Backspace in an empty field fires 'helix-dismiss' on the last token, the same event its remove control fires, so one handler covers the pointer and the keyboard. **Typed filters.** The field parses only the fields you declare. Write 'FilterField' elements, usually inside the 'FilterMenu' slotted into 'start', so the picker and the text share one set. On Enter, the field reads the text against them. 'disposition:refunded,settled' and '-disposition:refunded' fire 'helix-facet' exactly as ticking those values in the picker would, and the parsed text is removed. Everything else stays, so 'refund tuesday disposition:settled' is a filter and a search at once. Helix defines the punctuation and you define every word. 'grammar.ts' has the full rule, so read it before you rely on it. A field with no 'FilterField' in it parses nothing. A field whose values cannot be listed, such as 'assignee:ada', goes directly inside this element, outside the menu. It is not assigned to a slot, so nothing draws it and the menu has no page for it, and the grammar still reads it. **Suggestions.** Slot options into 'suggestions' and the field shows them, moves through them with the arrow keys, and presses one on Enter. The option fires its own 'helix-select', and you decide what choosing it means. Keys before a colon and values after it use the same panel with different contents. 'readFilterText' is exported so you can narrow the panel against partly typed text. The panel opens when it has options and closes when it has none, and a choice does not close it, so after picking a key you see its values next. Use 'selectionStart' and 'setSelectionRange' to write a completion back and put the caret after it, or the next parse reads the wrong term. **State.** Three things have three different owners: - 'value' is the text. The user types, the element applies it, and 'input' reports it. Setting 'value' seeds or corrects the text, and the next keystroke overwrites it, even in React. To control the value, cancel 'helix-before-change' and write the value you want, as with every field in this library. 'default-value' seeds the field. - 'open' is the suggestions panel. Cancel 'helix-before-open' or 'helix-before-close' to control it, and use 'default-open' to seed it. - Tokens are your elements in a slot and hold no state. A token goes when you remove it from your markup after 'helix-dismiss'. A 'FilterChip' naming a declared field works differently, because the picker holds what is ticked and removing the chip alone would leave its value ticked in the hidden menu. Its dismissal is treated as the field being filtered by nothing, so it fires 'helix-facet' like every other change, and the chip goes when the filter goes. */
14837
+ /** Tokens are your own elements, slotted in. A filter can be a facet with a prefix, a saved query, or a range, and these belong to your model, so the element does not render tokens from a list of strings. Removing a token is a request the element fires, and you apply it. Combobox works the other way: its tokens show a selection it owns, drawn from the options it was given. 'value' is the typed text. Every keystroke fires 'input' with the text on the element, so a table can narrow as the user types. A form receives the text under 'name', and then one more entry under 'name' for each token: its 'value' attribute, or for a 'FilterChip', its field and values written 'field:values' as the field reads them typed. Backspace in an empty field fires 'helix-dismiss' on the last token, the same event its remove control fires, so one handler covers the pointer and the keyboard. **Typed filters.** The field parses only the fields you declare. Write 'FilterField' elements, usually inside the 'FilterMenu' slotted into 'start', so the picker and the text share one set. On Enter, the field reads the text against them. 'disposition:refunded,settled' and '-disposition:refunded' fire 'helix-facet' exactly as ticking those values in the picker would, and the parsed text is removed. Everything else stays, so 'refund tuesday disposition:settled' is a filter and a search at once. Helix defines the punctuation and you define every word. 'grammar.ts' has the full rule, so read it before you rely on it. A field with no 'FilterField' in it parses nothing. A field whose values cannot be listed, such as 'assignee:ada', goes directly inside this element, outside the menu. It is not assigned to a slot, so nothing draws it and the menu has no page for it, and the grammar still reads it. **Suggestions.** Slot options into 'suggestions' and the field shows them, moves through them with the arrow keys, and presses one on Enter. The option fires its own 'helix-select', and you decide what choosing it means. Keys before a colon and values after it use the same panel with different contents. 'filter-suggestions' narrows the panel to the options whose words hold the term at the caret, after its colon, ignoring case and accents, and hides the rest. 'readFilterText' is exported so you can narrow it yourself against partly typed text. While the panel is open, a reader hears how many suggestions it offers. The panel opens when it has options and closes when it has none, and a choice does not close it, so after picking a key you see its values next. Use 'selectionStart' and 'setSelectionRange' to write a completion back and put the caret after it, or the next parse reads the wrong term. **State.** Three things have three different owners: - 'value' is the text. The user types, the element applies it, and 'input' reports it. Setting 'value' seeds or corrects the text, and the next keystroke overwrites it, even in React. To control the value, cancel 'helix-before-change' and write the value you want, as with every field in this library. 'default-value' seeds the field. - 'open' is the suggestions panel. Cancel 'helix-before-open' or 'helix-before-close' to control it, and use 'default-open' to seed it. - Tokens are your elements in a slot and hold no state. A token goes when you remove it from your markup after 'helix-dismiss'. A 'FilterChip' naming a declared field works differently, because the picker holds what is ticked and removing the chip alone would leave its value ticked in the hidden menu. Its dismissal is treated as the field being filtered by nothing, so it fires 'helix-facet' like every other change, and the chip goes when the filter goes. */
13207
14838
  "helix-headless-filter-input": DefineCustomElement<
13208
14839
  HelixHeadlessFilterInput,
13209
14840
  HelixHeadlessFilterInputVueProps,
13210
14841
  HelixHeadlessFilterInputVueEvents
13211
14842
  >;
13212
- /** Formats a date with 'Intl' where it is shown, so you do not write the same 'Intl' call and options in your own code. **'elapsed' shows compact relative time for a feed**, such as "42m", "3h", or "1d". After six days it shows a date. In en-US, 'Intl.NumberFormat' narrow renders both 'minute' and 'month' as 'm', so a compact "3m" could mean three minutes or three months. 'elapsedTime' in 'helix/core' does the measurement. **The text refreshes on one timer shared by the page.** Each element schedules an update for when its current reading expires, and an element showing a date schedules none, so a long feed left open costs almost nothing. **The output is always '<time datetime>'**, so copy and paste and scripts parsing the page get the exact instant, whatever the visible text says. A screen reader reads the text, so an 'elapsed' reading is named in full, such as "3 hours ago", and carries the whole date as its title. **A date with no time, such as '2026-08-04', is that day everywhere.** It is formatted in UTC unless 'time-zone' says otherwise, as Date Input and Date Picker format their dates, so a reader west of UTC sees August 4 and not August 3. */
14843
+ /** Formats a date with 'Intl' where it is shown, so you do not write the same 'Intl' call and options in your own code. **'elapsed' shows compact relative time for a feed**, such as "42m", "3h", or "1d". After six days it shows a date. In en-US, 'Intl.NumberFormat' narrow renders both 'minute' and 'month' as 'm', so a compact "3m" could mean three minutes or three months. 'elapsedTime' in 'helix/core' does the measurement. **'relative' shows the same reading in words**, such as "3 hours ago" at 'long', "3 hr. ago" at 'short' and "3h ago" at 'narrow', the styles 'sl-relative-time' offers. 'numeric="always"' says "1 day ago" where the default says "yesterday". **'date-style' and 'time-style' take each locale's own pattern**, such as "Tuesday, August 4, 2026" at 'full', and stand in for the separate fields, which 'Intl' refuses beside them. 'hour-cycle' sets a twelve or twenty-four hour clock either way. **The text refreshes on one timer shared by the page.** Each element schedules an update for when its current reading expires, and an element showing a date schedules none, so a long feed left open costs almost nothing. **The output is always '<time datetime>'**, so copy and paste and scripts parsing the page get the exact instant, whatever the visible text says. A screen reader reads the text, so an 'elapsed' reading is named in full, such as "3 hours ago", and carries the whole date as its title. **A date with no time, such as '2026-08-04', is that day everywhere.** It is formatted in UTC unless 'time-zone' says otherwise, as Date Input and Date Picker format their dates, so a reader west of UTC sees August 4 and not August 3. */
13213
14844
  "helix-headless-format-date": DefineCustomElement<
13214
14845
  HelixHeadlessFormatDate,
13215
14846
  HelixHeadlessFormatDateVueProps,
@@ -13221,7 +14852,7 @@ export interface WcToolkitVueGlobalComponents {
13221
14852
  HelixHeadlessGraphVueProps,
13222
14853
  HelixHeadlessGraphVueEvents
13223
14854
  >;
13224
- /** A grid of cells, each colored by a tone. 'rows="1"' makes a status strip, and 'rows="7"' makes a contribution graph. GitHub's contribution graph uses five discrete levels, which a set of tones covers. Color in a heatmap is per cell. In every other Helix chart, color is per series, so ninety differently colored cells would need ninety series. **The data is a real '<table>' named by 'for'**, as in every Helix chart, and the table is the accessible representation. Hide it with 'data-hidden-visually', and screen readers still read it. A cell takes its tone from its own 'data-tone', or from 'thresholds' and 'tones' applied to its value. 'data-tone' wins, so when you already know a day was degraded, you can set the tone directly. **The headless tier does not resolve tone names.** A tone named 'success' writes '--heatmap-tone: var(--heatmap-tone-success)', and the styled tier or your own stylesheet defines that property. The headless tier does not use 'var(--helix-color-*)'. */
14855
+ /** A grid of cells, each colored by a tone. 'rows="1"' makes a status strip, and 'rows="7"' makes a contribution graph. GitHub's contribution graph uses five discrete levels, which a set of tones covers. Color in a heatmap is per cell. In every other Helix chart, color is per series, so ninety differently colored cells would need ninety series. **The data is a real '<table>' named by 'for'**, as in every Helix chart, and the table is the accessible representation. Hide it with 'data-hidden-visually', and screen readers still read it. A cell takes its tone from its own 'data-tone', or from 'thresholds' and 'tones' applied to its value. 'data-tone' wins, so when you already know a day was degraded, you can set the tone directly. **The headless tier does not resolve tone names.** A tone named 'success' writes '--heatmap-tone: var(--heatmap-tone-success)', and the styled tier or your own stylesheet defines that property. The headless tier does not use 'var(--helix-color-*)'. **The strip is read by key.** It takes focus once it has cells. The up and down arrows move a cell, the left and right arrows move a column, which is a week with 'rows="7"', and Home and End go to the first and the last. The tooltip follows, the 'live' part says the cell's row in words, and Escape puts the tooltip away. */
13225
14856
  "helix-headless-heatmap": DefineCustomElement<
13226
14857
  HelixHeadlessHeatmap,
13227
14858
  HelixHeadlessHeatmapVueProps,
@@ -13233,7 +14864,7 @@ export interface WcToolkitVueGlobalComponents {
13233
14864
  HelixHeadlessIconButtonVueProps,
13234
14865
  HelixHeadlessIconButtonVueEvents
13235
14866
  >;
13236
- /** The icons are Phosphor, drawn on a 256 box at stroke-width 16. Each glyph renders its full inner markup, because most icons are several elements, each with its own stroke and fill. The markup is generated at build time from SVG files in this repository and never comes from user input, so rendering it with 'unsafeSVG' is safe. The '<svg>' carries 'fill="currentColor"'. The generator keeps only the inner markup, and Phosphor sets its fill on the root tag that the generator discards. Without it, the 65 solid glyphs fall back to black and disappear on a dark background. Shapes that set their own 'fill' or 'stroke' are unaffected. A name with no match renders nothing, and the element fires 'error', so a typo in a name can be heard. An icon is decorative by default and hidden from assistive technology. Set 'label' only when the icon is the only carrier of meaning, such as in a button with no text. An 'aria-label' on the element works too: the element is then an image with that name. */
14867
+ /** The icons are Phosphor, drawn on a 256 box at stroke-width 16. Each glyph renders its full inner markup, because most icons are several elements, each with its own stroke and fill. The markup is generated at build time from SVG files in this repository and never comes from user input, so rendering it with 'unsafeSVG' is safe. The '<svg>' carries 'fill="currentColor"'. The generator keeps only the inner markup, and Phosphor sets its fill on the root tag that the generator discards. Without it, the 65 solid glyphs fall back to black and disappear on a dark background. Shapes that set their own 'fill' or 'stroke' are unaffected. **A name is looked up in a registry.** The family's entry registers the whole set, so any name in it draws. The element's own entry, '@fusion.dev/helix-headless/icon/root', registers none: a page that imports it and calls 'registerIcons' with the glyphs it names ships those and no others. 'registerIconLibrary' resolves names under a prefix of your own, such as 'lucide:camera', at once or later, and the element fires 'load' when a glyph that came later is drawn. A glyph registered after the element rendered is drawn then. A name with no match renders nothing, and the element fires 'error', so a typo in a name can be heard. An icon is decorative by default and hidden from assistive technology. Set 'label' only when the icon is the only carrier of meaning, such as in a button with no text. An 'aria-label' on the element works too: the element is then an image with that name. */
13237
14868
  "helix-headless-icon": DefineCustomElement<
13238
14869
  HelixHeadlessIcon,
13239
14870
  HelixHeadlessIconVueProps,
@@ -13251,55 +14882,55 @@ export interface WcToolkitVueGlobalComponents {
13251
14882
  HelixHeadlessInputVueProps,
13252
14883
  HelixHeadlessInputVueEvents
13253
14884
  >;
13254
- /** Renders a '<kbd>' element. Each element holds one key, except when you use 'keys'. For a sequence or a chord, write one element per key and put the separator between them as text, such as "then" or "plus". 'keys' renders the right glyphs for the platform. Given 'mod', it renders '⌘K' on Apple devices and 'Ctrl+K' everywhere else. A '⌘K' typed into a template is wrong for anyone on Windows. The element binds the shortcut only when 'within' is set. By default it draws the key and listens for nothing. */
14885
+ /** Renders a '<kbd>' element. Each element holds one key, except when you use 'keys'. For a sequence or a chord, write one element per key and put the separator between them as text, such as "then" or "plus". 'keys' renders the right glyphs for the platform. Given 'mod', it renders '⌘K' on Apple devices and 'Ctrl+K' everywhere else. A '⌘K' typed into a template is wrong for anyone on Windows. The element binds the shortcut only when 'within' is set. By default it draws the key and listens for nothing. **'for' names the control the shortcut works**, and the key writes its chord onto that control's 'aria-keyshortcuts', in the platform's words ('Meta+K' on an Apple keyboard, 'Control+K' elsewhere), so a screen reader announces the shortcut with the control. A chord the page wrote there itself is left alone, and the key takes back only what it added. */
13255
14886
  "helix-headless-kbd": DefineCustomElement<
13256
14887
  HelixHeadlessKbd,
13257
14888
  HelixHeadlessKbdVueProps,
13258
14889
  HelixHeadlessKbdVueEvents
13259
14890
  >;
13260
- /** Renders a legend as a list, separate from any chart, so any chart can use one. Set 'for' to the table the chart reads, and the legend takes its entries from that table, so the two always match. 'entries' sets how the table is read: - 'series': one entry per data column, named by the header row. Use it for a line or bar chart. - 'categories': one entry per body row. Use it for a donut, whose slices are the rows and which has no axis to name them on. - 'measures': drops the first data column. Use it for a scatter. The table is resolved on the client. There is no server pass. */
14891
+ /** Renders a legend as a list, separate from any chart, so any chart can use one. Set 'for' to the table the chart reads, and the legend takes its entries from that table, so the two always match. 'entries' sets how the table is read: - 'series': one entry per data column, named by the header row. Use it for a line or bar chart. - 'categories': one entry per body row. Use it for a donut, whose slices are the rows and which has no axis to name them on. - 'measures': drops the first data column. Use it for a scatter. The table is resolved on the client. There is no server pass. **'toggles' makes each entry a button that hides its series.** Every chart reading the same table draws without a hidden series and fits its scale to the rest, and the series keeps its color. The button says whether its series is shown with 'aria-pressed'. 'hidden-series' holds the hidden names, so a page can start with some hidden or read which are. */
13261
14892
  "helix-headless-legend": DefineCustomElement<
13262
14893
  HelixHeadlessLegend,
13263
14894
  HelixHeadlessLegendVueProps,
13264
14895
  HelixHeadlessLegendVueEvents
13265
14896
  >;
13266
- /** Wraps one piece of content in the lightbox, such as a picture, a video frame, or a chart. The lightbox shows one item at a time, and the root decides which. An item that is not current is hidden and stays in the DOM, as a 'TabPanel' does. Crawlers can read it, it is in the server-rendered markup, and an '<img>' that has decoded does not decode again when you go back to it. */
14897
+ /** Wraps one piece of content in the lightbox, such as a picture, a video frame, or a chart. The lightbox shows one item at a time, and the root decides which. Each item is a 'group' with the role description 'slide', named by its 'label' or, without one, by its place in the set, such as "2 of 5", as the APG carousel pattern names a slide. The lightbox supplies both words, so they are translated on the lightbox. An item that is not current is hidden and stays in the DOM, as a 'TabPanel' does. Crawlers can read it, it is in the server-rendered markup, and an '<img>' that has decoded does not decode again when you go back to it. */
13267
14898
  "helix-headless-lightbox-item": DefineCustomElement<
13268
14899
  HelixHeadlessLightboxItem,
13269
14900
  HelixHeadlessLightboxItemVueProps,
13270
14901
  HelixHeadlessLightboxItemVueEvents
13271
14902
  >;
13272
- /** The frame around content you open, such as a picture, a video frame, or a chart. The lightbox draws no content of its own. It provides the frame, the keyboard behavior, and text that states the current position in the set. The modal behavior comes from a native '<dialog>' opened with 'showModal()', which provides the top layer, a backdrop, Escape to close, and 'inert' on the rest of the document. Every way of closing goes through 'requestOpen', as in 'Dialog' and 'Drawer'. A lightbox shows one item at a time and has no scrolling track, so 'active' holds the current item, as in 'Tabs'. The arrow keys change the item while focus stays in the dialog. The chrome hides when there is no input, through 'IdleController', and comes back on a pointer move, a key press, or a focus. It stays while focus is on a control in the header or the footer, so a keyboard reader is never left on a control that has gone. 'fullscreen' uses 'FullscreenController', as 'Video' does. While the viewer is open, the page behind it does not scroll. */
14903
+ /** The frame around content you open, such as a picture, a video frame, or a chart. The lightbox draws no content of its own. It provides the frame, the keyboard behavior, and text that states the current position in the set. The modal behavior comes from a native '<dialog>' opened with 'showModal()', which provides the top layer, a backdrop, Escape to close, and 'inert' on the rest of the document. Every way of closing goes through 'requestOpen', as in 'Dialog' and 'Drawer'. A lightbox shows one item at a time and has no scrolling track, so 'active' holds the current item, as in 'Tabs'. The arrow keys change the item while focus stays in the dialog. Set 'controls' for the viewer's own previous, next and close controls, named by 'previous-label', 'next-label' and 'dismiss-label'. Without it, compose the chrome yourself in the 'header' and 'footer' slots, with buttons that send '--previous', '--next' and '--close'. Each item is a slide: a 'group' with the role description in 'slide-role-label', named by its 'label' or by 'slide-label'. A touch or a pen swiped across the picture shows the next or the previous item, the way the line of text runs. The chrome hides when there is no input, through 'IdleController', and comes back on a pointer move, a key press, or a focus. It stays while focus is on a control in the header or the footer, so a keyboard reader is never left on a control that has gone. 'fullscreen' uses 'FullscreenController', as 'Video' does. While the viewer is open, the page behind it does not scroll. */
13273
14904
  "helix-headless-lightbox": DefineCustomElement<
13274
14905
  HelixHeadlessLightbox,
13275
14906
  HelixHeadlessLightboxVueProps,
13276
14907
  HelixHeadlessLightboxVueEvents
13277
14908
  >;
13278
- /** A line chart shows the shape of each series: where the readings went. The scale covers the range of the data. Including zero in the range of a series that moves between 980 and 1020 would flatten the line into a rule across the top of the box. 'BarChart' always starts at zero, because a bar's length is its value. Set 'zero' when the distance from zero is the point. Every series shares one scale, as in the bar chart. 'area' fills each series down to the floor on its own, so the fills overlap. For a total made of parts, use 'Area Chart', which stacks the series so the top edge is the total and each band is a share. The labels are HTML beside the drawing, as in 'BarChart'. Text inside an '<svg>' that fills its box scales with the box, so the same 'font-size' can render at 10px in a narrow chart and 43px in a wide one. The table is the accessible representation, and the drawing is 'aria-hidden'. Screen reader users get the numbers. The 'summary' part names the chart, from 'label' or the table's caption, and gives each series' latest reading. */
14909
+ /** A line chart shows the shape of each series: where the readings went. The scale covers the range of the data. Including zero in the range of a series that moves between 980 and 1020 would flatten the line into a rule across the top of the box. 'BarChart' always starts at zero, because a bar's length is its value. Set 'zero' when the distance from zero is the point. Every series shares one scale, as in the bar chart. 'area' fills each series down to the floor on its own, so the fills overlap. For a total made of parts, use 'Area Chart', which stacks the series so the top edge is the total and each band is a share. The labels are HTML beside the drawing, as in 'BarChart'. Text inside an '<svg>' that fills its box scales with the box, so the same 'font-size' can render at 10px in a narrow chart and 43px in a wide one. The table is the accessible representation, and the drawing is hidden from screen readers, who get the numbers. The 'summary' part names the chart, from 'label' or the table's caption, and gives each series' latest reading. **The plot is read by key.** It takes focus, named by 'label' or the caption. The left and right arrows move from reading to reading, Home and End go to the first and the last, and the up and down arrows move among the series of a reading. The tooltip follows, the 'live' part says the reading in words, and Escape puts the tooltip away. */
13279
14910
  "helix-headless-line-chart": DefineCustomElement<
13280
14911
  HelixHeadlessLineChart,
13281
14912
  HelixHeadlessLineChartVueProps,
13282
14913
  HelixHeadlessLineChartVueEvents
13283
14914
  >;
13284
- /** Provides layout and semantics. The row is a target only when you set 'href'. **'href' makes the row a link.** The component wraps the leading content, the label, and the description in an '<a part="link">' inside the row, as 'Tree.Item' does. An anchor of your own cannot wrap slots it does not own. With the anchor, the row is a target, Enter follows it, middle click opens a new tab, the status bar shows the destination, and all of it works before JavaScript runs. **The 'end' slot sits beside the link, outside it**, so a button or a menu there is a control of its own: a click on it does not follow the link, and its name is not part of the link's. Client-side routing needs your own handling. A router cannot render its anchor inside the shadow root, so to navigate without a page load, intercept the click: the anchor is in 'composedPath()'. Handle only a plain primary click, so native gestures keep working. **For a row that holds controls and is not a destination, use 'data-list-item'.** With 'href' unset, the row is not a link. */
14915
+ /** Provides layout and semantics. The row is a target only when you set 'href'. **'href' makes the row a link.** The component wraps the leading content, the label, and the description in an '<a part="link">' inside the row, as 'Tree.Item' does. An anchor of your own cannot wrap slots it does not own. With the anchor, the row is a target, Enter follows it, middle click opens a new tab, the status bar shows the destination, and all of it works before JavaScript runs. **The 'end' slot sits beside the link, outside it**, so a button or a menu there is a control of its own: a click on it does not follow the link, and its name is not part of the link's. Client-side routing needs your own handling. A router cannot render its anchor inside the shadow root, so to navigate without a page load, intercept the click: the anchor is in 'composedPath()'. Handle only a plain primary click, so native gestures keep working. **For a row that holds controls and is not a destination, use 'data-list-item'.** With 'href' unset, the row is not a link. 'current' marks the row a reader is on, such as the page in a list of pages, with 'aria-current' on its link, or on the row where it has none. **In a list with 'selection-mode', the row is a row of a grid.** The list gives it its role, its place in the one tab stop and, where the list selects, whether it is selected. Its link leaves the tab order there, and Enter follows it from the row. */
13285
14916
  "helix-headless-list-item": DefineCustomElement<
13286
14917
  HelixHeadlessListItem,
13287
14918
  HelixHeadlessListItemVueProps,
13288
14919
  HelixHeadlessListItemVueEvents
13289
14920
  >;
13290
- /** Sets 'role="list"' on the host, so a screen reader counts the rows and announces each one's position, such as "1 of 7". */
14921
+ /** Sets 'role="list"' on the host, so a screen reader counts the rows and announces each one's position, such as "1 of 7". **'selection-mode' makes the list interactive**, in the way of a grid list: a grid of rows that is one tab stop. Up and Down move between rows, Home and End go to the first and the last, and a typed letter goes to the next row starting with it. Left and Right move between the row and the controls in its 'end' slot. 'single' selects one row at a time and 'multiple' any number, with Space or a press, and 'value' holds the selected rows' values, separated by commas. A change asks with 'helix-before-change' and tells with 'change'. Enter acts on the row: it follows the row's link, or sends 'helix-action' from the row. 'none' selects nothing, so a press acts too. A 'disabled' row is passed over. **Leave 'selection-mode' unset for a list a reader reads**, and set it for one a reader chooses from or acts on. The rows of an interactive list are grid rows, which hold controls as a list box option cannot. Give a control in 'end' 'tabindex="-1"' to leave it to the arrow keys and out of the tab order. 'start' and 'reversed' number an ordered list as '<ol>' does. The list writes where the numbers start and which way they run as '--list-first' and '--list-step' on its slot, which the styled tier counts from. Reversed with no 'start' counts down from the number of rows, which a server cannot know, so served markup counts from one until the list runs. */
13291
14922
  "helix-headless-list": DefineCustomElement<
13292
14923
  HelixHeadlessList,
13293
14924
  HelixHeadlessListVueProps,
13294
14925
  HelixHeadlessListVueEvents
13295
14926
  >;
13296
- /** The listbox is the control, and options are its items. A Select is a listbox with a trigger in front of it, a Combobox is a listbox with a text input, and a command palette is a listbox in a dialog. They differ only in what opens the list and what filters it. With 'multiple' set, 'value' is a comma-separated string, like 'Checkbox.Group''s, because 'MixinControllerValue' holds a string. The form receives one entry per selected option, as a native '<select multiple>' sends it, so your server does not split on commas. Selected and active are separate. The selected option is the value. The active option is where the keyboard is: the arrow keys move it, and 'aria-activedescendant' points to it while focus stays on the list. The arrow keys, Home, End, PageUp and PageDown move the highlight, and typed letters move it to the next option whose words start with them. In a single-choice list the highlight is the choice unless 'manual' is set; then Enter, Space or a click chooses. With 'multiple', Space toggles the highlighted option, Shift with an arrow adds the option it moves to, and Control+A or Command+A chooses every option, or none where all are chosen. In a filter field, Space, Home, End and letters edit the text. */
14927
+ /** The listbox is the control, and options are its items. A Select is a listbox with a trigger in front of it, a Combobox is a listbox with a text input, and a command palette is a listbox in a dialog. They differ only in what opens the list and what filters it. With 'multiple' set, 'value' is a comma-separated string, like 'Checkbox.Group''s, because 'MixinControllerValue' holds a string. The form receives one entry per selected option, as a native '<select multiple>' sends it, so your server does not split on commas. Selected and active are separate. The selected option is the value. The active option is where the keyboard is: the arrow keys move it, and 'aria-activedescendant' points to it while focus stays on the list. The arrow keys, Home, End, PageUp and PageDown move the highlight, and typed letters move it to the next option whose words start with them. In a single-choice list the highlight is the choice unless 'manual' is set; then Enter, Space or a click chooses. With 'multiple', Space toggles the highlighted option, Shift with an arrow adds the option it moves to, Shift with Home or End adds every option from the highlight to that end, and Control+A or Command+A chooses every option, or none where all are chosen. In a filter field, Space, Home, End and letters edit the text. An option with 'href' is a link: Enter or a press follows it and selects nothing, and moving onto it with the arrows does not follow it. As a filter narrows the list, a screen reader hears how many options are left, such as "3 results", from 'result-label' and 'results-label'. A filter that leaves none says 'empty-text'. */
13297
14928
  "helix-headless-listbox": DefineCustomElement<
13298
14929
  HelixHeadlessListbox,
13299
14930
  HelixHeadlessListboxVueProps,
13300
14931
  HelixHeadlessListboxVueEvents
13301
14932
  >;
13302
- /** Draws two concentric circles: a track and a moving arc. The track shows the arc as a proportion of a whole, and costs one element. **The center is a slot, empty by default.** Put your logo there once, where your app wraps the loader. When nothing is slotted, nothing extra is rendered. Slotted content does not rotate. Only the arc moves, so a logo stays readable. The role is set on the host through 'ElementInternals'. A 'role' in the shadow root would leave the host itself without a role in the light DOM, and a 'role' attribute on the host would be missing from React server-rendered markup. */
14933
+ /** Draws two concentric circles: a track and a moving arc. The track shows the arc as a proportion of a whole, and costs one element. **The center is a slot, empty by default.** Put your logo there once, where your app wraps the loader. When nothing is slotted, nothing extra is rendered. Slotted content does not rotate. Only the arc moves, so a logo stays readable. The role is set on the host through 'ElementInternals'. A 'role' in the shadow root would leave the host itself without a role in the light DOM, and a 'role' attribute on the host would be missing from React server-rendered markup. **'for' names the region being loaded**, and the loader sets 'aria-busy="true"' on it for as long as the loader is on the page, so a screen reader waits for the region rather than reading it half filled. Two loaders in one region hold it busy until the last one leaves. **'delay' keeps a quick load from flashing a loader.** The loader stays hidden, and silent, for that many milliseconds, and appears only if the work is still going. */
13303
14934
  "helix-headless-loader": DefineCustomElement<
13304
14935
  HelixHeadlessLoader,
13305
14936
  HelixHeadlessLoaderVueProps,
@@ -13353,7 +14984,7 @@ export interface WcToolkitVueGlobalComponents {
13353
14984
  HelixHeadlessMapRasterVueProps,
13354
14985
  HelixHeadlessMapRasterVueEvents
13355
14986
  >;
13356
- /** Wraps a map drawn by MapLibre, Leaflet, or another renderer. The frame adds a name for the map, a column of controls, and a strip for the map credit. Helix does not draw the map itself. The controls are one column, and 'controls' names which ones: 'fullscreen', 'layers', 'tilt', 'zoom', and 'compass', top to bottom. 'zoom compass fullscreen' by default. The compass's needle points north as the map turns, and pressing it turns the map to face north. Add 'pan' and 'rotate' for buttons around the compass that move and turn the map. Dragging is otherwise the only way a pointer moves the map, so add them where the map has to be usable without dragging, as WCAG 2.2 asks at level AA. The arrow keys pan the map and Shift with Left or Right turns it either way. The pan and zoom buttons and the arrow keys send 'helix-map-pan' and 'helix-map-zoom'. Move your map in response, or connect it with 'connectMap' from '@fusion.dev/helix-map', which does this for you. Add 'tilt' to 'controls' for the 3D button, which a map with 3D buildings or terrain needs. It is a toggle. Pressed, it tilts the map 50 degrees, and 'connectMap' raises the buildings and the ground. Pressed again, it makes the map flat, and lays them flat too. Shift with Up or Down tilts the map in steps. Turning and tilting send 'helix-map-rotate' and 'helix-map-tilt', which 'connectMap' answers on MapLibre. Leaflet draws maps flat and does not rotate. Add 'layers' to 'controls' for a layers button. It opens a menu with a tile for each layer, which sets the layer's 'hidden' attribute. Layers with the same 'group', such as a route and its dotted legs, share one tile. A tile sends 'helix-before-toggle' from the layer first, so you can store the choice or refuse it. Imagery, a 'helix-map-raster' with 'ground', is a map type and not a tile. The menu opens with a card for each type, Standard, Hybrid, and Satellite, with a picture of the map in it, and 'map-type' says which is chosen. Standard hides the imagery, Hybrid draws it under the roads and names, and Satellite draws it alone. Choosing one sends 'helix-before-change' with its name, and 'change' once 'map-type' holds it. 'connectMap' does not draw a hidden layer, so a layer you write with 'hidden' starts turned off. Markers, routes, areas, live positions, and points layers go inside the frame as child elements. */
14987
+ /** Wraps a map drawn by MapLibre, Leaflet, or another renderer. The frame adds a name for the map, a column of controls, and a strip for the map credit. Helix does not draw the map itself. The controls are one column, and 'controls' names which ones: 'fullscreen', 'layers', 'tilt', 'zoom', and 'compass', top to bottom. 'zoom compass fullscreen' by default. The compass's needle points north as the map turns, and pressing it turns the map to face north. Add 'pan' and 'rotate' for buttons around the compass that move and turn the map. Dragging is otherwise the only way a pointer moves the map, so add them where the map has to be usable without dragging, as WCAG 2.2 asks at level AA. The arrow keys pan the map and Shift with Left or Right turns it either way. The pan and zoom buttons and the arrow keys send 'helix-map-pan' and 'helix-map-zoom'. Move your map in response, or connect it with 'connectMap' from '@fusion.dev/helix-map', which does this for you. Add 'tilt' to 'controls' for the 3D button, which a map with 3D buildings or terrain needs. It is a toggle. Pressed, it tilts the map 50 degrees, and 'connectMap' raises the buildings and the ground. Pressed again, it makes the map flat, and lays them flat too. Shift with Up or Down tilts the map in steps. Turning and tilting send 'helix-map-rotate' and 'helix-map-tilt', which 'connectMap' answers on MapLibre. Leaflet draws maps flat and does not rotate. Add 'layers' to 'controls' for a layers button. It opens a menu with a tile for each layer, which sets the layer's 'hidden' attribute. Layers with the same 'group', such as a route and its dotted legs, share one tile. A tile sends 'helix-before-toggle' from the layer first, so you can store the choice or refuse it, and 'helix-toggle' from it once 'hidden' holds the choice. Imagery, a 'helix-map-raster' with 'ground', is a map type and not a tile. The menu opens with a card for each type, Standard, Hybrid, and Satellite, with a picture of the map in it, and 'map-type' says which is chosen. Standard hides the imagery, Hybrid draws it under the roads and names, and Satellite draws it alone. Choosing one sends 'helix-before-change' with its name, and 'change' once 'map-type' holds it. 'connectMap' does not draw a hidden layer, so a layer you write with 'hidden' starts turned off. Markers, routes, areas, live positions, and points layers go inside the frame as child elements. */
13357
14988
  "helix-headless-map": DefineCustomElement<
13358
14989
  HelixHeadlessMap,
13359
14990
  HelixHeadlessMapVueProps,
@@ -13371,31 +15002,37 @@ export interface WcToolkitVueGlobalComponents {
13371
15002
  HelixHeadlessMapTerrainVueProps,
13372
15003
  HelixHeadlessMapTerrainVueEvents
13373
15004
  >;
13374
- /** A disclosure: a button that shows and hides a region of your own links. It does not use 'role="menu"' or 'menuitem', which are for application commands. Those roles take over the arrow keys, announce "menu" to someone looking for navigation, and put every link inside a role that is not a link. As a disclosure, middle clicks, modified clicks, and the status bar keep working. Use 'Menu' for a row of commands. It renders no links. A router renders its own anchors and cannot render them inside this shadow root, so the panel is a slot for the lists and headings you write. It opens on hover by default, and a press always opens it too. 'open-on' sets which. Hover is the default because in a navigation bar people expect to move along the row and see each section. */
15005
+ /** A disclosure: a button that shows and hides a region of your own links. It does not use 'role="menu"' or 'menuitem', which are for application commands. Those roles take over the arrow keys, announce "menu" to someone looking for navigation, and put every link inside a role that is not a link. As a disclosure, middle clicks, modified clicks, and the status bar keep working. Use 'Menu' for a row of commands. It renders no links. A router renders its own anchors and cannot render them inside this shadow root, so the panel is a slot for the lists and headings you write. It opens on hover by default, and a press always opens it too. 'open-on' sets which. Hover is the default because in a navigation bar people expect to move along the row and see each section. When one panel opens in place of another, each says which way the reader moved, as Radix's 'data-motion' does: the one opening is ':state(from-start)' or ':state(from-end)', by where the one closing sits in the bar, and the one closing is ':state(to-start)' or ':state(to-end)'. A stylesheet slides them on that. Put megamenus in a 'Navigation' with 'arrows' and the arrow keys move between their triggers. */
13375
15006
  "helix-headless-megamenu": DefineCustomElement<
13376
15007
  HelixHeadlessMegamenu,
13377
15008
  HelixHeadlessMegamenuVueProps,
13378
15009
  HelixHeadlessMegamenuVueEvents
13379
15010
  >;
13380
- /** One element covers three kinds of row, and what you give it decides which: - Content in the 'submenu' slot makes the row open a submenu page. - 'checked' makes the row a choice. - With neither, the row is a command. The role follows the kind. A row with 'checked' is 'menuitemcheckbox' with 'aria-checked', and 'exclusive' makes it 'menuitemradio', for a set where only one can be on. A row that opens a page keeps 'menuitem' and sets 'aria-haspopup'. Choosing a choice row checks or unchecks it before 'helix-select' is sent, so a listener reads the new 'checked'. An 'exclusive' row turns on and turns off the 'exclusive' rows next to it. Cancel 'helix-before-toggle' to keep a row as it is and set 'checked' yourself. The menu sets whether the row's page is showing as a property, never as an attribute. An attribute written onto your element after it upgrades causes a hydration mismatch. */
15011
+ /** One element covers three kinds of row, and what you give it decides which: - Content in the 'submenu' slot makes the row open a submenu page. - 'checked' makes the row a choice. - With neither, the row is a command. The role follows the kind. A row with 'checked' is 'menuitemcheckbox' with 'aria-checked', and 'exclusive' makes it 'menuitemradio', for a set where only one can be on. A row that opens a page keeps 'menuitem' and sets 'aria-haspopup'. Choosing a choice row checks or unchecks it before 'helix-select' is sent, so a listener reads the new 'checked'. An 'exclusive' row turns on and turns off the 'exclusive' rows next to it. Cancel 'helix-before-toggle' to keep a row as it is and set 'checked' yourself. The menu sets whether the row's page is showing as a property, never as an attribute. An attribute written onto your element after it upgrades causes a hydration mismatch. 'shortcut' shows a row's keyboard shortcut after its label, drawn by 'Kbd' in the platform's glyphs, and gives the row 'aria-keyshortcuts'. It binds nothing: the shortcut is the page's to bind. Other trailing words, such as a count, go in the 'end' slot. */
13381
15012
  "helix-headless-menu-item": DefineCustomElement<
13382
15013
  HelixHeadlessMenuItem,
13383
15014
  HelixHeadlessMenuItemVueProps,
13384
15015
  HelixHeadlessMenuItemVueEvents
13385
15016
  >;
13386
- /** The trigger is slotted and stays your own element, as with the tooltip. The menu renders its surface in the top layer with the popover API, so an ancestor with 'overflow: hidden' does not clip it and it needs no 'z-index'. Slot a 'helix-button' or 'helix-icon-button' as the trigger, and the menu tells it that it opens a menu and whether the menu is open. A plain '<button>' can only be told by writing attributes onto your markup, which the menu does not do, so give it 'aria-haspopup="menu"' and set its 'aria-expanded' from the 'toggle' event. Submenus drill down. A submenu replaces the panel's content, and a back row returns to the previous page. One panel avoids the diagonal pointer path that side-by-side panels need, stays inside a narrow window, and works on touch screens, which have no hover. The root holds which page is open, because only one page shows at a time. It sets this on items as a property, never as an attribute. An attribute written onto your element after it upgrades causes a hydration mismatch. */
15017
+ /** The trigger is slotted and stays your own element, as with the tooltip. The menu renders its surface in the top layer with the popover API, so an ancestor with 'overflow: hidden' does not clip it and it needs no 'z-index'. Slot a 'helix-button' or 'helix-icon-button' as the trigger, and the menu tells it that it opens a menu and whether the menu is open. A plain '<button>' can only be told by writing attributes onto your markup, which the menu does not do, so give it 'aria-haspopup="menu"' and set its 'aria-expanded' from the 'toggle' event. Submenus drill down. A submenu replaces the panel's content, and a back row returns to the previous page. One panel avoids the diagonal pointer path that side-by-side panels need, stays inside a narrow window, and works on touch screens, which have no hover. The root holds which page is open, because only one page shows at a time. It sets this on items as a property, never as an attribute. An attribute written onto your element after it upgrades causes a hydration mismatch. Group rows under a heading with 'Menu.Section', which is a 'group' named by its heading. Between runs of rows, a '<helix-divider announced>' is a separator a screen reader announces. With 'context', the trigger is an area and the menu is its context menu: a right-click, a long press, Shift+F10 or the menu key over the area opens it at the pointer, or at the area's corner from the keyboard, as Radix's context menu does. A press on the area does not open it, and closing it returns focus to where it was. */
13387
15018
  "helix-headless-menu": DefineCustomElement<
13388
15019
  HelixHeadlessMenu,
13389
15020
  HelixHeadlessMenuVueProps,
13390
15021
  HelixHeadlessMenuVueEvents
13391
15022
  >;
15023
+ /** The rows inside it are the menu's rows: the arrow keys and typed letters move through them with the rest, and a set of 'exclusive' rows is still the run of them next to each other. The section is a 'group' named by its heading, as React Aria's menu section is, so a screen reader says which group a row is in as it arrives. A section goes on the menu's first page. A submenu's page takes rows and dividers. */
15024
+ "helix-headless-menu-section": DefineCustomElement<
15025
+ HelixHeadlessMenuSection,
15026
+ HelixHeadlessMenuSectionVueProps,
15027
+ HelixHeadlessMenuSectionVueEvents
15028
+ >;
13392
15029
  /** A meter shows a level within a range. Use 'Progress' to show how far along a task is. A progress bar starts empty and ends full, and full is always the good end. For a meter, which end is good depends on what is measured. There is no 'indeterminate', because a meter always has a value. **Set 'low', 'high', and 'optimum'**, as defined in the HTML specification. 'low' and 'high' divide the range into a low band, a middle band, and a high band. 'optimum' sets the preferred band. The band next to it is fair, and the band two away is poor. */
13393
15030
  "helix-headless-meter": DefineCustomElement<
13394
15031
  HelixHeadlessMeter,
13395
15032
  HelixHeadlessMeterVueProps,
13396
15033
  HelixHeadlessMeterVueEvents
13397
15034
  >;
13398
- /** Renders a real '<nav>', the landmark that screen reader users jump to. Navigation is its own component, separate from 'AppHeader', so you can use it in a header, a footer, or a sidebar. **It renders no links.** Bring your own, mark the current one with 'aria-current="page"', and style them with the 'data-navigation-item' recipe. A router renders its own anchors and cannot render them inside the component's shadow root. The component moves a marker to the current item. It finds the current item by reading 'aria-current', so the attribute that screen readers announce also places the marker. Any value but 'false' counts, so a sidebar of sections on one page can mark the section in view with 'aria-current="location"'. Where several are marked, 'page' wins. Set 'orientation="vertical"' to stack the destinations in a column, for a sidebar. */
15035
+ /** Renders a real '<nav>', the landmark that screen reader users jump to. Navigation is its own component, separate from 'AppHeader', so you can use it in a header, a footer, or a sidebar. **It renders no links.** Bring your own, mark the current one with 'aria-current="page"', and style them with the 'data-navigation-item' recipe. A router renders its own anchors and cannot render them inside the component's shadow root. The component moves a marker to the current item. It finds the current item by reading 'aria-current', so the attribute that screen readers announce also places the marker. Any value but 'false' counts, so a sidebar of sections on one page can mark the section in view with 'aria-current="location"'. Where several are marked, 'page' wins. Set 'orientation="vertical"' to stack the destinations in a column, for a sidebar. Set 'arrows' and the arrow keys move focus between the destinations, as Radix's navigation menu does: left and right along a row, up and down a column, Home and End to the ends. A 'Megamenu' among them is reached at its trigger. Tab still stops at every link, since a navigation is a list of links and not a single control, and the keys across the other axis are left to the page and to an open panel. */
13399
15036
  "helix-headless-navigation": DefineCustomElement<
13400
15037
  HelixHeadlessNavigation,
13401
15038
  HelixHeadlessNavigationVueProps,
@@ -13413,19 +15050,19 @@ export interface WcToolkitVueGlobalComponents {
13413
15050
  HelixHeadlessNotificationVueProps,
13414
15051
  HelixHeadlessNotificationVueEvents
13415
15052
  >;
13416
- /** Notifications are slotted children. Each one is your own markup, with an avatar, a link, or a button in it. Feeds usually hold tens of items, so writing them out lets an item hold anything. The list does not virtualize. Windowing needs the list to own the data, and here you own it, so N notifications are N elements. For a feed of thousands, use a data table with a custom cell. Read state is reported to you. Marking read goes from the root to the item and from the item to you, so a canceled 'helix-read' changes nothing, and if you own 'read', nothing changes until you set it. 'unread' is derived from the items and written to an attribute, so a stylesheet and a badge can both use it without counting. */
15053
+ /** Notifications are slotted children. Each one is your own markup, with an avatar, a link, or a button in it. Feeds usually hold tens of items, so writing them out lets an item hold anything. The list does not virtualize. Windowing needs the list to own the data, and here you own it, so N notifications are N elements. For a feed of thousands, use a data table with a custom cell. Read state is reported to you. Marking read goes from the root to the item and from the item to you, so a canceled 'helix-read' changes nothing, and if you own 'read', nothing changes until you set it. 'unread' is derived from the items and written to an attribute, so a stylesheet and a badge can both use it without counting. **The feed is one 'Tab' stop for its rows.** Each row takes focus itself and is read by its label. 'ArrowDown' and 'ArrowUp' move to the next and the previous row, 'Home' and 'End' to the first and the last, and 'PageDown' and 'PageUp' move a row on or back from anywhere inside one, as in the APG feed pattern. The controls inside a row stay in the 'Tab' order. Set 'total' when the feed holds one page of a longer list, and each row says its place in the whole of it. **'load-more' adds a button after the list** that sends 'helix-load-more', for a feed that holds one page of a longer list. Append the next page, set 'loading' while it is on its way, and take 'load-more' off once there is nothing more. The button is hidden while the feed is loading. */
13417
15054
  "helix-headless-notifications": DefineCustomElement<
13418
15055
  HelixHeadlessNotifications,
13419
15056
  HelixHeadlessNotificationsVueProps,
13420
15057
  HelixHeadlessNotificationsVueEvents
13421
15058
  >;
13422
- /** A separate family from 'Input''s 'type="number"'. It renders two buttons, binds four keys 'Input' does not, and handles clamping and stepping. The field is 'type="text"' with 'inputmode="decimal"'. Tested in a real browser, 'type="number"' fails in three ways: - Typing '12e' gives a '.value' of '""', so the element cannot see what you typed. A 'type="text"' field keeps '"12e"'. - The mouse wheel over a focused field changes the value, for example from 5 to 4, when you only meant to scroll the page. - 'selectionStart' is 'null', so the caret cannot be managed. 'inputmode="decimal"' keeps the numeric keypad on phones. Validity follows the platform's rules: 'min', 'max', and 'step' are checked and reported through the host's own 'setValidity', under the platform's flag names. Stepping is separate from typing, so a number is not corrected while you type it. */
15059
+ /** A separate family from 'Input''s 'type="number"'. It renders two buttons, binds four keys 'Input' does not, and handles clamping and stepping. The field is 'type="text"' with 'inputmode="decimal"'. Tested in a real browser, 'type="number"' fails in three ways: - Typing '12e' gives a '.value' of '""', so the element cannot see what you typed. A 'type="text"' field keeps '"12e"'. - The mouse wheel over a focused field changes the value, for example from 5 to 4, when you only meant to scroll the page. - 'selectionStart' is 'null', so the caret cannot be managed. 'inputmode="decimal"' keeps the numeric keypad on phones. 'format-options' shows the number with 'Intl.NumberFormat' in 'locale', as a currency, a percent or a unit, while the field is not being edited. Focus shows the number itself, and a typed '$1,200' or '25%' is read back with the same options. The value stays the plain number: '1200', or '0.25' for 25%. The locale's group separators are read in every field, so '1,234' is a number in 'en-US'. On iOS and iPadOS the field is a text field described as a number field, with no 'role="spinbutton"', which VoiceOver reads as a slider you cannot type in. React Aria's NumberField does the same. Validity follows the platform's rules: 'min', 'max', and 'step' are checked and reported through the host's own 'setValidity', under the platform's flag names. Stepping is separate from typing, so a number is not corrected while you type it. */
13423
15060
  "helix-headless-number-input": DefineCustomElement<
13424
15061
  HelixHeadlessNumberInput,
13425
15062
  HelixHeadlessNumberInputVueProps,
13426
15063
  HelixHeadlessNumberInputVueEvents
13427
15064
  >;
13428
- /** Object Inspector shows a structured value, such as an API response, a config, or a raw record, as a read-only tree with each entry's type visible. Pass the object to 'value', or name a '<script type="application/json">' by id with 'for', the same source 'VirtualList' and the charts read. JSON text works with server rendering and with React hydration, which skips object properties. 'value' wins when both are set. The tree is one tab stop. Up and Down move between rows, Right opens a branch or moves into it, Left closes it or moves to its parent, and Home and End move to the first and last rows. Typing moves to the next row whose key starts with what was typed, and '*' opens every branch beside the active row. Focus stays on the tree, and 'aria-activedescendant' marks the active row. Each row carries its real level, position, and set size, including in a windowed tree. A new 'value' keeps the branches a reader opened or closed, and the active row, where the new value still has them. A branch the old value did not have opens to 'default-depth'. The copy button copies the active row, a branch as JSON and a string as its text. So do Command+C and Control+C while the tree has focus and no text is selected. The button sits beside the tree, because assistive technology cannot reliably reach a button inside a tree item. 'windowed' draws only the rows in view, for values with thousands of entries. The box needs a height for windowing to work. The styled tier sets one, and in the headless tier you set it yourself. */
15065
+ /** Object Inspector shows a structured value, such as an API response, a config, or a raw record, as a read-only tree with each entry's type visible. Pass the object to 'value', or name a '<script type="application/json">' by id with 'for', the same source 'VirtualList' and the charts read. JSON text works with server rendering and with React hydration, which skips object properties. 'value' wins when both are set. The tree is one tab stop. Up and Down move between rows, Right opens a branch or moves into it, Left closes it or moves to its parent, and Home and End move to the first and last rows. Typing moves to the next row whose key starts with what was typed, and '*' opens every branch beside the active row. Focus stays on the tree, and 'aria-activedescendant' marks the active row. Each row carries its real level, position, and set size, including in a windowed tree. 'active' is the active row's path, written the way a JSON Pointer writes it: the empty string for the root and '/meta/tags/0' for an entry under it. Moving to another row sends 'helix-before-activate', which you can cancel, and then 'helix-activate', both with the path. Writing 'active' moves there and opens the branches around it, and sends nothing. 'expanded' holds the open branches by path, and writing it opens those and closes the rest. A row that closes around the active one hands it to the nearest open branch. 'filter' narrows the tree to the entries whose key or value holds the text, ignoring case, and the branches that lead to them, which it opens. A matched branch keeps everything under it. Each matched row carries 'row-match', and a screen reader hears how many entries matched from 'result-label' and 'results-label'. 'filterable' adds a field that sets it: typing sends 'helix-filter', which you can cancel, and then 'helix-filtered', and Down moves from the field to the tree. A new 'value' keeps the branches a reader opened or closed, and the active row, where the new value still has them. A branch the old value did not have opens to 'default-depth'. The copy button copies the active row, a branch as JSON and a string as its text. So do Command+C and Control+C while the tree has focus and no text is selected. The button sits beside the tree, because assistive technology cannot reliably reach a button inside a tree item. 'windowed' draws only the rows in view, for values with thousands of entries. The box needs a height for windowing to work. The styled tier sets one, and in the headless tier you set it yourself. */
13429
15066
  "helix-headless-object-inspector": DefineCustomElement<
13430
15067
  HelixHeadlessObjectInspector,
13431
15068
  HelixHeadlessObjectInspectorVueProps,
@@ -13437,13 +15074,13 @@ export interface WcToolkitVueGlobalComponents {
13437
15074
  HelixHeadlessOptionGroupVueProps,
13438
15075
  HelixHeadlessOptionGroupVueEvents
13439
15076
  >;
13440
- /** Options are their own family, separate from Select, because an option belongs to a listbox and several controls contain one. 'role="option"' requires an owning 'role="listbox"'. A Select is a listbox with a trigger, a Combobox is a listbox with a text input, and a command palette is a listbox in a dialog. 'Radio' is a part of its group, because a radio has only one kind of owner. Selection works the way it does for a radio. Choosing an option dispatches an event, the listbox decides whether the choice stands, and the listbox sets 'selected'. Filtering belongs to the owner, which hides an option with 'hidden'. What counts as a match differs between a select and a command palette. */
15077
+ /** Options are their own family, separate from Select, because an option belongs to a listbox and several controls contain one. 'role="option"' requires an owning 'role="listbox"'. A Select is a listbox with a trigger, a Combobox is a listbox with a text input, and a command palette is a listbox in a dialog. 'Radio' is a part of its group, because a radio has only one kind of owner. Selection works the way it does for a radio. Choosing an option dispatches an event, the listbox decides whether the choice stands, and the listbox sets 'selected'. Filtering belongs to the owner, which hides an option with 'hidden'. What counts as a match differs between a select and a command palette. An option with 'href' is a link: choosing it follows the link and selects nothing, as an entry in a command palette that goes to a page does. */
13441
15078
  "helix-headless-option": DefineCustomElement<
13442
15079
  HelixHeadlessOption,
13443
15080
  HelixHeadlessOptionVueProps,
13444
15081
  HelixHeadlessOptionVueEvents
13445
15082
  >;
13446
- /** Outline is a table of contents for a document. 'Navigation' does the same job for a site. The links are your own anchors. A router renders its own '<a>' and cannot render one inside the outline's shadow root, and the hrefs are fragments on the same page. Write the anchors flat, with 'data-level' for their depth, or nested in lists, '<ul><li><a>'. A screen reader hears a nested list's levels; it hears 'data-level' as a flat run of links. The current section is decided by the headings' positions. An 'IntersectionObserver' with a band near the top fails both ways: when headings are far apart, none is in the band and no section is marked, and when they are close together, several are in the band at once. */
15083
+ /** Outline is a table of contents for a document. 'Navigation' does the same job for a site. The links are your own anchors. A router renders its own '<a>' and cannot render one inside the outline's shadow root, and the hrefs are fragments on the same page. Write the anchors flat, with 'data-level' for their depth, or nested in lists, '<ul><li><a>'. A screen reader hears the levels either way: the outline puts a flat run into lists inside list items of its own, nested by 'data-level', and leaves the links where they are. A link without 'data-level' is at the top level. A heading slotted into 'heading' names the navigation, in place of 'label'. The current section is decided by the headings' positions. An 'IntersectionObserver' with a band near the top fails both ways: when headings are far apart, none is in the band and no section is marked, and when they are close together, several are in the band at once. */
13447
15084
  "helix-headless-outline": DefineCustomElement<
13448
15085
  HelixHeadlessOutline,
13449
15086
  HelixHeadlessOutlineVueProps,
@@ -13455,7 +15092,7 @@ export interface WcToolkitVueGlobalComponents {
13455
15092
  HelixHeadlessPaginationVueProps,
13456
15093
  HelixHeadlessPaginationVueEvents
13457
15094
  >;
13458
- /** A separate element that you place beside 'Pagination', like 'Pagination.Summary', so you choose the direction and order of your footer. It uses 'Select', so it matches a table's filter dropdowns in the same footer, both open and closed. The caret is 'Select''s, so it follows 'currentColor', and the label is a real '<label for>' pointing at the trigger's id. The label sits on the same row as the select. 'Select''s host is a column, and an outer-tree rule overrides a ':host' rule, so the row layout needs no property on 'Select' and nothing added to your markup. An empty 'sizes' renders nothing and does not fall back to the built-in list. 'Pagination' does the same with a single page, and both report it through 'ElementInternals.states'. 'value' is the current size, and 'default-value' is the size from the markup. Changing it dispatches 'helix-before-change', and then 'input' and 'change' once the size has moved, as a native '<select>' sends them together. Re-querying and returning to page one is up to you, because only you know whether the current position should be kept. */
15095
+ /** A separate element that you place beside 'Pagination', like 'Pagination.Summary', so you choose the direction and order of your footer. It uses 'Select', so it matches a table's filter dropdowns in the same footer, both open and closed. The caret is 'Select''s, so it follows 'currentColor', and the label is a real '<label for>' pointing at the trigger's id. The label sits on the same row as the select. 'Select''s host is a column, and an outer-tree rule overrides a ':host' rule, so the row layout needs no property on 'Select' and nothing added to your markup. An empty 'sizes' renders nothing and does not fall back to the built-in list. 'Pagination' does the same with a single page, and both report it through 'ElementInternals.states'. 'value' is the current size, and 'default-value' is the size from the markup. Changing it dispatches 'helix-before-change', and then 'input' and 'change' once the size has moved, as a native '<select>' sends them together. Re-querying and returning to page one is up to you, because only you know whether the current position should be kept. It takes part in a form. Give it a 'name' and the size in force is submitted under that name, so a 'GET' form carries it in the address beside the page. A form reset returns it to 'default-value', and 'disabled', or a disabled '<fieldset>' around it, turns the select off. */
13459
15096
  "helix-headless-pagination-size": DefineCustomElement<
13460
15097
  HelixHeadlessPaginationSize,
13461
15098
  HelixHeadlessPaginationSizeVueProps,
@@ -13467,13 +15104,13 @@ export interface WcToolkitVueGlobalComponents {
13467
15104
  HelixHeadlessPaginationSummaryVueProps,
13468
15105
  HelixHeadlessPaginationSummaryVueEvents
13469
15106
  >;
13470
- /** Each cell is its own '<input>', so every box has a real focus ring, caret, and tab stop. Input longer than one character is treated as a paste, in any cell. This covers pasting, a browser autofilling an SMS code, and a password manager, which all put the whole code into the focused box. A six-character code that arrives in cell three fills from cell three. The code is one value to a form. The cells are in a shadow root and submit nothing. The host is form-associated and submits the joined string, which also carries validity and responds to a form reset. Only the first cell has 'autocomplete="one-time-code"', because the hint applies to the whole field. The row of cells always runs left to right, with 'dir="ltr"', including in Arabic and Hebrew. The first box is the leftmost, a paste fills to the right, and the right arrow moves to the next box. The label, hint, and feedback follow the page's direction. */
15107
+ /** Each cell is its own '<input>', so every box has a real focus ring, caret, and tab stop. Input longer than one character is treated as a paste, in any cell. This covers pasting, a browser autofilling an SMS code, and a password manager, which all put the whole code into the focused box. A six-character code that arrives in cell three fills from cell three. The code is one value to a form. The cells are in a shadow root and submit nothing. The host is form-associated and submits the joined string, which also carries validity and responds to a form reset. Only the first cell has 'autocomplete="one-time-code"', because the hint applies to the whole field. 'autosubmit' submits the form once the last box is filled, through the form's default button where there is one. 'format' draws separators between the boxes, such as the dash in '###-###', as text a screen reader skips. Delete removes the character in the focused box and pulls the rest of the code back, as Backspace removes the one before it. The row of cells always runs left to right, with 'dir="ltr"', including in Arabic and Hebrew. The first box is the leftmost, a paste fills to the right, and the right arrow moves to the next box. The label, hint, and feedback follow the page's direction. */
13471
15108
  "helix-headless-pin-input": DefineCustomElement<
13472
15109
  HelixHeadlessPinInput,
13473
15110
  HelixHeadlessPinInputVueProps,
13474
15111
  HelixHeadlessPinInputVueEvents
13475
15112
  >;
13476
- /** Popover is the general overlay that the specific ones build on. 'Menu' holds commands, 'Select' holds options, and 'Tooltip' holds a description. Popover holds any content you put in it, so it has no keyboard handling of its own. The trigger is slotted and stays your own element. The popover writes nothing onto it, including 'aria-expanded', 'id', and 'tabindex', because changing your markup after upgrade causes a React hydration mismatch. The panel is in the top layer through the popover API, so it needs no 'z-index', and an ancestor with 'overflow: hidden', 'transform', 'filter', or 'contain' does not clip or move it. It opens on click and from a command. 'command="--show"' and the related commands work as they do on 'Dialog' and 'Drawer', so a button anywhere on the page can open the popover with no script. It closes on Escape, on a press outside it, and when focus moves out of the trigger and the panel to somewhere else on the page. It does not trap focus. An 'aria-labelledby' on the host names the panel in place of 'label'. */
15113
+ /** Popover is the general overlay that the specific ones build on. 'Menu' holds commands, 'Select' holds options, and 'Tooltip' holds a description. Popover holds any content you put in it, so it has no keyboard handling of its own. The trigger is slotted and stays your own element. The popover writes nothing onto it, including 'aria-expanded', 'id', and 'tabindex', because changing your markup after upgrade causes a React hydration mismatch. The panel is in the top layer through the popover API, so it needs no 'z-index', and an ancestor with 'overflow: hidden', 'transform', 'filter', or 'contain' does not clip or move it. It opens on click and from a command. 'command="--show"' and the related commands work as they do on 'Dialog' and 'Drawer', so a button anywhere on the page can open the popover with no script. **Opening moves focus into the panel**, to the first control in it, or to the panel itself where it holds none, and closing from inside gives it back to the trigger. It closes on Escape, on a press outside it, and when focus moves out of the trigger and the panel to somewhere else on the page. 'modal' keeps 'Tab' inside the panel while it is open and says so with 'aria-modal', for a panel that has to be answered before the page goes on. Without it the popover does not trap focus. The panel's name is 'label' when you set it. Otherwise it is the first heading in the panel, or the elements an 'aria-labelledby' on the host names. 'arrow' draws a point on the panel's edge facing the trigger. The side the panel landed on is on the host as ':state(placed-top)' and its kin, and the trigger's width is on the panel as '--floating-anchor-inline-size', for a panel as wide as its trigger: '''css helix-popover::part(popover) { min-inline-size: var(--floating-anchor-inline-size); } ''' */
13477
15114
  "helix-headless-popover": DefineCustomElement<
13478
15115
  HelixHeadlessPopover,
13479
15116
  HelixHeadlessPopoverVueProps,
@@ -13485,7 +15122,7 @@ export interface WcToolkitVueGlobalComponents {
13485
15122
  HelixHeadlessProgressVueProps,
13486
15123
  HelixHeadlessProgressVueEvents
13487
15124
  >;
13488
- /** The code is drawn as one '<path>'. Runs of adjacent dark modules are joined, so a row of eight is one horizontal move. A code of useful length has about a thousand modules, and an element for each would be a thousand nodes for one image. The element has 'role="img"' and an accessible name. Set the name to what the code is for. When you pass no name, the value is the name. Most codes hold a URL, and a URL read aloud gives the destination. The quiet zone of four modules is required by the specification, and a scanner rejects a code cropped to its edge. It is drawn inside the 'viewBox', so it stays at any size, including a size set in CSS. 'correction' sets how much of the code can be lost. At 'H' a code can lose thirty percent and still scan, so a mark in the center slot is safe. At 'L' the same mark makes the code unscannable. The default is 'M', and 'H' when the 'logo' slot is filled. A higher level holds fewer characters, so a value that fits at 'M' can be too long once a logo raises the level to 'H'. A value too long for the level draws no code, and the element fires 'error'. */
15125
+ /** The code is drawn as one '<path>'. Runs of adjacent dark modules are joined, so a row of eight is one horizontal move. A code of useful length has about a thousand modules, and an element for each would be a thousand nodes for one image. The element has 'role="img"' and an accessible name. Set the name to what the code is for. When you pass no name, the value is the name. Most codes hold a URL, and a URL read aloud gives the destination. The quiet zone of four modules is required by the specification, and a scanner rejects a code cropped to its edge. It is drawn inside the 'viewBox', so it stays at any size, including a size set in CSS. 'correction' sets how much of the code can be lost. At 'H' a code can lose thirty percent and still scan, so a mark in the center slot is safe. At 'L' the same mark makes the code unscannable. The default is 'M', and 'H' when the 'logo' slot is filled. A higher level holds fewer characters, so a value that fits at 'M' can be too long once a logo raises the level to 'H'. A value too long for the level draws no code, and the element fires 'error'. 'toSvg()', 'toPng()' and 'download()' give the drawn code as a file of its own, in the colors it is drawn in, for a page that offers it to save or print, as Zag's download trigger does. */
13489
15126
  "helix-headless-qr-code": DefineCustomElement<
13490
15127
  HelixHeadlessQrCode,
13491
15128
  HelixHeadlessQrCodeVueProps,
@@ -13497,7 +15134,7 @@ export interface WcToolkitVueGlobalComponents {
13497
15134
  HelixHeadlessQuoteVueProps,
13498
15135
  HelixHeadlessQuoteVueEvents
13499
15136
  >;
13500
- /** The group is the form control, and the radios are its options. A set of radios submits one answer, so the group owns the 'name', the 'value', and the validity. A radio outside a group is not a control. Checkboxes work the other way: each checkbox submits its own answer. 'MixinField' applies to the group for the same reason. The label, the hint, and the message describe the question, and the question belongs to the set. Selection moves up and state moves down. A radio dispatches an event when it is chosen, the group determines whether the choice stands, and the group writes 'selected' onto every radio. The group is the one source of which radio is on. 'value' is the current answer. 'defaultValue' is what the markup declared: the value until something is chosen, and where a reset returns. The two work like 'checked' and 'defaultChecked'. */
15137
+ /** The group is the form control, and the radios are its options. A set of radios submits one answer, so the group owns the 'name', the 'value', and the validity. A radio outside a group is not a control. Checkboxes work the other way: each checkbox submits its own answer. 'MixinField' applies to the group for the same reason. The label, the hint, and the message describe the question, and the question belongs to the set. Selection moves up and state moves down. A radio dispatches an event when it is chosen, the group determines whether the choice stands, and the group writes 'selected' onto every radio. The group is the one source of which radio is on. 'value' is the current answer. 'defaultValue' is what the markup declared: the value until something is chosen, and where a reset returns. The two work like 'checked' and 'defaultChecked'. A choice sends its events in this order: 'helix-select' from the radio, then, a microtask later and only if nobody refused it, 'helix-before-change' from the group, and once the value has moved, 'input' and 'change'. The microtask is what lets a listener you add to the group after it connected refuse the 'helix-select'. A native radio sends 'input' and 'change' in the same task as the click. */
13501
15138
  "helix-headless-radio-group": DefineCustomElement<
13502
15139
  HelixHeadlessRadioGroup,
13503
15140
  HelixHeadlessRadioGroupVueProps,
@@ -13509,31 +15146,31 @@ export interface WcToolkitVueGlobalComponents {
13509
15146
  HelixHeadlessRadioVueProps,
13510
15147
  HelixHeadlessRadioVueEvents
13511
15148
  >;
13512
- /** Supports half marks, so the value is not always an integer and the press targets are not the marks: five stars at a half step give ten places to press. The pointer handling and 'step' are built around half marks. A partial mark is the full mark, clipped. The filled marks are drawn over the empty marks and cut off partway, so any mark and any fraction work. A read-only rating displays a score, which is the most common use. It is announced as a displayed value and does not look disabled. */
15149
+ /** Supports half marks, so the value is not always an integer and the press targets are not the marks: five stars at a half step give ten places to press. The pointer handling and 'step' are built around half marks. A partial mark is the full mark, clipped. The filled marks are drawn over the empty marks and cut off partway, so any mark and any fraction work. A read-only rating displays a score, which is the most common use. It is announced as a displayed value and does not look disabled. With 'clearable', pressing the chosen score again, or Backspace or Delete on the marks, takes the rating back to unrated and sends 'helix-clear'. */
13513
15150
  "helix-headless-rating": DefineCustomElement<
13514
15151
  HelixHeadlessRating,
13515
15152
  HelixHeadlessRatingVueProps,
13516
15153
  HelixHeadlessRatingVueEvents
13517
15154
  >;
13518
- /** A scatter chart shows how two measures relate. The table's first numeric column is measured across, every other numeric column is measured up, and each row is one point. A table of countries with an income column and a life expectancy column draws one point for each country. Each additional numeric column is another series, in its own color. Both axes are labeled, because both positions are values. The ticks sit at round numbers, and the range extends to them. The summary gives each series' correlation coefficient and its number of points. The table has every number, and the drawing is 'aria-hidden'. Each point is a '<span>' placed by percentage over the drawing, as 'LineChart' places its end points, so points stay round when the drawing stretches. The plot runs left to right in every text direction, as a number line does. The plot, its axes, and the axis names sit in a 'plane' part with 'dir="ltr"'. The axis names carry 'dir="auto"', so a name in Arabic or Hebrew reads in its own direction. The summary and the tooltip bubble follow the page's direction. */
15155
+ /** A scatter chart shows how two measures relate. The table's first numeric column is measured across, every other numeric column is measured up, and each row is one point. A table of countries with an income column and a life expectancy column draws one point for each country. Each additional numeric column is another series, in its own color. Both axes are labeled, because both positions are values. The ticks sit at round numbers, and the range extends to them. The summary gives each series' correlation coefficient and its number of points. The table has every number, and the drawing is hidden from screen readers. **The plot is read by key.** It takes focus, named by 'label' or the caption. The left and right arrows move from row to row in the table's order, Home and End go to the first and the last, and the up and down arrows move among the series of a row. The tooltip sits on that point, the 'live' part says the row in words, and Escape puts the tooltip away. Each point is a '<span>' placed by percentage over the drawing, as 'LineChart' places its end points, so points stay round when the drawing stretches. The plot runs left to right in every text direction, as a number line does. The plot, its axes, and the axis names sit in a 'plane' part with 'dir="ltr"'. The axis names carry 'dir="auto"', so a name in Arabic or Hebrew reads in its own direction. The summary and the tooltip bubble follow the page's direction. */
13519
15156
  "helix-headless-scatter-chart": DefineCustomElement<
13520
15157
  HelixHeadlessScatterChart,
13521
15158
  HelixHeadlessScatterChartVueProps,
13522
15159
  HelixHeadlessScatterChartVueEvents
13523
15160
  >;
13524
- /** Measures which edges have content past them and sets one custom state per edge. CSS cannot read scroll position, so a stylesheet cannot work this out on its own. The styled tier draws a fade on each edge that has a state. Custom states keep an element that upgrades after a framework rendered it from adding markup the framework did not write. Select them with ':host(:state(more-block-end))'. While the content overflows, the region gets a 'tabindex', so keyboard users can scroll it. When nothing overflows, it is not a tab stop. It has 'role="region"' only when you set a 'label', because a screen reader announces an unnamed region as only "region". */
15161
+ /** Measures which edges have content past them and sets one custom state per edge. CSS cannot read scroll position, so a stylesheet cannot work this out on its own. The styled tier draws a fade on each edge that has a state. Custom states keep an element that upgrades after a framework rendered it from adding markup the framework did not write. Select them with ':host(:state(more-block-end))'. While the content overflows, the region gets a 'tabindex', so keyboard users can scroll it. When nothing overflows, it is not a tab stop. It has 'role="region"' only when you set a 'label', because a screen reader announces an unnamed region as only "region". **'scrollbars' draws scrollbars of its own** in place of the browser's: a 'scrollbar' part for each axis that scrolls, a 'thumb' in each, and a 'corner' where the two meet. They are for the pointer. The thumb drags, and a press on the track moves the thumb to the press. The viewport stays the tab stop and the region a screen reader reads, and the scrollbars are hidden from screen readers. On the headless tier your stylesheet sizes and places them, hides the browser's own with 'scrollbar-width: none' on the viewport, and draws the thumb from the two custom properties written on each scrollbar. An axis whose 'overflow' is 'hidden' gets no scrollbar. The viewport's 'scroll' and 'scrollend' are sent again from the host, which is the element you hold. In React, bind them with 'onScroll' and 'onScrollEnd'. */
13525
15162
  "helix-headless-scroll-area": DefineCustomElement<
13526
15163
  HelixHeadlessScrollArea,
13527
15164
  HelixHeadlessScrollAreaVueProps,
13528
15165
  HelixHeadlessScrollAreaVueEvents
13529
15166
  >;
13530
- /** A trigger that opens a 'Listbox'. The list is the same element you can use on its own, with the same keyboard behavior, filtering, and multi-select rules. Select adds a trigger that shows what is chosen, a floating surface, and a place for focus to return to when the list closes. Your options stay in your light DOM and are slotted through into the listbox, so the listbox looks through slots to find them. 'Select' owns the value, passes it down to the listbox, and takes changes back, so the value lives in one place. In the open list the arrow keys, Home, End, PageUp, PageDown and typed letters move the highlight, and Enter, Space or a click chooses it and closes the list. Tab closes the list and moves on. On the closed trigger, ArrowDown, Enter and Space open the list on the chosen option, ArrowUp opens it on the chosen or last option, Home and End open it on the first or last, and typed letters choose the option whose words start with them, as a native '<select>' does. */
15167
+ /** A trigger that opens a 'Listbox'. The list is the same element you can use on its own, with the same keyboard behavior, filtering, and multi-select rules. Select adds a trigger that shows what is chosen, a floating surface, and a place for focus to return to when the list closes. Your options stay in your light DOM and are slotted through into the listbox, so the listbox looks through slots to find them. 'Select' owns the value, passes it down to the listbox, and takes changes back, so the value lives in one place. Set 'valueContent' to draw the trigger's content from the chosen options, and several chosen options are written as a list in the reader's language. In the open list the arrow keys, Home, End, PageUp, PageDown and typed letters move the highlight, and Enter, Space or a click chooses it and closes the list. Tab closes the list and moves on. On the closed trigger, ArrowDown, Enter and Space open the list on the chosen option, ArrowUp opens it on the chosen or last option, Home and End open it on the first or last, and typed letters choose the option whose words start with them, as a native '<select>' does. */
13531
15168
  "helix-headless-select": DefineCustomElement<
13532
15169
  HelixHeadlessSelect,
13533
15170
  HelixHeadlessSelectVueProps,
13534
15171
  HelixHeadlessSelectVueEvents
13535
15172
  >;
13536
- /** A skeleton is hidden from screen readers unless it has a 'label'. An empty placeholder has nothing to say, and a page of them would be a page of unnamed shapes. Tell a screen reader that a region is loading on the region itself: set 'aria-busy="true"' on it while it loads, and put a 'Loader' or a status message in it. Set 'label' on one skeleton to have it read out by name, such as "Loading profile", when a reader reaches it. The role and the name are set through 'ElementInternals', which writes no attributes. There is no 'shape' property. Whether a placeholder is a line, a block, or a circle is presentation, which belongs to the styled tier. */
15173
+ /** A skeleton is hidden from screen readers unless it has a 'label'. An empty placeholder has nothing to say, and a page of them would be a page of unnamed shapes. Tell a screen reader that a region is loading on the region itself: set 'aria-busy="true"' on it while it loads, and put a 'Loader' or a status message in it. Set 'label' on one skeleton to have it read out by name, such as "Loading profile", when a reader reaches it. The role and the name are set through 'ElementInternals', which writes no attributes. There is no 'shape' property. Whether a placeholder is a line, a block, or a circle is presentation, which belongs to the styled tier. **Put the real content inside and set 'loading', and the skeleton takes its size.** While 'loading' is set the content is inert, the host is 'aria-busy', and the styled tier hides the content and paints the placeholder over its box, so nothing moves when the content arrives. Take 'loading' off and the content is shown as it is. An empty skeleton is a placeholder of its own size, as before. */
13537
15174
  "helix-headless-skeleton": DefineCustomElement<
13538
15175
  HelixHeadlessSkeleton,
13539
15176
  HelixHeadlessSkeletonVueProps,
@@ -13545,7 +15182,7 @@ export interface WcToolkitVueGlobalComponents {
13545
15182
  HelixHeadlessSkipLinkVueProps,
13546
15183
  HelixHeadlessSkipLinkVueEvents
13547
15184
  >;
13548
- /** Renders a native '<input type="range">', so the drag, the arrow keys, Home, End, the page keys, and the touch target come from the platform. A native range has a hit area larger than its thumb, sized for a finger. The value is a string, like every other form control's, and 'MixinControllerValue' holds text. Use 'valueAsNumber' for arithmetic. Marks are drawn by the component. The ticks of a '<datalist>' cannot be styled, and Firefox does not render them for a range. Marks are decoration. 'step' sets where the value can land, and the input enforces it whether or not marks are drawn. 'markers' is a count, so a slider from zero to a hundred does not draw a hundred and one marks by accident. A range with two thumbs is two inputs stacked on one track, because there is no native two-thumb range. Each thumb keeps its own value. 'required' comes with the field mixin and cannot fail. A range is never empty: the platform shows its midpoint when no value is set, and 'willUpdate' seeds that midpoint into 'defaultValue', so the value matches the handle from the first render. HTML does not apply 'required' to a range either, so it is not set on the input. It only adds the marker beside the label. */
15185
+ /** Renders a native '<input type="range">', so the drag, the arrow keys, Home, End, the page keys, and the touch target come from the platform. A native range has a hit area larger than its thumb, sized for a finger. The value is a string, like every other form control's, and 'MixinControllerValue' holds text. Use 'valueAsNumber' for arithmetic. Marks are drawn by the component. The ticks of a '<datalist>' cannot be styled, and Firefox does not render them for a range. Marks are decoration. 'step' sets where the value can land, and the input enforces it whether or not marks are drawn. 'markers' is a count, so a slider from zero to a hundred does not draw a hundred and one marks by accident. A range with two thumbs is two inputs stacked on one track, because there is no native two-thumb range. Each thumb keeps its own value. 'min-steps-between-thumbs' keeps them that many steps apart. 'format-options' writes the value with 'Intl.NumberFormat' in 'locale', as a currency, a percent or a unit, and 'formatter' writes it with a function of your own, such as words for a scale. Either one is what a screen reader hears, what the readout shows and what the marker labels say. 'value-text' still wraps it in a sentence, with the formatted value in its place. 'required' comes with the field mixin and cannot fail. A range is never empty: the platform shows its midpoint when no value is set, and 'willUpdate' seeds that midpoint into 'defaultValue', so the value matches the handle from the first render. HTML does not apply 'required' to a range either, so it is not set on the input. It only adds the marker beside the label. */
13549
15186
  "helix-headless-slider": DefineCustomElement<
13550
15187
  HelixHeadlessSlider,
13551
15188
  HelixHeadlessSliderVueProps,
@@ -13587,13 +15224,13 @@ export interface WcToolkitVueGlobalComponents {
13587
15224
  HelixHeadlessStatVueProps,
13588
15225
  HelixHeadlessStatVueEvents
13589
15226
  >;
13590
- /** 'active' sets where the user is, and 'complete' stays on each step. Returning to stage one of three leaves stages one and two finished, so the root sets 'current' on the steps and never changes 'complete'. 'active' is optional. Without it, each step keeps its own 'current', so the sequence is correct in the server's markup, where the root cannot count its slotted children. */
15227
+ /** 'active' sets where the user is, and 'complete' stays on each step. Returning to stage one of three leaves stages one and two finished, so the root sets 'current' on the steps and never changes 'complete'. 'active' is optional. Without it, each step keeps its own 'current', so the sequence is correct in the server's markup, where the root cannot count its slotted children. 'linear' keeps a reader from passing a stage they have not finished, as Ark UI's linear steps do: a stage ahead is out of reach, and its button disabled, until every stage before it is 'complete' or 'optional'. Going back is always allowed. To check a stage before a reader leaves it, cancel 'helix-before-activate' while it is not valid. 'next()' and 'previous()' move one stage either way, under the same rules, for your own buttons. */
13591
15228
  "helix-headless-steps": DefineCustomElement<
13592
15229
  HelixHeadlessSteps,
13593
15230
  HelixHeadlessStepsVueProps,
13594
15231
  HelixHeadlessStepsVueEvents
13595
15232
  >;
13596
- /** Only the step's name is a button. The marker is 'aria-hidden' decoration, so it is outside the button. The name uses 'Button', so the hover wash, the focus ring, and the disabled style come from 'Button'. Every step can be pressed and fires 'helix-select'. To stop the user from moving to a step, set 'disabled' on it. The marker is a slot, and its fallback shows the step's state: a check for a finished stage, a target for the current stage, and an empty ring for a stage not reached yet. Only that one mark is rendered, so the accessibility tree has no hidden marks. The half lines on each side of the mark are drawn on the step's '::before' and '::after' from properties the list sets, so the step renders no extra element for them. */
15233
+ /** Only the step's name is a button. The marker is 'aria-hidden' decoration, so it is outside the button. The name uses 'Button', so the hover wash, the focus ring, and the disabled style come from 'Button'. Every step can be pressed and fires 'helix-select'. To stop the user from moving to a step, set 'disabled' on it. The marker is a slot, and its fallback shows the step's state: a check for a finished stage, a target for the current stage, and an empty ring for a stage not reached yet. Only that one mark is rendered, so the accessibility tree has no hidden marks. The half lines on each side of the mark are drawn on the step's '::before' and '::after' from properties the list sets, so the step renders no extra element for them. A finished stage says so in words: the name's button is described by 'complete-label', "Complete" unless you translate it, and a stage that becomes complete while the page is open says it once in a polite live region. The current stage's button carries 'aria-current="step"', and only the button, so the state is said once, on the control. */
13597
15234
  "helix-headless-step": DefineCustomElement<
13598
15235
  HelixHeadlessStep,
13599
15236
  HelixHeadlessStepVueProps,
@@ -13617,127 +15254,139 @@ export interface WcToolkitVueGlobalComponents {
13617
15254
  HelixHeadlessTableColumnVueProps,
13618
15255
  HelixHeadlessTableColumnVueEvents
13619
15256
  >;
13620
- /** Lays out the rows on a CSS grid, so every column lines up across rows and each row stays a real element that can be styled, hidden, or made interactive. A '<table>' layout aligns columns but limits almost everything else. A grid of elements has no table structure for assistive technology, so the roles are set explicitly: 'table', 'row', 'cell', 'columnheader', and 'rowheader' for a 'header' cell in a row of values. Rows are 'display: contents', so their cells become items of the one grid. A column with 'sortable' and a 'field' sorts the rows by the text of its cells, numbers by their value. Your markup is not reordered: the table draws the rows in the sorted order. 'helix-sort' asks first, so you can refuse it and reorder the rows yourself. The CSS custom properties listed for this component are written by it and read by the stylesheet that draws it. Do not set them. Each holds a number the component computes and CSS cannot, so the stylesheet can draw the table without measuring anything. */
15257
+ /** Lays out the rows on a CSS grid, so every column lines up across rows and each row stays a real element that can be styled, hidden, or made interactive. A '<table>' layout aligns columns but limits almost everything else. A grid of elements has no table structure for assistive technology, so the roles are set explicitly: 'table', 'row', 'cell', 'columnheader', and 'rowheader' for a 'header' cell in a row of values. Rows are 'display: contents', so their cells become items of the one grid. A column with 'sortable' and a 'field' sorts the rows by the text of its cells, numbers by their value. Your markup is not reordered: the table draws the rows in the sorted order. 'helix-sort' asks first, so you can refuse it and reorder the rows yourself. The 'heading' slot names the table: slot a heading or a line of text into it, and the table is named by its words. An 'aria-label' or 'aria-labelledby' on the host wins over it. 'selectable' adds a column of checkboxes. Each row is known by its 'value', and 'selected' holds the chosen keys, comma separated, the same shape 'DataTable' uses. The checkbox in the heading selects every row. For a grid a reader moves through with the arrow keys, with typeahead and range selection, use 'DataTable'. To act on one row, put a link or a button in a cell. The CSS custom properties listed for this component are written by it and read by the stylesheet that draws it. Do not set them. Each holds a number the component computes and CSS cannot, so the stylesheet can draw the table without measuring anything. */
13621
15258
  "helix-headless-table": DefineCustomElement<
13622
15259
  HelixHeadlessTable,
13623
15260
  HelixHeadlessTableVueProps,
13624
15261
  HelixHeadlessTableVueEvents
13625
15262
  >;
13626
- /** The row renders its cells straight through and lays out none of them, so a stylesheet can place them in the table's grid and every column lines up across rows. The row still exists as an element, so you can style it, hide it, or make it interactive. */
15263
+ /** The row renders its cells straight through and lays out none of them, so a stylesheet can place them in the table's grid and every column lines up across rows. The row still exists as an element, so you can style it, hide it, or make it interactive. In a 'selectable' table the row draws a checkbox cell before its own cells, and 'value' is the key the table's 'selected' lists it by. */
13627
15264
  "helix-headless-table-row": DefineCustomElement<
13628
15265
  HelixHeadlessTableRow,
13629
15266
  HelixHeadlessTableRowVueProps,
13630
15267
  HelixHeadlessTableRowVueEvents
13631
15268
  >;
13632
- /** An inactive panel is hidden and stays mounted. Anything typed into it is still there when the person comes back, and the content of every panel is in the server-rendered markup for crawlers, whichever tab is open. */
15269
+ /** An inactive panel is hidden and stays mounted. Anything typed into it is still there when the person comes back, and the content of every panel is in the server-rendered markup for crawlers, whichever tab is open. The host is the 'tabpanel' while its tab is selected, through 'ElementInternals', so the tab's 'aria-controls' can reach it from the tab's shadow root. The box inside takes the focus, for a panel with nothing focusable in it. */
13633
15270
  "helix-headless-tab-panel": DefineCustomElement<
13634
15271
  HelixHeadlessTabPanel,
13635
15272
  HelixHeadlessTabPanelVueProps,
13636
15273
  HelixHeadlessTabPanelVueEvents
13637
15274
  >;
13638
- /** Selection works through an event, the same as in the accordion and the tree. A tab dispatches 'helix-select', and the root pairs it with the panel of the same value. Nothing registers with anything, so tabs added later work with no extra setup. The tab list is a single tab stop, and the arrow keys move between tabs through 'KeyboardNavigationController', the same as in the radio and toggle groups. Selection follows focus, which suits a small set where showing a panel is cheap. Set 'manual' when showing a panel is expensive, so focus can move without selecting. */
15275
+ /** Selection works through an event, the same as in the accordion and the tree. A tab dispatches 'helix-select', and the root pairs it with the panel of the same value. Nothing registers with anything, so tabs added later work with no extra setup. The tab list is a single tab stop, and the arrow keys move between tabs through 'KeyboardNavigationController', the same as in the radio and toggle groups. Selection follows focus, which suits a small set where showing a panel is cheap. Set 'manual' when showing a panel is expensive, so focus can move without selecting. 'orientation="vertical"' sets the tabs in a column beside the panels, and the tab list says 'aria-orientation="vertical"'. The arrow keys of both axes move between tabs either way. A tab with an 'href' is a link, for tabs that are pages of a site. Pressing it follows the link, and the arrow keys move focus without choosing, so arrowing past a tab never leaves the page. Mark the tab of the page you are on with 'selected', or set 'active' to its value. Each tab says which panel it controls through 'aria-controls', set as an element reference to the panel's host, where the engine has reflection. */
13639
15276
  "helix-headless-tabs": DefineCustomElement<
13640
15277
  HelixHeadlessTabs,
13641
15278
  HelixHeadlessTabsVueProps,
13642
15279
  HelixHeadlessTabsVueEvents
13643
15280
  >;
13644
- /** A tab is an element, because it manages selection and its own tab stop. Its id and the id it controls both come from 'value', so the link between a tab and its panel works with server rendering. A generated id would differ between the server render and the client render, and 'aria-controls' would point at nothing. */
15281
+ /** A tab is an element, because it manages selection and its own tab stop. With an 'href', the tab is a link: 'role="tab"' on an '<a>', which a press, Enter and the browser's own link gestures follow. 'helix-select' is sent first, and canceling it keeps the browser from following, so a client-side router follows it instead. */
13645
15282
  "helix-headless-tab": DefineCustomElement<
13646
15283
  HelixHeadlessTab,
13647
15284
  HelixHeadlessTabVueProps,
13648
15285
  HelixHeadlessTabVueEvents
13649
15286
  >;
13650
- /** A label that people can optionally remove. 'dismissible' is the difference from a badge: a badge shows a state that people cannot change, and a tag names something they can remove. The remove button sends 'helix-dismiss'. The tag does not remove itself, because your code owns the list it is in, so remove it in your handler. A listener can cancel 'helix-dismiss', and 'dismiss()' then returns 'false'. When the handler removes a tag whose remove button has focus, focus moves to the next tag's remove button, or to the previous one's after the last tag. The remove button is named for its tag, such as "Remove Apple", so a list of buttons says which tag each one removes. Write '{label}' in 'dismiss-label' to put the tag's words somewhere else, such as 'dismiss-label="{label} entfernen"'. */
15287
+ /** A part of 'Tag' that holds tags as one control: a grid of rows, one tab stop for the whole set. The arrow keys move between tags, Home and End go to the first and the last, and a typed letter goes to the next tag starting with it. Delete or Backspace removes the focused tag where it is 'dismissible', by sending its 'helix-dismiss': remove it from your list in the handler, and focus moves to the next tag, or the previous one after the last. 'selection-mode' lets a reader select tags, with Space, Enter or a press: 'single' selects one at a time and 'multiple' any number. 'value' holds the selected tags' values, separated by commas, and a change asks with 'helix-before-change' and tells with 'change'. Enter on a tag with an 'href' follows its link. A 'disabled' tag is passed over. Name the set with 'label'. */
15288
+ "helix-headless-tag-group": DefineCustomElement<
15289
+ HelixHeadlessTagGroup,
15290
+ HelixHeadlessTagGroupVueProps,
15291
+ HelixHeadlessTagGroupVueEvents
15292
+ >;
15293
+ /** A label that people can optionally remove. 'dismissible' is the difference from a badge: a badge shows a state that people cannot change, and a tag names something they can remove. The remove button sends 'helix-dismiss'. The tag does not remove itself, because your code owns the list it is in, so remove it in your handler. A listener can cancel 'helix-dismiss', and 'dismiss()' then returns 'false'. When the handler removes a tag whose remove button has focus, focus moves to the next tag's remove button, or to the previous one's after the last tag. The remove button is named for its tag, such as "Remove Apple", so a list of buttons says which tag each one removes. Write '{label}' in 'dismiss-label' to put the tag's words somewhere else, such as 'dismiss-label="{label} entfernen"'. 'href' makes the label a link, and 'disabled' takes the tag out of reach: its link and its remove button stop answering. **In a 'Tag.Group' a tag is a row of a grid.** The group gives it its role, its place in the one tab stop and, where the group selects, whether it is selected. Its remove button leaves the tab order there, Delete and Backspace doing its job from the row. */
13651
15294
  "helix-headless-tag": DefineCustomElement<
13652
15295
  HelixHeadlessTag,
13653
15296
  HelixHeadlessTagVueProps,
13654
15297
  HelixHeadlessTagVueEvents
13655
15298
  >;
13656
- /** Renders a '<textarea>', so the caret, selection, spellcheck, resize handle, and phone keyboard come from the platform. It is in the server markup, so the field works before any script loads. It is a separate element from 'Input' because Enter inserts a line break here. In a single-line field, Enter submits the form. 'rows' sets the starting height, and 'auto-grow' makes the field grow with its content. You can use both: 'rows' sets where an empty field begins. */
15299
+ /** Renders a '<textarea>', so the caret, selection, spellcheck, resize handle, and phone keyboard come from the platform. It is in the server markup, so the field works before any script loads. It is a separate element from 'Input' because Enter inserts a line break here. In a single-line field, Enter submits the form. 'rows' sets the starting height, and 'auto-grow' makes the field grow with its content. You can use both: 'rows' sets where an empty field begins. 'max-rows' stops the growth at that many lines, and the field scrolls past them. */
13657
15300
  "helix-headless-textarea": DefineCustomElement<
13658
15301
  HelixHeadlessTextarea,
13659
15302
  HelixHeadlessTextareaVueProps,
13660
15303
  HelixHeadlessTextareaVueEvents
13661
15304
  >;
13662
- /** The list is a 'TimePicker', which you can also use on its own, for example in a settings pane. This element adds the field, the overlay, and the form association, the same arrangement Date Input has with 'DatePicker' and Color Input has with 'ColorPicker'. You can type a time or pick one. The list offers times at a step, and the field lets you enter any time, such as '09:07'. The value is always 'HH:mm' on a 24-hour clock, because that is what the form submits, what 'min' and 'max' compare against, and what sorts correctly as a string. While idle, the field shows the time in the user's locale format. Once the caret is in the field, it shows the value itself, because a formatted time such as '2:30 PM' cannot be typed back and 'Intl' has no parser for it. Typing sends 'input' on each keystroke and 'change' when you leave the field. In the list, the arrow keys, typed digits and PageUp and PageDown move through the times, and Enter, Space or a click chooses one and closes the panel. With 'variant="wheels"' each wheel moves the time as you turn it, the panel stays open, and Enter or Escape closes it. */
15305
+ /** The list is a 'TimePicker', which you can also use on its own, for example in a settings pane. This element adds the field, the overlay, and the form association, the same arrangement Date Input has with 'DatePicker' and Color Input has with 'ColorPicker'. You can type a time or pick one. The list offers times at a step, and the field lets you enter any time, such as '09:07'. The value is always 'HH:mm' on a 24-hour clock, or 'HH:mm:ss' with 'seconds', because that is what the form submits, what 'min' and 'max' compare against, and what sorts correctly as a string. While idle, the field shows the time in the user's locale format. Once the caret is in the field, it shows the value itself, because a formatted time such as '2:30 PM' cannot be typed back and 'Intl' has no parser for it. Typing sends 'input' on each keystroke and 'change' when you leave the field. The trigger and ArrowDown open the list, and so does a press into the field; Tab into the field opens nothing. In the list, the arrow keys, typed digits and PageUp and PageDown move through the times, and Enter, Space or a click chooses one and closes the panel. With 'variant="wheels"' each wheel moves the time as you turn it, the panel stays open, and Enter or Escape closes it. With 'segmented', the field is a row of segments in place of the text: an hour, a minute, and AM or PM where the clock has them, each set with digits or the arrow keys. Alt+Down opens the list from a segment. */
13663
15306
  "helix-headless-time-input": DefineCustomElement<
13664
15307
  HelixHeadlessTimeInput,
13665
15308
  HelixHeadlessTimeInputVueProps,
13666
15309
  HelixHeadlessTimeInputVueEvents
13667
15310
  >;
13668
- /** Shows the times at each 'step' as a 'Listbox', which provides the keyboard behavior, typeahead, scrolling into view, and announcements for a set of options. 'variant="wheels"' shows a column each for the hour, the minute, and the meridiem. The step keeps the list usable. At the default of 15 minutes a day is 96 rows, which people can scroll or type into. At 1 minute it is 1,440. Use the list for the times your product offers, and Time Input for any time, the same way Date Input separates typing a date from picking one on the calendar. The value is always 'HH:mm' on a 24-hour clock. A form submits that shape, 'min' and 'max' compare against it, and it sorts as a string. Each row's text follows the person's own conventions, from 'Intl'. The chosen row is marked in the served markup. The listbox gets the answer as '.value', and Lit SSR serializes no property binding, so without more the 96 served rows would carry no mark until the listbox upgrades and runs 'place'. Each option also gets 'selected', an attribute binding that does serialize, and 'place' then writes the same answer from the same value. This is the same 'selected' you write on 'Option' elsewhere in Helix, and Date Picker marks its choice in markup for the same reason. The list and the wheels both do this, because each wheel is also a listbox. */
15311
+ /** Shows the times at each 'step' as a 'Listbox', which provides the keyboard behavior, typeahead, scrolling into view, and announcements for a set of options. 'variant="wheels"' shows a column each for the hour, the minute, and the meridiem, and one for the second with 'seconds'. Left and Right move between the wheels, and Tab does too. 'hour-cycle' writes every time on a twelve or a twenty-four hour clock whatever the locale, and 'seconds' holds times to the second. The step keeps the list usable. At the default of 15 minutes a day is 96 rows, which people can scroll or type into. At 1 minute it is 1,440. Use the list for the times your product offers, and Time Input for any time, the same way Date Input separates typing a date from picking one on the calendar. The value is always 'HH:mm' on a 24-hour clock, or 'HH:mm:ss' with 'seconds'. A form submits that shape, 'min' and 'max' compare against it, and it sorts as a string. Each row's text follows the person's own conventions, from 'Intl'. The chosen row is marked in the served markup. The listbox gets the answer as '.value', and Lit SSR serializes no property binding, so without more the 96 served rows would carry no mark until the listbox upgrades and runs 'place'. Each option also gets 'selected', an attribute binding that does serialize, and 'place' then writes the same answer from the same value. This is the same 'selected' you write on 'Option' elsewhere in Helix, and Date Picker marks its choice in markup for the same reason. The list and the wheels both do this, because each wheel is also a listbox. */
13669
15312
  "helix-headless-time-picker": DefineCustomElement<
13670
15313
  HelixHeadlessTimePicker,
13671
15314
  HelixHeadlessTimePickerVueProps,
13672
15315
  HelixHeadlessTimePickerVueEvents
13673
15316
  >;
15317
+ /** Groups entries by date, such as "Today" and "Yesterday", in a timeline that holds many. The group is an entry of the timeline, and its entries are a list of their own, named by the heading. A screen reader lists the heading with the page's headings and hears how many entries each day holds. The heading's level is 'heading-level', and 3 where it is not set. Each group draws its own line, so the line stops at the last entry of one day and starts again at the first entry of the next. */
15318
+ "helix-headless-timeline-group": DefineCustomElement<
15319
+ HelixHeadlessTimelineGroup,
15320
+ HelixHeadlessTimelineGroupVueProps,
15321
+ HelixHeadlessTimelineGroupVueEvents
15322
+ >;
13674
15323
  /** Given 'datetime', the label you write is wrapped in a '<time>' element, so a machine-readable value such as "2026-08-19" travels with a label such as "yesterday". Without 'datetime', the label is a '<span>'. Each entry draws the connector line that arrives at it and hides it when it is the first entry, using ':host(:first-child)'. This needs no index, no counting parent, and no script. 'Steps' and 'Breadcrumbs' work the same way. 'tone' sets the kind of event and is the only thing that colors the mark. It uses the same values as 'Announcement'. */
13675
15324
  "helix-headless-timeline-item": DefineCustomElement<
13676
15325
  HelixHeadlessTimelineItem,
13677
15326
  HelixHeadlessTimelineItemVueProps,
13678
15327
  HelixHeadlessTimelineItemVueEvents
13679
15328
  >;
13680
- /** A timeline is a record of events that happened or are scheduled. Each entry carries a time, and no entry is current or complete. For a process you move through, with a current stage and 'active' and 'complete' states, use 'Steps'. Each entry draws the connector line that arrives at it and hides it when it is first, using ':host(:first-child)'. This resolves at layout with no script, so the server markup is correct before anything runs. The host has 'role="list"', because the entries are your elements in the light DOM. 'Steps' does the same. A timeline runs down the page and has no horizontal layout. For stages laid out horizontally, use 'Steps', which is horizontal by default. */
15329
+ /** A timeline is a record of events that happened or are scheduled. Each entry carries a time, and no entry is current or complete. For a process you move through, with a current stage and 'active' and 'complete' states, use 'Steps'. Each entry draws the connector line that arrives at it and hides it when it is first, using ':host(:first-child)'. This resolves at layout with no script, so the server markup is correct before anything runs. The host has 'role="list"', because the entries are your elements in the light DOM. 'Steps' does the same. **Group entries by date with 'Timeline.Group'**, which puts a heading such as "Today" over its entries. The group is an entry of the timeline, and its entries are a list of their own named by the heading. **The reading order is the order you write the entries in**, in every layout the styled tier draws: down the page, either side of a line down the middle, or across the page. Inside each entry the time is read before what happened. Write the entries in the order the events happened, oldest or newest first, and the layout only moves where they are drawn. */
13681
15330
  "helix-headless-timeline": DefineCustomElement<
13682
15331
  HelixHeadlessTimeline,
13683
15332
  HelixHeadlessTimelineVueProps,
13684
15333
  HelixHeadlessTimelineVueEvents
13685
15334
  >;
13686
- /** Each message is an element because it has a timeout, a tone, a dismiss control, and a lifetime that pauses. **Each item runs its own timer.** A timer held by the region would restart with each new message, and the last of three messages would stay for nine seconds. **Messages are inverted by default.** The item flips 'color-scheme', so a new message stands out from the page without using a color that carries meaning. */
15335
+ /** Each message is an element because it has a timeout, a tone, a dismiss control, and a lifetime that pauses. **Each item runs its own timer.** A timer held by the region would restart with each new message, and the last of three messages would stay for nine seconds. **Each message is an 'alertdialog' named by its words**, which is how a reader who moves into the stack hears which message they are on. A 'danger' message is its own assertive live region, so it is announced at once; every other one is announced politely by the region. A touch or a pen swipes a message toward the end of the line, and past halfway, or quickly, dismisses it through the same 'helix-dismiss' as its control. While it moves, the distance is on the 'item' part as '--toast-swipe-x'. **Messages are inverted by default.** The item flips 'color-scheme', so a new message stands out from the page without using a color that carries meaning. */
13687
15336
  "helix-headless-toast-item": DefineCustomElement<
13688
15337
  HelixHeadlessToastItem,
13689
15338
  HelixHeadlessToastItemVueProps,
13690
15339
  HelixHeadlessToastItemVueEvents
13691
15340
  >;
13692
- /** The region and its items are one family because a live region must be in the document before a message is added to it. Assistive technology often does not announce a region that arrives already holding its message. 'Radio.Group' is part of its family for the same reason. **The region is polite, never assertive.** 'role="alert"' interrupts whatever a screen reader is reading. For something that cannot wait, use a 'Dialog', which stops the page for every user. **The region never creates or removes items.** You render items and remove them. An item requests closing with a cancelable 'helix-dismiss' event. A dismissed item hides itself and stays in the DOM, so your framework's state and the DOM stay in sync. It hides on its own unless you set 'open', which makes the state yours. There is no 'toast.show()'. For a 'toast()' function, write a small one over your app's state, which also lets you render the same messages on the server, in a test, or more than once. **The stack is in the top layer.** The 'region' part is a 'popover="manual"' shown while a message is showing, and shown again above a modal dialog that opened after it. Position the 'region' part, which is the box in the top layer. While a modal 'Dialog', 'Drawer' or 'Lightbox' is open, the browser makes everything outside it inert, the stack included, so a message stays visible and its actions cannot be pressed. Where the browser has 'ariaNotify', a message that arrives then is announced through it. For a message with an action, render a second region inside the dialog. When a message with focus inside it is dismissed, focus moves to the next message, then the one before it, then back to where it was before it entered the stack. */
15341
+ /** The region and its items are one family because a live region must be in the document before a message is added to it. Assistive technology often does not announce a region that arrives already holding its message. 'Radio.Group' is part of its family for the same reason. **The region is a landmark named by 'label', and a polite live region.** A 'danger' message is announced assertively, and every other one politely. Each message is an 'alertdialog' named by its words, so a reader who moves into the stack hears which message they are on. **'hotkey' takes focus to the stack and back**, F8 unless you set it, and 'label' says which key: '{hotkey}' in it is filled in, so the default name is "Notifications (F8)". Pressed while focus is in the stack, it gives focus back to where it was. **The region never creates or removes items.** You render items and remove them. An item requests closing with a cancelable 'helix-dismiss' event. A dismissed item hides itself and stays in the DOM, so your framework's state and the DOM stay in sync. It hides on its own unless you set 'open', which makes the state yours. **'add()' shows a message from script**, for a page with no framework state to render them from: it appends a message of the region's own tier and removes it once it has been dismissed and has finished leaving. Messages you render yourself stay yours, and the region never removes them. A touch or a pen swipes a message away toward the end of the line. **The stack is in the top layer.** The 'region' part is a 'popover="manual"' shown while a message is showing, and shown again above a modal dialog that opened after it. Position the 'region' part, which is the box in the top layer. While a modal 'Dialog', 'Drawer' or 'Lightbox' is open, the browser makes everything outside it inert, the stack included, so a message stays visible and its actions cannot be pressed. Where the browser has 'ariaNotify', a message that arrives then is announced through it. For a message with an action, render a second region inside the dialog. When a message with focus inside it is dismissed, focus moves to the next message, then the one before it, then back to where it was before it entered the stack. */
13693
15342
  "helix-headless-toast": DefineCustomElement<
13694
15343
  HelixHeadlessToast,
13695
15344
  HelixHeadlessToastVueProps,
13696
15345
  HelixHeadlessToastVueEvents
13697
15346
  >;
13698
- /** The indicator is one element that moves to the selected item. A single moving object is easier to follow than a fill that swaps, and it shows where the selection came from. Its size and position are measured from the selected item and written to the indicator as custom properties, because labels have different lengths. Measurement happens on the client, so the server renders the indicator hidden and it fades in once measured. */
15347
+ /** The indicator is one element that moves to the selected item. A single moving object is easier to follow than a fill that swaps, and it shows where the selection came from. Its size and position are measured from the selected item and written to the indicator as custom properties, because labels have different lengths. Measurement happens on the client, so the server renders the indicator hidden and it fades in once measured. 'selection-mode="multiple"' makes the group a toolbar of buttons that each say whether they are pressed with 'aria-pressed', as React Aria's ToggleButtonGroup and Radix's ToggleGroup do. A press presses or releases one item, the arrow keys move focus without pressing, and 'value' is the pressed values, comma separated, which 'values' also gives as a list. The form receives one entry per pressed value. The indicator stays hidden, and each pressed item is marked with ':state(pressed)'. 'orientation="vertical"' runs the items down a column, says so to the accessibility tree, and the up and down arrows move between them. */
13699
15348
  "helix-headless-toggle-group": DefineCustomElement<
13700
15349
  HelixHeadlessToggleGroup,
13701
15350
  HelixHeadlessToggleGroupVueProps,
13702
15351
  HelixHeadlessToggleGroupVueEvents
13703
15352
  >;
13704
- /** Renders a '<button role="radio">' for use as a form control. Do not use it for navigation. For navigation, use links marked with 'aria-current' and styled by the 'data-navigation-item' recipe in the base layer. The recipe has the same look, and links are not announced as choices. */
15353
+ /** Renders a '<button role="radio">' for use as a form control. In a group with 'selection-mode="multiple"' it is a '<button>' that says whether it is pressed with 'aria-pressed'. Do not use it for navigation. For navigation, use links marked with 'aria-current' and styled by the 'data-navigation-item' recipe in the base layer. The recipe has the same look, and links are not announced as choices. */
13705
15354
  "helix-headless-toggle": DefineCustomElement<
13706
15355
  HelixHeadlessToggle,
13707
15356
  HelixHeadlessToggleVueProps,
13708
15357
  HelixHeadlessToggleVueEvents
13709
15358
  >;
13710
- /** A toolbar holds a mix of controls, such as buttons, toggles, and menus. A button group holds one kind, so the two are separate components. The toolbar is one tab stop, and the arrow keys move between its controls, so three toolbars take three presses of Tab to pass. Any element the browser can focus counts as a control, including your own elements. A child that takes no focus, such as a divider, is skipped. A menu is reached at its trigger. A nested composite, such as a toggle group, is one stop on the toolbar's axis: the toolbar's arrows move past it, and the arrows across the toolbar move inside it. A composite with a 'focusable' property, as Toggle Group has, gives up its own tab stop while the toolbar's is elsewhere, so Tab stops once in the toolbar. A composite without one keeps its own tab stop. */
15359
+ /** A toolbar holds a mix of controls, such as buttons, toggles, and menus. A button group holds one kind, so the two are separate components. The toolbar is one tab stop, and the arrow keys move between its controls, so three toolbars take three presses of Tab to pass. Any element the browser can focus counts as a control, including your own elements. A child that takes no focus, such as a divider, is skipped. A menu is reached at its trigger. Controls inside a plain wrapper, such as a 'Button Group', are each a stop of the toolbar's own, as React Aria's toolbar flattens a group: the arrows walk through the group's buttons and on past it, and the group takes no tab stop of its own. The arrows wrap from the last control to the first. Set 'stop-at-ends' to keep them at the ends, as Radix's 'loop' set to false does. A nested composite, such as a toggle group, is one stop on the toolbar's axis: the toolbar's arrows move past it, and the arrows across the toolbar move inside it. A composite with a 'focusable' property, as Toggle Group has, gives up its own tab stop while the toolbar's is elsewhere, so Tab stops once in the toolbar. A composite without one keeps its own tab stop. */
13711
15360
  "helix-headless-toolbar": DefineCustomElement<
13712
15361
  HelixHeadlessToolbar,
13713
15362
  HelixHeadlessToolbarVueProps,
13714
15363
  HelixHeadlessToolbarVueEvents
13715
15364
  >;
13716
- /** The trigger is slotted and stays your own element. The bubble renders in the top layer through the popover API, so an ancestor with 'overflow: hidden' does not clip it and no 'z-index' is needed. 'FloatingController' positions it and flips it to another side when the preferred side does not fit. Wrapping the trigger is the convenient form. Use it where the trigger already has an accessible name, because the tooltip cannot describe a slotted trigger: an IDREF cannot cross a shadow boundary. To add a description, place the tooltip beside the trigger and name the trigger with 'for': '''html <helix-headless-button id="save" aria-describedby="save-tip">Save</helix-headless-button> <helix-headless-tooltip id="save-tip" for="save" content="Save your work"></helix-headless-tooltip> ''' Write the 'aria-describedby' yourself, pointing at the tooltip host. Setting it at runtime causes a hydration mismatch that React does not fix. With 'for', the tooltip warns once on first open if the attribute is missing. The tooltip shows on hover and on focus. It hides on pointer leave, on blur, on Escape, and when the trigger is activated. The pointer can move from the trigger onto the bubble and the bubble stays. Once one tooltip is showing, moving to another trigger shows its tooltip with no 'delay', and the first one hides. The same holds for 300 milliseconds after a tooltip hides. */
15365
+ /** The trigger is slotted and stays your own element. The bubble renders in the top layer through the popover API, so an ancestor with 'overflow: hidden' does not clip it and no 'z-index' is needed. 'FloatingController' positions it and flips it to another side when the preferred side does not fit. **The tooltip describes its trigger itself, in both forms.** Wrap the trigger, or place the tooltip beside it and name the trigger with 'for': '''html <helix-headless-button id="save">Save</helix-headless-button> <helix-headless-tooltip for="save" content="Save your work"></helix-headless-tooltip> ''' The link is an element reference on the control that takes focus, and it is never written into your markup before a reader has acted. A trigger that is a Helix component is described at once, inside its own shadow root. A plain element in your markup is described when a reader first points at it or focuses it, which is after any hydration, and only where you have written no 'aria-describedby' or 'aria-labelledby' of your own. Write 'aria-describedby' pointing at the tooltip yourself to have the link in the server's markup. Where the browser has no element references, write it yourself; the tooltip warns once on first open if nothing links the two. The tooltip shows on hover and on focus. It hides on pointer leave, on blur, on Escape, and when the trigger is activated. The pointer can move from the trigger onto the bubble and the bubble stays. Once one tooltip is showing, moving to another trigger shows its tooltip with no 'delay', and the first one hides. The same holds for 'skip-delay' milliseconds after a tooltip hides, 300 unless you set it. 'show-on="focus"' shows the tooltip on keyboard focus only, for a hint a pointer does not need. */
13717
15366
  "helix-headless-tooltip": DefineCustomElement<
13718
15367
  HelixHeadlessTooltip,
13719
15368
  HelixHeadlessTooltipVueProps,
13720
15369
  HelixHeadlessTooltipVueEvents
13721
15370
  >;
13722
- /** The root holds the order of the stops: which stop is current, what Next and Back do, and when the tour is finished. Each stop holds its target, and you write all the text. **The spotlight is a shadow.** The scrim is a box the size of the current target with a very large 'box-shadow' spread, and the shadow paints the darkness. A 'clip-path' on a full-screen scrim breaks as soon as an element between the scrim and the viewport is transformed. The root measures the target's position in the browser. Nothing is measured on the server, because a tour starts only on request. 'open', 'default-open', 'helix-before-open', 'helix-before-close' and 'toggle' work as they do on 'Dialog'. Setting 'open' starts the run, and 'skip()' and 'requestOpen(false)' end it early. **Focus follows the run.** Opening moves focus to the first stop's panel, and moving on from a control in a stop moves it to the next one. Ending the tour puts focus back on the element that had it when the tour opened, unless you have moved it somewhere else on the page. A stop does not trap focus, so you can still 'Tab' out to the element it describes. */
15371
+ /** The root holds the order of the stops: which stop is current, what Next and Back do, and when the tour is finished. Each stop holds its target, and you write all the text. **The spotlight is a shadow.** The scrim is a box the size of the current target with a very large 'box-shadow' spread, and the shadow paints the darkness. A 'clip-path' on a full-screen scrim breaks as soon as an element between the scrim and the viewport is transformed. The root measures the target's position in the browser. Nothing is measured on the server, because a tour starts only on request. 'open', 'default-open', 'helix-before-open', 'helix-before-close' and 'toggle' work as they do on 'Dialog'. Setting 'open' starts the run, and 'skip()' and 'requestOpen(false)' end it early. Each stop is told its place in the run, from 'progress-label', such as "2 of 5". It describes the stop's panel, so a screen reader says it at every stop, and 'progress' draws it in the panel as well. A dialog or a floating stop, which has nothing to light, is shown over the 'backdrop' part. At a 'wait' stop the run waits for that stop's target to be on the page, and moves on by itself. **Focus follows the run.** Opening moves focus to the first stop's panel, and moving on from a control in a stop moves it to the next one. Ending the tour puts focus back on the element that had it when the tour opened, unless you have moved it somewhere else on the page. A stop does not trap focus, so you can still 'Tab' out to the element it describes. */
13723
15372
  "helix-headless-tour": DefineCustomElement<
13724
15373
  HelixHeadlessTour,
13725
15374
  HelixHeadlessTourVueProps,
13726
15375
  HelixHeadlessTourVueEvents
13727
15376
  >;
13728
- /** A stop names its target with 'for' and holds the content you put in it. The stop handles three things: - **Placement.** The panel is anchored to the target by the same floating positioning as the other Helix overlays. - **Stacking.** The panel is a popover, so it is in the top layer and shows above dialogs, scrolling regions, and other stacking contexts. - **Visibility.** The stop shows when it is 'current', which the root sets. Put any content in the stop, such as a 'Card', or a heading and a line of text. There are no fixed title or body parts. **The buttons are slot fallback.** With nothing in the 'actions' slot, you get Back, Next, and Skip, already wired. Slot your own 'actions' and drive them with 'next()', 'back()', and 'skip()' on the root. **'for' is an id, as with 'Tooltip'**, so you can point at a target elsewhere on the page from markup. It resolves against the stop's root node, so a stop inside a shadow tree points at a target in that tree. The panel is a 'group', named by the first heading in the stop's content, and only while the stop is shown. 'focus()' moves focus to the panel, which is what the tour does when it opens or moves on. */
15377
+ /** A stop names its target with 'for' and holds the content you put in it. The stop handles three things: - **Placement.** The panel is anchored to the target by the same floating positioning as the other Helix overlays. - **Stacking.** The panel is a popover, so it is in the top layer and shows above dialogs, scrolling regions, and other stacking contexts. - **Visibility.** The stop shows when it is 'current', which the root sets. Put any content in the stop, such as a 'Card', or a heading and a line of text. The 'heading' and 'description' slots are optional places for the title and the line under it, which then name and describe the panel. **A stop has a type.** Without one it is a bubble pointing at its target. 'type="dialog"' is a panel in the middle of the window, over a backdrop, for a welcome or a summary with nothing to point at. 'type="floating"' is a panel in a corner of the window, which the styled tier puts at the end of the line, for a note that points at nothing in particular. 'type="wait"' shows nothing: the tour waits for the element 'for' names to be on the page, such as a menu the reader has to open, and moves on by itself. **The buttons are slot fallback.** With nothing in the 'actions' slot, you get Back, Next, and Skip, already wired. Slot your own 'actions' and drive them with 'next()', 'back()', and 'skip()' on the root. **'for' is an id, as with 'Tooltip'**, so you can point at a target elsewhere on the page from markup. It resolves against the stop's root node, so a stop inside a shadow tree points at a target in that tree. The panel is a 'group', and a 'dialog' for a dialog stop, only while the stop is shown. It is named by the 'heading' slot, then by the first heading in the content, then by 'label', and otherwise by its place in the tour. It is described by the 'description' slot and by its place, such as "2 of 5", so a screen reader says where the reader is at every stop. 'focus()' moves focus to the panel, which is what the tour does when it opens or moves on. */
13729
15378
  "helix-headless-tour-stop": DefineCustomElement<
13730
15379
  HelixHeadlessTourStop,
13731
15380
  HelixHeadlessTourStopVueProps,
13732
15381
  HelixHeadlessTourStopVueEvents
13733
15382
  >;
13734
- /** 'open' comes from 'MixinControllerOpen', the same state a disclosure holds, so you can respond to a branch opening and control the state yourself. The row renders 'aria-expanded'. Each item is an element because it holds state: whether it is open, selected, and focused. An item is a branch when something is slotted into 'children'. This is detected on the client, so server-rendered markup shows a leaf and the twisty appears on hydration. **'href' makes the whole row a link**, rendered as an '<a>'. Enter, middle click, and the status bar then work anywhere on the row. Pressing a branch, or Enter or Space on it, opens or closes it. A branch with a 'value' is chosen as well and sends 'helix-select', unless the tree has 'nesting="heading"', where a branch names the list under it. */
15383
+ /** 'open' comes from 'MixinControllerOpen', the same state a disclosure holds, so you can respond to a branch opening and control the state yourself. The row renders 'aria-expanded'. Each item is an element because it holds state: whether it is open, selected, and focused. An item is a branch when something is slotted into 'children'. This is detected on the client, so server-rendered markup shows a leaf and the twisty appears on hydration. **'href' makes the whole row a link**, rendered as an '<a>'. Enter, middle click, and the status bar then work anywhere on the row. Pressing a branch, or Enter or Space on it, opens or closes it. A branch with a 'value' is chosen as well and sends 'helix-select', unless the tree has 'nesting="heading"', where a branch names the list under it. A 'disabled' item is reached by the arrow keys and announced as unavailable, and a press, Enter or Space on it does nothing. A 'lazy' item is a branch whose children you load when it opens: opening it sends 'helix-load', the row says it is busy, and the children you add appear in it. Remove 'lazy' once they are in. */
13735
15384
  "helix-headless-tree-item": DefineCustomElement<
13736
15385
  HelixHeadlessTreeItem,
13737
15386
  HelixHeadlessTreeItemVueProps,
13738
15387
  HelixHeadlessTreeItemVueEvents
13739
15388
  >;
13740
- /** The tree is a single tab stop, and arrow keys move focus between items, as the tree pattern requires, so Tab moves past a long sidebar in one press. The tree moves the tab stop to the focused item, so the browser's focus order stays intact. Items are found with 'instanceof', never by tag name, so the headless tier does not depend on the styled one. Typing a letter moves to the next visible item whose name starts with it, and '*' opens every branch beside the focused item. */
15389
+ /** The tree is a single tab stop, and arrow keys move focus between items, as the tree pattern requires, so Tab moves past a long sidebar in one press. The tree moves the tab stop to the focused item, so the browser's focus order stays intact. Items are found with 'instanceof', never by tag name, so the headless tier does not depend on the styled one. Typing a letter moves to the next visible item whose name starts with it, and '*' opens every branch beside the focused item. 'selection-mode="multiple"' draws a check mark on every row and lets a reader check many, as Web Awesome's and Ark UI's checkbox trees do. Checking a branch checks every item under it, and a branch some of whose items are checked is partly checked. Space or a press on the mark checks the focused row, and Enter or a press on a branch's row opens it. 'active' then holds the checked values, comma separated, which 'values' also gives as a list, and the tree says 'aria-multiselectable'. */
13741
15390
  "helix-headless-tree": DefineCustomElement<
13742
15391
  HelixHeadlessTree,
13743
15392
  HelixHeadlessTreeVueProps,
@@ -13761,19 +15410,19 @@ export interface WcToolkitVueGlobalComponents {
13761
15410
  HelixHeadlessVideoPlaylistMenuVueProps,
13762
15411
  HelixHeadlessVideoPlaylistMenuVueEvents
13763
15412
  >;
13764
- /** **You slot the player**, so it keeps your appearance, extra controls, captions, and poster treatment. 'Sandbox' takes its preview and 'Menu' its trigger the same way. **Entries are markup.** React skips properties it would set imperatively during hydration, so an array property on a custom element is missing on the first paint of a server-rendered page. 'using-the-elements.mdx' has the measurement. Markup also makes each entry a real button with its name inside. **The playlist does not play media.** It sets 'src' on the player and tracks which entry is current. The current entry moves when: - an entry is pressed, - the player dispatches 'helix-next' or 'helix-previous', or - the player reaches the end. On 'ended' the playlist advances and the next clip starts playing, because the user already pressed play once. */
15413
+ /** **You slot the player**, so it keeps your appearance, extra controls, captions, and poster treatment. 'Sandbox' takes its preview and 'Menu' its trigger the same way. **Entries are markup.** React skips properties it would set imperatively during hydration, so an array property on a custom element is missing on the first paint of a server-rendered page. 'using-the-elements.mdx' has the measurement. Markup also makes each entry a real button with its name inside. **The playlist does not play media.** It sets 'src' on the player and tracks which entry is current. The current entry moves when: - an entry is pressed, - the player dispatches 'helix-next' or 'helix-previous', or - the player reaches the end. On 'ended' the playlist advances and the next clip starts playing, because the user already pressed play once. 'repeat' decides what happens at the end: 'one' plays the same entry again, and 'all' goes from the last entry back to the first. Without it, the playlist stops on the last entry and sends 'helix-end'. 'shuffle' plays the entries in a random order, starting from the one that is current, and 'previous' retraces that order. */
13765
15414
  "helix-headless-video-playlist": DefineCustomElement<
13766
15415
  HelixHeadlessVideoPlaylist,
13767
15416
  HelixHeadlessVideoPlaylistVueProps,
13768
15417
  HelixHeadlessVideoPlaylistVueEvents
13769
15418
  >;
13770
- /** The picture is a native '<video>', so decoding, buffering, captions, Picture in Picture, AirPlay, and codecs come from the platform. The component replaces the control bar, because the native bar cannot be styled. The scrubber and the volume are '<input type="range">' elements, so arrow keys, Home and End, touch targets, and screen reader announcements work as they do natively. When you set 'controls', the browser's control bar is used, the Helix bar is not drawn, and the keys below are not bound, so a key press does not seek twice. The keys match other players, and they are bound on the element only: - Space and 'k' play or pause. - The arrow keys seek and change the volume. - 'm' mutes. - 'f' toggles fullscreen. '<source>' and '<track>' children are copied into the video. A media element selects resources from its own child nodes, and a slot is one node, so slotted sources would give the video no text tracks, no current source, and a 'readyState' of zero, and it would not play. They are copied so your light DOM stays intact, and are copied again whenever the slot changes. */
15419
+ /** The picture is a native '<video>', so decoding, buffering, captions, Picture in Picture, AirPlay, and codecs come from the platform. The component replaces the control bar, because the native bar cannot be styled. The scrubber and the volume are '<input type="range">' elements, so arrow keys, Home and End, touch targets, and screen reader announcements work as they do natively. When you set 'controls', the browser's control bar is used, the Helix bar is not drawn, and the keys below are not bound, so a key press does not seek twice. The keys match other players, and they are bound on the element only: - Space and 'k' play or pause. - The arrow keys seek and change the volume. - 'm' mutes. - 'f' toggles fullscreen. '<source>' and '<track>' children are copied into the video. A media element selects resources from its own child nodes, and a slot is one node, so slotted sources would give the video no text tracks, no current source, and a 'readyState' of zero, and it would not play. They are copied so your light DOM stays intact, and are copied again whenever the slot changes. The player sends every media event of its inner video under the same name, without bubbling, as a '<video>' sends it. Listen on the player as you would on a video: 'timeupdate', 'volumechange', 'loadedmetadata', 'error', and the rest. */
13771
15420
  "helix-headless-video": DefineCustomElement<
13772
15421
  HelixHeadlessVideo,
13773
15422
  HelixHeadlessVideoVueProps,
13774
15423
  HelixHeadlessVideoVueEvents
13775
15424
  >;
13776
- /** The items arrive as data: - 'for' names a '<script type="application/json">' that holds an array of objects. - A '<template>' child defines one row. Elements with 'data-field="name"' are filled with that field of the item. Both are markup. React hydration skips every property it would have to set imperatively, so an 'items' property would be lost, and light-DOM children would all exist before anything could window them. The JSON text is one node whatever the row count. For assistive technology the list exposes the rendered window with 'aria-setsize'. Charts that use the same 'for="<id>"' shape render an accessible '<table>', and ten thousand rows in one is the cost this component avoids. The list follows the source: editing the script's text, or replacing the script under the same id, draws the new rows. A row that stays in view keeps its element as the list scrolls, and the row holding focus stays drawn when it scrolls out, so a link or a button in a row keeps focus. The viewport scrolls on this tier. It carries 'data-scroller', and 'core' ships '[data-scroller] { overflow: auto }' into every shadow root, so 'scrollTop' works with no stylesheet. You still need to set a block size. */
15425
+ /** The items arrive as data, in one of two ways: - 'items' takes an array. A framework sets it as a property, and React hydration keeps it. - 'for' names a '<script type="application/json">' that holds an array, which a server sends as markup. Each item is drawn into a row in one of two ways: - 'renderItem' is a function from an item and its index to the row's content: a Lit template, a string, or a DOM node. - A '<template>' child defines one row. 'data-field="name"' fills an element with the item's 'name' as text, and 'data-field-href="url"' writes the item's 'url' into 'href', the same for any attribute. A field may be a path of keys, such as 'author.name'. Rows are your markup in the light DOM, so your stylesheet styles them. **Keyboard.** The list is one tab stop. Up and Down move between items, Home and End go to the first and the last, and Page Up and Page Down move by a screen. An item that is not drawn is scrolled into view and focused, so a keyboard reaches the whole set. Tab moves on into the focused row's own links and buttons. When the row holding the tab stop scrolls away, the stop moves to the first row on screen. Each row says its place in the whole set with 'aria-posinset' and 'aria-setsize', so a screen reader says "4,000 of 10,000". The row holding focus stays drawn when it scrolls out. **Loading more.** 'helix-range-change' fires as the items on screen change, and 'range' holds them. 'helix-load-more' fires once a reader is within one screen of the end, once for each length of the set: add to 'items' and it can fire again. 'scrollToIndex' takes a reader to an item. The list follows its source. A new 'items' array, an edit to the script's text, or a script replaced under the same id draws the new rows. A row that stays in view keeps its element as the list scrolls. The viewport scrolls on this tier. It carries 'data-scroller', and 'core' ships '[data-scroller] { overflow: auto }' into every shadow root, so 'scrollTop' works with no stylesheet. You still need to set a block size. */
13777
15426
  "helix-headless-virtual-list": DefineCustomElement<
13778
15427
  HelixHeadlessVirtualList,
13779
15428
  HelixHeadlessVirtualListVueProps,