@fusion.dev/helix-headless 0.147.0 → 0.149.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 (296) hide show
  1. package/custom-elements.json +11222 -2332
  2. package/dist/accordion/item/accordion-item.d.ts +5 -2
  3. package/dist/accordion/item/accordion-item.js +11 -7
  4. package/dist/accordion/root/accordion-root.js +4 -6
  5. package/dist/announcement/root/announcement-root.d.ts +61 -5
  6. package/dist/announcement/root/announcement-root.js +126 -20
  7. package/dist/area-chart/root/area-chart-root.d.ts +11 -0
  8. package/dist/area-chart/root/area-chart-root.js +21 -9
  9. package/dist/avatar/group/avatar-group.d.ts +10 -2
  10. package/dist/avatar/group/avatar-group.js +10 -5
  11. package/dist/badge/count.d.ts +19 -0
  12. package/dist/badge/count.js +20 -0
  13. package/dist/badge/root/badge-root.d.ts +6 -2
  14. package/dist/badge/root/badge-root.js +8 -22
  15. package/dist/bar-chart/root/bar-chart-root.d.ts +13 -1
  16. package/dist/bar-chart/root/bar-chart-root.js +17 -4
  17. package/dist/blockquote/root/blockquote-root.d.ts +66 -8
  18. package/dist/blockquote/root/blockquote-root.js +85 -8
  19. package/dist/breadcrumbs/breadcrumb/breadcrumb.js +2 -2
  20. package/dist/breadcrumbs/root/breadcrumbs-root.d.ts +8 -1
  21. package/dist/breadcrumbs/root/breadcrumbs-root.js +5 -2
  22. package/dist/button/root/button-root.d.ts +10 -1
  23. package/dist/button/root/button-root.js +3 -2
  24. package/dist/button-group/arrows.d.ts +14 -0
  25. package/dist/button-group/arrows.js +10 -0
  26. package/dist/button-group/root/button-group-root.d.ts +144 -3
  27. package/dist/button-group/root/button-group-root.js +142 -2
  28. package/dist/callout/root/callout-root.d.ts +16 -2
  29. package/dist/callout/root/callout-root.js +16 -4
  30. package/dist/canvas/describe.d.ts +10 -0
  31. package/dist/canvas/describe.js +9 -0
  32. package/dist/canvas/edge-pan.d.ts +61 -0
  33. package/dist/canvas/edge-pan.js +63 -0
  34. package/dist/canvas/neighbor.d.ts +17 -0
  35. package/dist/canvas/neighbor.js +1 -0
  36. package/dist/canvas/node/canvas-node.d.ts +12 -2
  37. package/dist/canvas/node/canvas-node.js +8 -3
  38. package/dist/canvas/root/canvas-document.d.ts +10 -0
  39. package/dist/canvas/root/canvas-document.js +1 -0
  40. package/dist/canvas/root/canvas-root.d.ts +168 -9
  41. package/dist/canvas/root/canvas-root.js +239 -69
  42. package/dist/canvas/snap.d.ts +42 -0
  43. package/dist/canvas/snap.js +32 -0
  44. package/dist/carousel/root/carousel-root.d.ts +9 -3
  45. package/dist/carousel/root/carousel-root.js +17 -10
  46. package/dist/chat/composer/chat-composer.d.ts +5 -0
  47. package/dist/chat/composer/chat-composer.js +4 -1
  48. package/dist/chat/message/chat-message.d.ts +9 -5
  49. package/dist/chat/message/chat-message.js +8 -4
  50. package/dist/chat/naming.js +2 -2
  51. package/dist/chat/root/chat-root.d.ts +40 -4
  52. package/dist/chat/root/chat-root.js +38 -14
  53. package/dist/checkbox/root/checkbox-root.d.ts +11 -0
  54. package/dist/checkbox/root/checkbox-root.js +8 -2
  55. package/dist/checkbox-group/root/checkbox-group-root.d.ts +24 -0
  56. package/dist/checkbox-group/root/checkbox-group-root.js +28 -12
  57. package/dist/checkbox-group/select-all.d.ts +11 -0
  58. package/dist/checkbox-group/select-all.js +5 -0
  59. package/dist/code-block/root/code-block-root.d.ts +20 -8
  60. package/dist/code-block/root/code-block-root.js +16 -5
  61. package/dist/color-input/root/color-input-root.d.ts +13 -0
  62. package/dist/color-input/root/color-input-root.js +18 -5
  63. package/dist/color-picker/root/color-picker-root.d.ts +19 -3
  64. package/dist/color-picker/root/color-picker-root.js +52 -24
  65. package/dist/color-picker/wheel.d.ts +11 -0
  66. package/dist/color-picker/wheel.js +9 -0
  67. package/dist/combobox/root/combobox-root.d.ts +106 -18
  68. package/dist/combobox/root/combobox-root.js +101 -26
  69. package/dist/command/root/command-root.d.ts +19 -9
  70. package/dist/command/root/command-root.js +9 -4
  71. package/dist/copy-button/root/copy-button-root.d.ts +5 -0
  72. package/dist/copy-button/root/copy-button-root.js +7 -2
  73. package/dist/data-table/root/data-table-root.d.ts +171 -29
  74. package/dist/data-table/root/data-table-root.js +284 -161
  75. package/dist/date-input/root/date-input-root.d.ts +32 -9
  76. package/dist/date-input/root/date-input-root.js +66 -44
  77. package/dist/date-picker/root/date-picker-root.d.ts +38 -15
  78. package/dist/date-picker/root/date-picker-root.js +52 -33
  79. package/dist/description-list/item/description-list-item.d.ts +4 -0
  80. package/dist/description-list/item/description-list-item.js +7 -1
  81. package/dist/dialog/root/dialog-root.d.ts +12 -1
  82. package/dist/dialog/root/dialog-root.js +11 -4
  83. package/dist/divider/root/divider-root.d.ts +45 -16
  84. package/dist/divider/root/divider-root.js +28 -4
  85. package/dist/donut-chart/root/donut-chart-root.d.ts +5 -0
  86. package/dist/donut-chart/root/donut-chart-root.js +8 -5
  87. package/dist/drawer/root/drawer-root.d.ts +12 -1
  88. package/dist/drawer/root/drawer-root.js +9 -2
  89. package/dist/drilldown/item/drilldown-item.js +3 -4
  90. package/dist/drilldown/root/drilldown-root.d.ts +5 -0
  91. package/dist/drilldown/root/drilldown-root.js +4 -1
  92. package/dist/element-events.generated.js +26 -3
  93. package/dist/empty/root/empty-root.d.ts +17 -3
  94. package/dist/empty/root/empty-root.js +29 -5
  95. package/dist/file-input/root/file-input-root.d.ts +18 -3
  96. package/dist/file-input/root/file-input-root.js +34 -18
  97. package/dist/file-input/status.js +2 -1
  98. package/dist/filter-input/chip/filter-chip.d.ts +13 -0
  99. package/dist/filter-input/chip/filter-chip.js +7 -3
  100. package/dist/filter-input/menu/filter-menu.d.ts +5 -0
  101. package/dist/filter-input/menu/filter-menu.js +3 -1
  102. package/dist/filter-input/root/filter-input-root.d.ts +20 -3
  103. package/dist/filter-input/root/filter-input-root.js +8 -4
  104. package/dist/format-date/fields.d.ts +20 -0
  105. package/dist/format-date/fields.js +14 -0
  106. package/dist/format-date/options.d.ts +2 -1
  107. package/dist/format-date/options.js +9 -38
  108. package/dist/format-date/root/format-date-root.d.ts +55 -5
  109. package/dist/format-date/root/format-date-root.js +29 -34
  110. package/dist/graph/root/graph-model.d.ts +11 -0
  111. package/dist/graph/root/graph-model.js +4 -0
  112. package/dist/graph/root/graph-root.d.ts +101 -14
  113. package/dist/graph/root/graph-root.js +140 -46
  114. package/dist/heatmap/root/heatmap-root.d.ts +37 -4
  115. package/dist/heatmap/root/heatmap-root.js +51 -16
  116. package/dist/icon-button/root/icon-button-root.d.ts +5 -0
  117. package/dist/icon-button/root/icon-button-root.js +1 -0
  118. package/dist/image/root/image-root.d.ts +11 -0
  119. package/dist/input/root/input-root.d.ts +5 -0
  120. package/dist/input/root/input-root.js +4 -1
  121. package/dist/kbd/root/kbd-root.js +1 -2
  122. package/dist/legend/root/legend-root.js +4 -17
  123. package/dist/lightbox/root/lightbox-root.d.ts +14 -4
  124. package/dist/lightbox/root/lightbox-root.js +25 -7
  125. package/dist/line-chart/root/line-chart-root.d.ts +5 -0
  126. package/dist/line-chart/root/line-chart-root.js +4 -2
  127. package/dist/list/item/list-item.d.ts +32 -0
  128. package/dist/list/item/list-item.js +34 -7
  129. package/dist/list/root/list-root.d.ts +87 -0
  130. package/dist/list/root/list-root.js +119 -23
  131. package/dist/listbox/reorder/index.d.ts +1 -0
  132. package/dist/listbox/reorder/index.js +4 -0
  133. package/dist/listbox/reorder/listbox-reorder.d.ts +83 -0
  134. package/dist/listbox/reorder/listbox-reorder.js +151 -0
  135. package/dist/listbox/root/listbox-root.d.ts +185 -33
  136. package/dist/listbox/root/listbox-root.js +166 -136
  137. package/dist/loader/root/loader-root.d.ts +5 -0
  138. package/dist/loader/root/loader-root.js +3 -1
  139. package/dist/map/area/map-area.d.ts +5 -0
  140. package/dist/map/area/map-area.js +3 -1
  141. package/dist/map/buildings/map-buildings.d.ts +5 -0
  142. package/dist/map/buildings/map-buildings.js +3 -1
  143. package/dist/map/contours/map-contours.d.ts +5 -0
  144. package/dist/map/contours/map-contours.js +3 -1
  145. package/dist/map/landcover/map-landcover.d.ts +5 -0
  146. package/dist/map/landcover/map-landcover.js +3 -1
  147. package/dist/map/marker/map-marker.d.ts +18 -2
  148. package/dist/map/marker/map-marker.js +13 -5
  149. package/dist/map/points/map-points.d.ts +5 -0
  150. package/dist/map/points/map-points.js +6 -4
  151. package/dist/map/position/map-position.d.ts +5 -0
  152. package/dist/map/position/map-position.js +3 -1
  153. package/dist/map/raster/map-raster.d.ts +5 -0
  154. package/dist/map/raster/map-raster.js +3 -1
  155. package/dist/map/root/map-root.d.ts +73 -16
  156. package/dist/map/root/map-root.js +122 -44
  157. package/dist/map/route/map-route.d.ts +5 -0
  158. package/dist/map/route/map-route.js +3 -1
  159. package/dist/map/terrain/map-terrain.d.ts +5 -0
  160. package/dist/map/terrain/map-terrain.js +3 -1
  161. package/dist/megamenu/root/megamenu-root.js +4 -11
  162. package/dist/menu/root/menu-root.d.ts +7 -2
  163. package/dist/menu/root/menu-root.js +3 -1
  164. package/dist/meter/root/meter-root.d.ts +16 -3
  165. package/dist/meter/root/meter-root.js +12 -5
  166. package/dist/navigation/root/navigation-root.d.ts +5 -0
  167. package/dist/navigation/root/navigation-root.js +7 -8
  168. package/dist/notifications/group/notification-group.d.ts +8 -1
  169. package/dist/notifications/group/notification-group.js +12 -6
  170. package/dist/notifications/notification/notification.d.ts +17 -1
  171. package/dist/notifications/notification/notification.js +6 -2
  172. package/dist/notifications/root/notifications-root.d.ts +49 -5
  173. package/dist/notifications/root/notifications-root.js +36 -8
  174. package/dist/number-input/root/number-input-root.d.ts +21 -8
  175. package/dist/number-input/root/number-input-root.js +26 -11
  176. package/dist/object-inspector/root/object-inspector-root.d.ts +56 -13
  177. package/dist/object-inspector/root/object-inspector-root.js +41 -30
  178. package/dist/outline/root/outline-root.d.ts +5 -0
  179. package/dist/outline/root/outline-root.js +3 -1
  180. package/dist/pagination/root/pagination-root.d.ts +7 -1
  181. package/dist/pagination/root/pagination-root.js +16 -7
  182. package/dist/pagination/size/pagination-size.d.ts +8 -3
  183. package/dist/pagination/size/pagination-size.js +5 -3
  184. package/dist/pagination/summary/pagination-summary.d.ts +8 -6
  185. package/dist/pagination/summary/pagination-summary.js +4 -9
  186. package/dist/pin-input/code.d.ts +23 -0
  187. package/dist/pin-input/code.js +21 -0
  188. package/dist/pin-input/root/pin-input-root.d.ts +9 -3
  189. package/dist/pin-input/root/pin-input-root.js +13 -23
  190. package/dist/popover/root/popover-root.d.ts +12 -2
  191. package/dist/popover/root/popover-root.js +10 -4
  192. package/dist/progress/root/progress-root.d.ts +7 -2
  193. package/dist/progress/root/progress-root.js +5 -2
  194. package/dist/qr-code/name.d.ts +3 -2
  195. package/dist/qr-code/name.js +2 -2
  196. package/dist/qr-code/root/qr-code-root.d.ts +26 -5
  197. package/dist/qr-code/root/qr-code-root.js +27 -6
  198. package/dist/radio/group/radio-group.d.ts +11 -0
  199. package/dist/radio/group/radio-group.js +8 -2
  200. package/dist/rating/root/rating-root.d.ts +12 -1
  201. package/dist/rating/root/rating-root.js +10 -3
  202. package/dist/scatter-chart/measures.d.ts +22 -0
  203. package/dist/scatter-chart/measures.js +11 -0
  204. package/dist/scatter-chart/root/scatter-chart-root.d.ts +22 -8
  205. package/dist/scatter-chart/root/scatter-chart-root.js +25 -23
  206. package/dist/select/root/select-root.d.ts +67 -8
  207. package/dist/select/root/select-root.js +45 -11
  208. package/dist/skip-link/root/skip-link-root.d.ts +5 -0
  209. package/dist/skip-link/root/skip-link-root.js +3 -1
  210. package/dist/slider/root/slider-root.d.ts +7 -2
  211. package/dist/slider/root/slider-root.js +11 -5
  212. package/dist/sparkline/readings.d.ts +15 -5
  213. package/dist/sparkline/readings.js +3 -3
  214. package/dist/sparkline/root/sparkline-root.d.ts +9 -4
  215. package/dist/sparkline/root/sparkline-root.js +9 -3
  216. package/dist/speed-dial/group/speed-dial-group.d.ts +48 -0
  217. package/dist/speed-dial/group/speed-dial-group.js +43 -0
  218. package/dist/speed-dial/index.d.ts +1 -0
  219. package/dist/speed-dial/index.js +1 -0
  220. package/dist/speed-dial/item/speed-dial-item.d.ts +26 -1
  221. package/dist/speed-dial/item/speed-dial-item.js +41 -3
  222. package/dist/speed-dial/long-press.d.ts +50 -0
  223. package/dist/speed-dial/long-press.js +48 -0
  224. package/dist/speed-dial/root/speed-dial-root.d.ts +85 -1
  225. package/dist/speed-dial/root/speed-dial-root.js +117 -5
  226. package/dist/splitter/root/splitter-root.d.ts +12 -3
  227. package/dist/splitter/root/splitter-root.js +22 -4
  228. package/dist/steps/root/steps-root.d.ts +9 -2
  229. package/dist/steps/root/steps-root.js +6 -3
  230. package/dist/steps/step/step.d.ts +12 -0
  231. package/dist/steps/step/step.js +11 -2
  232. package/dist/switch/root/switch-root.d.ts +11 -0
  233. package/dist/switch/root/switch-root.js +8 -2
  234. package/dist/table/cell/table-cell.d.ts +8 -1
  235. package/dist/table/cell/table-cell.js +6 -2
  236. package/dist/table/column/table-column.d.ts +11 -4
  237. package/dist/table/column/table-column.js +15 -10
  238. package/dist/table/grid-controller.d.ts +122 -0
  239. package/dist/table/grid-controller.js +299 -0
  240. package/dist/table/root/table-root.d.ts +154 -8
  241. package/dist/table/root/table-root.js +197 -38
  242. package/dist/table/row/table-row.d.ts +55 -1
  243. package/dist/table/row/table-row.js +60 -7
  244. package/dist/tabs/root/tabs-root.d.ts +5 -0
  245. package/dist/tabs/root/tabs-root.js +3 -1
  246. package/dist/tag/group/tag-group.d.ts +5 -0
  247. package/dist/tag/group/tag-group.js +8 -15
  248. package/dist/tag/root/tag-root.d.ts +14 -1
  249. package/dist/tag/root/tag-root.js +11 -8
  250. package/dist/textarea/root/textarea-root.d.ts +5 -0
  251. package/dist/textarea/root/textarea-root.js +3 -1
  252. package/dist/time-input/root/time-input-root.d.ts +14 -7
  253. package/dist/time-input/root/time-input-root.js +43 -32
  254. package/dist/time-picker/root/time-picker-root.d.ts +16 -7
  255. package/dist/time-picker/root/time-picker-root.js +28 -12
  256. package/dist/toast/item/toast-item.d.ts +13 -3
  257. package/dist/toast/item/toast-item.js +2 -0
  258. package/dist/toast/root/toast-root.d.ts +22 -2
  259. package/dist/toast/root/toast-root.js +24 -17
  260. package/dist/toggle/group/toggle-group.js +3 -5
  261. package/dist/toolbar/root/toolbar-root.d.ts +36 -0
  262. package/dist/toolbar/root/toolbar-root.js +43 -9
  263. package/dist/tooltip/root/tooltip-root.d.ts +27 -17
  264. package/dist/tooltip/root/tooltip-root.js +1 -2
  265. package/dist/tour/root/tour-root.d.ts +8 -2
  266. package/dist/tour/root/tour-root.js +4 -2
  267. package/dist/tour/stop/tour-stop.d.ts +5 -0
  268. package/dist/tour/stop/tour-stop.js +6 -1
  269. package/dist/tree/grip.d.ts +5 -0
  270. package/dist/tree/grip.js +1 -0
  271. package/dist/tree/item/tree-item.d.ts +24 -0
  272. package/dist/tree/item/tree-item.js +27 -5
  273. package/dist/tree/root/tree-root.d.ts +66 -1
  274. package/dist/tree/root/tree-root.js +77 -5
  275. package/dist/trend/root/trend-root.d.ts +20 -4
  276. package/dist/trend/root/trend-root.js +20 -5
  277. package/dist/video/root/video-root.d.ts +23 -3
  278. package/dist/video/root/video-root.js +56 -15
  279. package/dist/video-playlist/menu/video-playlist-menu.d.ts +5 -0
  280. package/dist/video-playlist/menu/video-playlist-menu.js +3 -1
  281. package/dist/video-playlist/root/video-playlist-root.d.ts +5 -0
  282. package/dist/video-playlist/root/video-playlist-root.js +3 -1
  283. package/dist/virtual-list/root/virtual-list-root.d.ts +19 -3
  284. package/dist/virtual-list/root/virtual-list-root.js +10 -19
  285. package/lint.json +1 -1
  286. package/package.json +7 -6
  287. package/types/jsx.d.ts +6005 -2114
  288. package/types/svelte.d.ts +1 -0
  289. package/types/vue.d.ts +1594 -676
  290. package/types/words.d.ts +3280 -0
  291. package/dist/kbd/keys.d.ts +0 -29
  292. package/dist/kbd/keys.js +0 -52
  293. package/dist/toast/hotkey.d.ts +0 -22
  294. package/dist/toast/hotkey.js +0 -23
  295. package/dist/tooltip/focus-target.d.ts +0 -6
  296. package/dist/tooltip/focus-target.js +0 -9
package/types/vue.d.ts CHANGED
@@ -129,6 +129,7 @@ import type {
129
129
  HelixHeadlessSkipLink,
130
130
  HelixHeadlessSlider,
131
131
  HelixHeadlessSparkline,
132
+ HelixHeadlessSpeedDialGroup,
132
133
  HelixHeadlessSpeedDialItem,
133
134
  HelixHeadlessSpeedDial,
134
135
  HelixHeadlessSplitter,
@@ -174,6 +175,7 @@ import type {
174
175
  ToggleEvent,
175
176
  HelixDismissEvent,
176
177
  HelixScrolledEvent,
178
+ HelixBeforeChangeEvent,
177
179
  HelixPressEvent,
178
180
  HelixBeforeMoveEvent,
179
181
  HelixBeforeReconnectEvent,
@@ -194,7 +196,6 @@ import type {
194
196
  HelixBeforePinEvent,
195
197
  HelixHistoryEvent,
196
198
  HelixPinEvent,
197
- HelixBeforeChangeEvent,
198
199
  HelixBeforeToggleEvent,
199
200
  HelixCopyEvent,
200
201
  HelixSampleEndEvent,
@@ -203,6 +204,7 @@ import type {
203
204
  HelixFilterEvent,
204
205
  HelixLoadMoreEvent,
205
206
  HelixCopyErrorEvent,
207
+ HelixBeforeReorderEvent,
206
208
  HelixExpandEvent,
207
209
  HelixFilteredEvent,
208
210
  HelixNavigateEvent,
@@ -453,6 +455,22 @@ export type HelixHeadlessAnnouncementVueProps = {
453
455
  Read once when the announcement is first rendered, as `Toast` reads its
454
456
  own. The clock stops while the pointer or focus is on the announcement. */
455
457
  duration?: (HelixHeadlessAnnouncement["duration"]) | undefined;
458
+ /** The key that moves focus to the announcement's first control, and back
459
+ to where it was, written as keys joined by `+`, such as `F6` or `Alt+A`.
460
+
461
+ F6 by default, the key React Aria's regions answer to. Empty turns it
462
+ off. With several announcements, the first one in the page takes focus. */
463
+ hotkey?: (HelixHeadlessAnnouncement["hotkey"]) | undefined;
464
+ /** The name of the announcement's region, which screen readers list among
465
+ the page's landmarks. Translate it with the rest of your interface.
466
+
467
+ Empty leaves the announcement no region. */
468
+ label?: (HelixHeadlessAnnouncement["label"]) | undefined;
469
+ /** Whether the announcement waits its turn behind the queued announcements
470
+ before it in the same parent, showing when the last of them is removed.
471
+
472
+ Off by default, so every announcement on a page shows at once. */
473
+ queued?: (HelixHeadlessAnnouncement["queued"]) | undefined;
456
474
  /** The band's color.
457
475
 
458
476
  Paint only: unlike `Callout`, no value here draws a mark, changes the label,
@@ -481,14 +499,22 @@ axes, which is the test the registry answers to. */
481
499
  `attribute` is spelled out because Lit lowercases a property name to
482
500
  derive one rather than dash-casing it, so this would otherwise be
483
501
  reachable only as `dismisslabel`, which nobody would guess and no linter
484
- would catch. */
502
+ would catch.
503
+
504
+ A word property: register it for a locale under the host's key. A family
505
+ that names the control otherwise, such as Tag's `Remove {label}`,
506
+ declares its own English with `@words` above the override. */
485
507
  "dismiss-label"?: (HelixHeadlessAnnouncement["dismissLabel"]) | undefined;
486
508
  /** The dismiss control's label, read by screen readers.
487
509
 
488
510
  `attribute` is spelled out because Lit lowercases a property name to
489
511
  derive one rather than dash-casing it, so this would otherwise be
490
512
  reachable only as `dismisslabel`, which nobody would guess and no linter
491
- would catch. */
513
+ would catch.
514
+
515
+ A word property: register it for a locale under the host's key. A family
516
+ that names the control otherwise, such as Tag's `Remove {label}`,
517
+ declares its own English with `@words` above the override. */
492
518
  dismissLabel?: (HelixHeadlessAnnouncement["dismissLabel"]) | undefined;
493
519
  };
494
520
 
@@ -583,6 +609,14 @@ the total.
583
609
  Absent stacks the amounts, so the top edge is the total. Set, every reading
584
610
  fills the height and the bands are shares of it. */
585
611
  share?: (HelixHeadlessAreaChart["share"]) | undefined;
612
+ /** The summary's sentence. `{reading}` is the latest reading's name,
613
+ `{totalLabel}` the name for the sum, `{total}` the sum, written in the
614
+ locale, and `{shares}` each part's share, listed as the locale lists. */
615
+ "summary-label"?: (HelixHeadlessAreaChart["summaryLabel"]) | undefined;
616
+ /** The summary's sentence. `{reading}` is the latest reading's name,
617
+ `{totalLabel}` the name for the sum, `{total}` the sum, written in the
618
+ locale, and `{shares}` each part's share, listed as the locale lists. */
619
+ summaryLabel?: (HelixHeadlessAreaChart["summaryLabel"]) | undefined;
586
620
  /** The name for the sum of the parts, shown in the tooltip and the summary. */
587
621
  "total-label"?: (HelixHeadlessAreaChart["totalLabel"]) | undefined;
588
622
  /** The name for the sum of the parts, shown in the tooltip and the summary. */
@@ -604,8 +638,8 @@ words and is already written. */
604
638
  /** The locale the chart's own numbers are written in: its axis, its
605
639
  percentages and its totals, such as `de` for `1.240` and `32 %`.
606
640
 
607
- Absent uses the runtime's own. The table's cells are shown as the table
608
- writes them, whatever this says. */
641
+ Absent reads the nearest `lang`, then the runtime's own. The table's
642
+ cells are shown as the table writes them, whatever this says. */
609
643
  locale?: (HelixHeadlessAreaChart["locale"]) | undefined;
610
644
  /** Where a reading the keys moved to stands among the readings, said after
611
645
  it. `{position}` and `{count}` are replaced with the numbers, written in
@@ -647,14 +681,20 @@ everyone, assigning a matching property rather than an attribute.
647
681
  takes no default**: `max = 0` would stamp `max="0"` onto every host that
648
682
  never asked for a limit, including on the server. */
649
683
  max?: (HelixHeadlessAvatarGroup["max"]) | undefined;
650
- /** What a screen reader is told the count is, with `{count}` for the number
651
- and `{names}` for the people it stands for, by each avatar's `name`.
684
+ /** What a screen reader is told the count is, with `{count}` for the number,
685
+ written in the locale, and `{names}` for the people it stands for, by each
686
+ avatar's `name`, listed as the locale lists. A language that needs plural
687
+ forms writes them: `{count, plural, one {# osoba więcej: {names}} few
688
+ {# osoby więcej: {names}} other {# osób więcej: {names}}}`.
652
689
 
653
690
  The count shows "+3", which reads as "plus three" and says nothing about
654
691
  what was counted, nor who. */
655
692
  "overflow-label"?: (HelixHeadlessAvatarGroup["overflowLabel"]) | undefined;
656
- /** What a screen reader is told the count is, with `{count}` for the number
657
- and `{names}` for the people it stands for, by each avatar's `name`.
693
+ /** What a screen reader is told the count is, with `{count}` for the number,
694
+ written in the locale, and `{names}` for the people it stands for, by each
695
+ avatar's `name`, listed as the locale lists. A language that needs plural
696
+ forms writes them: `{count, plural, one {# osoba więcej: {names}} few
697
+ {# osoby więcej: {names}} other {# osób więcej: {names}}}`.
658
698
 
659
699
  The count shows "+3", which reads as "plus three" and says nothing about
660
700
  what was counted, nor who. */
@@ -746,11 +786,15 @@ shown as it is either way. */
746
786
 
747
787
  Required for a dot, which has no text to read. `{count}` is replaced with
748
788
  what the badge shows, so `label="{count} unread"` reads "8 unread" and
749
- stays current as `value` changes, with no label of yours to keep in step. */
789
+ stays current as `value` changes, with no label of yours to keep in step.
790
+ A language with plural forms writes them, `{count, plural, one {{count}
791
+ nieprzeczytana} few {{count} nieprzeczytane} other {{count}
792
+ nieprzeczytanych}}`, picked by the count in `locale`. */
750
793
  label?: (HelixHeadlessBadge["label"]) | undefined;
751
- /** The locale a count is written in under `format-options`, such as `de`.
794
+ /** The locale a count is written in under `format-options`, and whose plural
795
+ rules `label` picks a form by, such as `de`.
752
796
 
753
- Absent uses the runtime's own. */
797
+ Absent reads the nearest `lang`, then the runtime's own. */
754
798
  locale?: (HelixHeadlessBadge["locale"]) | undefined;
755
799
  /** The largest number the badge shows.
756
800
 
@@ -794,9 +838,11 @@ of many thin bars, where the eye has stopped counting.
794
838
  Furniture rather than data, so the rules are inside the `aria-hidden` plot
795
839
  and reach no reader through the table. */
796
840
  gridlines?: (HelixHeadlessBarChart["gridlines"]) | undefined;
797
- /** The word the summary puts before each series' highest reading. */
841
+ /** The name the summary gives each series' highest reading, `{highestLabel}`
842
+ in `summary-label`. */
798
843
  "highest-label"?: (HelixHeadlessBarChart["highestLabel"]) | undefined;
799
- /** The word the summary puts before each series' highest reading. */
844
+ /** The name the summary gives each series' highest reading, `{highestLabel}`
845
+ in `summary-label`. */
800
846
  highestLabel?: (HelixHeadlessBarChart["highestLabel"]) | undefined;
801
847
  /** The names of the series to draw as lines. The other series are drawn as
802
848
  columns.
@@ -874,6 +920,14 @@ the other. The scale fits the stacks. A series
874
920
  in `lines` is still a line, measured on its own reading; columns on the
875
921
  second scale stack among themselves. */
876
922
  stacked?: (HelixHeadlessBarChart["stacked"]) | undefined;
923
+ /** The summary's sentence. `{highestLabel}` is `highest-label`, and
924
+ `{readings}` each series' highest reading: the series, the category and
925
+ the reading as the table writes it. */
926
+ "summary-label"?: (HelixHeadlessBarChart["summaryLabel"]) | undefined;
927
+ /** The summary's sentence. `{highestLabel}` is `highest-label`, and
928
+ `{readings}` each series' highest reading: the series, the category and
929
+ the reading as the table writes it. */
930
+ summaryLabel?: (HelixHeadlessBarChart["summaryLabel"]) | undefined;
877
931
  /** The id of the table to read.
878
932
 
879
933
  Names a table in the same tree, so a chart inside another component's
@@ -891,8 +945,8 @@ words and is already written. */
891
945
  /** The locale the chart's own numbers are written in: its axis, its
892
946
  percentages and its totals, such as `de` for `1.240` and `32 %`.
893
947
 
894
- Absent uses the runtime's own. The table's cells are shown as the table
895
- writes them, whatever this says. */
948
+ Absent reads the nearest `lang`, then the runtime's own. The table's
949
+ cells are shown as the table writes them, whatever this says. */
896
950
  locale?: (HelixHeadlessBarChart["locale"]) | undefined;
897
951
  /** Where a reading the keys moved to stands among the readings, said after
898
952
  it. `{position}` and `{count}` are replaced with the numbers, written in
@@ -915,8 +969,19 @@ legend hid is not counted. */
915
969
  export type HelixHeadlessBarChartVueEvents = {};
916
970
 
917
971
  export type HelixHeadlessBlockquoteVueProps = {
918
- /** The URL of the source the passage came from. */
972
+ /** Who said it, and where, as words, such as "Maria Lopez, operations
973
+ manager". The `attribution` slot replaces them, for markup such as a link.
974
+
975
+ Words are served with the figure they name, where a server cannot see a
976
+ slotted attribution. */
977
+ attribution?: (HelixHeadlessBlockquote["attribution"]) | undefined;
978
+ /** The URL of the source the passage came from. Who said it goes in
979
+ `attribution`: a `cite` with words in it warns once, with the runtime kind
980
+ `cite-not-url`. */
919
981
  cite?: (HelixHeadlessBlockquote["cite"]) | undefined;
982
+ /** Whether to draw an opening quotation mark before the passage, in the
983
+ element's language. Leave the marks out of the text. */
984
+ marks?: (HelixHeadlessBlockquote["marks"]) | undefined;
920
985
  };
921
986
 
922
987
  export type HelixHeadlessBlockquoteVueEvents = {};
@@ -954,10 +1019,14 @@ export type HelixHeadlessBreadcrumbVueEvents = {};
954
1019
 
955
1020
  export type HelixHeadlessBreadcrumbsVueProps = {
956
1021
  /** The name of the button that shows a folded trail's hidden crumbs. `{count}`
957
- is replaced by how many it shows. Translate it with the page. */
1022
+ is how many it shows, written in the locale, and a language with plural
1023
+ forms writes them: `{count, plural, one {# weiteren zeigen} other {#
1024
+ weitere zeigen}}`. */
958
1025
  "expand-label"?: (HelixHeadlessBreadcrumbs["expandLabel"]) | undefined;
959
1026
  /** The name of the button that shows a folded trail's hidden crumbs. `{count}`
960
- is replaced by how many it shows. Translate it with the page. */
1027
+ is how many it shows, written in the locale, and a language with plural
1028
+ forms writes them: `{count, plural, one {# weiteren zeigen} other {#
1029
+ weitere zeigen}}`. */
961
1030
  expandLabel?: (HelixHeadlessBreadcrumbs["expandLabel"]) | undefined;
962
1031
  /** The landmark's name, read by screen readers. An `aria-label` on the host
963
1032
  wins over it. */
@@ -980,6 +1049,15 @@ attribute would put the whole path into the markup twice. */
980
1049
 
981
1050
  export type HelixHeadlessBreadcrumbsVueEvents = {};
982
1051
 
1052
+ /** `HelixHeadlessButtonGroup` component event */
1053
+ export type HelixHeadlessButtonGroupElementEvent<E = Event> = TypedEvent<
1054
+ HelixHeadlessButtonGroup,
1055
+ E
1056
+ >;
1057
+ /** `helix-before-change` event type */
1058
+ export type HelixHeadlessButtonGroupHelixBeforeChangeElementEvent =
1059
+ HelixHeadlessButtonGroupElementEvent<HelixBeforeChangeEvent>;
1060
+
983
1061
  export type HelixHeadlessButtonGroupVueProps = {
984
1062
  /** The group's name, read by screen readers.
985
1063
 
@@ -1004,9 +1082,32 @@ buttons sharing edges as one shape, and a wrapped row carries the corners of
1004
1082
  a first row into a second. Stacked, the same three keep one shape and one
1005
1083
  column. */
1006
1084
  orientation?: (HelixHeadlessButtonGroup["orientation"]) | undefined;
1085
+ /** Whether the buttons stay pressed: `single` keeps one pressed at a time and
1086
+ `multiple` any number. Unset, they are action buttons, each its own tab
1087
+ stop, as before.
1088
+
1089
+ Optional, so the attribute is absent until a consumer writes it. */
1090
+ "selection-mode"?: (HelixHeadlessButtonGroup["selectionMode"]) | undefined;
1091
+ /** Whether the buttons stay pressed: `single` keeps one pressed at a time and
1092
+ `multiple` any number. Unset, they are action buttons, each its own tab
1093
+ stop, as before.
1094
+
1095
+ Optional, so the attribute is absent until a consumer writes it. */
1096
+ selectionMode?: (HelixHeadlessButtonGroup["selectionMode"]) | undefined;
1097
+ /** The values of the pressed buttons, comma separated, in a selection mode.
1098
+ A button's own `value` names it, so a value holds no comma.
1099
+
1100
+ The attribute is the seed, and a press changes the property, which does
1101
+ not reflect, as a native control's `value` does not. */
1102
+ value?: (HelixHeadlessButtonGroup["value"]) | undefined;
1007
1103
  };
1008
1104
 
1009
- export type HelixHeadlessButtonGroupVueEvents = {};
1105
+ export type HelixHeadlessButtonGroupVueEvents = {
1106
+ /** Fired after a press changes `value`, in a selection mode. */
1107
+ change: HelixHeadlessButtonGroupElementEvent;
1108
+ /** Fired before a press changes `value`, with the value it would leave in `detail.value`. Cancelable: call `preventDefault()` to keep the buttons as they are. */
1109
+ "helix-before-change": HelixHeadlessButtonGroupHelixBeforeChangeElementEvent;
1110
+ };
1010
1111
 
1011
1112
  /** `HelixHeadlessButton` component event */
1012
1113
  export type HelixHeadlessButtonElementEvent<E = Event> = TypedEvent<
@@ -1079,7 +1180,11 @@ not text.
1079
1180
 
1080
1181
  Lives here rather than only on `IconButton` so the two share one render.
1081
1182
  An icon-only button without it is a control a screen reader announces as
1082
- "button" and nothing else. */
1183
+ "button" and nothing else.
1184
+
1185
+ Undefaulted, so a subclass's own default, such as Copy Button's `Copy`, is
1186
+ the first value its element receives and so the English its words fall
1187
+ back to. */
1083
1188
  label?: (HelixHeadlessButton["label"]) | undefined;
1084
1189
  /** Whether the action the button started is still running.
1085
1190
 
@@ -1215,14 +1320,28 @@ is the whole of the registry, which is why there is no `severity` beside it. */
1215
1320
  tone?: (HelixHeadlessCallout["tone"]) | undefined;
1216
1321
  /** What a screen reader is told the tone is, such as "Fehler".
1217
1322
 
1218
- Absent is the English for the tone: "Error", "Information", "Note",
1219
- "Success" or "Warning". */
1323
+ Absent is the tone's words in `tone-labels`, "Error", "Information",
1324
+ "Note", "Success" or "Warning" in English. */
1220
1325
  "tone-label"?: (HelixHeadlessCallout["toneLabel"]) | undefined;
1221
1326
  /** What a screen reader is told the tone is, such as "Fehler".
1222
1327
 
1223
- Absent is the English for the tone: "Error", "Information", "Note",
1224
- "Success" or "Warning". */
1328
+ Absent is the tone's words in `tone-labels`, "Error", "Information",
1329
+ "Note", "Success" or "Warning" in English. */
1225
1330
  toneLabel?: (HelixHeadlessCallout["toneLabel"]) | undefined;
1331
+ /** What a screen reader is told each tone is, by the tone's name, written as
1332
+ JSON in the attribute: `tone-labels='{"danger":"Fehler"}'`. A tone left
1333
+ out keeps its English, and `tone-label` wins over both.
1334
+
1335
+ `danger` is said as "Error", the word a reader understands, and
1336
+ `neutral` as "Note", for what the passage is. */
1337
+ "tone-labels"?: (HelixHeadlessCallout["toneLabels"]) | undefined;
1338
+ /** What a screen reader is told each tone is, by the tone's name, written as
1339
+ JSON in the attribute: `tone-labels='{"danger":"Fehler"}'`. A tone left
1340
+ out keeps its English, and `tone-label` wins over both.
1341
+
1342
+ `danger` is said as "Error", the word a reader understands, and
1343
+ `neutral` as "Note", for what the passage is. */
1344
+ toneLabels?: (HelixHeadlessCallout["toneLabels"]) | undefined;
1226
1345
  /** Whether the element shows a control that dismisses it. */
1227
1346
  dismissible?: (HelixHeadlessCallout["dismissible"]) | undefined;
1228
1347
  /** The dismiss control's label, read by screen readers.
@@ -1230,14 +1349,22 @@ Absent is the English for the tone: "Error", "Information", "Note",
1230
1349
  `attribute` is spelled out because Lit lowercases a property name to
1231
1350
  derive one rather than dash-casing it, so this would otherwise be
1232
1351
  reachable only as `dismisslabel`, which nobody would guess and no linter
1233
- would catch. */
1352
+ would catch.
1353
+
1354
+ A word property: register it for a locale under the host's key. A family
1355
+ that names the control otherwise, such as Tag's `Remove {label}`,
1356
+ declares its own English with `@words` above the override. */
1234
1357
  "dismiss-label"?: (HelixHeadlessCallout["dismissLabel"]) | undefined;
1235
1358
  /** The dismiss control's label, read by screen readers.
1236
1359
 
1237
1360
  `attribute` is spelled out because Lit lowercases a property name to
1238
1361
  derive one rather than dash-casing it, so this would otherwise be
1239
1362
  reachable only as `dismisslabel`, which nobody would guess and no linter
1240
- would catch. */
1363
+ would catch.
1364
+
1365
+ A word property: register it for a locale under the host's key. A family
1366
+ that names the control otherwise, such as Tag's `Remove {label}`,
1367
+ declares its own English with `@words` above the override. */
1241
1368
  dismissLabel?: (HelixHeadlessCallout["dismissLabel"]) | undefined;
1242
1369
  };
1243
1370
 
@@ -1437,6 +1564,12 @@ export type HelixHeadlessCanvasHelixSelectElementEvent =
1437
1564
  HelixHeadlessCanvasElementEvent<HelixSelectEvent>;
1438
1565
 
1439
1566
  export type HelixHeadlessCanvasVueProps = {
1567
+ /** The hint shown when the board, waiting to be pressed with
1568
+ `gestures="activate"`, is scrolled or swiped over. */
1569
+ "activate-hint-label"?: (HelixHeadlessCanvas["activateHintLabel"]) | undefined;
1570
+ /** The hint shown when the board, waiting to be pressed with
1571
+ `gestures="activate"`, is scrolled or swiped over. */
1572
+ activateHintLabel?: (HelixHeadlessCanvas["activateHintLabel"]) | undefined;
1440
1573
  /** The text read with a card to say where its connections come from, with `{cards}`. */
1441
1574
  "comes-from-label"?: (HelixHeadlessCanvas["comesFromLabel"]) | undefined;
1442
1575
  /** The text read with a card to say where its connections come from, with `{cards}`. */
@@ -1467,6 +1600,16 @@ this, so a reader hears the ends first and what the line says after. */
1467
1600
  Its own label, where it has one, is its description rather than part of
1468
1601
  this, so a reader hears the ends first and what the line says after. */
1469
1602
  connectionLabel?: (HelixHeadlessCanvas["connectionLabel"]) | undefined;
1603
+ /** The name of the group of controls, read by screen readers, which names
1604
+ what the controls drive rather than the mechanism. */
1605
+ "controls-label"?: (HelixHeadlessCanvas["controlsLabel"]) | undefined;
1606
+ /** The name of the group of controls, read by screen readers, which names
1607
+ what the controls drive rather than the mechanism. */
1608
+ controlsLabel?: (HelixHeadlessCanvas["controlsLabel"]) | undefined;
1609
+ /** The board's name where `label` is empty. */
1610
+ "fallback-label"?: (HelixHeadlessCanvas["fallbackLabel"]) | undefined;
1611
+ /** The board's name where `label` is empty. */
1612
+ fallbackLabel?: (HelixHeadlessCanvas["fallbackLabel"]) | undefined;
1470
1613
  /** The accessible name for the board. Required.
1471
1614
 
1472
1615
  A document has no name of its own in the format, and "Canvas" names the
@@ -1490,6 +1633,26 @@ as the list.
1490
1633
  The list is joined the way the page's language joins one, "Second and
1491
1634
  Third", rather than with a comma this component chose. */
1492
1635
  leadsToLabel?: (HelixHeadlessCanvas["leadsToLabel"]) | undefined;
1636
+ /** The text read with a card that has connections both ways. `{leadsTo}` is
1637
+ `leads-to-label` and `{comesFrom}` is `comes-from-label`, each filled in. */
1638
+ "linked-label"?: (HelixHeadlessCanvas["linkedLabel"]) | undefined;
1639
+ /** The text read with a card that has connections both ways. `{leadsTo}` is
1640
+ `leads-to-label` and `{comesFrom}` is `comes-from-label`, each filled in. */
1641
+ linkedLabel?: (HelixHeadlessCanvas["linkedLabel"]) | undefined;
1642
+ /** What screen readers hear after a key moves a card, with `{name}` for the
1643
+ card and `{x}` and `{y}` for where it now is, in the document's units.
1644
+
1645
+ **A move a reader cannot see has to be said.** Shift with an arrow moved
1646
+ the card and said nothing, so a reader moving one by keys could not tell
1647
+ whether it had moved, or how far. */
1648
+ "moved-label"?: (HelixHeadlessCanvas["movedLabel"]) | undefined;
1649
+ /** What screen readers hear after a key moves a card, with `{name}` for the
1650
+ card and `{x}` and `{y}` for where it now is, in the document's units.
1651
+
1652
+ **A move a reader cannot see has to be said.** Shift with an arrow moved
1653
+ the card and said nothing, so a reader moving one by keys could not tell
1654
+ whether it had moved, or how far. */
1655
+ movedLabel?: (HelixHeadlessCanvas["movedLabel"]) | undefined;
1493
1656
  /** The order the arrow keys and screen readers move through the cards:
1494
1657
  `spatial` or `edges`.
1495
1658
 
@@ -1530,6 +1693,14 @@ walk the cards. */
1530
1693
  /** The text announced when a connection's end is picked up, with `{from}` and
1531
1694
  `{to}`. */
1532
1695
  reconnectingLabel?: (HelixHeadlessCanvas["reconnectingLabel"]) | undefined;
1696
+ /** What screen readers hear after a key resizes a card, with `{name}` for the
1697
+ card and `{width}` and `{height}` for its new size, in the document's
1698
+ units. */
1699
+ "resized-label"?: (HelixHeadlessCanvas["resizedLabel"]) | undefined;
1700
+ /** What screen readers hear after a key resizes a card, with `{name}` for the
1701
+ card and `{width}` and `{height}` for its new size, in the document's
1702
+ units. */
1703
+ resizedLabel?: (HelixHeadlessCanvas["resizedLabel"]) | undefined;
1533
1704
  /** The names of the selected cards and connections, comma separated. Empty
1534
1705
  when nothing is selected.
1535
1706
 
@@ -1550,6 +1721,45 @@ on its board across cards and connections both, and may not hold a comma.
1550
1721
 
1551
1722
  Written to select from outside, and read to act on the selection. */
1552
1723
  selected?: (HelixHeadlessCanvas["selected"]) | undefined;
1724
+ /** What a selected card or connection adds to what screen readers hear on
1725
+ it, before its tone and its connections. Empty adds nothing.
1726
+
1727
+ A card is an article and a connection a button, and neither has a selected
1728
+ state for `aria-selected` to carry, so the state is said in words. */
1729
+ "selected-label"?: (HelixHeadlessCanvas["selectedLabel"]) | undefined;
1730
+ /** What a selected card or connection adds to what screen readers hear on
1731
+ it, before its tone and its connections. Empty adds nothing.
1732
+
1733
+ A card is an article and a connection a button, and neither has a selected
1734
+ state for `aria-selected` to carry, so the state is said in words. */
1735
+ selectedLabel?: (HelixHeadlessCanvas["selectedLabel"]) | undefined;
1736
+ /** What screen readers hear after the selection grows or shrinks, with
1737
+ `{count}` for how many cards and connections are selected, written in the
1738
+ locale, where a language that needs plural forms writes them: by Space, a
1739
+ click with Shift, Command or Control, Command or Control with A, a box
1740
+ drawn across the board, or Escape.
1741
+
1742
+ A selection of one made by arriving on a card or clicking it is not said,
1743
+ since the card is. */
1744
+ "selection-label"?: (HelixHeadlessCanvas["selectionLabel"]) | undefined;
1745
+ /** What screen readers hear after the selection grows or shrinks, with
1746
+ `{count}` for how many cards and connections are selected, written in the
1747
+ locale, where a language that needs plural forms writes them: by Space, a
1748
+ click with Shift, Command or Control, Command or Control with A, a box
1749
+ drawn across the board, or Escape.
1750
+
1751
+ A selection of one made by arriving on a card or clicking it is not said,
1752
+ since the card is. */
1753
+ selectionLabel?: (HelixHeadlessCanvas["selectionLabel"]) | undefined;
1754
+ /** Snaps the cards a reader moves or resizes to a multiple of this many of the
1755
+ document's units, such as `32` to land on the lines `grid` draws.
1756
+
1757
+ **A drag lets go on the nearest line and a key goes to the next one.**
1758
+ Shift with an arrow moves a card to the next line that way, rather than
1759
+ by its step of 16, and Alt with an arrow moves its bottom right corner
1760
+ the same way. A group moves with what it carries, so a card inside one
1761
+ keeps its place in it. Absent, cards land where they are let go. */
1762
+ snap?: (HelixHeadlessCanvas["snap"]) | undefined;
1553
1763
  /** The text announced when a connection is stopped before it is requested. */
1554
1764
  "stopped-label"?: (HelixHeadlessCanvas["stoppedLabel"]) | undefined;
1555
1765
  /** The text announced when a connection is stopped before it is requested. */
@@ -1572,12 +1782,26 @@ red is "blocked" on one board and "urgent" on the next. A reader who can
1572
1782
  see the board is told by the color; this is how a reader who cannot is
1573
1783
  told the same. A tone left out is not read. */
1574
1784
  toneLabels?: (HelixHeadlessCanvas["toneLabels"]) | undefined;
1575
- /** The hint shown when a surface waiting to be pressed is scrolled or
1576
- swiped over, with `gestures="activate"`. Absent is the family's own. */
1577
- "activate-hint-label"?: (HelixHeadlessCanvas["activateHintLabel"]) | undefined;
1578
- /** The hint shown when a surface waiting to be pressed is scrolled or
1579
- swiped over, with `gestures="activate"`. Absent is the family's own. */
1580
- activateHintLabel?: (HelixHeadlessCanvas["activateHintLabel"]) | undefined;
1785
+ /** The hint shown when one finger swipes over the board with `gestures="cooperative"`. */
1786
+ "two-finger-hint-label"?: (HelixHeadlessCanvas["twoFingerHintLabel"]) | undefined;
1787
+ /** The hint shown when one finger swipes over the board with `gestures="cooperative"`. */
1788
+ twoFingerHintLabel?: (HelixHeadlessCanvas["twoFingerHintLabel"]) | undefined;
1789
+ /** The line shown while the board, with `gestures="activate"`, has the gestures. */
1790
+ "using-label"?: (HelixHeadlessCanvas["usingLabel"]) | undefined;
1791
+ /** The line shown while the board, with `gestures="activate"`, has the gestures. */
1792
+ usingLabel?: (HelixHeadlessCanvas["usingLabel"]) | undefined;
1793
+ /** The hint shown when the wheel scrolls past the board with
1794
+ `gestures="cooperative"`. `{key}` is ⌘ on a Mac and Ctrl elsewhere. */
1795
+ "wheel-hint-label"?: (HelixHeadlessCanvas["wheelHintLabel"]) | undefined;
1796
+ /** The hint shown when the wheel scrolls past the board with
1797
+ `gestures="cooperative"`. `{key}` is ⌘ on a Mac and Ctrl elsewhere. */
1798
+ wheelHintLabel?: (HelixHeadlessCanvas["wheelHintLabel"]) | undefined;
1799
+ /** What screen readers hear after a zoom button or key, with `{zoom}` for the
1800
+ zoom as a percentage, written the way the element's locale writes one. */
1801
+ "zoomed-label"?: (HelixHeadlessCanvas["zoomedLabel"]) | undefined;
1802
+ /** What screen readers hear after a zoom button or key, with `{zoom}` for the
1803
+ zoom as a percentage, written the way the element's locale writes one. */
1804
+ zoomedLabel?: (HelixHeadlessCanvas["zoomedLabel"]) | undefined;
1581
1805
  /** Which controls to show, as a list such as `pan zoom fullscreen`, or
1582
1806
  `none`. A family can add words of its own.
1583
1807
 
@@ -1600,20 +1824,6 @@ of the frame. The
1600
1824
  stylesheet lays the cluster out by which buttons are in it rather than by
1601
1825
  this attribute, so the two defaults need no rule each. */
1602
1826
  controls?: (HelixHeadlessCanvas["controls"]) | undefined;
1603
- /** The name of the group of controls, read by screen readers.
1604
-
1605
- Absent is the family's own name for it, "Map controls" or "Board
1606
- controls", which names what the controls drive rather than the
1607
- mechanism. Written here to say it in another language, which every other
1608
- string this surface speaks already allowed and this one did not. */
1609
- "controls-label"?: (HelixHeadlessCanvas["controlsLabel"]) | undefined;
1610
- /** The name of the group of controls, read by screen readers.
1611
-
1612
- Absent is the family's own name for it, "Map controls" or "Board
1613
- controls", which names what the controls drive rather than the
1614
- mechanism. Written here to say it in another language, which every other
1615
- string this surface speaks already allowed and this one did not. */
1616
- controlsLabel?: (HelixHeadlessCanvas["controlsLabel"]) | undefined;
1617
1827
  /** Which corner the controls sit in.
1618
1828
 
1619
1829
  **Configurable because there is no safe default**, which is a collision
@@ -1716,26 +1926,6 @@ at any zoom, and a consumer who wants their own units multiplies by them. */
1716
1926
  "pan-up-label"?: (HelixHeadlessCanvas["panUpLabel"]) | undefined;
1717
1927
  /** The pan up button's label. */
1718
1928
  panUpLabel?: (HelixHeadlessCanvas["panUpLabel"]) | undefined;
1719
- /** The hint shown when one finger swipes over a surface with
1720
- `gestures="cooperative"`. Absent is the family's own. */
1721
- "two-finger-hint-label"?: (HelixHeadlessCanvas["twoFingerHintLabel"]) | undefined;
1722
- /** The hint shown when one finger swipes over a surface with
1723
- `gestures="cooperative"`. Absent is the family's own. */
1724
- twoFingerHintLabel?: (HelixHeadlessCanvas["twoFingerHintLabel"]) | undefined;
1725
- /** The line shown while a surface with `gestures="activate"` has the
1726
- gestures. Absent is the family's own. */
1727
- "using-label"?: (HelixHeadlessCanvas["usingLabel"]) | undefined;
1728
- /** The line shown while a surface with `gestures="activate"` has the
1729
- gestures. Absent is the family's own. */
1730
- usingLabel?: (HelixHeadlessCanvas["usingLabel"]) | undefined;
1731
- /** The hint shown when the wheel scrolls past a surface with
1732
- `gestures="cooperative"`, with `{key}`, which is ⌘ on a Mac and Ctrl
1733
- elsewhere. Absent is the family's own. */
1734
- "wheel-hint-label"?: (HelixHeadlessCanvas["wheelHintLabel"]) | undefined;
1735
- /** The hint shown when the wheel scrolls past a surface with
1736
- `gestures="cooperative"`, with `{key}`, which is ⌘ on a Mac and Ctrl
1737
- elsewhere. Absent is the family's own. */
1738
- wheelHintLabel?: (HelixHeadlessCanvas["wheelHintLabel"]) | undefined;
1739
1929
  /** The zoom in button's label. */
1740
1930
  "zoom-in-label"?: (HelixHeadlessCanvas["zoomInLabel"]) | undefined;
1741
1931
  /** The zoom in button's label. */
@@ -2222,9 +2412,8 @@ nothing for `them`. */
2222
2412
  "failed-label"?: (HelixHeadlessChatMessage["failedLabel"]) | undefined;
2223
2413
  /** Label for a message that did not send. */
2224
2414
  failedLabel?: (HelixHeadlessChatMessage["failedLabel"]) | undefined;
2225
- /** Locale for the timestamp.
2226
-
2227
- Empty is the runtime's own. */
2415
+ /** The locale the timestamp and the words are in, as a BCP 47 tag such as
2416
+ `de`. Empty reads the nearest `lang`, then the browser's language. */
2228
2417
  locale?: (HelixHeadlessChatMessage["locale"]) | undefined;
2229
2418
  /** Label for the retry button on a failed message. */
2230
2419
  "retry-label"?: (HelixHeadlessChatMessage["retryLabel"]) | undefined;
@@ -2301,6 +2490,24 @@ set.
2301
2490
  attribute could not say that: it is true by being there, whatever it holds,
2302
2491
  so a default of true had no attribute that turned it off. */
2303
2492
  defaultPinned?: (HelixHeadlessChat["defaultPinned"]) | undefined;
2493
+ /** What a turn from `turns` that did not send says, and what a screen reader
2494
+ hears before its words. A turn you write as a child says its own
2495
+ `failed-label`. */
2496
+ "failed-label"?: (HelixHeadlessChat["failedLabel"]) | undefined;
2497
+ /** What a turn from `turns` that did not send says, and what a screen reader
2498
+ hears before its words. A turn you write as a child says its own
2499
+ `failed-label`. */
2500
+ failedLabel?: (HelixHeadlessChat["failedLabel"]) | undefined;
2501
+ /** What a screen reader hears for a turn that did not send. `{failed}` is the
2502
+ turn's `failed-label` and `{text}` is its words. */
2503
+ "failed-turn-label"?: (HelixHeadlessChat["failedTurnLabel"]) | undefined;
2504
+ /** What a screen reader hears for a turn that did not send. `{failed}` is the
2505
+ turn's `failed-label` and `{text}` is its words. */
2506
+ failedTurnLabel?: (HelixHeadlessChat["failedTurnLabel"]) | undefined;
2507
+ /** The conversation's name, read by screen readers, where `label` is empty. */
2508
+ "fallback-label"?: (HelixHeadlessChat["fallbackLabel"]) | undefined;
2509
+ /** The conversation's name, read by screen readers, where `label` is empty. */
2510
+ fallbackLabel?: (HelixHeadlessChat["fallbackLabel"]) | undefined;
2304
2511
  /** Whether there are older turns to load, and whether they are loading.
2305
2512
 
2306
2513
  `more` makes reaching the top fire `helix-history`, once per arrival;
@@ -2428,6 +2635,14 @@ Read from the boxes once they are known, so a box a script ticks directly
2428
2635
  is in it at once. Written, it is pushed onto the boxes. A box whose value
2429
2636
  holds a comma cannot be named here: use `values`. */
2430
2637
  value?: (HelixHeadlessCheckboxGroup["value"]) | undefined;
2638
+ /** The message reported when the field is required and no box is ticked.
2639
+ Absent, or empty, is this sentence, or the words registered for the page's
2640
+ locale. */
2641
+ "value-missing-message"?: (HelixHeadlessCheckboxGroup["valueMissingMessage"]) | undefined;
2642
+ /** The message reported when the field is required and no box is ticked.
2643
+ Absent, or empty, is this sentence, or the words registered for the page's
2644
+ locale. */
2645
+ valueMissingMessage?: (HelixHeadlessCheckboxGroup["valueMissingMessage"]) | undefined;
2431
2646
  /** */
2432
2647
  "aria-label"?: unknown;
2433
2648
  /** The validation message shown under the control. It replaces the
@@ -2440,24 +2655,6 @@ browser's message. */
2440
2655
  label?: (HelixHeadlessCheckboxGroup["label"]) | undefined;
2441
2656
  /** Whether the field needs a value before the form can submit. */
2442
2657
  required?: (HelixHeadlessCheckboxGroup["required"]) | undefined;
2443
- /** The message shown when the field is required and empty.
2444
-
2445
- **Absent, or empty, is the control's own sentence**, "Choose one to continue." on a
2446
- set and the browser's own on a text field, which the browser writes in
2447
- the reader's language. Every other word a control speaks is a property,
2448
- and this one was the English a form in another language still spoke in
2449
- the bubble it raises on submit: `feedback` replaces the message under
2450
- the field and does not reach that one. */
2451
- "value-missing-message"?: (HelixHeadlessCheckboxGroup["valueMissingMessage"]) | undefined;
2452
- /** The message shown when the field is required and empty.
2453
-
2454
- **Absent, or empty, is the control's own sentence**, "Choose one to continue." on a
2455
- set and the browser's own on a text field, which the browser writes in
2456
- the reader's language. Every other word a control speaks is a property,
2457
- and this one was the English a form in another language still spoke in
2458
- the bubble it raises on submit: `feedback` replaces the message under
2459
- the field and does not reach that one. */
2460
- valueMissingMessage?: (HelixHeadlessCheckboxGroup["valueMissingMessage"]) | undefined;
2461
2658
  /** Whether the control is disabled and cannot be used.
2462
2659
 
2463
2660
  Reflected, because the styled tier selects on it, and mirrored to
@@ -2520,6 +2717,14 @@ reads it as `:state(indeterminate)`. */
2520
2717
  indeterminate?: (HelixHeadlessCheckbox["indeterminate"]) | undefined;
2521
2718
  /** The value submitted when the box is checked. */
2522
2719
  value?: (HelixHeadlessCheckbox["value"]) | undefined;
2720
+ /** The message reported when the field is required and the box is not ticked.
2721
+ Absent, or empty, is this sentence, or the words registered for the page's
2722
+ locale. */
2723
+ "value-missing-message"?: (HelixHeadlessCheckbox["valueMissingMessage"]) | undefined;
2724
+ /** The message reported when the field is required and the box is not ticked.
2725
+ Absent, or empty, is this sentence, or the words registered for the page's
2726
+ locale. */
2727
+ valueMissingMessage?: (HelixHeadlessCheckbox["valueMissingMessage"]) | undefined;
2523
2728
  /** Whether the control is checked.
2524
2729
 
2525
2730
  One property rather than two. Writing always applies;
@@ -2571,24 +2776,6 @@ browser's message. */
2571
2776
  label?: (HelixHeadlessCheckbox["label"]) | undefined;
2572
2777
  /** Whether the field needs a value before the form can submit. */
2573
2778
  required?: (HelixHeadlessCheckbox["required"]) | undefined;
2574
- /** The message shown when the field is required and empty.
2575
-
2576
- **Absent, or empty, is the control's own sentence**, "Choose one to continue." on a
2577
- set and the browser's own on a text field, which the browser writes in
2578
- the reader's language. Every other word a control speaks is a property,
2579
- and this one was the English a form in another language still spoke in
2580
- the bubble it raises on submit: `feedback` replaces the message under
2581
- the field and does not reach that one. */
2582
- "value-missing-message"?: (HelixHeadlessCheckbox["valueMissingMessage"]) | undefined;
2583
- /** The message shown when the field is required and empty.
2584
-
2585
- **Absent, or empty, is the control's own sentence**, "Choose one to continue." on a
2586
- set and the browser's own on a text field, which the browser writes in
2587
- the reader's language. Every other word a control speaks is a property,
2588
- and this one was the English a form in another language still spoke in
2589
- the bubble it raises on submit: `feedback` replaces the message under
2590
- the field and does not reach that one. */
2591
- valueMissingMessage?: (HelixHeadlessCheckbox["valueMissingMessage"]) | undefined;
2592
2779
  /** Whether the control is disabled and cannot be used.
2593
2780
 
2594
2781
  Reflected, because the styled tier selects on it, and mirrored to
@@ -2638,15 +2825,21 @@ export type HelixHeadlessCodeBlockVueProps = {
2638
2825
  /** The copy button's name and tooltip text before a copy.
2639
2826
 
2640
2827
  Where the block has a name, the button says it too, such as "Copy code,
2641
- app.ts", so each copy button on a page with several blocks is told apart.
2642
- In a diff, that is each file's own name. */
2828
+ app.ts", as `copy-name-label` puts it, so each copy button on a page with
2829
+ several blocks is told apart. In a diff, that is each file's own name. */
2643
2830
  "copy-label"?: (HelixHeadlessCodeBlock["copyLabel"]) | undefined;
2644
2831
  /** The copy button's name and tooltip text before a copy.
2645
2832
 
2646
2833
  Where the block has a name, the button says it too, such as "Copy code,
2647
- app.ts", so each copy button on a page with several blocks is told apart.
2648
- In a diff, that is each file's own name. */
2834
+ app.ts", as `copy-name-label` puts it, so each copy button on a page with
2835
+ several blocks is told apart. In a diff, that is each file's own name. */
2649
2836
  copyLabel?: (HelixHeadlessCodeBlock["copyLabel"]) | undefined;
2837
+ /** The copy button's name and tooltip text before a copy, where the block
2838
+ has a name. `{copy}` is `copy-label` and `{name}` the block's name. */
2839
+ "copy-name-label"?: (HelixHeadlessCodeBlock["copyNameLabel"]) | undefined;
2840
+ /** The copy button's name and tooltip text before a copy, where the block
2841
+ has a name. `{copy}` is `copy-label` and `{name}` the block's name. */
2842
+ copyNameLabel?: (HelixHeadlessCodeBlock["copyNameLabel"]) | undefined;
2650
2843
  /** Whether the content is a unified diff, drawn as the lines it changed.
2651
2844
 
2652
2845
  Reflected, because the stylesheet paints a diff differently from code, and
@@ -2663,16 +2856,18 @@ block lays out. Not for a diff, whose files each scroll on their own. */
2663
2856
  "expand-label"?: (HelixHeadlessCodeBlock["expandLabel"]) | undefined;
2664
2857
  /** The expand button's words while the cap hides lines. */
2665
2858
  expandLabel?: (HelixHeadlessCodeBlock["expandLabel"]) | undefined;
2666
- /** The block's name, usually a file name or a language.
2859
+ /** The block's name, usually a file name, drawn in the header.
2667
2860
 
2668
- In a diff, each file is named from the patch, and this names a patch that
2669
- carries no name of its own. */
2861
+ Absent, the block is named by `language` where there is one. In a diff,
2862
+ each file is named from the patch, and this names a patch that carries no
2863
+ name of its own. */
2670
2864
  label?: (HelixHeadlessCodeBlock["label"]) | undefined;
2671
2865
  /** The language the code is written in, such as `ts` or `css`, handed to
2672
2866
  `highlight` as its second argument.
2673
2867
 
2674
- Absent hands it an empty string. It draws nothing of its own: the block's
2675
- name is `label`. */
2868
+ A block with no `label` is named by it, in the header and on the copy
2869
+ button, as a docs site names a snippet by its language. Absent hands
2870
+ `highlight` an empty string and names nothing. */
2676
2871
  language?: (HelixHeadlessCodeBlock["language"]) | undefined;
2677
2872
  /** Whether the lines are numbered in a gutter beside the code.
2678
2873
 
@@ -2840,6 +3035,14 @@ Date Input and Time Input. */
2840
3035
  readOnly?: (HelixHeadlessColorInput["readOnly"]) | undefined;
2841
3036
  /** Colors offered under the picker, as a comma-separated list. */
2842
3037
  swatches?: (HelixHeadlessColorInput["swatches"]) | undefined;
3038
+ /** What the swatch says in `variant="swatch"`, after the field's label, once
3039
+ there is a color. `{name}` is the color's name, such as "vibrant red", and
3040
+ `{value}` the value as written. */
3041
+ "swatch-label"?: (HelixHeadlessColorInput["swatchLabel"]) | undefined;
3042
+ /** What the swatch says in `variant="swatch"`, after the field's label, once
3043
+ there is a color. `{name}` is the color's name, such as "vibrant red", and
3044
+ `{value}` the value as written. */
3045
+ swatchLabel?: (HelixHeadlessColorInput["swatchLabel"]) | undefined;
2843
3046
  /** Accessible name for the control that opens the panel. */
2844
3047
  "trigger-label"?: (HelixHeadlessColorInput["triggerLabel"]) | undefined;
2845
3048
  /** Accessible name for the control that opens the panel. */
@@ -2925,18 +3128,22 @@ browser's message. */
2925
3128
  required?: (HelixHeadlessColorInput["required"]) | undefined;
2926
3129
  /** The message shown when the field is required and empty.
2927
3130
 
2928
- **Absent, or empty, is the control's own sentence**, "Choose one to continue." on a
2929
- set and the browser's own on a text field, which the browser writes in
2930
- the reader's language. Every other word a control speaks is a property,
3131
+ **Absent, or empty, is the control's own sentence**, "Choose one to
3132
+ continue." on a set and the browser's own on a text field, which the
3133
+ browser writes in the reader's language. A family with a sentence of its
3134
+ own declares it as this property's English, a word property a page
3135
+ registers for its locale under the family's key. Every other word a control speaks is a property,
2931
3136
  and this one was the English a form in another language still spoke in
2932
3137
  the bubble it raises on submit: `feedback` replaces the message under
2933
3138
  the field and does not reach that one. */
2934
3139
  "value-missing-message"?: (HelixHeadlessColorInput["valueMissingMessage"]) | undefined;
2935
3140
  /** The message shown when the field is required and empty.
2936
3141
 
2937
- **Absent, or empty, is the control's own sentence**, "Choose one to continue." on a
2938
- set and the browser's own on a text field, which the browser writes in
2939
- the reader's language. Every other word a control speaks is a property,
3142
+ **Absent, or empty, is the control's own sentence**, "Choose one to
3143
+ continue." on a set and the browser's own on a text field, which the
3144
+ browser writes in the reader's language. A family with a sentence of its
3145
+ own declares it as this property's English, a word property a page
3146
+ registers for its locale under the family's key. Every other word a control speaks is a property,
2940
3147
  and this one was the English a form in another language still spoke in
2941
3148
  the bubble it raises on submit: `feedback` replaces the message under
2942
3149
  the field and does not reach that one. */
@@ -3239,6 +3446,22 @@ into. */
3239
3446
  "saturation-label"?: (HelixHeadlessColorPicker["saturationLabel"]) | undefined;
3240
3447
  /** What the square's horizontal ramp is called. */
3241
3448
  saturationLabel?: (HelixHeadlessColorPicker["saturationLabel"]) | undefined;
3449
+ /** What a screen reader hears for the square's place, the color's two
3450
+ numbers and its name, on whichever of its two inputs it is on.
3451
+ `{first}` is `saturation` or `brightness`, the input's own channel, which
3452
+ is said first, so each order is its whole sentence. `{saturation}` and
3453
+ `{brightness}` are shares from 0 to 1, written as percentages with
3454
+ `number, percent`, `{saturationLabel}` and `{brightnessLabel}` the
3455
+ channels' names, and `{name}` the color's, such as "vibrant red". */
3456
+ "square-text"?: (HelixHeadlessColorPicker["squareText"]) | undefined;
3457
+ /** What a screen reader hears for the square's place, the color's two
3458
+ numbers and its name, on whichever of its two inputs it is on.
3459
+ `{first}` is `saturation` or `brightness`, the input's own channel, which
3460
+ is said first, so each order is its whole sentence. `{saturation}` and
3461
+ `{brightness}` are shares from 0 to 1, written as percentages with
3462
+ `number, percent`, `{saturationLabel}` and `{brightnessLabel}` the
3463
+ channels' names, and `{name}` the color's, such as "vibrant red". */
3464
+ squareText?: (HelixHeadlessColorPicker["squareText"]) | undefined;
3242
3465
  /** Colors offered under the picker, as a comma-separated list. */
3243
3466
  swatches?: (HelixHeadlessColorPicker["swatches"]) | undefined;
3244
3467
  /** What the group holding the eyedropper and the syntax toggle is called. */
@@ -3253,13 +3476,15 @@ into. */
3253
3476
 
3254
3477
  **Every sentence a control raises in the browser's bubble is a property**,
3255
3478
  named for the validity flag it reports, so a form in another language
3256
- speaks it. Absent is the control's own sentence, in English. */
3479
+ speaks it. Unset is the sentence registered for the page's language, then
3480
+ the English. */
3257
3481
  "value-missing-message"?: (HelixHeadlessColorPicker["valueMissingMessage"]) | undefined;
3258
3482
  /** The message shown when a color is required and none is chosen.
3259
3483
 
3260
3484
  **Every sentence a control raises in the browser's bubble is a property**,
3261
3485
  named for the validity flag it reports, so a form in another language
3262
- speaks it. Absent is the control's own sentence, in English. */
3486
+ speaks it. Unset is the sentence registered for the page's language, then
3487
+ the English. */
3263
3488
  valueMissingMessage?: (HelixHeadlessColorPicker["valueMissingMessage"]) | undefined;
3264
3489
  /** Draws the hue as a wheel around the square, in place of the hue ramp, as
3265
3490
  React Aria's ColorWheel sits round its ColorArea.
@@ -3386,12 +3611,19 @@ leaves the field or presses Enter with nothing highlighted, and text that
3386
3611
  names an option takes that option. Unlike `creatable`, no event asks
3387
3612
  first and no option is expected to be added: the value is the text. */
3388
3613
  allowsCustomValue?: (HelixHeadlessCombobox["allowsCustomValue"]) | undefined;
3389
- /** What the browser may autofill in the text field, as a platform token.
3614
+ /** What the browser may autofill, as a platform token such as `country`.
3390
3615
 
3391
3616
  **Defaults to `off`, which is not the platform's default and is the
3392
3617
  point.** The field filters a list rather than collecting a value, so a
3393
3618
  browser offering to fill it with a saved address is competing for the same
3394
- keystrokes as the listbox. A consumer who wants autofill can still ask. */
3619
+ keystrokes as the listbox. A consumer who wants autofill can still ask.
3620
+
3621
+ Set, a combobox whose answer is one of its options keeps a hidden native
3622
+ `<select>` with the same options for the browser to fill, as React Aria's
3623
+ combobox and Select do, and the option the browser picks, by its value or
3624
+ its words, becomes the value. The text field itself stays `off`, so the
3625
+ browser fills the answer and not the filter. With `allows-custom-value`
3626
+ the token goes on the text field, whose words are the answer. */
3395
3627
  autocomplete?: (HelixHeadlessCombobox["autocomplete"]) | undefined;
3396
3628
  /** Whether the user can add a value that is not in the list.
3397
3629
 
@@ -3401,9 +3633,15 @@ it is offered next to near misses too: a reader typing "Ruby on Rails" with
3401
3633
  halfway through. The arrow keys reach it after the last option, and Enter
3402
3634
  on it adds what was typed. */
3403
3635
  creatable?: (HelixHeadlessCombobox["creatable"]) | undefined;
3404
- /** The text of the create row, shown before the typed words it adds. */
3636
+ /** The text of the create row. `{value}` is what was typed.
3637
+
3638
+ A sentence without `{value}`, such as `Create`, is followed by what was
3639
+ typed in quotes, as before `{value}` existed. */
3405
3640
  "create-label"?: (HelixHeadlessCombobox["createLabel"]) | undefined;
3406
- /** The text of the create row, shown before the typed words it adds. */
3641
+ /** The text of the create row. `{value}` is what was typed.
3642
+
3643
+ A sentence without `{value}`, such as `Create`, is followed by what was
3644
+ typed in quotes, as before `{value}` existed. */
3407
3645
  createLabel?: (HelixHeadlessCombobox["createLabel"]) | undefined;
3408
3646
  /** Text shown when the filter hides every option. */
3409
3647
  "empty-text"?: (HelixHeadlessCombobox["emptyText"]) | undefined;
@@ -3430,12 +3668,14 @@ every keystroke. See Listbox's `filter-delay`. */
3430
3668
  /** The list's name, read by screen readers. The list has no visible name. */
3431
3669
  listLabel?: (HelixHeadlessCombobox["listLabel"]) | undefined;
3432
3670
  /** What the list says when its options could not be loaded, such as after a
3433
- request to a server fails. Empty is no error. Passed to the list, which
3434
- shows it under any options there are and tells screen readers. */
3671
+ request to a server fails. Empty, null or no attribute is no error, so
3672
+ removing the attribute clears it. Passed to the list, which shows it
3673
+ under any options there are and tells screen readers. */
3435
3674
  "load-error"?: (HelixHeadlessCombobox["loadError"]) | undefined;
3436
3675
  /** What the list says when its options could not be loaded, such as after a
3437
- request to a server fails. Empty is no error. Passed to the list, which
3438
- shows it under any options there are and tells screen readers. */
3676
+ request to a server fails. Empty, null or no attribute is no error, so
3677
+ removing the attribute clears it. Passed to the list, which shows it
3678
+ under any options there are and tells screen readers. */
3439
3679
  loadError?: (HelixHeadlessCombobox["loadError"]) | undefined;
3440
3680
  /** Whether the options are still loading.
3441
3681
 
@@ -3446,6 +3686,10 @@ message belongs. */
3446
3686
  "loading-text"?: (HelixHeadlessCombobox["loadingText"]) | undefined;
3447
3687
  /** Text the list shows while the options load. */
3448
3688
  loadingText?: (HelixHeadlessCombobox["loadingText"]) | undefined;
3689
+ /** The locale the words, plural forms, and numbers are in, as a BCP 47 tag
3690
+ such as `pl`. Empty reads the nearest `lang`, then the browser's
3691
+ language. */
3692
+ locale?: (HelixHeadlessCombobox["locale"]) | undefined;
3449
3693
  /** Whether more than one option can be chosen.
3450
3694
 
3451
3695
  The list already does the work: `value` comes apart on commas, a press
@@ -3504,20 +3748,28 @@ filled in.
3504
3748
  **The name goes in**, so a row of them is heard as which one each
3505
3749
  removes rather than as "Remove" said once per chosen option. */
3506
3750
  removeLabel?: (HelixHeadlessCombobox["removeLabel"]) | undefined;
3507
- /** What a screen reader hears when typing leaves one option. `{count}` is
3508
- the count. */
3751
+ /** What a screen reader hears when typing leaves one option, where
3752
+ `results-label` should not say it. `{count}` is the count. */
3509
3753
  "result-label"?: (HelixHeadlessCombobox["resultLabel"]) | undefined;
3510
- /** What a screen reader hears when typing leaves one option. `{count}` is
3511
- the count. */
3754
+ /** What a screen reader hears when typing leaves one option, where
3755
+ `results-label` should not say it. `{count}` is the count. */
3512
3756
  resultLabel?: (HelixHeadlessCombobox["resultLabel"]) | undefined;
3513
- /** What a screen reader hears when typing leaves any other number of
3514
- options. `{count}` is the count, and `Intl.PluralRules` picks between the
3515
- two. */
3757
+ /** What a screen reader hears when typing narrows the list. `{count}` is how
3758
+ many options are left, written in the locale, and each language writes
3759
+ the forms it has: `{count, plural, one {# wynik} few {# wyniki} many
3760
+ {# wyników} other {# wyniku}}`. */
3516
3761
  "results-label"?: (HelixHeadlessCombobox["resultsLabel"]) | undefined;
3517
- /** What a screen reader hears when typing leaves any other number of
3518
- options. `{count}` is the count, and `Intl.PluralRules` picks between the
3519
- two. */
3762
+ /** What a screen reader hears when typing narrows the list. `{count}` is how
3763
+ many options are left, written in the locale, and each language writes
3764
+ the forms it has: `{count, plural, one {# wynik} few {# wyniki} many
3765
+ {# wyników} other {# wyniku}}`. */
3520
3766
  resultsLabel?: (HelixHeadlessCombobox["resultsLabel"]) | undefined;
3767
+ /** What VoiceOver hears for a chosen option, as the highlight reaches it and
3768
+ once it is chosen, on Apple devices. `{name}` is the option's words. */
3769
+ "selected-label"?: (HelixHeadlessCombobox["selectedLabel"]) | undefined;
3770
+ /** What VoiceOver hears for a chosen option, as the highlight reaches it and
3771
+ once it is chosen, on Apple devices. `{name}` is the option's words. */
3772
+ selectedLabel?: (HelixHeadlessCombobox["selectedLabel"]) | undefined;
3521
3773
  /** Whether the field completes the word as the user types.
3522
3774
 
3523
3775
  `suggest` rather than `autocomplete`, which is a real HTML attribute this
@@ -3525,6 +3777,14 @@ element already sets on the input it renders, and two things of one name
3525
3777
  meaning different things on the same control is a question a consumer
3526
3778
  should not have to ask. */
3527
3779
  suggest?: (HelixHeadlessCombobox["suggest"]) | undefined;
3780
+ /** The message reported when the field is required and nothing is chosen.
3781
+ Absent, or empty, is this sentence, or the words registered for the page's
3782
+ locale. */
3783
+ "value-missing-message"?: (HelixHeadlessCombobox["valueMissingMessage"]) | undefined;
3784
+ /** The message reported when the field is required and nothing is chosen.
3785
+ Absent, or empty, is this sentence, or the words registered for the page's
3786
+ locale. */
3787
+ valueMissingMessage?: (HelixHeadlessCombobox["valueMissingMessage"]) | undefined;
3528
3788
  /** Whether the element starts open. Ignored once `open` is written. */
3529
3789
  "default-open"?: (HelixHeadlessCombobox["defaultOpen"]) | undefined;
3530
3790
  /** Whether the element starts open. Ignored once `open` is written. */
@@ -3558,6 +3818,12 @@ as `+3`, does not say what it does. */
3558
3818
  "max-tags"?: (HelixHeadlessCombobox["maxTags"] | `${number}`) | undefined;
3559
3819
  /** How many tokens to show before the rest become a count. */
3560
3820
  maxTags?: (HelixHeadlessCombobox["maxTags"]) | undefined;
3821
+ /** The count of the tokens past `max-tags`, as it is shown, with `{count}`
3822
+ for the number, written in the element's locale. */
3823
+ "rest-text"?: (HelixHeadlessCombobox["restText"]) | undefined;
3824
+ /** The count of the tokens past `max-tags`, as it is shown, with `{count}`
3825
+ for the number, written in the element's locale. */
3826
+ restText?: (HelixHeadlessCombobox["restText"]) | undefined;
3561
3827
  /** The value the control starts with. A form reset returns it to this value,
3562
3828
  and to the `value` attribute where this one is not written, as a native
3563
3829
  control resets to the `value` it declares. */
@@ -3585,24 +3851,6 @@ browser's message. */
3585
3851
  label?: (HelixHeadlessCombobox["label"]) | undefined;
3586
3852
  /** Whether the field needs a value before the form can submit. */
3587
3853
  required?: (HelixHeadlessCombobox["required"]) | undefined;
3588
- /** The message shown when the field is required and empty.
3589
-
3590
- **Absent, or empty, is the control's own sentence**, "Choose one to continue." on a
3591
- set and the browser's own on a text field, which the browser writes in
3592
- the reader's language. Every other word a control speaks is a property,
3593
- and this one was the English a form in another language still spoke in
3594
- the bubble it raises on submit: `feedback` replaces the message under
3595
- the field and does not reach that one. */
3596
- "value-missing-message"?: (HelixHeadlessCombobox["valueMissingMessage"]) | undefined;
3597
- /** The message shown when the field is required and empty.
3598
-
3599
- **Absent, or empty, is the control's own sentence**, "Choose one to continue." on a
3600
- set and the browser's own on a text field, which the browser writes in
3601
- the reader's language. Every other word a control speaks is a property,
3602
- and this one was the English a form in another language still spoke in
3603
- the bubble it raises on submit: `feedback` replaces the message under
3604
- the field and does not reach that one. */
3605
- valueMissingMessage?: (HelixHeadlessCombobox["valueMissingMessage"]) | undefined;
3606
3854
  /** Whether the control is disabled and cannot be used.
3607
3855
 
3608
3856
  Reflected, because the styled tier selects on it, and mirrored to
@@ -3707,12 +3955,14 @@ with: one key, said once. */
3707
3955
  /** Accessible name for the overlay, which has no visible heading. */
3708
3956
  label?: (HelixHeadlessCommand["label"]) | undefined;
3709
3957
  /** What the list says when its commands could not be loaded, such as after a
3710
- request to a server fails. Empty is no error. Passed to the list, which
3711
- shows it under any commands there are and tells screen readers. */
3958
+ request to a server fails. Empty, null or no attribute is no error, so
3959
+ removing the attribute clears it. Passed to the list, which shows it
3960
+ under any commands there are and tells screen readers. */
3712
3961
  "load-error"?: (HelixHeadlessCommand["loadError"]) | undefined;
3713
3962
  /** What the list says when its commands could not be loaded, such as after a
3714
- request to a server fails. Empty is no error. Passed to the list, which
3715
- shows it under any commands there are and tells screen readers. */
3963
+ request to a server fails. Empty, null or no attribute is no error, so
3964
+ removing the attribute clears it. Passed to the list, which shows it
3965
+ under any commands there are and tells screen readers. */
3716
3966
  loadError?: (HelixHeadlessCommand["loadError"]) | undefined;
3717
3967
  /** Whether the commands are still loading, for a palette that asks a server
3718
3968
  for them as the user types.
@@ -3731,19 +3981,21 @@ some. Absent, `empty-text` shows. See Listbox's `no-results-text`. */
3731
3981
  noResultsText?: (HelixHeadlessCommand["noResultsText"]) | undefined;
3732
3982
  /** The text shown in the filter field before anything is typed. */
3733
3983
  placeholder?: (HelixHeadlessCommand["placeholder"]) | undefined;
3734
- /** What a screen reader hears when typing leaves one command. `{count}` is
3735
- the count. */
3984
+ /** What a screen reader hears when typing leaves one command, where
3985
+ `results-label` should not say it. `{count}` is the count. */
3736
3986
  "result-label"?: (HelixHeadlessCommand["resultLabel"]) | undefined;
3737
- /** What a screen reader hears when typing leaves one command. `{count}` is
3738
- the count. */
3987
+ /** What a screen reader hears when typing leaves one command, where
3988
+ `results-label` should not say it. `{count}` is the count. */
3739
3989
  resultLabel?: (HelixHeadlessCommand["resultLabel"]) | undefined;
3740
- /** What a screen reader hears when typing leaves any other number of
3741
- commands. `{count}` is the count, and `Intl.PluralRules` picks between the
3742
- two. */
3990
+ /** What a screen reader hears when typing narrows the commands. `{count}` is
3991
+ how many are left, written in the locale, and each language writes the
3992
+ forms it has: `{count, plural, one {# polecenie} few {# polecenia} many
3993
+ {# poleceń} other {# polecenia}}`. */
3743
3994
  "results-label"?: (HelixHeadlessCommand["resultsLabel"]) | undefined;
3744
- /** What a screen reader hears when typing leaves any other number of
3745
- commands. `{count}` is the count, and `Intl.PluralRules` picks between the
3746
- two. */
3995
+ /** What a screen reader hears when typing narrows the commands. `{count}` is
3996
+ how many are left, written in the locale, and each language writes the
3997
+ forms it has: `{count, plural, one {# polecenie} few {# polecenia} many
3998
+ {# poleceń} other {# polecenia}}`. */
3747
3999
  resultsLabel?: (HelixHeadlessCommand["resultsLabel"]) | undefined;
3748
4000
  /** Whether the element starts open. Ignored once `open` is written. */
3749
4001
  "default-open"?: (HelixHeadlessCommand["defaultOpen"]) | undefined;
@@ -3915,6 +4167,9 @@ export type HelixHeadlessDataTableElementEvent<E = Event> = TypedEvent<
3915
4167
  /** `helix-activate` event type */
3916
4168
  export type HelixHeadlessDataTableHelixActivateElementEvent =
3917
4169
  HelixHeadlessDataTableElementEvent<HelixActivateEvent>;
4170
+ /** `helix-before-reorder` event type */
4171
+ export type HelixHeadlessDataTableHelixBeforeReorderElementEvent =
4172
+ HelixHeadlessDataTableElementEvent<HelixBeforeReorderEvent>;
3918
4173
  /** `helix-expand` event type */
3919
4174
  export type HelixHeadlessDataTableHelixExpandElementEvent =
3920
4175
  HelixHeadlessDataTableElementEvent<HelixExpandEvent>;
@@ -3950,10 +4205,16 @@ export type HelixHeadlessDataTableHelixSortedElementEvent =
3950
4205
  HelixHeadlessDataTableElementEvent<HelixSortedEvent>;
3951
4206
 
3952
4207
  export type HelixHeadlessDataTableVueProps = {
3953
- /** The word for an ascending sort, in `sorted-label`. */
4208
+ /** The word for an ascending sort, in a `sorted-label` that writes `{order}`. */
3954
4209
  "ascending-label"?: (HelixHeadlessDataTable["ascendingLabel"]) | undefined;
3955
- /** The word for an ascending sort, in `sorted-label`. */
4210
+ /** The word for an ascending sort, in a `sorted-label` that writes `{order}`. */
3956
4211
  ascendingLabel?: (HelixHeadlessDataTable["ascendingLabel"]) | undefined;
4212
+ /** What screen readers hear when a held row is put back, or a move is
4213
+ refused, with `reorderable-rows`. */
4214
+ "canceled-label"?: (HelixHeadlessDataTable["canceledLabel"]) | undefined;
4215
+ /** What screen readers hear when a held row is put back, or a move is
4216
+ refused, with `reorderable-rows`. */
4217
+ canceledLabel?: (HelixHeadlessDataTable["canceledLabel"]) | undefined;
3957
4218
  /** The field that holds a row's child rows, as an array. Set it, and `row-key`,
3958
4219
  and the grid becomes a tree grid.
3959
4220
 
@@ -3998,10 +4259,14 @@ is set. */
3998
4259
  "default-sort"?: (HelixHeadlessDataTable["defaultSort"]) | undefined;
3999
4260
  /** The starting sort order, used until `sort` is set. */
4000
4261
  defaultSort?: (HelixHeadlessDataTable["defaultSort"]) | undefined;
4001
- /** The word for a descending sort, in `sorted-label`. */
4262
+ /** The word for a descending sort, in a `sorted-label` that writes `{order}`. */
4002
4263
  "descending-label"?: (HelixHeadlessDataTable["descendingLabel"]) | undefined;
4003
- /** The word for a descending sort, in `sorted-label`. */
4264
+ /** The word for a descending sort, in a `sorted-label` that writes `{order}`. */
4004
4265
  descendingLabel?: (HelixHeadlessDataTable["descendingLabel"]) | undefined;
4266
+ /** What screen readers hear when a row is dropped, with `reorderable-rows`. */
4267
+ "dropped-label"?: (HelixHeadlessDataTable["droppedLabel"]) | undefined;
4268
+ /** What screen readers hear when a row is dropped, with `reorderable-rows`. */
4269
+ droppedLabel?: (HelixHeadlessDataTable["droppedLabel"]) | undefined;
4005
4270
  /** The estimated height of a row before it is drawn, in pixels.
4006
4271
 
4007
4272
  Only read while `windowed`, and a starting guess rather than a claim: a
@@ -4043,6 +4308,10 @@ when there are no more rows to load. */
4043
4308
  "load-more-label"?: (HelixHeadlessDataTable["loadMoreLabel"]) | undefined;
4044
4309
  /** The words on the button in the `more` row. */
4045
4310
  loadMoreLabel?: (HelixHeadlessDataTable["loadMoreLabel"]) | undefined;
4311
+ /** The locale the words, plural forms, and numbers are in, as a BCP 47 tag
4312
+ such as `pl`. Empty reads the nearest `lang`, then the browser's
4313
+ language. The built-in pagination speaks it too. */
4314
+ locale?: (HelixHeadlessDataTable["locale"]) | undefined;
4046
4315
  /** Where filtering, sorting, and paging happen. `client` does them in the
4047
4316
  table, and `server` leaves them to your code.
4048
4317
 
@@ -4053,6 +4322,20 @@ the client cannot hold the data, so this is not an optimization, it is the
4053
4322
  only mode that works, and it is here from the start because adding it later
4054
4323
  inverts the data flow. */
4055
4324
  mode?: (HelixHeadlessDataTable["mode"]) | undefined;
4325
+ /** What screen readers hear each time a key moves a held row, with
4326
+ `reorderable-rows`. `{name}` is the row's name, `{position}` the place it
4327
+ would go, counting from 1, and `{count}` the number of rows on the page. */
4328
+ "moved-label"?: (HelixHeadlessDataTable["movedLabel"]) | undefined;
4329
+ /** What screen readers hear each time a key moves a held row, with
4330
+ `reorderable-rows`. `{name}` is the row's name, `{position}` the place it
4331
+ would go, counting from 1, and `{count}` the number of rows on the page. */
4332
+ movedLabel?: (HelixHeadlessDataTable["movedLabel"]) | undefined;
4333
+ /** The name of a row's grip, with `reorderable-rows`. `{row}` is replaced with
4334
+ the row's name. */
4335
+ "move-row-label"?: (HelixHeadlessDataTable["moveRowLabel"]) | undefined;
4336
+ /** The name of a row's grip, with `reorderable-rows`. `{row}` is replaced with
4337
+ the row's name. */
4338
+ moveRowLabel?: (HelixHeadlessDataTable["moveRowLabel"]) | undefined;
4056
4339
  /** The built-in pagination's name for the button that moves forward a page. */
4057
4340
  "next-label"?: (HelixHeadlessDataTable["nextLabel"]) | undefined;
4058
4341
  /** The built-in pagination's name for the button that moves forward a page. */
@@ -4104,6 +4387,12 @@ which is why the slot replaces this rather than sitting beside it. */
4104
4387
  "pagination-label"?: (HelixHeadlessDataTable["paginationLabel"]) | undefined;
4105
4388
  /** The name of the built-in pagination's navigation landmark. */
4106
4389
  paginationLabel?: (HelixHeadlessDataTable["paginationLabel"]) | undefined;
4390
+ /** What screen readers hear when a key or a click picks up a row, with
4391
+ `reorderable-rows`. `{name}` is the row's name. */
4392
+ "picked-up-label"?: (HelixHeadlessDataTable["pickedUpLabel"]) | undefined;
4393
+ /** What screen readers hear when a key or a click picks up a row, with
4394
+ `reorderable-rows`. `{name}` is the row's name. */
4395
+ pickedUpLabel?: (HelixHeadlessDataTable["pickedUpLabel"]) | undefined;
4107
4396
  /** The built-in pagination's name for the button that moves back a page. */
4108
4397
  "previous-label"?: (HelixHeadlessDataTable["previousLabel"]) | undefined;
4109
4398
  /** The built-in pagination's name for the button that moves back a page. */
@@ -4113,16 +4402,32 @@ which is why the slot replaces this rather than sitting beside it. */
4113
4402
  Each heading with a `field` gets a grip, dragged along the header or moved a
4114
4403
  place at a time with the arrow keys once it has focus. */
4115
4404
  reorderable?: (HelixHeadlessDataTable["reorderable"]) | undefined;
4116
- /** What screen readers hear when a search leaves one row. `{count}` is the count. */
4405
+ /** Lets people move rows, by a grip that leads each row. The table moves no
4406
+ row itself: set `rows` to the order `helix-reorder` carries. */
4407
+ "reorderable-rows"?: (HelixHeadlessDataTable["reorderableRows"]) | undefined;
4408
+ /** Lets people move rows, by a grip that leads each row. The table moves no
4409
+ row itself: set `rows` to the order `helix-reorder` carries. */
4410
+ reorderableRows?: (HelixHeadlessDataTable["reorderableRows"]) | undefined;
4411
+ /** What screen readers hear when a search leaves one row, where
4412
+ `results-label` should not say it. `{count}` is the count. */
4117
4413
  "result-label"?: (HelixHeadlessDataTable["resultLabel"]) | undefined;
4118
- /** What screen readers hear when a search leaves one row. `{count}` is the count. */
4414
+ /** What screen readers hear when a search leaves one row, where
4415
+ `results-label` should not say it. `{count}` is the count. */
4119
4416
  resultLabel?: (HelixHeadlessDataTable["resultLabel"]) | undefined;
4120
- /** What screen readers hear when a search leaves any other number of rows.
4121
- `{count}` is the count. */
4417
+ /** What screen readers hear when a search narrows the rows. `{count}` is how
4418
+ many rows are left, written in the locale, and each language writes the
4419
+ forms it has: `{count, plural, one {# wiersz} few {# wiersze} many
4420
+ {# wierszy} other {# wiersza}}`. */
4122
4421
  "results-label"?: (HelixHeadlessDataTable["resultsLabel"]) | undefined;
4123
- /** What screen readers hear when a search leaves any other number of rows.
4124
- `{count}` is the count. */
4422
+ /** What screen readers hear when a search narrows the rows. `{count}` is how
4423
+ many rows are left, written in the locale, and each language writes the
4424
+ forms it has: `{count, plural, one {# wiersz} few {# wiersze} many
4425
+ {# wierszy} other {# wiersza}}`. */
4125
4426
  resultsLabel?: (HelixHeadlessDataTable["resultsLabel"]) | undefined;
4427
+ /** The name of the heading over the row grips, with `reorderable-rows`. */
4428
+ "row-grips-label"?: (HelixHeadlessDataTable["rowGripsLabel"]) | undefined;
4429
+ /** The name of the heading over the row grips, with `reorderable-rows`. */
4430
+ rowGripsLabel?: (HelixHeadlessDataTable["rowGripsLabel"]) | undefined;
4126
4431
  /** The field that identifies each row.
4127
4432
 
4128
4433
  **Needed before selection exists, not after.** Lit keys the rendered rows by
@@ -4167,10 +4472,14 @@ price of the shape. A reader's choice fires `helix-select` first, and
4167
4472
  refusing it leaves the selection as it was. */
4168
4473
  selected?: (HelixHeadlessDataTable["selected"]) | undefined;
4169
4474
  /** What screen readers hear when the chosen rows change. `{count}` is how many
4170
- rows are chosen. */
4475
+ rows are chosen, written in the locale, and a language that needs plural
4476
+ forms writes them: `{count, plural, one {# wybrany} few {# wybrane} many
4477
+ {# wybranych} other {# wybranego}}`. */
4171
4478
  "selected-label"?: (HelixHeadlessDataTable["selectedLabel"]) | undefined;
4172
4479
  /** What screen readers hear when the chosen rows change. `{count}` is how many
4173
- rows are chosen. */
4480
+ rows are chosen, written in the locale, and a language that needs plural
4481
+ forms writes them: `{count, plural, one {# wybrany} few {# wybrane} many
4482
+ {# wybranych} other {# wybranego}}`. */
4174
4483
  selectedLabel?: (HelixHeadlessDataTable["selectedLabel"]) | undefined;
4175
4484
  /** The name of a row's checkbox. `{row}` is replaced with the row's value in
4176
4485
  the first column that has a field, or with its key. */
@@ -4186,10 +4495,14 @@ the event and set this to the order you chose. `default-sort` seeds an
4186
4495
  order this element then owns. */
4187
4496
  sort?: (HelixHeadlessDataTable["sort"]) | undefined;
4188
4497
  /** What screen readers hear when the table is sorted. `{column}` is the
4189
- column's heading and `{order}` is `ascending-label` or `descending-label`. */
4498
+ column's heading and `{direction}` is `ascending` or `descending`, so each
4499
+ order has its whole sentence. `{order}` is the deprecated
4500
+ `ascending-label` or `descending-label`. */
4190
4501
  "sorted-label"?: (HelixHeadlessDataTable["sortedLabel"]) | undefined;
4191
4502
  /** What screen readers hear when the table is sorted. `{column}` is the
4192
- column's heading and `{order}` is `ascending-label` or `descending-label`. */
4503
+ column's heading and `{direction}` is `ascending` or `descending`, so each
4504
+ order has its whole sentence. `{order}` is the deprecated
4505
+ `ascending-label` or `descending-label`. */
4193
4506
  sortedLabel?: (HelixHeadlessDataTable["sortedLabel"]) | undefined;
4194
4507
  /** The number of rows in the whole result, for when the table cannot count
4195
4508
  them.
@@ -4250,6 +4563,8 @@ holds and reordering it under them is a mutation they did not ask for. */
4250
4563
  export type HelixHeadlessDataTableVueEvents = {
4251
4564
  /** Fired after the page changes, with the new page as a string in `detail.value`. */
4252
4565
  "helix-activate": HelixHeadlessDataTableHelixActivateElementEvent;
4566
+ /** A row is about to move, with `reorderable-rows`. The event carries every row's key in the new order. Cancelable: cancel it to keep the row where it is. */
4567
+ "helix-before-reorder": HelixHeadlessDataTableHelixBeforeReorderElementEvent;
4253
4568
  /** Fired after a row opens or closes, with every open row's key, separated by commas, which `expanded` also holds. */
4254
4569
  "helix-expand": HelixHeadlessDataTableHelixExpandElementEvent;
4255
4570
  /** The search query is about to change. Cancelable: cancel it to keep the current query. */
@@ -4260,7 +4575,7 @@ export type HelixHeadlessDataTableVueEvents = {
4260
4575
  "helix-load-more": HelixHeadlessDataTableHelixLoadMoreElementEvent;
4261
4576
  /** Another page was requested. Cancelable: cancel it to stay on the current page. */
4262
4577
  "helix-navigate": HelixHeadlessDataTableHelixNavigateElementEvent;
4263
- /** The columns are about to move. The event carries every field in the new order. Cancelable: cancel it to keep the current order. */
4578
+ /** The columns are about to move, with `kind` set to `column` and every field in the new order. Cancelable: cancel it to keep the current order. For a row, with `kind` set to `row`, it follows `helix-before-reorder`, and you set `rows` to the order in `keys`. */
4264
4579
  "helix-reorder": HelixHeadlessDataTableHelixReorderElementEvent;
4265
4580
  /** Fired after the columns move, with every field in the new order. */
4266
4581
  "helix-reordered": HelixHeadlessDataTableHelixReorderedElementEvent;
@@ -4299,6 +4614,15 @@ Empty leaves the attribute off, which is the browser's default and is what
4299
4614
  lets autofill work at all: hardcoding `off` here means a birthday or a
4300
4615
  postal code can never be filled in for a reader. */
4301
4616
  autocomplete?: (HelixHeadlessDateInput["autocomplete"]) | undefined;
4617
+ /** The calendar the written date and the calendar's days are in: `gregory`,
4618
+ `buddhist`, `japanese`, `roc`, or `iso8601`.
4619
+
4620
+ Absent is the locale's own where it is one of the five, and `gregory` for
4621
+ every other, as Date Picker's `calendar` is. The value is `YYYY-MM-DD` in
4622
+ every calendar, and a focused field is ISO in every calendar. In
4623
+ `segmented`, the segments are the Gregorian day, month, and year, in the
4624
+ order the locale writes them, or ISO order for `iso8601`. */
4625
+ calendar?: (HelixHeadlessDateInput["calendar"]) | undefined;
4302
4626
  /** The name of the calendar's grid of days, read by screen readers. */
4303
4627
  "calendar-label"?: (HelixHeadlessDateInput["calendarLabel"]) | undefined;
4304
4628
  /** The name of the calendar's grid of days, read by screen readers. */
@@ -4437,14 +4761,14 @@ window has no room for that width it shows one month until there is. */
4437
4761
  /** The message shown when a range holds more than two dates.
4438
4762
 
4439
4763
  **Every sentence a control raises in the browser's bubble is a property**,
4440
- so a form in another language speaks it. Absent is the control's own
4441
- sentence, in English. */
4764
+ so a form in another language speaks it. Unset is the sentence registered
4765
+ for the page's language, then the English. */
4442
4766
  "range-length-message"?: (HelixHeadlessDateInput["rangeLengthMessage"]) | undefined;
4443
4767
  /** The message shown when a range holds more than two dates.
4444
4768
 
4445
4769
  **Every sentence a control raises in the browser's bubble is a property**,
4446
- so a form in another language speaks it. Absent is the control's own
4447
- sentence, in English. */
4770
+ so a form in another language speaks it. Unset is the sentence registered
4771
+ for the page's language, then the English. */
4448
4772
  rangeLengthMessage?: (HelixHeadlessDateInput["rangeLengthMessage"]) | undefined;
4449
4773
  /** The message shown when a date is after `max`. `{max}` is replaced with
4450
4774
  `max`, written the way the field writes dates. */
@@ -4495,12 +4819,28 @@ platform's base. */
4495
4819
  /** The name of the calendar's heading where it shows a page of years, with
4496
4820
  `{heading}` filled in. */
4497
4821
  yearViewLabel?: (HelixHeadlessDateInput["yearViewLabel"]) | undefined;
4822
+ /** What a row of segments reports when the field is required and every
4823
+ segment is empty, where `value-missing-message` is not set. `{kind}` is
4824
+ `date` or `time`. */
4825
+ "empty-message"?: (HelixHeadlessDateInput["emptyMessage"]) | undefined;
4826
+ /** What a row of segments reports when the field is required and every
4827
+ segment is empty, where `value-missing-message` is not set. `{kind}` is
4828
+ `date` or `time`. */
4829
+ emptyMessage?: (HelixHeadlessDateInput["emptyMessage"]) | undefined;
4498
4830
  /** What a screen reader hears for a segment with nothing in it, which a
4499
4831
  sighted reader sees as dashes. */
4500
4832
  "empty-segment-label"?: (HelixHeadlessDateInput["emptySegmentLabel"]) | undefined;
4501
4833
  /** What a screen reader hears for a segment with nothing in it, which a
4502
4834
  sighted reader sees as dashes. */
4503
4835
  emptySegmentLabel?: (HelixHeadlessDateInput["emptySegmentLabel"]) | undefined;
4836
+ /** What a row of segments reports while some segments are set and others
4837
+ are not, where `bad-input-message` is not set. `{kind}` is `date` or
4838
+ `time`. */
4839
+ "incomplete-message"?: (HelixHeadlessDateInput["incompleteMessage"]) | undefined;
4840
+ /** What a row of segments reports while some segments are set and others
4841
+ are not, where `bad-input-message` is not set. `{kind}` is `date` or
4842
+ `time`. */
4843
+ incompleteMessage?: (HelixHeadlessDateInput["incompleteMessage"]) | undefined;
4504
4844
  /** Whether the field is a row of segments, one for each part of the date or
4505
4845
  time, in place of a line of text.
4506
4846
 
@@ -4582,6 +4922,12 @@ as `+3`, does not say what it does. */
4582
4922
  "max-tags"?: (HelixHeadlessDateInput["maxTags"] | `${number}`) | undefined;
4583
4923
  /** How many tokens to show before the rest become a count. */
4584
4924
  maxTags?: (HelixHeadlessDateInput["maxTags"]) | undefined;
4925
+ /** The count of the tokens past `max-tags`, as it is shown, with `{count}`
4926
+ for the number, written in the element's locale. */
4927
+ "rest-text"?: (HelixHeadlessDateInput["restText"]) | undefined;
4928
+ /** The count of the tokens past `max-tags`, as it is shown, with `{count}`
4929
+ for the number, written in the element's locale. */
4930
+ restText?: (HelixHeadlessDateInput["restText"]) | undefined;
4585
4931
  /** The value the control starts with. A form reset returns it to this value,
4586
4932
  and to the `value` attribute where this one is not written, as a native
4587
4933
  control resets to the `value` it declares. */
@@ -4611,18 +4957,22 @@ browser's message. */
4611
4957
  required?: (HelixHeadlessDateInput["required"]) | undefined;
4612
4958
  /** The message shown when the field is required and empty.
4613
4959
 
4614
- **Absent, or empty, is the control's own sentence**, "Choose one to continue." on a
4615
- set and the browser's own on a text field, which the browser writes in
4616
- the reader's language. Every other word a control speaks is a property,
4960
+ **Absent, or empty, is the control's own sentence**, "Choose one to
4961
+ continue." on a set and the browser's own on a text field, which the
4962
+ browser writes in the reader's language. A family with a sentence of its
4963
+ own declares it as this property's English, a word property a page
4964
+ registers for its locale under the family's key. Every other word a control speaks is a property,
4617
4965
  and this one was the English a form in another language still spoke in
4618
4966
  the bubble it raises on submit: `feedback` replaces the message under
4619
4967
  the field and does not reach that one. */
4620
4968
  "value-missing-message"?: (HelixHeadlessDateInput["valueMissingMessage"]) | undefined;
4621
4969
  /** The message shown when the field is required and empty.
4622
4970
 
4623
- **Absent, or empty, is the control's own sentence**, "Choose one to continue." on a
4624
- set and the browser's own on a text field, which the browser writes in
4625
- the reader's language. Every other word a control speaks is a property,
4971
+ **Absent, or empty, is the control's own sentence**, "Choose one to
4972
+ continue." on a set and the browser's own on a text field, which the
4973
+ browser writes in the reader's language. A family with a sentence of its
4974
+ own declares it as this property's English, a word property a page
4975
+ registers for its locale under the family's key. Every other word a control speaks is a property,
4626
4976
  and this one was the English a form in another language still spoke in
4627
4977
  the bubble it raises on submit: `feedback` replaces the message under
4628
4978
  the field and does not reach that one. */
@@ -4709,14 +5059,28 @@ export type HelixHeadlessDatePickerVueProps = {
4709
5059
 
4710
5060
  **Every sentence a control raises in the browser's bubble is a property**,
4711
5061
  named for the validity flag it reports, so a form in another language
4712
- speaks it. Absent is the control's own sentence, in English. */
5062
+ speaks it. Unset is the sentence registered for the page's language, then
5063
+ the English. `{mode}` is `single`, `range` or `multiple`, so each can have
5064
+ its own sentence. */
4713
5065
  "bad-input-message"?: (HelixHeadlessDatePicker["badInputMessage"]) | undefined;
4714
5066
  /** The validation message for a value that is not a date.
4715
5067
 
4716
5068
  **Every sentence a control raises in the browser's bubble is a property**,
4717
5069
  named for the validity flag it reports, so a form in another language
4718
- speaks it. Absent is the control's own sentence, in English. */
5070
+ speaks it. Unset is the sentence registered for the page's language, then
5071
+ the English. `{mode}` is `single`, `range` or `multiple`, so each can have
5072
+ its own sentence. */
4719
5073
  badInputMessage?: (HelixHeadlessDatePicker["badInputMessage"]) | undefined;
5074
+ /** The calendar the heading, the days, and the months are written in:
5075
+ `gregory`, `buddhist`, `japanese`, `roc`, or `iso8601`, the five whose
5076
+ months are the Gregorian months.
5077
+
5078
+ Absent is the locale's own where it is one of the five, such as
5079
+ `buddhist` for `th-TH` or `japanese` for `ja-JP-u-ca-japanese`, and
5080
+ `gregory` for every other, such as `persian` for `fa-IR`, so the heading
5081
+ names the Gregorian month the grid shows. The value is `YYYY-MM-DD` in
5082
+ every calendar. */
5083
+ calendar?: (HelixHeadlessDatePicker["calendar"]) | undefined;
4720
5084
  /** The month to open on when `month` is not set. */
4721
5085
  "default-month"?: (HelixHeadlessDatePicker["defaultMonth"]) | undefined;
4722
5086
  /** The month to open on when `month` is not set. */
@@ -5093,6 +5457,12 @@ interface. */
5093
5457
  /** The close control's accessible name. Translate it with the rest of your
5094
5458
  interface. */
5095
5459
  dismissLabel?: (HelixHeadlessDialog["dismissLabel"]) | undefined;
5460
+ /** The dialog's name where nothing names it: no `label`, no heading in the
5461
+ `header` slot, and no `aria-labelledby` on the host. */
5462
+ "fallback-label"?: (HelixHeadlessDialog["fallbackLabel"]) | undefined;
5463
+ /** The dialog's name where nothing names it: no `label`, no heading in the
5464
+ `header` slot, and no `aria-labelledby` on the host. */
5465
+ fallbackLabel?: (HelixHeadlessDialog["fallbackLabel"]) | undefined;
5096
5466
  /** Accessible name for the dialog. When it is empty, the heading in the
5097
5467
  `header` slot names the dialog. */
5098
5468
  label?: (HelixHeadlessDialog["label"]) | undefined;
@@ -5148,20 +5518,23 @@ export type HelixHeadlessDialogVueEvents = {
5148
5518
  };
5149
5519
 
5150
5520
  export type HelixHeadlessDividerVueProps = {
5151
- /** Whether screen readers announce the line as a separator.
5152
-
5153
- Off by default, and out of the accessibility tree. Most rules on a page
5154
- separate nothing: they underline a heading or close a section that space
5155
- had already closed, and announcing every one as a separator is noise a
5156
- screen-reader user has to walk past.
5157
-
5158
- An opt-in, not a `decorative` opt-out, because a boolean attribute cannot
5159
- be turned off: `decorative="false"` parses as `true`, which would put the
5160
- quiet default out of reach from HTML and leave it settable only as a
5161
- property. An opt-in is absent by default, which every reflected property
5162
- here has to be. */
5521
+ /** Whether screen readers announce the line as a separator, which they now do
5522
+ by default.
5523
+
5524
+ It dates from when the line was decorative by default. It is still read,
5525
+ and it wins over `decorative`, so a divider written with it stays a
5526
+ separator. */
5163
5527
  announced?: (HelixHeadlessDivider["announced"]) | undefined;
5164
- /** The direction the line runs: `horizontal` or `vertical`. */
5528
+ /** Takes the line out of the accessibility tree, for a rule that separates
5529
+ nothing: one under a heading, or between the facts of a byline.
5530
+
5531
+ Absent, the line is a separator, as `<hr>` is. Radix Separator's opt-out
5532
+ has the same name. It turns the role off because a boolean attribute that
5533
+ is on by default cannot be turned off from HTML. */
5534
+ decorative?: (HelixHeadlessDivider["decorative"]) | undefined;
5535
+ /** The direction the line runs: `horizontal` or `vertical`.
5536
+
5537
+ Unset is horizontal, or across the toolbar the divider sits in. */
5165
5538
  orientation?: (HelixHeadlessDivider["orientation"]) | undefined;
5166
5539
  };
5167
5540
 
@@ -5249,8 +5622,8 @@ words and is already written. */
5249
5622
  /** The locale the chart's own numbers are written in: its axis, its
5250
5623
  percentages and its totals, such as `de` for `1.240` and `32 %`.
5251
5624
 
5252
- Absent uses the runtime's own. The table's cells are shown as the table
5253
- writes them, whatever this says. */
5625
+ Absent reads the nearest `lang`, then the runtime's own. The table's
5626
+ cells are shown as the table writes them, whatever this says. */
5254
5627
  locale?: (HelixHeadlessDonutChart["locale"]) | undefined;
5255
5628
  /** Where a reading the keys moved to stands among the readings, said after
5256
5629
  it. `{position}` and `{count}` are replaced with the numbers, written in
@@ -5321,6 +5694,12 @@ interface. */
5321
5694
  /** The close control's accessible name. Translate it with the rest of your
5322
5695
  interface. */
5323
5696
  dismissLabel?: (HelixHeadlessDrawer["dismissLabel"]) | undefined;
5697
+ /** The panel's name where nothing names it: no `label`, no heading in the
5698
+ `header` slot, and no `aria-labelledby` on the host. */
5699
+ "fallback-label"?: (HelixHeadlessDrawer["fallbackLabel"]) | undefined;
5700
+ /** The panel's name where nothing names it: no `label`, no heading in the
5701
+ `header` slot, and no `aria-labelledby` on the host. */
5702
+ fallbackLabel?: (HelixHeadlessDrawer["fallbackLabel"]) | undefined;
5324
5703
  /** Accessible name for the panel. When it is empty, the heading in the
5325
5704
  `header` slot names the panel. */
5326
5705
  label?: (HelixHeadlessDrawer["label"]) | undefined;
@@ -5536,14 +5915,20 @@ filter is the only check the platform makes and a drop never meets it. */
5536
5915
  /** What a reader hears when a drop or a paste adds files, with `{names}` and
5537
5916
  `{count}` filled in. */
5538
5917
  addedText?: (HelixHeadlessFileInput["addedText"]) | undefined;
5918
+ /** A file's size under a kilobyte. `{count}` is how many bytes, written in
5919
+ the locale, and each language writes the forms it has. */
5920
+ "bytes-label"?: (HelixHeadlessFileInput["bytesLabel"]) | undefined;
5921
+ /** A file's size under a kilobyte. `{count}` is how many bytes, written in
5922
+ the locale, and each language writes the forms it has. */
5923
+ bytesLabel?: (HelixHeadlessFileInput["bytesLabel"]) | undefined;
5539
5924
  /** Which camera or microphone a mobile picker should offer, if any. */
5540
5925
  capture?: (HelixHeadlessFileInput["capture"]) | undefined;
5541
5926
  /** Whether the picker chooses a folder, and the field takes every file in
5542
5927
  it. The platform's `webkitdirectory`. */
5543
5928
  directory?: (HelixHeadlessFileInput["directory"]) | undefined;
5544
- /** Language tag the sizes are written in.
5545
-
5546
- Absent uses the runtime's own. */
5929
+ /** The locale the words, the sizes, and the numbers and lists in sentences
5930
+ are in, as a BCP 47 tag such as `pl`. Empty reads the nearest `lang`, then
5931
+ the browser's language. */
5547
5932
  locale?: (HelixHeadlessFileInput["locale"]) | undefined;
5548
5933
  /** The most files the field holds, under `multiple`. Files past it are
5549
5934
  refused. */
@@ -5605,18 +5990,22 @@ browser's message. */
5605
5990
  required?: (HelixHeadlessFileInput["required"]) | undefined;
5606
5991
  /** The message shown when the field is required and empty.
5607
5992
 
5608
- **Absent, or empty, is the control's own sentence**, "Choose one to continue." on a
5609
- set and the browser's own on a text field, which the browser writes in
5610
- the reader's language. Every other word a control speaks is a property,
5993
+ **Absent, or empty, is the control's own sentence**, "Choose one to
5994
+ continue." on a set and the browser's own on a text field, which the
5995
+ browser writes in the reader's language. A family with a sentence of its
5996
+ own declares it as this property's English, a word property a page
5997
+ registers for its locale under the family's key. Every other word a control speaks is a property,
5611
5998
  and this one was the English a form in another language still spoke in
5612
5999
  the bubble it raises on submit: `feedback` replaces the message under
5613
6000
  the field and does not reach that one. */
5614
6001
  "value-missing-message"?: (HelixHeadlessFileInput["valueMissingMessage"]) | undefined;
5615
6002
  /** The message shown when the field is required and empty.
5616
6003
 
5617
- **Absent, or empty, is the control's own sentence**, "Choose one to continue." on a
5618
- set and the browser's own on a text field, which the browser writes in
5619
- the reader's language. Every other word a control speaks is a property,
6004
+ **Absent, or empty, is the control's own sentence**, "Choose one to
6005
+ continue." on a set and the browser's own on a text field, which the
6006
+ browser writes in the reader's language. A family with a sentence of its
6007
+ own declares it as this property's English, a word property a page
6008
+ registers for its locale under the family's key. Every other word a control speaks is a property,
5620
6009
  and this one was the English a form in another language still spoke in
5621
6010
  the bubble it raises on submit: `feedback` replaces the message under
5622
6011
  the field and does not reach that one. */
@@ -5682,6 +6071,20 @@ export type HelixHeadlessFilterChipHelixDismissElementEvent =
5682
6071
  HelixHeadlessFilterChipElementEvent<HelixDismissEvent>;
5683
6072
 
5684
6073
  export type HelixHeadlessFilterChipVueProps = {
6074
+ /** The remove button's name, read by screen readers. The chip's own words
6075
+ follow it, so several chips are told apart.
6076
+
6077
+ "Remove filter" rather than the mixin's "Dismiss", for the reason `Tag`
6078
+ gives its own: taking a filter out of a set is a different act from
6079
+ closing a message. */
6080
+ "dismiss-label"?: (HelixHeadlessFilterChip["dismissLabel"]) | undefined;
6081
+ /** The remove button's name, read by screen readers. The chip's own words
6082
+ follow it, so several chips are told apart.
6083
+
6084
+ "Remove filter" rather than the mixin's "Dismiss", for the reason `Tag`
6085
+ gives its own: taking a filter out of a set is a different act from
6086
+ closing a message. */
6087
+ dismissLabel?: (HelixHeadlessFilterChip["dismissLabel"]) | undefined;
5685
6088
  /** The name of the field the filter is on, as shown on the chip.
5686
6089
 
5687
6090
  The slot's fallback rather than the slot's replacement: a consumer who wants
@@ -5730,20 +6133,6 @@ makes an unusual filter look unusual. */
5730
6133
  operatorLabel?: (HelixHeadlessFilterChip["operatorLabel"]) | undefined;
5731
6134
  /** Whether the element shows a control that dismisses it. */
5732
6135
  dismissible?: (HelixHeadlessFilterChip["dismissible"]) | undefined;
5733
- /** The dismiss control's label, read by screen readers.
5734
-
5735
- `attribute` is spelled out because Lit lowercases a property name to
5736
- derive one rather than dash-casing it, so this would otherwise be
5737
- reachable only as `dismisslabel`, which nobody would guess and no linter
5738
- would catch. */
5739
- "dismiss-label"?: (HelixHeadlessFilterChip["dismissLabel"]) | undefined;
5740
- /** The dismiss control's label, read by screen readers.
5741
-
5742
- `attribute` is spelled out because Lit lowercases a property name to
5743
- derive one rather than dash-casing it, so this would otherwise be
5744
- reachable only as `dismisslabel`, which nobody would guess and no linter
5745
- would catch. */
5746
- dismissLabel?: (HelixHeadlessFilterChip["dismissLabel"]) | undefined;
5747
6136
  };
5748
6137
 
5749
6138
  export type HelixHeadlessFilterChipVueEvents = {
@@ -5893,13 +6282,21 @@ what you slot and you narrow it. */
5893
6282
 
5894
6283
  Not a label: it goes when typing starts. */
5895
6284
  placeholder?: (HelixHeadlessFilterInput["placeholder"]) | undefined;
5896
- /** What a reader hears for one suggestion, with `{count}` filled in. */
6285
+ /** What a reader hears for one suggestion, where `suggestions-label` should
6286
+ not say it. `{count}` is the count. */
5897
6287
  "suggestion-label"?: (HelixHeadlessFilterInput["suggestionLabel"]) | undefined;
5898
- /** What a reader hears for one suggestion, with `{count}` filled in. */
6288
+ /** What a reader hears for one suggestion, where `suggestions-label` should
6289
+ not say it. `{count}` is the count. */
5899
6290
  suggestionLabel?: (HelixHeadlessFilterInput["suggestionLabel"]) | undefined;
5900
- /** What a reader hears for any other number of suggestions, with `{count}` filled in. */
6291
+ /** What a reader hears as the panel opens on its suggestions. `{count}` is
6292
+ how many, written in the locale, and each language writes the forms it
6293
+ has: `{count, plural, one {# sugestia} few {# sugestie} many {# sugestii}
6294
+ other {# sugestii}}`. */
5901
6295
  "suggestions-label"?: (HelixHeadlessFilterInput["suggestionsLabel"]) | undefined;
5902
- /** What a reader hears for any other number of suggestions, with `{count}` filled in. */
6296
+ /** What a reader hears as the panel opens on its suggestions. `{count}` is
6297
+ how many, written in the locale, and each language writes the forms it
6298
+ has: `{count, plural, one {# sugestia} few {# sugestie} many {# sugestii}
6299
+ other {# sugestii}}`. */
5903
6300
  suggestionsLabel?: (HelixHeadlessFilterInput["suggestionsLabel"]) | undefined;
5904
6301
  /** Whether the element starts open. Ignored once `open` is written. */
5905
6302
  "default-open"?: (HelixHeadlessFilterInput["defaultOpen"]) | undefined;
@@ -5934,6 +6331,12 @@ as `+3`, does not say what it does. */
5934
6331
  "max-tags"?: (HelixHeadlessFilterInput["maxTags"] | `${number}`) | undefined;
5935
6332
  /** How many tokens to show before the rest become a count. */
5936
6333
  maxTags?: (HelixHeadlessFilterInput["maxTags"]) | undefined;
6334
+ /** The count of the tokens past `max-tags`, as it is shown, with `{count}`
6335
+ for the number, written in the element's locale. */
6336
+ "rest-text"?: (HelixHeadlessFilterInput["restText"]) | undefined;
6337
+ /** The count of the tokens past `max-tags`, as it is shown, with `{count}`
6338
+ for the number, written in the element's locale. */
6339
+ restText?: (HelixHeadlessFilterInput["restText"]) | undefined;
5937
6340
  /** The value the control starts with. A form reset returns it to this value,
5938
6341
  and to the `value` attribute where this one is not written, as a native
5939
6342
  control resets to the `value` it declares. */
@@ -5963,18 +6366,22 @@ browser's message. */
5963
6366
  required?: (HelixHeadlessFilterInput["required"]) | undefined;
5964
6367
  /** The message shown when the field is required and empty.
5965
6368
 
5966
- **Absent, or empty, is the control's own sentence**, "Choose one to continue." on a
5967
- set and the browser's own on a text field, which the browser writes in
5968
- the reader's language. Every other word a control speaks is a property,
6369
+ **Absent, or empty, is the control's own sentence**, "Choose one to
6370
+ continue." on a set and the browser's own on a text field, which the
6371
+ browser writes in the reader's language. A family with a sentence of its
6372
+ own declares it as this property's English, a word property a page
6373
+ registers for its locale under the family's key. Every other word a control speaks is a property,
5969
6374
  and this one was the English a form in another language still spoke in
5970
6375
  the bubble it raises on submit: `feedback` replaces the message under
5971
6376
  the field and does not reach that one. */
5972
6377
  "value-missing-message"?: (HelixHeadlessFilterInput["valueMissingMessage"]) | undefined;
5973
6378
  /** The message shown when the field is required and empty.
5974
6379
 
5975
- **Absent, or empty, is the control's own sentence**, "Choose one to continue." on a
5976
- set and the browser's own on a text field, which the browser writes in
5977
- the reader's language. Every other word a control speaks is a property,
6380
+ **Absent, or empty, is the control's own sentence**, "Choose one to
6381
+ continue." on a set and the browser's own on a text field, which the
6382
+ browser writes in the reader's language. A family with a sentence of its
6383
+ own declares it as this property's English, a word property a page
6384
+ registers for its locale under the family's key. Every other word a control speaks is a property,
5978
6385
  and this one was the English a form in another language still spoke in
5979
6386
  the bubble it raises on submit: `feedback` replaces the message under
5980
6387
  the field and does not reach that one. */
@@ -6029,6 +6436,14 @@ export type HelixHeadlessFilterInputVueEvents = {
6029
6436
  };
6030
6437
 
6031
6438
  export type HelixHeadlessFormatDateVueProps = {
6439
+ /** The calendar a date is written in: `gregory`, `buddhist`, `japanese`,
6440
+ `roc`, or `iso8601`, the calendars Date Picker and Date Input draw.
6441
+
6442
+ Absent is the locale's own where it is one of the five, such as
6443
+ `buddhist` for `th-TH`, and `gregory` for every other, such as `persian`
6444
+ for `fa-IR`, so a date written here reads as the same date a Date Picker
6445
+ beside it shows. */
6446
+ calendar?: (HelixHeadlessFormatDate["calendar"]) | undefined;
6032
6447
  /** The timestamp, in any format `Date` can parse.
6033
6448
 
6034
6449
  An ISO string is what an API sends and what `<time datetime>` takes, so it
@@ -6062,6 +6477,14 @@ few characters and a date is not. */
6062
6477
  elapsed?: (HelixHeadlessFormatDate["elapsed"]) | undefined;
6063
6478
  /** How the era is written, such as AD, where a date is shown. */
6064
6479
  era?: (HelixHeadlessFormatDate["era"]) | undefined;
6480
+ /** Draws each field of a date in a part of its own: `weekday`, `day`,
6481
+ `month`, `year`, `era`, `hour`, `minute`, `second`, `day-period` and
6482
+ `time-zone-name`, so `::part(year)` can set the year apart.
6483
+
6484
+ Off by default, which draws the date as one run of text, as Shoelace and
6485
+ Web Awesome do. An `elapsed` or `relative` reading is one phrase either
6486
+ way. */
6487
+ fields?: (HelixHeadlessFormatDate["fields"]) | undefined;
6065
6488
  /** Draws an `elapsed` or `relative` reading once and leaves it, where it
6066
6489
  would otherwise move on as it goes stale.
6067
6490
 
@@ -6170,13 +6593,33 @@ export type HelixHeadlessGraphHelixGraphZoomElementEvent =
6170
6593
  HelixHeadlessGraphElementEvent<HelixGraphZoomEvent>;
6171
6594
 
6172
6595
  export type HelixHeadlessGraphVueProps = {
6173
- /** What the list says of a note's count, with `{count}`. */
6596
+ /** The hint shown when the graph, waiting to be pressed with
6597
+ `gestures="activate"`, is scrolled or swiped over. */
6598
+ "activate-hint-label"?: (HelixHeadlessGraph["activateHintLabel"]) | undefined;
6599
+ /** The hint shown when the graph, waiting to be pressed with
6600
+ `gestures="activate"`, is scrolled or swiped over. */
6601
+ activateHintLabel?: (HelixHeadlessGraph["activateHintLabel"]) | undefined;
6602
+ /** The name of the group of controls, read by screen readers, which names
6603
+ what the controls drive rather than the mechanism. */
6604
+ "controls-label"?: (HelixHeadlessGraph["controlsLabel"]) | undefined;
6605
+ /** The name of the group of controls, read by screen readers, which names
6606
+ what the controls drive rather than the mechanism. */
6607
+ controlsLabel?: (HelixHeadlessGraph["controlsLabel"]) | undefined;
6608
+ /** What the list says of how many notes it holds. `{count}` is the count,
6609
+ written in the locale, and each language writes the forms it has. */
6174
6610
  "count-label"?: (HelixHeadlessGraph["countLabel"]) | undefined;
6175
- /** What the list says of a note's count, with `{count}`. */
6611
+ /** What the list says of how many notes it holds. `{count}` is the count,
6612
+ written in the locale, and each language writes the forms it has. */
6176
6613
  countLabel?: (HelixHeadlessGraph["countLabel"]) | undefined;
6177
6614
  /** How many links from the selected note to show, for its local graph. Unset
6178
6615
  shows every note. The list holds what the drawing shows. */
6179
6616
  depth?: (HelixHeadlessGraph["depth"]) | undefined;
6617
+ /** The graph's name where `label` is empty and the host has no
6618
+ `aria-label`. */
6619
+ "fallback-label"?: (HelixHeadlessGraph["fallbackLabel"]) | undefined;
6620
+ /** The graph's name where `label` is empty and the host has no
6621
+ `aria-label`. */
6622
+ fallbackLabel?: (HelixHeadlessGraph["fallbackLabel"]) | undefined;
6180
6623
  /** The graph's name, read by screen readers, such as "Research notes".
6181
6624
  Required. */
6182
6625
  label?: (HelixHeadlessGraph["label"]) | undefined;
@@ -6199,6 +6642,22 @@ or hides its notes. Drawn where the notes have two groups or more. */
6199
6642
  "links-to-label"?: (HelixHeadlessGraph["linksToLabel"]) | undefined;
6200
6643
  /** How a note that links to the selected one is described, with `{note}`. */
6201
6644
  linksToLabel?: (HelixHeadlessGraph["linksToLabel"]) | undefined;
6645
+ /** What screen readers hear once the drawing has moved down, after `moved()`. */
6646
+ "moved-down-label"?: (HelixHeadlessGraph["movedDownLabel"]) | undefined;
6647
+ /** What screen readers hear once the drawing has moved down, after `moved()`. */
6648
+ movedDownLabel?: (HelixHeadlessGraph["movedDownLabel"]) | undefined;
6649
+ /** What screen readers hear once the drawing has moved left, after `moved()`. */
6650
+ "moved-left-label"?: (HelixHeadlessGraph["movedLeftLabel"]) | undefined;
6651
+ /** What screen readers hear once the drawing has moved left, after `moved()`. */
6652
+ movedLeftLabel?: (HelixHeadlessGraph["movedLeftLabel"]) | undefined;
6653
+ /** What screen readers hear once the drawing has moved right, after `moved()`. */
6654
+ "moved-right-label"?: (HelixHeadlessGraph["movedRightLabel"]) | undefined;
6655
+ /** What screen readers hear once the drawing has moved right, after `moved()`. */
6656
+ movedRightLabel?: (HelixHeadlessGraph["movedRightLabel"]) | undefined;
6657
+ /** What screen readers hear once the drawing has moved up, after `moved()`. */
6658
+ "moved-up-label"?: (HelixHeadlessGraph["movedUpLabel"]) | undefined;
6659
+ /** What screen readers hear once the drawing has moved up, after `moved()`. */
6660
+ movedUpLabel?: (HelixHeadlessGraph["movedUpLabel"]) | undefined;
6202
6661
  /** Leaves the search and the list out of the frame, behind a button among
6203
6662
  its controls that opens them over the drawing. For a graph shown large,
6204
6663
  such as at the top of a page, where the drawing takes the whole frame. */
@@ -6219,12 +6678,28 @@ such as at the top of a page, where the drawing takes the whole frame. */
6219
6678
  "selected-label"?: (HelixHeadlessGraph["selectedLabel"]) | undefined;
6220
6679
  /** How the selected note is described in the list. */
6221
6680
  selectedLabel?: (HelixHeadlessGraph["selectedLabel"]) | undefined;
6222
- /** The hint shown when a surface waiting to be pressed is scrolled or
6223
- swiped over, with `gestures="activate"`. Absent is the family's own. */
6224
- "activate-hint-label"?: (HelixHeadlessGraph["activateHintLabel"]) | undefined;
6225
- /** The hint shown when a surface waiting to be pressed is scrolled or
6226
- swiped over, with `gestures="activate"`. Absent is the family's own. */
6227
- activateHintLabel?: (HelixHeadlessGraph["activateHintLabel"]) | undefined;
6681
+ /** The hint shown when one finger swipes over the graph with `gestures="cooperative"`. */
6682
+ "two-finger-hint-label"?: (HelixHeadlessGraph["twoFingerHintLabel"]) | undefined;
6683
+ /** The hint shown when one finger swipes over the graph with `gestures="cooperative"`. */
6684
+ twoFingerHintLabel?: (HelixHeadlessGraph["twoFingerHintLabel"]) | undefined;
6685
+ /** The line shown while the graph, with `gestures="activate"`, has the gestures. */
6686
+ "using-label"?: (HelixHeadlessGraph["usingLabel"]) | undefined;
6687
+ /** The line shown while the graph, with `gestures="activate"`, has the gestures. */
6688
+ usingLabel?: (HelixHeadlessGraph["usingLabel"]) | undefined;
6689
+ /** The hint shown when the wheel scrolls past the graph with
6690
+ `gestures="cooperative"`. `{key}` is ⌘ on a Mac and Ctrl elsewhere. */
6691
+ "wheel-hint-label"?: (HelixHeadlessGraph["wheelHintLabel"]) | undefined;
6692
+ /** The hint shown when the wheel scrolls past the graph with
6693
+ `gestures="cooperative"`. `{key}` is ⌘ on a Mac and Ctrl elsewhere. */
6694
+ wheelHintLabel?: (HelixHeadlessGraph["wheelHintLabel"]) | undefined;
6695
+ /** What screen readers hear once the drawing has zoomed in, after `moved()`. */
6696
+ "zoomed-in-label"?: (HelixHeadlessGraph["zoomedInLabel"]) | undefined;
6697
+ /** What screen readers hear once the drawing has zoomed in, after `moved()`. */
6698
+ zoomedInLabel?: (HelixHeadlessGraph["zoomedInLabel"]) | undefined;
6699
+ /** What screen readers hear once the drawing has zoomed out, after `moved()`. */
6700
+ "zoomed-out-label"?: (HelixHeadlessGraph["zoomedOutLabel"]) | undefined;
6701
+ /** What screen readers hear once the drawing has zoomed out, after `moved()`. */
6702
+ zoomedOutLabel?: (HelixHeadlessGraph["zoomedOutLabel"]) | undefined;
6228
6703
  /** Which controls to show, as a list such as `pan zoom fullscreen`, or
6229
6704
  `none`. A family can add words of its own.
6230
6705
 
@@ -6247,20 +6722,6 @@ of the frame. The
6247
6722
  stylesheet lays the cluster out by which buttons are in it rather than by
6248
6723
  this attribute, so the two defaults need no rule each. */
6249
6724
  controls?: (HelixHeadlessGraph["controls"]) | undefined;
6250
- /** The name of the group of controls, read by screen readers.
6251
-
6252
- Absent is the family's own name for it, "Map controls" or "Board
6253
- controls", which names what the controls drive rather than the
6254
- mechanism. Written here to say it in another language, which every other
6255
- string this surface speaks already allowed and this one did not. */
6256
- "controls-label"?: (HelixHeadlessGraph["controlsLabel"]) | undefined;
6257
- /** The name of the group of controls, read by screen readers.
6258
-
6259
- Absent is the family's own name for it, "Map controls" or "Board
6260
- controls", which names what the controls drive rather than the
6261
- mechanism. Written here to say it in another language, which every other
6262
- string this surface speaks already allowed and this one did not. */
6263
- controlsLabel?: (HelixHeadlessGraph["controlsLabel"]) | undefined;
6264
6725
  /** Which corner the controls sit in.
6265
6726
 
6266
6727
  **Configurable because there is no safe default**, which is a collision
@@ -6363,26 +6824,6 @@ at any zoom, and a consumer who wants their own units multiplies by them. */
6363
6824
  "pan-up-label"?: (HelixHeadlessGraph["panUpLabel"]) | undefined;
6364
6825
  /** The pan up button's label. */
6365
6826
  panUpLabel?: (HelixHeadlessGraph["panUpLabel"]) | undefined;
6366
- /** The hint shown when one finger swipes over a surface with
6367
- `gestures="cooperative"`. Absent is the family's own. */
6368
- "two-finger-hint-label"?: (HelixHeadlessGraph["twoFingerHintLabel"]) | undefined;
6369
- /** The hint shown when one finger swipes over a surface with
6370
- `gestures="cooperative"`. Absent is the family's own. */
6371
- twoFingerHintLabel?: (HelixHeadlessGraph["twoFingerHintLabel"]) | undefined;
6372
- /** The line shown while a surface with `gestures="activate"` has the
6373
- gestures. Absent is the family's own. */
6374
- "using-label"?: (HelixHeadlessGraph["usingLabel"]) | undefined;
6375
- /** The line shown while a surface with `gestures="activate"` has the
6376
- gestures. Absent is the family's own. */
6377
- usingLabel?: (HelixHeadlessGraph["usingLabel"]) | undefined;
6378
- /** The hint shown when the wheel scrolls past a surface with
6379
- `gestures="cooperative"`, with `{key}`, which is ⌘ on a Mac and Ctrl
6380
- elsewhere. Absent is the family's own. */
6381
- "wheel-hint-label"?: (HelixHeadlessGraph["wheelHintLabel"]) | undefined;
6382
- /** The hint shown when the wheel scrolls past a surface with
6383
- `gestures="cooperative"`, with `{key}`, which is ⌘ on a Mac and Ctrl
6384
- elsewhere. Absent is the family's own. */
6385
- wheelHintLabel?: (HelixHeadlessGraph["wheelHintLabel"]) | undefined;
6386
6827
  /** The zoom in button's label. */
6387
6828
  "zoom-in-label"?: (HelixHeadlessGraph["zoomInLabel"]) | undefined;
6388
6829
  /** The zoom in button's label. */
@@ -6425,7 +6866,7 @@ export type HelixHeadlessGraphVueEvents = {
6425
6866
  "helix-graph-filter": HelixHeadlessGraphHelixGraphFilterElementEvent;
6426
6867
  /** A layout settled, with where it put each note, sent by `laidOut()`. Keep the positions and pass them back as each note's `x` and `y`, and `z` where a renderer draws in three dimensions. */
6427
6868
  "helix-graph-layout": HelixHeadlessGraphHelixGraphLayoutElementEvent;
6428
- /** A pan button or arrow key was pressed. `connectGraph` moves the drawing. */
6869
+ /** A pan button or arrow key was pressed. `connectGraph` moves the drawing, then calls `moved()`. */
6429
6870
  "helix-graph-pan": HelixHeadlessGraphHelixGraphPanElementEvent;
6430
6871
  /** The notes, the links, the selection, the depth or the gestures changed. Used by `connectGraph`; pages do not need to listen for it. */
6431
6872
  "helix-graph-part-change": HelixHeadlessGraphHelixGraphPartChangeElementEvent;
@@ -6433,7 +6874,7 @@ export type HelixHeadlessGraphVueEvents = {
6433
6874
  "helix-graph-ready": HelixHeadlessGraphHelixGraphReadyElementEvent;
6434
6875
  /** Something passed between two notes, sent by `signal()`. Used by `connectGraph`; pages do not need to listen for it. */
6435
6876
  "helix-graph-signal": HelixHeadlessGraphHelixGraphSignalElementEvent;
6436
- /** A zoom button or key was pressed. `connectGraph` zooms the drawing. */
6877
+ /** A zoom button or key was pressed. `connectGraph` zooms the drawing, then calls `moved()`. */
6437
6878
  "helix-graph-zoom": HelixHeadlessGraphHelixGraphZoomElementEvent;
6438
6879
  };
6439
6880
 
@@ -6450,9 +6891,11 @@ export type HelixHeadlessHeatmapHelixResizeElementEvent =
6450
6891
  HelixHeadlessHeatmapElementEvent<HelixResizeEvent>;
6451
6892
 
6452
6893
  export type HelixHeadlessHeatmapVueProps = {
6453
- /** The word the `overview` puts before the busiest reading. */
6894
+ /** The name the `overview` gives the busiest reading, `{busiestLabel}` in
6895
+ `overview-label`. */
6454
6896
  "busiest-label"?: (HelixHeadlessHeatmap["busiestLabel"]) | undefined;
6455
- /** The word the `overview` puts before the busiest reading. */
6897
+ /** The name the `overview` gives the busiest reading, `{busiestLabel}` in
6898
+ `overview-label`. */
6456
6899
  busiestLabel?: (HelixHeadlessHeatmap["busiestLabel"]) | undefined;
6457
6900
  /** Shown when the table has no readings in it.
6458
6901
 
@@ -6503,6 +6946,16 @@ plan around.
6503
6946
  Zero turns the dropping off altogether, which is right for a strip in a
6504
6947
  container that cannot get narrow. */
6505
6948
  minCell?: (HelixHeadlessHeatmap["minCell"]) | undefined;
6949
+ /** The `overview`'s sentence. `{busiestLabel}` and `{totalLabel}` are
6950
+ `busiest-label` and `total-label`, `{busiest}` the busiest reading's name
6951
+ and its reading as the table writes it, and `{total}` the total of the
6952
+ readings drawn, written in the locale. */
6953
+ "overview-label"?: (HelixHeadlessHeatmap["overviewLabel"]) | undefined;
6954
+ /** The `overview`'s sentence. `{busiestLabel}` and `{totalLabel}` are
6955
+ `busiest-label` and `total-label`, `{busiest}` the busiest reading's name
6956
+ and its reading as the table writes it, and `{total}` the total of the
6957
+ readings drawn, written in the locale. */
6958
+ overviewLabel?: (HelixHeadlessHeatmap["overviewLabel"]) | undefined;
6506
6959
  /** How many rows the strip has.
6507
6960
 
6508
6961
  `1` is a status strip and `7` is a calendar week, which are the two readings
@@ -6511,11 +6964,23 @@ calendar heatmap does: a week is a column, so the strip reads along the
6511
6964
  line in weeks, from the right on a right-to-left page, and top to bottom in
6512
6965
  days. */
6513
6966
  rows?: (HelixHeadlessHeatmap["rows"]) | undefined;
6514
- /** What the `selection` part says after the selection changes, with `{count}` for
6515
- how many cells are selected. */
6967
+ /** What the readout adds for a selected cell, under `selection-mode`, after
6968
+ where the cell stands: "Day 1: 0 (1 of 14, selected)". Empty adds
6969
+ nothing. */
6970
+ "selected-label"?: (HelixHeadlessHeatmap["selectedLabel"]) | undefined;
6971
+ /** What the readout adds for a selected cell, under `selection-mode`, after
6972
+ where the cell stands: "Day 1: 0 (1 of 14, selected)". Empty adds
6973
+ nothing. */
6974
+ selectedLabel?: (HelixHeadlessHeatmap["selectedLabel"]) | undefined;
6975
+ /** What the `selection` part says after the selection changes. `{count}` is
6976
+ how many cells are selected, written in the locale, and a language that
6977
+ needs plural forms writes them: `{count, plural, one {# wybrany} few
6978
+ {# wybrane} many {# wybranych} other {# wybranego}}`. */
6516
6979
  "selection-label"?: (HelixHeadlessHeatmap["selectionLabel"]) | undefined;
6517
- /** What the `selection` part says after the selection changes, with `{count}` for
6518
- how many cells are selected. */
6980
+ /** What the `selection` part says after the selection changes. `{count}` is
6981
+ how many cells are selected, written in the locale, and a language that
6982
+ needs plural forms writes them: `{count, plural, one {# wybrany} few
6983
+ {# wybrane} many {# wybranych} other {# wybranego}}`. */
6519
6984
  selectionLabel?: (HelixHeadlessHeatmap["selectionLabel"]) | undefined;
6520
6985
  /** How many cells a reader can select: `single` or `multiple`.
6521
6986
 
@@ -6525,6 +6990,12 @@ Absent selects nothing, and a press or Space does what it did. */
6525
6990
 
6526
6991
  Absent selects nothing, and a press or Space does what it did. */
6527
6992
  selectionMode?: (HelixHeadlessHeatmap["selectionMode"]) | undefined;
6993
+ /** The strip's name where the chart has none: no `aria-label`, `label`, or
6994
+ table caption. */
6995
+ "strip-label"?: (HelixHeadlessHeatmap["stripLabel"]) | undefined;
6996
+ /** The strip's name where the chart has none: no `aria-label`, `label`, or
6997
+ table caption. */
6998
+ stripLabel?: (HelixHeadlessHeatmap["stripLabel"]) | undefined;
6528
6999
  /** Lower bounds for the tone buckets, in the order the tones are given.
6529
7000
 
6530
7001
  `thresholds="1 3 6 9"` with `tones="1 2 3 4"` puts 1 and 2 in the ramp's
@@ -6543,9 +7014,11 @@ compare two hues at all. `tones="surface info accent success primary"` for a
6543
7014
  commit count is five unrelated hues for five amounts, which is confetti with
6544
7015
  no order in it. */
6545
7016
  tones?: (HelixHeadlessHeatmap["tones"]) | undefined;
6546
- /** The word the `overview` puts before the total of the readings drawn. */
7017
+ /** The name the `overview` gives the total of the readings drawn,
7018
+ `{totalLabel}` in `overview-label`. */
6547
7019
  "total-label"?: (HelixHeadlessHeatmap["totalLabel"]) | undefined;
6548
- /** The word the `overview` puts before the total of the readings drawn. */
7020
+ /** The name the `overview` gives the total of the readings drawn,
7021
+ `{totalLabel}` in `overview-label`. */
6549
7022
  totalLabel?: (HelixHeadlessHeatmap["totalLabel"]) | undefined;
6550
7023
  /** The selected cells, by the names their rows have in the table, such as
6551
7024
  `2026-06-11`, separated by commas.
@@ -6570,8 +7043,8 @@ words and is already written. */
6570
7043
  /** The locale the chart's own numbers are written in: its axis, its
6571
7044
  percentages and its totals, such as `de` for `1.240` and `32 %`.
6572
7045
 
6573
- Absent uses the runtime's own. The table's cells are shown as the table
6574
- writes them, whatever this says. */
7046
+ Absent reads the nearest `lang`, then the runtime's own. The table's
7047
+ cells are shown as the table writes them, whatever this says. */
6575
7048
  locale?: (HelixHeadlessHeatmap["locale"]) | undefined;
6576
7049
  /** Where a reading the keys moved to stands among the readings, said after
6577
7050
  it. `{position}` and `{count}` are replaced with the numbers, written in
@@ -6671,7 +7144,11 @@ not text.
6671
7144
 
6672
7145
  Lives here rather than only on `IconButton` so the two share one render.
6673
7146
  An icon-only button without it is a control a screen reader announces as
6674
- "button" and nothing else. */
7147
+ "button" and nothing else.
7148
+
7149
+ Undefaulted, so a subclass's own default, such as Copy Button's `Copy`, is
7150
+ the first value its element receives and so the English its words fall
7151
+ back to. */
6675
7152
  label?: (HelixHeadlessIconButton["label"]) | undefined;
6676
7153
  /** Whether the action the button started is still running.
6677
7154
 
@@ -7098,18 +7575,22 @@ browser's message. */
7098
7575
  required?: (HelixHeadlessInput["required"]) | undefined;
7099
7576
  /** The message shown when the field is required and empty.
7100
7577
 
7101
- **Absent, or empty, is the control's own sentence**, "Choose one to continue." on a
7102
- set and the browser's own on a text field, which the browser writes in
7103
- the reader's language. Every other word a control speaks is a property,
7578
+ **Absent, or empty, is the control's own sentence**, "Choose one to
7579
+ continue." on a set and the browser's own on a text field, which the
7580
+ browser writes in the reader's language. A family with a sentence of its
7581
+ own declares it as this property's English, a word property a page
7582
+ registers for its locale under the family's key. Every other word a control speaks is a property,
7104
7583
  and this one was the English a form in another language still spoke in
7105
7584
  the bubble it raises on submit: `feedback` replaces the message under
7106
7585
  the field and does not reach that one. */
7107
7586
  "value-missing-message"?: (HelixHeadlessInput["valueMissingMessage"]) | undefined;
7108
7587
  /** The message shown when the field is required and empty.
7109
7588
 
7110
- **Absent, or empty, is the control's own sentence**, "Choose one to continue." on a
7111
- set and the browser's own on a text field, which the browser writes in
7112
- the reader's language. Every other word a control speaks is a property,
7589
+ **Absent, or empty, is the control's own sentence**, "Choose one to
7590
+ continue." on a set and the browser's own on a text field, which the
7591
+ browser writes in the reader's language. A family with a sentence of its
7592
+ own declares it as this property's English, a word property a page
7593
+ registers for its locale under the family's key. Every other word a control speaks is a property,
7113
7594
  and this one was the English a form in another language still spoke in
7114
7595
  the bubble it raises on submit: `feedback` replaces the message under
7115
7596
  the field and does not reach that one. */
@@ -7384,6 +7865,10 @@ interface. */
7384
7865
  /** The close control's accessible name. Translate it with the rest of your
7385
7866
  interface. */
7386
7867
  dismissLabel?: (HelixHeadlessLightbox["dismissLabel"]) | undefined;
7868
+ /** The viewer's name where `label` is empty. */
7869
+ "fallback-label"?: (HelixHeadlessLightbox["fallbackLabel"]) | undefined;
7870
+ /** The viewer's name where `label` is empty. */
7871
+ fallbackLabel?: (HelixHeadlessLightbox["fallbackLabel"]) | undefined;
7387
7872
  /** How long the user can be idle before the header and footer hide, in
7388
7873
  milliseconds.
7389
7874
 
@@ -7417,10 +7902,10 @@ keep the chrome up is the consumer's to decide with this. */
7417
7902
  /** The previous control's accessible name. */
7418
7903
  previousLabel?: (HelixHeadlessLightbox["previousLabel"]) | undefined;
7419
7904
  /** The name of an item with no `label` of its own, with `{index}` and
7420
- `{count}` filled in. */
7905
+ `{count}` filled in, written in the locale. */
7421
7906
  "slide-label"?: (HelixHeadlessLightbox["slideLabel"]) | undefined;
7422
7907
  /** The name of an item with no `label` of its own, with `{index}` and
7423
- `{count}` filled in. */
7908
+ `{count}` filled in, written in the locale. */
7424
7909
  slideLabel?: (HelixHeadlessLightbox["slideLabel"]) | undefined;
7425
7910
  /** The word screen readers announce in place of an item's role, set as
7426
7911
  `aria-roledescription`. Translate it with the rest of your text, or empty
@@ -7431,14 +7916,14 @@ it to leave the role as `group`. */
7431
7916
  it to leave the role as `group`. */
7432
7917
  slideRoleLabel?: (HelixHeadlessLightbox["slideRoleLabel"]) | undefined;
7433
7918
  /** The status text that says which item is shown, with `{index}`, `{count}`
7434
- and the item's `{label}` filled in.
7919
+ and the item's `{label}` filled in, the numbers written in the locale.
7435
7920
 
7436
7921
  Announced rather than only drawn, because the picture changing under a
7437
7922
  reader who cannot see it is otherwise silent. A consumer who has their own
7438
7923
  counter in the chrome can empty this and say it themselves. */
7439
7924
  "status-label"?: (HelixHeadlessLightbox["statusLabel"]) | undefined;
7440
7925
  /** The status text that says which item is shown, with `{index}`, `{count}`
7441
- and the item's `{label}` filled in.
7926
+ and the item's `{label}` filled in, the numbers written in the locale.
7442
7927
 
7443
7928
  Announced rather than only drawn, because the picture changing under a
7444
7929
  reader who cannot see it is otherwise silent. A consumer who has their own
@@ -7452,11 +7937,17 @@ counter in the chrome can empty this and say it themselves. */
7452
7937
  "zoom-out-label"?: (HelixHeadlessLightbox["zoomOutLabel"]) | undefined;
7453
7938
  /** The zoom-out control's accessible name. */
7454
7939
  zoomOutLabel?: (HelixHeadlessLightbox["zoomOutLabel"]) | undefined;
7455
- /** What the live region says once a reader has stopped zooming, with the
7456
- scale as a whole `{percent}` filled in. Empty it to say nothing. */
7940
+ /** What the live region says once a reader has stopped zooming. `{scale,
7941
+ number, percent}` writes the scale as a percentage the way the locale
7942
+ writes one, such as `150%`, or `150 %` in French. `{percent}` is the same
7943
+ scale as a whole number, for a sentence that places the sign itself. Empty
7944
+ it to say nothing. */
7457
7945
  "zoom-status-label"?: (HelixHeadlessLightbox["zoomStatusLabel"]) | undefined;
7458
- /** What the live region says once a reader has stopped zooming, with the
7459
- scale as a whole `{percent}` filled in. Empty it to say nothing. */
7946
+ /** What the live region says once a reader has stopped zooming. `{scale,
7947
+ number, percent}` writes the scale as a percentage the way the locale
7948
+ writes one, such as `150%`, or `150 %` in French. `{percent}` is the same
7949
+ scale as a whole number, for a sentence that places the sign itself. Empty
7950
+ it to say nothing. */
7460
7951
  zoomStatusLabel?: (HelixHeadlessLightbox["zoomStatusLabel"]) | undefined;
7461
7952
  /** The `value` of the current item.
7462
7953
 
@@ -7634,8 +8125,8 @@ words and is already written. */
7634
8125
  /** The locale the chart's own numbers are written in: its axis, its
7635
8126
  percentages and its totals, such as `de` for `1.240` and `32 %`.
7636
8127
 
7637
- Absent uses the runtime's own. The table's cells are shown as the table
7638
- writes them, whatever this says. */
8128
+ Absent reads the nearest `lang`, then the runtime's own. The table's
8129
+ cells are shown as the table writes them, whatever this says. */
7639
8130
  locale?: (HelixHeadlessLineChart["locale"]) | undefined;
7640
8131
  /** Where a reading the keys moved to stands among the readings, said after
7641
8132
  it. `{position}` and `{count}` are replaced with the numbers, written in
@@ -7699,6 +8190,14 @@ Written by a list with `selection-mode` on every row it holds, and unset
7699
8190
  otherwise, which is how a row knows it is a row of a grid. No attribute:
7700
8191
  it is coordination between elements, as `Tag.focusable` is. */
7701
8192
  focusable?: (HelixHeadlessListItem["focusable"]) | undefined;
8193
+ /** The name of the row's grip, written by a `reorderable` list from its
8194
+ `move-label`, and unset in a list that does not reorder, which draws no
8195
+ grip. No attribute: it is coordination between elements, as `focusable`
8196
+ is. */
8197
+ grip?: (HelixHeadlessListItem["grip"]) | undefined;
8198
+ /** Where the row stands in a move, written by a `reorderable` list: the row
8199
+ being moved, or the one the drop indicator is beside. Unset otherwise. */
8200
+ move?: (HelixHeadlessListItem["move"]) | undefined;
7702
8201
  /** Whether the row is selected, in a list that selects.
7703
8202
 
7704
8203
  Written by the list from its own `value`, and unset where nothing can be
@@ -7722,8 +8221,24 @@ export type HelixHeadlessListHelixActionElementEvent =
7722
8221
  /** `helix-before-change` event type */
7723
8222
  export type HelixHeadlessListHelixBeforeChangeElementEvent =
7724
8223
  HelixHeadlessListElementEvent<HelixBeforeChangeEvent>;
8224
+ /** `helix-before-reorder` event type */
8225
+ export type HelixHeadlessListHelixBeforeReorderElementEvent =
8226
+ HelixHeadlessListElementEvent<HelixBeforeReorderEvent>;
8227
+ /** `helix-reorder` event type */
8228
+ export type HelixHeadlessListHelixReorderElementEvent =
8229
+ HelixHeadlessListElementEvent<HelixReorderEvent>;
7725
8230
 
7726
8231
  export type HelixHeadlessListVueProps = {
8232
+ /** What screen readers hear when a held row is put back, or a move is
8233
+ refused, in a `reorderable` list. */
8234
+ "canceled-label"?: (HelixHeadlessList["canceledLabel"]) | undefined;
8235
+ /** What screen readers hear when a held row is put back, or a move is
8236
+ refused, in a `reorderable` list. */
8237
+ canceledLabel?: (HelixHeadlessList["canceledLabel"]) | undefined;
8238
+ /** What screen readers hear when a row is dropped, in a `reorderable` list. */
8239
+ "dropped-label"?: (HelixHeadlessList["droppedLabel"]) | undefined;
8240
+ /** What screen readers hear when a row is dropped, in a `reorderable` list. */
8241
+ droppedLabel?: (HelixHeadlessList["droppedLabel"]) | undefined;
7727
8242
  /** The kind of list, which follows from the content.
7728
8243
 
7729
8244
  On the headless tier because it is meaning rather than decoration, the same
@@ -7747,6 +8262,29 @@ has to survive with the stylesheet turned off.
7747
8262
  kind?: (HelixHeadlessList["kind"]) | undefined;
7748
8263
  /** The list's name, read by screen readers. */
7749
8264
  label?: (HelixHeadlessList["label"]) | undefined;
8265
+ /** What screen readers hear each time an arrow key moves a held row, in a
8266
+ `reorderable` list. `{name}` is the row's words, `{position}` the place it
8267
+ would go, counting from 1, and `{count}` the number of rows. */
8268
+ "moved-label"?: (HelixHeadlessList["movedLabel"]) | undefined;
8269
+ /** What screen readers hear each time an arrow key moves a held row, in a
8270
+ `reorderable` list. `{name}` is the row's words, `{position}` the place it
8271
+ would go, counting from 1, and `{count}` the number of rows. */
8272
+ movedLabel?: (HelixHeadlessList["movedLabel"]) | undefined;
8273
+ /** The name of each row's grip, in a `reorderable` list. `{name}` is
8274
+ replaced with the row's words. */
8275
+ "move-label"?: (HelixHeadlessList["moveLabel"]) | undefined;
8276
+ /** The name of each row's grip, in a `reorderable` list. `{name}` is
8277
+ replaced with the row's words. */
8278
+ moveLabel?: (HelixHeadlessList["moveLabel"]) | undefined;
8279
+ /** What screen readers hear when a key or a click picks up a row, in a
8280
+ `reorderable` list. `{name}` is the row's words. */
8281
+ "picked-up-label"?: (HelixHeadlessList["pickedUpLabel"]) | undefined;
8282
+ /** What screen readers hear when a key or a click picks up a row, in a
8283
+ `reorderable` list. `{name}` is the row's words. */
8284
+ pickedUpLabel?: (HelixHeadlessList["pickedUpLabel"]) | undefined;
8285
+ /** Lets you move rows by dragging a grip, or with the keys. The list moves no
8286
+ row itself: you move your data on `helix-reorder`. */
8287
+ reorderable?: (HelixHeadlessList["reorderable"]) | undefined;
7750
8288
  /** Numbers an ordered list downward, so the count falls row by row and ends at
7751
8289
  its last row, as `<ol reversed>` does. */
7752
8290
  reversed?: (HelixHeadlessList["reversed"]) | undefined;
@@ -7793,6 +8331,10 @@ export type HelixHeadlessListVueEvents = {
7793
8331
  "helix-action": HelixHeadlessListHelixActionElementEvent;
7794
8332
  /** Fired before a press changes which rows are selected, with the `value` it would leave. Cancelable. */
7795
8333
  "helix-before-change": HelixHeadlessListHelixBeforeChangeElementEvent;
8334
+ /** Fired when a row is dropped at a new place, in a `reorderable` list, with every row's value in the new order. Cancelable: cancel it to keep the row where it is. */
8335
+ "helix-before-reorder": HelixHeadlessListHelixBeforeReorderElementEvent;
8336
+ /** Fired after `helix-before-reorder` when nobody canceled it. Move your rows to the order in `keys`. Cancelable: cancel it to say the move did not happen. */
8337
+ "helix-reorder": HelixHeadlessListHelixReorderElementEvent;
7796
8338
  };
7797
8339
 
7798
8340
  /** `HelixHeadlessListbox` component event */
@@ -7803,20 +8345,30 @@ export type HelixHeadlessListboxElementEvent<E = Event> = TypedEvent<
7803
8345
  /** `helix-before-change` event type */
7804
8346
  export type HelixHeadlessListboxHelixBeforeChangeElementEvent =
7805
8347
  HelixHeadlessListboxElementEvent<HelixBeforeChangeEvent>;
8348
+ /** `helix-before-reorder` event type */
8349
+ export type HelixHeadlessListboxHelixBeforeReorderElementEvent =
8350
+ HelixHeadlessListboxElementEvent<HelixBeforeReorderEvent>;
7806
8351
  /** `helix-filter` event type */
7807
8352
  export type HelixHeadlessListboxHelixFilterElementEvent =
7808
8353
  HelixHeadlessListboxElementEvent<HelixFilterEvent>;
7809
8354
  /** `helix-load-more` event type */
7810
8355
  export type HelixHeadlessListboxHelixLoadMoreElementEvent =
7811
8356
  HelixHeadlessListboxElementEvent<HelixLoadMoreEvent>;
8357
+ /** `helix-reorder` event type */
8358
+ export type HelixHeadlessListboxHelixReorderElementEvent =
8359
+ HelixHeadlessListboxElementEvent<HelixReorderEvent>;
7812
8360
 
7813
8361
  export type HelixHeadlessListboxVueProps = {
7814
- /** What the browser may autofill in the text field, as a platform token.
8362
+ /** What a browser's autofill may choose, as a platform token such as
8363
+ `country` or `cc-exp-month`, as a native `<select>` takes it.
7815
8364
 
7816
- **Defaults to `off`, which is not the platform's default and is the
7817
- point.** The field filters a list rather than collecting a value, so a
7818
- browser offering to fill it with a saved address is competing for the same
7819
- keystrokes as the listbox. A consumer who wants autofill can still ask. */
8365
+ Set, the list draws a hidden native `<select>` with the same options for
8366
+ the browser to fill, as React Aria's `HiddenSelect` does, and a fill
8367
+ chooses the option. `off`, the default, draws none.
8368
+
8369
+ **The filter field is never filled.** It narrows the list rather than
8370
+ collecting a value, so a browser offering it a saved address competes
8371
+ with the reader for the same keystrokes: it is always `off`. */
7820
8372
  autocomplete?: (HelixHeadlessListbox["autocomplete"]) | undefined;
7821
8373
  /** The filter text the list starts with, when `filter` is not set. */
7822
8374
  "default-filter"?: (HelixHeadlessListbox["defaultFilter"]) | undefined;
@@ -7870,14 +8422,27 @@ act on the list the reader expects. */
7870
8422
  "filter-label"?: (HelixHeadlessListbox["filterLabel"]) | undefined;
7871
8423
  /** Placeholder text for the filter field. */
7872
8424
  filterLabel?: (HelixHeadlessListbox["filterLabel"]) | undefined;
8425
+ /** How the options are laid out, which the arrow keys follow: `stack`, one
8426
+ under another, or `grid`, in rows and columns, as React Aria's `ListBox`
8427
+ lays out cards or photos. With `grid`, Up and Down move within a column,
8428
+ and Left and Right along the list, mirrored right to left.
8429
+
8430
+ The columns are the stylesheet's: the styled tier draws them at
8431
+ `--listbox-column-min-inline-size` or wider, and a headless list lays out
8432
+ `::part(items)` as it likes, since the keys read where each option is
8433
+ drawn. A list of `items` stays a stack. Left out, the list is a stack,
8434
+ and the host carries no attribute for it. */
8435
+ layout?: (HelixHeadlessListbox["layout"]) | undefined;
7873
8436
  /** What the list says when its options could not be loaded, such as after a
7874
- request to a server fails. Empty is no error.
8437
+ request to a server fails. Empty, null or no attribute is no error, so
8438
+ removing the attribute clears it.
7875
8439
 
7876
8440
  Set, it shows under any options there are, in place of `empty-text` and
7877
8441
  `loading-text`, and a screen reader hears it. Clear it when you ask again. */
7878
8442
  "load-error"?: (HelixHeadlessListbox["loadError"]) | undefined;
7879
8443
  /** What the list says when its options could not be loaded, such as after a
7880
- request to a server fails. Empty is no error.
8444
+ request to a server fails. Empty, null or no attribute is no error, so
8445
+ removing the attribute clears it.
7881
8446
 
7882
8447
  Set, it shows under any options there are, in place of `empty-text` and
7883
8448
  `loading-text`, and a screen reader hears it. Clear it when you ask again. */
@@ -7889,7 +8454,10 @@ By default a single-choice list chooses as the arrows move, as a radio
7889
8454
  group does. Select and Time Input set this on the list in their panel, so
7890
8455
  a reader can move through the options before closing the panel on one. */
7891
8456
  manual?: (HelixHeadlessListbox["manual"]) | undefined;
7892
- /** Whether more than one option can be chosen. */
8457
+ /** Whether more than one option can be chosen.
8458
+
8459
+ A press then toggles the option pressed, and Shift with a press adds every
8460
+ option from the one last chosen to it, as React Aria's list does. */
7893
8461
  multiple?: (HelixHeadlessListbox["multiple"]) | undefined;
7894
8462
  /** The text shown when a filter hides every option of a list that has some.
7895
8463
 
@@ -7901,26 +8469,43 @@ matches what you typed" from "there is nothing here". */
7901
8469
  Absent, the list says `empty-text` in both cases. Set it to tell "nothing
7902
8470
  matches what you typed" from "there is nothing here". */
7903
8471
  noResultsText?: (HelixHeadlessListbox["noResultsText"]) | undefined;
7904
- /** What a screen reader hears when a filter leaves one option. `{count}` is
7905
- the count. */
8472
+ /** Lets a reader move options, once `@fusion.dev/helix/listbox/reorder` (or
8473
+ `@fusion.dev/helix-headless/listbox/reorder`) is imported: Alt with an
8474
+ arrow moves the highlighted option, and a pointer drags one. The list
8475
+ moves no option itself: you move your options, or your `items`, on
8476
+ `helix-reorder`. Without that import it does nothing, so a list that never
8477
+ moves options carries none of the code. */
8478
+ reorderable?: (HelixHeadlessListbox["reorderable"]) | undefined;
8479
+ /** What a screen reader hears when a filter leaves one option, where
8480
+ `results-label` should not say it. `{count}` is the count. */
7906
8481
  "result-label"?: (HelixHeadlessListbox["resultLabel"]) | undefined;
7907
- /** What a screen reader hears when a filter leaves one option. `{count}` is
7908
- the count. */
8482
+ /** What a screen reader hears when a filter leaves one option, where
8483
+ `results-label` should not say it. `{count}` is the count. */
7909
8484
  resultLabel?: (HelixHeadlessListbox["resultLabel"]) | undefined;
7910
- /** What a screen reader hears when a filter leaves any other number of
7911
- options. `{count}` is the count.
7912
-
7913
- **Two sentences, chosen by `Intl.PluralRules`**, which is Data Table's
7914
- pair: a language with more forms than two picks the one for its `one` and
7915
- writes the rest here. */
8485
+ /** What a screen reader hears when a filter narrows the list. `{count}` is
8486
+ how many options are left, written in the locale, and each language
8487
+ writes the forms it has: `{count, plural, one {# wynik} few {# wyniki}
8488
+ many {# wyników} other {# wyniku}}`. */
7916
8489
  "results-label"?: (HelixHeadlessListbox["resultsLabel"]) | undefined;
7917
- /** What a screen reader hears when a filter leaves any other number of
7918
- options. `{count}` is the count.
7919
-
7920
- **Two sentences, chosen by `Intl.PluralRules`**, which is Data Table's
7921
- pair: a language with more forms than two picks the one for its `one` and
7922
- writes the rest here. */
8490
+ /** What a screen reader hears when a filter narrows the list. `{count}` is
8491
+ how many options are left, written in the locale, and each language
8492
+ writes the forms it has: `{count, plural, one {# wynik} few {# wyniki}
8493
+ many {# wyników} other {# wyniku}}`. */
7923
8494
  resultsLabel?: (HelixHeadlessListbox["resultsLabel"]) | undefined;
8495
+ /** What VoiceOver hears as the highlight reaches a chosen option from the
8496
+ filter field, on Apple devices. `{name}` is the option's words. */
8497
+ "selected-label"?: (HelixHeadlessListbox["selectedLabel"]) | undefined;
8498
+ /** What VoiceOver hears as the highlight reaches a chosen option from the
8499
+ filter field, on Apple devices. `{name}` is the option's words. */
8500
+ selectedLabel?: (HelixHeadlessListbox["selectedLabel"]) | undefined;
8501
+ /** The message reported when the field is required and no option is chosen.
8502
+ Absent, or empty, is this sentence, or the words registered for the page's
8503
+ locale. */
8504
+ "value-missing-message"?: (HelixHeadlessListbox["valueMissingMessage"]) | undefined;
8505
+ /** The message reported when the field is required and no option is chosen.
8506
+ Absent, or empty, is this sentence, or the words registered for the page's
8507
+ locale. */
8508
+ valueMissingMessage?: (HelixHeadlessListbox["valueMissingMessage"]) | undefined;
7924
8509
  /** Whether the rows are still loading.
7925
8510
 
7926
8511
  Reflected, because a stylesheet needs it: the rows that are already there
@@ -7958,24 +8543,6 @@ browser's message. */
7958
8543
  label?: (HelixHeadlessListbox["label"]) | undefined;
7959
8544
  /** Whether the field needs a value before the form can submit. */
7960
8545
  required?: (HelixHeadlessListbox["required"]) | undefined;
7961
- /** The message shown when the field is required and empty.
7962
-
7963
- **Absent, or empty, is the control's own sentence**, "Choose one to continue." on a
7964
- set and the browser's own on a text field, which the browser writes in
7965
- the reader's language. Every other word a control speaks is a property,
7966
- and this one was the English a form in another language still spoke in
7967
- the bubble it raises on submit: `feedback` replaces the message under
7968
- the field and does not reach that one. */
7969
- "value-missing-message"?: (HelixHeadlessListbox["valueMissingMessage"]) | undefined;
7970
- /** The message shown when the field is required and empty.
7971
-
7972
- **Absent, or empty, is the control's own sentence**, "Choose one to continue." on a
7973
- set and the browser's own on a text field, which the browser writes in
7974
- the reader's language. Every other word a control speaks is a property,
7975
- and this one was the English a form in another language still spoke in
7976
- the bubble it raises on submit: `feedback` replaces the message under
7977
- the field and does not reach that one. */
7978
- valueMissingMessage?: (HelixHeadlessListbox["valueMissingMessage"]) | undefined;
7979
8546
  /** Whether the control is disabled and cannot be used.
7980
8547
 
7981
8548
  Reflected, because the styled tier selects on it, and mirrored to
@@ -8002,6 +8569,23 @@ imperatively later, and nothing is hydrating by then.
8002
8569
 
8003
8570
  Here rather than on each control. */
8004
8571
  name?: (HelixHeadlessListbox["name"]) | undefined;
8572
+ /** The options as data, for a list too long to draw whole: each a value,
8573
+ which is also its words, or a record with a `value`, a `label` and
8574
+ `disabled`. Set, the list draws only the options in sight, and the ones
8575
+ you write as children are not read.
8576
+
8577
+ **Every option is still reachable.** The keyboard, the typeahead, the
8578
+ filter and the value work over the whole set, and the option the keyboard
8579
+ is on is drawn wherever it is, so a screen reader is told about it. Each
8580
+ drawn option says its place in the set (`aria-posinset`, `aria-setsize`).
8581
+ React Aria virtualizes a `ListBox` with its `Virtualizer`; this is core's
8582
+ `VirtualizeController`.
8583
+
8584
+ **The list needs a height to scroll in**: the styled tier's
8585
+ `--listbox-max-block-size`, or a `max-block-size` on `::part(items)` in the
8586
+ headless tier. Import the Option family as well, whose elements are drawn.
8587
+ A server sends the list empty, and the options are drawn once it hydrates. */
8588
+ items?: (HelixHeadlessListbox["items"]) | undefined;
8005
8589
  /** Which option is chosen, as an index, or `-1` where none is.
8006
8590
 
8007
8591
  `<select>`'s own pair, and this control is what stands in for one. The
@@ -8020,10 +8604,14 @@ export type HelixHeadlessListboxVueEvents = {
8020
8604
  change: HelixHeadlessListboxElementEvent;
8021
8605
  /** Fired when the value is about to change, and cancelable. */
8022
8606
  "helix-before-change": HelixHeadlessListboxHelixBeforeChangeElementEvent;
8607
+ /** Fired when an option is dropped at a new place, in a `reorderable` list with `@fusion.dev/helix/listbox/reorder` imported, with every value in the new order. Cancelable: cancel it to keep the option where it is. */
8608
+ "helix-before-reorder": HelixHeadlessListboxHelixBeforeReorderElementEvent;
8023
8609
  /** Fired before the list is filtered, and cancelable. */
8024
8610
  "helix-filter": HelixHeadlessListboxHelixFilterElementEvent;
8025
8611
  /** Fired once the list is scrolled within a screen of its end, once for each number of options, and not while `loading` is set. Add the next page of options and set `loading` while you fetch it. */
8026
8612
  "helix-load-more": HelixHeadlessListboxHelixLoadMoreElementEvent;
8613
+ /** Fired after `helix-before-reorder` when nobody canceled it. Move your options, or your `items`, to the order in `keys`. Cancelable: cancel it to say the move did not happen. */
8614
+ "helix-reorder": HelixHeadlessListboxHelixReorderElementEvent;
8027
8615
  /** Fired after the value changes. */
8028
8616
  input: HelixHeadlessListboxElementEvent;
8029
8617
  };
@@ -8202,9 +8790,15 @@ export type HelixHeadlessMapMarkerVueProps = {
8202
8790
  /** Marks the place as passed, such as a stop already visited. The marker is
8203
8791
  drawn muted, and its name is followed by `passed-label`. */
8204
8792
  passed?: (HelixHeadlessMapMarker["passed"]) | undefined;
8205
- /** The word added after a passed place's name. Defaults to "passed". */
8793
+ /** What a passed place is called. `{label}` is its name.
8794
+
8795
+ A word without `{label}`, such as `visited`, is written after the name
8796
+ with a comma, as before the sentence held the name. */
8206
8797
  "passed-label"?: (HelixHeadlessMapMarker["passedLabel"]) | undefined;
8207
- /** The word added after a passed place's name. Defaults to "passed". */
8798
+ /** What a passed place is called. `{label}` is its name.
8799
+
8800
+ A word without `{label}`, such as `visited`, is written after the name
8801
+ with a comma, as before the sentence held the name. */
8208
8802
  passedLabel?: (HelixHeadlessMapMarker["passedLabel"]) | undefined;
8209
8803
  };
8210
8804
 
@@ -8393,16 +8987,32 @@ export type HelixHeadlessMapHelixToggleElementEvent =
8393
8987
  HelixHeadlessMapElementEvent<HelixToggleEvent>;
8394
8988
 
8395
8989
  export type HelixHeadlessMapVueProps = {
8990
+ /** The hint shown when the map, waiting to be pressed with
8991
+ `gestures="activate"`, is scrolled or swiped over. */
8992
+ "activate-hint-label"?: (HelixHeadlessMap["activateHintLabel"]) | undefined;
8993
+ /** The hint shown when the map, waiting to be pressed with
8994
+ `gestures="activate"`, is scrolled or swiped over. */
8995
+ activateHintLabel?: (HelixHeadlessMap["activateHintLabel"]) | undefined;
8396
8996
  /** The map's rotation, in degrees clockwise from north. `connectMap` keeps it
8397
8997
  current, and the Face north button's needle turns with it. */
8398
8998
  bearing?: (HelixHeadlessMap["bearing"]) | undefined;
8399
8999
  /** Combines markers that would overlap into one count. Counts split apart as
8400
9000
  the map zooms in, and pressing one zooms in to its places. */
8401
9001
  cluster?: (HelixHeadlessMap["cluster"]) | undefined;
9002
+ /** The name of the group of controls, read by screen readers, which names
9003
+ what the controls drive rather than the mechanism. */
9004
+ "controls-label"?: (HelixHeadlessMap["controlsLabel"]) | undefined;
9005
+ /** The name of the group of controls, read by screen readers, which names
9006
+ what the controls drive rather than the mechanism. */
9007
+ controlsLabel?: (HelixHeadlessMap["controlsLabel"]) | undefined;
8402
9008
  /** The Face north button's label. */
8403
9009
  "face-north-label"?: (HelixHeadlessMap["faceNorthLabel"]) | undefined;
8404
9010
  /** The Face north button's label. */
8405
9011
  faceNorthLabel?: (HelixHeadlessMap["faceNorthLabel"]) | undefined;
9012
+ /** The map's name where `label` is empty and the host has no `aria-label`. */
9013
+ "fallback-label"?: (HelixHeadlessMap["fallbackLabel"]) | undefined;
9014
+ /** The map's name where `label` is empty and the host has no `aria-label`. */
9015
+ fallbackLabel?: (HelixHeadlessMap["fallbackLabel"]) | undefined;
8406
9016
  /** What screen readers hear when the map is tilted back to looking straight down. */
8407
9017
  "flat-label"?: (HelixHeadlessMap["flatLabel"]) | undefined;
8408
9018
  /** What screen readers hear when the map is tilted back to looking straight down. */
@@ -8473,24 +9083,44 @@ above `0`. */
8473
9083
  /** The Standard map type's name. */
8474
9084
  standardLabel?: (HelixHeadlessMap["standardLabel"]) | undefined;
8475
9085
  /** What screen readers hear when the map is tilted. `{degrees}` is the tilt
8476
- from looking straight down. */
9086
+ from looking straight down, written in the locale, and each language
9087
+ writes the forms it has. */
8477
9088
  "tilted-label"?: (HelixHeadlessMap["tiltedLabel"]) | undefined;
8478
9089
  /** What screen readers hear when the map is tilted. `{degrees}` is the tilt
8479
- from looking straight down. */
9090
+ from looking straight down, written in the locale, and each language
9091
+ writes the forms it has. */
8480
9092
  tiltedLabel?: (HelixHeadlessMap["tiltedLabel"]) | undefined;
8481
9093
  /** The 3D button's label. */
8482
9094
  "tilt-label"?: (HelixHeadlessMap["tiltLabel"]) | undefined;
8483
9095
  /** The 3D button's label. */
8484
9096
  tiltLabel?: (HelixHeadlessMap["tiltLabel"]) | undefined;
8485
9097
  /** What screen readers hear when the map is turned. `{degrees}` is the way the
8486
- top of the map faces, clockwise from north. */
9098
+ top of the map faces, clockwise from north, written in the locale, and
9099
+ each language writes the forms it has. */
8487
9100
  "turned-label"?: (HelixHeadlessMap["turnedLabel"]) | undefined;
8488
9101
  /** What screen readers hear when the map is turned. `{degrees}` is the way the
8489
- top of the map faces, clockwise from north. */
9102
+ top of the map faces, clockwise from north, written in the locale, and
9103
+ each language writes the forms it has. */
8490
9104
  turnedLabel?: (HelixHeadlessMap["turnedLabel"]) | undefined;
8491
- /** What screen readers hear after a zoom. `{level}` is the zoom level. */
9105
+ /** The hint shown when one finger swipes over the map with `gestures="cooperative"`. */
9106
+ "two-finger-hint-label"?: (HelixHeadlessMap["twoFingerHintLabel"]) | undefined;
9107
+ /** The hint shown when one finger swipes over the map with `gestures="cooperative"`. */
9108
+ twoFingerHintLabel?: (HelixHeadlessMap["twoFingerHintLabel"]) | undefined;
9109
+ /** The line shown while the map, with `gestures="activate"`, has the gestures. */
9110
+ "using-label"?: (HelixHeadlessMap["usingLabel"]) | undefined;
9111
+ /** The line shown while the map, with `gestures="activate"`, has the gestures. */
9112
+ usingLabel?: (HelixHeadlessMap["usingLabel"]) | undefined;
9113
+ /** The hint shown when the wheel scrolls past the map with
9114
+ `gestures="cooperative"`. `{key}` is ⌘ on a Mac and Ctrl elsewhere. */
9115
+ "wheel-hint-label"?: (HelixHeadlessMap["wheelHintLabel"]) | undefined;
9116
+ /** The hint shown when the wheel scrolls past the map with
9117
+ `gestures="cooperative"`. `{key}` is ⌘ on a Mac and Ctrl elsewhere. */
9118
+ wheelHintLabel?: (HelixHeadlessMap["wheelHintLabel"]) | undefined;
9119
+ /** What screen readers hear after a zoom. `{level}` is the zoom level,
9120
+ written in the locale. */
8492
9121
  "zoomed-label"?: (HelixHeadlessMap["zoomedLabel"]) | undefined;
8493
- /** What screen readers hear after a zoom. `{level}` is the zoom level. */
9122
+ /** What screen readers hear after a zoom. `{level}` is the zoom level,
9123
+ written in the locale. */
8494
9124
  zoomedLabel?: (HelixHeadlessMap["zoomedLabel"]) | undefined;
8495
9125
  /** How far the map is zoomed, in its renderer's levels. `connectMap` keeps it
8496
9126
  current, and the map says it after a zoom. */
@@ -8498,12 +9128,6 @@ current, and the map says it after a zoom. */
8498
9128
  /** How far the map is zoomed, in its renderer's levels. `connectMap` keeps it
8499
9129
  current, and the map says it after a zoom. */
8500
9130
  zoomLevel?: (HelixHeadlessMap["zoomLevel"]) | undefined;
8501
- /** The hint shown when a surface waiting to be pressed is scrolled or
8502
- swiped over, with `gestures="activate"`. Absent is the family's own. */
8503
- "activate-hint-label"?: (HelixHeadlessMap["activateHintLabel"]) | undefined;
8504
- /** The hint shown when a surface waiting to be pressed is scrolled or
8505
- swiped over, with `gestures="activate"`. Absent is the family's own. */
8506
- activateHintLabel?: (HelixHeadlessMap["activateHintLabel"]) | undefined;
8507
9131
  /** Which controls to show, as a list such as `pan zoom fullscreen`, or
8508
9132
  `none`. A family can add words of its own.
8509
9133
 
@@ -8526,20 +9150,6 @@ of the frame. The
8526
9150
  stylesheet lays the cluster out by which buttons are in it rather than by
8527
9151
  this attribute, so the two defaults need no rule each. */
8528
9152
  controls?: (HelixHeadlessMap["controls"]) | undefined;
8529
- /** The name of the group of controls, read by screen readers.
8530
-
8531
- Absent is the family's own name for it, "Map controls" or "Board
8532
- controls", which names what the controls drive rather than the
8533
- mechanism. Written here to say it in another language, which every other
8534
- string this surface speaks already allowed and this one did not. */
8535
- "controls-label"?: (HelixHeadlessMap["controlsLabel"]) | undefined;
8536
- /** The name of the group of controls, read by screen readers.
8537
-
8538
- Absent is the family's own name for it, "Map controls" or "Board
8539
- controls", which names what the controls drive rather than the
8540
- mechanism. Written here to say it in another language, which every other
8541
- string this surface speaks already allowed and this one did not. */
8542
- controlsLabel?: (HelixHeadlessMap["controlsLabel"]) | undefined;
8543
9153
  /** Which corner the controls sit in.
8544
9154
 
8545
9155
  **Configurable because there is no safe default**, which is a collision
@@ -8642,26 +9252,6 @@ at any zoom, and a consumer who wants their own units multiplies by them. */
8642
9252
  "pan-up-label"?: (HelixHeadlessMap["panUpLabel"]) | undefined;
8643
9253
  /** The pan up button's label. */
8644
9254
  panUpLabel?: (HelixHeadlessMap["panUpLabel"]) | undefined;
8645
- /** The hint shown when one finger swipes over a surface with
8646
- `gestures="cooperative"`. Absent is the family's own. */
8647
- "two-finger-hint-label"?: (HelixHeadlessMap["twoFingerHintLabel"]) | undefined;
8648
- /** The hint shown when one finger swipes over a surface with
8649
- `gestures="cooperative"`. Absent is the family's own. */
8650
- twoFingerHintLabel?: (HelixHeadlessMap["twoFingerHintLabel"]) | undefined;
8651
- /** The line shown while a surface with `gestures="activate"` has the
8652
- gestures. Absent is the family's own. */
8653
- "using-label"?: (HelixHeadlessMap["usingLabel"]) | undefined;
8654
- /** The line shown while a surface with `gestures="activate"` has the
8655
- gestures. Absent is the family's own. */
8656
- usingLabel?: (HelixHeadlessMap["usingLabel"]) | undefined;
8657
- /** The hint shown when the wheel scrolls past a surface with
8658
- `gestures="cooperative"`, with `{key}`, which is ⌘ on a Mac and Ctrl
8659
- elsewhere. Absent is the family's own. */
8660
- "wheel-hint-label"?: (HelixHeadlessMap["wheelHintLabel"]) | undefined;
8661
- /** The hint shown when the wheel scrolls past a surface with
8662
- `gestures="cooperative"`, with `{key}`, which is ⌘ on a Mac and Ctrl
8663
- elsewhere. Absent is the family's own. */
8664
- wheelHintLabel?: (HelixHeadlessMap["wheelHintLabel"]) | undefined;
8665
9255
  /** The zoom in button's label. */
8666
9256
  "zoom-in-label"?: (HelixHeadlessMap["zoomInLabel"]) | undefined;
8667
9257
  /** The zoom in button's label. */
@@ -9124,12 +9714,16 @@ no reader. */
9124
9714
  /** The words each band is said with under `live`, by its name, written as
9125
9715
  JSON in the attribute: `band-labels='{"poor":"Almost full"}'`.
9126
9716
 
9127
- A band left out keeps its default: "Good", "Fair" or "Poor". */
9717
+ A band left out keeps its default: "Good", "Fair" or "Poor". Reading the
9718
+ property gives every band's words, yours over the registry's over the
9719
+ English. */
9128
9720
  "band-labels"?: (HelixHeadlessMeter["bandLabels"]) | undefined;
9129
9721
  /** The words each band is said with under `live`, by its name, written as
9130
9722
  JSON in the attribute: `band-labels='{"poor":"Almost full"}'`.
9131
9723
 
9132
- A band left out keeps its default: "Good", "Fair" or "Poor". */
9724
+ A band left out keeps its default: "Good", "Fair" or "Poor". Reading the
9725
+ property gives every band's words, yours over the registry's over the
9726
+ English. */
9133
9727
  bandLabels?: (HelixHeadlessMeter["bandLabels"]) | undefined;
9134
9728
  /** `Intl.NumberFormat` options the reading is written with, as React Aria's
9135
9729
  Meter and ProgressBar take them: a unit, a currency, or a number of
@@ -9173,9 +9767,17 @@ For a meter whose value changes while it is on screen. Off by default,
9173
9767
  because a meter that reads a fixed level has nothing new to say. A meter
9174
9768
  with no bands says nothing. */
9175
9769
  live?: (HelixHeadlessMeter["live"]) | undefined;
9176
- /** The locale the percentage is written in, such as `fr` for `72 %`.
9177
-
9178
- Absent uses the runtime's own. */
9770
+ /** What `live` says as the reading moves into another band. `{reading}` is
9771
+ the reading as it is shown, and `{band}` the band's words from
9772
+ `band-labels`. */
9773
+ "live-label"?: (HelixHeadlessMeter["liveLabel"]) | undefined;
9774
+ /** What `live` says as the reading moves into another band. `{reading}` is
9775
+ the reading as it is shown, and `{band}` the band's words from
9776
+ `band-labels`. */
9777
+ liveLabel?: (HelixHeadlessMeter["liveLabel"]) | undefined;
9778
+ /** The locale the words and the percentage are in, such as `fr` for `72 %`.
9779
+
9780
+ Absent reads the nearest `lang`, then the runtime's own. */
9179
9781
  locale?: (HelixHeadlessMeter["locale"]) | undefined;
9180
9782
  /** Top of the low band.
9181
9783
 
@@ -9384,14 +9986,22 @@ its place. Translate it with the rest of your interface. */
9384
9986
  `attribute` is spelled out because Lit lowercases a property name to
9385
9987
  derive one rather than dash-casing it, so this would otherwise be
9386
9988
  reachable only as `dismisslabel`, which nobody would guess and no linter
9387
- would catch. */
9989
+ would catch.
9990
+
9991
+ A word property: register it for a locale under the host's key. A family
9992
+ that names the control otherwise, such as Tag's `Remove {label}`,
9993
+ declares its own English with `@words` above the override. */
9388
9994
  "dismiss-label"?: (HelixHeadlessNotification["dismissLabel"]) | undefined;
9389
9995
  /** The dismiss control's label, read by screen readers.
9390
9996
 
9391
9997
  `attribute` is spelled out because Lit lowercases a property name to
9392
9998
  derive one rather than dash-casing it, so this would otherwise be
9393
9999
  reachable only as `dismisslabel`, which nobody would guess and no linter
9394
- would catch. */
10000
+ would catch.
10001
+
10002
+ A word property: register it for a locale under the host's key. A family
10003
+ that names the control otherwise, such as Tag's `Remove {label}`,
10004
+ declares its own English with `@words` above the override. */
9395
10005
  dismissLabel?: (HelixHeadlessNotification["dismissLabel"]) | undefined;
9396
10006
  };
9397
10007
 
@@ -9418,8 +10028,26 @@ export type HelixHeadlessNotificationsHelixReadElementEvent =
9418
10028
  HelixHeadlessNotificationsElementEvent<HelixReadEvent>;
9419
10029
 
9420
10030
  export type HelixHeadlessNotificationsVueProps = {
10031
+ /** The region's name where `label` is empty. */
10032
+ "fallback-label"?: (HelixHeadlessNotifications["fallbackLabel"]) | undefined;
10033
+ /** The region's name where `label` is empty. */
10034
+ fallbackLabel?: (HelixHeadlessNotifications["fallbackLabel"]) | undefined;
9421
10035
  /** The feed's name, read by screen readers. */
9422
10036
  label?: (HelixHeadlessNotifications["label"]) | undefined;
10037
+ /** What the feed says when a page of it could not be loaded, such as after a
10038
+ request to a server fails. Empty, null or no attribute is no error, so
10039
+ removing the attribute clears it.
10040
+
10041
+ Set, it shows under the rows there are, in place of `empty-text` and
10042
+ `loading-text`, and a screen reader hears it. Clear it when you ask again. */
10043
+ "load-error"?: (HelixHeadlessNotifications["loadError"]) | undefined;
10044
+ /** What the feed says when a page of it could not be loaded, such as after a
10045
+ request to a server fails. Empty, null or no attribute is no error, so
10046
+ removing the attribute clears it.
10047
+
10048
+ Set, it shows under the rows there are, in place of `empty-text` and
10049
+ `loading-text`, and a screen reader hears it. Clear it when you ask again. */
10050
+ loadError?: (HelixHeadlessNotifications["loadError"]) | undefined;
9423
10051
  /** Whether to draw a button after the list that asks for the next page, by
9424
10052
  sending `helix-load-more`. Take it off once there is nothing more. */
9425
10053
  "load-more"?: (HelixHeadlessNotifications["loadMore"]) | undefined;
@@ -9492,7 +10120,8 @@ number.
9492
10120
  **Every sentence a control raises in the browser's bubble is a property**,
9493
10121
  named for the validity flag it reports, so a form in another language
9494
10122
  speaks it: `feedback` replaces the message under the field and does not
9495
- reach the bubble. Absent is the control's own sentence, in English. */
10123
+ reach the bubble. Unset is the sentence registered for the page's
10124
+ language, then the English. */
9496
10125
  "bad-input-message"?: (HelixHeadlessNumberInput["badInputMessage"]) | undefined;
9497
10126
  /** The message the browser shows when the field holds something that is not a
9498
10127
  number.
@@ -9500,7 +10129,8 @@ number.
9500
10129
  **Every sentence a control raises in the browser's bubble is a property**,
9501
10130
  named for the validity flag it reports, so a form in another language
9502
10131
  speaks it: `feedback` replaces the message under the field and does not
9503
- reach the bubble. Absent is the control's own sentence, in English. */
10132
+ reach the bubble. Unset is the sentence registered for the page's
10133
+ language, then the English. */
9504
10134
  badInputMessage?: (HelixHeadlessNumberInput["badInputMessage"]) | undefined;
9505
10135
  /** The name of the step down button, read by screen readers. */
9506
10136
  "decrement-label"?: (HelixHeadlessNumberInput["decrementLabel"]) | undefined;
@@ -9558,16 +10188,16 @@ Absent has no floor. */
9558
10188
  Not a label: it goes when typing starts. */
9559
10189
  placeholder?: (HelixHeadlessNumberInput["placeholder"]) | undefined;
9560
10190
  /** The message the browser shows when the number is above `max`, with `{max}`
9561
- filled in. */
10191
+ filled in, written in the locale. */
9562
10192
  "range-overflow-message"?: (HelixHeadlessNumberInput["rangeOverflowMessage"]) | undefined;
9563
10193
  /** The message the browser shows when the number is above `max`, with `{max}`
9564
- filled in. */
10194
+ filled in, written in the locale. */
9565
10195
  rangeOverflowMessage?: (HelixHeadlessNumberInput["rangeOverflowMessage"]) | undefined;
9566
10196
  /** The message the browser shows when the number is below `min`, with `{min}`
9567
- filled in. */
10197
+ filled in, written in the locale. */
9568
10198
  "range-underflow-message"?: (HelixHeadlessNumberInput["rangeUnderflowMessage"]) | undefined;
9569
10199
  /** The message the browser shows when the number is below `min`, with `{min}`
9570
- filled in. */
10200
+ filled in, written in the locale. */
9571
10201
  rangeUnderflowMessage?: (HelixHeadlessNumberInput["rangeUnderflowMessage"]) | undefined;
9572
10202
  /** Prevents editing. The value is still submitted with the form. */
9573
10203
  readonly?: (HelixHeadlessNumberInput["readOnly"]) | undefined;
@@ -9592,10 +10222,12 @@ showing dollars keeps the cents typed into it. Without `format-options`
9592
10222
  the grid is whole numbers, as in a native number field. */
9593
10223
  step?: (HelixHeadlessNumberInput["step"]) | undefined;
9594
10224
  /** The message the browser shows when the number is off the step grid, with
9595
- `{below}` and `{above}` filled in with the nearest valid values. */
10225
+ `{below}` and `{above}` filled in with the nearest valid values, written in
10226
+ the locale. */
9596
10227
  "step-mismatch-message"?: (HelixHeadlessNumberInput["stepMismatchMessage"]) | undefined;
9597
10228
  /** The message the browser shows when the number is off the step grid, with
9598
- `{below}` and `{above}` filled in with the nearest valid values. */
10229
+ `{below}` and `{above}` filled in with the nearest valid values, written in
10230
+ the locale. */
9599
10231
  stepMismatchMessage?: (HelixHeadlessNumberInput["stepMismatchMessage"]) | undefined;
9600
10232
  /** What a screen reader says for the value, with `{value}` filled in, such as
9601
10233
  `{value} kilograms`.
@@ -9644,18 +10276,22 @@ browser's message. */
9644
10276
  required?: (HelixHeadlessNumberInput["required"]) | undefined;
9645
10277
  /** The message shown when the field is required and empty.
9646
10278
 
9647
- **Absent, or empty, is the control's own sentence**, "Choose one to continue." on a
9648
- set and the browser's own on a text field, which the browser writes in
9649
- the reader's language. Every other word a control speaks is a property,
10279
+ **Absent, or empty, is the control's own sentence**, "Choose one to
10280
+ continue." on a set and the browser's own on a text field, which the
10281
+ browser writes in the reader's language. A family with a sentence of its
10282
+ own declares it as this property's English, a word property a page
10283
+ registers for its locale under the family's key. Every other word a control speaks is a property,
9650
10284
  and this one was the English a form in another language still spoke in
9651
10285
  the bubble it raises on submit: `feedback` replaces the message under
9652
10286
  the field and does not reach that one. */
9653
10287
  "value-missing-message"?: (HelixHeadlessNumberInput["valueMissingMessage"]) | undefined;
9654
10288
  /** The message shown when the field is required and empty.
9655
10289
 
9656
- **Absent, or empty, is the control's own sentence**, "Choose one to continue." on a
9657
- set and the browser's own on a text field, which the browser writes in
9658
- the reader's language. Every other word a control speaks is a property,
10290
+ **Absent, or empty, is the control's own sentence**, "Choose one to
10291
+ continue." on a set and the browser's own on a text field, which the
10292
+ browser writes in the reader's language. A family with a sentence of its
10293
+ own declares it as this property's English, a word property a page
10294
+ registers for its locale under the family's key. Every other word a control speaks is a property,
9659
10295
  and this one was the English a form in another language still spoke in
9660
10296
  the bubble it raises on submit: `feedback` replaces the message under
9661
10297
  the field and does not reach that one. */
@@ -9787,21 +10423,33 @@ Read once the document exists, and again whenever this changes. Text that
9787
10423
  does not parse leaves the inspector empty rather than throwing, since a
9788
10424
  page's markup should not take the page down over a comma. */
9789
10425
  for?: (HelixHeadlessObjectInspector["for"]) | undefined;
9790
- /** How an array of one entry counts it. `{count}` is replaced with the count. */
10426
+ /** How an array of one entry counts it, where `items-label` should not say
10427
+ it. `{count}` is the count. */
9791
10428
  "item-label"?: (HelixHeadlessObjectInspector["itemLabel"]) | undefined;
9792
- /** How an array of one entry counts it. `{count}` is replaced with the count. */
10429
+ /** How an array of one entry counts it, where `items-label` should not say
10430
+ it. `{count}` is the count. */
9793
10431
  itemLabel?: (HelixHeadlessObjectInspector["itemLabel"]) | undefined;
9794
- /** How an array of any other number of entries counts them. `{count}` is replaced with the count. */
10432
+ /** How an array counts its entries. `{count}` is the count, written in the
10433
+ locale, and each language writes the forms it has: `{count, plural, one
10434
+ {# element} few {# elementy} many {# elementów} other {# elementu}}`. */
9795
10435
  "items-label"?: (HelixHeadlessObjectInspector["itemsLabel"]) | undefined;
9796
- /** How an array of any other number of entries counts them. `{count}` is replaced with the count. */
10436
+ /** How an array counts its entries. `{count}` is the count, written in the
10437
+ locale, and each language writes the forms it has: `{count, plural, one
10438
+ {# element} few {# elementy} many {# elementów} other {# elementu}}`. */
9797
10439
  itemsLabel?: (HelixHeadlessObjectInspector["itemsLabel"]) | undefined;
9798
- /** How an object of one key counts it. `{count}` is replaced with the count. */
10440
+ /** How an object of one key counts it, where `keys-label` should not say it.
10441
+ `{count}` is the count. */
9799
10442
  "key-label"?: (HelixHeadlessObjectInspector["keyLabel"]) | undefined;
9800
- /** How an object of one key counts it. `{count}` is replaced with the count. */
10443
+ /** How an object of one key counts it, where `keys-label` should not say it.
10444
+ `{count}` is the count. */
9801
10445
  keyLabel?: (HelixHeadlessObjectInspector["keyLabel"]) | undefined;
9802
- /** How an object of any other number of keys counts them. `{count}` is replaced with the count. */
10446
+ /** How an object counts its keys. `{count}` is the count, written in the
10447
+ locale, and each language writes the forms it has: `{count, plural, one
10448
+ {# klucz} few {# klucze} many {# kluczy} other {# klucza}}`. */
9803
10449
  "keys-label"?: (HelixHeadlessObjectInspector["keysLabel"]) | undefined;
9804
- /** How an object of any other number of keys counts them. `{count}` is replaced with the count. */
10450
+ /** How an object counts its keys. `{count}` is the count, written in the
10451
+ locale, and each language writes the forms it has: `{count, plural, one
10452
+ {# klucz} few {# klucze} many {# kluczy} other {# klucza}}`. */
9805
10453
  keysLabel?: (HelixHeadlessObjectInspector["keysLabel"]) | undefined;
9806
10454
  /** Accessible name for the tree, and the text of the header where there is one. */
9807
10455
  label?: (HelixHeadlessObjectInspector["label"]) | undefined;
@@ -9829,15 +10477,21 @@ who set the property. This button is positioned out of the flow and takes no
9829
10477
  room, so nothing selects on it, and reflection exists so that a selector can
9830
10478
  reach a value. */
9831
10479
  noCopy?: (HelixHeadlessObjectInspector["noCopy"]) | undefined;
9832
- /** What a screen reader hears when a filter matches one entry. `{count}` is the count. */
10480
+ /** What a screen reader hears when a filter matches one entry, where
10481
+ `results-label` should not say it. `{count}` is the count. */
9833
10482
  "result-label"?: (HelixHeadlessObjectInspector["resultLabel"]) | undefined;
9834
- /** What a screen reader hears when a filter matches one entry. `{count}` is the count. */
10483
+ /** What a screen reader hears when a filter matches one entry, where
10484
+ `results-label` should not say it. `{count}` is the count. */
9835
10485
  resultLabel?: (HelixHeadlessObjectInspector["resultLabel"]) | undefined;
9836
- /** What a screen reader hears when a filter matches any other number of
9837
- entries. `{count}` is the count. The two are chosen by `Intl.PluralRules`. */
10486
+ /** What a screen reader hears when a filter matches entries. `{count}` is
10487
+ how many, written in the locale, and each language writes the forms it
10488
+ has: `{count, plural, one {# wynik} few {# wyniki} many {# wyników}
10489
+ other {# wyniku}}`. */
9838
10490
  "results-label"?: (HelixHeadlessObjectInspector["resultsLabel"]) | undefined;
9839
- /** What a screen reader hears when a filter matches any other number of
9840
- entries. `{count}` is the count. The two are chosen by `Intl.PluralRules`. */
10491
+ /** What a screen reader hears when a filter matches entries. `{count}` is
10492
+ how many, written in the locale, and each language writes the forms it
10493
+ has: `{count, plural, one {# wynik} few {# wyniki} many {# wyników}
10494
+ other {# wyniku}}`. */
9841
10495
  resultsLabel?: (HelixHeadlessObjectInspector["resultsLabel"]) | undefined;
9842
10496
  /** The tree's accessible name when `label` is empty and the host names it
9843
10497
  with neither `aria-label` nor `aria-labelledby`. */
@@ -10176,7 +10830,8 @@ one, and the back button works without the consumer wiring anything. */
10176
10830
  "last-label"?: (HelixHeadlessPagination["lastLabel"]) | undefined;
10177
10831
  /** Accessible name for the control that jumps to the last page. */
10178
10832
  lastLabel?: (HelixHeadlessPagination["lastLabel"]) | undefined;
10179
- /** Locale for the page numbers. Absent uses the runtime's own.
10833
+ /** The locale the words and the page numbers are in, as a BCP 47 tag such as
10834
+ `de`. Empty reads the nearest `lang`, then the browser's language.
10180
10835
 
10181
10836
  The same property the calendar takes, doing the same job one layer down:
10182
10837
  the templates make the *words* the consumer's, and this makes the *numbers*
@@ -10290,9 +10945,8 @@ export type HelixHeadlessPaginationSizeVueProps = {
10290
10945
  defaultValue?: (HelixHeadlessPaginationSize["defaultValue"]) | undefined;
10291
10946
  /** The label beside the control. */
10292
10947
  label?: (HelixHeadlessPaginationSize["label"]) | undefined;
10293
- /** Locale for the numbers.
10294
-
10295
- Absent uses the runtime's own. */
10948
+ /** The locale the words and the numbers are in, as a BCP 47 tag such as
10949
+ `de`. Empty reads the nearest `lang`, then the browser's language. */
10296
10950
  locale?: (HelixHeadlessPaginationSize["locale"]) | undefined;
10297
10951
  /** The sizes offered, comma separated.
10298
10952
 
@@ -10345,7 +10999,7 @@ export type HelixHeadlessPaginationSizeVueEvents = {
10345
10999
 
10346
11000
  export type HelixHeadlessPaginationSummaryVueProps = {
10347
11001
  /** The text shown. `{from}`, `{to}`, and `{total}` are replaced with the first
10348
- item, the last item, and the item count.
11002
+ item, the last item, and the item count, written in the locale.
10349
11003
 
10350
11004
  A template rather than a prefix and a suffix, because word order is not
10351
11005
  universal: `format="{total} 件中 {from}-{to} 件"` is one attribute here and
@@ -10359,9 +11013,8 @@ of the element, so calling it `label` put one word on three jobs inside one
10359
11013
  family. The root's templates are `pageLabel`, `statusLabel` and `gapLabel`,
10360
11014
  which each label something; this labels nothing, it *is* the thing. */
10361
11015
  format?: (HelixHeadlessPaginationSummary["format"]) | undefined;
10362
- /** Locale for the numbers.
10363
-
10364
- Absent uses the runtime's own. */
11016
+ /** The locale the words and the numbers are in, as a BCP 47 tag such as
11017
+ `de`. Empty reads the nearest `lang`, then the browser's language. */
10365
11018
  locale?: (HelixHeadlessPaginationSummary["locale"]) | undefined;
10366
11019
  /** The current page, counting from one. */
10367
11020
  page?: (HelixHeadlessPaginationSummary["page"]) | undefined;
@@ -10427,11 +11080,13 @@ a row of boxes. */
10427
11080
  readonly?: (HelixHeadlessPinInput["readOnly"]) | undefined;
10428
11081
  /** Whether the field blocks input. A read-only code still submits its value. */
10429
11082
  readOnly?: (HelixHeadlessPinInput["readOnly"]) | undefined;
10430
- /** The message shown when the code is started and not finished, with
10431
- `{length}` filled in. When it is unset, an English default is shown. */
11083
+ /** The message shown when the code is started and not finished. `{length}`
11084
+ is how many characters the code has, written in the locale, and each
11085
+ language writes the forms it has. */
10432
11086
  "too-short-message"?: (HelixHeadlessPinInput["tooShortMessage"]) | undefined;
10433
- /** The message shown when the code is started and not finished, with
10434
- `{length}` filled in. When it is unset, an English default is shown. */
11087
+ /** The message shown when the code is started and not finished. `{length}`
11088
+ is how many characters the code has, written in the locale, and each
11089
+ language writes the forms it has. */
10435
11090
  tooShortMessage?: (HelixHeadlessPinInput["tooShortMessage"]) | undefined;
10436
11091
  /** The characters a box accepts, which also sets the keyboard a phone shows.
10437
11092
 
@@ -10482,18 +11137,22 @@ browser's message. */
10482
11137
  required?: (HelixHeadlessPinInput["required"]) | undefined;
10483
11138
  /** The message shown when the field is required and empty.
10484
11139
 
10485
- **Absent, or empty, is the control's own sentence**, "Choose one to continue." on a
10486
- set and the browser's own on a text field, which the browser writes in
10487
- the reader's language. Every other word a control speaks is a property,
11140
+ **Absent, or empty, is the control's own sentence**, "Choose one to
11141
+ continue." on a set and the browser's own on a text field, which the
11142
+ browser writes in the reader's language. A family with a sentence of its
11143
+ own declares it as this property's English, a word property a page
11144
+ registers for its locale under the family's key. Every other word a control speaks is a property,
10488
11145
  and this one was the English a form in another language still spoke in
10489
11146
  the bubble it raises on submit: `feedback` replaces the message under
10490
11147
  the field and does not reach that one. */
10491
11148
  "value-missing-message"?: (HelixHeadlessPinInput["valueMissingMessage"]) | undefined;
10492
11149
  /** The message shown when the field is required and empty.
10493
11150
 
10494
- **Absent, or empty, is the control's own sentence**, "Choose one to continue." on a
10495
- set and the browser's own on a text field, which the browser writes in
10496
- the reader's language. Every other word a control speaks is a property,
11151
+ **Absent, or empty, is the control's own sentence**, "Choose one to
11152
+ continue." on a set and the browser's own on a text field, which the
11153
+ browser writes in the reader's language. A family with a sentence of its
11154
+ own declares it as this property's English, a word property a page
11155
+ registers for its locale under the family's key. Every other word a control speaks is a property,
10497
11156
  and this one was the English a form in another language still spoke in
10498
11157
  the bubble it raises on submit: `feedback` replaces the message under
10499
11158
  the field and does not reach that one. */
@@ -10558,8 +11217,14 @@ export type HelixHeadlessPopoverVueProps = {
10558
11217
  Off by default, which is the house style: a panel that opens from its
10559
11218
  trigger already reads as belonging to it. */
10560
11219
  arrow?: (HelixHeadlessPopover["arrow"]) | undefined;
10561
- /** The panel's name, read by screen readers. Left at `Popover`, the first
10562
- heading in the panel names it instead. */
11220
+ /** The panel's name where nothing else names it: no `label`, no heading in
11221
+ the panel, and no `aria-labelledby` on the host. */
11222
+ "fallback-label"?: (HelixHeadlessPopover["fallbackLabel"]) | undefined;
11223
+ /** The panel's name where nothing else names it: no `label`, no heading in
11224
+ the panel, and no `aria-labelledby` on the host. */
11225
+ fallbackLabel?: (HelixHeadlessPopover["fallbackLabel"]) | undefined;
11226
+ /** The panel's name, read by screen readers. Left empty, the first heading in
11227
+ the panel names it, and then `fallback-label`. */
10563
11228
  label?: (HelixHeadlessPopover["label"]) | undefined;
10564
11229
  /** Keeps `Tab` inside the panel while it is open, marks the panel
10565
11230
  `aria-modal`, and hides the rest of the page from screen readers. A press
@@ -10663,9 +11328,9 @@ place in the layout when the answer arrives and it becomes determinate. */
10663
11328
  A visible label in the `label` slot names it instead, with the words it
10664
11329
  shows, so the name and the label cannot disagree. */
10665
11330
  label?: (HelixHeadlessProgress["label"]) | undefined;
10666
- /** The locale the percentage is written in, such as `fr` for `72 %`.
11331
+ /** The locale the words and the percentage are in, such as `fr` for `72 %`.
10667
11332
 
10668
- Absent uses the runtime's own. */
11333
+ Absent reads the nearest `lang`, then the runtime's own. */
10669
11334
  locale?: (HelixHeadlessProgress["locale"]) | undefined;
10670
11335
  /** The total the work is measured against. */
10671
11336
  max?: (HelixHeadlessProgress["max"]) | undefined;
@@ -10743,11 +11408,17 @@ export type HelixHeadlessQrCodeElementEvent<E = Event> = TypedEvent<
10743
11408
  >;
10744
11409
 
10745
11410
  export type HelixHeadlessQrCodeVueProps = {
10746
- /** The words a code with no `label` is named by, followed by its value where
10747
- the value is a web address. */
11411
+ /** The name of a code with no `label` whose value is a web address.
11412
+ `{code}` is `code-label` and `{address}` the address. */
11413
+ "address-label"?: (HelixHeadlessQrCode["addressLabel"]) | undefined;
11414
+ /** The name of a code with no `label` whose value is a web address.
11415
+ `{code}` is `code-label` and `{address}` the address. */
11416
+ addressLabel?: (HelixHeadlessQrCode["addressLabel"]) | undefined;
11417
+ /** The words a code with no `label` is named by, with its value where the
11418
+ value is a web address, as `address-label` says. */
10748
11419
  "code-label"?: (HelixHeadlessQrCode["codeLabel"]) | undefined;
10749
- /** The words a code with no `label` is named by, followed by its value where
10750
- the value is a web address. */
11420
+ /** The words a code with no `label` is named by, with its value where the
11421
+ value is a web address, as `address-label` says. */
10751
11422
  codeLabel?: (HelixHeadlessQrCode["codeLabel"]) | undefined;
10752
11423
  /** The error correction level, which sets how much of the code can be lost
10753
11424
  and still scan.
@@ -10834,6 +11505,14 @@ Home and End move focus between the radios and choose nothing, so a reader
10834
11505
  can hear every choice, and Tab still reaches the answer. The group says
10835
11506
  `aria-readonly`. A script can still set `value`. */
10836
11507
  readOnly?: (HelixHeadlessRadioGroup["readOnly"]) | undefined;
11508
+ /** The message reported when the field is required and no option is chosen.
11509
+ Absent, or empty, is this sentence, or the words registered for the page's
11510
+ locale. */
11511
+ "value-missing-message"?: (HelixHeadlessRadioGroup["valueMissingMessage"]) | undefined;
11512
+ /** The message reported when the field is required and no option is chosen.
11513
+ Absent, or empty, is this sentence, or the words registered for the page's
11514
+ locale. */
11515
+ valueMissingMessage?: (HelixHeadlessRadioGroup["valueMissingMessage"]) | undefined;
10837
11516
  /** The value the control starts with. A form reset returns it to this value,
10838
11517
  and to the `value` attribute where this one is not written, as a native
10839
11518
  control resets to the `value` it declares. */
@@ -10861,24 +11540,6 @@ browser's message. */
10861
11540
  label?: (HelixHeadlessRadioGroup["label"]) | undefined;
10862
11541
  /** Whether the field needs a value before the form can submit. */
10863
11542
  required?: (HelixHeadlessRadioGroup["required"]) | undefined;
10864
- /** The message shown when the field is required and empty.
10865
-
10866
- **Absent, or empty, is the control's own sentence**, "Choose one to continue." on a
10867
- set and the browser's own on a text field, which the browser writes in
10868
- the reader's language. Every other word a control speaks is a property,
10869
- and this one was the English a form in another language still spoke in
10870
- the bubble it raises on submit: `feedback` replaces the message under
10871
- the field and does not reach that one. */
10872
- "value-missing-message"?: (HelixHeadlessRadioGroup["valueMissingMessage"]) | undefined;
10873
- /** The message shown when the field is required and empty.
10874
-
10875
- **Absent, or empty, is the control's own sentence**, "Choose one to continue." on a
10876
- set and the browser's own on a text field, which the browser writes in
10877
- the reader's language. Every other word a control speaks is a property,
10878
- and this one was the English a form in another language still spoke in
10879
- the bubble it raises on submit: `feedback` replaces the message under
10880
- the field and does not reach that one. */
10881
- valueMissingMessage?: (HelixHeadlessRadioGroup["valueMissingMessage"]) | undefined;
10882
11543
  /** Whether the control is disabled and cannot be used.
10883
11544
 
10884
11545
  Reflected, because the styled tier selects on it, and mirrored to
@@ -11064,13 +11725,13 @@ leaving a rating with nothing to press. A property that silently accepts
11064
11725
  nonsense is the fault this pays off, so neither case is quietly ignored. */
11065
11726
  min?: (HelixHeadlessRating["min"]) | undefined;
11066
11727
  /** The name of each mark a reader can choose, with `{score}` and `{max}`
11067
- filled in. Set it to translate "3 out of 5".
11728
+ filled in, written in the locale. Set it to translate "3 out of 5".
11068
11729
 
11069
11730
  Also what a read-only rating says for its score where `value-text` is
11070
11731
  empty. */
11071
11732
  "option-label"?: (HelixHeadlessRating["optionLabel"]) | undefined;
11072
11733
  /** The name of each mark a reader can choose, with `{score}` and `{max}`
11073
- filled in. Set it to translate "3 out of 5".
11734
+ filled in, written in the locale. Set it to translate "3 out of 5".
11074
11735
 
11075
11736
  Also what a read-only rating says for its score where `value-text` is
11076
11737
  empty. */
@@ -11112,6 +11773,14 @@ reader's own cursor would be worse than no label. */
11112
11773
  `0.5` is the half star, and it is the reason the value is a number rather
11113
11774
  than an index: with halves, five marks are ten answers. */
11114
11775
  step?: (HelixHeadlessRating["step"]) | undefined;
11776
+ /** The message reported when the field is required and no rating is chosen.
11777
+ Absent, or empty, is this sentence, or the words registered for the page's
11778
+ locale. */
11779
+ "value-missing-message"?: (HelixHeadlessRating["valueMissingMessage"]) | undefined;
11780
+ /** The message reported when the field is required and no rating is chosen.
11781
+ Absent, or empty, is this sentence, or the words registered for the page's
11782
+ locale. */
11783
+ valueMissingMessage?: (HelixHeadlessRating["valueMissingMessage"]) | undefined;
11115
11784
  /** The text screen readers read for the score, in place of "3.5 out of 5".
11116
11785
 
11117
11786
  A rating out of five is one of the few places a screen reader gets a worse
@@ -11153,24 +11822,6 @@ browser's message. */
11153
11822
  label?: (HelixHeadlessRating["label"]) | undefined;
11154
11823
  /** Whether the field needs a value before the form can submit. */
11155
11824
  required?: (HelixHeadlessRating["required"]) | undefined;
11156
- /** The message shown when the field is required and empty.
11157
-
11158
- **Absent, or empty, is the control's own sentence**, "Choose one to continue." on a
11159
- set and the browser's own on a text field, which the browser writes in
11160
- the reader's language. Every other word a control speaks is a property,
11161
- and this one was the English a form in another language still spoke in
11162
- the bubble it raises on submit: `feedback` replaces the message under
11163
- the field and does not reach that one. */
11164
- "value-missing-message"?: (HelixHeadlessRating["valueMissingMessage"]) | undefined;
11165
- /** The message shown when the field is required and empty.
11166
-
11167
- **Absent, or empty, is the control's own sentence**, "Choose one to continue." on a
11168
- set and the browser's own on a text field, which the browser writes in
11169
- the reader's language. Every other word a control speaks is a property,
11170
- and this one was the English a form in another language still spoke in
11171
- the bubble it raises on submit: `feedback` replaces the message under
11172
- the field and does not reach that one. */
11173
- valueMissingMessage?: (HelixHeadlessRating["valueMissingMessage"]) | undefined;
11174
11825
  /** Whether the control is disabled and cannot be used.
11175
11826
 
11176
11827
  Reflected, because the styled tier selects on it, and mirrored to
@@ -11219,9 +11870,11 @@ export type HelixHeadlessRatingVueEvents = {
11219
11870
  };
11220
11871
 
11221
11872
  export type HelixHeadlessScatterChartVueProps = {
11222
- /** The word the summary uses for the strength of the relation. */
11873
+ /** The word for the strength of the relation, `{correlationLabel}` in
11874
+ `series-label`. */
11223
11875
  "correlation-label"?: (HelixHeadlessScatterChart["correlationLabel"]) | undefined;
11224
- /** The word the summary uses for the strength of the relation. */
11876
+ /** The word for the strength of the relation, `{correlationLabel}` in
11877
+ `series-label`. */
11225
11878
  correlationLabel?: (HelixHeadlessScatterChart["correlationLabel"]) | undefined;
11226
11879
  /** Which gridlines are drawn across the plot, if any.
11227
11880
 
@@ -11230,10 +11883,30 @@ Both axes are measured, so the values name an axis rather than a role:
11230
11883
  anything unrecognized, means `both`, since neither axis is the one a scatter
11231
11884
  is read along. */
11232
11885
  gridlines?: (HelixHeadlessScatterChart["gridlines"]) | undefined;
11233
- /** The word the summary uses for a row when it counts them. */
11886
+ /** The word for the rows a series rests on, `{pointsLabel}` in
11887
+ `series-label`. `{count}` is how many, so the word takes its plural
11888
+ forms: `{count, plural, one {punkt} few {punkty} other {punktów}}`. */
11234
11889
  "points-label"?: (HelixHeadlessScatterChart["pointsLabel"]) | undefined;
11235
- /** The word the summary uses for a row when it counts them. */
11890
+ /** The word for the rows a series rests on, `{pointsLabel}` in
11891
+ `series-label`. `{count}` is how many, so the word takes its plural
11892
+ forms: `{count, plural, one {punkt} few {punkty} other {punktów}}`. */
11236
11893
  pointsLabel?: (HelixHeadlessScatterChart["pointsLabel"]) | undefined;
11894
+ /** What the summary says of each series. `{y}` is what the series measures up,
11895
+ `{x}` what the chart measures across, `{count}` how many rows it rests on,
11896
+ written in the locale, `{pointsLabel}` the word for them, and
11897
+ `{correlation}` its correlation, or `none` where there are fewer than
11898
+ three points or no spread to measure, so each case is a whole sentence:
11899
+ `{correlation, select, none {...} other {...}}`. `{correlationLabel}` is
11900
+ `correlation-label`. */
11901
+ "series-label"?: (HelixHeadlessScatterChart["seriesLabel"]) | undefined;
11902
+ /** What the summary says of each series. `{y}` is what the series measures up,
11903
+ `{x}` what the chart measures across, `{count}` how many rows it rests on,
11904
+ written in the locale, `{pointsLabel}` the word for them, and
11905
+ `{correlation}` its correlation, or `none` where there are fewer than
11906
+ three points or no spread to measure, so each case is a whole sentence:
11907
+ `{correlation, select, none {...} other {...}}`. `{correlationLabel}` is
11908
+ `correlation-label`. */
11909
+ seriesLabel?: (HelixHeadlessScatterChart["seriesLabel"]) | undefined;
11237
11910
  /** The heading of a column whose numbers size the points, such as
11238
11911
  `Population`, which makes the chart a bubble chart.
11239
11912
 
@@ -11273,8 +11946,8 @@ words and is already written. */
11273
11946
  /** The locale the chart's own numbers are written in: its axis, its
11274
11947
  percentages and its totals, such as `de` for `1.240` and `32 %`.
11275
11948
 
11276
- Absent uses the runtime's own. The table's cells are shown as the table
11277
- writes them, whatever this says. */
11949
+ Absent reads the nearest `lang`, then the runtime's own. The table's
11950
+ cells are shown as the table writes them, whatever this says. */
11278
11951
  locale?: (HelixHeadlessScatterChart["locale"]) | undefined;
11279
11952
  /** Where a reading the keys moved to stands among the readings, said after
11280
11953
  it. `{position}` and `{count}` are replaced with the numbers, written in
@@ -11363,6 +12036,14 @@ export type HelixHeadlessSelectToggleElementEvent =
11363
12036
  HelixHeadlessSelectElementEvent<ToggleEvent>;
11364
12037
 
11365
12038
  export type HelixHeadlessSelectVueProps = {
12039
+ /** What a browser's autofill may fill in, as a platform token such as
12040
+ `country` or `cc-exp-month`, as on a native `<select>`.
12041
+
12042
+ Set, the select keeps a hidden native `<select>` with the same options for
12043
+ the browser to fill, as React Aria's `HiddenSelect` does, and takes the
12044
+ option the browser picks, by its value or its words, as the value. Empty
12045
+ draws no hidden select, and a browser fills nothing. */
12046
+ autocomplete?: (HelixHeadlessSelect["autocomplete"]) | undefined;
11366
12047
  /** The text shown when no options match the filter. */
11367
12048
  "empty-text"?: (HelixHeadlessSelect["emptyText"]) | undefined;
11368
12049
  /** The text shown when no options match the filter. */
@@ -11414,6 +12095,14 @@ round it, and a short move reaches the options either side. Near an edge
11414
12095
  of the screen the list moves to stay on it, so the option may sit beside
11415
12096
  the trigger rather than on it. It follows the page as it scrolls. */
11416
12097
  position?: (HelixHeadlessSelect["position"]) | undefined;
12098
+ /** The message reported when the field is required and nothing is chosen.
12099
+ Absent, or empty, is this sentence, or the words registered for the page's
12100
+ locale. */
12101
+ "value-missing-message"?: (HelixHeadlessSelect["valueMissingMessage"]) | undefined;
12102
+ /** The message reported when the field is required and nothing is chosen.
12103
+ Absent, or empty, is this sentence, or the words registered for the page's
12104
+ locale. */
12105
+ valueMissingMessage?: (HelixHeadlessSelect["valueMissingMessage"]) | undefined;
11417
12106
  /** Whether the element starts open. Ignored once `open` is written. */
11418
12107
  "default-open"?: (HelixHeadlessSelect["defaultOpen"]) | undefined;
11419
12108
  /** Whether the element starts open. Ignored once `open` is written. */
@@ -11458,24 +12147,6 @@ browser's message. */
11458
12147
  label?: (HelixHeadlessSelect["label"]) | undefined;
11459
12148
  /** Whether the field needs a value before the form can submit. */
11460
12149
  required?: (HelixHeadlessSelect["required"]) | undefined;
11461
- /** The message shown when the field is required and empty.
11462
-
11463
- **Absent, or empty, is the control's own sentence**, "Choose one to continue." on a
11464
- set and the browser's own on a text field, which the browser writes in
11465
- the reader's language. Every other word a control speaks is a property,
11466
- and this one was the English a form in another language still spoke in
11467
- the bubble it raises on submit: `feedback` replaces the message under
11468
- the field and does not reach that one. */
11469
- "value-missing-message"?: (HelixHeadlessSelect["valueMissingMessage"]) | undefined;
11470
- /** The message shown when the field is required and empty.
11471
-
11472
- **Absent, or empty, is the control's own sentence**, "Choose one to continue." on a
11473
- set and the browser's own on a text field, which the browser writes in
11474
- the reader's language. Every other word a control speaks is a property,
11475
- and this one was the English a form in another language still spoke in
11476
- the bubble it raises on submit: `feedback` replaces the message under
11477
- the field and does not reach that one. */
11478
- valueMissingMessage?: (HelixHeadlessSelect["valueMissingMessage"]) | undefined;
11479
12150
  /** Whether the control is disabled and cannot be used.
11480
12151
 
11481
12152
  Reflected, because the styled tier selects on it, and mirrored to
@@ -11608,8 +12279,8 @@ attribute.
11608
12279
  <helix-slider format-options='{"style":"currency","currency":"USD"}'></helix-slider>
11609
12280
  ``` */
11610
12281
  formatOptions?: (HelixHeadlessSlider["formatOptions"]) | undefined;
11611
- /** The locale `format-options` writes the value in, such as `de-DE`. Empty is
11612
- the reader's own. */
12282
+ /** The locale the value and the words are written in, such as `de-DE`. Empty
12283
+ reads the nearest `lang`, then the browser's language. */
11613
12284
  locale?: (HelixHeadlessSlider["locale"]) | undefined;
11614
12285
  /** Shows the value at each mark. */
11615
12286
  "marker-labels"?: (HelixHeadlessSlider["markerLabels"]) | undefined;
@@ -11732,18 +12403,22 @@ browser's message. */
11732
12403
  required?: (HelixHeadlessSlider["required"]) | undefined;
11733
12404
  /** The message shown when the field is required and empty.
11734
12405
 
11735
- **Absent, or empty, is the control's own sentence**, "Choose one to continue." on a
11736
- set and the browser's own on a text field, which the browser writes in
11737
- the reader's language. Every other word a control speaks is a property,
12406
+ **Absent, or empty, is the control's own sentence**, "Choose one to
12407
+ continue." on a set and the browser's own on a text field, which the
12408
+ browser writes in the reader's language. A family with a sentence of its
12409
+ own declares it as this property's English, a word property a page
12410
+ registers for its locale under the family's key. Every other word a control speaks is a property,
11738
12411
  and this one was the English a form in another language still spoke in
11739
12412
  the bubble it raises on submit: `feedback` replaces the message under
11740
12413
  the field and does not reach that one. */
11741
12414
  "value-missing-message"?: (HelixHeadlessSlider["valueMissingMessage"]) | undefined;
11742
12415
  /** The message shown when the field is required and empty.
11743
12416
 
11744
- **Absent, or empty, is the control's own sentence**, "Choose one to continue." on a
11745
- set and the browser's own on a text field, which the browser writes in
11746
- the reader's language. Every other word a control speaks is a property,
12417
+ **Absent, or empty, is the control's own sentence**, "Choose one to
12418
+ continue." on a set and the browser's own on a text field, which the
12419
+ browser writes in the reader's language. A family with a sentence of its
12420
+ own declares it as this property's English, a word property a page
12421
+ registers for its locale under the family's key. Every other word a control speaks is a property,
11747
12422
  and this one was the English a form in another language still spoke in
11748
12423
  the bubble it raises on submit: `feedback` replaces the message under
11749
12424
  the field and does not reach that one. */
@@ -11833,11 +12508,11 @@ the accessible representation of a sparkline, and a list of the fourteen
11833
12508
  numbers is not. Absent, the drawing is hidden from a screen reader rather
11834
12509
  than announced without a name. */
11835
12510
  label?: (HelixHeadlessSparkline["label"]) | undefined;
11836
- /** The locale the readout's numbers and positions are written in, such as
11837
- `de` for `1.240`.
12511
+ /** The locale the words, the readout's numbers and positions are in, such
12512
+ as `de` for `1.240`.
11838
12513
 
11839
- Absent uses the runtime's own. A table's cells are shown as the table
11840
- writes them, whatever this says. */
12514
+ Absent reads the nearest `lang`, then the runtime's own. A table's cells
12515
+ are shown as the table writes them, whatever this says. */
11841
12516
  locale?: (HelixHeadlessSparkline["locale"]) | undefined;
11842
12517
  /** Which readings take a mark of their own: `high`, `low`, or both,
11843
12518
  separated by spaces.
@@ -11918,6 +12593,13 @@ not. */
11918
12593
 
11919
12594
  export type HelixHeadlessSparklineVueEvents = {};
11920
12595
 
12596
+ export type HelixHeadlessSpeedDialGroupVueProps = {
12597
+ /** The group's name, drawn above its actions and read by screen readers. */
12598
+ label?: (HelixHeadlessSpeedDialGroup["label"]) | undefined;
12599
+ };
12600
+
12601
+ export type HelixHeadlessSpeedDialGroupVueEvents = {};
12602
+
11921
12603
  /** `HelixHeadlessSpeedDialItem` component event */
11922
12604
  export type HelixHeadlessSpeedDialItemElementEvent<E = Event> = TypedEvent<
11923
12605
  HelixHeadlessSpeedDialItem,
@@ -11930,6 +12612,10 @@ export type HelixHeadlessSpeedDialItemHelixSelectElementEvent =
11930
12612
  export type HelixHeadlessSpeedDialItemVueProps = {
11931
12613
  /** Whether the action is disabled, so it cannot be chosen. */
11932
12614
  disabled?: (HelixHeadlessSpeedDialItem["disabled"]) | undefined;
12615
+ /** The action's keyboard shortcut as a chord, such as `mod+s`, carried as
12616
+ `aria-keyshortcuts` and drawn after the name. `mod` is Command on an Apple
12617
+ keyboard and Control elsewhere. Showing a shortcut does not bind it. */
12618
+ shortcut?: (HelixHeadlessSpeedDialItem["shortcut"]) | undefined;
11933
12619
  /** The action's value, sent in `helix-select` when the action is chosen. */
11934
12620
  value?: (HelixHeadlessSpeedDialItem["value"]) | undefined;
11935
12621
  };
@@ -11960,8 +12646,32 @@ export type HelixHeadlessSpeedDialToggleElementEvent =
11960
12646
  export type HelixHeadlessSpeedDialVueProps = {
11961
12647
  /** Accessible name for the trigger and the set of actions it opens. */
11962
12648
  label?: (HelixHeadlessSpeedDial["label"]) | undefined;
12649
+ /** The description the trigger gives under `open-on="long-press"`, saying how
12650
+ its actions are reached.
12651
+
12652
+ A slotted trigger is described by the dial, which carries the words as
12653
+ its own label for that: a Helix button's inner control at once, and a
12654
+ plain element of yours once a reader reaches it, after hydration, unless
12655
+ you described or labeled it yourself. */
12656
+ "long-press-label"?: (HelixHeadlessSpeedDial["longPressLabel"]) | undefined;
12657
+ /** The description the trigger gives under `open-on="long-press"`, saying how
12658
+ its actions are reached.
12659
+
12660
+ A slotted trigger is described by the dial, which carries the words as
12661
+ its own label for that: a Helix button's inner control at once, and a
12662
+ plain element of yours once a reader reaches it, after hydration, unless
12663
+ you described or labeled it yourself. */
12664
+ longPressLabel?: (HelixHeadlessSpeedDial["longPressLabel"]) | undefined;
11963
12665
  /** Space between the trigger and the actions, in pixels. */
11964
12666
  offset?: (HelixHeadlessSpeedDial["offset"]) | undefined;
12667
+ /** What opens the dial. `click` opens it on a press of the trigger. Under
12668
+ `long-press`, a press is the trigger's own action, and the dial opens on a
12669
+ press held for half a second, or on Alt+Down or Alt+Up. */
12670
+ "open-on"?: (HelixHeadlessSpeedDial["openOn"]) | undefined;
12671
+ /** What opens the dial. `click` opens it on a press of the trigger. Under
12672
+ `long-press`, a press is the trigger's own action, and the dial opens on a
12673
+ press held for half a second, or on Alt+Down or Alt+Up. */
12674
+ openOn?: (HelixHeadlessSpeedDial["openOn"]) | undefined;
11965
12675
  /** The direction the actions open in. They move to another side if that side
11966
12676
  does not fit.
11967
12677
 
@@ -12147,7 +12857,7 @@ export type HelixHeadlessSplitterVueEvents = {
12147
12857
  "helix-collapse": HelixHeadlessSplitterHelixCollapseElementEvent;
12148
12858
  /** Fired after the divider settles somewhere new, with the new position. */
12149
12859
  "helix-resized": HelixHeadlessSplitterHelixResizedElementEvent;
12150
- /** Fired each time a drag moves the divider, before it settles, as a range input does while it is dragged. Read `position` for where it is now. */
12860
+ /** Fired each time the divider moves, as a range input does: on each step of a drag, and before `helix-resized` for a key, a double click or a corner. Read `position` for where it is now. */
12151
12861
  input: HelixHeadlessSplitterElementEvent;
12152
12862
  };
12153
12863
 
@@ -12225,11 +12935,15 @@ in both. Of those four combinations three are ones nobody should pick, and
12225
12935
  a property whose job is mostly to be left alone is a property that mostly
12226
12936
  catches people out. */
12227
12937
  orientation?: (HelixHeadlessSteps["orientation"]) | undefined;
12228
- /** What the `progress` part says to a screen reader, with `{percent}` filled
12229
- in with `progress`. */
12938
+ /** What the `progress` part says to a screen reader. `{share, number,
12939
+ percent}` writes `progress` as a percentage the way the locale writes one,
12940
+ such as `40%`, or `40 %` in French. `{percent}` is `progress` as a whole
12941
+ number, for a sentence that places the sign itself. */
12230
12942
  "progress-label"?: (HelixHeadlessSteps["progressLabel"]) | undefined;
12231
- /** What the `progress` part says to a screen reader, with `{percent}` filled
12232
- in with `progress`. */
12943
+ /** What the `progress` part says to a screen reader. `{share, number,
12944
+ percent}` writes `progress` as a percentage the way the locale writes one,
12945
+ such as `40%`, or `40 %` in French. `{percent}` is `progress` as a whole
12946
+ number, for a sentence that places the sign itself. */
12233
12947
  progressLabel?: (HelixHeadlessSteps["progressLabel"]) | undefined;
12234
12948
  /** What each step is marked with.
12235
12949
 
@@ -12286,6 +13000,16 @@ export type HelixHeadlessStepHelixSelectElementEvent =
12286
13000
  export type HelixHeadlessStepVueProps = {
12287
13001
  /** Whether this stage is finished. */
12288
13002
  complete?: (HelixHeadlessStep["complete"]) | undefined;
13003
+ /** What a screen reader hears when the stage is finished while the page is
13004
+ open. `{name}` is the stage's name and `{complete}` is `complete-label`, so
13005
+ a language can write the whole sentence in its own order. A stage with no
13006
+ name says `complete-label` alone. */
13007
+ "completed-label"?: (HelixHeadlessStep["completedLabel"]) | undefined;
13008
+ /** What a screen reader hears when the stage is finished while the page is
13009
+ open. `{name}` is the stage's name and `{complete}` is `complete-label`, so
13010
+ a language can write the whole sentence in its own order. A stage with no
13011
+ name says `complete-label` alone. */
13012
+ completedLabel?: (HelixHeadlessStep["completedLabel"]) | undefined;
12289
13013
  /** The words that tell a screen reader the stage is finished. Translate it
12290
13014
  with the page. */
12291
13015
  "complete-label"?: (HelixHeadlessStep["completeLabel"]) | undefined;
@@ -12320,6 +13044,14 @@ export type HelixHeadlessSwitchHelixBeforeToggleElementEvent =
12320
13044
  export type HelixHeadlessSwitchVueProps = {
12321
13045
  /** Value submitted when the switch is on. */
12322
13046
  value?: (HelixHeadlessSwitch["value"]) | undefined;
13047
+ /** The message reported when the field is required and the switch is off.
13048
+ Absent, or empty, is this sentence, or the words registered for the page's
13049
+ locale. */
13050
+ "value-missing-message"?: (HelixHeadlessSwitch["valueMissingMessage"]) | undefined;
13051
+ /** The message reported when the field is required and the switch is off.
13052
+ Absent, or empty, is this sentence, or the words registered for the page's
13053
+ locale. */
13054
+ valueMissingMessage?: (HelixHeadlessSwitch["valueMissingMessage"]) | undefined;
12323
13055
  /** Whether the control is checked.
12324
13056
 
12325
13057
  One property rather than two. Writing always applies;
@@ -12371,24 +13103,6 @@ browser's message. */
12371
13103
  label?: (HelixHeadlessSwitch["label"]) | undefined;
12372
13104
  /** Whether the field needs a value before the form can submit. */
12373
13105
  required?: (HelixHeadlessSwitch["required"]) | undefined;
12374
- /** The message shown when the field is required and empty.
12375
-
12376
- **Absent, or empty, is the control's own sentence**, "Choose one to continue." on a
12377
- set and the browser's own on a text field, which the browser writes in
12378
- the reader's language. Every other word a control speaks is a property,
12379
- and this one was the English a form in another language still spoke in
12380
- the bubble it raises on submit: `feedback` replaces the message under
12381
- the field and does not reach that one. */
12382
- "value-missing-message"?: (HelixHeadlessSwitch["valueMissingMessage"]) | undefined;
12383
- /** The message shown when the field is required and empty.
12384
-
12385
- **Absent, or empty, is the control's own sentence**, "Choose one to continue." on a
12386
- set and the browser's own on a text field, which the browser writes in
12387
- the reader's language. Every other word a control speaks is a property,
12388
- and this one was the English a form in another language still spoke in
12389
- the bubble it raises on submit: `feedback` replaces the message under
12390
- the field and does not reach that one. */
12391
- valueMissingMessage?: (HelixHeadlessSwitch["valueMissingMessage"]) | undefined;
12392
13106
  /** Whether the control is disabled and cannot be used.
12393
13107
 
12394
13108
  Reflected, because the styled tier selects on it, and mirrored to
@@ -12461,14 +13175,16 @@ after a column moves is a sort a consumer cannot store in a URL.
12461
13175
  Empty on a column that is purely presentational, an actions column say, and
12462
13176
  such a column is never sortable however it is marked. */
12463
13177
  field?: (HelixHeadlessTableColumn["field"]) | undefined;
12464
- /** The accessible name of the grip that moves the column. `{name}` is replaced
12465
- with the heading text.
13178
+ /** The accessible name of the grip that moves the column. `{name}` is the
13179
+ heading text, and `{named}` is `no` for a column without one, so the
13180
+ sentence for it can name the column another way.
12466
13181
 
12467
13182
  **Every word a column speaks is a property**, so a table in another
12468
13183
  language hears its own rather than English around its own headings. */
12469
13184
  "move-label"?: (HelixHeadlessTableColumn["moveLabel"]) | undefined;
12470
- /** The accessible name of the grip that moves the column. `{name}` is replaced
12471
- with the heading text.
13185
+ /** The accessible name of the grip that moves the column. `{name}` is the
13186
+ heading text, and `{named}` is `no` for a column without one, so the
13187
+ sentence for it can name the column another way.
12472
13188
 
12473
13189
  **Every word a column speaks is a property**, so a table in another
12474
13190
  language hears its own rather than English around its own headings. */
@@ -12481,10 +13197,10 @@ it has focus, a step at a time and four with Shift. The width lands in
12481
13197
  stores the widths can take the decision. */
12482
13198
  resizable?: (HelixHeadlessTableColumn["resizable"]) | undefined;
12483
13199
  /** The accessible name of the separator that resizes the column. `{name}` is
12484
- replaced with the heading text. */
13200
+ the heading text, and `{named}` is `no` for a column without one. */
12485
13201
  "resize-label"?: (HelixHeadlessTableColumn["resizeLabel"]) | undefined;
12486
13202
  /** The accessible name of the separator that resizes the column. `{name}` is
12487
- replaced with the heading text. */
13203
+ the heading text, and `{named}` is `no` for a column without one. */
12488
13204
  resizeLabel?: (HelixHeadlessTableColumn["resizeLabel"]) | undefined;
12489
13205
  /** Makes this column's cells the headers of their rows, in `DataTable`.
12490
13206
 
@@ -12602,10 +13318,12 @@ and lets that column wrap. A headless consumer owns the overflow either
12602
13318
  way, that being paint, and gets the honest track list. */
12603
13319
  width?: (HelixHeadlessTableColumn["width"]) | undefined;
12604
13320
  /** The text screen readers announce for the column's width. `{width}` is
12605
- replaced with the width. */
13321
+ the width in pixels, written in the locale, and each language writes the
13322
+ forms it has. */
12606
13323
  "width-label"?: (HelixHeadlessTableColumn["widthLabel"]) | undefined;
12607
13324
  /** The text screen readers announce for the column's width. `{width}` is
12608
- replaced with the width. */
13325
+ the width in pixels, written in the locale, and each language writes the
13326
+ forms it has. */
12609
13327
  widthLabel?: (HelixHeadlessTableColumn["widthLabel"]) | undefined;
12610
13328
  /** A function that reads the cell's content from a row, for cells that `field`
12611
13329
  alone cannot read.
@@ -12638,6 +13356,12 @@ export type HelixHeadlessTableElementEvent<E = Event> = TypedEvent<
12638
13356
  HelixHeadlessTable,
12639
13357
  E
12640
13358
  >;
13359
+ /** `helix-before-reorder` event type */
13360
+ export type HelixHeadlessTableHelixBeforeReorderElementEvent =
13361
+ HelixHeadlessTableElementEvent<HelixBeforeReorderEvent>;
13362
+ /** `helix-reorder` event type */
13363
+ export type HelixHeadlessTableHelixReorderElementEvent =
13364
+ HelixHeadlessTableElementEvent<HelixReorderEvent>;
12641
13365
  /** `helix-select` event type */
12642
13366
  export type HelixHeadlessTableHelixSelectElementEvent =
12643
13367
  HelixHeadlessTableElementEvent<HelixSelectEvent>;
@@ -12652,10 +13376,16 @@ export type HelixHeadlessTableHelixSortedElementEvent =
12652
13376
  HelixHeadlessTableElementEvent<HelixSortedEvent>;
12653
13377
 
12654
13378
  export type HelixHeadlessTableVueProps = {
12655
- /** The word for an ascending sort, in `sorted-label`. */
13379
+ /** The word for an ascending sort, in a `sorted-label` that writes `{order}`. */
12656
13380
  "ascending-label"?: (HelixHeadlessTable["ascendingLabel"]) | undefined;
12657
- /** The word for an ascending sort, in `sorted-label`. */
13381
+ /** The word for an ascending sort, in a `sorted-label` that writes `{order}`. */
12658
13382
  ascendingLabel?: (HelixHeadlessTable["ascendingLabel"]) | undefined;
13383
+ /** What screen readers hear when a held row is put back, or a move is
13384
+ refused, in a `reorderable` table. */
13385
+ "canceled-label"?: (HelixHeadlessTable["canceledLabel"]) | undefined;
13386
+ /** What screen readers hear when a held row is put back, or a move is
13387
+ refused, in a `reorderable` table. */
13388
+ canceledLabel?: (HelixHeadlessTable["canceledLabel"]) | undefined;
12659
13389
  /** The column widths as one track list, written once on the table.
12660
13390
 
12661
13391
  With `TableColumn` children, each track sizes the column in its place, a
@@ -12695,15 +13425,60 @@ is set. */
12695
13425
  "default-sort"?: (HelixHeadlessTable["defaultSort"]) | undefined;
12696
13426
  /** The starting sort order, used until `sort` is set. */
12697
13427
  defaultSort?: (HelixHeadlessTable["defaultSort"]) | undefined;
12698
- /** The word for a descending sort, in `sorted-label`. */
13428
+ /** The word for a descending sort, in a `sorted-label` that writes `{order}`. */
12699
13429
  "descending-label"?: (HelixHeadlessTable["descendingLabel"]) | undefined;
12700
- /** The word for a descending sort, in `sorted-label`. */
13430
+ /** The word for a descending sort, in a `sorted-label` that writes `{order}`. */
12701
13431
  descendingLabel?: (HelixHeadlessTable["descendingLabel"]) | undefined;
13432
+ /** What screen readers hear when a held row is dropped, in a `reorderable` table. */
13433
+ "dropped-label"?: (HelixHeadlessTable["droppedLabel"]) | undefined;
13434
+ /** What screen readers hear when a held row is dropped, in a `reorderable` table. */
13435
+ droppedLabel?: (HelixHeadlessTable["droppedLabel"]) | undefined;
13436
+ /** The table's name where neither `label` nor an `aria-label` or
13437
+ `aria-labelledby` on the host gives it one. */
13438
+ "fallback-label"?: (HelixHeadlessTable["fallbackLabel"]) | undefined;
13439
+ /** The table's name where neither `label` nor an `aria-label` or
13440
+ `aria-labelledby` on the host gives it one. */
13441
+ fallbackLabel?: (HelixHeadlessTable["fallbackLabel"]) | undefined;
13442
+ /** Makes the table a grid: one tab stop, and the arrow keys, Home, End and the
13443
+ Page keys move focus between its cells, the headings included. Enter moves
13444
+ into a cell's controls, and Tab leaves the table.
13445
+
13446
+ Off by default, where the table is a static `table` and Tab reaches each
13447
+ link and control in it. On, the table writes a `tabindex` onto each of its
13448
+ cells, which is the one way a cell of your markup can take focus. */
13449
+ grid?: (HelixHeadlessTable["grid"]) | undefined;
12702
13450
  /** Accessible name for the table.
12703
13451
 
12704
13452
  An `aria-label` or `aria-labelledby` on the host names the table too, and
12705
13453
  wins over this. */
12706
13454
  label?: (HelixHeadlessTable["label"]) | undefined;
13455
+ /** What screen readers hear each time a key moves a held row, in a
13456
+ `reorderable` table. `{name}` is the row's words, `{position}` the place it
13457
+ would go, counting from 1, and `{count}` the number of rows. */
13458
+ "moved-label"?: (HelixHeadlessTable["movedLabel"]) | undefined;
13459
+ /** What screen readers hear each time a key moves a held row, in a
13460
+ `reorderable` table. `{name}` is the row's words, `{position}` the place it
13461
+ would go, counting from 1, and `{count}` the number of rows. */
13462
+ movedLabel?: (HelixHeadlessTable["movedLabel"]) | undefined;
13463
+ /** The name of a row's grip, in a `reorderable` table. `{row}` is replaced
13464
+ with the words of the row's first cell. */
13465
+ "move-row-label"?: (HelixHeadlessTable["moveRowLabel"]) | undefined;
13466
+ /** The name of a row's grip, in a `reorderable` table. `{row}` is replaced
13467
+ with the words of the row's first cell. */
13468
+ moveRowLabel?: (HelixHeadlessTable["moveRowLabel"]) | undefined;
13469
+ /** What screen readers hear when a key or a click picks up a row, in a
13470
+ `reorderable` table. `{name}` is the row's words. */
13471
+ "picked-up-label"?: (HelixHeadlessTable["pickedUpLabel"]) | undefined;
13472
+ /** What screen readers hear when a key or a click picks up a row, in a
13473
+ `reorderable` table. `{name}` is the row's words. */
13474
+ pickedUpLabel?: (HelixHeadlessTable["pickedUpLabel"]) | undefined;
13475
+ /** Adds a column of grips that move rows, by dragging or with the keys. The
13476
+ table moves no row itself: you move your rows on `helix-reorder`. */
13477
+ reorderable?: (HelixHeadlessTable["reorderable"]) | undefined;
13478
+ /** The name of the heading over the row grips, in a `reorderable` table. */
13479
+ "row-grips-label"?: (HelixHeadlessTable["rowGripsLabel"]) | undefined;
13480
+ /** The name of the heading over the row grips, in a `reorderable` table. */
13481
+ rowGripsLabel?: (HelixHeadlessTable["rowGripsLabel"]) | undefined;
12707
13482
  /** Adds a column of checkboxes for selecting rows. Each row is known by its
12708
13483
  `value`, and by its place among the rows as written where it has none. */
12709
13484
  selectable?: (HelixHeadlessTable["selectable"]) | undefined;
@@ -12718,10 +13493,14 @@ selection as it was. `default-selected` seeds a selection this element
12718
13493
  then owns. */
12719
13494
  selected?: (HelixHeadlessTable["selected"]) | undefined;
12720
13495
  /** What screen readers hear when the chosen rows change. `{count}` is how many
12721
- rows are chosen. */
13496
+ rows are chosen, written in the locale, and a language that needs plural
13497
+ forms writes them: `{count, plural, one {# wybrany} few {# wybrane} many
13498
+ {# wybranych} other {# wybranego}}`. */
12722
13499
  "selected-label"?: (HelixHeadlessTable["selectedLabel"]) | undefined;
12723
13500
  /** What screen readers hear when the chosen rows change. `{count}` is how many
12724
- rows are chosen. */
13501
+ rows are chosen, written in the locale, and a language that needs plural
13502
+ forms writes them: `{count, plural, one {# wybrany} few {# wybrane} many
13503
+ {# wybranych} other {# wybranego}}`. */
12725
13504
  selectedLabel?: (HelixHeadlessTable["selectedLabel"]) | undefined;
12726
13505
  /** The name of a row's checkbox. `{row}` is replaced with the words of the
12727
13506
  row's first cell. */
@@ -12738,10 +13517,14 @@ first, and refusing it leaves the order as it was. `default-sort` seeds an
12738
13517
  order this element then owns. */
12739
13518
  sort?: (HelixHeadlessTable["sort"]) | undefined;
12740
13519
  /** What screen readers hear when the table is sorted. `{column}` is the
12741
- column's heading and `{order}` is `ascending-label` or `descending-label`. */
13520
+ column's heading and `{direction}` is `ascending` or `descending`, so each
13521
+ order has its whole sentence. `{order}` is the deprecated
13522
+ `ascending-label` or `descending-label`. */
12742
13523
  "sorted-label"?: (HelixHeadlessTable["sortedLabel"]) | undefined;
12743
13524
  /** What screen readers hear when the table is sorted. `{column}` is the
12744
- column's heading and `{order}` is `ascending-label` or `descending-label`. */
13525
+ column's heading and `{direction}` is `ascending` or `descending`, so each
13526
+ order has its whole sentence. `{order}` is the deprecated
13527
+ `ascending-label` or `descending-label`. */
12745
13528
  sortedLabel?: (HelixHeadlessTable["sortedLabel"]) | undefined;
12746
13529
  /** What screen readers hear when the table stops being sorted. */
12747
13530
  "unsorted-label"?: (HelixHeadlessTable["unsortedLabel"]) | undefined;
@@ -12764,6 +13547,10 @@ say that without the component knowing what a row looks like. */
12764
13547
  };
12765
13548
 
12766
13549
  export type HelixHeadlessTableVueEvents = {
13550
+ /** Fired when a row is dropped at a new place, in a `reorderable` table, with every row's key in the new order. Cancelable: cancel it to keep the row where it is. */
13551
+ "helix-before-reorder": HelixHeadlessTableHelixBeforeReorderElementEvent;
13552
+ /** Fired after `helix-before-reorder` when nobody canceled it. Move your rows to the order in `keys`. Cancelable: cancel it to say the move did not happen. */
13553
+ "helix-reorder": HelixHeadlessTableHelixReorderElementEvent;
12767
13554
  /** The selection is about to change. The event carries every selected key, separated by commas. Cancelable: cancel it to keep the current selection. */
12768
13555
  "helix-select": HelixHeadlessTableHelixSelectElementEvent;
12769
13556
  /** Fired after the selection changes, with every selected key, separated by commas. */
@@ -12989,6 +13776,20 @@ export type HelixHeadlessTagVueProps = {
12989
13776
  answering, and in a `Tag.Group` the arrow keys pass over it and it cannot
12990
13777
  be selected or removed. */
12991
13778
  disabled?: (HelixHeadlessTag["disabled"]) | undefined;
13779
+ /** The remove button's name, read by screen readers, with `{label}` for the
13780
+ tag's own words.
13781
+
13782
+ "Remove" rather than the mixin's "Dismiss": a tag is taken out of a set,
13783
+ which is a different act from closing a message. One sentence with the
13784
+ tag's words in it, so a translation puts them where its language does. */
13785
+ "dismiss-label"?: (HelixHeadlessTag["dismissLabel"]) | undefined;
13786
+ /** The remove button's name, read by screen readers, with `{label}` for the
13787
+ tag's own words.
13788
+
13789
+ "Remove" rather than the mixin's "Dismiss": a tag is taken out of a set,
13790
+ which is a different act from closing a message. One sentence with the
13791
+ tag's words in it, so a translation puts them where its language does. */
13792
+ dismissLabel?: (HelixHeadlessTag["dismissLabel"]) | undefined;
12992
13793
  /** Makes the label a link to this address. */
12993
13794
  href?: (HelixHeadlessTag["href"]) | undefined;
12994
13795
  /** What the tag stands for in its group's `value`.
@@ -12997,20 +13798,6 @@ Absent is the tag's own words, its category first. */
12997
13798
  value?: (HelixHeadlessTag["value"]) | undefined;
12998
13799
  /** Whether the element shows a control that dismisses it. */
12999
13800
  dismissible?: (HelixHeadlessTag["dismissible"]) | undefined;
13000
- /** The dismiss control's label, read by screen readers.
13001
-
13002
- `attribute` is spelled out because Lit lowercases a property name to
13003
- derive one rather than dash-casing it, so this would otherwise be
13004
- reachable only as `dismisslabel`, which nobody would guess and no linter
13005
- would catch. */
13006
- "dismiss-label"?: (HelixHeadlessTag["dismissLabel"]) | undefined;
13007
- /** The dismiss control's label, read by screen readers.
13008
-
13009
- `attribute` is spelled out because Lit lowercases a property name to
13010
- derive one rather than dash-casing it, so this would otherwise be
13011
- reachable only as `dismisslabel`, which nobody would guess and no linter
13012
- would catch. */
13013
- dismissLabel?: (HelixHeadlessTag["dismissLabel"]) | undefined;
13014
13801
  /** Whether the tag holds its group's tab stop.
13015
13802
 
13016
13803
  Written by `Tag.Group` on every tag it holds, and unset outside one, which
@@ -13152,18 +13939,22 @@ browser's message. */
13152
13939
  required?: (HelixHeadlessTextarea["required"]) | undefined;
13153
13940
  /** The message shown when the field is required and empty.
13154
13941
 
13155
- **Absent, or empty, is the control's own sentence**, "Choose one to continue." on a
13156
- set and the browser's own on a text field, which the browser writes in
13157
- the reader's language. Every other word a control speaks is a property,
13942
+ **Absent, or empty, is the control's own sentence**, "Choose one to
13943
+ continue." on a set and the browser's own on a text field, which the
13944
+ browser writes in the reader's language. A family with a sentence of its
13945
+ own declares it as this property's English, a word property a page
13946
+ registers for its locale under the family's key. Every other word a control speaks is a property,
13158
13947
  and this one was the English a form in another language still spoke in
13159
13948
  the bubble it raises on submit: `feedback` replaces the message under
13160
13949
  the field and does not reach that one. */
13161
13950
  "value-missing-message"?: (HelixHeadlessTextarea["valueMissingMessage"]) | undefined;
13162
13951
  /** The message shown when the field is required and empty.
13163
13952
 
13164
- **Absent, or empty, is the control's own sentence**, "Choose one to continue." on a
13165
- set and the browser's own on a text field, which the browser writes in
13166
- the reader's language. Every other word a control speaks is a property,
13953
+ **Absent, or empty, is the control's own sentence**, "Choose one to
13954
+ continue." on a set and the browser's own on a text field, which the
13955
+ browser writes in the reader's language. A family with a sentence of its
13956
+ own declares it as this property's English, a word property a page
13957
+ registers for its locale under the family's key. Every other word a control speaks is a property,
13167
13958
  and this one was the English a form in another language still spoke in
13168
13959
  the bubble it raises on submit: `feedback` replaces the message under
13169
13960
  the field and does not reach that one. */
@@ -13292,14 +14083,14 @@ on why a wheel cannot do either. */
13292
14083
  /** The message shown when a range holds more than two times.
13293
14084
 
13294
14085
  **Every sentence a control raises in the browser's bubble is a property**,
13295
- so a form in another language speaks it. Absent is the control's own
13296
- sentence, in English. */
14086
+ so a form in another language speaks it. Unset is the sentence registered
14087
+ for the page's language, then the English. */
13297
14088
  "range-length-message"?: (HelixHeadlessTimeInput["rangeLengthMessage"]) | undefined;
13298
14089
  /** The message shown when a range holds more than two times.
13299
14090
 
13300
14091
  **Every sentence a control raises in the browser's bubble is a property**,
13301
- so a form in another language speaks it. Absent is the control's own
13302
- sentence, in English. */
14092
+ so a form in another language speaks it. Unset is the sentence registered
14093
+ for the page's language, then the English. */
13303
14094
  rangeLengthMessage?: (HelixHeadlessTimeInput["rangeLengthMessage"]) | undefined;
13304
14095
  /** The message shown when a time is after `max`, with `{max}` filled in as
13305
14096
  the field displays it. */
@@ -13369,12 +14160,28 @@ not touch, and React reads that as a hydration mismatch. The absent
13369
14160
  attribute *is* the list, which the stylesheet reads as the base rule, so
13370
14161
  only the departure has to be named. */
13371
14162
  variant?: (HelixHeadlessTimeInput["variant"]) | undefined;
14163
+ /** What a row of segments reports when the field is required and every
14164
+ segment is empty, where `value-missing-message` is not set. `{kind}` is
14165
+ `date` or `time`. */
14166
+ "empty-message"?: (HelixHeadlessTimeInput["emptyMessage"]) | undefined;
14167
+ /** What a row of segments reports when the field is required and every
14168
+ segment is empty, where `value-missing-message` is not set. `{kind}` is
14169
+ `date` or `time`. */
14170
+ emptyMessage?: (HelixHeadlessTimeInput["emptyMessage"]) | undefined;
13372
14171
  /** What a screen reader hears for a segment with nothing in it, which a
13373
14172
  sighted reader sees as dashes. */
13374
14173
  "empty-segment-label"?: (HelixHeadlessTimeInput["emptySegmentLabel"]) | undefined;
13375
14174
  /** What a screen reader hears for a segment with nothing in it, which a
13376
14175
  sighted reader sees as dashes. */
13377
14176
  emptySegmentLabel?: (HelixHeadlessTimeInput["emptySegmentLabel"]) | undefined;
14177
+ /** What a row of segments reports while some segments are set and others
14178
+ are not, where `bad-input-message` is not set. `{kind}` is `date` or
14179
+ `time`. */
14180
+ "incomplete-message"?: (HelixHeadlessTimeInput["incompleteMessage"]) | undefined;
14181
+ /** What a row of segments reports while some segments are set and others
14182
+ are not, where `bad-input-message` is not set. `{kind}` is `date` or
14183
+ `time`. */
14184
+ incompleteMessage?: (HelixHeadlessTimeInput["incompleteMessage"]) | undefined;
13378
14185
  /** Whether the field is a row of segments, one for each part of the date or
13379
14186
  time, in place of a line of text.
13380
14187
 
@@ -13456,6 +14263,12 @@ as `+3`, does not say what it does. */
13456
14263
  "max-tags"?: (HelixHeadlessTimeInput["maxTags"] | `${number}`) | undefined;
13457
14264
  /** How many tokens to show before the rest become a count. */
13458
14265
  maxTags?: (HelixHeadlessTimeInput["maxTags"]) | undefined;
14266
+ /** The count of the tokens past `max-tags`, as it is shown, with `{count}`
14267
+ for the number, written in the element's locale. */
14268
+ "rest-text"?: (HelixHeadlessTimeInput["restText"]) | undefined;
14269
+ /** The count of the tokens past `max-tags`, as it is shown, with `{count}`
14270
+ for the number, written in the element's locale. */
14271
+ restText?: (HelixHeadlessTimeInput["restText"]) | undefined;
13459
14272
  /** The value the control starts with. A form reset returns it to this value,
13460
14273
  and to the `value` attribute where this one is not written, as a native
13461
14274
  control resets to the `value` it declares. */
@@ -13485,18 +14298,22 @@ browser's message. */
13485
14298
  required?: (HelixHeadlessTimeInput["required"]) | undefined;
13486
14299
  /** The message shown when the field is required and empty.
13487
14300
 
13488
- **Absent, or empty, is the control's own sentence**, "Choose one to continue." on a
13489
- set and the browser's own on a text field, which the browser writes in
13490
- the reader's language. Every other word a control speaks is a property,
14301
+ **Absent, or empty, is the control's own sentence**, "Choose one to
14302
+ continue." on a set and the browser's own on a text field, which the
14303
+ browser writes in the reader's language. A family with a sentence of its
14304
+ own declares it as this property's English, a word property a page
14305
+ registers for its locale under the family's key. Every other word a control speaks is a property,
13491
14306
  and this one was the English a form in another language still spoke in
13492
14307
  the bubble it raises on submit: `feedback` replaces the message under
13493
14308
  the field and does not reach that one. */
13494
14309
  "value-missing-message"?: (HelixHeadlessTimeInput["valueMissingMessage"]) | undefined;
13495
14310
  /** The message shown when the field is required and empty.
13496
14311
 
13497
- **Absent, or empty, is the control's own sentence**, "Choose one to continue." on a
13498
- set and the browser's own on a text field, which the browser writes in
13499
- the reader's language. Every other word a control speaks is a property,
14312
+ **Absent, or empty, is the control's own sentence**, "Choose one to
14313
+ continue." on a set and the browser's own on a text field, which the
14314
+ browser writes in the reader's language. A family with a sentence of its
14315
+ own declares it as this property's English, a word property a page
14316
+ registers for its locale under the family's key. Every other word a control speaks is a property,
13500
14317
  and this one was the English a form in another language still spoke in
13501
14318
  the bubble it raises on submit: `feedback` replaces the message under
13502
14319
  the field and does not reach that one. */
@@ -13569,13 +14386,19 @@ export type HelixHeadlessTimePickerVueProps = {
13569
14386
 
13570
14387
  **Every sentence a control raises in the browser's bubble is a property**,
13571
14388
  named for the validity flag it reports, so a form in another language
13572
- speaks it. Absent is the control's own sentence, in English. */
14389
+ speaks it. Unset is the sentence registered for the page's language, then
14390
+ the English. `{shape}` is how a time is written, `HH:mm` or `HH:mm:ss`, and
14391
+ `{mode}` is `single`, `range` or `multiple`, so each can have its own
14392
+ sentence. */
13573
14393
  "bad-input-message"?: (HelixHeadlessTimePicker["badInputMessage"]) | undefined;
13574
14394
  /** The validation message for a value that is not a time.
13575
14395
 
13576
14396
  **Every sentence a control raises in the browser's bubble is a property**,
13577
14397
  named for the validity flag it reports, so a form in another language
13578
- speaks it. Absent is the control's own sentence, in English. */
14398
+ speaks it. Unset is the sentence registered for the page's language, then
14399
+ the English. `{shape}` is how a time is written, `HH:mm` or `HH:mm:ss`, and
14400
+ `{mode}` is `single`, `range` or `multiple`, so each can have its own
14401
+ sentence. */
13579
14402
  badInputMessage?: (HelixHeadlessTimePicker["badInputMessage"]) | undefined;
13580
14403
  /** Times that cannot be chosen, as `HH:mm`, separated by commas or spaces.
13581
14404
 
@@ -13931,14 +14754,22 @@ A subset of the tone axis: a toast reports a status and never a brand role. */
13931
14754
  `attribute` is spelled out because Lit lowercases a property name to
13932
14755
  derive one rather than dash-casing it, so this would otherwise be
13933
14756
  reachable only as `dismisslabel`, which nobody would guess and no linter
13934
- would catch. */
14757
+ would catch.
14758
+
14759
+ A word property: register it for a locale under the host's key. A family
14760
+ that names the control otherwise, such as Tag's `Remove {label}`,
14761
+ declares its own English with `@words` above the override. */
13935
14762
  "dismiss-label"?: (HelixHeadlessToastItem["dismissLabel"]) | undefined;
13936
14763
  /** The dismiss control's label, read by screen readers.
13937
14764
 
13938
14765
  `attribute` is spelled out because Lit lowercases a property name to
13939
14766
  derive one rather than dash-casing it, so this would otherwise be
13940
14767
  reachable only as `dismisslabel`, which nobody would guess and no linter
13941
- would catch. */
14768
+ would catch.
14769
+
14770
+ A word property: register it for a locale under the host's key. A family
14771
+ that names the control otherwise, such as Tag's `Remove {label}`,
14772
+ declares its own English with `@words` above the override. */
13942
14773
  dismissLabel?: (HelixHeadlessToastItem["dismissLabel"]) | undefined;
13943
14774
  };
13944
14775
 
@@ -13958,7 +14789,9 @@ export type HelixHeadlessToastHelixDismissElementEvent =
13958
14789
 
13959
14790
  export type HelixHeadlessToastVueProps = {
13960
14791
  /** The key that takes focus to the stack and back, such as `F8` or `Alt+T`:
13961
- keys joined by `+`, the last one the key. Empty turns it off. */
14792
+ keys joined by `+`, the last one the key, as `Announcement`'s `hotkey`
14793
+ reads them: `mod` is Command on Apple devices and Control elsewhere.
14794
+ Empty turns it off. */
13962
14795
  hotkey?: (HelixHeadlessToast["hotkey"]) | undefined;
13963
14796
  /** Accessible name for the region, with `{hotkey}` filled in. Translate it with
13964
14797
  the rest of your interface. */
@@ -14082,18 +14915,22 @@ browser's message. */
14082
14915
  required?: (HelixHeadlessToggleGroup["required"]) | undefined;
14083
14916
  /** The message shown when the field is required and empty.
14084
14917
 
14085
- **Absent, or empty, is the control's own sentence**, "Choose one to continue." on a
14086
- set and the browser's own on a text field, which the browser writes in
14087
- the reader's language. Every other word a control speaks is a property,
14918
+ **Absent, or empty, is the control's own sentence**, "Choose one to
14919
+ continue." on a set and the browser's own on a text field, which the
14920
+ browser writes in the reader's language. A family with a sentence of its
14921
+ own declares it as this property's English, a word property a page
14922
+ registers for its locale under the family's key. Every other word a control speaks is a property,
14088
14923
  and this one was the English a form in another language still spoke in
14089
14924
  the bubble it raises on submit: `feedback` replaces the message under
14090
14925
  the field and does not reach that one. */
14091
14926
  "value-missing-message"?: (HelixHeadlessToggleGroup["valueMissingMessage"]) | undefined;
14092
14927
  /** The message shown when the field is required and empty.
14093
14928
 
14094
- **Absent, or empty, is the control's own sentence**, "Choose one to continue." on a
14095
- set and the browser's own on a text field, which the browser writes in
14096
- the reader's language. Every other word a control speaks is a property,
14929
+ **Absent, or empty, is the control's own sentence**, "Choose one to
14930
+ continue." on a set and the browser's own on a text field, which the
14931
+ browser writes in the reader's language. A family with a sentence of its
14932
+ own declares it as this property's English, a word property a page
14933
+ registers for its locale under the family's key. Every other word a control speaks is a property,
14097
14934
  and this one was the English a form in another language still spoke in
14098
14935
  the bubble it raises on submit: `feedback` replaces the message under
14099
14936
  the field and does not reach that one. */
@@ -14286,6 +15123,14 @@ default slot is the trigger, which is the older form.
14286
15123
  Names an element in the same tree, so a tooltip inside another component's
14287
15124
  shadow root points at one in that root rather than one in the document.
14288
15125
 
15126
+ Give the tooltip an `id` and name it in the trigger's `aria-describedby`,
15127
+ so the trigger is described in the server's markup and at rest:
15128
+
15129
+ ```html
15130
+ <button aria-describedby="save-tip" id="save">Save</button>
15131
+ <helix-headless-tooltip content="Save your work" for="save" id="save-tip"></helix-headless-tooltip>
15132
+ ```
15133
+
14289
15134
  **In React this arrives as a property and not as an attribute**, which is
14290
15135
  worth knowing before someone reads the DOM and thinks it did not take.
14291
15136
  Measured against React 19.2.8: `for` exists on the prototype, so React sets
@@ -14448,11 +15293,11 @@ The shape is `Carousel`'s, which is the nearest thing in the library: a
14448
15293
  nextLabel?: (HelixHeadlessTour["nextLabel"]) | undefined;
14449
15294
  /** Draws each stop's place in the run in its panel, as well as saying it. */
14450
15295
  progress?: (HelixHeadlessTour["progress"]) | undefined;
14451
- /** Each stop's place in the run, with `{index}` and `{count}` filled in.
14452
- Translate it with the rest of your text. */
15296
+ /** Each stop's place in the run, with `{index}` and `{count}` filled in and
15297
+ written in the locale. Translate it with the rest of your text. */
14453
15298
  "progress-label"?: (HelixHeadlessTour["progressLabel"]) | undefined;
14454
- /** Each stop's place in the run, with `{index}` and `{count}` filled in.
14455
- Translate it with the rest of your text. */
15299
+ /** Each stop's place in the run, with `{index}` and `{count}` filled in and
15300
+ written in the locale. Translate it with the rest of your text. */
14456
15301
  progressLabel?: (HelixHeadlessTour["progressLabel"]) | undefined;
14457
15302
  /** Label for the control that leaves the tour. */
14458
15303
  "skip-label"?: (HelixHeadlessTour["skipLabel"]) | undefined;
@@ -14683,16 +15528,40 @@ export type HelixHeadlessTreeHelixActivateElementEvent =
14683
15528
  /** `helix-before-activate` event type */
14684
15529
  export type HelixHeadlessTreeHelixBeforeActivateElementEvent =
14685
15530
  HelixHeadlessTreeElementEvent<HelixBeforeActivateEvent>;
15531
+ /** `helix-before-reorder` event type */
15532
+ export type HelixHeadlessTreeHelixBeforeReorderElementEvent =
15533
+ HelixHeadlessTreeElementEvent<HelixBeforeReorderEvent>;
15534
+ /** `helix-reorder` event type */
15535
+ export type HelixHeadlessTreeHelixReorderElementEvent =
15536
+ HelixHeadlessTreeElementEvent<HelixReorderEvent>;
14686
15537
  /** `helix-select` event type */
14687
15538
  export type HelixHeadlessTreeHelixSelectElementEvent =
14688
15539
  HelixHeadlessTreeElementEvent<HelixSelectEvent>;
14689
15540
 
14690
15541
  export type HelixHeadlessTreeVueProps = {
15542
+ /** What screen readers hear when a held item is put back, or a move is
15543
+ refused, in a `reorderable` tree. */
15544
+ "canceled-label"?: (HelixHeadlessTree["canceledLabel"]) | undefined;
15545
+ /** What screen readers hear when a held item is put back, or a move is
15546
+ refused, in a `reorderable` tree. */
15547
+ canceledLabel?: (HelixHeadlessTree["canceledLabel"]) | undefined;
15548
+ /** What screen readers hear when a held item is dropped, in a `reorderable` tree. */
15549
+ "dropped-label"?: (HelixHeadlessTree["droppedLabel"]) | undefined;
15550
+ /** What screen readers hear when a held item is dropped, in a `reorderable` tree. */
15551
+ droppedLabel?: (HelixHeadlessTree["droppedLabel"]) | undefined;
14691
15552
  /** Accessible name for the tree.
14692
15553
 
14693
15554
  An `aria-label` or `aria-labelledby` on the host names the tree too, and
14694
15555
  wins over this. */
14695
15556
  label?: (HelixHeadlessTree["label"]) | undefined;
15557
+ /** What screen readers hear each time an item moves, in a `reorderable`
15558
+ tree. `{name}` is the item's words, `{position}` its place among its
15559
+ siblings, counting from 1, and `{count}` the number of siblings. */
15560
+ "moved-label"?: (HelixHeadlessTree["movedLabel"]) | undefined;
15561
+ /** What screen readers hear each time an item moves, in a `reorderable`
15562
+ tree. `{name}` is the item's words, `{position}` its place among its
15563
+ siblings, counting from 1, and `{count}` the number of siblings. */
15564
+ movedLabel?: (HelixHeadlessTree["movedLabel"]) | undefined;
14696
15565
  /** What a deeper level means: `peer` for no change, `subordinate` for a lower
14697
15566
  rank, or `heading` for a parent that heads the items under it.
14698
15567
 
@@ -14728,6 +15597,16 @@ branch as a label; a headless consumer reads the attribute and the
14728
15597
  written here appears in the served markup of every tree anybody renders.
14729
15598
  The resting state is the absence of the attribute, which is `peer`. */
14730
15599
  nesting?: (HelixHeadlessTree["nesting"]) | undefined;
15600
+ /** What screen readers hear when a click on a grip picks up an item, in a
15601
+ `reorderable` tree. `{name}` is the item's words. */
15602
+ "picked-up-label"?: (HelixHeadlessTree["pickedUpLabel"]) | undefined;
15603
+ /** What screen readers hear when a click on a grip picks up an item, in a
15604
+ `reorderable` tree. `{name}` is the item's words. */
15605
+ pickedUpLabel?: (HelixHeadlessTree["pickedUpLabel"]) | undefined;
15606
+ /** Lets you move items among their siblings, by dragging a grip or with Alt
15607
+ and an arrow. The tree moves no item itself: you move your data on
15608
+ `helix-reorder`. */
15609
+ reorderable?: (HelixHeadlessTree["reorderable"]) | undefined;
14731
15610
  /** Whether a reader can check many items, or choose only the items at the
14732
15611
  ends. Unset, one item is chosen at a time, branches included.
14733
15612
 
@@ -14779,14 +15658,20 @@ export type HelixHeadlessTreeVueEvents = {
14779
15658
  "helix-activate": HelixHeadlessTreeHelixActivateElementEvent;
14780
15659
  /** Fired before the current node changes, and cancelable. Canceling it is the only way to stop the change. */
14781
15660
  "helix-before-activate": HelixHeadlessTreeHelixBeforeActivateElementEvent;
15661
+ /** Fired when an item is dropped at a new place among its siblings, in a `reorderable` tree, with the siblings' keys in the new order. Cancelable: cancel it to keep the item where it is. */
15662
+ "helix-before-reorder": HelixHeadlessTreeHelixBeforeReorderElementEvent;
15663
+ /** Fired after `helix-before-reorder` when nobody canceled it. Move your items to the order in `keys`, each an item's `value`, or its words where it has none. Cancelable: cancel it to say the move did not happen. */
15664
+ "helix-reorder": HelixHeadlessTreeHelixReorderElementEvent;
14782
15665
  /** Fired when an item is chosen. The item sends it, and you can listen for it on the tree. Cancelable: canceling it changes nothing. */
14783
15666
  "helix-select": HelixHeadlessTreeHelixSelectElementEvent;
14784
15667
  };
14785
15668
 
14786
15669
  export type HelixHeadlessTrendVueProps = {
14787
- /** The word read out after the direction when the move is an improvement. */
15670
+ /** The word read out after the direction when the move is an improvement,
15671
+ `{betterLabel}` in `judgment-label`. */
14788
15672
  "better-label"?: (HelixHeadlessTrend["betterLabel"]) | undefined;
14789
- /** The word read out after the direction when the move is an improvement. */
15673
+ /** The word read out after the direction when the move is an improvement,
15674
+ `{betterLabel}` in `judgment-label`. */
14790
15675
  betterLabel?: (HelixHeadlessTrend["betterLabel"]) | undefined;
14791
15676
  /** Which way the measurement moved, as `movement` says it. */
14792
15677
  direction?: (HelixHeadlessTrend["direction"]) | undefined;
@@ -14825,9 +15710,23 @@ revenue up is good news and latency up is bad news, and only the consumer
14825
15710
  knows which one this is. Set it once per metric and it holds while the
14826
15711
  movement changes underneath. */
14827
15712
  good?: (HelixHeadlessTrend["good"]) | undefined;
14828
- /** The locale `value` is written in, such as `de` for `1.234,5`.
14829
-
14830
- Absent uses the runtime's own. Set it on a page rendered on a server, so
15713
+ /** What the `direction` part says. `{direction}` is the word for the
15714
+ movement, `up-label`, `down-label` or `unchanged-label`, and
15715
+ `{judgment}` is `better` or `worse` where `good` judges the move, so a
15716
+ language whose words agree with the movement writes each phrase whole:
15717
+ `{judgment, select, better {...} worse {...} other {...}}`.
15718
+ `{betterLabel}` and `{worseLabel}` are `better-label` and `worse-label`. */
15719
+ "judgment-label"?: (HelixHeadlessTrend["judgmentLabel"]) | undefined;
15720
+ /** What the `direction` part says. `{direction}` is the word for the
15721
+ movement, `up-label`, `down-label` or `unchanged-label`, and
15722
+ `{judgment}` is `better` or `worse` where `good` judges the move, so a
15723
+ language whose words agree with the movement writes each phrase whole:
15724
+ `{judgment, select, better {...} worse {...} other {...}}`.
15725
+ `{betterLabel}` and `{worseLabel}` are `better-label` and `worse-label`. */
15726
+ judgmentLabel?: (HelixHeadlessTrend["judgmentLabel"]) | undefined;
15727
+ /** The locale the words and `value` are in, such as `de` for `1.234,5`.
15728
+
15729
+ Absent reads the nearest `lang`, then the runtime's own. Set it on a page rendered on a server, so
14831
15730
  the server and the browser write the figure alike. */
14832
15731
  locale?: (HelixHeadlessTrend["locale"]) | undefined;
14833
15732
  /** Which way the measurement moved.
@@ -14856,9 +15755,11 @@ both are written. The size is written in the `value` part with
14856
15755
  `format-options` and `locale`, in place of a slotted metric. Absent leaves
14857
15756
  the movement to `movement` and the metric to the slot. */
14858
15757
  value?: (HelixHeadlessTrend["value"]) | undefined;
14859
- /** The word read out after the direction when the move is a setback. */
15758
+ /** The word read out after the direction when the move is a setback,
15759
+ `{worseLabel}` in `judgment-label`. */
14860
15760
  "worse-label"?: (HelixHeadlessTrend["worseLabel"]) | undefined;
14861
- /** The word read out after the direction when the move is a setback. */
15761
+ /** The word read out after the direction when the move is a setback,
15762
+ `{worseLabel}` in `judgment-label`. */
14862
15763
  worseLabel?: (HelixHeadlessTrend["worseLabel"]) | undefined;
14863
15764
  };
14864
15765
 
@@ -15143,9 +16044,11 @@ ours to promise: the attribute is ignored cross-origin, so a file served
15143
16044
  from somewhere else opens rather than saves, which is the browser's rule
15144
16045
  and not something a player can work around. */
15145
16046
  extraControls?: (HelixHeadlessVideo["extraControls"]) | undefined;
15146
- /** What the control that skips ahead is called, with `{seconds}` filled in. */
16047
+ /** What the control that skips ahead is called. `{seconds}` is how far, written
16048
+ in the locale, and each language writes the forms it has. */
15147
16049
  "forward-label"?: (HelixHeadlessVideo["forwardLabel"]) | undefined;
15148
- /** What the control that skips ahead is called, with `{seconds}` filled in. */
16050
+ /** What the control that skips ahead is called. `{seconds}` is how far, written
16051
+ in the locale, and each language writes the forms it has. */
15149
16052
  forwardLabel?: (HelixHeadlessVideo["forwardLabel"]) | undefined;
15150
16053
  /** What the control that fills the screen is called.
15151
16054
 
@@ -15239,9 +16142,13 @@ bar: two of the same control is worse than either placement. */
15239
16142
  "pause-label"?: (HelixHeadlessVideo["pauseLabel"]) | undefined;
15240
16143
  /** The name of the play control while pressing it would pause the video. */
15241
16144
  pauseLabel?: (HelixHeadlessVideo["pauseLabel"]) | undefined;
15242
- /** How the volume is read out, with `{percent}` filled in. */
16145
+ /** How the volume is read out. `{percent}` is the volume from 0 to 100,
16146
+ written in the locale, and a language that needs plural forms writes them
16147
+ with `{percent, plural, ...}`. */
15243
16148
  "percent-label"?: (HelixHeadlessVideo["percentLabel"]) | undefined;
15244
- /** How the volume is read out, with `{percent}` filled in. */
16149
+ /** How the volume is read out. `{percent}` is the volume from 0 to 100,
16150
+ written in the locale, and a language that needs plural forms writes them
16151
+ with `{percent, plural, ...}`. */
15245
16152
  percentLabel?: (HelixHeadlessVideo["percentLabel"]) | undefined;
15246
16153
  /** What the control that floats the video over other windows is called. */
15247
16154
  "pip-label"?: (HelixHeadlessVideo["pipLabel"]) | undefined;
@@ -15273,9 +16180,11 @@ this is what a screen reader calls it on arriving. */
15273
16180
  "remote-label"?: (HelixHeadlessVideo["remoteLabel"]) | undefined;
15274
16181
  /** What the control that casts the video to another device is called. */
15275
16182
  remoteLabel?: (HelixHeadlessVideo["remoteLabel"]) | undefined;
15276
- /** What the control that skips back is called, with `{seconds}` filled in. */
16183
+ /** What the control that skips back is called. `{seconds}` is how far, written
16184
+ in the locale, and each language writes the forms it has. */
15277
16185
  "rewind-label"?: (HelixHeadlessVideo["rewindLabel"]) | undefined;
15278
- /** What the control that skips back is called, with `{seconds}` filled in. */
16186
+ /** What the control that skips back is called. `{seconds}` is how far, written
16187
+ in the locale, and each language writes the forms it has. */
15279
16188
  rewindLabel?: (HelixHeadlessVideo["rewindLabel"]) | undefined;
15280
16189
  /** What the scrubber is called. */
15281
16190
  "seek-label"?: (HelixHeadlessVideo["seekLabel"]) | undefined;
@@ -15475,7 +16384,8 @@ arrive. The list does not ask for more while it is set. */
15475
16384
  loadingLabel?: (HelixHeadlessVirtualList["loadingLabel"]) | undefined;
15476
16385
  /** Places each row by its own measured height. Without it, rows are placed
15477
16386
  by one height: `estimate` until rows are drawn, then the drawn rows' height,
15478
- read once.
16387
+ read once. Rows that come out different heights are placed by their own
16388
+ heights either way.
15479
16389
 
15480
16390
  **Off by default, because the straight line is better when it holds.** One
15481
16391
  height makes offset and index convert by division, which can never
@@ -15539,6 +16449,8 @@ export type CustomCssProperties = {
15539
16449
  "--bar-chart-secondary"?: (string) | undefined;
15540
16450
  /** The gradient for a bar, named per bar so the styled tier can use it as the `fill`. It is always drawn, and used only when `wash="gradient"` is set. */
15541
16451
  "--chart-bar-wash"?: (string) | undefined;
16452
+ /** Written on the control inside each toggle button of a group with `selection-mode`: `1` while it is pressed and `0` while it is not. Read it in a `::part(button)` rule to draw the pressed look. */
16453
+ "--button-group-pressed"?: (string) | undefined;
15542
16454
  /** Space between slides. Your stylesheet sets it, and the component uses it to measure the run. */
15543
16455
  "--carousel-gap"?: (string) | undefined;
15544
16456
  /** The size of one pane. Your stylesheet sets it, and the component uses it to measure the run. */
@@ -15721,7 +16633,7 @@ export interface WcToolkitVueGlobalComponents {
15721
16633
  HelixHeadlessAccordionVueProps,
15722
16634
  HelixHeadlessAccordionVueEvents
15723
16635
  >;
15724
- /** 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. While the region holds the copy, the message itself is hidden from screen readers, so it is in the page once. 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. It stops while the page is hidden too, in another tab or a minimized window, so the message is not spent where nobody can see it. While the clock is stopped the announcement carries ':state(paused)'. When the time runs out it sends 'helix-dismiss', as the button does. */
16636
+ /** 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. While the region holds the copy, the message itself is hidden from screen readers, so it is in the page once. 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. **The announcement is a landmark region**, named by 'label', "Announcement" unless you set it, so a screen reader lists it among the page's regions. 'hotkey', F6 unless you set it, moves focus to the announcement's first control, an action or the dismiss button, and pressed there moves focus back to where it was, as React Aria's toast region does. An announcement with no control leaves the key to the browser. When an announcement that the key moved focus into is removed with focus still inside, focus goes back to where it was before the key. **Set 'queued' to show several announcements one at a time.** A queued announcement waits while a queued announcement before it in the same parent is still there, and shows when that one is removed: its message is then read out, and its 'duration' starts. While it waits it renders nothing, is no region, and carries ':state(waiting)'. A server cannot see the announcements beside it, so a served page shows every one until the script runs. 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. It stops while the page is hidden too, in another tab or a minimized window, so the message is not spent where nobody can see it. While the clock is stopped the announcement carries ':state(paused)'. When the time runs out it sends 'helix-dismiss', as the button does. */
15725
16637
  "helix-headless-announcement": DefineCustomElement<
15726
16638
  HelixHeadlessAnnouncement,
15727
16639
  HelixHeadlessAnnouncementVueProps,
@@ -15763,7 +16675,7 @@ export interface WcToolkitVueGlobalComponents {
15763
16675
  HelixHeadlessBarChartVueProps,
15764
16676
  HelixHeadlessBarChartVueEvents
15765
16677
  >;
15766
- /** Renders a '<figure>' holding the '<blockquote>' and a '<figcaption>' for the attribution, the structure the HTML spec describes. The attribution sits outside the quotation because it is about the quotation, and it names the figure, so a screen reader reads the source as the figure's caption. The figure keeps the browser's default margins on this tier. Set '::part(figure) { margin: 0 }' where they are unwanted. For a quotation inside a sentence, use 'Quote'. */
16678
+ /** Renders a figure holding the '<blockquote>' and a caption for the attribution, the structure the HTML spec describes. The attribution sits outside the quotation because it is about the quotation, and it names the figure, so a screen reader reads the source as the figure's caption. **The figure is a '<div role="figure">'**, so the headless tier draws no space around the quotation. A '<figure>' takes a 40px indent and a line of space above and below from the browser's own sheet, which every page had to reset. The '<blockquote>' keeps its own margins, as a bare one does. A screen reader meets the same figure, named by its caption. **A figure only while there is an attribution.** With nothing in the caption the figure has no name and nothing to say, so the role and its name are dropped and a reader meets the quotation alone. A server cannot see what is slotted, so it serves the figure, and the client drops it after hydration; an 'attribution' written as words is served exactly. **Quotation marks follow the language**, under 'marks'. The opening mark is the one the browser sets for a '<q>' in the element's language, „ under 'lang="de"' and « under 'lang="fr"', and a 'Quote' inside the passage takes the inner marks. The mark is drawn, not read: a screen reader hears the passage. A passage under 'marks' that starts with a mark typed into the text would show two, and warns once, with the runtime kind 'typed-marks'. **'cite' is the source's URL**, which the browser keeps and does not show. Words in it, such as the author's name, warn once, with the runtime kind 'cite-not-url'. For a quotation inside a sentence, use 'Quote'. */
15767
16679
  "helix-headless-blockquote": DefineCustomElement<
15768
16680
  HelixHeadlessBlockquote,
15769
16681
  HelixHeadlessBlockquoteVueProps,
@@ -15781,7 +16693,7 @@ export interface WcToolkitVueGlobalComponents {
15781
16693
  HelixHeadlessBreadcrumbsVueProps,
15782
16694
  HelixHeadlessBreadcrumbsVueEvents
15783
16695
  >;
15784
- /** Sets 'role="group"' on the host through internals, and 'label' names the group. Without a name, a screen reader announces the buttons as separate controls, and a development build warns once with the kind 'missing-name'. The group does not manage focus, so each button keeps its own tab stop. For one tab stop with arrow keys between the buttons, the APG toolbar pattern, use Toolbar. Buttons are slotted, so they stay your own elements and keep their own appearance and size. */
16696
+ /** Sets 'role="group"' on the host through internals, and 'label' names the group. Without a name, a screen reader announces the buttons as separate controls, and a development build warns once with the kind 'missing-name'. The group does not manage focus, so each button keeps its own tab stop. For one tab stop with arrow keys between a mix of controls, the APG toolbar pattern, use Toolbar. Buttons are slotted, so they stay your own elements and keep their own appearance and size. **Buttons that stay pressed.** With 'selection-mode', each button with a 'value' is a toggle button: a press presses or releases it, and it says so with 'aria-pressed'. 'single' keeps one pressed at a time, and a press on the pressed one releases it. 'multiple' lets any number be pressed. 'value' is the pressed values, comma separated. A press sends a cancelable 'helix-before-change' with the value it would leave, then 'change'. The pressed state is written on the control inside each button's shadow root, so the markup you rendered is never changed and a framework hydrating it sees what its server sent. That is also why only Helix buttons are toggles: a native '<button>' or a button without a 'value' stays a plain action button in the group, and a native one without its own 'aria-pressed' warns once, with the runtime kind 'untold-toggle'. The inner control also carries '--button-group-pressed', '1' or '0', for a '::part(button)' rule of yours. Use Toggle Group instead for a choice that belongs in a form, or one where the arrow keys choose as they move: it is a 'radiogroup' of options with a form value, 'required' and validation. A Button Group in a selection mode is a set of actions that stay on, such as bold and italic, or a view that a press switches, and it submits nothing. **Keyboard.** In a selection mode the group is one tab stop: the button focus was last on, then the first pressed one, then the first one. | Key | What it does | |---|---| | Right, Down | Moves to the next button, from the last back to the first. | | Left, Up | Moves to the button before, from the first round to the last. | | Home, End | Moves to the first or the last button. | | Space, Enter | Presses or releases the focused button. | Left and Right swap on a right-to-left page, and a disabled button is passed over. In a selection mode the group is a 'toolbar', with 'aria-orientation' under 'orientation="vertical"'. Inside a toolbar it stays a named 'group', and the toolbar's own arrow keys walk its buttons, so a reader meets one toolbar. */
15785
16697
  "helix-headless-button-group": DefineCustomElement<
15786
16698
  HelixHeadlessButtonGroup,
15787
16699
  HelixHeadlessButtonGroupVueProps,
@@ -15811,7 +16723,7 @@ export interface WcToolkitVueGlobalComponents {
15811
16723
  HelixHeadlessCanvasNodeVueProps,
15812
16724
  HelixHeadlessCanvasNodeVueEvents
15813
16725
  >;
15814
- /** A board of cards and connectors, drawn by Helix. On a canvas every position is data that someone placed, so drawing is arithmetic over rectangles with no layout to compute. 'Map' takes a slotted map, because another renderer draws its tiles. The format is [JSON Canvas](https://jsoncanvas.org), an open format. Each node has an 'x', 'y', 'width', 'height', and a type. Each edge names the two nodes it joins and the sides it leaves and arrives on. A card belongs to a group when it sits inside the group's bounds. The cards are text in the DOM, so a screen reader can read them. The family adds a reading order and states each card's connections as text. 'order' sets the reading order: - 'spatial' bands the cards into rows. - 'edges' follows the arrows, starting from the cards that nothing points to. **Cards move by default.** The board writes the new 'x' and 'y' onto the card, the way an input writes its own value, and dispatches two events: - 'helix-before-move' for every step. Cancel it to hold the positions in your own state and apply them yourself. - 'helix-move' once the move is finished. A resize dispatches the same pair with a size. Set 'readonly' on the board to keep every card in place, such as on a published board. Set 'readonly' on one card or connection to keep only that one in place. Keyboard behavior: - One card holds the board's tab stop. - The arrow keys move through the cards in reading order. The card you land on scrolls into view, and its connections are announced with it. - Shift with an arrow key moves the card. - The connections leaving a card are stops of their own, straight after it. Enter on one moves to the card it arrives at. Every drag also works with clicks, as WCAG 2.5.7 requires for a pointer that cannot hold a button down. Click a selected card's move handle, a corner, a card's connection point, or the end of a selected connection to pick it up. It follows the pointer with no button held, and the next click puts it down where a drag would have. On touch, the next tap sets where it lands. Escape, or a press outside the board, puts it back. Connecting and removing dispatch requests, and your code applies them: - Drawing from a card's handle to another card, or pressing C on one card and Enter on another, dispatches 'helix-connect'. - Delete on a card or a connection dispatches 'helix-remove'. The event names every connection that removing the card would leave without an end. The board applies a move itself, because the card already exists. A connection is a new element, and React discards an element the board adds to its markup on the next render, so you write the connection. Cards and connections are 'helix-canvas-node' and 'helix-canvas-edge' elements, so they are in the served markup whichever renderer wrote them. The library fetches nothing, and an array passed to an element is missing from the first paint of a server-rendered React page. 'fromJsonCanvas' turns a JSON Canvas document into their props, and 'toJsonCanvas()' writes a board back out. */
16726
+ /** A board of cards and connectors, drawn by Helix. On a canvas every position is data that someone placed, so drawing is arithmetic over rectangles with no layout to compute. 'Map' takes a slotted map, because another renderer draws its tiles. The format is [JSON Canvas](https://jsoncanvas.org), an open format. Each node has an 'x', 'y', 'width', 'height', and a type. Each edge names the two nodes it joins and the sides it leaves and arrives on. A card belongs to a group when it sits inside the group's bounds. The cards are text in the DOM, so a screen reader can read them. The family adds a reading order and states each card's connections as text. 'order' sets the reading order: - 'spatial' bands the cards into rows. - 'edges' follows the arrows, starting from the cards that nothing points to. **Cards move by default.** The board writes the new 'x' and 'y' onto the card, the way an input writes its own value, and dispatches two events: - 'helix-before-move' for every step. Cancel it to hold the positions in your own state and apply them yourself. - 'helix-move' once the move is finished. A resize dispatches the same pair with a size. Set 'readonly' on the board to keep every card in place, such as on a published board. Set 'readonly' on one card or connection to keep only that one in place. Set 'snap' to a length in the document's units, such as '32', and a card that is moved or resized lands on a multiple of it. Carrying a card, a corner, a connection, or the selection box near the edge of the board moves the board under it, so a card can be taken to a place off screen in one drag. A connection let go within 20 pixels of a card arrives at it. A double click on the empty board zooms in about that point, and Shift with a double click zooms out. Keyboard behavior: - One card holds the board's tab stop. - The arrow keys move through the cards in reading order. The card you land on scrolls into view, and its connections are announced with it. - Shift with an arrow key moves the card: by 16 units, or to the next multiple of 'snap' where it is set. Alt with an arrow key resizes it from its bottom right corner the same way. - The connections leaving a card are stops of their own, straight after it. Enter on one moves to the card it arrives at. - What a key changes that a reader cannot see is said: where a card moved to, its new size, how many cards are selected, and the zoom. A selected card or connection says so when a reader arrives on it. Every drag also works with clicks, as WCAG 2.5.7 requires for a pointer that cannot hold a button down. Click a selected card's move handle, a corner, a card's connection point, or the end of a selected connection to pick it up. It follows the pointer with no button held, and the next click puts it down where a drag would have. On touch, the next tap sets where it lands. Escape, or a press outside the board, puts it back. So a finger connects two cards with three taps: the card, one of its points, and the card to connect to. Connecting and removing dispatch requests, and your code applies them: - Drawing from a card's handle to another card, or pressing C on one card and Enter on another, dispatches 'helix-connect'. - Delete on a card or a connection dispatches 'helix-remove'. The event names every connection that removing the card would leave without an end. Once your page removes what Delete asked for, focus moves to the next stop, to the one before where it was the last, and to the board where none is left. A focused card your page removes for its own reasons hands focus on the same way, unless the reader has already moved focus somewhere else. The board applies a move itself, because the card already exists. A connection is a new element, and React discards an element the board adds to its markup on the next render, so you write the connection. Cards and connections are 'helix-canvas-node' and 'helix-canvas-edge' elements, so they are in the served markup whichever renderer wrote them. The library fetches nothing, and an array passed to an element is missing from the first paint of a server-rendered React page. 'fromJsonCanvas' turns a JSON Canvas document into their props, and 'toJsonCanvas()' writes a board back out. */
15815
16727
  "helix-headless-canvas": DefineCustomElement<
15816
16728
  HelixHeadlessCanvas,
15817
16729
  HelixHeadlessCanvasVueProps,
@@ -15883,7 +16795,7 @@ export interface WcToolkitVueGlobalComponents {
15883
16795
  HelixHeadlessColorPickerVueProps,
15884
16796
  HelixHeadlessColorPickerVueEvents
15885
16797
  >;
15886
- /** 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. */
16798
+ /** 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. As typing narrows the list, a screen reader hears how many options are left, such as "3 results". Emptying the field and leaving it clears a single choice. **Keyboard.** | Key | What it does | |---|---| | Down, Up | On a closed field, opens the list on the chosen option, or the first or the last. In the open list, moves the highlight, round from the last option to the first. | | Page Down, Page Up | In the open list, moves the highlight by as many options as the list shows at once. | | Enter | Chooses the highlighted option. With nothing left in the list, creates what was typed with 'creatable', or takes it with 'allows-custom-value'. On a closed field, submits the form. | | Escape | Closes the list and puts the chosen words back. On a closed field, a second Escape clears a single choice. | | Tab | Closes the list and moves on. | | Backspace | With 'multiple', on an empty field, removes the last tag. | | Space, Home, End, letters | Edit the text. | **ARIA.** The input is the 'combobox', named by the label, with 'aria-expanded', 'aria-controls' naming the list, 'aria-autocomplete' ('both' with 'suggest', 'list' otherwise) and 'aria-activedescendant' on the highlighted option. The list is the listbox 'Listbox' describes. On Apple devices, where VoiceOver does not read the option the field points to, the field says it in a live region as the highlight moves, says how many options there are as the list opens, and says a choice once it is made, as React Aria's combobox does there. Set 'autocomplete' to let a browser's autofill choose an option. 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. */
15887
16799
  "helix-headless-combobox": DefineCustomElement<
15888
16800
  HelixHeadlessCombobox,
15889
16801
  HelixHeadlessComboboxVueProps,
@@ -15901,7 +16813,7 @@ export interface WcToolkitVueGlobalComponents {
15901
16813
  HelixHeadlessCopyButtonVueProps,
15902
16814
  HelixHeadlessCopyButtonVueEvents
15903
16815
  >;
15904
- /** 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. **Keyboard.** The grid is one tab stop, and the arrow keys move between its cells, the headings included. | Key | What it does | |---|---| | Right, Left | Moves one cell along the row. Left moves on, on a right-to-left page. | | Down, Up | Moves one row, the heading row and the 'load-more' row included. | | Home, End | Moves to the first or the last cell of the row. | | Control with Home or End | Moves to the first or the last cell of the grid. | | Page Down, Page Up | Moves by the rows that fit in view. | | Enter, F2 | Moves into the cell's controls. Escape moves back to the cell, and Tab moves between the controls of one cell. | | Enter, Space on a sortable heading | Sorts by the column. | | Enter, Space on the 'load-more' row | Sends 'helix-load-more'. | | Space on a row | Selects the row, in a 'selectable' table. | | Shift with Down or Up | Selects the rows it moves across, in a 'selectable' table. | | Shift with Space | Selects every row from the one last chosen, in a 'selectable' table. | | Control or Command with A | Selects every row, in a 'selectable' table. | | Right on a row header in a tree grid | Opens a closed row, and moves one cell along an open one. | | Left on a row header in a tree grid | Closes an open row, and moves to the parent of a closed one. | | A letter or a word | Moves to the next row whose row header starts with what you typed. | 'selected' and 'expanded' hold their keys in the order of the rows, as do 'helix-select', 'helix-selected' and 'helix-expand'. 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'. */
16816
+ /** 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. **Keyboard.** The grid is one tab stop, and the arrow keys move between its cells, the headings included. | Key | What it does | |---|---| | Right, Left | Moves one cell along the row. Left moves on, on a right-to-left page. | | Down, Up | Moves one row, the heading row and the 'load-more' row included. | | Home, End | Moves to the first or the last cell of the row. | | Control with Home or End | Moves to the first or the last cell of the grid. | | Page Down, Page Up | Moves by the rows that fit in view. | | Enter, F2 | Moves into the cell's controls. Escape moves back to the cell, and Tab moves between the controls of one cell. | | Enter, Space on a sortable heading | Sorts by the column. | | Enter, Space on the 'load-more' row | Sends 'helix-load-more'. | | Space on a row | Selects the row, in a 'selectable' table. | | Shift with Down or Up | Selects the rows it moves across, in a 'selectable' table. | | Shift with Space | Selects every row from the one last chosen, in a 'selectable' table. | | Control or Command with A | Selects every row, in a 'selectable' table. | | Right on a row header in a tree grid | Opens a closed row, and moves one cell along an open one. | | Left on a row header in a tree grid | Closes an open row, and moves to the parent of a closed one. | | A letter or a word | Moves to the next row whose row header starts with what you typed. | 'selected' and 'expanded' hold their keys in the order of the rows, as do 'helix-select', 'helix-selected' and 'helix-expand'. 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. **'reorderable-rows' lets people move rows.** A column of grips leads each row, named by 'move-row-label'. Drag a grip to move its row, and the table scrolls near an edge. Or press Space or Enter on a grip, or click it, to pick up its row, move it with Down and Up, Home and End, and press Space or Enter again to drop it. A click on another row drops it there, and Escape puts it back. The table says each step in its 'live' region. A drop sends 'helix-before-reorder', which you can refuse, and then 'helix-reorder' with 'kind' set to 'row', whose 'keys' hold every key of 'rows' in the new order. **You move the rows**: set 'rows' to the new order, and the table draws it. Set 'row-key', so a row is known by its key once it has moved. The grips do nothing while a 'sort' is set, since the sort decides the order, and a tree grid draws none. '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'. */
15905
16817
  "helix-headless-data-table": DefineCustomElement<
15906
16818
  HelixHeadlessDataTable,
15907
16819
  HelixHeadlessDataTableVueProps,
@@ -15913,7 +16825,7 @@ export interface WcToolkitVueGlobalComponents {
15913
16825
  HelixHeadlessDateInputVueProps,
15914
16826
  HelixHeadlessDateInputVueEvents
15915
16827
  >;
15916
- /** 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. */
16828
+ /** 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. **The days are the Gregorian calendar's**, written in 'calendar': the locale's own where its months are the Gregorian months, as 'th-TH' writes 2569 for 2026, and 'gregory' where they are not, as for 'fa-IR'. '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. */
15917
16829
  "helix-headless-date-picker": DefineCustomElement<
15918
16830
  HelixHeadlessDatePicker,
15919
16831
  HelixHeadlessDatePickerVueProps,
@@ -15931,13 +16843,13 @@ export interface WcToolkitVueGlobalComponents {
15931
16843
  HelixHeadlessDescriptionListVueProps,
15932
16844
  HelixHeadlessDescriptionListVueEvents
15933
16845
  >;
15934
- /** 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 The dialog adds one thing to those: 'Tab' from its last control goes to its first, and 'Shift+Tab' from its first to its last. A native modal lets 'Tab' past its last control out to the browser's own controls. '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. A Helix component that draws words and no control, such as 'Text', counts as words. 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'. */
16846
+ /** 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 The dialog adds one thing to those: 'Tab' from its last control goes to its first, and 'Shift+Tab' from its first to its last. A native modal lets 'Tab' past its last control out to the browser's own controls. '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, and 'fallback-label' where nothing names it. 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. A Helix component that draws words and no control, such as 'Text', counts as words. 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'. */
15935
16847
  "helix-headless-dialog": DefineCustomElement<
15936
16848
  HelixHeadlessDialog,
15937
16849
  HelixHeadlessDialogVueProps,
15938
16850
  HelixHeadlessDialogVueEvents
15939
16851
  >;
15940
- /** The separator role is on the rule inside the shadow root. A role does not need to cross the shadow boundary the way an IDREF does, so it can sit on the rendered element. The semantics are then in the server-rendered markup, with no attribute written by script after the element connects. Set 'announced' for a line that divides one thing from another, and it is read as a separator, named by any content set into it. Use 'orientation="vertical"' between items on one line, such as inside a toolbar. A vertical divider stretches to fit its flex parent and sets no height of its own. */
16852
+ /** The separator role is on the rule inside the shadow root. A role does not need to cross the shadow boundary the way an IDREF does, so it can sit on the rendered element. The semantics are then in the server-rendered markup, with no attribute written by script after the element connects. **The line is a separator**, as '<hr>' is, and as Radix Separator, React Aria Separator, and Web Awesome's divider are. It is named by any content set into it, so a screen reader says "Or, separator" where you wrote "Or" on the line. Set 'decorative' on a rule that separates nothing, such as one under a heading or between the facts of a byline, and it leaves the accessibility tree. Use 'orientation="vertical"' between items on one line. A vertical divider stretches to fit its flex parent and sets no height of its own. **Inside a toolbar it runs across the toolbar** without being told: vertical in a horizontal toolbar and horizontal in a vertical one, with 'aria-orientation' to match, as React Aria's separator does inside a toolbar. Inside means a child of Toolbar or of the page's own 'role="toolbar"'. An 'orientation' you write still wins. A server cannot see the toolbar, so the turn arrives with hydration, inside the shadow root. */
15941
16853
  "helix-headless-divider": DefineCustomElement<
15942
16854
  HelixHeadlessDivider,
15943
16855
  HelixHeadlessDividerVueProps,
@@ -15949,7 +16861,7 @@ export interface WcToolkitVueGlobalComponents {
15949
16861
  HelixHeadlessDonutChartVueProps,
15950
16862
  HelixHeadlessDonutChartVueEvents
15951
16863
  >;
15952
- /** 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: 'Tab' from the last control goes to the first, and 'Shift+Tab' from the first to the last, as in 'Dialog' - 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. 'snap' is the snap point the panel rests at, and ':state(snapped)' is on the host while that is less than the whole panel. 'snapTo()' moves it to another. **Focus moving to a control past the window's edge opens the panel to its largest snap point**, so a reader moving through a half open sheet with 'Tab' never lands on a control they cannot see. Set 'dismissible' to draw a close control in the corner, labeled by 'dismiss-label', as 'Dialog' draws one. 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> ''' */
16864
+ /** 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: 'Tab' from the last control goes to the first, and 'Shift+Tab' from the first to the last, as in 'Dialog' - 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. 'snap' is the snap point the panel rests at, and ':state(snapped)' is on the host while that is less than the whole panel. 'snapTo()' moves it to another. **Focus moving to a control past the window's edge opens the panel to its largest snap point**, so a reader moving through a half open sheet with 'Tab' never lands on a control they cannot see. Set 'dismissible' to draw a close control in the corner, labeled by 'dismiss-label', as 'Dialog' draws one. 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, and 'fallback-label' where nothing names it. 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> ''' */
15953
16865
  "helix-headless-drawer": DefineCustomElement<
15954
16866
  HelixHeadlessDrawer,
15955
16867
  HelixHeadlessDrawerVueProps,
@@ -15967,7 +16879,7 @@ export interface WcToolkitVueGlobalComponents {
15967
16879
  HelixHeadlessDrilldownVueProps,
15968
16880
  HelixHeadlessDrilldownVueEvents
15969
16881
  >;
15970
- /** Shows what would be in a region and the one action that would fill it, so an empty region does not look like one that failed to load. The message is announced, because an empty view often replaces content that was loading, and the announcement tells a screen reader user that the search returned nothing. It is announced from a status region of its own, which is rendered empty and filled a frame after the view appears. Screen readers read a region that arrives with its text already in it inconsistently. For the seven seconds the region holds its copy, the heading and the message are hidden from screen readers, so the words are in the page once. Every region is a bare slot. There is no 'empty-state-heading' or 'empty-state-actions' element: assign your own heading and actions to the slots. **Or give the heading as words.** 'heading' draws them in a 'heading' part that is a heading at 'heading-level', 3 where it is not set, so a page rendering from data or on a server gets a heading a reader finds in the outline without writing the element. A heading slotted in replaces it. */
16882
+ /** Shows what would be in a region and the one action that would fill it, so an empty region does not look like one that failed to load. The message is announced, because an empty view often replaces content that was loading, and the announcement tells a screen reader user that the search returned nothing. It is announced from a status region of its own, which is rendered empty and filled a frame after the view appears. Screen readers read a region that arrives with its text already in it inconsistently. For the seven seconds the region holds its copy, the heading and the message are hidden from screen readers, so the words are in the page once. Every region is a bare slot. There is no 'empty-state-heading' or 'empty-state-actions' element: assign your own heading and actions to the slots. **Or give the heading as words.** 'heading' draws them in a 'heading' part that is a heading at 'heading-level', 3 where it is not set, so a page rendering from data or on a server gets a heading a reader finds in the outline without writing the element. A heading slotted in replaces it. **Whatever is slotted into 'heading' is read as a heading.** An element that is no heading, such as a '<span>' or a '<p>', is set inside the 'heading' part at 'heading-level', so a screen reader still finds it in the outline. A heading element, or an element holding one, keeps its own level. A server cannot see the slotted element, so a served '<span>' becomes a heading once the script runs. */
15971
16883
  "helix-headless-empty": DefineCustomElement<
15972
16884
  HelixHeadlessEmpty,
15973
16885
  HelixHeadlessEmptyVueProps,
@@ -16009,7 +16921,7 @@ export interface WcToolkitVueGlobalComponents {
16009
16921
  HelixHeadlessFilterInputVueProps,
16010
16922
  HelixHeadlessFilterInputVueEvents
16011
16923
  >;
16012
- /** 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. 'frozen' draws the reading once and leaves it. **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. */
16924
+ /** 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. 'frozen' draws the reading once and leaves it. **'fields' draws each field of a date as a part of its own**, such as 'day', 'month' and 'year', so a stylesheet can set the year in a lighter ink or the weekday in capitals with '::part()'. The text between the fields is the locale's own and has no part. An 'elapsed' or 'relative' reading is one phrase, with no parts inside it. **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. **A date is written in a calendar Date Picker draws**: the locale's own where its months are the Gregorian months, as 'th-TH' writes 2569 for 2026, and 'gregory' where they are not, as for 'fa-IR'. 'calendar' picks one of the five. */
16013
16925
  "helix-headless-format-date": DefineCustomElement<
16014
16926
  HelixHeadlessFormatDate,
16015
16927
  HelixHeadlessFormatDateVueProps,
@@ -16039,7 +16951,7 @@ export interface WcToolkitVueGlobalComponents {
16039
16951
  HelixHeadlessIconVueProps,
16040
16952
  HelixHeadlessIconVueEvents
16041
16953
  >;
16042
- /** Image handles the part CSS cannot: when the picture has loaded, or that it failed. 'aspect-ratio' in your stylesheet reserves the box. The element tracks three states and relays the two events that move between them, and leaves the box to the stylesheet. The 'placeholder' slot is empty by default, so the headless tier does not depend on 'Skeleton', which it does not ship. The placeholder is hidden from screen readers, the picture having a name of its own. The fallback is read once the picture fails, after the picture's 'alt', so a reader hears that it did not load, as a sighted reader sees. */
16954
+ /** Image handles the part CSS cannot: when the picture has loaded, or that it failed. 'aspect-ratio' in your stylesheet reserves the box. The element tracks three states and relays the two events that move between them, and leaves the box to the stylesheet. The 'placeholder' slot is empty by default, so the headless tier does not depend on 'Skeleton', which it does not ship. The placeholder is hidden from screen readers, the picture having a name of its own. The fallback is read once the picture fails, after the picture's 'alt', so a reader hears that it did not load, as a sighted reader sees. **An image with no 'alt' says so.** At its first render it reports a 'missing-alt' warning, printed in the console and counted by '@fusion.dev/helix-diagnostics', which names the fix: describe the picture in 'alt', or write 'alt=""' for one that is decoration. An image hidden with 'aria-hidden="true"' needs neither and is not reported. A sheet of yours reads the state as ':state(loading)', ':state(loaded)', ':state(error)', and ':state(waiting)', the last while 'placeholder-delay' holds the placeholder back. It can also read 'data-status' on the host once the picture has loaded or failed. */
16043
16955
  "helix-headless-image": DefineCustomElement<
16044
16956
  HelixHeadlessImage,
16045
16957
  HelixHeadlessImageVueProps,
@@ -16081,19 +16993,19 @@ export interface WcToolkitVueGlobalComponents {
16081
16993
  HelixHeadlessLineChartVueProps,
16082
16994
  HelixHeadlessLineChartVueEvents
16083
16995
  >;
16084
- /** 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. */
16996
+ /** 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. **In a 'reorderable' list, the row has a grip** after its 'end' slot, named by the list's 'move-label'. The list says which row is moving and where the drop indicator is, with the 'dragging', 'drop-before', and 'drop-after' states. */
16085
16997
  "helix-headless-list-item": DefineCustomElement<
16086
16998
  HelixHeadlessListItem,
16087
16999
  HelixHeadlessListItemVueProps,
16088
17000
  HelixHeadlessListItemVueEvents
16089
17001
  >;
16090
- /** 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. 'single' selects one row at a time and 'multiple' any number, and 'value' holds the selected rows' values, separated by commas. A change asks with 'helix-before-change' and tells with 'change'. 'none' selects nothing, so a press acts on the row. A 'disabled' row is passed over. Each row is named by its label and described by its description, so the words of the controls in 'end' are not read as part of its name. 'selection-behavior' says what a press does to the rows already selected. 'toggle', the default, adds or takes out the row. 'replace' selects the row alone, as a file list does, and the arrow keys carry the selection with them. Control or Command with a press then adds or takes out one row. | Key | What it does | |---|---| | Down, Up | Moves to the next or the previous row. Under 'replace', selects it. | | Home, End | Moves to the first or the last row. Under 'replace', selects it. | | Page Down, Page Up | Moves a box's height of rows, so the row at one edge lands at the other. Under 'replace', selects the row it lands on. | | A letter or a word | Moves to the next row whose words start with what you typed. | | Left, Right | Moves between the row and the controls in its 'end' slot. | | Space | Selects the row, or lets it go. | | Shift with Down, Up, Home, End, Page Down, Page Up or Space | Selects every row from the last one pressed, in 'multiple'. | | Control or Command with Down, Up, Home, End, Page Down or Page Up | Moves without selecting, under 'replace'. | | Control or Command with A | Selects every row, in 'multiple'. | | Escape | Lets go of every selected row, asking first, and keeps the key from the dialog or menu around the list. With nothing selected, the key goes on to them. | | Enter | Acts on the row: follows its link, or sends 'helix-action' from it. | A press with Shift selects every row from the last one pressed, and a press with Control or Command adds or takes out one row under 'replace'. **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. */
17002
+ /** 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. 'single' selects one row at a time and 'multiple' any number, and 'value' holds the selected rows' values, separated by commas. A change asks with 'helix-before-change' and tells with 'change'. 'none' selects nothing, so a press acts on the row. A 'disabled' row is passed over. Each row is named by its label and described by its description, so the words of the controls in 'end' are not read as part of its name. 'selection-behavior' says what a press does to the rows already selected. 'toggle', the default, adds or takes out the row. 'replace' selects the row alone, as a file list does, and the arrow keys carry the selection with them. Control or Command with a press then adds or takes out one row. | Key | What it does | |---|---| | Down, Up | Moves to the next or the previous row. Under 'replace', selects it. | | Home, End | Moves to the first or the last row. Under 'replace', selects it. | | Page Down, Page Up | Moves a box's height of rows, so the row at one edge lands at the other. Under 'replace', selects the row it lands on. | | A letter or a word | Moves to the next row whose words start with what you typed. | | Left, Right | Moves between the row and the controls in its 'end' slot. | | Space | Selects the row, or lets it go. | | Shift with Down, Up, Home, End, Page Down, Page Up or Space | Selects every row from the last one pressed, in 'multiple'. | | Control or Command with Down, Up, Home, End, Page Down or Page Up | Moves without selecting, under 'replace'. | | Control or Command with A | Selects every row, in 'multiple'. | | Escape | Lets go of every selected row, asking first, and keeps the key from the dialog or menu around the list. With nothing selected, the key goes on to them. | | Enter | Acts on the row: follows its link, or sends 'helix-action' from it. | A press with Shift selects every row from the last one pressed, and a press with Control or Command adds or takes out one row under 'replace'. **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. **'reorderable' lets you move rows.** Each row gets a grip after its 'end' slot, named by 'move-label'. Drag a grip to move its row, and the list scrolls near an edge. Or press a grip with Space, Enter, or a click to pick up its row, move it with the arrow keys, and press the grip again to drop it. A click on another row drops it there, and Escape puts it back. The list says each step in its 'live' region. A drop sends 'helix-before-reorder', which you can refuse, and then 'helix-reorder', whose 'keys' hold every row's value in the new order. **You move the rows**: the list moves no element of yours, so your framework keeps the order it rendered. | Key, on a held row's grip | What it does | |---|---| | Down, Up | Moves the row one place. | | Home, End | Moves the row to the top or the bottom. | | Space, Enter | Drops the row. | | Escape | Puts the row back where it was. | '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. */
16091
17003
  "helix-headless-list": DefineCustomElement<
16092
17004
  HelixHeadlessList,
16093
17005
  HelixHeadlessListVueProps,
16094
17006
  HelixHeadlessListVueEvents
16095
17007
  >;
16096
- /** 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, and with 'multiple', Control with Shift and Home or End adds every option from the highlight to that end. 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'. */
17008
+ /** 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. **Keyboard.** The list is one tab stop, or its filter field is where there is one. In a single-choice list the highlight is the choice unless 'manual' is set; then Enter, Space or a click chooses. | Key | What it does | |---|---| | Down, Up | Moves the highlight to the next or the previous option, round from the last to the first. With 'layout="grid"', to the option below or above, stopping at the edge. | | Right, Left | With 'layout="grid"', moves to the next or the previous option, mirrored right to left. In a filter field, moves the caret. | | Home, End | Moves to the first or the last option. In a filter field, moves the caret. | | Page Down, Page Up | Moves by as many options as the list shows at once. | | A letter or a word | Moves to the next option whose words start with what you typed. In a filter field, types it. | | Enter | Chooses the highlighted option, or follows it where it is a link. | | Space | Chooses the highlighted option, or with 'multiple' toggles it. In a filter field, types a space. | | Shift with Down or Up | With 'multiple', adds the option the highlight moves to. In a filter field, moves the highlight and leaves the value. | | Shift with Space | With 'multiple', adds every option from the one last chosen to the highlighted one. In a filter field, types a space. | | Shift with Home or End | With 'multiple', adds every option from the highlight to that end. In a filter field, hold Control as well. | | Control or Command with A | With 'multiple', chooses every option, or none where all are chosen. In a filter field, selects the text. | | Escape | In a filter field, clears the filter. | | Alt with Up or Down | In a 'reorderable' list, moves the highlighted option a place. Alt with Home or End moves it to either end. | **ARIA.** The 'items' part is the 'listbox', named by the label and described by the hint and the message, with 'aria-multiselectable' under 'multiple', 'aria-required', 'aria-invalid', and 'aria-busy' while loading. Each option is an 'option' with 'aria-selected'. The list, or its filter field, points 'aria-activedescendant' at the highlighted option; the field is 'aria-autocomplete="list"' and controls the list. 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'. **Moving options** is a separate import, '@fusion.dev/helix/listbox/reorder', so a list that never moves options carries none of its code. With it imported, 'reorderable' lets a reader move options: - Alt with Up or Down moves the highlighted option a place, and Alt with Home or End moves it to either end, as the APG's rearrangeable listbox does. The highlight stays on it. - A pointer drags an option, with a drop indicator, and the list scrolls near an edge. A press that does not travel still chooses the option. - A drop sends 'helix-before-reorder', which you can refuse, and then 'helix-reorder', whose 'keys' hold every value in the new order. **You move the options**, or set 'items' in the new order: the list moves no element of yours. - The list says each move in its 'live' region. The words are the 'moved-label', 'canceled-label', 'dropped-label', and 'picked-up-label' attributes, which the import reads. - An option in a group moves within its group. Options do not move while a filter narrows the list, under 'layout="grid"', or while the list is disabled. */
16097
17009
  "helix-headless-listbox": DefineCustomElement<
16098
17010
  HelixHeadlessListbox,
16099
17011
  HelixHeadlessListboxVueProps,
@@ -16129,7 +17041,7 @@ export interface WcToolkitVueGlobalComponents {
16129
17041
  HelixHeadlessMapLandcoverVueProps,
16130
17042
  HelixHeadlessMapLandcoverVueEvents
16131
17043
  >;
16132
- /** A button placed at a latitude and longitude. 'connectMap' positions it on the map and moves it as the map moves. Its name shows beside it on hover and focus. Pressing a marker sends 'helix-activate' from the frame with the marker's 'name', or its 'label' if it has no name. All the markers in a map share one tab stop. The arrow keys move between them in the order they are written. */
17044
+ /** A button placed at a latitude and longitude. 'connectMap' positions it on the map and moves it as the map moves. Its name shows beside it on hover and focus. Pressing a marker sends 'helix-activate' from the frame with the marker's 'name', or its 'label' if it has no name. All the markers in a map share one tab stop. The arrow keys move between them in the order they are written. Taking away the marker that has focus moves focus to the next one, or to the one before where it was the last. */
16133
17045
  "helix-headless-map-marker": DefineCustomElement<
16134
17046
  HelixHeadlessMapMarker,
16135
17047
  HelixHeadlessMapMarkerVueProps,
@@ -16183,7 +17095,7 @@ export interface WcToolkitVueGlobalComponents {
16183
17095
  HelixHeadlessMenuItemVueProps,
16184
17096
  HelixHeadlessMenuItemVueEvents
16185
17097
  >;
16186
- /** 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. Keys: Enter, Space or Down Arrow on the trigger opens the menu on its first row, and Up Arrow on its last. In the menu, Up and Down Arrow move between rows, Home and End go to the first and the last, a typed letter moves to the next row whose name starts with it, Enter and Space choose, Right Arrow opens a row's submenu and Left Arrow goes back, the two swapping on a right-to-left page, and Escape closes the menu and returns focus to the trigger. Tab closes it and moves on. While it is open, the surface carries the trigger's width as '--floating-anchor-inline-size' and the room left below it as '--floating-available-block-size', as Radix's dropdown menu publishes its trigger's width, for a menu as wide as its trigger: 'helix-menu::part(surface) { min-inline-size: var(--floating-anchor-inline-size) }'. 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. */
17098
+ /** 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>' is a separator a screen reader announces. Keys: Enter, Space or Down Arrow on the trigger opens the menu on its first row, and Up Arrow on its last. In the menu, Up and Down Arrow move between rows, Home and End go to the first and the last, a typed letter moves to the next row whose name starts with it, Enter and Space choose, Right Arrow opens a row's submenu and Left Arrow goes back, the two swapping on a right-to-left page, and Escape closes the menu and returns focus to the trigger. Tab closes it and moves on. While it is open, the surface carries the trigger's width as '--floating-anchor-inline-size' and the room left below it as '--floating-available-block-size', as Radix's dropdown menu publishes its trigger's width, for a menu as wide as its trigger: 'helix-menu::part(surface) { min-inline-size: var(--floating-anchor-inline-size) }'. 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. */
16187
17099
  "helix-headless-menu": DefineCustomElement<
16188
17100
  HelixHeadlessMenu,
16189
17101
  HelixHeadlessMenuVueProps,
@@ -16219,7 +17131,7 @@ export interface WcToolkitVueGlobalComponents {
16219
17131
  HelixHeadlessNotificationVueProps,
16220
17132
  HelixHeadlessNotificationVueEvents
16221
17133
  >;
16222
- /** 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. While the feed is loading the button stays, so focus stays on it, and it is 'aria-disabled' and sends nothing. */
17134
+ /** 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. While the feed is loading the button stays, so focus stays on it, and it is 'aria-disabled' and sends nothing. **'load-error' says a page could not be fetched**, such as "Could not load notifications": it shows under the rows there are, in the 'error' part, in place of the empty and loading lines, and a screen reader hears it. Clear it when you ask again. */
16223
17135
  "helix-headless-notifications": DefineCustomElement<
16224
17136
  HelixHeadlessNotifications,
16225
17137
  HelixHeadlessNotificationsVueProps,
@@ -16231,7 +17143,7 @@ export interface WcToolkitVueGlobalComponents {
16231
17143
  HelixHeadlessNumberInputVueProps,
16232
17144
  HelixHeadlessNumberInputVueEvents
16233
17145
  >;
16234
- /** 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. **Keyboard.** The tree is one tab stop, and focus moves from row to row. | Key | What it does | |---|---| | Down, Up | Moves to the next or the previous row. | | Right | Opens a closed branch, or moves into an open one. Left on a right-to-left page. | | Left | Closes an open branch, or moves to the parent. Right on a right-to-left page. | | Home, End | Moves to the first or the last row. | | Page Down, Page Up | Moves a box's height of rows, so the row at one edge lands at the other. | | Enter, Space | Opens or closes a branch. | | '*' | Opens every branch beside the active row. | | A letter or a word | Moves to the next row whose key starts with what you typed. | | Command+C, Control+C | Copies the active row, where no text is selected. | The tree is a 'treegrid', as React Aria's Tree is: each entry is a 'row' with one cell, and carries its real level, position, and set size, including in a windowed tree. Nothing in it is chosen, so no row carries 'aria-selected', and a focused row is not announced as selected. A reader opening or closing a branch sends 'helix-before-open' or 'helix-before-close', which you can cancel, and then 'toggle' with 'newState' and 'oldState', as '<details>' does. The branch is the active row, and 'expanded' holds every open branch. '*' asks once for all the branches it opens. A script writing 'expanded' or 'active' sends nothing. '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. */
17146
+ /** 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. **Keyboard.** The tree is one tab stop, and focus moves from row to row. | Key | What it does | |---|---| | Down, Up | Moves to the next or the previous row. | | Right | Opens a closed branch, or moves into an open one. Left on a right-to-left page. | | Left | Closes an open branch, or moves to the parent. Right on a right-to-left page. | | Home, End | Moves to the first or the last row. | | Page Down, Page Up | Moves a box's height of rows, so the row at one edge lands at the other. | | Enter, Space | Opens or closes a branch. | | '*' | Opens every branch beside the active row. | | A letter or a word | Moves to the next row whose key starts with what you typed. | | Command+C, Control+C | Copies the active row, where no text is selected. | The tree is a 'treegrid', as React Aria's Tree is: each entry is a 'row' with one cell, and carries its real level, position, and set size, including in a windowed tree. Nothing in it is chosen, so no row carries 'aria-selected', and a focused row is not announced as selected. A reader opening or closing a branch sends 'helix-before-open' or 'helix-before-close', which you can cancel, and then 'toggle' with 'newState' and 'oldState', as '<details>' does. The branch is the active row, and 'expanded' holds every open branch. '*' asks once for all the branches it opens. A script writing 'expanded' or 'active' sends nothing. '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 '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. */
16235
17147
  "helix-headless-object-inspector": DefineCustomElement<
16236
17148
  HelixHeadlessObjectInspector,
16237
17149
  HelixHeadlessObjectInspectorVueProps,
@@ -16297,7 +17209,7 @@ export interface WcToolkitVueGlobalComponents {
16297
17209
  HelixHeadlessProgressVueProps,
16298
17210
  HelixHeadlessProgressVueEvents
16299
17211
  >;
16300
- /** 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 'label' to what the code is for, such as "Open the menu". With no 'label', a code is named by 'code-label', "QR code", followed by its value where the value is a web address, which a URL read aloud makes a destination. Any other value is never read out: a code that sets up an authenticator or joins a network carries a secret in it. 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: the element fires 'error', carries ':state(overflow)', and shows what is in the 'fallback' slot, such as the link written out. 'toSvg()', 'toPng()' and 'download()' give the drawn code as a file of its own, in the colors it is drawn in, with a slotted image or SVG logo where it sits, for a page that offers it to save or print, as Zag's download trigger does. */
17212
+ /** 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 'label' to what the code is for, such as "Open the menu". With no 'label', a code is named by 'code-label', "QR code", followed by its value where the value is a web address, which a URL read aloud makes a destination. Any other value is never read out: a code that sets up an authenticator or joins a network carries a secret in it. 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 code that holds a logo at a 'correction' below 'H' warns once with the kind 'unscannable-logo'. 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: the element fires 'error', carries ':state(overflow)', and shows what is in the 'fallback' slot, such as the link written out. 'toSvg()', 'toPng()' and 'download()' give the drawn code as a file of its own, in the colors it is drawn in, with a slotted image or SVG logo where it sits, for a page that offers it to save or print, as Zag's download trigger does. 'download()' saves an SVG for a name ending in '.svg', and a PNG for any other. */
16301
17213
  "helix-headless-qr-code": DefineCustomElement<
16302
17214
  HelixHeadlessQrCode,
16303
17215
  HelixHeadlessQrCodeVueProps,
@@ -16339,7 +17251,7 @@ export interface WcToolkitVueGlobalComponents {
16339
17251
  HelixHeadlessScrollAreaVueProps,
16340
17252
  HelixHeadlessScrollAreaVueEvents
16341
17253
  >;
16342
- /** 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. */
17254
+ /** 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. **Keyboard.** On the closed trigger: | Key | What it does | |---|---| | Down, Enter, Space | Opens the list on the chosen option, or the first. | | Up | Opens the list on the chosen option, or the last. | | Home, End | Opens the list on the first or the last option. | | Left, Right | Chooses the option before or after the chosen one without opening, as React Aria's Select does, in either direction of text. | | A letter or a word | Chooses the option whose words start with what you typed, as a native '<select>' does. With 'multiple', opens the list on it. | In the open list, which is a 'Listbox': | Key | What it does | |---|---| | Down, Up, Home, End, Page Down, Page Up | Moves the highlight. | | A letter or a word | Moves the highlight to the next option whose words start with what you typed. | | Enter, Space | Chooses the highlighted option and closes the list. With 'multiple', toggles it and leaves the list open. | | Escape | Closes the list and puts focus back on the trigger. | | Tab | Closes the list and moves on. | A choice made on the closed trigger is said aloud on Apple devices, where VoiceOver does not read the trigger's new name. **ARIA.** The trigger is a 'button' with 'aria-haspopup="listbox"' and 'aria-expanded', named by the label and then the chosen words, as a native '<select>' is. The list is the listbox 'Listbox' describes, named by the label, or by 'list-label' where there is none. Set 'autocomplete' to let a browser's autofill choose, as a native '<select>' with the same attribute would. */
16343
17255
  "helix-headless-select": DefineCustomElement<
16344
17256
  HelixHeadlessSelect,
16345
17257
  HelixHeadlessSelectVueProps,
@@ -16369,19 +17281,25 @@ export interface WcToolkitVueGlobalComponents {
16369
17281
  HelixHeadlessSparklineVueProps,
16370
17282
  HelixHeadlessSparklineVueEvents
16371
17283
  >;
16372
- /** Each item is a command, so it has the 'menuitem' role. A megamenu holds destinations, so it is a disclosure of links. A speed dial holds actions, which is what 'role="menu"' is for. The name is text rendered beside the icon, and it is the accessible name. A 'title' on an icon shows only on hover. Visible text is read, searched, and translated like other text. */
17284
+ /** A 'group' of the dial's menu, named by its label, as React Aria's menu sections and Menu's groups are: a reader hears the name on entering the set, and the arrow keys walk through every group's actions in order, from the last action of one group to the first of the next. Put actions straight into the group, and the group straight into the dial. Anything else slotted here is drawn and is not an action. */
17285
+ "helix-headless-speed-dial-group": DefineCustomElement<
17286
+ HelixHeadlessSpeedDialGroup,
17287
+ HelixHeadlessSpeedDialGroupVueProps,
17288
+ HelixHeadlessSpeedDialGroupVueEvents
17289
+ >;
17290
+ /** Each item is a command, so it has the 'menuitem' role. A megamenu holds destinations, so it is a disclosure of links. A speed dial holds actions, which is what 'role="menu"' is for. The name is text rendered beside the icon, and it is the accessible name. A 'title' on an icon shows only on hover. Visible text is read, searched, and translated like other text. 'shortcut' gives the action's keyboard shortcut as a chord, such as 'mod+s', the grammar Menu's rows use. The action carries it as 'aria-keyshortcuts' and draws it after the name in the platform's glyphs or words, '⌘S' on an Apple keyboard and 'Ctrl+S' elsewhere, as Menu draws its rows' shortcuts. Put a 'Kbd' in the 'shortcut' slot to draw it as keys instead; the dial imports no 'Kbd' of its own. Showing a shortcut does not bind it. */
16373
17291
  "helix-headless-speed-dial-item": DefineCustomElement<
16374
17292
  HelixHeadlessSpeedDialItem,
16375
17293
  HelixHeadlessSpeedDialItemVueProps,
16376
17294
  HelixHeadlessSpeedDialItemVueEvents
16377
17295
  >;
16378
- /** A speed dial is a menu. Its items are commands, so it uses 'role="menu"' and 'menuitem', and it is built from the same pieces as 'Menu': - 'KeyboardNavigationController' for the arrow keys - 'PopoverController' for the panel - 'MixinControllerOpen' for open and closed It is a separate component because a speed dial has no submenus, headers, or checkable items. You slot the trigger. The usual floating action button is 'IconButton' with 'shape="circle"' and 'raised'. There is no 'helix-fab', because 'IconButton' already has 'emphasis', 'tone', 'label', and a size. Position the button with 'data-dock' in the base layer. All four arrow keys move through the actions, because a speed dial has no nested levels to reserve the horizontal pair for. This is the default behavior of the keyboard controller. Typing a letter moves to the next action whose name starts with it. The actions are one tab stop, and Tab closes the dial and moves on. */
17296
+ /** A speed dial is a menu. Its items are commands, so it uses 'role="menu"' and 'menuitem', and it is built from the same pieces as 'Menu': - 'KeyboardNavigationController' for the arrow keys - 'PopoverController' for the panel - 'MixinControllerOpen' for open and closed It is a separate component because a speed dial has no submenus, headers, or checkable items. You slot the trigger. The usual floating action button is 'IconButton' with 'shape="circle"' and 'raised'. There is no 'helix-fab', because 'IconButton' already has 'emphasis', 'tone', 'label', and a size. Position the button with 'data-dock' in the base layer. All four arrow keys move through the actions, because a speed dial has no nested levels to reserve the horizontal pair for. This is the default behavior of the keyboard controller. Typing a letter moves to the next action whose name starts with it. The actions are one tab stop, and Tab closes the dial and moves on. **Keyboard.** On the trigger, Enter, Space or a press opens the dial on its first action. With the dial open: | Key | What it does | |---|---| | Down, Right | Moves to the next action, from the last back to the first. | | Up, Left | Moves to the action before, from the first round to the last. | | Home, End | Moves to the first or the last action. | | A letter | Moves to the next action whose name starts with it. | | Enter, Space | Chooses the action, and the dial closes. | | Escape | Closes the dial and puts focus back on the trigger. | | Tab | Closes the dial and moves on. | **Groups.** Put actions in 'Speed Dial.Group', named by its 'label', to set them apart as Menu's sections do: each is a 'group' of the menu, and the arrow keys walk through every group's actions in order. **A trigger with its own action.** With 'open-on="long-press"', a press on the trigger is the trigger's own, such as composing a message, and holding it for half a second opens the dial, as React Aria's menu trigger does with 'trigger="longPress"'. Alt+Down or Alt+Up opens it from the keyboard, and the trigger says so in its description, 'long-press-label', the drawn one and a slotted one alike. A press that has opened the dial does not also do the trigger's action. */
16379
17297
  "helix-headless-speed-dial": DefineCustomElement<
16380
17298
  HelixHeadlessSpeedDial,
16381
17299
  HelixHeadlessSpeedDialVueProps,
16382
17300
  HelixHeadlessSpeedDialVueEvents
16383
17301
  >;
16384
- /** A splitter has one axis. Nest splitters to get two axes and three-pane or four-pane layouts. When a splitter is slotted into a pane of another at a right angle, a corner handle appears where the dividers cross. It shows the 'move' cursor, responds to both arrow axes, and a drag moves both dividers at once. The corner is added at 'firstUpdated' and is not in the server markup. Before it appears, both dividers work on their own. The divider has 'role="separator"' and 'aria-valuenow', and 'aria-controls' names the start pane. Drag it with a pointer or move it with the arrow keys, press 'Home' or 'End' to move it to its bounds, and press 'Enter' to collapse the start pane and open it again. A drag in progress is tracked as a state, so both dividers a corner moves stay lit for as long as they move. By default, 'min' and 'max' let the divider reach either edge, so you can drag a pane fully closed. Set them to limit the range. A pane can be collapsed, which is a separate state from a divider at the edge. 'collapsed' names the shut pane, 'start' or 'end', and the pane opens back to the position where the collapsing gesture began. A drag records that position on press, and every other way of collapsing records it in 'settle'. 'collapsed-size' keeps a sliver of the pane visible, such as a tab strip. Collapsing overrides 'min' and 'max'. */
17302
+ /** A splitter has one axis. Nest splitters to get two axes and three-pane or four-pane layouts. When a splitter is slotted into a pane of another at a right angle, a corner handle appears where the dividers cross. It shows the 'move' cursor, responds to both arrow axes, and a drag moves both dividers at once. The corner is added at 'firstUpdated' and is not in the server markup. Before it appears, both dividers work on their own. The divider has 'role="separator"' and 'aria-valuenow', with 'aria-valuetext' saying the start pane's share as a percentage in the nearest 'lang', or in the reader's locale where no 'lang' is set, and 'aria-controls' names the start pane. Drag it with a pointer or move it with the arrow keys, press 'Home' or 'End' to move it to its bounds, and press 'Enter' to collapse the start pane and open it again. A drag in progress is tracked as a state, so both dividers a corner moves stay lit for as long as they move. By default, 'min' and 'max' let the divider reach either edge, so you can drag a pane fully closed. Set them to limit the range. A pane can be collapsed, which is a separate state from a divider at the edge. 'collapsed' names the shut pane, 'start' or 'end', and the pane opens back to the position where the collapsing gesture began. A drag records that position on press, and every other way of collapsing records it in 'settle'. 'collapsed-size' keeps a sliver of the pane visible, such as a tab strip. Collapsing overrides 'min' and 'max'. */
16385
17303
  "helix-headless-splitter": DefineCustomElement<
16386
17304
  HelixHeadlessSplitter,
16387
17305
  HelixHeadlessSplitterVueProps,
@@ -16417,7 +17335,7 @@ export interface WcToolkitVueGlobalComponents {
16417
17335
  HelixHeadlessSwitchVueProps,
16418
17336
  HelixHeadlessSwitchVueEvents
16419
17337
  >;
16420
- /** Sets its own role, because a grid of elements has no table structure for assistive technology otherwise. 'header' makes the cell a header, so a screen reader announces it with the values it heads: - In a row that holds a cell without 'header', it is a 'rowheader' and names its row, for example "web-app" in a row of a service's values. - In a row of 'header' cells alone, it is a 'columnheader', which is what a table with no 'TableColumn' heads its columns with. The role is on the host so the cell stays a child of its row in the flat tree, which keeps the table structure intact. */
17338
+ /** Sets its own role, because a grid of elements has no table structure for assistive technology otherwise. 'header' makes the cell a header, so a screen reader announces it with the values it heads: - In a row that holds a cell without 'header', it is a 'rowheader' and names its row, for example "web-app" in a row of a service's values. - In a row of 'header' cells alone, it is a 'columnheader', which is what a table with no 'TableColumn' heads its columns with. The role is on the host so the cell stays a child of its row in the flat tree, which keeps the table structure intact. In a 'grid' table a value is a 'gridcell', and the table gives the cell a 'tabindex' so focus can rest on it. */
16421
17339
  "helix-headless-table-cell": DefineCustomElement<
16422
17340
  HelixHeadlessTableCell,
16423
17341
  HelixHeadlessTableCellVueProps,
@@ -16429,13 +17347,13 @@ export interface WcToolkitVueGlobalComponents {
16429
17347
  HelixHeadlessTableColumnVueProps,
16430
17348
  HelixHeadlessTableColumnVueEvents
16431
17349
  >;
16432
- /** 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. **Sorting.** A column with 'sortable' and a 'field' draws its heading as a button that 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. 1. Each press cycles the column through ascending, descending, and the order the rows were written in, which keeps a server's own ranking reachable. 2. 'helix-sort' asks first, with 'field:direction', or empty for the written order. Refuse it to keep the order, or to sort the rows yourself and set 'sort'. 3. 'helix-sorted' follows once the order stands, and 'sort' holds it. 4. The heading carries 'aria-sort', and a screen reader hears 'sorted-label' ("Sorted by Name, ascending") or 'unsorted-label' from a polite region. Tab reaches each sort button, and Enter or Space presses it. 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. **Selecting.** 'selectable' adds a column of checkboxes. 1. Each row is known by its 'value', or by its place among the rows where it has none, and 'selected' holds the chosen keys, comma separated, the same shape 'DataTable' uses. 'default-selected' is where it starts. 2. A row's checkbox is named by 'select-row-label' ("Select {row}") with the words of the row's first cell. The checkbox in the heading selects every row, and shows a dash while only some are chosen. 3. 'helix-select' asks first, with every key the change would leave. Refuse it to keep the selection. 'helix-selected' follows once it stands. 4. A chosen row takes ':state(selected)', and a screen reader hears 'selected-label' ("2 selected") from a polite region. Tab reaches each checkbox, and Space ticks it. 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. */
17350
+ /** 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. **Sorting.** A column with 'sortable' and a 'field' draws its heading as a button that 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. 1. Each press cycles the column through ascending, descending, and the order the rows were written in, which keeps a server's own ranking reachable. 2. 'helix-sort' asks first, with 'field:direction', or empty for the written order. Refuse it to keep the order, or to sort the rows yourself and set 'sort'. 3. 'helix-sorted' follows once the order stands, and 'sort' holds it. 4. The heading carries 'aria-sort', and a screen reader hears 'sorted-label' ("Sorted by Name, ascending") or 'unsorted-label' from a polite region. Tab reaches each sort button, and Enter or Space presses it. 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. **Selecting.** 'selectable' adds a column of checkboxes. 1. Each row is known by its 'value', or by its place among the rows where it has none, and 'selected' holds the chosen keys, comma separated, the same shape 'DataTable' uses. 'default-selected' is where it starts. 2. A row's checkbox is named by 'select-row-label' ("Select {row}") with the words of the row's first cell. The checkbox in the heading selects every row, and shows a dash while only some are chosen. 3. 'helix-select' asks first, with every key the change would leave. Refuse it to keep the selection. 'helix-selected' follows once it stands. 4. A chosen row takes ':state(selected)', and a screen reader hears 'selected-label' ("2 selected") from a polite region. Tab reaches each checkbox, and Space ticks it. To act on one row, put a link or a button in a cell, or give the row an 'href'. **Moving rows.** 'reorderable' adds a column of grips before the checkboxes, under a heading named by 'row-grips-label'. 1. Each row is known by its 'value', or by its place among the rows where it has none, as for selecting. Give rows a 'value' when they move, so a key stays with its row. 2. A grip is a button named by 'move-row-label' ("Move {row}") with the words of the row's first cell. Drag it to move its row, and the page scrolls near an edge. Or press it with Space, Enter, or a click to pick the row up, move it with Up, Down, Home, and End, and press it again to drop it. A click on another row drops it there, and Escape puts it back. 3. 'helix-before-reorder' asks first, and 'helix-reorder' follows with 'keys', every row's key in the new order. **You move the rows**: the table moves no element of yours, and focus goes back to the moved row's grip once you have. 4. Each step is said in the table's live region, in words you can change: 'picked-up-label', 'moved-label', 'dropped-label', and 'canceled-label'. The grips do nothing while a sort is set. **A grid.** 'grid' makes the table one tab stop that the arrow keys move through cell by cell, the headings included, as React Aria's table is. The table is then a 'grid' and each value a 'gridcell', and the table gives every cell a 'tabindex' so focus can rest on it: set 'grid' only where the cells may carry one. For typeahead and range selection, use 'DataTable'. | Key | What it does | |---|---| | Right, Left | Moves one cell along the row. Left moves on, on a right-to-left page. | | Down, Up | Moves one row, the headings included. | | Home, End | Moves to the first or the last cell of the row. | | Control with Home or End | Moves to the first or the last cell of the table. | | Page Down, Page Up | Moves by the rows that fit in view. | | Enter, F2 | Moves into the cell's links and controls. Escape or F2 moves back to the cell, and Tab moves between the controls of one cell. | | Enter on a cell of a row with 'href' | Follows the row's link. | | Enter, Space on a sortable heading | Sorts by the column. | | Space on a row, Enter or Space on its checkbox cell | Selects the row, in a 'selectable' table. | | Enter or Space on a grip cell | Picks the row up, or drops it, in a 'reorderable' table. Up, Down, Home, and End move a row picked up, and Escape puts it back. | | Control or Command with A | Selects every row, in a 'selectable' table. | | Tab | Leaves the table. | 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. */
16433
17351
  "helix-headless-table": DefineCustomElement<
16434
17352
  HelixHeadlessTable,
16435
17353
  HelixHeadlessTableVueProps,
16436
17354
  HelixHeadlessTableVueEvents
16437
17355
  >;
16438
- /** 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. **'href' makes the whole row a link**, as a row action does in React Aria's table: a press anywhere on the row follows it, except on a link or a control of the row's own, and Control, Command or Shift open it the way they open a link. A drag that selects text follows nothing. A row in a table is not a stop of its own, so put the same link in a cell, usually the row header, which is what the keyboard and a screen reader reach. */
17356
+ /** 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. In a 'reorderable' table the row draws a grip cell before those, holding a button named by the table's 'move-row-label', and 'value' is the key 'helix-reorder' lists it by. The table says which row is moving and where the drop indicator is, with the 'dragging', 'drop-before', and 'drop-after' states. **'href' makes the whole row a link**, as a row action does in React Aria's table: a press anywhere on the row follows it, except on a link or a control of the row's own, and Control, Command or Shift open it the way they open a link. A drag that selects text follows nothing. A row in a table is not a stop of its own, so put the same link in a cell, usually the row header, which is what the keyboard and a screen reader reach. In a 'grid' table, Enter on any cell of the row follows it as well. */
16439
17357
  "helix-headless-table-row": DefineCustomElement<
16440
17358
  HelixHeadlessTableRow,
16441
17359
  HelixHeadlessTableRowVueProps,
@@ -16507,7 +17425,7 @@ export interface WcToolkitVueGlobalComponents {
16507
17425
  HelixHeadlessTimelineVueProps,
16508
17426
  HelixHeadlessTimelineVueEvents
16509
17427
  >;
16510
- /** 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. Give it a 'heading' and a 'description', and the heading names it and the description describes it, for a message with a title and a line of detail. The region says each message once as it arrives, a 'danger' one assertively, so a message is never a live region of its own. 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. */
17428
+ /** 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. It pauses while the pointer or focus is on the message, and while the page is hidden, so a message is not spent in a background tab. **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. Give it a 'heading' and a 'description', and the heading names it and the description describes it, for a message with a title and a line of detail. The region says each message once as it arrives, a 'danger' one assertively, so a message is never a live region of its own. 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. */
16511
17429
  "helix-headless-toast-item": DefineCustomElement<
16512
17430
  HelixHeadlessToastItem,
16513
17431
  HelixHeadlessToastItemVueProps,
@@ -16531,13 +17449,13 @@ export interface WcToolkitVueGlobalComponents {
16531
17449
  HelixHeadlessToggleVueProps,
16532
17450
  HelixHeadlessToggleVueEvents
16533
17451
  >;
16534
- /** 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 toggle group of pressed buttons, 'selection-mode="multiple"', is walked through the same way, each toggle a stop on the toolbar's axis, as React Aria's toolbar walks its toggle buttons. Another nested composite, such as a radio-style 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. A toolbar inside another toolbar, a Helix one or the page's own 'role="toolbar"', is a 'group' of the outer one, as React Aria's is: the outer toolbar's arrows walk through its controls and on past them, and it takes no keys and no tab stop of its own. A server renders it as a toolbar, having no parent to read, until it upgrades. */
17452
+ /** 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 Divider in the toolbar is a separator across the toolbar's axis, as React Aria's is: vertical in a horizontal toolbar and horizontal in a vertical one, without an 'orientation' of its own. 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. **Keyboard.** Tab enters the toolbar on the control that last had focus, the first control at the start, and the next Tab leaves it. | Key | What it does | |---|---| | Right | Moves to the next control in a horizontal toolbar, from the last back to the first. | | Left | Moves to the control before in a horizontal toolbar, from the first round to the last. | | Down, Up | The same in a vertical toolbar. | | Home, End | Moves to the first or the last control. | Left and Right swap on a right-to-left page, where the first control is on the right. The arrows across the toolbar's axis are left to the control that has focus, so a radio-style toggle group or a select answers them itself. The toolbar is 'role="toolbar"' with 'aria-orientation', named by 'label'. The stop moves through a control's own 'focusable' property where it has one, as Button, Select and Toggle Group do. A control without one has 'tabindex' written on the element that takes focus: a native element itself, or the control inside a custom element's open shadow root, so the host keeps the markup you rendered. Only a custom element whose shadow root is closed takes it on the host. A toggle group of pressed buttons, 'selection-mode="multiple"', is walked through the same way, each toggle a stop on the toolbar's axis, as React Aria's toolbar walks its toggle buttons. Another nested composite, such as a radio-style 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. A toolbar inside another toolbar, a Helix one or the page's own 'role="toolbar"', is a 'group' of the outer one, as React Aria's is: the outer toolbar's arrows walk through its controls and on past them, and it takes no keys and no tab stop of its own. A server renders it as a toolbar, having no parent to read, until it upgrades. */
16535
17453
  "helix-headless-toolbar": DefineCustomElement<
16536
17454
  HelixHeadlessToolbar,
16537
17455
  HelixHeadlessToolbarVueProps,
16538
17456
  HelixHeadlessToolbarVueEvents
16539
17457
  >;
16540
- /** 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. In the 'for' form the tooltip itself is out of the accessibility tree while its bubble is down, so a reader walking the page meets its words once, as the trigger's description. 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, unless you set 'hoverable="false"'. 'delay' is how long the pointer rests before it shows, and 'delay-out' how long it stays once the pointer leaves. 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. */
17458
+ /** The trigger 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. **Place the tooltip beside its trigger, name the trigger with 'for', and name the tooltip in the trigger's 'aria-describedby'.** The description is then in your own markup, so it is in the server's HTML and in the accessibility tree at rest, in every browser, before anyone points at the trigger or focuses it: '''html <helix-headless-button aria-describedby="save-tip" id="save">Save</helix-headless-button> <helix-headless-tooltip content="Save your work" for="save" id="save-tip"></helix-headless-tooltip> ''' Without the attribute, the tooltip links itself through an element reference on the control that takes focus, and it never writes into your markup before you act, so hydration stays intact. 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 you first point at it or focus it, so a screen reader in reading mode meets it with no description until then. Where the browser has no element references, nothing links the two, and the tooltip warns once on first open. The tooltip can also wrap its trigger, which describes a Helix component and leaves a plain element undescribed. In the 'for' form the tooltip itself is out of the accessibility tree while its bubble is down, so you meet its words once, as the trigger's description. 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, unless you set 'hoverable="false"'. 'delay' is how long the pointer rests before it shows, and 'delay-out' how long it stays once the pointer leaves. 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. */
16541
17459
  "helix-headless-tooltip": DefineCustomElement<
16542
17460
  HelixHeadlessTooltip,
16543
17461
  HelixHeadlessTooltipVueProps,
@@ -16555,13 +17473,13 @@ export interface WcToolkitVueGlobalComponents {
16555
17473
  HelixHeadlessTourStopVueProps,
16556
17474
  HelixHeadlessTourStopVueEvents
16557
17475
  >;
16558
- /** '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, or 'selection-mode="leaf"', where only the items at the ends are chosen. 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. */
17476
+ /** '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, or 'selection-mode="leaf"', where only the items at the ends are chosen. 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. **In a 'reorderable' tree, the row has a grip** at its far end, which a pointer drags to move the item among its siblings. The tree says which item is moving and where the drop indicator is, with the 'dragging', 'drop-before', and 'drop-after' states. */
16559
17477
  "helix-headless-tree-item": DefineCustomElement<
16560
17478
  HelixHeadlessTreeItem,
16561
17479
  HelixHeadlessTreeItemVueProps,
16562
17480
  HelixHeadlessTreeItemVueEvents
16563
17481
  >;
16564
- /** 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'. 'selection-mode="leaf"' chooses one item at a time and only the items at the ends: a press, Enter or Space on a branch opens or closes it and chooses nothing, as Web Awesome's 'leaf' mode does. Keys: Up and Down Arrow move between the items a reader can see; Right Arrow opens a shut branch and then moves into it, and Left Arrow shuts an open one and then moves to its parent, the two swapping on a right-to-left page. Home and End go to the first and the last item, Enter and Space choose or open, and the tree's one tab stop stays on the item last reached. In a tree of check marks, Control+A (Command+A on an Apple keyboard) checks every item or clears them all, and Shift with Up or Down Arrow moves and checks. */
17482
+ /** 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'. 'selection-mode="leaf"' chooses one item at a time and only the items at the ends: a press, Enter or Space on a branch opens or closes it and chooses nothing, as Web Awesome's 'leaf' mode does. Keys: Up and Down Arrow move between the items a reader can see; Right Arrow opens a shut branch and then moves into it, and Left Arrow shuts an open one and then moves to its parent, the two swapping on a right-to-left page. Home and End go to the first and the last item, Enter and Space choose or open, and the tree's one tab stop stays on the item last reached. In a tree of check marks, Control+A (Command+A on an Apple keyboard) checks every item or clears them all, and Shift with Up or Down Arrow moves and checks. **'reorderable' lets you move items among their siblings.** Alt with Up or Down moves the focused item a place, and Alt with Home or End to the first or the last place among its siblings, as the APG's rearrangeable listbox does. Each row gets a grip at its far end: drag it to move the item, and the tree scrolls near an edge. A click on a grip picks the item up and a click on one of its siblings drops it there, which needs no drag. The arrows move an item picked up that way, Enter or Space drops it, and Escape puts it back. The tree says each step in its 'live' region. A drop sends 'helix-before-reorder', which you can refuse, and then 'helix-reorder', whose 'keys' hold the siblings in the new order. **You move the items**: the tree moves no element of yours, and focus follows the moved item once you have. Moving an item into another branch is not part of this. */
16565
17483
  "helix-headless-tree": DefineCustomElement<
16566
17484
  HelixHeadlessTree,
16567
17485
  HelixHeadlessTreeVueProps,
@@ -16597,7 +17515,7 @@ export interface WcToolkitVueGlobalComponents {
16597
17515
  HelixHeadlessVideoVueProps,
16598
17516
  HelixHeadlessVideoVueEvents
16599
17517
  >;
16600
- /** 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. **A grid.** 'columns' lays the items out that many to a line, as a grid of equal columns, and windows the set a line at a time, as React Aria's grid layout does. Each item draws one element, a cell of the grid, and 'estimate' is the height of a line. Space the items with padding inside each one, which the list measures with the line. **Keyboard.** The list is one tab stop. | Key | What it does | |---|---| | Down, Up | Moves to the next or the previous item, or in a grid to the item in the same column on the next or the previous line. | | Right, Left | In a grid, moves to the next or the previous item along the line, the other way round on a right-to-left page. | | Home, End | Moves to the first or the last item. | | Page Down, Page Up | Moves by the number of items, or of lines in a grid, on screen. | | A letter or a word | Moves to the next item whose text starts with what you typed. | | Tab | Moves into the focused row's own links and buttons, then out of the list. | An item that is not drawn is scrolled into view and focused, so a keyboard reaches the whole set. When the row holding the tab stop scrolls away, the stop moves to the first row on screen. Typing matches each item's 'text-field', which is the first 'data-field' of the row template by default, or the item itself when it is a string or a number. 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. **Selecting.** 'selection-mode' makes the list a list box a reader chooses from: 'single' selects one item and 'multiple' any number. Space or a press selects an item, Shift with Space, an arrow, Home, End or a press takes in the items from the last one chosen, and Control or Command with A selects them all, in 'multiple'. 'value' holds the chosen items' keys, separated by commas, in the order of the set: 'key-field' names each item's key, and a string or a number item is its own key. A change asks with 'helix-before-change' and tells with 'change'. Each row is an 'option' marked 'aria-selected', so a row's own links and buttons are not reached there: keep those to a list without 'selection-mode'. **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. While you fetch, set 'loading': the list is busy, and a row after the last item says "Loading more" ('loading-label', or your own content in the 'loading' slot). 'scrollToIndex' takes a reader to an item. **Row height.** Rows are placed by 'estimate' until they are drawn. Then the list reads the drawn rows' height once and places every row by it, so a wrong estimate still reaches the last item. Set 'measured' for rows of different heights. 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. */
17518
+ /** 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. **A grid.** 'columns' lays the items out that many to a line, as a grid of equal columns, and windows the set a line at a time, as React Aria's grid layout does. Each item draws one element, a cell of the grid, and 'estimate' is the height of a line. Space the items with padding inside each one, which the list measures with the line. **Keyboard.** The list is one tab stop. | Key | What it does | |---|---| | Down, Up | Moves to the next or the previous item, or in a grid to the item in the same column on the next or the previous line. | | Right, Left | In a grid, moves to the next or the previous item along the line, the other way round on a right-to-left page. | | Home, End | Moves to the first or the last item. | | Page Down, Page Up | Moves by the number of items, or of lines in a grid, on screen. | | A letter or a word | Moves to the next item whose text starts with what you typed. | | Tab | Moves into the focused row's own links and buttons, then out of the list. | An item that is not drawn is scrolled into view and focused, so a keyboard reaches the whole set. When the row holding the tab stop scrolls away, the stop moves to the first row on screen. Typing matches each item's 'text-field', which is the first 'data-field' of the row template by default, or the item itself when it is a string or a number. 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. **Selecting.** 'selection-mode' makes the list a list box a reader chooses from: 'single' selects one item and 'multiple' any number. Space or a press selects an item, Shift with Space, an arrow, Home, End or a press takes in the items from the last one chosen, and Control or Command with A selects them all, in 'multiple'. 'value' holds the chosen items' keys, separated by commas, in the order of the set: 'key-field' names each item's key, and a string or a number item is its own key. A change asks with 'helix-before-change' and tells with 'change'. Each row is an 'option' marked 'aria-selected', so a row's own links and buttons are not reached there: keep those to a list without 'selection-mode'. **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. While you fetch, set 'loading': the list is busy, and a row after the last item says "Loading more" ('loading-label', or your own content in the 'loading' slot). 'scrollToIndex' takes a reader to an item. **Row height.** Rows are placed by 'estimate' until they are drawn. Then the list reads the drawn rows' height once and places every row by it, so a wrong estimate still reaches the last item. Set 'measured' for rows of different heights. Once the list draws rows of different heights, such as rows that wrap on a narrow screen, it places each row by its own height whether 'measured' is set or not. 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. */
16601
17519
  "helix-headless-virtual-list": DefineCustomElement<
16602
17520
  HelixHeadlessVirtualList,
16603
17521
  HelixHeadlessVirtualListVueProps,