@fusion.dev/helix-headless 0.146.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 (239) hide show
  1. package/custom-elements.json +5266 -785
  2. package/dist/accordion/item/accordion-item.d.ts +38 -19
  3. package/dist/accordion/item/accordion-item.js +31 -9
  4. package/dist/accordion/root/accordion-root.d.ts +8 -2
  5. package/dist/accordion/root/accordion-root.js +3 -3
  6. package/dist/announcement/root/announcement-root.d.ts +13 -4
  7. package/dist/announcement/root/announcement-root.js +34 -6
  8. package/dist/area-chart/root/area-chart-root.d.ts +18 -1
  9. package/dist/area-chart/root/area-chart-root.js +11 -3
  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/root/badge-root.d.ts +57 -6
  13. package/dist/badge/root/badge-root.js +88 -5
  14. package/dist/bar-chart/root/bar-chart-root.js +11 -20
  15. package/dist/bar-chart/stack.d.ts +10 -0
  16. package/dist/bar-chart/stack.js +8 -0
  17. package/dist/breadcrumbs/breadcrumb/breadcrumb.d.ts +14 -0
  18. package/dist/breadcrumbs/breadcrumb/breadcrumb.js +12 -2
  19. package/dist/breadcrumbs/root/breadcrumbs-root.js +2 -2
  20. package/dist/button/root/button-root.d.ts +24 -38
  21. package/dist/button/root/button-root.js +6 -37
  22. package/dist/button/submitter.d.ts +27 -0
  23. package/dist/button/submitter.js +25 -0
  24. package/dist/card/root/card-root.d.ts +12 -1
  25. package/dist/card/root/card-root.js +11 -4
  26. package/dist/chat/root/chat-root.d.ts +15 -1
  27. package/dist/chat/root/chat-root.js +11 -2
  28. package/dist/checkbox/root/checkbox-root.js +5 -7
  29. package/dist/checkbox-group/root/checkbox-group-root.js +4 -3
  30. package/dist/checkbox-group/select-all.d.ts +0 -6
  31. package/dist/checkbox-group/select-all.js +0 -5
  32. package/dist/code-block/root/code-block-root.d.ts +35 -14
  33. package/dist/code-block/root/code-block-root.js +17 -3
  34. package/dist/color-input/root/color-input-root.d.ts +11 -0
  35. package/dist/color-input/root/color-input-root.js +12 -5
  36. package/dist/color-picker/channels.js +1 -2
  37. package/dist/color-picker/root/color-picker-root.d.ts +32 -24
  38. package/dist/color-picker/root/color-picker-root.js +101 -51
  39. package/dist/color-picker/wheel.d.ts +17 -0
  40. package/dist/color-picker/wheel.js +6 -0
  41. package/dist/combobox/root/combobox-root.d.ts +13 -0
  42. package/dist/combobox/root/combobox-root.js +14 -1
  43. package/dist/command/root/command-root.d.ts +3 -1
  44. package/dist/command/root/command-root.js +2 -19
  45. package/dist/copy-button/root/copy-button-root.d.ts +16 -1
  46. package/dist/copy-button/root/copy-button-root.js +7 -2
  47. package/dist/data-table/keys.d.ts +0 -18
  48. package/dist/data-table/keys.js +1 -11
  49. package/dist/data-table/root/data-table-root.js +13 -7
  50. package/dist/date-input/root/date-input-root.d.ts +8 -1
  51. package/dist/date-input/root/date-input-root.js +8 -5
  52. package/dist/date-picker/root/date-picker-root.d.ts +14 -9
  53. package/dist/date-picker/root/date-picker-root.js +21 -16
  54. package/dist/description-list/item/description-list-item.d.ts +18 -4
  55. package/dist/description-list/item/description-list-item.js +8 -4
  56. package/dist/donut-chart/root/donut-chart-root.js +13 -6
  57. package/dist/donut-chart/slice-label.d.ts +35 -0
  58. package/dist/donut-chart/slice-label.js +11 -0
  59. package/dist/drawer/root/drawer-root.d.ts +4 -2
  60. package/dist/drawer/root/drawer-root.js +15 -3
  61. package/dist/drilldown/item/drilldown-item.d.ts +21 -1
  62. package/dist/drilldown/item/drilldown-item.js +39 -4
  63. package/dist/drilldown/root/drilldown-root.js +3 -2
  64. package/dist/element-events.generated.js +4 -1
  65. package/dist/empty/root/empty-root.d.ts +31 -1
  66. package/dist/empty/root/empty-root.js +26 -5
  67. package/dist/file-input/root/file-input-root.d.ts +34 -6
  68. package/dist/file-input/root/file-input-root.js +54 -19
  69. package/dist/file-input/status.d.ts +24 -0
  70. package/dist/file-input/status.js +10 -0
  71. package/dist/filter-input/chip/filter-chip.d.ts +23 -0
  72. package/dist/filter-input/chip/filter-chip.js +11 -2
  73. package/dist/filter-input/root/filter-input-root.d.ts +8 -0
  74. package/dist/filter-input/root/filter-input-root.js +17 -27
  75. package/dist/format-date/options.d.ts +3 -4
  76. package/dist/format-date/options.js +2 -2
  77. package/dist/format-date/root/format-date-root.d.ts +18 -1
  78. package/dist/format-date/root/format-date-root.js +19 -23
  79. package/dist/heatmap/root/buckets.d.ts +21 -0
  80. package/dist/heatmap/root/buckets.js +34 -0
  81. package/dist/heatmap/root/heatmap-root.d.ts +64 -3
  82. package/dist/heatmap/root/heatmap-root.js +89 -19
  83. package/dist/icon/index.d.ts +1 -1
  84. package/dist/icon/index.js +1 -1
  85. package/dist/icon/registry.d.ts +26 -1
  86. package/dist/icon/registry.js +12 -1
  87. package/dist/icon/root/icon-root.d.ts +13 -0
  88. package/dist/icon/root/icon-root.js +23 -2
  89. package/dist/icon/root/index.d.ts +1 -1
  90. package/dist/icon/root/index.js +1 -1
  91. package/dist/image/root/image-root.d.ts +9 -0
  92. package/dist/image/root/image-root.js +6 -1
  93. package/dist/input/root/input-root.d.ts +23 -2
  94. package/dist/input/root/input-root.js +12 -8
  95. package/dist/kbd/keys.d.ts +29 -0
  96. package/dist/kbd/keys.js +52 -0
  97. package/dist/kbd/root/kbd-root.d.ts +20 -3
  98. package/dist/kbd/root/kbd-root.js +24 -50
  99. package/dist/legend/hidden-series.d.ts +10 -2
  100. package/dist/legend/hidden-series.js +5 -2
  101. package/dist/legend/root/legend-root.d.ts +25 -7
  102. package/dist/legend/root/legend-root.js +22 -10
  103. package/dist/lightbox/root/lightbox-root.d.ts +50 -5
  104. package/dist/lightbox/root/lightbox-root.js +76 -8
  105. package/dist/lightbox/zoom.d.ts +2 -0
  106. package/dist/lightbox/zoom.js +5 -3
  107. package/dist/line-chart/root/line-chart-root.d.ts +16 -0
  108. package/dist/line-chart/root/line-chart-root.js +10 -2
  109. package/dist/list/root/list-root.d.ts +10 -2
  110. package/dist/list/root/list-root.js +26 -5
  111. package/dist/list/selection.d.ts +17 -0
  112. package/dist/list/selection.js +16 -0
  113. package/dist/listbox/root/listbox-root.d.ts +9 -5
  114. package/dist/listbox/root/listbox-root.js +29 -37
  115. package/dist/megamenu/hand-over.d.ts +75 -0
  116. package/dist/megamenu/hand-over.js +67 -0
  117. package/dist/megamenu/root/megamenu-root.d.ts +38 -14
  118. package/dist/megamenu/root/megamenu-root.js +36 -50
  119. package/dist/menu/item/menu-item.js +4 -4
  120. package/dist/menu/root/menu-root.d.ts +3 -0
  121. package/dist/meter/root/meter-root.d.ts +42 -0
  122. package/dist/meter/root/meter-root.js +33 -7
  123. package/dist/notifications/root/notifications-root.d.ts +10 -1
  124. package/dist/notifications/root/notifications-root.js +11 -1
  125. package/dist/number-input/grain.d.ts +28 -0
  126. package/dist/number-input/grain.js +14 -0
  127. package/dist/number-input/root/number-input-root.d.ts +17 -1
  128. package/dist/number-input/root/number-input-root.js +29 -18
  129. package/dist/object-inspector/root/object-inspector-root.d.ts +13 -6
  130. package/dist/object-inspector/root/object-inspector-root.js +18 -17
  131. package/dist/option/index.d.ts +1 -0
  132. package/dist/option/index.js +1 -0
  133. package/dist/option/separator/option-separator.d.ts +30 -0
  134. package/dist/option/separator/option-separator.js +21 -0
  135. package/dist/outline/root/outline-root.d.ts +12 -0
  136. package/dist/outline/root/outline-root.js +5 -19
  137. package/dist/pagination/size/pagination-size.d.ts +5 -0
  138. package/dist/pagination/size/pagination-size.js +4 -2
  139. package/dist/pin-input/code.d.ts +28 -1
  140. package/dist/pin-input/code.js +12 -0
  141. package/dist/pin-input/root/pin-input-root.d.ts +98 -121
  142. package/dist/pin-input/root/pin-input-root.js +157 -148
  143. package/dist/popover/hide-outside.js +2 -9
  144. package/dist/popover/root/popover-root.d.ts +7 -1
  145. package/dist/popover/root/popover-root.js +9 -1
  146. package/dist/progress/root/progress-root.d.ts +27 -0
  147. package/dist/progress/root/progress-root.js +25 -7
  148. package/dist/qr-code/export.d.ts +19 -0
  149. package/dist/qr-code/export.js +14 -0
  150. package/dist/qr-code/name.d.ts +11 -0
  151. package/dist/qr-code/name.js +7 -0
  152. package/dist/qr-code/root/qr-code-root.d.ts +17 -6
  153. package/dist/qr-code/root/qr-code-root.js +10 -12
  154. package/dist/radio/group/radio-group.d.ts +15 -0
  155. package/dist/radio/root/radio-root.js +2 -2
  156. package/dist/rating/root/rating-root.d.ts +22 -9
  157. package/dist/rating/root/rating-root.js +15 -39
  158. package/dist/scatter-chart/root/scatter-chart-root.d.ts +30 -0
  159. package/dist/scatter-chart/root/scatter-chart-root.js +34 -7
  160. package/dist/scroll-area/scrollbar.d.ts +0 -8
  161. package/dist/scroll-area/scrollbar.js +1 -1
  162. package/dist/select/align.d.ts +47 -0
  163. package/dist/select/align.js +7 -0
  164. package/dist/select/root/select-root.d.ts +59 -3
  165. package/dist/select/root/select-root.js +72 -12
  166. package/dist/slider/root/slider-root.d.ts +18 -1
  167. package/dist/slider/root/slider-root.js +22 -0
  168. package/dist/sparkline/readings.d.ts +30 -12
  169. package/dist/sparkline/readings.js +32 -15
  170. package/dist/sparkline/root/sparkline-root.d.ts +46 -3
  171. package/dist/sparkline/root/sparkline-root.js +60 -21
  172. package/dist/speed-dial/item/speed-dial-item.d.ts +1 -1
  173. package/dist/speed-dial/item/speed-dial-item.js +2 -2
  174. package/dist/speed-dial/root/speed-dial-root.d.ts +6 -0
  175. package/dist/speed-dial/root/speed-dial-root.js +9 -1
  176. package/dist/splitter/root/splitter-root.d.ts +3 -0
  177. package/dist/splitter/root/splitter-root.js +2 -0
  178. package/dist/steps/root/steps-root.d.ts +8 -1
  179. package/dist/steps/root/steps-root.js +6 -1
  180. package/dist/steps/step/step.d.ts +1 -0
  181. package/dist/steps/step/step.js +1 -1
  182. package/dist/table/column/table-column.d.ts +6 -0
  183. package/dist/table/column/table-column.js +5 -1
  184. package/dist/table/root/table-root.js +13 -6
  185. package/dist/table/row/table-row.d.ts +24 -0
  186. package/dist/table/row/table-row.js +37 -1
  187. package/dist/tabs/root/tabs-root.d.ts +5 -3
  188. package/dist/tag/group/tag-group.d.ts +16 -4
  189. package/dist/tag/group/tag-group.js +19 -7
  190. package/dist/textarea/root/textarea-root.d.ts +14 -2
  191. package/dist/textarea/root/textarea-root.js +6 -7
  192. package/dist/time-input/root/time-input-root.d.ts +5 -1
  193. package/dist/time-input/root/time-input-root.js +10 -7
  194. package/dist/time-picker/root/time-picker-root.d.ts +11 -14
  195. package/dist/time-picker/root/time-picker-root.js +15 -23
  196. package/dist/toast/item/toast-item.d.ts +3 -3
  197. package/dist/toast/item/toast-item.js +0 -1
  198. package/dist/toast/root/toast-root.d.ts +28 -4
  199. package/dist/toast/root/toast-root.js +58 -12
  200. package/dist/toast/words.d.ts +12 -0
  201. package/dist/toast/words.js +25 -0
  202. package/dist/toggle/group/toggle-group.d.ts +29 -5
  203. package/dist/toggle/group/toggle-group.js +26 -41
  204. package/dist/toggle/root/toggle-root.js +2 -4
  205. package/dist/toolbar/root/toolbar-root.d.ts +21 -5
  206. package/dist/toolbar/root/toolbar-root.js +52 -8
  207. package/dist/tooltip/root/tooltip-root.d.ts +7 -1
  208. package/dist/tooltip/root/tooltip-root.js +10 -1
  209. package/dist/tour/root/tour-root.d.ts +15 -0
  210. package/dist/tour/root/tour-root.js +20 -1
  211. package/dist/tour/stop/tour-stop.d.ts +3 -0
  212. package/dist/tour/stop/tour-stop.js +3 -3
  213. package/dist/tree/root/tree-root.js +2 -2
  214. package/dist/trend/figure.d.ts +16 -0
  215. package/dist/trend/figure.js +8 -0
  216. package/dist/trend/root/trend-root.d.ts +41 -2
  217. package/dist/trend/root/trend-root.js +29 -3
  218. package/dist/video/root/extra-controls.d.ts +12 -0
  219. package/dist/video/root/extra-controls.js +6 -2
  220. package/dist/video/root/video-root.d.ts +5 -1
  221. package/dist/video-playlist/root/video-playlist-root.d.ts +11 -1
  222. package/dist/video-playlist/root/video-playlist-root.js +3 -0
  223. package/dist/virtual-list/fill.d.ts +11 -0
  224. package/dist/virtual-list/fill.js +9 -0
  225. package/dist/virtual-list/keys.d.ts +16 -7
  226. package/dist/virtual-list/keys.js +17 -6
  227. package/dist/virtual-list/plan.d.ts +17 -1
  228. package/dist/virtual-list/plan.js +13 -2
  229. package/dist/virtual-list/root/virtual-list-root.d.ts +25 -3
  230. package/dist/virtual-list/root/virtual-list-root.js +48 -24
  231. package/lint.json +1 -1
  232. package/package.json +5 -5
  233. package/types/jsx.d.ts +2979 -738
  234. package/types/svelte.d.ts +1 -0
  235. package/types/vue.d.ts +619 -202
  236. package/dist/color-picker/swatches.d.ts +0 -12
  237. package/dist/color-picker/swatches.js +0 -26
  238. package/dist/rating/steps.d.ts +0 -7
  239. package/dist/rating/steps.js +0 -9
@@ -46,13 +46,20 @@ export interface VirtualListRange {
46
46
  *
47
47
  * Rows are your markup in the light DOM, so your stylesheet styles them.
48
48
  *
49
+ * **A grid.** `columns` lays the items out that many to a line, as a grid of
50
+ * equal columns, and windows the set a line at a time, as React Aria's grid
51
+ * layout does. Each item draws one element, a cell of the grid, and
52
+ * `estimate` is the height of a line. Space the items with padding inside
53
+ * each one, which the list measures with the line.
54
+ *
49
55
  * **Keyboard.** The list is one tab stop.
50
56
  *
51
57
  * | Key | What it does |
52
58
  * |---|---|
53
- * | Down, Up | Moves to the next or the previous item. |
59
+ * | Down, Up | Moves to the next or the previous item, or in a grid to the item in the same column on the next or the previous line. |
60
+ * | Right, Left | In a grid, moves to the next or the previous item along the line, the other way round on a right-to-left page. |
54
61
  * | Home, End | Moves to the first or the last item. |
55
- * | Page Down, Page Up | Moves by the number of items on screen. |
62
+ * | Page Down, Page Up | Moves by the number of items, or of lines in a grid, on screen. |
56
63
  * | A letter or a word | Moves to the next item whose text starts with what you typed. |
57
64
  * | Tab | Moves into the focused row's own links and buttons, then out of the list. |
58
65
  *
@@ -68,7 +75,7 @@ export interface VirtualListRange {
68
75
  *
69
76
  * **Selecting.** `selection-mode` makes the list a list box a reader chooses
70
77
  * from: `single` selects one item and `multiple` any number. Space or a press
71
- * selects an item, Shift with Space, Up, Down, Home, End or a press takes in
78
+ * selects an item, Shift with Space, an arrow, Home, End or a press takes in
72
79
  * the items from the last one chosen, and Control or Command with A selects
73
80
  * them all, in `multiple`. `value` holds the chosen items' keys, separated by
74
81
  * commas, in the order of the set: `key-field` names each item's key, and a
@@ -116,6 +123,12 @@ export interface VirtualListRange {
116
123
  * @csspart viewport - The scrolling box. On this tier, it needs only a block size.
117
124
  */
118
125
  export declare class HelixHeadlessVirtualList extends HelixElement {
126
+ /**
127
+ * How many items a line holds. One, the default, is a list; more lays the
128
+ * items out as a grid of that many equal columns, windowed a line at a
129
+ * time, with Left and Right moving along a line.
130
+ */
131
+ columns: number;
119
132
  /**
120
133
  * The height of one row, in pixels, used to find the row at a scroll offset.
121
134
  *
@@ -247,6 +260,10 @@ export declare class HelixHeadlessVirtualList extends HelixElement {
247
260
  * box to measure.
248
261
  */
249
262
  get range(): VirtualListRange;
263
+ /** How many items a line holds: `columns`, at least one. */
264
+ private get across();
265
+ /** The items a span of lines holds. */
266
+ private itemsOn;
250
267
  /**
251
268
  * Scrolls the list to show the item at `index`.
252
269
  *
@@ -267,6 +284,11 @@ export declare class HelixHeadlessVirtualList extends HelixElement {
267
284
  * window moved.
268
285
  */
269
286
  private drawn;
287
+ /**
288
+ * The drawn lines, for the controller to measure: each row in a list, and
289
+ * the first item of each line in a grid, whose cell is as tall as its line.
290
+ */
291
+ private lines;
270
292
  /**
271
293
  * Reads the source named by `for`, before the render that draws it.
272
294
  *
@@ -4,16 +4,17 @@ 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, commaList, customElement, elementById, HelixBeforeChangeEvent, HelixElement, HelixLoadMoreEvent, HelixRangeChangeEvent, rangeAdd, requestChange, searchableById, Typeahead, toggleValue, typesCharacter, VirtualizeController, valueAt, } from '@fusion.dev/helix-core';
7
+ import { AriaForwardController, commaList, customElement, elementById, HelixBeforeChangeEvent, HelixElement, HelixLoadMoreEvent, HelixRangeChangeEvent, isRtl, rangeAdd, requestChange, searchableById, selectsAll, Typeahead, toggleValue, typesCharacter, VirtualizeController, } from '@fusion.dev/helix-core';
8
8
  import { html, nothing, render } from 'lit';
9
9
  import { property, state } from 'lit/decorators.js';
10
10
  import { holdControls, releaseControls } from '../controls.js';
11
- import { fillHoles, textOf } from '../fill.js';
11
+ import { fillHoles, keyOf, textsOf } from '../fill.js';
12
12
  import { stepIndex } from '../keys.js';
13
- import { drawPlan, stopAfter } from '../plan.js';
13
+ import { drawPlan, itemsOf, stopAfter } from '../plan.js';
14
14
  let HelixHeadlessVirtualList = class HelixHeadlessVirtualList extends HelixElement {
15
15
  constructor() {
16
16
  super(...arguments);
17
+ this.columns = 1;
17
18
  this.estimate = 32;
18
19
  this.for = '';
19
20
  this.keyField = '';
@@ -34,10 +35,10 @@ let HelixHeadlessVirtualList = class HelixHeadlessVirtualList extends HelixEleme
34
35
  });
35
36
  this.virtualize = new VirtualizeController(this, {
36
37
  container: () => this.partNamed('viewport'),
37
- count: () => this.data.length,
38
+ count: () => Math.ceil(this.data.length / this.across),
38
39
  estimate: () => this.estimate,
39
40
  measured: () => this.measured,
40
- rows: () => this.drawn(),
41
+ rows: () => this.lines(),
41
42
  });
42
43
  this.handleKeydown = (event) => {
43
44
  if (event.defaultPrevented) {
@@ -57,7 +58,7 @@ let HelixHeadlessVirtualList = class HelixHeadlessVirtualList extends HelixEleme
57
58
  }
58
59
  const toggle = event.ctrlKey || event.metaKey;
59
60
  if (this.selectionMode && !event.altKey) {
60
- if (toggle && event.key.toLowerCase() === 'a' && this.selectionMode === 'multiple') {
61
+ if (selectsAll(event) && this.selectionMode === 'multiple') {
61
62
  event.preventDefault();
62
63
  this.choose(this.keys().join(','));
63
64
  return;
@@ -73,7 +74,10 @@ let HelixHeadlessVirtualList = class HelixHeadlessVirtualList extends HelixEleme
73
74
  return;
74
75
  }
75
76
  const { first, last } = this.virtualize.visible();
76
- const next = stepIndex(event.key, at, this.data.length, last - first - 1);
77
+ const next = stepIndex(event.key, at, this.data.length, last - first - 1, {
78
+ across: this.across,
79
+ forward: isRtl(this) ? 'ArrowLeft' : 'ArrowRight',
80
+ });
77
81
  if (next === undefined) {
78
82
  return;
79
83
  }
@@ -117,14 +121,21 @@ let HelixHeadlessVirtualList = class HelixHeadlessVirtualList extends HelixEleme
117
121
  };
118
122
  }
119
123
  get range() {
120
- return this.virtualize.visible();
124
+ return this.itemsOn(this.virtualize.visible());
125
+ }
126
+ get across() {
127
+ return Math.max(1, Math.trunc(this.columns) || 1);
128
+ }
129
+ itemsOn(lines) {
130
+ return itemsOf(lines, this.across, this.data.length);
121
131
  }
122
132
  scrollToIndex(index, options = {}) {
123
133
  const count = this.data.length;
124
134
  if (count === 0 || !Number.isFinite(index)) {
125
135
  return;
126
136
  }
127
- this.virtualize.reveal(Math.max(0, Math.min(Math.trunc(index), count - 1)), 0, options);
137
+ const at = Math.max(0, Math.min(Math.trunc(index), count - 1));
138
+ this.virtualize.reveal(Math.floor(at / this.across), 0, options);
128
139
  this.virtualize.measure();
129
140
  }
130
141
  get data() {
@@ -136,6 +147,15 @@ let HelixHeadlessVirtualList = class HelixHeadlessVirtualList extends HelixEleme
136
147
  index: Number(element.dataset.index),
137
148
  }));
138
149
  }
150
+ lines() {
151
+ const across = this.across;
152
+ const drawn = this.drawn();
153
+ return across === 1
154
+ ? drawn
155
+ : drawn
156
+ .filter(({ index }) => index % across === 0)
157
+ .map(({ element, index }) => ({ element, index: index / across }));
158
+ }
139
159
  willUpdate(changed) {
140
160
  super.willUpdate(changed);
141
161
  if (this.readFor !== this.for && searchableById(this) && !this.hydrating) {
@@ -205,7 +225,7 @@ let HelixHeadlessVirtualList = class HelixHeadlessVirtualList extends HelixEleme
205
225
  }
206
226
  }
207
227
  report() {
208
- const { first, last } = this.virtualize.visible();
228
+ const { first, last } = this.range;
209
229
  if (first !== this.said.first || last !== this.said.last) {
210
230
  this.said = { first, last };
211
231
  this.dispatchEvent(new HelixRangeChangeEvent({ first, last }));
@@ -220,9 +240,7 @@ let HelixHeadlessVirtualList = class HelixHeadlessVirtualList extends HelixEleme
220
240
  ?.content.querySelector('[data-field]')
221
241
  ?.getAttribute('data-field') ||
222
242
  '';
223
- return this.data.map((item) => field === '' || item === null || typeof item !== 'object'
224
- ? textOf(item)
225
- : textOf(valueAt(item, field)));
243
+ return textsOf(this.data, field);
226
244
  }
227
245
  indexOf(node) {
228
246
  if (!(node instanceof HTMLElement) || node.parentElement !== this) {
@@ -235,11 +253,7 @@ let HelixHeadlessVirtualList = class HelixHeadlessVirtualList extends HelixEleme
235
253
  return this.querySelector(`:scope > [data-index="${index}"]`);
236
254
  }
237
255
  keyAt(at) {
238
- const item = this.data[at];
239
- if (this.keyField !== '' && item !== null && typeof item === 'object') {
240
- return textOf(valueAt(item, this.keyField));
241
- }
242
- return typeof item === 'string' || typeof item === 'number' ? String(item) : String(at);
256
+ return keyOf(this.data[at], at, this.keyField);
243
257
  }
244
258
  keys() {
245
259
  return this.data.map((_, at) => this.keyAt(at));
@@ -293,7 +307,7 @@ let HelixHeadlessVirtualList = class HelixHeadlessVirtualList extends HelixEleme
293
307
  async focusIndex(index) {
294
308
  this.active = index;
295
309
  this.focusing = index;
296
- this.virtualize.reveal(index);
310
+ this.virtualize.reveal(Math.floor(index / this.across));
297
311
  this.virtualize.measure();
298
312
  this.requestUpdate();
299
313
  try {
@@ -315,7 +329,7 @@ let HelixHeadlessVirtualList = class HelixHeadlessVirtualList extends HelixEleme
315
329
  }
316
330
  keptIndex() {
317
331
  const index = this.focusing ?? this.focusedIndex();
318
- const { first, last } = this.virtualize.window;
332
+ const { first, last } = this.itemsOn(this.virtualize.window);
319
333
  return index !== undefined && index < this.data.length && (index < first || index >= last)
320
334
  ? index
321
335
  : undefined;
@@ -363,9 +377,10 @@ let HelixHeadlessVirtualList = class HelixHeadlessVirtualList extends HelixEleme
363
377
  return;
364
378
  }
365
379
  const count = this.data.length;
366
- const { first, last } = this.virtualize.window;
380
+ const { first, last } = this.itemsOn(this.virtualize.window);
367
381
  const children = [...this.children].filter((child) => child !== template && child instanceof HTMLElement && !child.hasAttribute('slot'));
368
382
  const plan = drawPlan({
383
+ across: this.across,
369
384
  count,
370
385
  drawn: children.map((child) => Number(child.dataset.index)),
371
386
  first,
@@ -406,7 +421,7 @@ let HelixHeadlessVirtualList = class HelixHeadlessVirtualList extends HelixEleme
406
421
  count,
407
422
  first,
408
423
  last,
409
- onScreen: this.virtualize.visible().first,
424
+ onScreen: this.range.first,
410
425
  });
411
426
  const chosen = this.chosen;
412
427
  for (const [at, group] of drawn) {
@@ -425,7 +440,9 @@ let HelixHeadlessVirtualList = class HelixHeadlessVirtualList extends HelixEleme
425
440
  this.released = this.active;
426
441
  }
427
442
  render() {
428
- const { after, before } = this.virtualize.spacers(this.hasUpdated ? this.keptIndex() : undefined);
443
+ const kept = this.hasUpdated ? this.keptIndex() : undefined;
444
+ const { after, before } = this.virtualize.spacers(kept === undefined ? undefined : Math.floor(kept / this.across));
445
+ const across = this.across;
429
446
  return html `<div
430
447
  data-scroller
431
448
  part="viewport"
@@ -439,7 +456,11 @@ let HelixHeadlessVirtualList = class HelixHeadlessVirtualList extends HelixEleme
439
456
  }}
440
457
  >
441
458
  <div part="before" style="block-size: ${before}px"></div>
442
- <slot></slot>
459
+ <slot
460
+ style=${across === 1
461
+ ? nothing
462
+ : `display: grid; grid-template-columns: repeat(${across}, minmax(0, 1fr))`}
463
+ ></slot>
443
464
  <div part="after" style="block-size: ${after}px"></div>
444
465
  ${this.loading
445
466
  ? html `<div part="loading" role=${this.selectionMode ? 'option' : 'listitem'}>
@@ -449,6 +470,9 @@ let HelixHeadlessVirtualList = class HelixHeadlessVirtualList extends HelixEleme
449
470
  </div>`;
450
471
  }
451
472
  };
473
+ __decorate([
474
+ property({ type: Number })
475
+ ], HelixHeadlessVirtualList.prototype, "columns", void 0);
452
476
  __decorate([
453
477
  property({ type: Number })
454
478
  ], HelixHeadlessVirtualList.prototype, "estimate", void 0);