@fusion.dev/helix-headless 0.146.0 → 0.148.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 (288) hide show
  1. package/custom-elements.json +9287 -1084
  2. package/dist/accordion/item/accordion-item.d.ts +43 -21
  3. package/dist/accordion/item/accordion-item.js +37 -11
  4. package/dist/accordion/root/accordion-root.d.ts +8 -2
  5. package/dist/accordion/root/accordion-root.js +6 -8
  6. package/dist/announcement/root/announcement-root.d.ts +66 -6
  7. package/dist/announcement/root/announcement-root.js +144 -13
  8. package/dist/area-chart/root/area-chart-root.d.ts +18 -1
  9. package/dist/area-chart/root/area-chart-root.js +14 -7
  10. package/dist/avatar/root/avatar-root.d.ts +31 -1
  11. package/dist/avatar/root/avatar-root.js +11 -1
  12. package/dist/badge/count.d.ts +14 -0
  13. package/dist/badge/count.js +20 -0
  14. package/dist/badge/root/badge-root.d.ts +57 -6
  15. package/dist/badge/root/badge-root.js +77 -8
  16. package/dist/bar-chart/root/bar-chart-root.js +11 -20
  17. package/dist/bar-chart/stack.d.ts +10 -0
  18. package/dist/bar-chart/stack.js +8 -0
  19. package/dist/blockquote/root/blockquote-root.d.ts +66 -8
  20. package/dist/blockquote/root/blockquote-root.js +85 -8
  21. package/dist/breadcrumbs/breadcrumb/breadcrumb.d.ts +14 -0
  22. package/dist/breadcrumbs/breadcrumb/breadcrumb.js +12 -2
  23. package/dist/breadcrumbs/root/breadcrumbs-root.js +2 -2
  24. package/dist/button/root/button-root.d.ts +24 -38
  25. package/dist/button/root/button-root.js +6 -37
  26. package/dist/button/submitter.d.ts +27 -0
  27. package/dist/button/submitter.js +25 -0
  28. package/dist/button-group/arrows.d.ts +14 -0
  29. package/dist/button-group/arrows.js +10 -0
  30. package/dist/button-group/root/button-group-root.d.ts +141 -3
  31. package/dist/button-group/root/button-group-root.js +142 -2
  32. package/dist/canvas/edge-pan.d.ts +61 -0
  33. package/dist/canvas/edge-pan.js +63 -0
  34. package/dist/canvas/node/canvas-node.d.ts +12 -2
  35. package/dist/canvas/node/canvas-node.js +6 -2
  36. package/dist/canvas/root/canvas-document.d.ts +10 -0
  37. package/dist/canvas/root/canvas-document.js +1 -0
  38. package/dist/canvas/root/canvas-root.d.ts +107 -5
  39. package/dist/canvas/root/canvas-root.js +140 -36
  40. package/dist/canvas/snap.d.ts +42 -0
  41. package/dist/canvas/snap.js +32 -0
  42. package/dist/card/root/card-root.d.ts +12 -1
  43. package/dist/card/root/card-root.js +11 -4
  44. package/dist/carousel/root/carousel-root.d.ts +4 -3
  45. package/dist/carousel/root/carousel-root.js +2 -6
  46. package/dist/chat/root/chat-root.d.ts +28 -4
  47. package/dist/chat/root/chat-root.js +12 -7
  48. package/dist/checkbox/root/checkbox-root.js +5 -7
  49. package/dist/checkbox-group/root/checkbox-group-root.d.ts +13 -0
  50. package/dist/checkbox-group/root/checkbox-group-root.js +16 -7
  51. package/dist/checkbox-group/select-all.d.ts +9 -4
  52. package/dist/checkbox-group/select-all.js +1 -1
  53. package/dist/code-block/root/code-block-root.d.ts +41 -18
  54. package/dist/code-block/root/code-block-root.js +21 -6
  55. package/dist/color-input/root/color-input-root.d.ts +11 -0
  56. package/dist/color-input/root/color-input-root.js +12 -5
  57. package/dist/color-picker/channels.js +1 -2
  58. package/dist/color-picker/root/color-picker-root.d.ts +32 -24
  59. package/dist/color-picker/root/color-picker-root.js +99 -55
  60. package/dist/color-picker/wheel.d.ts +28 -0
  61. package/dist/color-picker/wheel.js +15 -0
  62. package/dist/combobox/root/combobox-root.d.ts +83 -11
  63. package/dist/combobox/root/combobox-root.js +81 -18
  64. package/dist/command/root/command-root.d.ts +7 -4
  65. package/dist/command/root/command-root.js +2 -19
  66. package/dist/copy-button/root/copy-button-root.d.ts +16 -1
  67. package/dist/copy-button/root/copy-button-root.js +7 -2
  68. package/dist/data-table/keys.d.ts +0 -18
  69. package/dist/data-table/keys.js +1 -11
  70. package/dist/data-table/root/data-table-root.js +29 -50
  71. package/dist/date-input/root/date-input-root.d.ts +8 -1
  72. package/dist/date-input/root/date-input-root.js +8 -5
  73. package/dist/date-picker/root/date-picker-root.d.ts +14 -9
  74. package/dist/date-picker/root/date-picker-root.js +21 -16
  75. package/dist/description-list/item/description-list-item.d.ts +22 -4
  76. package/dist/description-list/item/description-list-item.js +14 -4
  77. package/dist/divider/root/divider-root.d.ts +45 -16
  78. package/dist/divider/root/divider-root.js +28 -4
  79. package/dist/donut-chart/root/donut-chart-root.js +13 -6
  80. package/dist/donut-chart/slice-label.d.ts +35 -0
  81. package/dist/donut-chart/slice-label.js +11 -0
  82. package/dist/drawer/root/drawer-root.d.ts +4 -2
  83. package/dist/drawer/root/drawer-root.js +15 -3
  84. package/dist/drilldown/item/drilldown-item.d.ts +21 -1
  85. package/dist/drilldown/item/drilldown-item.js +38 -4
  86. package/dist/drilldown/root/drilldown-root.js +3 -2
  87. package/dist/element-events.generated.js +5 -1
  88. package/dist/empty/root/empty-root.d.ts +46 -2
  89. package/dist/empty/root/empty-root.js +50 -5
  90. package/dist/file-input/root/file-input-root.d.ts +34 -6
  91. package/dist/file-input/root/file-input-root.js +55 -21
  92. package/dist/file-input/status.d.ts +24 -0
  93. package/dist/file-input/status.js +11 -0
  94. package/dist/filter-input/chip/filter-chip.d.ts +23 -0
  95. package/dist/filter-input/chip/filter-chip.js +10 -2
  96. package/dist/filter-input/root/filter-input-root.d.ts +8 -0
  97. package/dist/filter-input/root/filter-input-root.js +17 -27
  98. package/dist/format-date/fields.d.ts +20 -0
  99. package/dist/format-date/fields.js +14 -0
  100. package/dist/format-date/options.d.ts +5 -5
  101. package/dist/format-date/options.js +10 -39
  102. package/dist/format-date/root/format-date-root.d.ts +53 -4
  103. package/dist/format-date/root/format-date-root.js +38 -50
  104. package/dist/graph/root/graph-root.d.ts +23 -5
  105. package/dist/graph/root/graph-root.js +17 -20
  106. package/dist/heatmap/root/buckets.d.ts +21 -0
  107. package/dist/heatmap/root/buckets.js +34 -0
  108. package/dist/heatmap/root/heatmap-root.d.ts +76 -3
  109. package/dist/heatmap/root/heatmap-root.js +105 -20
  110. package/dist/icon/index.d.ts +1 -1
  111. package/dist/icon/index.js +1 -1
  112. package/dist/icon/registry.d.ts +26 -1
  113. package/dist/icon/registry.js +12 -1
  114. package/dist/icon/root/icon-root.d.ts +13 -0
  115. package/dist/icon/root/icon-root.js +23 -2
  116. package/dist/icon/root/index.d.ts +1 -1
  117. package/dist/icon/root/index.js +1 -1
  118. package/dist/image/root/image-root.d.ts +20 -0
  119. package/dist/image/root/image-root.js +6 -1
  120. package/dist/input/root/input-root.d.ts +23 -2
  121. package/dist/input/root/input-root.js +12 -8
  122. package/dist/kbd/root/kbd-root.d.ts +20 -3
  123. package/dist/kbd/root/kbd-root.js +23 -50
  124. package/dist/legend/hidden-series.d.ts +10 -2
  125. package/dist/legend/hidden-series.js +5 -2
  126. package/dist/legend/root/legend-root.d.ts +25 -7
  127. package/dist/legend/root/legend-root.js +25 -26
  128. package/dist/lightbox/root/lightbox-root.d.ts +50 -5
  129. package/dist/lightbox/root/lightbox-root.js +76 -8
  130. package/dist/lightbox/zoom.d.ts +2 -0
  131. package/dist/lightbox/zoom.js +5 -3
  132. package/dist/line-chart/root/line-chart-root.d.ts +16 -0
  133. package/dist/line-chart/root/line-chart-root.js +10 -2
  134. package/dist/list/root/list-root.d.ts +10 -2
  135. package/dist/list/root/list-root.js +31 -24
  136. package/dist/list/selection.d.ts +17 -0
  137. package/dist/list/selection.js +16 -0
  138. package/dist/listbox/root/listbox-root.d.ts +125 -26
  139. package/dist/listbox/root/listbox-root.js +156 -166
  140. package/dist/map/marker/map-marker.d.ts +2 -1
  141. package/dist/map/root/map-root.d.ts +40 -2
  142. package/dist/map/root/map-root.js +64 -23
  143. package/dist/megamenu/hand-over.d.ts +75 -0
  144. package/dist/megamenu/hand-over.js +67 -0
  145. package/dist/megamenu/root/megamenu-root.d.ts +38 -14
  146. package/dist/megamenu/root/megamenu-root.js +29 -50
  147. package/dist/menu/item/menu-item.js +4 -4
  148. package/dist/menu/root/menu-root.d.ts +5 -2
  149. package/dist/meter/root/meter-root.d.ts +42 -0
  150. package/dist/meter/root/meter-root.js +33 -7
  151. package/dist/navigation/root/navigation-root.js +5 -8
  152. package/dist/notifications/group/notification-group.d.ts +8 -1
  153. package/dist/notifications/group/notification-group.js +12 -6
  154. package/dist/notifications/notification/notification.d.ts +12 -1
  155. package/dist/notifications/notification/notification.js +3 -1
  156. package/dist/notifications/root/notifications-root.d.ts +48 -3
  157. package/dist/notifications/root/notifications-root.js +36 -6
  158. package/dist/number-input/grain.d.ts +28 -0
  159. package/dist/number-input/grain.js +14 -0
  160. package/dist/number-input/root/number-input-root.d.ts +17 -1
  161. package/dist/number-input/root/number-input-root.js +29 -18
  162. package/dist/object-inspector/root/object-inspector-root.d.ts +17 -6
  163. package/dist/object-inspector/root/object-inspector-root.js +31 -20
  164. package/dist/option/index.d.ts +1 -0
  165. package/dist/option/index.js +1 -0
  166. package/dist/option/separator/option-separator.d.ts +30 -0
  167. package/dist/option/separator/option-separator.js +21 -0
  168. package/dist/outline/root/outline-root.d.ts +12 -0
  169. package/dist/outline/root/outline-root.js +5 -19
  170. package/dist/pagination/size/pagination-size.d.ts +6 -0
  171. package/dist/pagination/size/pagination-size.js +5 -3
  172. package/dist/pin-input/code.d.ts +51 -1
  173. package/dist/pin-input/code.js +37 -0
  174. package/dist/pin-input/root/pin-input-root.d.ts +98 -121
  175. package/dist/pin-input/root/pin-input-root.js +151 -156
  176. package/dist/popover/hide-outside.js +2 -9
  177. package/dist/popover/root/popover-root.d.ts +7 -1
  178. package/dist/popover/root/popover-root.js +9 -1
  179. package/dist/progress/root/progress-root.d.ts +27 -0
  180. package/dist/progress/root/progress-root.js +25 -7
  181. package/dist/qr-code/export.d.ts +19 -0
  182. package/dist/qr-code/export.js +14 -0
  183. package/dist/qr-code/name.d.ts +11 -0
  184. package/dist/qr-code/name.js +7 -0
  185. package/dist/qr-code/root/qr-code-root.d.ts +31 -9
  186. package/dist/qr-code/root/qr-code-root.js +29 -17
  187. package/dist/radio/group/radio-group.d.ts +15 -0
  188. package/dist/radio/root/radio-root.js +2 -2
  189. package/dist/rating/root/rating-root.d.ts +22 -9
  190. package/dist/rating/root/rating-root.js +15 -39
  191. package/dist/scatter-chart/measures.d.ts +22 -0
  192. package/dist/scatter-chart/measures.js +11 -0
  193. package/dist/scatter-chart/root/scatter-chart-root.d.ts +26 -0
  194. package/dist/scatter-chart/root/scatter-chart-root.js +21 -7
  195. package/dist/scroll-area/scrollbar.d.ts +0 -8
  196. package/dist/scroll-area/scrollbar.js +1 -1
  197. package/dist/select/align.d.ts +47 -0
  198. package/dist/select/align.js +7 -0
  199. package/dist/select/root/select-root.d.ts +115 -11
  200. package/dist/select/root/select-root.js +104 -20
  201. package/dist/slider/root/slider-root.d.ts +18 -1
  202. package/dist/slider/root/slider-root.js +22 -0
  203. package/dist/sparkline/readings.d.ts +30 -12
  204. package/dist/sparkline/readings.js +32 -15
  205. package/dist/sparkline/root/sparkline-root.d.ts +46 -3
  206. package/dist/sparkline/root/sparkline-root.js +60 -21
  207. package/dist/speed-dial/group/speed-dial-group.d.ts +48 -0
  208. package/dist/speed-dial/group/speed-dial-group.js +43 -0
  209. package/dist/speed-dial/index.d.ts +1 -0
  210. package/dist/speed-dial/index.js +1 -0
  211. package/dist/speed-dial/item/speed-dial-item.d.ts +27 -2
  212. package/dist/speed-dial/item/speed-dial-item.js +43 -5
  213. package/dist/speed-dial/long-press.d.ts +50 -0
  214. package/dist/speed-dial/long-press.js +48 -0
  215. package/dist/speed-dial/root/speed-dial-root.d.ts +86 -1
  216. package/dist/speed-dial/root/speed-dial-root.js +123 -6
  217. package/dist/splitter/root/splitter-root.d.ts +9 -2
  218. package/dist/splitter/root/splitter-root.js +18 -3
  219. package/dist/steps/root/steps-root.d.ts +8 -1
  220. package/dist/steps/root/steps-root.js +6 -1
  221. package/dist/steps/step/step.d.ts +1 -0
  222. package/dist/steps/step/step.js +1 -1
  223. package/dist/table/cell/table-cell.d.ts +8 -1
  224. package/dist/table/cell/table-cell.js +6 -2
  225. package/dist/table/column/table-column.d.ts +6 -0
  226. package/dist/table/column/table-column.js +5 -1
  227. package/dist/table/grid-controller.d.ts +117 -0
  228. package/dist/table/grid-controller.js +293 -0
  229. package/dist/table/root/table-root.d.ts +47 -3
  230. package/dist/table/root/table-root.js +93 -29
  231. package/dist/table/row/table-row.d.ts +36 -0
  232. package/dist/table/row/table-row.js +52 -2
  233. package/dist/tabs/root/tabs-root.d.ts +5 -3
  234. package/dist/tag/group/tag-group.d.ts +16 -4
  235. package/dist/tag/group/tag-group.js +23 -20
  236. package/dist/textarea/root/textarea-root.d.ts +14 -2
  237. package/dist/textarea/root/textarea-root.js +6 -7
  238. package/dist/time-input/root/time-input-root.d.ts +5 -1
  239. package/dist/time-input/root/time-input-root.js +10 -7
  240. package/dist/time-picker/root/time-picker-root.d.ts +12 -14
  241. package/dist/time-picker/root/time-picker-root.js +18 -23
  242. package/dist/toast/item/toast-item.d.ts +9 -6
  243. package/dist/toast/item/toast-item.js +1 -1
  244. package/dist/toast/root/toast-root.d.ts +40 -4
  245. package/dist/toast/root/toast-root.js +68 -16
  246. package/dist/toast/words.d.ts +12 -0
  247. package/dist/toast/words.js +25 -0
  248. package/dist/toggle/group/toggle-group.d.ts +29 -5
  249. package/dist/toggle/group/toggle-group.js +26 -43
  250. package/dist/toggle/root/toggle-root.js +2 -4
  251. package/dist/toolbar/root/toolbar-root.d.ts +52 -5
  252. package/dist/toolbar/root/toolbar-root.js +88 -13
  253. package/dist/tooltip/root/tooltip-root.d.ts +7 -1
  254. package/dist/tooltip/root/tooltip-root.js +10 -2
  255. package/dist/tour/root/tour-root.d.ts +15 -0
  256. package/dist/tour/root/tour-root.js +20 -1
  257. package/dist/tour/stop/tour-stop.d.ts +3 -0
  258. package/dist/tour/stop/tour-stop.js +3 -3
  259. package/dist/tree/root/tree-root.js +2 -2
  260. package/dist/trend/figure.d.ts +16 -0
  261. package/dist/trend/figure.js +8 -0
  262. package/dist/trend/root/trend-root.d.ts +41 -2
  263. package/dist/trend/root/trend-root.js +29 -3
  264. package/dist/video/root/extra-controls.d.ts +12 -0
  265. package/dist/video/root/extra-controls.js +6 -2
  266. package/dist/video/root/video-root.d.ts +16 -1
  267. package/dist/video/root/video-root.js +15 -1
  268. package/dist/video-playlist/root/video-playlist-root.d.ts +11 -1
  269. package/dist/video-playlist/root/video-playlist-root.js +3 -0
  270. package/dist/virtual-list/fill.d.ts +11 -0
  271. package/dist/virtual-list/fill.js +9 -0
  272. package/dist/virtual-list/keys.d.ts +16 -7
  273. package/dist/virtual-list/keys.js +17 -6
  274. package/dist/virtual-list/plan.d.ts +17 -1
  275. package/dist/virtual-list/plan.js +13 -2
  276. package/dist/virtual-list/root/virtual-list-root.d.ts +25 -3
  277. package/dist/virtual-list/root/virtual-list-root.js +53 -41
  278. package/lint.json +1 -1
  279. package/package.json +5 -5
  280. package/types/jsx.d.ts +4934 -954
  281. package/types/svelte.d.ts +2 -0
  282. package/types/vue.d.ts +946 -253
  283. package/dist/color-picker/swatches.d.ts +0 -12
  284. package/dist/color-picker/swatches.js +0 -26
  285. package/dist/rating/steps.d.ts +0 -7
  286. package/dist/rating/steps.js +0 -9
  287. package/dist/tooltip/focus-target.d.ts +0 -6
  288. package/dist/tooltip/focus-target.js +0 -9
@@ -1,9 +1,10 @@
1
- const clamp = (value, low, high) => Math.min(Math.max(value, low), high) || 0;
2
- export const clampScale = (scale, max) => clamp(scale, 1, Math.max(max, 1));
1
+ import { clamp } from '@fusion.dev/helix-core';
2
+ const held = (value, low, high) => clamp(value, low, high) || 0;
3
+ export const clampScale = (scale, max) => held(scale, 1, Math.max(max, 1));
3
4
  export const clampPan = (pan, scale, width, height) => {
4
5
  const x = ((scale - 1) * width) / 2;
5
6
  const y = ((scale - 1) * height) / 2;
6
- return { x: clamp(pan.x, -x, x), y: clamp(pan.y, -y, y) };
7
+ return { x: held(pan.x, -x, x), y: held(pan.y, -y, y) };
7
8
  };
8
9
  export const zoomAt = (at, from, to, pan) => ({
9
10
  x: at.x - ((at.x - pan.x) * to) / from,
@@ -14,3 +15,4 @@ export const between = (a, b) => ({
14
15
  x: (a.x + b.x) / 2,
15
16
  y: (a.y + b.y) / 2,
16
17
  });
18
+ export const percentOf = (scale) => Math.round(scale * 100);
@@ -15,6 +15,10 @@ declare const HelixHeadlessLineChart_base: typeof HelixElement & (new (...args:
15
15
  *
16
16
  * Every series shares one scale, as in the bar chart.
17
17
  *
18
+ * `dashed` names the series drawn as a dashed line, such as a forecast or a
19
+ * target beside the readings: `dashed="Forecast"`. Each takes a
20
+ * `line-dashed` part beside `line`.
21
+ *
18
22
  * `area` fills each series down to the floor on its own, so the fills overlap.
19
23
  * For a total made of parts, use `Area Chart`, which stacks the series so the
20
24
  * top edge is the total and each band is a share.
@@ -47,6 +51,7 @@ declare const HelixHeadlessLineChart_base: typeof HelixElement & (new (...args:
47
51
  * @csspart label - One reading's name.
48
52
  * @csspart labels - The row of reading names.
49
53
  * @csspart line - The line for one series.
54
+ * @csspart line-dashed - A `line` whose series `dashed` names. Set alongside `line`.
50
55
  * @csspart live - The readout: a polite live region that says the reading the keys moved to. Hide it visually.
51
56
  * @csspart mark - The invisible point the tooltip is anchored to.
52
57
  * @csspart marker - The mark on one reading, under `markers`, and on a reading with a blank on either side. Placed with `inset-inline-start` and `inset-block-start`, and carries its series color as `--chart-series`.
@@ -112,6 +117,15 @@ export declare class HelixHeadlessLineChart extends HelixHeadlessLineChart_base
112
117
  * here, which is what lets a line take the reading aid.
113
118
  */
114
119
  curve?: Curve;
120
+ /**
121
+ * The series drawn as a dashed line, by their headings, separated by
122
+ * commas: `dashed="Forecast, Target"`.
123
+ *
124
+ * For a series that is not a reading, such as a forecast or a goal, drawn
125
+ * beside the ones that are. Each takes a `line-dashed` part beside `line`,
126
+ * which a stylesheet draws dashed. Absent, every line is solid.
127
+ */
128
+ dashed: string;
115
129
  /**
116
130
  * Which rules are drawn across the plot, if any.
117
131
  *
@@ -276,6 +290,8 @@ export declare class HelixHeadlessLineChart extends HelixHeadlessLineChart_base
276
290
  * start, as the drawing is mirrored.
277
291
  */
278
292
  protected renderMarkers(series: Series[], x: (value: number) => number, y: (value: number) => number): TemplateResult | typeof nothing;
293
+ /** Whether `dashed` names this series, matched as a heading is. */
294
+ private dashes;
279
295
  /**
280
296
  * One series, its wash first so the line is drawn over its own fill.
281
297
  *
@@ -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 { byRow, CHART_PLOT, customElement, drawTooltip, extent, HelixElement, linear, linePath, MixinChartSource, PLOT_HEIGHT, PLOT_WIDTH, seriesIndex, ticks, unbroken, } from '@fusion.dev/helix-core';
7
+ import { byRow, CHART_PLOT, commaList, customElement, drawTooltip, extent, HelixElement, linear, linePath, MixinChartSource, PLOT_HEIGHT, PLOT_WIDTH, seriesIndex, seriesKey, ticks, unbroken, } from '@fusion.dev/helix-core';
8
8
  import { html, nothing, svg } from 'lit';
9
9
  import { property } from 'lit/decorators.js';
10
10
  import '../../tooltip/index.js';
@@ -12,6 +12,7 @@ let HelixHeadlessLineChart = class HelixHeadlessLineChart extends MixinChartSour
12
12
  constructor() {
13
13
  super(...arguments);
14
14
  this.area = false;
15
+ this.dashed = '';
15
16
  this.markers = false;
16
17
  this.zero = false;
17
18
  }
@@ -166,6 +167,10 @@ let HelixHeadlessLineChart = class HelixHeadlessLineChart extends MixinChartSour
166
167
  style=${`--chart-series: var(--chart-series-${seriesIndex(depth)}); inset-inline-start: ${(x(point.at) / PLOT_WIDTH) * 100}%; inset-block-start: ${(y(point.value) / PLOT_HEIGHT) * 100}%`}
167
168
  ></span>`)}`;
168
169
  }
170
+ dashes(name) {
171
+ const key = seriesKey(name);
172
+ return this.dashed !== '' && commaList(this.dashed).some((one) => seriesKey(one) === key);
173
+ }
169
174
  renderSeries(one, depth, x, y) {
170
175
  if (!this.showsSeries(one.name)) {
171
176
  return html `${nothing}`;
@@ -199,7 +204,7 @@ let HelixHeadlessLineChart = class HelixHeadlessLineChart extends MixinChartSour
199
204
  d=${path}
200
205
  data-series=${index}
201
206
  fill="none"
202
- part="line"
207
+ part="line${this.dashes(one.name) ? ' line-dashed' : ''}"
203
208
  style="--chart-series: var(--chart-series-${index})"
204
209
  />`;
205
210
  }
@@ -235,6 +240,9 @@ __decorate([
235
240
  __decorate([
236
241
  property({ reflect: true })
237
242
  ], HelixHeadlessLineChart.prototype, "curve", void 0);
243
+ __decorate([
244
+ property()
245
+ ], HelixHeadlessLineChart.prototype, "dashed", void 0);
238
246
  __decorate([
239
247
  property()
240
248
  ], HelixHeadlessLineChart.prototype, "gridlines", void 0);
@@ -27,12 +27,14 @@ import { type ListSelectionBehavior, type ListSelectionMode } from '../selection
27
27
  * |---|---|
28
28
  * | Down, Up | Moves to the next or the previous row. Under `replace`, selects it. |
29
29
  * | Home, End | Moves to the first or the last row. Under `replace`, selects it. |
30
+ * | Page Down, Page Up | Moves a box's height of rows, so the row at one edge lands at the other. Under `replace`, selects the row it lands on. |
30
31
  * | A letter or a word | Moves to the next row whose words start with what you typed. |
31
32
  * | Left, Right | Moves between the row and the controls in its `end` slot. |
32
33
  * | Space | Selects the row, or lets it go. |
33
- * | Shift with Down, Up, Home, End or Space | Selects every row from the last one pressed, in `multiple`. |
34
- * | Control or Command with Down, Up, Home or End | Moves without selecting, under `replace`. |
34
+ * | Shift with Down, Up, Home, End, Page Down, Page Up or Space | Selects every row from the last one pressed, in `multiple`. |
35
+ * | Control or Command with Down, Up, Home, End, Page Down or Page Up | Moves without selecting, under `replace`. |
35
36
  * | Control or Command with A | Selects every row, in `multiple`. |
37
+ * | Escape | Lets go of every selected row, asking first, and keeps the key from the dialog or menu around the list. With nothing selected, the key goes on to them. |
36
38
  * | Enter | Acts on the row: follows its link, or sends `helix-action` from it. |
37
39
  *
38
40
  * A press with Shift selects every row from the last one pressed, and a press
@@ -185,6 +187,12 @@ export declare class HelixHeadlessList extends HelixElement {
185
187
  * nothing was pressed yet.
186
188
  */
187
189
  private arrive;
190
+ /**
191
+ * Page Down or Page Up from the row: focus moves a box's height of rows, the
192
+ * list's own where it scrolls and the window's where it does not, and lands
193
+ * the way an arrow does, so `replace` and Shift choose as they do there.
194
+ */
195
+ private page;
188
196
  /** Acts on the row: follows its link, or says it was acted on. */
189
197
  protected act(row: HelixHeadlessListItem): void;
190
198
  /** Left and Right inside a row: the cell, then each control in `end`, and back. */
@@ -4,13 +4,12 @@ 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 { commaList, customElement, HelixActionEvent, HelixBeforeChangeEvent, HelixElement, hostAria, inlineStep, KeyboardNavigationController, requestChange, rovingStop, typeaheadBy, whenHydrated, } from '@fusion.dev/helix-core';
7
+ import { commaList, customElement, focusItemOf, HelixActionEvent, HelixElement, hostAria, inlineStep, KeyboardNavigationController, pressedOwnControl, requestValue, rovingStop, scrollRoom, selectsAll, typeaheadByWords, whenHydrated, } from '@fusion.dev/helix-core';
8
8
  import { html, nothing } from 'lit';
9
9
  import { property } from 'lit/decorators.js';
10
10
  import { HelixHeadlessListItem } from '../item/list-item.js';
11
11
  import { numbering } from '../numbering.js';
12
- import { choiceValue, rowStop, } from '../selection.js';
13
- const PRESSABLE = 'a[href], button, input, label, select, textarea, [tabindex]';
12
+ import { choiceValue, pageReach, rowStop, } from '../selection.js';
14
13
  let HelixHeadlessList = class HelixHeadlessList extends HelixElement {
15
14
  constructor() {
16
15
  super(...arguments);
@@ -23,15 +22,19 @@ let HelixHeadlessList = class HelixHeadlessList extends HelixElement {
23
22
  origin: 'focus',
24
23
  reserved: () => ['ArrowLeft', 'ArrowRight'],
25
24
  selects: () => false,
26
- typeahead: typeaheadBy((item) => item.words),
25
+ typeahead: typeaheadByWords(),
27
26
  wrap: false,
28
27
  });
29
28
  this.handleKeyCapture = (event) => {
30
29
  this.moving = { extend: event.shiftKey, toggle: event.ctrlKey || event.metaKey };
31
30
  };
32
31
  this.handleKeydown = (event) => {
33
- this.moving = undefined;
34
32
  const row = this.interactive ? this.rowOf(event) : undefined;
33
+ if (row && !row.disabled && !event.altKey && /^Page(Down|Up)$/.test(event.key)) {
34
+ event.preventDefault();
35
+ this.page(row, event.key === 'PageDown' ? 1 : -1);
36
+ }
37
+ this.moving = undefined;
35
38
  if (!row || row.disabled || event.altKey) {
36
39
  return;
37
40
  }
@@ -43,11 +46,16 @@ let HelixHeadlessList = class HelixHeadlessList extends HelixElement {
43
46
  if (event.composedPath()[0] !== row.cell) {
44
47
  return;
45
48
  }
46
- if (toggle && event.key.toLowerCase() === 'a' && this.selectionMode === 'multiple') {
49
+ if (selectsAll(event) && this.selectionMode === 'multiple') {
47
50
  event.preventDefault();
48
51
  const every = this.reachable.map((one) => this.valueFor(one)).join(', ');
49
52
  this.choose(every === this.value ? null : every);
50
53
  }
54
+ else if (event.key === 'Escape' && this.value !== '' && this.selectionMode !== 'none') {
55
+ event.preventDefault();
56
+ event.stopPropagation();
57
+ this.choose('');
58
+ }
51
59
  else if (event.key === 'Enter' && !toggle) {
52
60
  event.preventDefault();
53
61
  this.act(row);
@@ -62,11 +70,8 @@ let HelixHeadlessList = class HelixHeadlessList extends HelixElement {
62
70
  if (!row) {
63
71
  return;
64
72
  }
65
- const path = event.composedPath();
66
73
  const cell = row.cell;
67
- const end = cell && path.includes(cell) ? path.indexOf(cell) : path.indexOf(row);
68
- const inner = path.slice(0, Math.max(0, end));
69
- if (inner.some((node) => node instanceof HTMLElement && node.matches(PRESSABLE))) {
74
+ if (pressedOwnControl(event, cell && event.composedPath().includes(cell) ? cell : row)) {
70
75
  return;
71
76
  }
72
77
  if (this.selectionMode === 'none') {
@@ -101,14 +106,11 @@ let HelixHeadlessList = class HelixHeadlessList extends HelixElement {
101
106
  return this.interactive ? this.rows.filter((row) => !row.disabled) : [];
102
107
  }
103
108
  navigable(row) {
104
- return {
105
- contains: (node) => row.contains(node),
109
+ return focusItemOf(row, {
106
110
  disabled: row.disabled,
107
- focusItem: () => row.focusItem(),
108
- select: () => { },
109
- selected: false,
111
+ focus: () => row.focusItem(),
110
112
  words: row.words,
111
- };
113
+ });
112
114
  }
113
115
  valueFor(row) {
114
116
  return row.value || row.words;
@@ -140,14 +142,8 @@ let HelixHeadlessList = class HelixHeadlessList extends HelixElement {
140
142
  if (next === null) {
141
143
  return;
142
144
  }
143
- requestChange({
144
- apply: (value) => {
145
- this.value = value;
146
- this.dispatchEvent(new Event('change', { bubbles: true, composed: true }));
147
- },
148
- event: (value) => new HelixBeforeChangeEvent({ value }),
149
- host: this,
150
- next,
145
+ requestValue(this, next, (value) => {
146
+ this.value = value;
151
147
  });
152
148
  }
153
149
  choice(row, extend, toggle, arrived) {
@@ -188,6 +184,17 @@ let HelixHeadlessList = class HelixHeadlessList extends HelixElement {
188
184
  }
189
185
  this.choose(next);
190
186
  }
187
+ page(row, step) {
188
+ const rows = this.reachable;
189
+ const edges = rows.map((one) => {
190
+ const box = one.getBoundingClientRect();
191
+ return { bottom: box.bottom, top: box.top };
192
+ });
193
+ const target = rows[pageReach(edges, rows.indexOf(row), scrollRoom(this), step)];
194
+ if (target && target !== row) {
195
+ target.focusItem();
196
+ }
197
+ }
191
198
  act(row) {
192
199
  if (row.disabled) {
193
200
  return;
@@ -47,3 +47,20 @@ export declare const choiceValue: ({ anchor, arrived, behavior, extend, mode, pr
47
47
  * and from the cell going back reaches the last control.
48
48
  */
49
49
  export declare const rowStop: (count: number, at: number, step: -1 | 1) => number;
50
+ /** Where a row sits along the list, in pixels, as the page keys measure it. */
51
+ export interface RowEdges {
52
+ /** The row's top edge. */
53
+ top: number;
54
+ /** The row's bottom edge. */
55
+ bottom: number;
56
+ }
57
+ /**
58
+ * Where Page Down (`step` 1) or Page Up (`step` -1) goes from row `at`: the
59
+ * farthest row that fits whole in `room` pixels together with row `at`, so the
60
+ * row at one edge of the box lands at the other, and at least the next row.
61
+ *
62
+ * Measured rather than counted, because a list's rows differ in height. Rows of
63
+ * one height `h` move `floor(room / h) - 1` rows, which is what Data Table and
64
+ * Virtual List move. At either end it stays on row `at`.
65
+ */
66
+ export declare const pageReach: (rows: readonly RowEdges[], at: number, room: number, step: -1 | 1) => number;
@@ -28,3 +28,19 @@ export const rowStop = (count, at, step) => {
28
28
  }
29
29
  return next < 0 ? count - 1 : next;
30
30
  };
31
+ export const pageReach = (rows, at, room, step) => {
32
+ const from = rows[at];
33
+ if (!from) {
34
+ return at;
35
+ }
36
+ let reach = at;
37
+ for (let next = at + step; next >= 0 && next < rows.length; next += step) {
38
+ const row = rows[next];
39
+ const span = step === 1 ? row.bottom - from.top : from.bottom - row.top;
40
+ if (span > room && next !== at + step) {
41
+ break;
42
+ }
43
+ reach = next;
44
+ }
45
+ return reach;
46
+ };
@@ -1,4 +1,4 @@
1
- import { AriaForwardController, DisabledCascadeController, HelixFormElement } from '@fusion.dev/helix-core';
1
+ import { AriaForwardController, type DataOptionItem, DisabledCascadeController, HelixFormElement } from '@fusion.dev/helix-core';
2
2
  import { nothing, type PropertyValues, type TemplateResult } from 'lit';
3
3
  import { HelixHeadlessOption } from '../../option/root/option-root.js';
4
4
  declare const HelixHeadlessListbox_base: (new (...args: any[]) => import("@fusion.dev/helix-core").CollectionElement) & (new (...args: any[]) => import("@fusion.dev/helix-core").MixinControllerValueInterface) & (new (...args: any[]) => import("@fusion.dev/helix-core").MixinFieldInterface) & typeof HelixFormElement;
@@ -20,14 +20,31 @@ declare const HelixHeadlessListbox_base: (new (...args: any[]) => import("@fusio
20
20
  * active option is where the keyboard is: the arrow keys move it, and
21
21
  * `aria-activedescendant` points to it while focus stays on the list.
22
22
  *
23
- * The arrow keys, Home, End, PageUp and PageDown move the highlight, and typed
24
- * letters move it to the next option whose words start with them. In a
25
- * single-choice list the highlight is the choice unless `manual` is set; then
26
- * Enter, Space or a click chooses. With `multiple`, Space toggles the
27
- * highlighted option, Shift with an arrow adds the option it moves to, Shift
28
- * with Home or End adds every option from the highlight to that end, and
29
- * Control+A or Command+A chooses every option, or none where all are chosen.
30
- * In a filter field, Space, Home, End and letters edit the text.
23
+ * **Keyboard.** The list is one tab stop, or its filter field is where there
24
+ * is one. In a single-choice list the highlight is the choice unless `manual`
25
+ * is set; then Enter, Space or a click chooses.
26
+ *
27
+ * | Key | What it does |
28
+ * |---|---|
29
+ * | Down, Up | Moves the highlight to the next or the previous option, round from the last to the first. With `layout="grid"`, to the option below or above, stopping at the edge. |
30
+ * | Right, Left | With `layout="grid"`, moves to the next or the previous option, mirrored right to left. In a filter field, moves the caret. |
31
+ * | Home, End | Moves to the first or the last option. In a filter field, moves the caret. |
32
+ * | Page Down, Page Up | Moves by as many options as the list shows at once. |
33
+ * | A letter or a word | Moves to the next option whose words start with what you typed. In a filter field, types it. |
34
+ * | Enter | Chooses the highlighted option, or follows it where it is a link. |
35
+ * | Space | Chooses the highlighted option, or with `multiple` toggles it. In a filter field, types a space. |
36
+ * | Shift with Down or Up | With `multiple`, adds the option the highlight moves to. In a filter field, moves the highlight and leaves the value. |
37
+ * | Shift with Space | With `multiple`, adds every option from the one last chosen to the highlighted one. In a filter field, types a space. |
38
+ * | Shift with Home or End | With `multiple`, adds every option from the highlight to that end. In a filter field, hold Control as well. |
39
+ * | Control or Command with A | With `multiple`, chooses every option, or none where all are chosen. In a filter field, selects the text. |
40
+ * | Escape | In a filter field, clears the filter. |
41
+ *
42
+ * **ARIA.** The `items` part is the `listbox`, named by the label and
43
+ * described by the hint and the message, with `aria-multiselectable` under
44
+ * `multiple`, `aria-required`, `aria-invalid`, and `aria-busy` while loading.
45
+ * Each option is an `option` with `aria-selected`. The list, or its filter
46
+ * field, points `aria-activedescendant` at the highlighted option; the field
47
+ * is `aria-autocomplete="list"` and controls the list.
31
48
  *
32
49
  * An option with `href` is a link: Enter or a press follows it and selects
33
50
  * nothing, and moving onto it with the arrows does not follow it.
@@ -80,12 +97,16 @@ declare const HelixHeadlessListbox_base: (new (...args: any[]) => import("@fusio
80
97
  export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
81
98
  protected readonly aria: AriaForwardController;
82
99
  /**
83
- * What the browser may autofill in the text field, as a platform token.
100
+ * What a browser's autofill may choose, as a platform token such as
101
+ * `country` or `cc-exp-month`, as a native `<select>` takes it.
102
+ *
103
+ * Set, the list draws a hidden native `<select>` with the same options for
104
+ * the browser to fill, as React Aria's `HiddenSelect` does, and a fill
105
+ * chooses the option. `off`, the default, draws none.
84
106
  *
85
- * **Defaults to `off`, which is not the platform's default and is the
86
- * point.** The field filters a list rather than collecting a value, so a
87
- * browser offering to fill it with a saved address is competing for the same
88
- * keystrokes as the listbox. A consumer who wants autofill can still ask.
107
+ * **The filter field is never filled.** It narrows the list rather than
108
+ * collecting a value, so a browser offering it a saved address competes
109
+ * with the reader for the same keystrokes: it is always `off`.
89
110
  */
90
111
  autocomplete: string;
91
112
  /**
@@ -136,14 +157,49 @@ export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
136
157
  * Placeholder text for the filter field.
137
158
  */
138
159
  filterLabel: string;
160
+ /**
161
+ * The options as data, for a list too long to draw whole: each a value,
162
+ * which is also its words, or a record with a `value`, a `label` and
163
+ * `disabled`. Set, the list draws only the options in sight, and the ones
164
+ * you write as children are not read.
165
+ *
166
+ * **Every option is still reachable.** The keyboard, the typeahead, the
167
+ * filter and the value work over the whole set, and the option the keyboard
168
+ * is on is drawn wherever it is, so a screen reader is told about it. Each
169
+ * drawn option says its place in the set (`aria-posinset`, `aria-setsize`).
170
+ * React Aria virtualizes a `ListBox` with its `Virtualizer`; this is core's
171
+ * `VirtualizeController`.
172
+ *
173
+ * **The list needs a height to scroll in**: the styled tier's
174
+ * `--listbox-max-block-size`, or a `max-block-size` on `::part(items)` in the
175
+ * headless tier. Import the Option family as well, whose elements are drawn.
176
+ * A server sends the list empty, and the options are drawn once it hydrates.
177
+ */
178
+ items: readonly DataOptionItem[] | undefined;
179
+ /**
180
+ * How the options are laid out, which the arrow keys follow: `stack`, one
181
+ * under another, or `grid`, in rows and columns, as React Aria's `ListBox`
182
+ * lays out cards or photos. With `grid`, Up and Down move within a column,
183
+ * and Left and Right along the list, mirrored right to left.
184
+ *
185
+ * The columns are the stylesheet's: the styled tier draws them at
186
+ * `--listbox-column-min-inline-size` or wider, and a headless list lays out
187
+ * `::part(items)` as it likes, since the keys read where each option is
188
+ * drawn. A list of `items` stays a stack. Left out, the list is a stack,
189
+ * and the host carries no attribute for it.
190
+ */
191
+ layout?: 'grid' | 'stack';
192
+ /** Draws `items` a window at a time. See core's `OptionWindowController`. */
193
+ private readonly data;
139
194
  /**
140
195
  * What the list says when its options could not be loaded, such as after a
141
- * request to a server fails. Empty is no error.
196
+ * request to a server fails. Empty, null or no attribute is no error, so
197
+ * removing the attribute clears it.
142
198
  *
143
199
  * Set, it shows under any options there are, in place of `empty-text` and
144
200
  * `loading-text`, and a screen reader hears it. Clear it when you ask again.
145
201
  */
146
- loadError: string;
202
+ loadError: string | null;
147
203
  /**
148
204
  * Stops the arrow keys from choosing each option they move to. Enter, Space
149
205
  * or a click chooses the highlighted option.
@@ -178,6 +234,11 @@ export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
178
234
  * writes the rest here.
179
235
  */
180
236
  resultsLabel: string;
237
+ /**
238
+ * What VoiceOver hears as the highlight reaches a chosen option from the
239
+ * filter field, on Apple devices. `{name}` is the option's words.
240
+ */
241
+ selectedLabel: string;
181
242
  /**
182
243
  * Which option the keyboard is on, which is not what is chosen.
183
244
  */
@@ -187,6 +248,8 @@ export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
187
248
  * it back on the first match.
188
249
  */
189
250
  private parked;
251
+ /** The option last chosen, which Shift with Space extends from. */
252
+ private anchor;
190
253
  /** The letters typed at the list, which move the highlight to a match. */
191
254
  private readonly typeahead;
192
255
  /**
@@ -210,6 +273,9 @@ export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
210
273
  * markup, so the hiding is done to them in `willUpdate` and the render reads
211
274
  * the answer it left here. Counted during render instead, a filter matching
212
275
  * nothing left an empty box with no message in it.
276
+ *
277
+ * Plain rather than reactive: `place` writes it inside an update, which
278
+ * draws it, and a slot change asks for that update.
213
279
  */
214
280
  private hasMatches;
215
281
  /**
@@ -219,7 +285,7 @@ export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
219
285
  * count: without this the list shipped "Nothing to show" over markup that was
220
286
  * about to have options in it, which is the one thing an empty state must
221
287
  * never do. `place` does not run on the server, so this is false exactly
222
- * when the answer is unknown.
288
+ * when the answer is unknown. Plain, for the reason `hasMatches` is.
223
289
  */
224
290
  private counted;
225
291
  protected readonly cascade: DisabledCascadeController;
@@ -258,6 +324,17 @@ export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
258
324
  * which the region says in place of this.
259
325
  */
260
326
  private tell;
327
+ /**
328
+ * Says the option the arrows reached from the filter field, on Apple devices.
329
+ *
330
+ * **VoiceOver does not read the option `aria-activedescendant` points to**
331
+ * while focus is in a text field, so a filterable list moved its highlight
332
+ * in silence there. React Aria's combobox says the option on Apple devices,
333
+ * with "selected" where it is chosen; the field here is the same pattern.
334
+ * Only while the field has focus, so a highlight placed as the list opens
335
+ * or seeded from the value says nothing until the reader moves it.
336
+ */
337
+ private tellActive;
261
338
  /**
262
339
  * @internal Moves the highlight to the option whose words start with the
263
340
  * letters typed, and returns its value, or nothing where none matches.
@@ -267,6 +344,13 @@ export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
267
344
  * `<select>` does.
268
345
  */
269
346
  typeaheadTo(key: string): string | undefined;
347
+ /**
348
+ * @internal Called when the option already chosen is chosen again, which
349
+ * changes nothing here and answers the question for the control that opened
350
+ * the list. Select and Combobox close their panel on it, as a native
351
+ * `<select>` closes when its own answer is pressed.
352
+ */
353
+ chosenAgain: (() => void) | undefined;
270
354
  /** @internal Whether letters typed in the last moment are still one search. */
271
355
  get typing(): boolean;
272
356
  /**
@@ -286,7 +370,8 @@ export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
286
370
  */
287
371
  get options(): HelixHeadlessOption[];
288
372
  /**
289
- * Walks the tree, and walks *through* a slot when it meets one.
373
+ * The elements of one kind in the list: its options, its groups or its
374
+ * rules. Walks the tree, and walks *through* a slot when it meets one.
290
375
  *
291
376
  * Through a slot because that is how this gets composed. `Select` renders a
292
377
  * listbox in its own shadow root with a slot inside it, so the options are
@@ -294,9 +379,17 @@ export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
294
379
  * `querySelectorAll` finds the slot and no options at all, and the whole
295
380
  * component comes up empty.
296
381
  */
297
- private collect;
298
- /** The groups, found the same way and for the same reason. */
382
+ private among;
383
+ /**
384
+ * The groups, found the same way and for the same reason, and by their
385
+ * name rather than their class, as the rules are: a list that holds no group
386
+ * does not carry the group's code, and either tier's tag ends the same way.
387
+ */
299
388
  private get groups();
389
+ /** Every option the list reads: the records of `items`, or the elements. */
390
+ private get entries();
391
+ /** The option elements on the page: the ones drawn for `items`, or the children. */
392
+ private get elements();
300
393
  /** The options a filter has left showing. */
301
394
  private get shown();
302
395
  /** The chosen values, as an array whether or not `multiple` is set. */
@@ -309,6 +402,11 @@ export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
309
402
  */
310
403
  private choose;
311
404
  private readonly handleSelection;
405
+ /**
406
+ * Adds every option a reader can reach from the one last chosen to `to`,
407
+ * APG's Shift with Space. With none chosen yet, it adds `to` alone.
408
+ */
409
+ private extend;
312
410
  /**
313
411
  * Moves the keyboard, and chooses with it only where that is the pattern.
314
412
  *
@@ -377,10 +475,8 @@ export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
377
475
  * read as a dial rather than scanned as a list, which is what Time Picker's
378
476
  * wheels do with three of these.
379
477
  *
380
- * A delta from the two boxes rather than `offsetTop`. An option is a slotted
381
- * light DOM child, so its `offsetParent` is whatever is positioned above it,
382
- * which is not this list and is not guaranteed to be anything: measuring both
383
- * rects and moving by the difference needs no such assumption.
478
+ * Measured by core's `centerInView`, or, for a list of `items`, by the
479
+ * arithmetic, since the chosen option may not be drawn.
384
480
  */
385
481
  reveal(): void;
386
482
  /** Hides what the filter excludes, and writes the rest onto the options. */
@@ -455,8 +551,9 @@ export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
455
551
  private askedAt;
456
552
  /**
457
553
  * Asks for more once the reader is within a screen of the end, React Aria's
458
- * `onLoadMore`: once for each number of options, so a scroll that goes on
459
- * asks again only after the next page arrived, and never while loading.
554
+ * `onLoadMore`, by core's `endInSight`, the rule Virtual List asks too: once
555
+ * for each number of options, so a scroll that goes on asks again only after
556
+ * the next page arrived, and never while loading.
460
557
  */
461
558
  private readonly handleScroll;
462
559
  /** Requests a new filter, and returns whether the request went through. */
@@ -519,6 +616,8 @@ export declare class HelixHeadlessListbox extends HelixHeadlessListbox_base {
519
616
  * different thing to say from a list that has none.
520
617
  */
521
618
  private get noResults();
619
+ /** Whether `load-error` holds words, which a removed attribute does not. */
620
+ private get failed();
522
621
  /** The error, or what a filter that hid everything says, before the shared words. */
523
622
  protected renderLive(hasContent: boolean): TemplateResult;
524
623
  protected render(): TemplateResult;