@fusion.dev/helix-headless 0.145.0 → 0.147.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 (343) hide show
  1. package/custom-elements.json +12286 -4281
  2. package/dist/accordion/item/accordion-item.d.ts +51 -18
  3. package/dist/accordion/item/accordion-item.js +45 -13
  4. package/dist/accordion/root/accordion-root.d.ts +16 -7
  5. package/dist/accordion/root/accordion-root.js +3 -3
  6. package/dist/announcement/root/announcement-root.d.ts +16 -6
  7. package/dist/announcement/root/announcement-root.js +37 -7
  8. package/dist/app-header/root/app-header-root.d.ts +7 -2
  9. package/dist/app-header/root/app-header-root.js +9 -1
  10. package/dist/app-header/sectioning.d.ts +3 -1
  11. package/dist/app-header/sectioning.js +3 -2
  12. package/dist/area-chart/root/area-chart-root.d.ts +18 -1
  13. package/dist/area-chart/root/area-chart-root.js +11 -3
  14. package/dist/avatar/group/avatar-group.d.ts +20 -14
  15. package/dist/avatar/group/avatar-group.js +17 -19
  16. package/dist/avatar/root/avatar-root.d.ts +31 -1
  17. package/dist/avatar/root/avatar-root.js +11 -1
  18. package/dist/badge/root/badge-root.d.ts +60 -7
  19. package/dist/badge/root/badge-root.js +89 -6
  20. package/dist/bar-chart/root/bar-chart-root.d.ts +18 -1
  21. package/dist/bar-chart/root/bar-chart-root.js +48 -20
  22. package/dist/bar-chart/stack.d.ts +25 -0
  23. package/dist/bar-chart/stack.js +27 -0
  24. package/dist/breadcrumbs/breadcrumb/breadcrumb.d.ts +14 -0
  25. package/dist/breadcrumbs/breadcrumb/breadcrumb.js +12 -2
  26. package/dist/breadcrumbs/root/breadcrumbs-root.d.ts +25 -0
  27. package/dist/breadcrumbs/root/breadcrumbs-root.js +51 -4
  28. package/dist/button/root/button-root.d.ts +50 -38
  29. package/dist/button/root/button-root.js +42 -53
  30. package/dist/button/submitter.d.ts +27 -0
  31. package/dist/button/submitter.js +25 -0
  32. package/dist/button-group/root/button-group-root.d.ts +2 -1
  33. package/dist/button-group/root/button-group-root.js +5 -1
  34. package/dist/canvas/node/canvas-node.d.ts +4 -3
  35. package/dist/canvas/node/canvas-node.js +3 -2
  36. package/dist/canvas/root/canvas-root.js +2 -2
  37. package/dist/card/root/card-root.d.ts +36 -4
  38. package/dist/card/root/card-root.js +29 -10
  39. package/dist/carousel/root/carousel-root.d.ts +43 -4
  40. package/dist/carousel/root/carousel-root.js +40 -12
  41. package/dist/carousel/stops.d.ts +20 -0
  42. package/dist/carousel/stops.js +30 -0
  43. package/dist/chat/message/chat-message.js +5 -4
  44. package/dist/chat/naming.d.ts +5 -1
  45. package/dist/chat/naming.js +4 -2
  46. package/dist/chat/root/chat-root.d.ts +40 -4
  47. package/dist/chat/root/chat-root.js +32 -6
  48. package/dist/checkbox/root/checkbox-root.d.ts +20 -0
  49. package/dist/checkbox/root/checkbox-root.js +18 -7
  50. package/dist/checkbox-group/root/checkbox-group-root.d.ts +8 -2
  51. package/dist/checkbox-group/root/checkbox-group-root.js +14 -11
  52. package/dist/checkbox-group/select-all.d.ts +21 -0
  53. package/dist/checkbox-group/select-all.js +7 -0
  54. package/dist/code-block/highlight.d.ts +15 -0
  55. package/dist/code-block/highlight.js +4 -0
  56. package/dist/code-block/root/code-block-root.d.ts +79 -10
  57. package/dist/code-block/root/code-block-root.js +74 -5
  58. package/dist/color-input/root/color-input-root.d.ts +14 -0
  59. package/dist/color-input/root/color-input-root.js +17 -7
  60. package/dist/color-picker/channels.js +1 -2
  61. package/dist/color-picker/root/color-picker-root.d.ts +53 -16
  62. package/dist/color-picker/root/color-picker-root.js +155 -46
  63. package/dist/color-picker/wheel.d.ts +17 -0
  64. package/dist/color-picker/wheel.js +6 -0
  65. package/dist/combobox/root/combobox-root.d.ts +56 -0
  66. package/dist/combobox/root/combobox-root.js +92 -15
  67. package/dist/command/root/command-root.d.ts +19 -2
  68. package/dist/command/root/command-root.js +24 -23
  69. package/dist/copy-button/root/copy-button-root.d.ts +21 -1
  70. package/dist/copy-button/root/copy-button-root.js +16 -4
  71. package/dist/data-table/index.d.ts +1 -1
  72. package/dist/data-table/index.js +1 -1
  73. package/dist/data-table/keys.d.ts +6 -0
  74. package/dist/data-table/keys.js +14 -0
  75. package/dist/data-table/root/data-table-root.d.ts +27 -18
  76. package/dist/data-table/root/data-table-root.js +31 -57
  77. package/dist/data-table/tree.d.ts +16 -1
  78. package/dist/data-table/tree.js +2 -3
  79. package/dist/date-input/root/date-input-root.d.ts +11 -2
  80. package/dist/date-input/root/date-input-root.js +26 -12
  81. package/dist/date-picker/root/date-picker-root.d.ts +14 -9
  82. package/dist/date-picker/root/date-picker-root.js +33 -22
  83. package/dist/description-list/item/description-list-item.d.ts +18 -4
  84. package/dist/description-list/item/description-list-item.js +8 -4
  85. package/dist/dialog/description.js +15 -1
  86. package/dist/dialog/root/dialog-root.d.ts +8 -2
  87. package/dist/dialog/root/dialog-root.js +16 -1
  88. package/dist/divider/root/divider-root.d.ts +3 -0
  89. package/dist/divider/root/divider-root.js +2 -1
  90. package/dist/donut-chart/root/donut-chart-root.d.ts +31 -0
  91. package/dist/donut-chart/root/donut-chart-root.js +55 -1
  92. package/dist/donut-chart/slice-label.d.ts +35 -0
  93. package/dist/donut-chart/slice-label.js +11 -0
  94. package/dist/drawer/reveal.d.ts +8 -0
  95. package/dist/drawer/reveal.js +1 -0
  96. package/dist/drawer/root/drawer-root.d.ts +63 -2
  97. package/dist/drawer/root/drawer-root.js +75 -4
  98. package/dist/drilldown/item/drilldown-item.d.ts +21 -1
  99. package/dist/drilldown/item/drilldown-item.js +40 -5
  100. package/dist/drilldown/root/drilldown-root.d.ts +21 -3
  101. package/dist/drilldown/root/drilldown-root.js +22 -3
  102. package/dist/element-events.generated.js +35 -6
  103. package/dist/empty/root/empty-root.d.ts +34 -2
  104. package/dist/empty/root/empty-root.js +26 -4
  105. package/dist/file-input/root/file-input-root.d.ts +99 -8
  106. package/dist/file-input/root/file-input-root.js +120 -22
  107. package/dist/file-input/screen.d.ts +2 -1
  108. package/dist/file-input/status.d.ts +24 -0
  109. package/dist/file-input/status.js +10 -0
  110. package/dist/filter-input/chip/filter-chip.d.ts +23 -0
  111. package/dist/filter-input/chip/filter-chip.js +11 -2
  112. package/dist/filter-input/menu/filter-menu.d.ts +2 -0
  113. package/dist/filter-input/menu/filter-menu.js +12 -4
  114. package/dist/filter-input/root/filter-input-root.d.ts +38 -6
  115. package/dist/filter-input/root/filter-input-root.js +18 -28
  116. package/dist/filter-input/suggest.d.ts +28 -3
  117. package/dist/filter-input/suggest.js +18 -8
  118. package/dist/format-date/options.d.ts +3 -4
  119. package/dist/format-date/options.js +2 -2
  120. package/dist/format-date/root/format-date-root.d.ts +27 -17
  121. package/dist/format-date/root/format-date-root.js +27 -48
  122. package/dist/heatmap/root/buckets.d.ts +21 -0
  123. package/dist/heatmap/root/buckets.js +34 -0
  124. package/dist/heatmap/root/heatmap-root.d.ts +83 -11
  125. package/dist/heatmap/root/heatmap-root.js +104 -12
  126. package/dist/icon/index.d.ts +1 -1
  127. package/dist/icon/index.js +1 -1
  128. package/dist/icon/registry.d.ts +26 -1
  129. package/dist/icon/registry.js +12 -1
  130. package/dist/icon/root/icon-root.d.ts +25 -1
  131. package/dist/icon/root/icon-root.js +44 -12
  132. package/dist/icon/root/index.d.ts +1 -1
  133. package/dist/icon/root/index.js +1 -1
  134. package/dist/icon/settle.d.ts +7 -0
  135. package/dist/icon/settle.js +10 -0
  136. package/dist/icon-button/root/icon-button-root.d.ts +2 -0
  137. package/dist/image/root/image-root.d.ts +14 -1
  138. package/dist/image/root/image-root.js +7 -2
  139. package/dist/input/root/input-root.d.ts +34 -3
  140. package/dist/input/root/input-root.js +17 -4
  141. package/dist/kbd/keys.d.ts +29 -0
  142. package/dist/kbd/keys.js +52 -0
  143. package/dist/kbd/root/kbd-root.d.ts +52 -1
  144. package/dist/kbd/root/kbd-root.js +40 -47
  145. package/dist/legend/hidden-series.d.ts +10 -2
  146. package/dist/legend/hidden-series.js +5 -2
  147. package/dist/legend/root/legend-root.d.ts +77 -12
  148. package/dist/legend/root/legend-root.js +71 -17
  149. package/dist/lightbox/root/lightbox-root.d.ts +98 -10
  150. package/dist/lightbox/root/lightbox-root.js +153 -18
  151. package/dist/lightbox/zoom-controller.d.ts +59 -0
  152. package/dist/lightbox/zoom-controller.js +128 -0
  153. package/dist/lightbox/zoom.d.ts +24 -0
  154. package/dist/lightbox/zoom.js +18 -0
  155. package/dist/line-chart/root/line-chart-root.d.ts +38 -1
  156. package/dist/line-chart/root/line-chart-root.js +31 -3
  157. package/dist/list/item/list-item.d.ts +2 -0
  158. package/dist/list/item/list-item.js +11 -2
  159. package/dist/list/root/list-root.d.ts +70 -13
  160. package/dist/list/root/list-root.js +91 -13
  161. package/dist/list/selection.d.ts +54 -7
  162. package/dist/list/selection.js +32 -7
  163. package/dist/listbox/root/listbox-root.d.ts +44 -4
  164. package/dist/listbox/root/listbox-root.js +72 -34
  165. package/dist/loader/busy.d.ts +10 -0
  166. package/dist/loader/busy.js +11 -0
  167. package/dist/loader/root/loader-root.d.ts +9 -2
  168. package/dist/loader/root/loader-root.js +23 -3
  169. package/dist/megamenu/hand-over.d.ts +75 -0
  170. package/dist/megamenu/hand-over.js +67 -0
  171. package/dist/megamenu/root/megamenu-root.d.ts +80 -15
  172. package/dist/megamenu/root/megamenu-root.js +76 -19
  173. package/dist/menu/item/menu-item.d.ts +51 -2
  174. package/dist/menu/item/menu-item.js +50 -26
  175. package/dist/menu/root/menu-root.d.ts +17 -0
  176. package/dist/menu/root/menu-root.js +2 -2
  177. package/dist/meter/root/meter-root.d.ts +62 -1
  178. package/dist/meter/root/meter-root.js +38 -16
  179. package/dist/navigation/root/navigation-root.d.ts +2 -1
  180. package/dist/navigation/root/navigation-root.js +2 -2
  181. package/dist/notifications/root/notifications-root.d.ts +20 -4
  182. package/dist/notifications/root/notifications-root.js +30 -8
  183. package/dist/number-input/grain.d.ts +28 -0
  184. package/dist/number-input/grain.js +14 -0
  185. package/dist/number-input/root/number-input-root.d.ts +34 -9
  186. package/dist/number-input/root/number-input-root.js +31 -25
  187. package/dist/object-inspector/root/object-inspector-root.d.ts +88 -33
  188. package/dist/object-inspector/root/object-inspector-root.js +134 -92
  189. package/dist/object-inspector/rows.d.ts +18 -0
  190. package/dist/object-inspector/rows.js +33 -0
  191. package/dist/option/index.d.ts +1 -0
  192. package/dist/option/index.js +1 -0
  193. package/dist/option/root/option-root.d.ts +5 -3
  194. package/dist/option/separator/option-separator.d.ts +30 -0
  195. package/dist/option/separator/option-separator.js +21 -0
  196. package/dist/outline/root/outline-root.d.ts +30 -0
  197. package/dist/outline/root/outline-root.js +17 -13
  198. package/dist/pagination/size/pagination-size.d.ts +6 -0
  199. package/dist/pagination/size/pagination-size.js +5 -3
  200. package/dist/pin-input/code.d.ts +37 -0
  201. package/dist/pin-input/code.js +25 -0
  202. package/dist/pin-input/root/pin-input-root.d.ts +116 -115
  203. package/dist/pin-input/root/pin-input-root.js +163 -155
  204. package/dist/popover/hide-outside.d.ts +14 -0
  205. package/dist/popover/hide-outside.js +34 -0
  206. package/dist/popover/root/popover-root.d.ts +64 -8
  207. package/dist/popover/root/popover-root.js +67 -4
  208. package/dist/progress/root/progress-root.d.ts +47 -0
  209. package/dist/progress/root/progress-root.js +34 -16
  210. package/dist/qr-code/export.d.ts +45 -1
  211. package/dist/qr-code/export.js +28 -0
  212. package/dist/qr-code/name.d.ts +11 -0
  213. package/dist/qr-code/name.js +7 -0
  214. package/dist/qr-code/root/qr-code-root.d.ts +36 -11
  215. package/dist/qr-code/root/qr-code-root.js +58 -11
  216. package/dist/quote/marks.d.ts +8 -0
  217. package/dist/quote/marks.js +5 -0
  218. package/dist/quote/root/quote-root.d.ts +14 -2
  219. package/dist/quote/root/quote-root.js +23 -1
  220. package/dist/radio/group/radio-group.d.ts +15 -0
  221. package/dist/radio/root/radio-root.d.ts +6 -2
  222. package/dist/radio/root/radio-root.js +7 -2
  223. package/dist/rating/root/rating-root.d.ts +30 -12
  224. package/dist/rating/root/rating-root.js +27 -27
  225. package/dist/scatter-chart/fit.d.ts +15 -0
  226. package/dist/scatter-chart/fit.js +35 -0
  227. package/dist/scatter-chart/root/scatter-chart-root.d.ts +51 -1
  228. package/dist/scatter-chart/root/scatter-chart-root.js +64 -24
  229. package/dist/scroll-area/root/scroll-area-root.d.ts +22 -51
  230. package/dist/scroll-area/root/scroll-area-root.js +57 -173
  231. package/dist/scroll-area/scrollbar-controller.d.ts +111 -0
  232. package/dist/scroll-area/scrollbar-controller.js +172 -0
  233. package/dist/scroll-area/scrollbar.d.ts +27 -8
  234. package/dist/scroll-area/scrollbar.js +10 -1
  235. package/dist/select/align.d.ts +47 -0
  236. package/dist/select/align.js +7 -0
  237. package/dist/select/root/select-root.d.ts +71 -0
  238. package/dist/select/root/select-root.js +78 -6
  239. package/dist/skeleton/root/skeleton-root.d.ts +3 -0
  240. package/dist/skeleton/root/skeleton-root.js +4 -2
  241. package/dist/skip-link/root/skip-link-root.js +2 -2
  242. package/dist/slider/root/slider-root.d.ts +59 -5
  243. package/dist/slider/root/slider-root.js +45 -3
  244. package/dist/sparkline/readings.d.ts +36 -0
  245. package/dist/sparkline/readings.js +36 -0
  246. package/dist/sparkline/root/sparkline-root.d.ts +121 -7
  247. package/dist/sparkline/root/sparkline-root.js +160 -26
  248. package/dist/speed-dial/item/speed-dial-item.d.ts +1 -1
  249. package/dist/speed-dial/item/speed-dial-item.js +2 -2
  250. package/dist/speed-dial/root/speed-dial-root.d.ts +6 -0
  251. package/dist/speed-dial/root/speed-dial-root.js +11 -3
  252. package/dist/splitter/root/splitter-root.d.ts +10 -12
  253. package/dist/splitter/root/splitter-root.js +211 -204
  254. package/dist/stat/root/stat-root.d.ts +14 -5
  255. package/dist/stat/root/stat-root.js +21 -5
  256. package/dist/steps/reach.d.ts +5 -0
  257. package/dist/steps/reach.js +3 -0
  258. package/dist/steps/root/steps-root.d.ts +56 -3
  259. package/dist/steps/root/steps-root.js +50 -6
  260. package/dist/steps/step/step.d.ts +8 -0
  261. package/dist/steps/step/step.js +8 -3
  262. package/dist/switch/root/switch-root.d.ts +10 -0
  263. package/dist/table/column/table-column.d.ts +6 -10
  264. package/dist/table/column/table-column.js +8 -20
  265. package/dist/table/root/table-root.d.ts +31 -10
  266. package/dist/table/root/table-root.js +14 -18
  267. package/dist/table/row/table-row.d.ts +24 -0
  268. package/dist/table/row/table-row.js +37 -1
  269. package/dist/tabs/panel/tab-panel.d.ts +16 -3
  270. package/dist/tabs/panel/tab-panel.js +34 -5
  271. package/dist/tabs/root/tabs-root.d.ts +17 -3
  272. package/dist/tabs/root/tabs-root.js +1 -1
  273. package/dist/tabs/tab/tab.d.ts +5 -0
  274. package/dist/tabs/tab/tab.js +5 -2
  275. package/dist/tag/group/tag-group.d.ts +44 -5
  276. package/dist/tag/group/tag-group.js +60 -9
  277. package/dist/tag/root/tag-root.js +9 -2
  278. package/dist/textarea/root/textarea-root.d.ts +41 -2
  279. package/dist/textarea/root/textarea-root.js +39 -1
  280. package/dist/time-input/root/time-input-root.d.ts +10 -2
  281. package/dist/time-input/root/time-input-root.js +24 -13
  282. package/dist/time-picker/root/time-picker-root.d.ts +28 -17
  283. package/dist/time-picker/root/time-picker-root.js +18 -29
  284. package/dist/time-picker/wheel-name.d.ts +9 -0
  285. package/dist/time-picker/wheel-name.js +15 -0
  286. package/dist/timeline/group/timeline-group.js +2 -2
  287. package/dist/toast/item/toast-item.d.ts +16 -3
  288. package/dist/toast/item/toast-item.js +22 -6
  289. package/dist/toast/root/toast-root.d.ts +34 -4
  290. package/dist/toast/root/toast-root.js +74 -13
  291. package/dist/toast/words.d.ts +12 -0
  292. package/dist/toast/words.js +25 -0
  293. package/dist/toggle/group/toggle-group.d.ts +52 -7
  294. package/dist/toggle/group/toggle-group.js +58 -44
  295. package/dist/toggle/root/toggle-root.js +2 -4
  296. package/dist/toolbar/root/toolbar-root.d.ts +21 -5
  297. package/dist/toolbar/root/toolbar-root.js +52 -8
  298. package/dist/tooltip/root/tooltip-root.d.ts +20 -3
  299. package/dist/tooltip/root/tooltip-root.js +18 -1
  300. package/dist/tour/back.d.ts +10 -0
  301. package/dist/tour/back.js +8 -0
  302. package/dist/tour/root/tour-root.d.ts +45 -2
  303. package/dist/tour/root/tour-root.js +53 -8
  304. package/dist/tour/stop/tour-stop.d.ts +3 -0
  305. package/dist/tour/stop/tour-stop.js +3 -3
  306. package/dist/tree/item/tree-item.d.ts +7 -3
  307. package/dist/tree/item/tree-item.js +3 -0
  308. package/dist/tree/root/tree-root.d.ts +24 -3
  309. package/dist/tree/root/tree-root.js +32 -13
  310. package/dist/tree/selection.js +2 -15
  311. package/dist/trend/figure.d.ts +16 -0
  312. package/dist/trend/figure.js +8 -0
  313. package/dist/trend/root/trend-root.d.ts +83 -19
  314. package/dist/trend/root/trend-root.js +59 -8
  315. package/dist/video/media-events.d.ts +13 -18
  316. package/dist/video/media-events.js +1 -5
  317. package/dist/video/root/extra-controls.d.ts +12 -0
  318. package/dist/video/root/extra-controls.js +6 -2
  319. package/dist/video/root/video-root.d.ts +23 -6
  320. package/dist/video/root/video-root.js +19 -10
  321. package/dist/video-playlist/menu/video-playlist-menu.d.ts +2 -0
  322. package/dist/video-playlist/menu/video-playlist-menu.js +2 -1
  323. package/dist/video-playlist/root/video-playlist-root.d.ts +17 -1
  324. package/dist/video-playlist/root/video-playlist-root.js +3 -0
  325. package/dist/virtual-list/fill.d.ts +11 -8
  326. package/dist/virtual-list/fill.js +10 -17
  327. package/dist/virtual-list/keys.d.ts +16 -7
  328. package/dist/virtual-list/keys.js +17 -6
  329. package/dist/virtual-list/plan.d.ts +65 -0
  330. package/dist/virtual-list/plan.js +27 -0
  331. package/dist/virtual-list/root/virtual-list-root.d.ts +136 -13
  332. package/dist/virtual-list/root/virtual-list-root.js +218 -51
  333. package/lint.json +1 -1
  334. package/package.json +8 -8
  335. package/types/jsx.d.ts +7441 -1458
  336. package/types/svelte.d.ts +1 -0
  337. package/types/vue.d.ts +1501 -326
  338. package/dist/chat/relative-clock.d.ts +0 -39
  339. package/dist/chat/relative-clock.js +0 -31
  340. package/dist/data-table/root/order.d.ts +0 -141
  341. package/dist/data-table/root/order.js +0 -76
  342. package/dist/tag/selection.d.ts +0 -10
  343. package/dist/tag/selection.js +0 -12
@@ -16,13 +16,21 @@ import { type PropertyValues, type TemplateResult } from 'lit';
16
16
  * the authors of a paper. The item then puts your `<dd>` elements after its
17
17
  * `<dt>` in place of its own, so a screen reader hears one term and each of
18
18
  * its descriptions, as in a native `<dl>`. A server cannot see your elements,
19
- * so the served item wraps them in its own `<dd>` until it runs.
19
+ * so set `several` as well, and the served item leaves them unwrapped too.
20
+ * Without it, the served item wraps them in its own `<dd>` until it runs.
21
+ *
22
+ * **Controls that act on the value**, such as a copy button, go in the
23
+ * `actions` slot, drawn after the value inside its `<dd>`, as Radix Themes'
24
+ * data list puts an icon button beside a value. A screen reader hears them as
25
+ * part of the description they act on. With several values, put each control
26
+ * inside the `<dd>` it acts on.
20
27
  *
21
28
  * @since 0.1.0
22
29
  * @status stable
23
30
  * @documentation https://fusion.dev/helix/components/description-list
24
31
  *
25
32
  * @slot - The value, or several `<dd>` elements for several values.
33
+ * @slot actions - Controls that act on the value, such as a copy button, after it inside its `<dd>`.
26
34
  * @slot label - The label, when it is more than text. Falls back to `label`.
27
35
  *
28
36
  * @csspart label - The `<dt>`, holding the label.
@@ -37,12 +45,18 @@ export declare class HelixHeadlessDescriptionListItem extends HelixElement {
37
45
  * that varies and is often more than text.
38
46
  */
39
47
  label: string;
48
+ /**
49
+ * Says the values are several `<dd>` elements of your own, so the item
50
+ * draws no `<dd>` of its own around them, on the server too. Without it the
51
+ * item finds them once it runs, and the served markup wraps them until then.
52
+ */
53
+ several: boolean;
40
54
  /**
41
55
  * Whether the values are the consumer's own `<dd>` elements, which the item
42
- * then does not wrap. Unknown on a server and while hydrating, where the
43
- * item draws its own.
56
+ * then does not wrap: `several`, or `<dd>` children found once it runs.
57
+ * Unknown on a server and while hydrating, where `several` decides.
44
58
  */
45
- private get several();
59
+ private get ownValues();
46
60
  protected firstUpdated(changed: PropertyValues): void;
47
61
  protected render(): TemplateResult;
48
62
  /** A value arriving or leaving can change whether the item wraps them. */
@@ -11,12 +11,13 @@ let HelixHeadlessDescriptionListItem = class HelixHeadlessDescriptionListItem ex
11
11
  constructor() {
12
12
  super(...arguments);
13
13
  this.label = '';
14
+ this.several = false;
14
15
  this.handleSlotChange = () => {
15
16
  this.requestUpdate();
16
17
  };
17
18
  }
18
- get several() {
19
- return this.knownChildren.some((child) => child.localName === 'dd');
19
+ get ownValues() {
20
+ return this.several || this.knownChildren.some((child) => child.localName === 'dd');
20
21
  }
21
22
  firstUpdated(changed) {
22
23
  super.firstUpdated(changed);
@@ -24,15 +25,18 @@ let HelixHeadlessDescriptionListItem = class HelixHeadlessDescriptionListItem ex
24
25
  }
25
26
  render() {
26
27
  const label = html `<dt part="label"><slot name="label">${this.label}</slot></dt>`;
27
- return this.several
28
+ return this.ownValues
28
29
  ? html `${label}<slot @slotchange=${this.handleSlotChange}></slot>`
29
30
  : html `${label}
30
- <dd part="value"><slot @slotchange=${this.handleSlotChange}></slot></dd>`;
31
+ <dd part="value"><slot @slotchange=${this.handleSlotChange}></slot><slot name="actions"></slot></dd>`;
31
32
  }
32
33
  };
33
34
  __decorate([
34
35
  property()
35
36
  ], HelixHeadlessDescriptionListItem.prototype, "label", void 0);
37
+ __decorate([
38
+ property({ type: Boolean })
39
+ ], HelixHeadlessDescriptionListItem.prototype, "several", void 0);
36
40
  HelixHeadlessDescriptionListItem = __decorate([
37
41
  customElement('helix-headless-description-list-item')
38
42
  ], HelixHeadlessDescriptionListItem);
@@ -1,5 +1,19 @@
1
1
  const CONTROL = 'a[href], audio[controls], button, details, form, iframe, input, select, textarea, video[controls], [contenteditable], [tabindex]';
2
- const isControl = (element) => element.localName.includes('-') || element.matches(CONTROL);
2
+ const isControl = (element) => {
3
+ if (element.matches(CONTROL)) {
4
+ return true;
5
+ }
6
+ if (!element.localName.includes('-')) {
7
+ return false;
8
+ }
9
+ const definition = customElements.get(element.localName);
10
+ const root = element.shadowRoot;
11
+ return (definition === undefined ||
12
+ !(element instanceof definition) ||
13
+ definition.formAssociated === true ||
14
+ root?.delegatesFocus === true ||
15
+ root?.querySelector(CONTROL) != null);
16
+ };
3
17
  export const wordsIn = (slot) => {
4
18
  const words = [];
5
19
  for (const one of slot?.assignedElements({ flatten: true }) ?? []) {
@@ -1,4 +1,4 @@
1
- import { AriaForwardController, CommandController, HelixElement, OpenPhaseController } from '@fusion.dev/helix-core';
1
+ import { AriaForwardController, CommandController, FocusScopeController, HelixElement, OpenPhaseController } from '@fusion.dev/helix-core';
2
2
  import { type PropertyValues, type TemplateResult } from 'lit';
3
3
  declare const HelixHeadlessDialog_base: (new (...args: any[]) => import("@fusion.dev/helix-core").MixinControllerOpenInterface) & typeof HelixElement;
4
4
  /**
@@ -13,6 +13,10 @@ declare const HelixHeadlessDialog_base: (new (...args: any[]) => import("@fusion
13
13
  * - an inert page behind the dialog, unreachable by pointer, keyboard, or
14
14
  * virtual cursor
15
15
  *
16
+ * The dialog adds one thing to those: `Tab` from its last control goes to its
17
+ * first, and `Shift+Tab` from its first to its last. A native modal lets `Tab`
18
+ * past its last control out to the browser's own controls.
19
+ *
16
20
  * `open` calls `showModal()`, and every way the dialog closes goes through
17
21
  * `requestOpen`. A native dialog closes three ways: the property, Escape, and a
18
22
  * `<form method="dialog">` submit. Routing all three through `requestOpen`
@@ -25,7 +29,8 @@ declare const HelixHeadlessDialog_base: (new (...args: any[]) => import("@fusion
25
29
  *
26
30
  * The dialog is described by the words at the start of its body: the elements
27
31
  * in the default slot before the first one that is or holds a control. A
28
- * question above a form describes the dialog, and the form does not. An
32
+ * question above a form describes the dialog, and the form does not. A Helix
33
+ * component that draws words and no control, such as `Text`, counts as words. An
29
34
  * `aria-describedby` on the host replaces it.
30
35
  *
31
36
  * Set `alert` for a dialog that interrupts to ask for an answer, such as a
@@ -190,6 +195,7 @@ export declare class HelixHeadlessDialog extends HelixHeadlessDialog_base {
190
195
  * either. A browser without element reflection keeps the fallback name.
191
196
  */
192
197
  private nameByHeader;
198
+ protected readonly scope: FocusScopeController;
193
199
  /** Whether the body's words are what currently describe the dialog. */
194
200
  private describedByBody;
195
201
  /**
@@ -4,7 +4,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- import { AriaForwardController, CommandController, customElement, drawDismiss, drawDismissGlyph, HelixElement, headingsIn, hostAria, lockScroll, MixinControllerOpen, OpenPhaseController, reflectElements, unlockScroll, } from '@fusion.dev/helix-core';
7
+ import { AriaForwardController, auditName, CommandController, customElement, drawDismiss, drawDismissGlyph, FocusScopeController, HelixElement, headingsIn, hostAria, lockScroll, MixinControllerOpen, OpenPhaseController, reflectElements, unlockScroll, } from '@fusion.dev/helix-core';
8
8
  import { html, nothing } from 'lit';
9
9
  import { property } from 'lit/decorators.js';
10
10
  import { wordsIn } from '../description.js';
@@ -60,6 +60,16 @@ let HelixHeadlessDialog = class HelixHeadlessDialog extends MixinControllerOpen(
60
60
  this.close(submitter?.hasAttribute('value') ? submitter.value : undefined);
61
61
  };
62
62
  this.namedByHeader = false;
63
+ this.scope = new FocusScopeController(this, {
64
+ contain: () => this.open,
65
+ contents: () => [
66
+ ...['icon', 'header', '', 'footer'].flatMap((name) => this.renderRoot
67
+ ?.querySelector(name ? `slot[name="${name}"]` : 'slot:not([name])')
68
+ ?.assignedElements({ flatten: true }) ?? []),
69
+ ...[...(this.dialog?.children ?? [])].filter((one) => !(one instanceof HTMLSlotElement)),
70
+ ],
71
+ surface: () => this.dialog,
72
+ });
63
73
  this.describedByBody = false;
64
74
  this.handleBackdrop = (event) => {
65
75
  const panel = this.dialog;
@@ -145,6 +155,11 @@ let HelixHeadlessDialog = class HelixHeadlessDialog extends MixinControllerOpen(
145
155
  return;
146
156
  }
147
157
  if (this.open && !dialog.open) {
158
+ auditName(this, () => null, 'Give it a `label`, or a heading in the `header` slot.', () => this.label !== '' ||
159
+ this.namedByHeader ||
160
+ headingsIn(this.renderRoot
161
+ .querySelector('slot[name="header"]')
162
+ ?.assignedElements({ flatten: true }) ?? []).length > 0);
148
163
  void this.openWhenSlotted(dialog);
149
164
  }
150
165
  else if (!this.open && dialog.open) {
@@ -9,6 +9,9 @@ import { type PropertyValues, type TemplateResult } from 'lit';
9
9
  * rendered element. The semantics are then in the server-rendered markup, with
10
10
  * no attribute written by script after the element connects.
11
11
  *
12
+ * Set `announced` for a line that divides one thing from another, and it is
13
+ * read as a separator, named by any content set into it.
14
+ *
12
15
  * Use `orientation="vertical"` between items on one line, such as inside a
13
16
  * toolbar. A vertical divider stretches to fit its flex parent and sets no
14
17
  * height of its own.
@@ -23,9 +23,10 @@ let HelixHeadlessDivider = class HelixHeadlessDivider extends HelixElement {
23
23
  return html `<div
24
24
  part="line"
25
25
  role=${this.announced ? 'separator' : 'presentation'}
26
+ aria-labelledby=${this.announced ? 'content' : nothing}
26
27
  aria-orientation=${this.announced ? (this.orientation ?? 'horizontal') : nothing}
27
28
  ></div>
28
- <span part="content"><slot @slotchange=${() => this.markEmpty()}></slot></span>
29
+ <span id="content" part="content"><slot @slotchange=${() => this.markEmpty()}></slot></span>
29
30
  <div part="line" role="presentation"></div>`;
30
31
  }
31
32
  };
@@ -49,6 +49,7 @@ declare const HelixHeadlessDonutChart_base: typeof HelixElement & (new (...args:
49
49
  * @csspart segment - One slice.
50
50
  * @csspart segment-active - The slice under the pointer. Set alongside `segment`.
51
51
  * @csspart segment-edge - One slice as a closed shape, used to draw its outline.
52
+ * @csspart slice-label - One slice's share, written on the slice under `slice-labels`. Placed with `left` and `top`, or `inset-inline-start` and `top` on a half ring, and carries its series color as `--chart-series`.
52
53
  * @csspart summary - The chart's name and each slice's share, written as a sentence for screen readers. Hide it visually.
53
54
  * @csspart tooltip - The bubble, forwarded from `Tooltip`.
54
55
  * @csspart tooltip-anchor - The `Tooltip` element itself.
@@ -115,6 +116,16 @@ export declare class HelixHeadlessDonutChart extends HelixHeadlessDonutChart_bas
115
116
  * because the styled sheet selects on it.
116
117
  */
117
118
  hole?: 'large' | 'none' | 'small';
119
+ /**
120
+ * Writes each slice's share on the slice, the `slice-label` part, so a
121
+ * reader sees the parts without a legend or a pointer: "29%" in the middle
122
+ * of the band.
123
+ *
124
+ * Absent writes none. A slice under a twentieth of the whole takes no
125
+ * label, there being no room on it for one. A screen reader hears every
126
+ * share in the summary, and the labels are hidden from it.
127
+ */
128
+ sliceLabels: boolean;
118
129
  /**
119
130
  * How much of the circle the whole occupies.
120
131
  *
@@ -175,6 +186,11 @@ export declare class HelixHeadlessDonutChart extends HelixHeadlessDonutChart_bas
175
186
  * slice, so a key stepping by rows would land on a slice that is not there.
176
187
  */
177
188
  get readings(): number;
189
+ /**
190
+ * Whether the slice at this place is drawn, which a slice a legend hid is
191
+ * not. The keys pass over it, as the ring closes over it.
192
+ */
193
+ showsReading(at: number): boolean;
178
194
  protected render(): TemplateResult;
179
195
  /**
180
196
  * What a reader who cannot see the ring is told: the chart's name and each
@@ -194,6 +210,13 @@ export declare class HelixHeadlessDonutChart extends HelixHeadlessDonutChart_bas
194
210
  * table does not hold.
195
211
  */
196
212
  protected renderPlot(shares: DonutShare[]): TemplateResult;
213
+ /**
214
+ * Each slice's share, written in the middle of its band at its mid-angle,
215
+ * as an element beside the drawing so the text is not stretched with it.
216
+ * Placed as the tooltip's point is placed: from the left on a whole ring,
217
+ * whose bearing is a clock's, and from the inline start on a half one.
218
+ */
219
+ protected renderSliceLabels(shares: DonutShare[]): TemplateResult;
197
220
  /**
198
221
  * The view box, cropped to what is actually drawn.
199
222
  *
@@ -238,6 +261,14 @@ export declare class HelixHeadlessDonutChart extends HelixHeadlessDonutChart_bas
238
261
  * box, which is the ring's center for a circle and is not for a sector.
239
262
  */
240
263
  protected renderEdge(share: DonutShare, index: number): TemplateResult;
264
+ /**
265
+ * The rows the tooltip reads, with the slice's share of the whole after its
266
+ * amount, as `AreaChart` writes a part's share under `share`: "612 (24%)".
267
+ *
268
+ * The share is what the ring shows and the table does not, so a reading
269
+ * said by key gives it too, as the summary does.
270
+ */
271
+ private withShare;
241
272
  /**
242
273
  * What a pointer resting on a slice shows.
243
274
  *
@@ -8,6 +8,7 @@ import { CHART_PLOT, customElement, drawTooltip, HelixElement, MixinChartSource,
8
8
  import { html, nothing, svg } from 'lit';
9
9
  import { property } from 'lit/decorators.js';
10
10
  import '../../tooltip/index.js';
11
+ import { sliceLabelAt } from '../slice-label.js';
11
12
  const PERCENTS = new Map();
12
13
  const percentIn = (locale) => {
13
14
  let found = PERCENTS.get(locale);
@@ -30,6 +31,10 @@ const THICKNESS = {
30
31
  small: 26,
31
32
  };
32
33
  let HelixHeadlessDonutChart = class HelixHeadlessDonutChart extends MixinChartSource(HelixElement) {
34
+ constructor() {
35
+ super(...arguments);
36
+ this.sliceLabels = false;
37
+ }
33
38
  connectedCallback() {
34
39
  super.connectedCallback();
35
40
  this.pointer.axis = 'none';
@@ -70,6 +75,9 @@ let HelixHeadlessDonutChart = class HelixHeadlessDonutChart extends MixinChartSo
70
75
  get readings() {
71
76
  return this.shares.length;
72
77
  }
78
+ showsReading(at) {
79
+ return (this.shares[at]?.fraction ?? 0) > 0;
80
+ }
73
81
  render() {
74
82
  const shares = this.shares;
75
83
  return html `${this.renderPlot(shares)}${shares.length === 0 ? nothing : this.renderSummary(shares)}`;
@@ -111,9 +119,37 @@ let HelixHeadlessDonutChart = class HelixHeadlessDonutChart extends MixinChartSo
111
119
  ${shares.map((share, index) => this.renderSegment(share, index))}
112
120
  </svg>
113
121
  ${this.hole === 'none' ? nothing : html `<div id="helix-chart-center" part="center"><slot></slot></div>`}
122
+ ${this.sliceLabels ? this.renderSliceLabels(shares) : nothing}
114
123
  ${this.renderTooltip()}
115
124
  </div>`;
116
125
  }
126
+ renderSliceLabels(shares) {
127
+ const half = this.sweep === 'half';
128
+ const ring = {
129
+ center: CENTER,
130
+ origin: this.origin,
131
+ radius: this.radius,
132
+ span: this.span,
133
+ tall: half ? EDGE + this.thickness / 2 : PLOT_HEIGHT,
134
+ top: half ? CENTER - EDGE : 0,
135
+ width: PLOT_WIDTH,
136
+ };
137
+ const format = percentIn(this.locale);
138
+ return html `${shares.map((share, index) => {
139
+ const place = sliceLabelAt(share, ring);
140
+ if (!place) {
141
+ return nothing;
142
+ }
143
+ const { x, y } = place;
144
+ return html `<span
145
+ aria-hidden="true"
146
+ data-series=${seriesIndex(index)}
147
+ part="slice-label"
148
+ style=${`--chart-series: var(--chart-series-${seriesIndex(index)}); ${half ? 'inset-inline-start' : 'left'}: ${x}%; top: ${y}%`}
149
+ >${format.format(share.fraction)}</span
150
+ >`;
151
+ })}`;
152
+ }
117
153
  get frame() {
118
154
  if (this.sweep !== 'half') {
119
155
  return `0 0 ${PLOT_WIDTH} ${PLOT_HEIGHT}`;
@@ -174,6 +210,21 @@ let HelixHeadlessDonutChart = class HelixHeadlessDonutChart extends MixinChartSo
174
210
  style="--chart-series: var(--chart-series-${seriesIndex(index)})"
175
211
  />`;
176
212
  }
213
+ withShare(share) {
214
+ const rows = this.sourceRows;
215
+ const column = this.plottedColumns[0];
216
+ const row = rows[share.row];
217
+ const cell = column === undefined ? undefined : row?.cells[column];
218
+ if (!row || !cell || column === undefined) {
219
+ return rows;
220
+ }
221
+ const cells = [...row.cells];
222
+ cells[column] = {
223
+ ...cell,
224
+ text: `${cell.text} (${percentIn(this.locale).format(share.fraction)})`,
225
+ };
226
+ return rows.map((one, index) => (index === share.row ? { ...row, cells } : one));
227
+ }
177
228
  renderTooltip() {
178
229
  const at = this.pointer.at;
179
230
  const share = this.shares[at];
@@ -188,7 +239,7 @@ let HelixHeadlessDonutChart = class HelixHeadlessDonutChart extends MixinChartSo
188
239
  const y = ((CENTER + Math.sin(angle) * edge - top) / tall) * 100;
189
240
  const turned = this.sweep === 'half' && this.pointer.mirrored;
190
241
  const across = Math.cos(angle) > 0 !== turned;
191
- return drawTooltip(this.sourceRows, share.row, this.tag('tooltip'), {
242
+ return drawTooltip(this.withShare(share), share.row, this.tag('tooltip'), {
192
243
  fixed: this.sweep !== 'half',
193
244
  placement: Math.abs(Math.cos(angle)) > Math.abs(Math.sin(angle))
194
245
  ? across
@@ -205,6 +256,9 @@ let HelixHeadlessDonutChart = class HelixHeadlessDonutChart extends MixinChartSo
205
256
  __decorate([
206
257
  property()
207
258
  ], HelixHeadlessDonutChart.prototype, "hole", void 0);
259
+ __decorate([
260
+ property({ attribute: 'slice-labels', reflect: true, type: Boolean })
261
+ ], HelixHeadlessDonutChart.prototype, "sliceLabels", void 0);
208
262
  __decorate([
209
263
  property({ reflect: true })
210
264
  ], HelixHeadlessDonutChart.prototype, "sweep", void 0);
@@ -0,0 +1,35 @@
1
+ /** A slice's place on the ring, as shares of the whole from 0 to 1. */
2
+ export interface SliceShare {
3
+ /** How much of the ring the slice takes. */
4
+ fraction: number;
5
+ /** Where the slice starts, as the share of the ring before it. */
6
+ start: number;
7
+ }
8
+ /** The ring a slice label is placed on, in the drawing's own units. */
9
+ export interface RingGeometry {
10
+ /** The center, on both axes. */
11
+ center: number;
12
+ /** Where the ring's turn starts, in radians: a quarter turn back is twelve o'clock. */
13
+ origin: number;
14
+ /** The radius of the band's middle, where a label sits. */
15
+ radius: number;
16
+ /** How much of a turn the ring takes: 1 for a ring, a half for an arc. */
17
+ span: number;
18
+ /** How tall the box the labels are placed in is. */
19
+ tall: number;
20
+ /** Where the top of that box is. */
21
+ top: number;
22
+ /** How wide the drawing is. */
23
+ width: number;
24
+ }
25
+ /** The smallest share that takes a label: a twentieth of the ring. */
26
+ export declare const SMALLEST_LABELED = 0.05;
27
+ /**
28
+ * Where a slice's label goes, as percentages of the box from the left and the
29
+ * top: the middle of its band at its mid-angle. Nothing for a slice under a
30
+ * twentieth, whose label would not fit on it.
31
+ */
32
+ export declare const sliceLabelAt: (share: SliceShare, ring: RingGeometry) => {
33
+ x: number;
34
+ y: number;
35
+ } | undefined;
@@ -0,0 +1,11 @@
1
+ export const SMALLEST_LABELED = 0.05;
2
+ export const sliceLabelAt = (share, ring) => {
3
+ if (share.fraction < SMALLEST_LABELED) {
4
+ return undefined;
5
+ }
6
+ const angle = (share.start + share.fraction / 2) * 2 * Math.PI * ring.span + ring.origin;
7
+ return {
8
+ x: ((ring.center + Math.cos(angle) * ring.radius) / ring.width) * 100,
9
+ y: ((ring.center + Math.sin(angle) * ring.radius - ring.top) / ring.tall) * 100,
10
+ };
11
+ };
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Whether a box reaches past the window's edges, by more than a pixel.
3
+ *
4
+ * What a drawer resting at a snap point asks of the element focus has just
5
+ * moved to: the part of the panel past the window's edge is off screen, and a
6
+ * control there has focus where the reader cannot see it.
7
+ */
8
+ export declare const beyondWindow: (box: Pick<DOMRectReadOnly, 'bottom' | 'left' | 'right' | 'top'>, width: number, height: number) => boolean;
@@ -0,0 +1 @@
1
+ export const beyondWindow = (box, width, height) => box.top < -1 || box.left < -1 || box.bottom > height + 1 || box.right > width + 1;
@@ -1,4 +1,4 @@
1
- import { AriaForwardController, CommandController, HelixElement, OpenPhaseController, SwipeController } from '@fusion.dev/helix-core';
1
+ import { AriaForwardController, CommandController, FocusScopeController, HelixElement, OpenPhaseController, SwipeController } from '@fusion.dev/helix-core';
2
2
  import { type PropertyValues, type TemplateResult } from 'lit';
3
3
  declare const HelixHeadlessDrawer_base: (new (...args: any[]) => import("@fusion.dev/helix-core").MixinControllerOpenInterface) & typeof HelixElement;
4
4
  /**
@@ -11,7 +11,8 @@ declare const HelixHeadlessDrawer_base: (new (...args: any[]) => import("@fusion
11
11
  *
12
12
  * The drawer is modal by default, which means four things:
13
13
  *
14
- * - focus is trapped inside
14
+ * - focus is trapped inside: `Tab` from the last control goes to the first,
15
+ * and `Shift+Tab` from the first to the last, as in `Dialog`
15
16
  * - Escape and a press outside close it
16
17
  * - the page behind is covered
17
18
  * - the page behind does not scroll
@@ -27,6 +28,16 @@ declare const HelixHeadlessDrawer_base: (new (...args: any[]) => import("@fusion
27
28
  * the nearest. While a swipe moves the panel, the distance is written on it as
28
29
  * `--drawer-swipe-x` and `--drawer-swipe-y`. `swipe="false"` turns swiping off.
29
30
  *
31
+ * `snap` is the snap point the panel rests at, and `:state(snapped)` is on the
32
+ * host while that is less than the whole panel. `snapTo()` moves it to
33
+ * another. **Focus moving to a control past the
34
+ * window's edge opens the panel to its largest snap point**, so a reader
35
+ * moving through a half open sheet with `Tab` never lands on a control they
36
+ * cannot see.
37
+ *
38
+ * Set `dismissible` to draw a close control in the corner, labeled by
39
+ * `dismiss-label`, as `Dialog` draws one.
40
+ *
30
41
  * The panel's name is `label` when you set it. Otherwise it is the heading in
31
42
  * the `header` slot, or the elements an `aria-labelledby` on the host names.
32
43
  *
@@ -51,6 +62,7 @@ declare const HelixHeadlessDrawer_base: (new (...args: any[]) => import("@fusion
51
62
  * @documentation https://fusion.dev/helix/components/drawer
52
63
  *
53
64
  * @slot - The drawer's content.
65
+ * @slot dismiss-icon - Replaces the glyph inside the close control.
54
66
  * @slot footer - Content pinned below the scrolling area, such as the drawer's actions.
55
67
  * @slot header - Content pinned above the scrolling area.
56
68
  *
@@ -60,6 +72,8 @@ declare const HelixHeadlessDrawer_base: (new (...args: any[]) => import("@fusion
60
72
  * @event {ToggleEvent} toggle - Sent when the drawer opens or closes, with `newState` and `oldState`.
61
73
  *
62
74
  * @csspart content - The scrolling content region.
75
+ * @csspart dismiss - The close control, drawn when the drawer is `dismissible`.
76
+ * @csspart dismiss-mark - The glyph on the close control, where none is slotted.
63
77
  * @csspart footer - The footer region.
64
78
  * @csspart header - The header region.
65
79
  * @csspart panel - The sliding panel.
@@ -70,6 +84,7 @@ declare const HelixHeadlessDrawer_base: (new (...args: any[]) => import("@fusion
70
84
  * @cssstate entering - From the moment the drawer opens until its entrance has finished.
71
85
  * @cssstate exiting - From the moment the drawer closes until its exit has finished.
72
86
  * @cssstate open - While the drawer is open.
87
+ * @cssstate snapped - While the panel rests at a snap point that shows less than the whole panel.
73
88
  */
74
89
  export declare class HelixHeadlessDrawer extends HelixHeadlessDrawer_base {
75
90
  protected readonly commands: CommandController;
@@ -86,6 +101,18 @@ export declare class HelixHeadlessDrawer extends HelixHeadlessDrawer_base {
86
101
  * that a resting value is an attribute's absence.
87
102
  */
88
103
  closedBy?: 'any' | 'closerequest' | 'none';
104
+ /**
105
+ * Draws a control that closes the drawer, in the corner where the title is.
106
+ *
107
+ * Pressing it is `close()`, so it sends `helix-before-close` like every other
108
+ * way out.
109
+ */
110
+ dismissible: boolean;
111
+ /**
112
+ * The close control's accessible name. Translate it with the rest of your
113
+ * interface.
114
+ */
115
+ dismissLabel: string;
89
116
  /**
90
117
  * Accessible name for the panel. When it is empty, the heading in the
91
118
  * `header` slot names the panel.
@@ -153,6 +180,8 @@ export declare class HelixHeadlessDrawer extends HelixHeadlessDrawer_base {
153
180
  protected readonly phases: OpenPhaseController;
154
181
  /** How far the panel rests toward its edge, in pixels, at the snap point it settled on. */
155
182
  private rest;
183
+ /** The fraction of the panel on screen at the snap point it rests at. */
184
+ private shown;
156
185
  /** The edge the panel leaves through, from its placement and the writing direction. */
157
186
  private get edge();
158
187
  /** The panel's size along the swipe, in pixels. */
@@ -165,6 +194,30 @@ export declare class HelixHeadlessDrawer extends HelixHeadlessDrawer_base {
165
194
  private place;
166
195
  /** Brings a released swipe to rest: at a snap point, or closed through the request. */
167
196
  private settle;
197
+ /**
198
+ * The fraction of the panel on screen at the snap point it rests at, such as
199
+ * `0.5`. It is `1`, the whole panel, while the drawer is closed or has no
200
+ * `snap-points`.
201
+ */
202
+ get snap(): number;
203
+ /**
204
+ * Puts the panel at rest at a snap point, and says on the host, as
205
+ * `:state(snapped)`, while that is short of the whole panel.
206
+ */
207
+ private restAt;
208
+ /** Says whether the panel rests short of the whole, and nothing while closed. */
209
+ private markSnap;
210
+ /**
211
+ * Moves the open panel to rest at the snap point nearest `point`, a fraction
212
+ * of the panel such as `1` for the whole of it.
213
+ */
214
+ snapTo(point: number): void;
215
+ /**
216
+ * Focus moving to a control past the window's edge, in a panel resting short
217
+ * of the whole: the panel opens to its largest snap point, so the control is
218
+ * on screen.
219
+ */
220
+ private readonly handleFocusIn;
168
221
  /** Opens the drawer. */
169
222
  show(): void;
170
223
  /**
@@ -181,6 +234,7 @@ export declare class HelixHeadlessDrawer extends HelixHeadlessDrawer_base {
181
234
  * key is read here, and comes through the same request.
182
235
  */
183
236
  private readonly handleKeydown;
237
+ protected readonly scope: FocusScopeController;
184
238
  /** The panel, which is a real `<dialog>`. */
185
239
  private get panel();
186
240
  /**
@@ -216,9 +270,16 @@ export declare class HelixHeadlessDrawer extends HelixHeadlessDrawer_base {
216
270
  * reflection keeps the fallback name.
217
271
  */
218
272
  private nameByHeader;
273
+ connectedCallback(): void;
219
274
  disconnectedCallback(): void;
220
275
  protected updated(changed: PropertyValues): void;
221
276
  protected render(): TemplateResult;
277
+ /**
278
+ * The glyph on the close control, behind a seam: slot fallback, so a
279
+ * consumer replaces it by slotting, and a method, so a tier above replaces it
280
+ * by overriding. As `Dialog` draws it.
281
+ */
282
+ protected renderDismissIcon(): TemplateResult;
222
283
  }
223
284
  declare global {
224
285
  interface HTMLElementTagNameMap {