@fusion.dev/helix-headless 0.144.0 → 0.146.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 (319) hide show
  1. package/custom-elements.json +15195 -4240
  2. package/dist/accordion/item/accordion-item.d.ts +62 -12
  3. package/dist/accordion/item/accordion-item.js +41 -10
  4. package/dist/accordion/root/accordion-root.d.ts +14 -5
  5. package/dist/accordion/root/accordion-root.js +7 -1
  6. package/dist/announcement/root/announcement-root.d.ts +24 -3
  7. package/dist/announcement/root/announcement-root.js +39 -2
  8. package/dist/app-header/root/app-header-root.d.ts +12 -0
  9. package/dist/app-header/root/app-header-root.js +13 -1
  10. package/dist/app-header/sectioning.d.ts +9 -0
  11. package/dist/app-header/sectioning.js +27 -0
  12. package/dist/avatar/group/avatar-group.d.ts +20 -14
  13. package/dist/avatar/group/avatar-group.js +17 -19
  14. package/dist/badge/root/badge-root.d.ts +3 -1
  15. package/dist/badge/root/badge-root.js +2 -2
  16. package/dist/bar-chart/root/bar-chart-root.d.ts +18 -1
  17. package/dist/bar-chart/root/bar-chart-root.js +52 -15
  18. package/dist/bar-chart/stack.d.ts +15 -0
  19. package/dist/bar-chart/stack.js +19 -0
  20. package/dist/breadcrumbs/root/breadcrumbs-root.d.ts +57 -1
  21. package/dist/breadcrumbs/root/breadcrumbs-root.js +73 -3
  22. package/dist/button/root/button-root.d.ts +26 -0
  23. package/dist/button/root/button-root.js +38 -18
  24. package/dist/button-group/root/button-group-root.d.ts +2 -1
  25. package/dist/button-group/root/button-group-root.js +5 -1
  26. package/dist/canvas/node/canvas-node.d.ts +4 -3
  27. package/dist/canvas/node/canvas-node.js +3 -2
  28. package/dist/canvas/root/canvas-root.d.ts +38 -3
  29. package/dist/canvas/root/canvas-root.js +123 -42
  30. package/dist/card/root/card-root.d.ts +24 -3
  31. package/dist/card/root/card-root.js +20 -8
  32. package/dist/carousel/root/carousel-root.d.ts +133 -4
  33. package/dist/carousel/root/carousel-root.js +174 -24
  34. package/dist/carousel/stops.d.ts +20 -0
  35. package/dist/carousel/stops.js +30 -0
  36. package/dist/chat/composer/chat-composer.d.ts +38 -6
  37. package/dist/chat/composer/chat-composer.js +42 -9
  38. package/dist/chat/message/chat-message.d.ts +32 -1
  39. package/dist/chat/message/chat-message.js +27 -10
  40. package/dist/chat/naming.d.ts +26 -0
  41. package/dist/chat/naming.js +14 -0
  42. package/dist/chat/root/chat-root.d.ts +58 -0
  43. package/dist/chat/root/chat-root.js +43 -3
  44. package/dist/checkbox/root/checkbox-root.d.ts +20 -0
  45. package/dist/checkbox/root/checkbox-root.js +14 -1
  46. package/dist/checkbox-group/root/checkbox-group-root.d.ts +8 -2
  47. package/dist/checkbox-group/root/checkbox-group-root.js +12 -10
  48. package/dist/checkbox-group/select-all.d.ts +27 -0
  49. package/dist/checkbox-group/select-all.js +12 -0
  50. package/dist/code-block/highlight.d.ts +15 -0
  51. package/dist/code-block/highlight.js +4 -0
  52. package/dist/code-block/root/code-block-root.d.ts +57 -2
  53. package/dist/code-block/root/code-block-root.js +63 -8
  54. package/dist/color-input/root/color-input-root.d.ts +3 -0
  55. package/dist/color-input/root/color-input-root.js +6 -3
  56. package/dist/color-picker/root/color-picker-root.d.ts +33 -4
  57. package/dist/color-picker/root/color-picker-root.js +80 -21
  58. package/dist/color-picker/swatches.d.ts +12 -0
  59. package/dist/color-picker/swatches.js +26 -0
  60. package/dist/combobox/root/combobox-root.d.ts +43 -0
  61. package/dist/combobox/root/combobox-root.js +79 -15
  62. package/dist/command/root/command-root.d.ts +16 -1
  63. package/dist/command/root/command-root.js +22 -4
  64. package/dist/copy-button/root/copy-button-root.d.ts +26 -1
  65. package/dist/copy-button/root/copy-button-root.js +12 -5
  66. package/dist/data-table/index.d.ts +1 -1
  67. package/dist/data-table/index.js +1 -1
  68. package/dist/data-table/keys.d.ts +24 -0
  69. package/dist/data-table/keys.js +24 -0
  70. package/dist/data-table/root/data-table-root.d.ts +170 -13
  71. package/dist/data-table/root/data-table-root.js +294 -52
  72. package/dist/data-table/tree.d.ts +55 -0
  73. package/dist/data-table/tree.js +54 -0
  74. package/dist/date-input/root/date-input-root.d.ts +3 -1
  75. package/dist/date-input/root/date-input-root.js +18 -7
  76. package/dist/date-picker/root/date-picker-root.js +12 -6
  77. package/dist/description-list/item/description-list-item.d.ts +17 -2
  78. package/dist/description-list/item/description-list-item.js +15 -2
  79. package/dist/description-list/root/description-list-root.d.ts +27 -1
  80. package/dist/description-list/root/description-list-root.js +26 -1
  81. package/dist/dialog/description.js +15 -1
  82. package/dist/dialog/root/dialog-root.d.ts +8 -2
  83. package/dist/dialog/root/dialog-root.js +16 -1
  84. package/dist/divider/root/divider-root.d.ts +3 -0
  85. package/dist/divider/root/divider-root.js +2 -1
  86. package/dist/donut-chart/root/donut-chart-root.d.ts +31 -0
  87. package/dist/donut-chart/root/donut-chart-root.js +48 -1
  88. package/dist/drawer/reveal.d.ts +8 -0
  89. package/dist/drawer/reveal.js +1 -0
  90. package/dist/drawer/root/drawer-root.d.ts +59 -0
  91. package/dist/drawer/root/drawer-root.js +63 -4
  92. package/dist/drilldown/item/drilldown-item.d.ts +11 -6
  93. package/dist/drilldown/item/drilldown-item.js +8 -5
  94. package/dist/drilldown/root/drilldown-root.d.ts +29 -0
  95. package/dist/drilldown/root/drilldown-root.js +28 -5
  96. package/dist/element-events.generated.js +83 -12
  97. package/dist/empty/root/empty-root.d.ts +3 -1
  98. package/dist/empty/root/empty-root.js +3 -2
  99. package/dist/file-input/root/file-input-root.d.ts +69 -6
  100. package/dist/file-input/root/file-input-root.js +82 -19
  101. package/dist/file-input/screen.d.ts +2 -1
  102. package/dist/filter-input/menu/filter-menu.d.ts +5 -0
  103. package/dist/filter-input/menu/filter-menu.js +16 -4
  104. package/dist/filter-input/root/filter-input-root.d.ts +30 -6
  105. package/dist/filter-input/root/filter-input-root.js +1 -1
  106. package/dist/filter-input/suggest.d.ts +28 -3
  107. package/dist/filter-input/suggest.js +18 -8
  108. package/dist/format-date/root/format-date-root.d.ts +9 -16
  109. package/dist/format-date/root/format-date-root.js +10 -27
  110. package/dist/heatmap/root/heatmap-root.d.ts +24 -13
  111. package/dist/heatmap/root/heatmap-root.js +34 -12
  112. package/dist/icon/root/icon-root.d.ts +12 -1
  113. package/dist/icon/root/icon-root.js +21 -10
  114. package/dist/icon/settle.d.ts +7 -0
  115. package/dist/icon/settle.js +10 -0
  116. package/dist/icon-button/root/icon-button-root.d.ts +2 -0
  117. package/dist/image/root/image-root.d.ts +5 -1
  118. package/dist/image/root/image-root.js +10 -2
  119. package/dist/input/root/input-root.d.ts +13 -3
  120. package/dist/input/root/input-root.js +12 -3
  121. package/dist/kbd/root/kbd-root.d.ts +35 -1
  122. package/dist/kbd/root/kbd-root.js +23 -4
  123. package/dist/legend/root/legend-root.d.ts +55 -8
  124. package/dist/legend/root/legend-root.js +55 -13
  125. package/dist/lightbox/root/lightbox-root.d.ts +49 -6
  126. package/dist/lightbox/root/lightbox-root.js +86 -19
  127. package/dist/lightbox/zoom-controller.d.ts +59 -0
  128. package/dist/lightbox/zoom-controller.js +128 -0
  129. package/dist/lightbox/zoom.d.ts +22 -0
  130. package/dist/lightbox/zoom.js +16 -0
  131. package/dist/line-chart/root/line-chart-root.d.ts +22 -1
  132. package/dist/line-chart/root/line-chart-root.js +21 -1
  133. package/dist/list/item/list-item.d.ts +70 -1
  134. package/dist/list/item/list-item.js +77 -6
  135. package/dist/list/numbering.d.ts +14 -0
  136. package/dist/list/numbering.js +8 -0
  137. package/dist/list/root/list-root.d.ts +155 -9
  138. package/dist/list/root/list-root.js +246 -4
  139. package/dist/list/selection.d.ts +49 -0
  140. package/dist/list/selection.js +30 -0
  141. package/dist/listbox/root/listbox-root.d.ts +37 -1
  142. package/dist/listbox/root/listbox-root.js +49 -4
  143. package/dist/loader/busy.d.ts +10 -0
  144. package/dist/loader/busy.js +11 -0
  145. package/dist/loader/root/loader-root.d.ts +9 -2
  146. package/dist/loader/root/loader-root.js +23 -3
  147. package/dist/map/root/map-root.d.ts +6 -2
  148. package/dist/map/root/map-root.js +5 -2
  149. package/dist/megamenu/root/megamenu-root.d.ts +62 -0
  150. package/dist/megamenu/root/megamenu-root.js +90 -5
  151. package/dist/menu/index.d.ts +1 -0
  152. package/dist/menu/index.js +1 -0
  153. package/dist/menu/item/menu-item.d.ts +87 -11
  154. package/dist/menu/item/menu-item.js +78 -22
  155. package/dist/menu/root/menu-root.d.ts +39 -1
  156. package/dist/menu/root/menu-root.js +65 -8
  157. package/dist/menu/section/menu-section.d.ts +55 -0
  158. package/dist/menu/section/menu-section.js +60 -0
  159. package/dist/meter/root/meter-root.d.ts +20 -1
  160. package/dist/meter/root/meter-root.js +11 -15
  161. package/dist/navigation/root/navigation-root.d.ts +18 -2
  162. package/dist/navigation/root/navigation-root.js +29 -3
  163. package/dist/notifications/root/notifications-root.d.ts +25 -0
  164. package/dist/notifications/root/notifications-root.js +33 -5
  165. package/dist/number-input/root/number-input-root.d.ts +17 -8
  166. package/dist/number-input/root/number-input-root.js +2 -7
  167. package/dist/object-inspector/root/object-inspector-root.d.ts +161 -32
  168. package/dist/object-inspector/root/object-inspector-root.js +264 -123
  169. package/dist/object-inspector/rows.d.ts +75 -0
  170. package/dist/object-inspector/rows.js +119 -0
  171. package/dist/option/root/option-root.d.ts +5 -3
  172. package/dist/outline/levels.d.ts +31 -0
  173. package/dist/outline/levels.js +23 -0
  174. package/dist/outline/root/outline-root.d.ts +86 -3
  175. package/dist/outline/root/outline-root.js +95 -12
  176. package/dist/pagination/size/pagination-size.d.ts +12 -2
  177. package/dist/pagination/size/pagination-size.js +20 -5
  178. package/dist/pin-input/code.d.ts +10 -0
  179. package/dist/pin-input/code.js +13 -0
  180. package/dist/pin-input/root/pin-input-root.d.ts +25 -1
  181. package/dist/pin-input/root/pin-input-root.js +10 -11
  182. package/dist/popover/hide-outside.d.ts +14 -0
  183. package/dist/popover/hide-outside.js +41 -0
  184. package/dist/popover/root/popover-root.d.ts +57 -7
  185. package/dist/popover/root/popover-root.js +58 -3
  186. package/dist/progress/root/progress-root.d.ts +20 -0
  187. package/dist/progress/root/progress-root.js +15 -15
  188. package/dist/qr-code/export.d.ts +26 -1
  189. package/dist/qr-code/export.js +14 -0
  190. package/dist/qr-code/root/qr-code-root.d.ts +19 -5
  191. package/dist/qr-code/root/qr-code-root.js +58 -9
  192. package/dist/quote/marks.d.ts +8 -0
  193. package/dist/quote/marks.js +5 -0
  194. package/dist/quote/root/quote-root.d.ts +14 -2
  195. package/dist/quote/root/quote-root.js +23 -1
  196. package/dist/radio/group/radio-group.d.ts +4 -10
  197. package/dist/radio/group/radio-group.js +5 -10
  198. package/dist/radio/root/radio-root.d.ts +6 -2
  199. package/dist/radio/root/radio-root.js +6 -1
  200. package/dist/rating/root/rating-root.d.ts +10 -5
  201. package/dist/rating/root/rating-root.js +32 -8
  202. package/dist/rating/steps.d.ts +7 -0
  203. package/dist/rating/steps.js +9 -0
  204. package/dist/scatter-chart/fit.d.ts +15 -0
  205. package/dist/scatter-chart/fit.js +35 -0
  206. package/dist/scatter-chart/root/scatter-chart-root.d.ts +21 -1
  207. package/dist/scatter-chart/root/scatter-chart-root.js +30 -17
  208. package/dist/scroll-area/root/scroll-area-root.d.ts +84 -0
  209. package/dist/scroll-area/root/scroll-area-root.js +106 -7
  210. package/dist/scroll-area/scrollbar-controller.d.ts +111 -0
  211. package/dist/scroll-area/scrollbar-controller.js +172 -0
  212. package/dist/scroll-area/scrollbar.d.ts +92 -0
  213. package/dist/scroll-area/scrollbar.js +33 -0
  214. package/dist/select/root/select-root.d.ts +15 -0
  215. package/dist/select/root/select-root.js +18 -6
  216. package/dist/skeleton/root/skeleton-root.d.ts +3 -0
  217. package/dist/skeleton/root/skeleton-root.js +4 -2
  218. package/dist/skip-link/root/skip-link-root.js +2 -2
  219. package/dist/slider/root/slider-root.d.ts +41 -4
  220. package/dist/slider/root/slider-root.js +23 -3
  221. package/dist/sparkline/readings.d.ts +18 -0
  222. package/dist/sparkline/readings.js +19 -0
  223. package/dist/sparkline/root/sparkline-root.d.ts +78 -7
  224. package/dist/sparkline/root/sparkline-root.js +118 -23
  225. package/dist/speed-dial/root/speed-dial-root.js +2 -2
  226. package/dist/splitter/root/splitter-root.d.ts +20 -12
  227. package/dist/splitter/root/splitter-root.js +226 -203
  228. package/dist/splitter/snap.d.ts +9 -0
  229. package/dist/splitter/snap.js +12 -0
  230. package/dist/stat/root/stat-root.d.ts +14 -5
  231. package/dist/stat/root/stat-root.js +21 -5
  232. package/dist/steps/reach.d.ts +20 -0
  233. package/dist/steps/reach.js +15 -0
  234. package/dist/steps/root/steps-root.d.ts +76 -0
  235. package/dist/steps/root/steps-root.js +93 -1
  236. package/dist/steps/step/step.d.ts +45 -2
  237. package/dist/steps/step/step.js +33 -6
  238. package/dist/switch/root/switch-root.d.ts +10 -0
  239. package/dist/table/column/table-column.d.ts +11 -10
  240. package/dist/table/column/table-column.js +8 -19
  241. package/dist/table/root/table-root.d.ts +126 -4
  242. package/dist/table/root/table-root.js +156 -6
  243. package/dist/table/row/table-row.d.ts +47 -1
  244. package/dist/table/row/table-row.js +39 -2
  245. package/dist/tabs/panel/tab-panel.d.ts +22 -5
  246. package/dist/tabs/panel/tab-panel.js +34 -6
  247. package/dist/tabs/root/tabs-root.d.ts +37 -1
  248. package/dist/tabs/root/tabs-root.js +22 -4
  249. package/dist/tabs/tab/tab.d.ts +41 -4
  250. package/dist/tabs/tab/tab.js +49 -3
  251. package/dist/tag/group/tag-group.d.ts +31 -4
  252. package/dist/tag/group/tag-group.js +46 -7
  253. package/dist/tag/root/tag-root.js +9 -2
  254. package/dist/textarea/root/textarea-root.d.ts +28 -1
  255. package/dist/textarea/root/textarea-root.js +40 -1
  256. package/dist/time-input/root/time-input-root.d.ts +5 -1
  257. package/dist/time-input/root/time-input-root.js +16 -8
  258. package/dist/time-picker/root/time-picker-root.d.ts +18 -4
  259. package/dist/time-picker/root/time-picker-root.js +7 -10
  260. package/dist/time-picker/wheel-name.d.ts +9 -0
  261. package/dist/time-picker/wheel-name.js +15 -0
  262. package/dist/timeline/group/timeline-group.d.ts +46 -0
  263. package/dist/timeline/group/timeline-group.js +37 -0
  264. package/dist/timeline/index.d.ts +1 -0
  265. package/dist/timeline/index.js +1 -0
  266. package/dist/timeline/root/timeline-root.d.ts +10 -3
  267. package/dist/toast/item/toast-item.d.ts +24 -18
  268. package/dist/toast/item/toast-item.js +36 -40
  269. package/dist/toast/root/toast-root.d.ts +6 -0
  270. package/dist/toast/root/toast-root.js +16 -1
  271. package/dist/toggle/group/toggle-group.d.ts +24 -3
  272. package/dist/toggle/group/toggle-group.js +34 -5
  273. package/dist/toolbar/root/toolbar-root.d.ts +13 -0
  274. package/dist/toolbar/root/toolbar-root.js +15 -5
  275. package/dist/tooltip/root/tooltip-root.d.ts +13 -2
  276. package/dist/tooltip/root/tooltip-root.js +9 -1
  277. package/dist/tour/back.d.ts +10 -0
  278. package/dist/tour/back.js +8 -0
  279. package/dist/tour/root/tour-root.d.ts +30 -2
  280. package/dist/tour/root/tour-root.js +34 -8
  281. package/dist/tree/item/tree-item.d.ts +61 -4
  282. package/dist/tree/item/tree-item.js +92 -20
  283. package/dist/tree/root/tree-root.d.ts +58 -0
  284. package/dist/tree/root/tree-root.js +80 -16
  285. package/dist/tree/selection.d.ts +24 -0
  286. package/dist/tree/selection.js +13 -0
  287. package/dist/trend/root/trend-root.d.ts +43 -18
  288. package/dist/trend/root/trend-root.js +31 -6
  289. package/dist/video/media-events.d.ts +44 -0
  290. package/dist/video/media-events.js +35 -0
  291. package/dist/video/root/video-root.d.ts +117 -18
  292. package/dist/video/root/video-root.js +93 -47
  293. package/dist/video-playlist/menu/video-playlist-menu.d.ts +5 -0
  294. package/dist/video-playlist/menu/video-playlist-menu.js +3 -1
  295. package/dist/video-playlist/order.d.ts +41 -0
  296. package/dist/video-playlist/order.js +34 -0
  297. package/dist/video-playlist/root/video-playlist-root.d.ts +77 -3
  298. package/dist/video-playlist/root/video-playlist-root.js +60 -16
  299. package/dist/virtual-list/controls.d.ts +4 -0
  300. package/dist/virtual-list/controls.js +30 -0
  301. package/dist/virtual-list/fill.d.ts +22 -0
  302. package/dist/virtual-list/fill.js +23 -0
  303. package/dist/virtual-list/keys.d.ts +15 -0
  304. package/dist/virtual-list/keys.js +24 -0
  305. package/dist/virtual-list/plan.d.ts +49 -0
  306. package/dist/virtual-list/plan.js +16 -0
  307. package/dist/virtual-list/root/virtual-list-root.d.ts +259 -26
  308. package/dist/virtual-list/root/virtual-list-root.js +333 -49
  309. package/lint.json +1 -1
  310. package/package.json +8 -8
  311. package/types/jsx.d.ts +8113 -1394
  312. package/types/svelte.d.ts +2 -0
  313. package/types/vue.d.ts +1678 -353
  314. package/dist/data-table/root/order.d.ts +0 -141
  315. package/dist/data-table/root/order.js +0 -76
  316. package/dist/listbox/range.d.ts +0 -17
  317. package/dist/listbox/range.js +0 -5
  318. package/dist/tag/selection.d.ts +0 -10
  319. package/dist/tag/selection.js +0 -12
@@ -4,6 +4,7 @@ registerElementEvents({
4
4
  'helix-headless-announcement': ['helix-dismiss'],
5
5
  'helix-headless-app-header': ['helix-scrolled'],
6
6
  'helix-headless-avatar': ['error', 'load'],
7
+ 'helix-headless-button': ['helix-press'],
7
8
  'helix-headless-callout': ['helix-dismiss'],
8
9
  'helix-headless-canvas': [
9
10
  'helix-before-move',
@@ -22,7 +23,7 @@ registerElementEvents({
22
23
  ],
23
24
  'helix-headless-carousel': ['helix-activate', 'helix-select'],
24
25
  'helix-headless-chat': ['helix-before-pin', 'helix-history', 'helix-pin', 'helix-send'],
25
- 'helix-headless-chat-composer': ['helix-send', 'input'],
26
+ 'helix-headless-chat-composer': ['helix-send', 'helix-typing', 'input'],
26
27
  'helix-headless-chat-message': ['helix-send'],
27
28
  'helix-headless-checkbox': ['change', 'helix-before-toggle', 'input'],
28
29
  'helix-headless-checkbox-group': ['change', 'helix-before-change', 'input'],
@@ -49,6 +50,7 @@ registerElementEvents({
49
50
  'helix-before-open',
50
51
  'helix-create',
51
52
  'helix-filter',
53
+ 'helix-load-more',
52
54
  'input',
53
55
  'toggle',
54
56
  ],
@@ -56,14 +58,17 @@ registerElementEvents({
56
58
  'helix-before-close',
57
59
  'helix-before-open',
58
60
  'helix-filter',
61
+ 'helix-load-more',
59
62
  'helix-select',
60
63
  'toggle',
61
64
  ],
62
- 'helix-headless-copy-button': ['helix-copy', 'helix-copy-error'],
65
+ 'helix-headless-copy-button': ['helix-copy', 'helix-copy-error', 'helix-press'],
63
66
  'helix-headless-data-table': [
64
67
  'helix-activate',
68
+ 'helix-expand',
65
69
  'helix-filter',
66
70
  'helix-filtered',
71
+ 'helix-load-more',
67
72
  'helix-navigate',
68
73
  'helix-reorder',
69
74
  'helix-reordered',
@@ -112,6 +117,7 @@ registerElementEvents({
112
117
  ],
113
118
  'helix-headless-heatmap': ['helix-resize'],
114
119
  'helix-headless-icon': ['error', 'load'],
120
+ 'helix-headless-icon-button': ['helix-press'],
115
121
  'helix-headless-image': ['error', 'load'],
116
122
  'helix-headless-input': ['change', 'helix-before-change', 'helix-clear', 'input'],
117
123
  'helix-headless-kbd': ['helix-shortcut'],
@@ -124,7 +130,15 @@ registerElementEvents({
124
130
  'helix-before-open',
125
131
  'toggle',
126
132
  ],
127
- 'helix-headless-listbox': ['change', 'helix-before-change', 'helix-filter', 'input'],
133
+ 'helix-headless-list': ['change', 'helix-action', 'helix-before-change'],
134
+ 'helix-headless-list-item': ['helix-action'],
135
+ 'helix-headless-listbox': [
136
+ 'change',
137
+ 'helix-before-change',
138
+ 'helix-filter',
139
+ 'helix-load-more',
140
+ 'input',
141
+ ],
128
142
  'helix-headless-map': [
129
143
  'change',
130
144
  'helix-activate',
@@ -137,6 +151,7 @@ registerElementEvents({
137
151
  'helix-map-rotate',
138
152
  'helix-map-tilt',
139
153
  'helix-map-zoom',
154
+ 'helix-toggle',
140
155
  ],
141
156
  'helix-headless-map-area': ['helix-map-part-change'],
142
157
  'helix-headless-map-buildings': ['helix-map-part-change'],
@@ -153,9 +168,18 @@ registerElementEvents({
153
168
  'helix-headless-menu-item': ['helix-before-toggle', 'helix-select'],
154
169
  'helix-headless-notification': ['helix-dismiss', 'helix-read'],
155
170
  'helix-headless-notification-group': ['helix-before-close', 'helix-before-open', 'toggle'],
156
- 'helix-headless-notifications': ['helix-dismiss', 'helix-read'],
171
+ 'helix-headless-notifications': ['helix-dismiss', 'helix-load-more', 'helix-read'],
157
172
  'helix-headless-number-input': ['change', 'helix-before-change', 'input'],
158
- 'helix-headless-object-inspector': ['helix-copy'],
173
+ 'helix-headless-object-inspector': [
174
+ 'helix-activate',
175
+ 'helix-before-activate',
176
+ 'helix-before-close',
177
+ 'helix-before-open',
178
+ 'helix-copy',
179
+ 'helix-filter',
180
+ 'helix-filtered',
181
+ 'toggle',
182
+ ],
159
183
  'helix-headless-option': ['helix-select'],
160
184
  'helix-headless-outline': ['helix-activate'],
161
185
  'helix-headless-pagination': ['helix-activate', 'helix-navigate'],
@@ -165,13 +189,21 @@ registerElementEvents({
165
189
  'helix-headless-qr-code': ['error'],
166
190
  'helix-headless-radio': ['helix-select'],
167
191
  'helix-headless-radio-group': ['change', 'helix-before-change', 'helix-select', 'input'],
168
- 'helix-headless-rating': ['change', 'helix-before-change', 'helix-clear', 'input'],
192
+ 'helix-headless-rating': [
193
+ 'change',
194
+ 'helix-before-change',
195
+ 'helix-clear',
196
+ 'helix-preview',
197
+ 'input',
198
+ ],
199
+ 'helix-headless-scroll-area': ['scroll', 'scrollend'],
169
200
  'helix-headless-select': [
170
201
  'change',
171
202
  'helix-before-change',
172
203
  'helix-before-close',
173
204
  'helix-before-open',
174
205
  'helix-filter',
206
+ 'helix-load-more',
175
207
  'input',
176
208
  'toggle',
177
209
  ],
@@ -193,12 +225,12 @@ registerElementEvents({
193
225
  'helix-headless-steps': ['helix-activate', 'helix-before-activate', 'helix-select'],
194
226
  'helix-headless-switch': ['change', 'helix-before-toggle', 'input'],
195
227
  'helix-headless-tab': ['helix-select'],
196
- 'helix-headless-table': ['helix-sort'],
197
- 'helix-headless-table-column': ['helix-before-resize'],
228
+ 'helix-headless-table': ['helix-select', 'helix-selected', 'helix-sort', 'helix-sorted'],
229
+ 'helix-headless-table-column': ['helix-before-resize', 'helix-resized'],
198
230
  'helix-headless-tabs': ['helix-activate', 'helix-before-activate', 'helix-select'],
199
231
  'helix-headless-tag': ['helix-dismiss'],
200
232
  'helix-headless-tag-group': ['change', 'helix-before-change', 'helix-dismiss'],
201
- 'helix-headless-textarea': ['change', 'helix-before-change', 'input'],
233
+ 'helix-headless-textarea': ['change', 'helix-before-change', 'helix-clear', 'input'],
202
234
  'helix-headless-time-input': [
203
235
  'change',
204
236
  'helix-before-change',
@@ -220,13 +252,52 @@ registerElementEvents({
220
252
  'helix-before-open',
221
253
  'helix-complete',
222
254
  'helix-tour-ask',
255
+ 'helix-tour-status',
223
256
  'toggle',
224
257
  ],
225
258
  'helix-headless-tour-stop': ['helix-tour-ask'],
226
259
  'helix-headless-tree': ['helix-activate', 'helix-before-activate', 'helix-select'],
227
- 'helix-headless-tree-item': ['helix-before-close', 'helix-before-open', 'helix-select', 'toggle'],
228
- 'helix-headless-video': ['ended', 'helix-next', 'helix-previous', 'pause', 'play'],
229
- 'helix-headless-video-playlist': ['helix-activate', 'helix-before-activate'],
260
+ 'helix-headless-tree-item': [
261
+ 'helix-before-close',
262
+ 'helix-before-open',
263
+ 'helix-load',
264
+ 'helix-select',
265
+ 'toggle',
266
+ ],
267
+ 'helix-headless-video': [
268
+ 'abort',
269
+ 'canplay',
270
+ 'canplaythrough',
271
+ 'durationchange',
272
+ 'emptied',
273
+ 'ended',
274
+ 'error',
275
+ 'helix-next',
276
+ 'helix-previous',
277
+ 'loadeddata',
278
+ 'loadedmetadata',
279
+ 'loadstart',
280
+ 'pause',
281
+ 'play',
282
+ 'playing',
283
+ 'progress',
284
+ 'ratechange',
285
+ 'resize',
286
+ 'seeked',
287
+ 'seeking',
288
+ 'stalled',
289
+ 'suspend',
290
+ 'timeupdate',
291
+ 'volumechange',
292
+ 'waiting',
293
+ ],
294
+ 'helix-headless-video-playlist': ['helix-activate', 'helix-before-activate', 'helix-end'],
230
295
  'helix-headless-video-playlist-item': ['helix-select'],
231
296
  'helix-headless-video-playlist-menu': ['helix-select'],
297
+ 'helix-headless-virtual-list': [
298
+ 'change',
299
+ 'helix-before-change',
300
+ 'helix-load-more',
301
+ 'helix-range-change',
302
+ ],
232
303
  });
@@ -11,7 +11,9 @@ import { type TemplateResult } from 'lit';
11
11
  * was loading, and the announcement tells a screen reader user that the search
12
12
  * returned nothing. It is announced from a status region of its own, which is
13
13
  * rendered empty and filled a frame after the view appears. Screen readers read
14
- * a region that arrives with its text already in it inconsistently.
14
+ * a region that arrives with its text already in it inconsistently. For the
15
+ * seven seconds the region holds its copy, the heading and the message are
16
+ * hidden from screen readers, so the words are in the page once.
15
17
  *
16
18
  * Every region is a bare slot. There is no `empty-state-heading` or
17
19
  * `empty-state-actions` element: assign your own heading and actions to the
@@ -18,9 +18,10 @@ let HelixHeadlessEmpty = class HelixHeadlessEmpty extends HelixElement {
18
18
  }
19
19
  render() {
20
20
  const say = () => this.arrival.say();
21
+ const copied = this.arrival.said !== '' && !this.noAnnounce ? 'true' : nothing;
21
22
  return html `<slot name="icon"></slot>
22
- <slot name="heading" @slotchange=${say}></slot>
23
- <slot @slotchange=${say}></slot>
23
+ <slot aria-hidden=${copied} name="heading" @slotchange=${say}></slot>
24
+ <slot aria-hidden=${copied} @slotchange=${say}></slot>
24
25
  <slot name="actions"></slot>
25
26
  ${this.noAnnounce
26
27
  ? nothing
@@ -20,7 +20,22 @@ declare const HelixHeadlessFileInput_base: (new (...args: any[]) => import("@fus
20
20
  * is screened: `accept`, `max-file-size`, `max-files` and your own `validate`
21
21
  * can refuse it. A refused file is left out, `helix-reject` lists each one with
22
22
  * its reason, and a reader hears `rejected-text` with the names filled in.
23
- * `directory` asks the picker for a folder.
23
+ * A reader also hears `added-text` for the files a drop or a paste adds, and
24
+ * `removed-text` for a file a remove button takes out, since neither moves
25
+ * focus or says anything on its own. `directory` asks the picker for a folder. `transformFiles` changes the files
26
+ * a field takes before it holds them, such as shrinking an image.
27
+ *
28
+ * Each chosen file is a row: its name, its size and type as tags, and a
29
+ * remove button. `renderFile` draws the row's details your own way, and the
30
+ * `remove-icon` slot replaces the button's icon.
31
+ *
32
+ * **Keyboard.** The input is the tab stop, and each file's remove button is
33
+ * one more.
34
+ *
35
+ * | Key | What it does |
36
+ * |---|---|
37
+ * | Enter, Space | On the input, opens the picker. On a remove button, removes that file and moves focus to the button of the file in its place, or back to the input. |
38
+ * | Control+V, Command+V | Takes files from the clipboard, as a drop does. |
24
39
  *
25
40
  * @since 0.1.0
26
41
  * @status stable
@@ -31,6 +46,7 @@ declare const HelixHeadlessFileInput_base: (new (...args: any[]) => import("@fus
31
46
  * @slot feedback - The message that says what is wrong with the chosen files.
32
47
  * @slot hint - Help under the field.
33
48
  * @slot label - The label, for content richer than the `label` text.
49
+ * @slot remove-icon - The icon on each file's remove button, in place of the bin. Each button shows a copy.
34
50
  * @slot trigger - The content that opens the picker when pressed.
35
51
  *
36
52
  * @event {Event} change - Fired after the value changes.
@@ -53,7 +69,7 @@ declare const HelixHeadlessFileInput_base: (new (...args: any[]) => import("@fus
53
69
  * @csspart kind-start - The category before the label.
54
70
  * @csspart label - The label above the field.
55
71
  * @csspart list - The chosen files.
56
- * @csspart live - The live region that says `rejected-text` when files are refused. It is rendered from the first refusal.
72
+ * @csspart live - The live region that says `added-text`, `rejected-text`, and `removed-text`. It is rendered from the first time it has something to say.
57
73
  * @csspart meta - The row that holds a file's size and type.
58
74
  * @csspart name - A file's name.
59
75
  * @csspart remove - The control that removes a file.
@@ -66,6 +82,8 @@ declare const HelixHeadlessFileInput_base: (new (...args: any[]) => import("@fus
66
82
  * @csspart size-start - The category before the label.
67
83
  * @csspart trigger - The label that opens the picker.
68
84
  *
85
+ * @cssstate dropping - Files are being dragged over the field.
86
+ * @cssstate has-files - The field holds at least one file.
69
87
  * @cssstate invalid - The control has an error to show, from the browser's validation or from your `feedback`.
70
88
  */
71
89
  export declare class HelixHeadlessFileInput extends HelixHeadlessFileInput_base {
@@ -77,6 +95,11 @@ export declare class HelixHeadlessFileInput extends HelixHeadlessFileInput_base
77
95
  * filter is the only check the platform makes and a drop never meets it.
78
96
  */
79
97
  accept: string;
98
+ /**
99
+ * What a reader hears when a drop or a paste adds files, with `{names}` and
100
+ * `{count}` filled in.
101
+ */
102
+ addedText: string;
80
103
  /**
81
104
  * Which camera or microphone a mobile picker should offer, if any.
82
105
  */
@@ -110,6 +133,10 @@ export declare class HelixHeadlessFileInput extends HelixHeadlessFileInput_base
110
133
  * filled in.
111
134
  */
112
135
  rejectedText: string;
136
+ /**
137
+ * What a reader hears when a file is removed, with `{name}` filled in.
138
+ */
139
+ removedText: string;
113
140
  /**
114
141
  * The accessible name of the control that removes a file. `{name}` is
115
142
  * replaced with the file's name.
@@ -119,6 +146,19 @@ export declare class HelixHeadlessFileInput extends HelixHeadlessFileInput_base
119
146
  * `{name}` has it added after it.
120
147
  */
121
148
  removeLabel: string;
149
+ /**
150
+ * Draws a file's row in place of its name, size, and type: a Lit template, a
151
+ * string, or a DOM node, given the file and its place in the list. The
152
+ * remove button stays beside it.
153
+ */
154
+ renderFile?: (file: File, index: number) => unknown;
155
+ /**
156
+ * Your own step between taking files and holding them, such as shrinking an
157
+ * image, as Zag's file upload `transformFiles`. It is given the files taken
158
+ * from one pick, drop, or paste and returns the files to hold, or a promise
159
+ * of them. A promise that rejects refuses those files, with its message.
160
+ */
161
+ transformFiles?: (files: File[]) => File[] | Promise<File[]>;
122
162
  /**
123
163
  * The trigger's text when nothing is slotted into it.
124
164
  */
@@ -128,15 +168,38 @@ export declare class HelixHeadlessFileInput extends HelixHeadlessFileInput_base
128
168
  * nothing to take it. A property, since a function cannot be an attribute.
129
169
  */
130
170
  validate?: (file: File) => string | null | undefined;
131
- /** The live region, rendered from the first refusal. */
171
+ /** The live region, rendered from the first time it has something to say. */
132
172
  private readonly status;
133
173
  /**
134
174
  * Screens arriving files and commits what is taken, after the files the
135
- * field keeps. Refused files are announced and said.
175
+ * field keeps, through `transformFiles` where it is set.
136
176
  */
137
177
  private take;
138
- /** Sends `helix-reject` and says which files were left out. */
139
- private refuse;
178
+ /**
179
+ * Commits what an arrival leaves, sends `helix-reject` for what it refused,
180
+ * and says both.
181
+ *
182
+ * Nothing taken and nothing moved, as when every dropped file is refused, is
183
+ * no change to announce. A pick is the platform's own `change`, relayed
184
+ * whatever it holds, and the picker itself tells a reader what was chosen,
185
+ * so `added-text` is said for a drop or a paste only.
186
+ */
187
+ private finish;
188
+ /**
189
+ * A sentence about some files, with `{count}` and `{names}` filled in.
190
+ *
191
+ * The names as the page's language lists them, which in English is the comma
192
+ * list it always was: `unit` and `short` join with commas and no "and". The
193
+ * count is written as the language writes a number.
194
+ */
195
+ private listed;
196
+ /** The element slotted into `remove-icon`, which each remove button copies. */
197
+ private removeIcon;
198
+ /** One copy of `removeIcon` per row, kept so a render does not replace it. */
199
+ private readonly removeIcons;
200
+ private readonly handleRemoveIcon;
201
+ /** The icon on one row's remove button: a copy of `remove-icon`, or the bin. */
202
+ private removeMark;
140
203
  /** Takes files pasted onto the field, as a drop takes them. */
141
204
  private readonly handlePaste;
142
205
  /**
@@ -42,20 +42,28 @@ let HelixHeadlessFileInput = class HelixHeadlessFileInput extends MixinField(Hel
42
42
  target: () => this.partNamed('control'),
43
43
  });
44
44
  this.accept = '';
45
+ this.addedText = 'Added: {names}';
45
46
  this.directory = false;
46
47
  this.locale = '';
47
48
  this.multiple = false;
48
49
  this.rejectedText = 'Not added: {names}';
50
+ this.removedText = 'Removed: {name}';
49
51
  this.removeLabel = 'Remove {name}';
50
52
  this.triggerLabel = 'Choose files';
51
53
  this.status = new StatusController(this);
54
+ this.removeIcon = undefined;
55
+ this.removeIcons = new Map();
56
+ this.handleRemoveIcon = (event) => {
57
+ this.removeIcons.clear();
58
+ this.removeIcon = event.target.assignedElements({ flatten: true })[0];
59
+ };
52
60
  this.handlePaste = (event) => {
53
61
  const pasted = [...(event.clipboardData?.files ?? [])];
54
62
  if (this.isDisabled || pasted.length === 0) {
55
63
  return;
56
64
  }
57
65
  event.preventDefault();
58
- this.take(pasted, this.multiple ? this.files : []);
66
+ this.take(pasted, this.files);
59
67
  };
60
68
  this.dropping = false;
61
69
  this.committed = [];
@@ -84,7 +92,7 @@ let HelixHeadlessFileInput = class HelixHeadlessFileInput extends MixinField(Hel
84
92
  if (dropped.length === 0) {
85
93
  return;
86
94
  }
87
- this.take(dropped, this.multiple ? this.files : []);
95
+ this.take(dropped, this.files);
88
96
  };
89
97
  this.handleRemove = (event) => {
90
98
  const at = Number(event.currentTarget.dataset.at);
@@ -106,21 +114,50 @@ let HelixHeadlessFileInput = class HelixHeadlessFileInput extends MixinField(Hel
106
114
  multiple: this.multiple || picked,
107
115
  validate: this.validate,
108
116
  });
109
- const same = (one, two) => one.length === two.length && one.every((file, at) => file === two[at]);
110
- if (picked || !(same(kept, this.committed) && same(kept, this.files))) {
111
- this.commit(kept);
117
+ const taken = kept.filter((file) => !keeping.includes(file));
118
+ const transform = this.transformFiles;
119
+ if (!transform || taken.length === 0) {
120
+ this.finish(kept, taken, refused, picked);
121
+ return;
112
122
  }
123
+ const held = kept.filter((file) => keeping.includes(file));
124
+ Promise.resolve()
125
+ .then(() => transform(taken))
126
+ .then((made) => this.finish([...held, ...made], made, refused, picked), (error) => {
127
+ const message = error instanceof Error ? error.message : String(error);
128
+ this.finish(held, [], [...refused, ...taken.map((file) => ({ file, message, reason: 'invalid' }))], picked);
129
+ });
130
+ }
131
+ finish(next, added, refused, picked) {
132
+ const same = (one, two) => one.length === two.length && one.every((file, at) => file === two[at]);
133
+ const moved = picked || !(same(next, this.committed) && same(next, this.files));
134
+ const applied = moved && this.commit(next);
113
135
  if (refused.length > 0) {
114
- this.refuse(refused);
136
+ this.dispatchEvent(new HelixRejectEvent({ files: refused }));
137
+ }
138
+ const words = [
139
+ applied && !picked && added.length > 0 ? this.listed(this.addedText, added) : '',
140
+ refused.length > 0
141
+ ? this.listed(this.rejectedText, refused.map((one) => one.file))
142
+ : '',
143
+ ].filter((one) => one !== '');
144
+ if (words.length > 0) {
145
+ this.status.say(words.join(' '));
115
146
  }
116
147
  }
117
- refuse(refused) {
118
- this.dispatchEvent(new HelixRejectEvent({ files: refused }));
119
- const words = fillTemplate(this.rejectedText, {
120
- count: formatNumbers(this.lang)(refused.length),
121
- names: new Intl.ListFormat(this.lang || undefined, { style: 'short', type: 'unit' }).format(refused.map((one) => one.file.name)),
148
+ listed(sentence, files) {
149
+ return fillTemplate(sentence, {
150
+ count: formatNumbers(this.lang)(files.length),
151
+ names: new Intl.ListFormat(this.lang || undefined, { style: 'short', type: 'unit' }).format(files.map((file) => file.name)),
122
152
  });
123
- this.status.say(words);
153
+ }
154
+ removeMark(at) {
155
+ if (!this.removeIcon) {
156
+ return drawIcon(trash);
157
+ }
158
+ const held = this.removeIcons.get(at) ?? this.removeIcon.cloneNode(true);
159
+ this.removeIcons.set(at, held);
160
+ return held;
124
161
  }
125
162
  get files() {
126
163
  return [...(this.control?.files ?? [])];
@@ -132,12 +169,15 @@ let HelixHeadlessFileInput = class HelixHeadlessFileInput extends MixinField(Hel
132
169
  this.commit([]);
133
170
  }
134
171
  removeAt(at) {
135
- this.commit(this.files.filter((_, index) => index !== at));
172
+ const gone = this.files[at];
173
+ if (gone && this.commit(this.files.filter((_, index) => index !== at))) {
174
+ this.status.say(fillTemplate(this.removedText, { name: gone.name }));
175
+ }
136
176
  }
137
177
  commit(next) {
138
178
  const control = this.control;
139
179
  if (!control) {
140
- return;
180
+ return false;
141
181
  }
142
182
  const previous = this.committed;
143
183
  const applied = requestChange({
@@ -152,6 +192,7 @@ let HelixHeadlessFileInput = class HelixHeadlessFileInput extends MixinField(Hel
152
192
  if (!applied) {
153
193
  this.put(control, previous);
154
194
  }
195
+ return applied;
155
196
  }
156
197
  put(control, files) {
157
198
  if (files.length === 0) {
@@ -197,6 +238,8 @@ let HelixHeadlessFileInput = class HelixHeadlessFileInput extends MixinField(Hel
197
238
  updated(changed) {
198
239
  super.updated(changed);
199
240
  this.sync();
241
+ this.toggleState('dropping', this.dropping);
242
+ this.toggleState('has-files', this.files.length > 0);
200
243
  }
201
244
  focus(options) {
202
245
  this.control?.focus(options);
@@ -246,6 +289,9 @@ let HelixHeadlessFileInput = class HelixHeadlessFileInput extends MixinField(Hel
246
289
  <slot name="trigger">${this.triggerLabel}</slot>
247
290
  </label>
248
291
  </div>
292
+ <!-- Hidden, because this is where the icon arrives: each remove button
293
+ shows a copy. -->
294
+ <slot name="remove-icon" hidden @slotchange=${this.handleRemoveIcon}></slot>
249
295
  <!-- The hint sits under the field and the list goes last, which is the
250
296
  one ordering decision this component makes differently from the way it
251
297
  reads. Reasoning above renderMeta. -->
@@ -256,10 +302,12 @@ let HelixHeadlessFileInput = class HelixHeadlessFileInput extends MixinField(Hel
256
302
  : html `<ul part="list">
257
303
  ${files.map((file, at) => html `<li part="file">
258
304
  <span part="detail">
259
- <span part="name">${file.name}</span>
260
- <span part="meta">
261
- ${this.renderMeta(file)}
262
- </span>
305
+ ${this.renderFile
306
+ ? this.renderFile(file, at)
307
+ : html `<span part="name">${file.name}</span>
308
+ <span part="meta">
309
+ ${this.renderMeta(file)}
310
+ </span>`}
263
311
  </span>
264
312
  <button
265
313
  part="remove"
@@ -269,7 +317,7 @@ let HelixHeadlessFileInput = class HelixHeadlessFileInput extends MixinField(Hel
269
317
  ?disabled=${this.isDisabled}
270
318
  @click=${this.handleRemove}
271
319
  >
272
- ${drawIcon(trash)}
320
+ ${this.removeMark(at)}
273
321
  </button>
274
322
  </li>`)}
275
323
  </ul>`}`;
@@ -278,6 +326,9 @@ let HelixHeadlessFileInput = class HelixHeadlessFileInput extends MixinField(Hel
278
326
  __decorate([
279
327
  property()
280
328
  ], HelixHeadlessFileInput.prototype, "accept", void 0);
329
+ __decorate([
330
+ property({ attribute: 'added-text' })
331
+ ], HelixHeadlessFileInput.prototype, "addedText", void 0);
281
332
  __decorate([
282
333
  property()
283
334
  ], HelixHeadlessFileInput.prototype, "capture", void 0);
@@ -299,15 +350,27 @@ __decorate([
299
350
  __decorate([
300
351
  property({ attribute: 'rejected-text' })
301
352
  ], HelixHeadlessFileInput.prototype, "rejectedText", void 0);
353
+ __decorate([
354
+ property({ attribute: 'removed-text' })
355
+ ], HelixHeadlessFileInput.prototype, "removedText", void 0);
302
356
  __decorate([
303
357
  property({ attribute: 'remove-label' })
304
358
  ], HelixHeadlessFileInput.prototype, "removeLabel", void 0);
359
+ __decorate([
360
+ property({ attribute: false })
361
+ ], HelixHeadlessFileInput.prototype, "renderFile", void 0);
362
+ __decorate([
363
+ property({ attribute: false })
364
+ ], HelixHeadlessFileInput.prototype, "transformFiles", void 0);
305
365
  __decorate([
306
366
  property({ attribute: 'trigger-label' })
307
367
  ], HelixHeadlessFileInput.prototype, "triggerLabel", void 0);
308
368
  __decorate([
309
369
  property({ attribute: false })
310
370
  ], HelixHeadlessFileInput.prototype, "validate", void 0);
371
+ __decorate([
372
+ state()
373
+ ], HelixHeadlessFileInput.prototype, "removeIcon", void 0);
311
374
  __decorate([
312
375
  state()
313
376
  ], HelixHeadlessFileInput.prototype, "dropping", void 0);
@@ -27,7 +27,8 @@ export declare const accepts: (file: File, accept: string) => boolean;
27
27
  /**
28
28
  * Screens arriving files against the rules, given the files the field keeps.
29
29
  * `kept` is what the field holds afterward: the files it keeps and the
30
- * arrivals it took, or for a single-file field the last arrival it took.
30
+ * arrivals it took, or for a single-file field the last arrival it took, and
31
+ * the file it keeps when it took none.
31
32
  */
32
33
  export declare const screenFiles: (arriving: File[], keeping: File[], rules: ScreenRules) => {
33
34
  kept: File[];
@@ -66,8 +66,13 @@ import '../../menu/index.js';
66
66
  * @csspart divider-content - The content set into the line.
67
67
  * @csspart divider-line - The line itself.
68
68
  * @csspart entry - One row: a field, its comparison, an operator, or a value.
69
+ * @csspart entry-end - The trailing column of a row, which holds its shortcut.
69
70
  * @csspart entry-item - The row itself.
70
71
  * @csspart entry-mark - The mark at the end of a row: a check mark on a chosen value, and a caret on a field.
72
+ * @csspart entry-shortcut - The key drawn for a row's shortcut. The filter menu sets none, so it renders only where a subclass does.
73
+ * @csspart entry-shortcut-kbd - The key inside it.
74
+ * @csspart entry-shortcut-key - One key of the shortcut's chord.
75
+ * @csspart entry-shortcut-separator - The `+` between two keys of the shortcut, where the platform writes one.
71
76
  * @csspart entry-start - The leading column.
72
77
  * @csspart menu - The menu the fields are offered in.
73
78
  * @csspart menu-back - The button that goes back from a field's page.
@@ -137,7 +137,10 @@ let HelixHeadlessFilterMenu = class HelixHeadlessFilterMenu extends HelixElement
137
137
  const offered = using?.arity === 'none' ? [] : values;
138
138
  return html `<${item}
139
139
  part="entry"
140
- exportparts="item: entry-item, mark: entry-mark, start: entry-start"
140
+ exportparts="end: entry-end, item: entry-item, mark: entry-mark, shortcut: entry-shortcut,
141
+ shortcut-kbd: entry-shortcut-kbd,
142
+ shortcut-key: entry-shortcut-key, shortcut-separator: entry-shortcut-separator,
143
+ start: entry-start"
141
144
  data-facet="field"
142
145
  data-field=${name}
143
146
  >
@@ -145,7 +148,10 @@ let HelixHeadlessFilterMenu = class HelixHeadlessFilterMenu extends HelixElement
145
148
  ${operators.length > 1
146
149
  ? html `<${item}
147
150
  part="entry"
148
- exportparts="item: entry-item, mark: entry-mark, start: entry-start"
151
+ exportparts="end: entry-end, item: entry-item, mark: entry-mark, shortcut: entry-shortcut,
152
+ shortcut-kbd: entry-shortcut-kbd,
153
+ shortcut-key: entry-shortcut-key, shortcut-separator: entry-shortcut-separator,
154
+ start: entry-start"
149
155
  slot="submenu"
150
156
  data-facet="comparison"
151
157
  data-field=${name}
@@ -153,7 +159,10 @@ let HelixHeadlessFilterMenu = class HelixHeadlessFilterMenu extends HelixElement
153
159
  ${using?.label ?? ''}
154
160
  ${operators.map((operator) => html `<${item}
155
161
  part="entry"
156
- exportparts="item: entry-item, mark: entry-mark, start: entry-start"
162
+ exportparts="end: entry-end, item: entry-item, mark: entry-mark, shortcut: entry-shortcut,
163
+ shortcut-kbd: entry-shortcut-kbd,
164
+ shortcut-key: entry-shortcut-key, shortcut-separator: entry-shortcut-separator,
165
+ start: entry-start"
157
166
  slot="submenu"
158
167
  checkable
159
168
  exclusive
@@ -175,7 +184,10 @@ let HelixHeadlessFilterMenu = class HelixHeadlessFilterMenu extends HelixElement
175
184
  : nothing}
176
185
  ${offered.map((option) => html `<${item}
177
186
  part="entry"
178
- exportparts="item: entry-item, mark: entry-mark, start: entry-start"
187
+ exportparts="end: entry-end, item: entry-item, mark: entry-mark, shortcut: entry-shortcut,
188
+ shortcut-kbd: entry-shortcut-kbd,
189
+ shortcut-key: entry-shortcut-key, shortcut-separator: entry-shortcut-separator,
190
+ start: entry-start"
179
191
  slot="submenu"
180
192
  checkable
181
193
  ?exclusive=${using?.arity === 'one'}