@fusion.dev/helix-headless 0.148.0 → 0.149.1

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 (240) hide show
  1. package/custom-elements.json +6966 -1798
  2. package/dist/announcement/root/announcement-root.d.ts +5 -0
  3. package/dist/announcement/root/announcement-root.js +5 -2
  4. package/dist/area-chart/root/area-chart-root.d.ts +11 -0
  5. package/dist/area-chart/root/area-chart-root.js +20 -7
  6. package/dist/avatar/group/avatar-group.d.ts +10 -2
  7. package/dist/avatar/group/avatar-group.js +10 -5
  8. package/dist/badge/count.d.ts +6 -1
  9. package/dist/badge/count.js +3 -3
  10. package/dist/badge/root/badge-root.d.ts +6 -2
  11. package/dist/badge/root/badge-root.js +3 -3
  12. package/dist/bar-chart/root/bar-chart-root.d.ts +13 -1
  13. package/dist/bar-chart/root/bar-chart-root.js +17 -4
  14. package/dist/breadcrumbs/root/breadcrumbs-root.d.ts +8 -1
  15. package/dist/breadcrumbs/root/breadcrumbs-root.js +5 -2
  16. package/dist/button/root/button-root.d.ts +10 -1
  17. package/dist/button/root/button-root.js +3 -2
  18. package/dist/button-group/root/button-group-root.d.ts +3 -0
  19. package/dist/button-group/root/button-group-root.js +2 -2
  20. package/dist/callout/root/callout-root.d.ts +16 -2
  21. package/dist/callout/root/callout-root.js +16 -4
  22. package/dist/canvas/describe.d.ts +10 -0
  23. package/dist/canvas/describe.js +9 -0
  24. package/dist/canvas/neighbor.d.ts +17 -0
  25. package/dist/canvas/neighbor.js +1 -0
  26. package/dist/canvas/node/canvas-node.js +3 -2
  27. package/dist/canvas/root/canvas-root.d.ts +65 -8
  28. package/dist/canvas/root/canvas-root.js +115 -49
  29. package/dist/carousel/root/carousel-root.d.ts +5 -0
  30. package/dist/carousel/root/carousel-root.js +16 -5
  31. package/dist/chat/composer/chat-composer.d.ts +5 -0
  32. package/dist/chat/composer/chat-composer.js +4 -1
  33. package/dist/chat/message/chat-message.d.ts +9 -5
  34. package/dist/chat/message/chat-message.js +8 -4
  35. package/dist/chat/naming.js +2 -2
  36. package/dist/chat/root/chat-root.d.ts +27 -1
  37. package/dist/chat/root/chat-root.js +37 -9
  38. package/dist/checkbox/root/checkbox-root.d.ts +11 -0
  39. package/dist/checkbox/root/checkbox-root.js +8 -2
  40. package/dist/checkbox-group/root/checkbox-group-root.d.ts +11 -0
  41. package/dist/checkbox-group/root/checkbox-group-root.js +11 -3
  42. package/dist/code-block/root/code-block-root.d.ts +12 -2
  43. package/dist/code-block/root/code-block-root.js +12 -2
  44. package/dist/color-input/root/color-input-root.d.ts +13 -0
  45. package/dist/color-input/root/color-input-root.js +18 -5
  46. package/dist/color-picker/root/color-picker-root.d.ts +19 -3
  47. package/dist/color-picker/root/color-picker-root.js +47 -13
  48. package/dist/combobox/root/combobox-root.d.ts +36 -7
  49. package/dist/combobox/root/combobox-root.js +37 -12
  50. package/dist/command/root/command-root.d.ts +15 -6
  51. package/dist/command/root/command-root.js +9 -4
  52. package/dist/copy-button/root/copy-button-root.d.ts +5 -0
  53. package/dist/copy-button/root/copy-button-root.js +7 -2
  54. package/dist/data-table/root/data-table-root.d.ts +171 -29
  55. package/dist/data-table/root/data-table-root.js +268 -118
  56. package/dist/date-input/root/date-input-root.d.ts +32 -9
  57. package/dist/date-input/root/date-input-root.js +66 -44
  58. package/dist/date-picker/root/date-picker-root.d.ts +38 -15
  59. package/dist/date-picker/root/date-picker-root.js +52 -33
  60. package/dist/dialog/root/dialog-root.d.ts +12 -1
  61. package/dist/dialog/root/dialog-root.js +11 -4
  62. package/dist/donut-chart/root/donut-chart-root.d.ts +5 -0
  63. package/dist/donut-chart/root/donut-chart-root.js +8 -5
  64. package/dist/drawer/root/drawer-root.d.ts +12 -1
  65. package/dist/drawer/root/drawer-root.js +9 -2
  66. package/dist/drilldown/root/drilldown-root.d.ts +5 -0
  67. package/dist/drilldown/root/drilldown-root.js +4 -1
  68. package/dist/element-events.generated.js +25 -3
  69. package/dist/file-input/root/file-input-root.d.ts +18 -3
  70. package/dist/file-input/root/file-input-root.js +34 -17
  71. package/dist/filter-input/chip/filter-chip.d.ts +13 -0
  72. package/dist/filter-input/chip/filter-chip.js +6 -1
  73. package/dist/filter-input/menu/filter-menu.d.ts +5 -0
  74. package/dist/filter-input/menu/filter-menu.js +3 -1
  75. package/dist/filter-input/root/filter-input-root.d.ts +20 -3
  76. package/dist/filter-input/root/filter-input-root.js +8 -4
  77. package/dist/format-date/root/format-date-root.d.ts +20 -2
  78. package/dist/format-date/root/format-date-root.js +5 -2
  79. package/dist/graph/root/graph-model.d.ts +11 -0
  80. package/dist/graph/root/graph-model.js +4 -0
  81. package/dist/graph/root/graph-root.d.ts +78 -9
  82. package/dist/graph/root/graph-root.js +124 -27
  83. package/dist/heatmap/root/heatmap-root.d.ts +25 -4
  84. package/dist/heatmap/root/heatmap-root.js +27 -7
  85. package/dist/icon-button/root/icon-button-root.d.ts +5 -0
  86. package/dist/icon-button/root/icon-button-root.js +1 -0
  87. package/dist/input/root/input-root.d.ts +5 -0
  88. package/dist/input/root/input-root.js +4 -1
  89. package/dist/lightbox/root/lightbox-root.d.ts +14 -4
  90. package/dist/lightbox/root/lightbox-root.js +25 -7
  91. package/dist/line-chart/root/line-chart-root.d.ts +5 -0
  92. package/dist/line-chart/root/line-chart-root.js +4 -2
  93. package/dist/list/item/list-item.d.ts +32 -0
  94. package/dist/list/item/list-item.js +34 -7
  95. package/dist/list/root/list-root.d.ts +87 -0
  96. package/dist/list/root/list-root.js +112 -2
  97. package/dist/listbox/reorder/index.d.ts +1 -0
  98. package/dist/listbox/reorder/index.js +4 -0
  99. package/dist/listbox/reorder/listbox-reorder.d.ts +83 -0
  100. package/dist/listbox/reorder/listbox-reorder.js +151 -0
  101. package/dist/listbox/root/listbox-root.d.ts +68 -11
  102. package/dist/listbox/root/listbox-root.js +41 -9
  103. package/dist/loader/root/loader-root.d.ts +5 -0
  104. package/dist/loader/root/loader-root.js +3 -1
  105. package/dist/map/area/map-area.d.ts +5 -0
  106. package/dist/map/area/map-area.js +3 -1
  107. package/dist/map/buildings/map-buildings.d.ts +5 -0
  108. package/dist/map/buildings/map-buildings.js +3 -1
  109. package/dist/map/contours/map-contours.d.ts +5 -0
  110. package/dist/map/contours/map-contours.js +3 -1
  111. package/dist/map/landcover/map-landcover.d.ts +5 -0
  112. package/dist/map/landcover/map-landcover.js +3 -1
  113. package/dist/map/marker/map-marker.d.ts +16 -1
  114. package/dist/map/marker/map-marker.js +13 -5
  115. package/dist/map/points/map-points.d.ts +5 -0
  116. package/dist/map/points/map-points.js +6 -4
  117. package/dist/map/position/map-position.d.ts +5 -0
  118. package/dist/map/position/map-position.js +3 -1
  119. package/dist/map/raster/map-raster.d.ts +5 -0
  120. package/dist/map/raster/map-raster.js +3 -1
  121. package/dist/map/root/map-root.d.ts +33 -14
  122. package/dist/map/root/map-root.js +59 -22
  123. package/dist/map/route/map-route.d.ts +5 -0
  124. package/dist/map/route/map-route.js +3 -1
  125. package/dist/map/terrain/map-terrain.d.ts +5 -0
  126. package/dist/map/terrain/map-terrain.js +3 -1
  127. package/dist/menu/root/menu-root.d.ts +5 -0
  128. package/dist/menu/root/menu-root.js +3 -1
  129. package/dist/meter/root/meter-root.d.ts +16 -3
  130. package/dist/meter/root/meter-root.js +12 -5
  131. package/dist/navigation/root/navigation-root.d.ts +5 -0
  132. package/dist/navigation/root/navigation-root.js +3 -1
  133. package/dist/notifications/notification/notification.d.ts +5 -0
  134. package/dist/notifications/notification/notification.js +3 -1
  135. package/dist/notifications/root/notifications-root.d.ts +8 -0
  136. package/dist/notifications/root/notifications-root.js +10 -2
  137. package/dist/number-input/root/number-input-root.d.ts +21 -8
  138. package/dist/number-input/root/number-input-root.js +26 -11
  139. package/dist/object-inspector/root/object-inspector-root.d.ts +51 -12
  140. package/dist/object-inspector/root/object-inspector-root.js +21 -20
  141. package/dist/outline/root/outline-root.d.ts +5 -0
  142. package/dist/outline/root/outline-root.js +3 -1
  143. package/dist/pagination/root/pagination-root.d.ts +7 -1
  144. package/dist/pagination/root/pagination-root.js +16 -7
  145. package/dist/pagination/size/pagination-size.d.ts +7 -3
  146. package/dist/pagination/size/pagination-size.js +4 -2
  147. package/dist/pagination/summary/pagination-summary.d.ts +8 -6
  148. package/dist/pagination/summary/pagination-summary.js +4 -9
  149. package/dist/pin-input/code.d.ts +6 -6
  150. package/dist/pin-input/code.js +1 -5
  151. package/dist/pin-input/root/pin-input-root.d.ts +9 -3
  152. package/dist/pin-input/root/pin-input-root.js +6 -2
  153. package/dist/popover/root/popover-root.d.ts +12 -2
  154. package/dist/popover/root/popover-root.js +10 -4
  155. package/dist/progress/root/progress-root.d.ts +7 -2
  156. package/dist/progress/root/progress-root.js +5 -2
  157. package/dist/qr-code/name.d.ts +3 -2
  158. package/dist/qr-code/name.js +2 -2
  159. package/dist/qr-code/root/qr-code-root.d.ts +12 -2
  160. package/dist/qr-code/root/qr-code-root.js +9 -2
  161. package/dist/radio/group/radio-group.d.ts +11 -0
  162. package/dist/radio/group/radio-group.js +8 -2
  163. package/dist/rating/root/rating-root.d.ts +12 -1
  164. package/dist/rating/root/rating-root.js +10 -3
  165. package/dist/scatter-chart/root/scatter-chart-root.d.ts +20 -2
  166. package/dist/scatter-chart/root/scatter-chart-root.js +20 -5
  167. package/dist/select/root/select-root.d.ts +11 -0
  168. package/dist/select/root/select-root.js +13 -3
  169. package/dist/skip-link/root/skip-link-root.d.ts +5 -0
  170. package/dist/skip-link/root/skip-link-root.js +3 -1
  171. package/dist/slider/root/slider-root.d.ts +7 -2
  172. package/dist/slider/root/slider-root.js +11 -5
  173. package/dist/sparkline/readings.d.ts +15 -5
  174. package/dist/sparkline/readings.js +3 -3
  175. package/dist/sparkline/root/sparkline-root.d.ts +9 -4
  176. package/dist/sparkline/root/sparkline-root.js +9 -3
  177. package/dist/speed-dial/root/speed-dial-root.d.ts +5 -0
  178. package/dist/speed-dial/root/speed-dial-root.js +4 -1
  179. package/dist/splitter/root/splitter-root.d.ts +6 -1
  180. package/dist/splitter/root/splitter-root.js +9 -4
  181. package/dist/steps/root/steps-root.d.ts +9 -2
  182. package/dist/steps/root/steps-root.js +6 -3
  183. package/dist/steps/step/step.d.ts +12 -0
  184. package/dist/steps/step/step.js +11 -2
  185. package/dist/switch/root/switch-root.d.ts +11 -0
  186. package/dist/switch/root/switch-root.js +8 -2
  187. package/dist/table/column/table-column.d.ts +11 -4
  188. package/dist/table/column/table-column.js +15 -10
  189. package/dist/table/grid-controller.d.ts +8 -3
  190. package/dist/table/grid-controller.js +17 -11
  191. package/dist/table/root/table-root.d.ts +107 -5
  192. package/dist/table/root/table-root.js +122 -20
  193. package/dist/table/row/table-row.d.ts +42 -0
  194. package/dist/table/row/table-row.js +40 -1
  195. package/dist/tabs/root/tabs-root.d.ts +5 -0
  196. package/dist/tabs/root/tabs-root.js +3 -1
  197. package/dist/tag/group/tag-group.d.ts +5 -0
  198. package/dist/tag/group/tag-group.js +3 -1
  199. package/dist/tag/root/tag-root.d.ts +14 -1
  200. package/dist/tag/root/tag-root.js +11 -8
  201. package/dist/textarea/root/textarea-root.d.ts +5 -0
  202. package/dist/textarea/root/textarea-root.js +3 -1
  203. package/dist/time-input/root/time-input-root.d.ts +14 -7
  204. package/dist/time-input/root/time-input-root.js +43 -32
  205. package/dist/time-picker/root/time-picker-root.d.ts +15 -7
  206. package/dist/time-picker/root/time-picker-root.js +25 -12
  207. package/dist/toast/item/toast-item.d.ts +7 -0
  208. package/dist/toast/item/toast-item.js +1 -0
  209. package/dist/toast/root/toast-root.d.ts +9 -1
  210. package/dist/toast/root/toast-root.js +5 -4
  211. package/dist/toolbar/root/toolbar-root.d.ts +5 -0
  212. package/dist/toolbar/root/toolbar-root.js +5 -2
  213. package/dist/tooltip/root/tooltip-root.d.ts +27 -17
  214. package/dist/tour/root/tour-root.d.ts +8 -2
  215. package/dist/tour/root/tour-root.js +4 -2
  216. package/dist/tour/stop/tour-stop.d.ts +5 -0
  217. package/dist/tour/stop/tour-stop.js +6 -1
  218. package/dist/tree/grip.d.ts +5 -0
  219. package/dist/tree/grip.js +1 -0
  220. package/dist/tree/item/tree-item.d.ts +24 -0
  221. package/dist/tree/item/tree-item.js +27 -5
  222. package/dist/tree/root/tree-root.d.ts +66 -1
  223. package/dist/tree/root/tree-root.js +77 -5
  224. package/dist/trend/root/trend-root.d.ts +20 -4
  225. package/dist/trend/root/trend-root.js +20 -5
  226. package/dist/video/root/video-root.d.ts +12 -3
  227. package/dist/video/root/video-root.js +41 -14
  228. package/dist/video-playlist/menu/video-playlist-menu.d.ts +5 -0
  229. package/dist/video-playlist/menu/video-playlist-menu.js +3 -1
  230. package/dist/video-playlist/root/video-playlist-root.d.ts +5 -0
  231. package/dist/video-playlist/root/video-playlist-root.js +3 -1
  232. package/dist/virtual-list/root/virtual-list-root.d.ts +19 -3
  233. package/dist/virtual-list/root/virtual-list-root.js +5 -2
  234. package/lint.json +1 -1
  235. package/package.json +9 -8
  236. package/types/jsx.d.ts +4014 -1862
  237. package/types/vue.d.ts +1266 -624
  238. package/types/words.d.ts +3280 -0
  239. package/dist/toast/hotkey.d.ts +0 -22
  240. package/dist/toast/hotkey.js +0 -23
@@ -5,31 +5,33 @@ declare const HelixHeadlessTooltip_base: (new (...args: any[]) => import("@fusio
5
5
  * @summary A short text that appears next to an element on hover and focus.
6
6
  *
7
7
  * @description
8
- * The trigger is slotted and stays your own element. The bubble renders in the
8
+ * The trigger stays your own element. The bubble renders in the
9
9
  * top layer through the popover API, so an ancestor with `overflow: hidden`
10
10
  * does not clip it and no `z-index` is needed. `FloatingController` positions
11
11
  * it and flips it to another side when the preferred side does not fit.
12
12
  *
13
- * **The tooltip describes its trigger itself, in both forms.** Wrap the
14
- * trigger, or place the tooltip beside it and name the trigger with `for`:
13
+ * **Place the tooltip beside its trigger, name the trigger with `for`, and
14
+ * name the tooltip in the trigger's `aria-describedby`.** The description is
15
+ * then in your own markup, so it is in the server's HTML and in the
16
+ * accessibility tree at rest, in every browser, before anyone points at the
17
+ * trigger or focuses it:
15
18
  *
16
19
  * ```html
17
- * <helix-headless-button id="save">Save</helix-headless-button>
18
- * <helix-headless-tooltip for="save" content="Save your work"></helix-headless-tooltip>
20
+ * <helix-headless-button aria-describedby="save-tip" id="save">Save</helix-headless-button>
21
+ * <helix-headless-tooltip content="Save your work" for="save" id="save-tip"></helix-headless-tooltip>
19
22
  * ```
20
23
  *
21
- * The link is an element reference on the control that takes focus, and it is
22
- * never written into your markup before a reader has acted. A trigger that is a
23
- * Helix component is described at once, inside its own shadow root. A plain
24
- * element in your markup is described when a reader first points at it or
25
- * focuses it, which is after any hydration, and only where you have written no
26
- * `aria-describedby` or `aria-labelledby` of your own. Write
27
- * `aria-describedby` pointing at the tooltip yourself to have the link in the
28
- * server's markup. Where the browser has no element references, write it
29
- * yourself; the tooltip warns once on first open if nothing links the two.
30
- * In the `for` form the tooltip itself is out of the accessibility tree while
31
- * its bubble is down, so a reader walking the page meets its words once, as
32
- * the trigger's description.
24
+ * Without the attribute, the tooltip links itself through an element reference
25
+ * on the control that takes focus, and it never writes into your markup before
26
+ * you act, so hydration stays intact. A trigger that is a Helix component is
27
+ * described at once, inside its own shadow root. A plain element in your
28
+ * markup is described when you first point at it or focus it, so a screen
29
+ * reader in reading mode meets it with no description until then. Where the
30
+ * browser has no element references, nothing links the two, and the tooltip
31
+ * warns once on first open. The tooltip can also wrap its trigger, which
32
+ * describes a Helix component and leaves a plain element undescribed. In the
33
+ * `for` form the tooltip itself is out of the accessibility tree while its
34
+ * bubble is down, so you meet its words once, as the trigger's description.
33
35
  *
34
36
  * The tooltip shows on hover and on focus. It hides on pointer leave, on blur,
35
37
  * on Escape, and when the trigger is activated. The pointer can move from the
@@ -114,6 +116,14 @@ export declare class HelixHeadlessTooltip extends HelixHeadlessTooltip_base {
114
116
  * Names an element in the same tree, so a tooltip inside another component's
115
117
  * shadow root points at one in that root rather than one in the document.
116
118
  *
119
+ * Give the tooltip an `id` and name it in the trigger's `aria-describedby`,
120
+ * so the trigger is described in the server's markup and at rest:
121
+ *
122
+ * ```html
123
+ * <button aria-describedby="save-tip" id="save">Save</button>
124
+ * <helix-headless-tooltip content="Save your work" for="save" id="save-tip"></helix-headless-tooltip>
125
+ * ```
126
+ *
117
127
  * **In React this arrives as a property and not as an attribute**, which is
118
128
  * worth knowing before someone reads the DOM and thinks it did not take.
119
129
  * Measured against React 19.2.8: `for` exists on the prototype, so React sets
@@ -76,6 +76,12 @@ declare const HelixHeadlessTour_base: (new (...args: any[]) => import("@fusion.d
76
76
  * @cssstate waiting - While the tour waits at a `wait` stop for its target to be on the page.
77
77
  */
78
78
  export declare class HelixHeadlessTour extends HelixHeadlessTour_base {
79
+ /**
80
+ * The key this family's words are registered under, its styled tag:
81
+ * `registerWords('de', { 'helix-tour': { progressLabel: '{index} von {count}' } })`.
82
+ * A stop's own words are under `helix-tour-stop`.
83
+ */
84
+ static words: string;
79
85
  /**
80
86
  * Label for the control that goes back, passed to every stop.
81
87
  */
@@ -117,8 +123,8 @@ export declare class HelixHeadlessTour extends HelixHeadlessTour_base {
117
123
  */
118
124
  progress: boolean;
119
125
  /**
120
- * Each stop's place in the run, with `{index}` and `{count}` filled in.
121
- * Translate it with the rest of your text.
126
+ * Each stop's place in the run, with `{index}` and `{count}` filled in and
127
+ * written in the locale. Translate it with the rest of your text.
122
128
  */
123
129
  progressLabel: string;
124
130
  /**
@@ -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 { controlsIn, customElement, deepActiveElement, deepContains, fillTemplate, HelixActivateEvent, HelixBeforeActivateEvent, HelixCompleteEvent, HelixElement, HelixTourStatusEvent, hostAria, inlineStep, keyClaimed, MixinControllerOpen, requestChange, whenHydrated, } from '@fusion.dev/helix-core';
7
+ import { controlsIn, customElement, deepActiveElement, deepContains, formatWords, HelixActivateEvent, HelixBeforeActivateEvent, HelixCompleteEvent, HelixElement, HelixTourStatusEvent, hostAria, inlineStep, keyClaimed, MixinControllerOpen, requestChange, whenHydrated, words, } from '@fusion.dev/helix-core';
8
8
  import { html } from 'lit';
9
9
  import { property, queryAssignedElements, state } from 'lit/decorators.js';
10
10
  import { stopBefore } from '../back.js';
@@ -62,6 +62,7 @@ let HelixHeadlessTour = class HelixHeadlessTour extends MixinControllerOpen(Heli
62
62
  this.followed = false;
63
63
  this.veiled = false;
64
64
  }
65
+ static { this.words = 'helix-tour'; }
65
66
  get index() {
66
67
  return this.indexState ?? this.defaultIndex;
67
68
  }
@@ -218,7 +219,7 @@ let HelixHeadlessTour = class HelixHeadlessTour extends MixinControllerOpen(Heli
218
219
  stop.current = this.open && index === at;
219
220
  stop.first = index === 0;
220
221
  stop.last = index === stops.length - 1;
221
- stop.position = fillTemplate(this.progressLabel, {
222
+ stop.position = formatWords(this, 'progressLabel', {
222
223
  count: stops.length,
223
224
  index: index + 1,
224
225
  });
@@ -346,6 +347,7 @@ __decorate([
346
347
  property({ type: Boolean })
347
348
  ], HelixHeadlessTour.prototype, "progress", void 0);
348
349
  __decorate([
350
+ words,
349
351
  property({ attribute: 'progress-label' })
350
352
  ], HelixHeadlessTour.prototype, "progressLabel", void 0);
351
353
  __decorate([
@@ -86,6 +86,11 @@ import '../../button/index.js';
86
86
  * @cssstate placed-top - The panel sits above its target.
87
87
  */
88
88
  export declare class HelixHeadlessTourStop extends HelixElement {
89
+ /**
90
+ * The key this part's words are registered under, its styled tag:
91
+ * `registerWords('de', { 'helix-tour-stop': { nextLabel: 'Weiter' } })`.
92
+ */
93
+ static words: string;
89
94
  /**
90
95
  * Label for the control that goes back.
91
96
  */
@@ -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 { arrowReach, customElement, elementById, HelixElement, HelixTourAskEvent, PopoverController, reflectElements, sideOf, } from '@fusion.dev/helix-core';
7
+ import { arrowReach, customElement, elementById, HelixElement, HelixTourAskEvent, PopoverController, reflectElements, sideOf, words, } from '@fusion.dev/helix-core';
8
8
  import { nothing } from 'lit';
9
9
  import { property, state } from 'lit/decorators.js';
10
10
  import { html } from 'lit/static-html.js';
@@ -46,6 +46,7 @@ let HelixHeadlessTourStop = class HelixHeadlessTourStop extends HelixElement {
46
46
  surface: () => this.partNamed('bubble'),
47
47
  });
48
48
  }
49
+ static { this.words = 'helix-tour-stop'; }
49
50
  get target() {
50
51
  return this.for === '' ? null : elementById(this, this.for);
51
52
  }
@@ -140,12 +141,14 @@ let HelixHeadlessTourStop = class HelixHeadlessTourStop extends HelixElement {
140
141
  }
141
142
  };
142
143
  __decorate([
144
+ words,
143
145
  property({ attribute: 'back-label' })
144
146
  ], HelixHeadlessTourStop.prototype, "backLabel", void 0);
145
147
  __decorate([
146
148
  property({ reflect: true, type: Boolean })
147
149
  ], HelixHeadlessTourStop.prototype, "current", void 0);
148
150
  __decorate([
151
+ words,
149
152
  property({ attribute: 'done-label' })
150
153
  ], HelixHeadlessTourStop.prototype, "doneLabel", void 0);
151
154
  __decorate([
@@ -161,6 +164,7 @@ __decorate([
161
164
  property({ reflect: true, type: Boolean })
162
165
  ], HelixHeadlessTourStop.prototype, "last", void 0);
163
166
  __decorate([
167
+ words,
164
168
  property({ attribute: 'next-label' })
165
169
  ], HelixHeadlessTourStop.prototype, "nextLabel", void 0);
166
170
  __decorate([
@@ -173,6 +177,7 @@ __decorate([
173
177
  property({ attribute: false })
174
178
  ], HelixHeadlessTourStop.prototype, "progress", void 0);
175
179
  __decorate([
180
+ words,
176
181
  property({ attribute: 'skip-label' })
177
182
  ], HelixHeadlessTourStop.prototype, "skipLabel", void 0);
178
183
  __decorate([
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Whether an event began on an item's grip, in a `reorderable` tree. The grip
3
+ * is the tree's: a press there neither chooses the row nor follows its link.
4
+ */
5
+ export declare const fromGrip: (event: Event) => boolean;
@@ -0,0 +1 @@
1
+ export const fromGrip = (event) => Boolean(event.composedPath()[0]?.closest?.('[part="grip"]'));
@@ -1,5 +1,7 @@
1
1
  import { HelixElement } from '@fusion.dev/helix-core';
2
2
  import { type PropertyValues, type TemplateResult } from 'lit';
3
+ /** Where an item stands in a move: the item being moved, or the one the drop indicator is beside. */
4
+ export type TreeItemMove = 'dragging' | 'drop-after' | 'drop-before';
3
5
  declare const HelixHeadlessTreeItem_base: (new (...args: any[]) => import("@fusion.dev/helix-core").MixinControllerOpenInterface) & typeof HelixElement;
4
6
  /**
5
7
  * @summary One node in a tree.
@@ -31,6 +33,11 @@ declare const HelixHeadlessTreeItem_base: (new (...args: any[]) => import("@fusi
31
33
  * sends `helix-load`, the row says it is busy, and the children you add appear
32
34
  * in it. Remove `lazy` once they are in.
33
35
  *
36
+ * **In a `reorderable` tree, the row has a grip** at its far end, which a
37
+ * pointer drags to move the item among its siblings. The tree says which item
38
+ * is moving and where the drop indicator is, with the `dragging`,
39
+ * `drop-before`, and `drop-after` states.
40
+ *
34
41
  * @since 0.1.0
35
42
  * @status stable
36
43
  * @aliases TreeNode, Branch, Leaf
@@ -51,6 +58,8 @@ declare const HelixHeadlessTreeItem_base: (new (...args: any[]) => import("@fusi
51
58
  * @csspart checkbox - The check mark's box, in a tree with `selection-mode="multiple"`.
52
59
  * @csspart checkbox-checked - The check mark's box while the item is checked.
53
60
  * @csspart checkbox-mixed - The check mark's box while some of a branch's items are checked.
61
+ * @csspart grip - The handle a pointer drags to move the item, in a `reorderable` tree. Hidden from screen readers, which move the item with Alt and an arrow.
62
+ * @csspart grip-mark - The icon on the grip.
54
63
  * @csspart group - The container for nested items.
55
64
  * @csspart item - The node, and the focus target unless `href` moves it to the row.
56
65
  * @csspart label - The label text.
@@ -60,6 +69,9 @@ declare const HelixHeadlessTreeItem_base: (new (...args: any[]) => import("@fusi
60
69
  * @cssproperty --tree-level - How deep this row sits, counting from one as `aria-level` does, for the indent.
61
70
  *
62
71
  * @cssstate checked - While it is checked, in a tree with `selection-mode="multiple"`.
72
+ * @cssstate dragging - The item is being moved, in a `reorderable` tree.
73
+ * @cssstate drop-after - The item being moved goes after this one when it is dropped.
74
+ * @cssstate drop-before - The item being moved goes before this one when it is dropped.
63
75
  * @cssstate loading - While a `lazy` item is open and its children have not arrived.
64
76
  * @cssstate mixed - While some of a branch's items are checked, in a tree with `selection-mode="multiple"`.
65
77
  * @cssstate open - While its children are shown.
@@ -81,6 +93,11 @@ export declare class HelixHeadlessTreeItem extends HelixHeadlessTreeItem_base {
81
93
  * reach it, so a reader knows it is there.
82
94
  */
83
95
  disabled: boolean;
96
+ /**
97
+ * @internal Whether the row draws a grip, written by a `reorderable` tree.
98
+ * No attribute: it is coordination between elements, as `focusable` is.
99
+ */
100
+ grip: boolean;
84
101
  /**
85
102
  * @internal Set by the tree: whether a branch heads the list under it, as
86
103
  * under `nesting="heading"`, or is not chosen at all, as under
@@ -124,6 +141,11 @@ export declare class HelixHeadlessTreeItem extends HelixHeadlessTreeItem_base {
124
141
  * hydrates.
125
142
  */
126
143
  level?: number;
144
+ /**
145
+ * @internal Where the item stands in a move, written by a `reorderable`
146
+ * tree: the item being moved, or the one the drop indicator is beside.
147
+ */
148
+ move?: TreeItemMove | undefined;
127
149
  /**
128
150
  * The link's `rel` value, which describes how the linked page relates to this
129
151
  * one.
@@ -190,6 +212,8 @@ export declare class HelixHeadlessTreeItem extends HelixHeadlessTreeItem_base {
190
212
  * row rather than the wrapper around it.
191
213
  */
192
214
  focusItem(): void;
215
+ /** @internal The element that takes focus for this node, read by the tree. */
216
+ get focusTarget(): HTMLElement | null | undefined;
193
217
  /** Selects this node and sends `helix-select`. A disabled node sends nothing. */
194
218
  select(): void;
195
219
  /**
@@ -5,16 +5,18 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
7
  import { customElement, HelixElement, HelixLoadEvent, HelixSelectEvent, MixinControllerOpen, } from '@fusion.dev/helix-core';
8
- import { caretDown, check, minus } from '@fusion.dev/helix-icons';
8
+ import { caretDown, check, dotsSixVertical, minus } from '@fusion.dev/helix-icons';
9
9
  import { html, nothing } from 'lit';
10
10
  import { property, state } from 'lit/decorators.js';
11
11
  import { unsafeSVG } from 'lit/directives/unsafe-svg.js';
12
+ import { fromGrip } from '../grip.js';
12
13
  let HelixHeadlessTreeItem = class HelixHeadlessTreeItem extends MixinControllerOpen(HelixElement) {
13
14
  constructor() {
14
15
  super(...arguments);
15
16
  this.checkable = false;
16
17
  this.checked = false;
17
18
  this.disabled = false;
19
+ this.grip = false;
18
20
  this.heads = false;
19
21
  this.href = '';
20
22
  this.lazy = false;
@@ -35,6 +37,10 @@ let HelixHeadlessTreeItem = class HelixHeadlessTreeItem extends MixinControllerO
35
37
  this.toggleOpen();
36
38
  };
37
39
  this.handleRowClick = (event) => {
40
+ if (fromGrip(event)) {
41
+ event.preventDefault();
42
+ return;
43
+ }
38
44
  const onLink = event.composedPath().some((node) => node instanceof HTMLAnchorElement);
39
45
  if (this.disabled) {
40
46
  event.preventDefault();
@@ -70,9 +76,10 @@ let HelixHeadlessTreeItem = class HelixHeadlessTreeItem extends MixinControllerO
70
76
  return this.branch || this.lazy;
71
77
  }
72
78
  focusItem() {
73
- this.renderRoot
74
- .querySelector(this.href === '' ? '[part="item"]' : '[part="row"]')
75
- ?.focus({ preventScroll: true });
79
+ this.focusTarget?.focus({ preventScroll: true });
80
+ }
81
+ get focusTarget() {
82
+ return this.renderRoot?.querySelector(this.href === '' ? '[part="item"]' : '[part="row"]');
76
83
  }
77
84
  select() {
78
85
  if (this.disabled) {
@@ -136,7 +143,13 @@ let HelixHeadlessTreeItem = class HelixHeadlessTreeItem extends MixinControllerO
136
143
  return html `${this.isBranch ? this.renderToggle() : nothing}${this.renderCheckbox()}
137
144
  <slot name="start"></slot>
138
145
  <span part="label"><slot></slot></span>
139
- <slot name="end"></slot>`;
146
+ <slot name="end"></slot>${this.grip && !this.disabled
147
+ ? html `<span part="grip" aria-hidden="true"
148
+ ><svg part="grip-mark" fill="currentColor" viewBox=${dotsSixVertical.viewBox}>
149
+ ${unsafeSVG(dotsSixVertical.content)}
150
+ </svg></span
151
+ >`
152
+ : nothing}`;
140
153
  }
141
154
  willUpdate(changed) {
142
155
  super.willUpdate(changed);
@@ -144,6 +157,9 @@ let HelixHeadlessTreeItem = class HelixHeadlessTreeItem extends MixinControllerO
144
157
  this.toggleState('checked', this.checkable && this.checked === true);
145
158
  this.toggleState('mixed', this.checkable && this.checked === 'mixed');
146
159
  this.toggleState('loading', this.open && this.lazy);
160
+ this.toggleState('dragging', this.move === 'dragging');
161
+ this.toggleState('drop-after', this.move === 'drop-after');
162
+ this.toggleState('drop-before', this.move === 'drop-before');
147
163
  if (this.childrenKnown) {
148
164
  this.branch = this.knownChildren.some((child) => child.slot === 'children');
149
165
  }
@@ -221,6 +237,9 @@ __decorate([
221
237
  __decorate([
222
238
  property({ reflect: true, type: Boolean })
223
239
  ], HelixHeadlessTreeItem.prototype, "disabled", void 0);
240
+ __decorate([
241
+ property({ attribute: false })
242
+ ], HelixHeadlessTreeItem.prototype, "grip", void 0);
224
243
  __decorate([
225
244
  property({ attribute: false })
226
245
  ], HelixHeadlessTreeItem.prototype, "heads", void 0);
@@ -233,6 +252,9 @@ __decorate([
233
252
  __decorate([
234
253
  property({ attribute: false, type: Number })
235
254
  ], HelixHeadlessTreeItem.prototype, "level", void 0);
255
+ __decorate([
256
+ property({ attribute: false })
257
+ ], HelixHeadlessTreeItem.prototype, "move", void 0);
236
258
  __decorate([
237
259
  property()
238
260
  ], HelixHeadlessTreeItem.prototype, "rel", void 0);
@@ -36,6 +36,19 @@ declare const HelixHeadlessTree_base: (new (...args: any[]) => import("@fusion.d
36
36
  * tree of check marks, Control+A (Command+A on an Apple keyboard) checks every
37
37
  * item or clears them all, and Shift with Up or Down Arrow moves and checks.
38
38
  *
39
+ * **`reorderable` lets you move items among their siblings.** Alt with Up or
40
+ * Down moves the focused item a place, and Alt with Home or End to the first
41
+ * or the last place among its siblings, as the APG's rearrangeable listbox
42
+ * does. Each row gets a grip at its far end: drag it to move the item, and the
43
+ * tree scrolls near an edge. A click on a grip picks the item up and a click on
44
+ * one of its siblings drops it there, which needs no drag. The arrows move an
45
+ * item picked up that way, Enter or Space drops it, and Escape puts it back.
46
+ * The tree says each step in its `live` region. A drop sends
47
+ * `helix-before-reorder`, which you can refuse, and then `helix-reorder`, whose
48
+ * `keys` hold the siblings in the new order. **You move the items**: the tree
49
+ * moves no element of yours, and focus follows the moved item once you have.
50
+ * Moving an item into another branch is not part of this.
51
+ *
39
52
  * @since 0.1.0
40
53
  * @status stable
41
54
  * @category navigation
@@ -46,14 +59,29 @@ declare const HelixHeadlessTree_base: (new (...args: any[]) => import("@fusion.d
46
59
  *
47
60
  * @event {HelixActivateEvent} helix-activate - Fired after the current node changes, so the tree already holds the new one.
48
61
  * @event {HelixBeforeActivateEvent} helix-before-activate - Fired before the current node changes, and cancelable. Canceling it is the only way to stop the change.
62
+ * @event {HelixBeforeReorderEvent} helix-before-reorder - Fired when an item is dropped at a new place among its siblings, in a `reorderable` tree, with the siblings' keys in the new order. Cancelable: cancel it to keep the item where it is.
63
+ * @event {HelixReorderEvent} helix-reorder - Fired after `helix-before-reorder` when nobody canceled it. Move your items to the order in `keys`, each an item's `value`, or its words where it has none. Cancelable: cancel it to say the move did not happen.
49
64
  * @event {HelixSelectEvent} helix-select - Fired when an item is chosen. The item sends it, and you can listen for it on the tree. Cancelable: canceling it changes nothing.
50
65
  *
66
+ * @csspart drag-preview - A copy of the row a pointer drags by its grip, which follows the pointer in the top layer until the item is let go, in a `reorderable` tree. Hidden from assistive technology.
51
67
  * @csspart empty - Shown when there are no rows to show.
52
- * @csspart live - A copy of the empty and loading messages, in a live region that announces them when they change. Visually hidden in the styled tier.
68
+ * @csspart live - A copy of the empty and loading messages, and each step of a move in a `reorderable` tree, in a live region that announces them when they change. Visually hidden in the styled tier.
53
69
  * @csspart loading - Shown while the rows load.
54
70
  * @csspart tree - The tree container.
55
71
  */
56
72
  export declare class HelixHeadlessTree extends HelixHeadlessTree_base {
73
+ /**
74
+ * The key this family's words are registered under, its styled tag:
75
+ * `registerWords('de', { 'helix-tree': { label: 'Baum' } })`.
76
+ */
77
+ static words: string;
78
+ /**
79
+ * What screen readers hear when a held item is put back, or a move is
80
+ * refused, in a `reorderable` tree.
81
+ */
82
+ canceledLabel: string;
83
+ /** What screen readers hear when a held item is dropped, in a `reorderable` tree. */
84
+ droppedLabel: string;
57
85
  /**
58
86
  * Accessible name for the tree.
59
87
  *
@@ -61,10 +89,36 @@ export declare class HelixHeadlessTree extends HelixHeadlessTree_base {
61
89
  * wins over this.
62
90
  */
63
91
  label: string;
92
+ /**
93
+ * What screen readers hear each time an item moves, in a `reorderable`
94
+ * tree. `{name}` is the item's words, `{position}` its place among its
95
+ * siblings, counting from 1, and `{count}` the number of siblings.
96
+ */
97
+ movedLabel: string;
64
98
  /** Carries a host `aria-label` and `aria-labelledby` to the tree. */
65
99
  protected readonly aria: AriaForwardController;
66
100
  /** The letters typed so far, for moving to an item by its name. */
67
101
  private readonly typeahead;
102
+ /**
103
+ * Moving items among their siblings, in a `reorderable` tree. The items are
104
+ * the page's, so a drop asks the page to move them.
105
+ */
106
+ private readonly reorder;
107
+ /** The key an item is moved by: its `value`, or its words where it has none. */
108
+ private keyOf;
109
+ /** The item that stands for a key. */
110
+ private itemFor;
111
+ /** The innermost item an event came from. */
112
+ private itemOf;
113
+ /** The key of the innermost item an event came from, unless it is disabled. */
114
+ private keyAt;
115
+ /** An item and the items beside it, under the same parent, in order. */
116
+ private siblingsOf;
117
+ /**
118
+ * The keys of the items a key's item moves among: its siblings, a disabled
119
+ * one included, which stays where it is while the others move past it.
120
+ */
121
+ private siblingKeys;
68
122
  /**
69
123
  * What a deeper level means: `peer` for no change, `subordinate` for a lower
70
124
  * rank, or `heading` for a parent that heads the items under it.
@@ -102,6 +156,17 @@ export declare class HelixHeadlessTree extends HelixHeadlessTree_base {
102
156
  * The resting state is the absence of the attribute, which is `peer`.
103
157
  */
104
158
  nesting?: 'heading' | 'peer' | 'subordinate';
159
+ /**
160
+ * What screen readers hear when a click on a grip picks up an item, in a
161
+ * `reorderable` tree. `{name}` is the item's words.
162
+ */
163
+ pickedUpLabel: string;
164
+ /**
165
+ * Lets you move items among their siblings, by dragging a grip or with Alt
166
+ * and an arrow. The tree moves no item itself: you move your data on
167
+ * `helix-reorder`.
168
+ */
169
+ reorderable: boolean;
105
170
  /**
106
171
  * Whether a reader can check many items, or choose only the items at the
107
172
  * ends. Unset, one item is chosen at a time, branches included.
@@ -4,9 +4,10 @@ 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, closestInstance, commaList, customElement, HelixElement, inlineStep, keyClaimed, MixinCollection, MixinControllerActive, scrollItemIntoView, selectsAll, slottedWords, Typeahead, treeArrow, typesCharacter, whenHydrated, } from '@fusion.dev/helix-core';
7
+ import { AriaForwardController, closestInstance, commaList, customElement, HelixElement, inlineStep, keyClaimed, MixinCollection, MixinControllerActive, ReorderController, scrollItemIntoView, selectsAll, slottedWords, Typeahead, treeArrow, typesCharacter, whenHydrated, words, } from '@fusion.dev/helix-core';
8
8
  import { html, nothing } from 'lit';
9
9
  import { property } from 'lit/decorators.js';
10
+ import { fromGrip } from '../grip.js';
10
11
  import { HelixHeadlessTreeItem } from '../item/tree-item.js';
11
12
  import { checkedState, pressRow } from '../selection.js';
12
13
  const KEYS = new Set([
@@ -22,12 +23,35 @@ const KEYS = new Set([
22
23
  let HelixHeadlessTree = class HelixHeadlessTree extends MixinCollection(MixinControllerActive(HelixElement)) {
23
24
  constructor() {
24
25
  super(...arguments);
26
+ this.canceledLabel = 'Canceled';
27
+ this.droppedLabel = 'Dropped';
25
28
  this.label = 'Tree';
29
+ this.movedLabel = '{name} moved to position {position} of {count}';
26
30
  this.aria = new AriaForwardController(this, {
27
31
  label: true,
28
32
  target: () => this.partNamed('tree'),
29
33
  });
30
34
  this.typeahead = new Typeahead();
35
+ this.reorder = new ReorderController(this, {
36
+ axis: 'block',
37
+ box: (key) => this.itemFor(key)?.getBoundingClientRect(),
38
+ current: (event) => this.keyAt(event),
39
+ grip: (event) => {
40
+ const item = this.itemOf(event);
41
+ const element = fromGrip(event) && item?.focusTarget;
42
+ return item && element ? { element, key: this.keyOf(item) } : undefined;
43
+ },
44
+ item: (event) => this.keyAt(event),
45
+ keys: (key) => this.siblingKeys(key),
46
+ name: (key) => {
47
+ const item = this.itemFor(key);
48
+ return (item && slottedWords(item, [''])) || key;
49
+ },
50
+ preview: (key) => this.itemFor(key)?.shadowRoot?.querySelector('[part="row"]'),
51
+ refocus: (key) => this.focusOn(this.itemFor(key)),
52
+ });
53
+ this.pickedUpLabel = 'Picked up {name}';
54
+ this.reorderable = false;
31
55
  this.handleSelection = (event) => {
32
56
  const origin = event.target;
33
57
  if (!(origin instanceof HelixHeadlessTreeItem) || !this.items.includes(origin)) {
@@ -107,6 +131,28 @@ let HelixHeadlessTree = class HelixHeadlessTree extends MixinCollection(MixinCon
107
131
  this.syncItems();
108
132
  };
109
133
  }
134
+ static { this.words = 'helix-tree'; }
135
+ keyOf(item) {
136
+ return item.value || slottedWords(item, ['']);
137
+ }
138
+ itemFor(key) {
139
+ return this.items.find((item) => this.keyOf(item) === key);
140
+ }
141
+ itemOf(event) {
142
+ const item = closestInstance(event.composedPath()[0], HelixHeadlessTreeItem);
143
+ return item && this.items.includes(item) ? item : undefined;
144
+ }
145
+ keyAt(event) {
146
+ const item = this.itemOf(event);
147
+ return item && !item.disabled ? this.keyOf(item) : undefined;
148
+ }
149
+ siblingsOf(item) {
150
+ return [...(item.parentElement?.children ?? [])].filter((node) => node instanceof HelixHeadlessTreeItem && node.slot === item.slot);
151
+ }
152
+ siblingKeys(key) {
153
+ const item = this.itemFor(key);
154
+ return item ? this.siblingsOf(item).map((one) => this.keyOf(one)) : [];
155
+ }
110
156
  get values() {
111
157
  return this.multiple ? commaList(this.active) : this.active === '' ? [] : [this.active];
112
158
  }
@@ -160,6 +206,7 @@ let HelixHeadlessTree = class HelixHeadlessTree extends MixinCollection(MixinCon
160
206
  const multiple = this.multiple;
161
207
  const checked = new Set(this.values);
162
208
  for (const item of this.items) {
209
+ const key = this.keyOf(item);
163
210
  const selected = !multiple && item.value !== '' && item.value === this.active;
164
211
  const state = multiple ? checkedState(this.rowOf(item), checked) : false;
165
212
  const focusable = item === stop;
@@ -178,6 +225,8 @@ let HelixHeadlessTree = class HelixHeadlessTree extends MixinCollection(MixinCon
178
225
  item.focusable = focusable;
179
226
  item.level = level;
180
227
  item.heads = heads;
228
+ item.grip = this.reorderable;
229
+ item.move = this.reorder.moveOf(key);
181
230
  });
182
231
  }
183
232
  }
@@ -200,8 +249,7 @@ let HelixHeadlessTree = class HelixHeadlessTree extends MixinCollection(MixinCon
200
249
  return false;
201
250
  }
202
251
  if (event.key === '*') {
203
- const siblings = [...(current.parentElement?.children ?? [])].filter((node) => node instanceof HelixHeadlessTreeItem && node.slot === current.slot);
204
- for (const sibling of siblings) {
252
+ for (const sibling of this.siblingsOf(current)) {
205
253
  if (sibling.isBranch && !sibling.open) {
206
254
  sibling.requestOpen(true);
207
255
  }
@@ -274,7 +322,11 @@ let HelixHeadlessTree = class HelixHeadlessTree extends MixinCollection(MixinCon
274
322
  }
275
323
  updated(changed) {
276
324
  super.updated(changed);
277
- if (changed.has('active') || changed.has('nesting') || changed.has('selectionMode')) {
325
+ if (changed.has('active') ||
326
+ changed.has('nesting') ||
327
+ changed.has('selectionMode') ||
328
+ this.reorderable ||
329
+ changed.has('reorderable')) {
278
330
  this.syncItems();
279
331
  }
280
332
  }
@@ -293,15 +345,35 @@ let HelixHeadlessTree = class HelixHeadlessTree extends MixinCollection(MixinCon
293
345
  }}
294
346
  ></slot>
295
347
  ${this.renderStatus(this.hasRows)}
296
- </div>${this.renderLive(this.hasRows)}`;
348
+ </div>${this.renderLive(this.hasRows)}${this.reorder.drawDragPreview()}`;
297
349
  }
298
350
  };
299
351
  __decorate([
352
+ words,
353
+ property({ attribute: 'canceled-label' })
354
+ ], HelixHeadlessTree.prototype, "canceledLabel", void 0);
355
+ __decorate([
356
+ words,
357
+ property({ attribute: 'dropped-label' })
358
+ ], HelixHeadlessTree.prototype, "droppedLabel", void 0);
359
+ __decorate([
360
+ words,
300
361
  property()
301
362
  ], HelixHeadlessTree.prototype, "label", void 0);
363
+ __decorate([
364
+ words,
365
+ property({ attribute: 'moved-label' })
366
+ ], HelixHeadlessTree.prototype, "movedLabel", void 0);
302
367
  __decorate([
303
368
  property({ reflect: true })
304
369
  ], HelixHeadlessTree.prototype, "nesting", void 0);
370
+ __decorate([
371
+ words,
372
+ property({ attribute: 'picked-up-label' })
373
+ ], HelixHeadlessTree.prototype, "pickedUpLabel", void 0);
374
+ __decorate([
375
+ property({ type: Boolean })
376
+ ], HelixHeadlessTree.prototype, "reorderable", void 0);
305
377
  __decorate([
306
378
  property({ attribute: 'selection-mode', reflect: true })
307
379
  ], HelixHeadlessTree.prototype, "selectionMode", void 0);