@fusion.dev/helix-headless 0.142.1 → 0.144.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 (285) hide show
  1. package/custom-elements.json +25381 -1202
  2. package/dist/accordion/item/accordion-item.d.ts +38 -2
  3. package/dist/accordion/item/accordion-item.js +38 -6
  4. package/dist/accordion/root/accordion-root.d.ts +23 -1
  5. package/dist/accordion/root/accordion-root.js +39 -3
  6. package/dist/announcement/root/announcement-root.d.ts +11 -7
  7. package/dist/announcement/root/announcement-root.js +1 -1
  8. package/dist/app-header/root/app-header-root.d.ts +21 -0
  9. package/dist/app-header/root/app-header-root.js +31 -5
  10. package/dist/area-chart/root/area-chart-root.d.ts +12 -4
  11. package/dist/area-chart/root/area-chart-root.js +39 -11
  12. package/dist/avatar/group/avatar-group.d.ts +24 -3
  13. package/dist/avatar/group/avatar-group.js +34 -2
  14. package/dist/avatar/root/avatar-root.d.ts +17 -1
  15. package/dist/avatar/root/avatar-root.js +31 -10
  16. package/dist/badge/root/badge-root.d.ts +12 -0
  17. package/dist/badge/root/badge-root.js +1 -1
  18. package/dist/bar-chart/root/bar-chart-root.d.ts +30 -5
  19. package/dist/bar-chart/root/bar-chart-root.js +58 -21
  20. package/dist/blockquote/root/blockquote-root.d.ts +12 -7
  21. package/dist/blockquote/root/blockquote-root.js +6 -4
  22. package/dist/breadcrumbs/root/breadcrumbs-root.d.ts +9 -3
  23. package/dist/breadcrumbs/root/breadcrumbs-root.js +9 -1
  24. package/dist/button/root/button-root.d.ts +84 -1
  25. package/dist/button/root/button-root.js +81 -3
  26. package/dist/callout/root/callout-root.d.ts +32 -6
  27. package/dist/callout/root/callout-root.js +26 -7
  28. package/dist/canvas/root/canvas-root.d.ts +1 -0
  29. package/dist/canvas/root/canvas-root.js +10 -1
  30. package/dist/card/root/card-root.d.ts +30 -1
  31. package/dist/card/root/card-root.js +38 -5
  32. package/dist/carousel/root/carousel-root.d.ts +47 -5
  33. package/dist/carousel/root/carousel-root.js +53 -21
  34. package/dist/chat/composer/chat-composer.d.ts +13 -11
  35. package/dist/chat/composer/chat-composer.js +6 -12
  36. package/dist/chat/message/chat-message.js +8 -1
  37. package/dist/chat/root/chat-root.d.ts +1 -0
  38. package/dist/chat/root/chat-root.js +2 -1
  39. package/dist/checkbox/root/checkbox-root.d.ts +7 -0
  40. package/dist/checkbox/root/checkbox-root.js +9 -3
  41. package/dist/checkbox-group/root/checkbox-group-root.d.ts +116 -33
  42. package/dist/checkbox-group/root/checkbox-group-root.js +141 -44
  43. package/dist/code/root/code-root.d.ts +1 -1
  44. package/dist/code-block/lines.d.ts +13 -0
  45. package/dist/code-block/lines.js +2 -0
  46. package/dist/code-block/root/code-block-root.d.ts +49 -0
  47. package/dist/code-block/root/code-block-root.js +44 -3
  48. package/dist/color-input/root/color-input-root.d.ts +60 -2
  49. package/dist/color-input/root/color-input-root.js +55 -7
  50. package/dist/color-picker/channels.d.ts +26 -0
  51. package/dist/color-picker/channels.js +84 -0
  52. package/dist/color-picker/root/color-picker-root.d.ts +118 -12
  53. package/dist/color-picker/root/color-picker-root.js +183 -13
  54. package/dist/combobox/root/combobox-root.d.ts +126 -3
  55. package/dist/combobox/root/combobox-root.js +224 -21
  56. package/dist/command/root/command-root.d.ts +47 -10
  57. package/dist/command/root/command-root.js +45 -4
  58. package/dist/copy-button/from.d.ts +22 -0
  59. package/dist/copy-button/from.js +28 -0
  60. package/dist/copy-button/root/copy-button-root.d.ts +48 -7
  61. package/dist/copy-button/root/copy-button-root.js +54 -8
  62. package/dist/data-table/root/data-table-root.d.ts +164 -10
  63. package/dist/data-table/root/data-table-root.js +488 -57
  64. package/dist/date-input/root/date-input-root.d.ts +123 -9
  65. package/dist/date-input/root/date-input-root.js +147 -45
  66. package/dist/date-picker/root/date-picker-root.d.ts +229 -18
  67. package/dist/date-picker/root/date-picker-root.js +342 -46
  68. package/dist/dialog/description.d.ts +9 -0
  69. package/dist/dialog/description.js +14 -0
  70. package/dist/dialog/root/dialog-root.d.ts +101 -10
  71. package/dist/dialog/root/dialog-root.js +83 -4
  72. package/dist/donut-chart/root/donut-chart-root.d.ts +61 -16
  73. package/dist/donut-chart/root/donut-chart-root.js +48 -13
  74. package/dist/drawer/root/drawer-root.d.ts +93 -7
  75. package/dist/drawer/root/drawer-root.js +126 -5
  76. package/dist/drawer/swipe-start.d.ts +9 -0
  77. package/dist/drawer/swipe-start.js +12 -0
  78. package/dist/drilldown/item/drilldown-item.d.ts +16 -13
  79. package/dist/drilldown/item/drilldown-item.js +6 -2
  80. package/dist/drilldown/root/drilldown-root.d.ts +21 -5
  81. package/dist/drilldown/root/drilldown-root.js +26 -10
  82. package/dist/element-events.generated.js +42 -13
  83. package/dist/empty/root/empty-root.d.ts +1 -1
  84. package/dist/file-input/root/file-input-root.d.ts +65 -1
  85. package/dist/file-input/root/file-input-root.js +76 -12
  86. package/dist/file-input/screen.d.ts +35 -0
  87. package/dist/file-input/screen.js +49 -0
  88. package/dist/filter-input/menu/filter-menu.d.ts +9 -0
  89. package/dist/filter-input/menu/filter-menu.js +8 -0
  90. package/dist/filter-input/root/filter-input-root.d.ts +43 -6
  91. package/dist/filter-input/root/filter-input-root.js +89 -10
  92. package/dist/filter-input/suggest.d.ts +17 -0
  93. package/dist/filter-input/suggest.js +23 -0
  94. package/dist/format-date/options.d.ts +33 -0
  95. package/dist/format-date/options.js +42 -0
  96. package/dist/format-date/root/format-date-root.d.ts +62 -3
  97. package/dist/format-date/root/format-date-root.js +78 -37
  98. package/dist/graph/root/graph-root.d.ts +24 -3
  99. package/dist/graph/root/graph-root.js +66 -12
  100. package/dist/heatmap/root/buckets.d.ts +2 -1
  101. package/dist/heatmap/root/buckets.js +5 -1
  102. package/dist/heatmap/root/heatmap-root.d.ts +47 -9
  103. package/dist/heatmap/root/heatmap-root.js +46 -18
  104. package/dist/icon/index.d.ts +2 -0
  105. package/dist/icon/index.js +2 -0
  106. package/dist/icon/registry.d.ts +37 -0
  107. package/dist/icon/registry.js +83 -0
  108. package/dist/icon/root/icon-root.d.ts +53 -6
  109. package/dist/icon/root/icon-root.js +72 -4
  110. package/dist/icon/root/index.d.ts +2 -0
  111. package/dist/icon/root/index.js +2 -0
  112. package/dist/icon/set.d.ts +1 -0
  113. package/dist/icon/set.js +3 -0
  114. package/dist/icon-button/root/icon-button-root.d.ts +1 -1
  115. package/dist/image/root/image-root.d.ts +23 -2
  116. package/dist/image/root/image-root.js +23 -4
  117. package/dist/input/root/input-root.d.ts +62 -9
  118. package/dist/input/root/input-root.js +61 -5
  119. package/dist/kbd/root/kbd-root.d.ts +26 -11
  120. package/dist/kbd/root/kbd-root.js +35 -38
  121. package/dist/kbd/shortcut.d.ts +18 -0
  122. package/dist/kbd/shortcut.js +35 -0
  123. package/dist/legend/hidden-series.d.ts +8 -0
  124. package/dist/legend/hidden-series.js +13 -0
  125. package/dist/legend/root/legend-root.d.ts +63 -0
  126. package/dist/legend/root/legend-root.js +61 -7
  127. package/dist/lightbox/item/lightbox-item.d.ts +17 -1
  128. package/dist/lightbox/item/lightbox-item.js +10 -1
  129. package/dist/lightbox/root/lightbox-root.d.ts +77 -6
  130. package/dist/lightbox/root/lightbox-root.js +116 -5
  131. package/dist/line-chart/root/line-chart-root.d.ts +29 -4
  132. package/dist/line-chart/root/line-chart-root.js +58 -17
  133. package/dist/list/item/list-item.d.ts +11 -5
  134. package/dist/list/item/list-item.js +5 -6
  135. package/dist/listbox/range.d.ts +17 -0
  136. package/dist/listbox/range.js +5 -0
  137. package/dist/listbox/root/listbox-root.d.ts +184 -4
  138. package/dist/listbox/root/listbox-root.js +229 -23
  139. package/dist/loader/busy.d.ts +17 -0
  140. package/dist/loader/busy.js +24 -0
  141. package/dist/loader/root/loader-root.d.ts +37 -0
  142. package/dist/loader/root/loader-root.js +52 -3
  143. package/dist/map/root/map-root.d.ts +19 -4
  144. package/dist/map/root/map-root.js +36 -7
  145. package/dist/megamenu/root/megamenu-root.d.ts +10 -1
  146. package/dist/megamenu/root/megamenu-root.js +10 -1
  147. package/dist/menu/item/menu-item.d.ts +41 -12
  148. package/dist/menu/item/menu-item.js +46 -3
  149. package/dist/menu/root/menu-root.d.ts +32 -2
  150. package/dist/menu/root/menu-root.js +48 -8
  151. package/dist/meter/root/meter-root.d.ts +13 -0
  152. package/dist/meter/root/meter-root.js +24 -5
  153. package/dist/navigation/root/navigation-root.d.ts +10 -2
  154. package/dist/navigation/root/navigation-root.js +13 -2
  155. package/dist/notifications/feed-keys.d.ts +10 -0
  156. package/dist/notifications/feed-keys.js +14 -0
  157. package/dist/notifications/group/notification-group.d.ts +1 -0
  158. package/dist/notifications/notification/notification.d.ts +29 -0
  159. package/dist/notifications/notification/notification.js +51 -3
  160. package/dist/notifications/root/notifications-root.d.ts +49 -0
  161. package/dist/notifications/root/notifications-root.js +76 -2
  162. package/dist/number-input/root/number-input-root.d.ts +109 -7
  163. package/dist/number-input/root/number-input-root.js +109 -21
  164. package/dist/object-inspector/root/object-inspector-root.d.ts +49 -5
  165. package/dist/object-inspector/root/object-inspector-root.js +92 -12
  166. package/dist/option/root/option-root.d.ts +58 -6
  167. package/dist/option/root/option-root.js +35 -5
  168. package/dist/outline/root/outline-root.d.ts +13 -2
  169. package/dist/outline/root/outline-root.js +4 -2
  170. package/dist/pagination/root/pagination-root.d.ts +19 -1
  171. package/dist/pagination/root/pagination-root.js +49 -9
  172. package/dist/pagination/size/pagination-size.d.ts +13 -3
  173. package/dist/pagination/size/pagination-size.js +7 -0
  174. package/dist/pin-input/format.d.ts +7 -0
  175. package/dist/pin-input/format.js +16 -0
  176. package/dist/pin-input/root/pin-input-root.d.ts +37 -0
  177. package/dist/pin-input/root/pin-input-root.js +48 -7
  178. package/dist/popover/root/popover-root.d.ts +78 -3
  179. package/dist/popover/root/popover-root.js +74 -5
  180. package/dist/progress/root/progress-root.d.ts +23 -1
  181. package/dist/progress/root/progress-root.js +40 -10
  182. package/dist/qr-code/export.d.ts +31 -0
  183. package/dist/qr-code/export.js +10 -0
  184. package/dist/qr-code/root/qr-code-root.d.ts +45 -0
  185. package/dist/qr-code/root/qr-code-root.js +78 -3
  186. package/dist/radio/group/radio-group.d.ts +64 -0
  187. package/dist/radio/group/radio-group.js +66 -12
  188. package/dist/radio/root/radio-root.d.ts +8 -5
  189. package/dist/radio/root/radio-root.js +1 -2
  190. package/dist/rating/root/rating-root.d.ts +49 -1
  191. package/dist/rating/root/rating-root.js +69 -10
  192. package/dist/scatter-chart/root/scatter-chart-root.d.ts +17 -3
  193. package/dist/scatter-chart/root/scatter-chart-root.js +40 -14
  194. package/dist/select/root/select-root.d.ts +93 -3
  195. package/dist/select/root/select-root.js +111 -13
  196. package/dist/skeleton/root/skeleton-root.d.ts +39 -3
  197. package/dist/skeleton/root/skeleton-root.js +33 -4
  198. package/dist/skip-link/root/skip-link-root.d.ts +10 -0
  199. package/dist/skip-link/root/skip-link-root.js +15 -1
  200. package/dist/slider/root/slider-root.d.ts +59 -2
  201. package/dist/slider/root/slider-root.js +82 -8
  202. package/dist/sparkline/root/sparkline-root.d.ts +9 -10
  203. package/dist/speed-dial/item/speed-dial-item.d.ts +11 -5
  204. package/dist/speed-dial/item/speed-dial-item.js +7 -2
  205. package/dist/speed-dial/root/speed-dial-root.d.ts +15 -4
  206. package/dist/speed-dial/root/speed-dial-root.js +19 -5
  207. package/dist/splitter/root/splitter-root.d.ts +28 -6
  208. package/dist/splitter/root/splitter-root.js +35 -1
  209. package/dist/stat/root/stat-root.d.ts +9 -1
  210. package/dist/stat/root/stat-root.js +15 -2
  211. package/dist/steps/root/steps-root.js +1 -1
  212. package/dist/steps/step/step.d.ts +1 -0
  213. package/dist/steps/step/step.js +1 -1
  214. package/dist/switch/root/switch-root.d.ts +14 -2
  215. package/dist/switch/root/switch-root.js +7 -1
  216. package/dist/table/cell/table-cell.d.ts +24 -4
  217. package/dist/table/cell/table-cell.js +21 -1
  218. package/dist/table/column/table-column.d.ts +32 -6
  219. package/dist/table/column/table-column.js +36 -6
  220. package/dist/table/root/table-root.d.ts +94 -3
  221. package/dist/table/root/table-root.js +128 -5
  222. package/dist/table/row/table-row.d.ts +7 -0
  223. package/dist/table/row/table-row.js +9 -1
  224. package/dist/tabs/root/tabs-root.d.ts +6 -1
  225. package/dist/tabs/root/tabs-root.js +6 -2
  226. package/dist/tag/group/tag-group.d.ts +107 -0
  227. package/dist/tag/group/tag-group.js +157 -0
  228. package/dist/tag/index.d.ts +1 -0
  229. package/dist/tag/index.js +1 -0
  230. package/dist/tag/root/tag-root.d.ts +83 -1
  231. package/dist/tag/root/tag-root.js +87 -17
  232. package/dist/tag/selection.d.ts +10 -0
  233. package/dist/tag/selection.js +12 -0
  234. package/dist/textarea/grow.d.ts +22 -0
  235. package/dist/textarea/grow.js +20 -0
  236. package/dist/textarea/root/textarea-root.d.ts +13 -0
  237. package/dist/textarea/root/textarea-root.js +10 -2
  238. package/dist/time-input/root/time-input-root.d.ts +71 -6
  239. package/dist/time-input/root/time-input-root.js +110 -44
  240. package/dist/time-picker/root/time-picker-root.d.ts +155 -26
  241. package/dist/time-picker/root/time-picker-root.js +192 -63
  242. package/dist/toast/hotkey.d.ts +22 -0
  243. package/dist/toast/hotkey.js +23 -0
  244. package/dist/toast/item/toast-item.d.ts +16 -1
  245. package/dist/toast/item/toast-item.js +41 -13
  246. package/dist/toast/root/toast-root.d.ts +105 -8
  247. package/dist/toast/root/toast-root.js +209 -4
  248. package/dist/toggle/group/toggle-group.d.ts +95 -16
  249. package/dist/toggle/group/toggle-group.js +99 -13
  250. package/dist/toggle/root/toggle-root.d.ts +26 -11
  251. package/dist/toggle/root/toggle-root.js +14 -6
  252. package/dist/toolbar/root/toolbar-root.d.ts +55 -15
  253. package/dist/toolbar/root/toolbar-root.js +99 -16
  254. package/dist/tooltip/focus-target.d.ts +6 -0
  255. package/dist/tooltip/focus-target.js +9 -0
  256. package/dist/tooltip/root/tooltip-root.d.ts +73 -15
  257. package/dist/tooltip/root/tooltip-root.js +96 -7
  258. package/dist/tour/naming.d.ts +30 -0
  259. package/dist/tour/naming.js +10 -0
  260. package/dist/tour/root/tour-root.d.ts +67 -3
  261. package/dist/tour/root/tour-root.js +105 -17
  262. package/dist/tour/stop/tour-stop.d.ts +65 -3
  263. package/dist/tour/stop/tour-stop.js +61 -11
  264. package/dist/tour/wait.d.ts +11 -0
  265. package/dist/tour/wait.js +19 -0
  266. package/dist/tree/item/tree-item.d.ts +21 -5
  267. package/dist/tree/item/tree-item.js +14 -4
  268. package/dist/tree/root/tree-root.d.ts +29 -5
  269. package/dist/tree/root/tree-root.js +64 -8
  270. package/dist/trend/root/trend-root.d.ts +36 -1
  271. package/dist/trend/root/trend-root.js +41 -15
  272. package/dist/video/root/keys.d.ts +5 -0
  273. package/dist/video/root/keys.js +13 -1
  274. package/dist/video/root/video-root.d.ts +19 -0
  275. package/dist/video/root/video-root.js +48 -4
  276. package/dist/video-playlist/menu/video-playlist-menu.d.ts +20 -2
  277. package/dist/video-playlist/menu/video-playlist-menu.js +27 -5
  278. package/dist/video-playlist/root/video-playlist-root.js +6 -3
  279. package/dist/virtual-list/root/virtual-list-root.d.ts +52 -4
  280. package/dist/virtual-list/root/virtual-list-root.js +103 -21
  281. package/lint.json +1 -1
  282. package/package.json +5 -5
  283. package/types/jsx.d.ts +9140 -1149
  284. package/types/svelte.d.ts +1 -0
  285. package/types/vue.d.ts +2089 -267
@@ -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 { customElement, fillTemplate, HelixElement, HelixSelectEvent, hostAria, inlineStep, isRtl, requestChange, } from '@fusion.dev/helix-core';
7
+ import { customElement, fillTemplate, HelixActivateEvent, HelixElement, HelixSelectEvent, hostAria, inlineStep, isRtl, requestChange, } from '@fusion.dev/helix-core';
8
8
  import { caretLeft, caretRight, play, stop } from '@fusion.dev/helix-icons';
9
9
  import { html, nothing } from 'lit';
10
10
  import { property, state } from 'lit/decorators.js';
@@ -28,6 +28,7 @@ let HelixHeadlessCarousel = class HelixHeadlessCarousel extends HelixElement {
28
28
  this.interval = 5000;
29
29
  this.indexState = undefined;
30
30
  this.scrolledFor = 0;
31
+ this.said = '';
31
32
  this.label = 'Carousel';
32
33
  this.loop = false;
33
34
  this.nextLabel = 'Next slide';
@@ -43,17 +44,29 @@ let HelixHeadlessCarousel = class HelixHeadlessCarousel extends HelixElement {
43
44
  return;
44
45
  }
45
46
  this.fitted = fitted;
46
- if (this.index > this.positions - 1) {
47
- this.goTo(this.positions - 1);
48
- }
47
+ this.holdIndex();
49
48
  };
50
49
  this.handleIndicatorKeydown = (event) => {
51
- const step = inlineStep(this, event.key);
52
- if (step === 0) {
50
+ const vertical = this.orientation === 'vertical';
51
+ const step = vertical
52
+ ? event.key === 'ArrowDown'
53
+ ? 1
54
+ : event.key === 'ArrowUp'
55
+ ? -1
56
+ : 0
57
+ : inlineStep(this, event.key);
58
+ let to = this.index + step;
59
+ if (event.key === 'Home') {
60
+ to = 0;
61
+ }
62
+ else if (event.key === 'End') {
63
+ to = this.positions - 1;
64
+ }
65
+ else if (step === 0) {
53
66
  return;
54
67
  }
55
68
  event.preventDefault();
56
- this.goTo(this.index + step);
69
+ this.goTo(to);
57
70
  this.updateComplete.then(() => {
58
71
  this.renderRoot.querySelector('[part~="indicator-current"]')?.focus();
59
72
  });
@@ -88,11 +101,7 @@ let HelixHeadlessCarousel = class HelixHeadlessCarousel extends HelixElement {
88
101
  return;
89
102
  }
90
103
  const applied = requestChange({
91
- apply: (value) => {
92
- const previous = this.index;
93
- this.indexState = value;
94
- this.requestUpdate('index', previous);
95
- },
104
+ apply: (value) => this.applyIndex(value),
96
105
  event: (value) => new HelixSelectEvent({ value: String(value) }),
97
106
  host: this,
98
107
  next: nearest,
@@ -149,6 +158,14 @@ let HelixHeadlessCarousel = class HelixHeadlessCarousel extends HelixElement {
149
158
  }
150
159
  return Math.max(1, Math.round((room + gap) / (pane + gap)));
151
160
  }
161
+ holdIndex() {
162
+ const last = this.positions - 1;
163
+ if (this.slides.length > 0 && this.index > last) {
164
+ const previous = this.index;
165
+ this.indexState = Math.max(0, last);
166
+ this.requestUpdate('index', previous);
167
+ }
168
+ }
152
169
  handed() {
153
170
  return this.fits ? nothing : `--carousel-per-view: ${this.clamped}`;
154
171
  }
@@ -178,6 +195,12 @@ let HelixHeadlessCarousel = class HelixHeadlessCarousel extends HelixElement {
178
195
  get slides() {
179
196
  return this.knownChildren.filter((child) => child instanceof HTMLElement);
180
197
  }
198
+ applyIndex(value) {
199
+ const previous = this.index;
200
+ this.indexState = value;
201
+ this.requestUpdate('index', previous);
202
+ this.dispatchEvent(new HelixActivateEvent({ value: String(value) }));
203
+ }
181
204
  goTo(index) {
182
205
  if (this.slides.length === 0) {
183
206
  return;
@@ -188,11 +211,7 @@ let HelixHeadlessCarousel = class HelixHeadlessCarousel extends HelixElement {
188
211
  return;
189
212
  }
190
213
  requestChange({
191
- apply: (value) => {
192
- const previous = this.index;
193
- this.indexState = value;
194
- this.requestUpdate('index', previous);
195
- },
214
+ apply: (value) => this.applyIndex(value),
196
215
  event: (value) => new HelixSelectEvent({ value: String(value) }),
197
216
  host: this,
198
217
  next,
@@ -246,7 +265,7 @@ let HelixHeadlessCarousel = class HelixHeadlessCarousel extends HelixElement {
246
265
  if (!this.rotating || this.slides.length < 2) {
247
266
  return;
248
267
  }
249
- this.timer = setInterval(() => this.goTo(this.index + 1), this.interval);
268
+ this.timer = setInterval(() => this.goTo(this.index >= this.positions - 1 ? 0 : this.index + 1), this.interval);
250
269
  }
251
270
  nearest() {
252
271
  const track = this.partNamed('track');
@@ -294,6 +313,12 @@ let HelixHeadlessCarousel = class HelixHeadlessCarousel extends HelixElement {
294
313
  }
295
314
  if (changed.has('index')) {
296
315
  this.showing = undefined;
316
+ if (this.hasUpdated) {
317
+ this.said = fillTemplate(this.slideLabel, {
318
+ count: this.slides.length,
319
+ index: this.index + 1,
320
+ });
321
+ }
297
322
  }
298
323
  if (changed.has('perView')) {
299
324
  this.fitted = undefined;
@@ -314,9 +339,7 @@ let HelixHeadlessCarousel = class HelixHeadlessCarousel extends HelixElement {
314
339
  }
315
340
  this.scrolledFor = drawn;
316
341
  this.runTimer();
317
- if (this.slides.length > 0 && this.index > this.positions - 1) {
318
- this.goTo(this.positions - 1);
319
- }
342
+ this.holdIndex();
320
343
  this.watchPane();
321
344
  this.assign();
322
345
  }
@@ -343,6 +366,12 @@ let HelixHeadlessCarousel = class HelixHeadlessCarousel extends HelixElement {
343
366
  ' - var(--carousel-gap) - 100%';
344
367
  return `--carousel-run-end: calc(round(${run}, 1px) - (${run}))`;
345
368
  }
369
+ atEnd(side) {
370
+ if (this.loop || this.slides.length < 2) {
371
+ return false;
372
+ }
373
+ return side === 'start' ? this.index <= 0 : this.index >= this.positions - 1;
374
+ }
346
375
  render() {
347
376
  const rotating = this.rotating;
348
377
  const last = this.slides.length - 1;
@@ -369,6 +398,7 @@ let HelixHeadlessCarousel = class HelixHeadlessCarousel extends HelixElement {
369
398
  part="previous"
370
399
  type="button"
371
400
  aria-label=${this.previousLabel}
401
+ aria-disabled=${this.atEnd('start') ? 'true' : nothing}
372
402
  @click=${() => this.goTo(this.index - 1)}
373
403
  >
374
404
  <svg part="previous-mark" data-mirror fill="currentColor" viewBox=${caretLeft.viewBox} aria-hidden="true">
@@ -379,6 +409,7 @@ let HelixHeadlessCarousel = class HelixHeadlessCarousel extends HelixElement {
379
409
  part="next"
380
410
  type="button"
381
411
  aria-label=${this.nextLabel}
412
+ aria-disabled=${this.atEnd('end') ? 'true' : nothing}
382
413
  @click=${() => this.goTo(this.index + 1)}
383
414
  >
384
415
  <svg part="next-mark" data-mirror fill="currentColor" viewBox=${caretRight.viewBox} aria-hidden="true">
@@ -409,6 +440,7 @@ let HelixHeadlessCarousel = class HelixHeadlessCarousel extends HelixElement {
409
440
  ></slot>
410
441
  </div>`)}
411
442
  </div>
443
+ ${''}<span part="live" aria-live=${rotating ? 'off' : 'polite'}>${this.said}</span>
412
444
  ${this.slides.length > 1 && this.across !== undefined
413
445
  ? html `<div part="indicators" role="group" aria-label=${fillTemplate(this.indicatorsLabel, { label: this.label })}>
414
446
  ${''}
@@ -25,6 +25,7 @@ import { type PropertyValues, type TemplateResult } from 'lit';
25
25
  * @slot start - Content under the field at the leading edge, such as an attachment button or a model picker.
26
26
  *
27
27
  * @event {HelixSendEvent} helix-send - Fired when the user sends their turn, and cancelable.
28
+ * @event {Event} input - The user changed the text. Read it from `value`, for a typing indicator or a saved draft. Sent on the composer and does not bubble.
28
29
  *
29
30
  * @csspart composer - The whole composer.
30
31
  * @csspart end - The box around the `end` slot.
@@ -69,16 +70,14 @@ export declare class HelixHeadlessChatComposer extends HelixElement {
69
70
  /**
70
71
  * The text the user has written.
71
72
  *
72
- * Read it, or set it to seed a draft.
73
+ * It follows typing, so reading it gives the draft. Set it to seed a draft or
74
+ * to replace the one in the field, and set it to `''` to clear it.
73
75
  */
74
76
  value: string;
75
- private draft;
76
77
  /**
77
78
  * @internal Read by the transcript to find the composer among its children.
78
79
  */
79
80
  readonly isChatComposer = true;
80
- /** What is in the field, whoever last wrote it. */
81
- private get text();
82
81
  /**
83
82
  * Sends what is written, and returns whether the send went through.
84
83
  *
@@ -129,14 +128,17 @@ export declare class HelixHeadlessChatComposer extends HelixElement {
129
128
  */
130
129
  protected render(): TemplateResult;
131
130
  /**
132
- * Records the draft, and stops the textarea speaking in this element's name.
131
+ * Takes what was typed into `value`, and says so from this element.
133
132
  *
134
- * **The stop is not incidental.** `input` is composed by specification, so
135
- * the `<textarea>` in this shadow root sent its own past this host and on
136
- * through whatever `<helix-headless-chat>` it is slotted into, and neither
137
- * element declares an `input`: a consumer binding one on either received an
138
- * undeclared event whose target was a control they cannot reach. What a
139
- * composer offers is `helix-send`, once, when the reader is done.
133
+ * **The textarea's own `input` is stopped and this element sends one.**
134
+ * `input` is composed by specification, so the `<textarea>` in this shadow
135
+ * root sent its own past this host with a target a consumer cannot reach.
136
+ * The one sent here comes from the composer, whose `value` already holds
137
+ * the text, which is what a typing indicator or a saved draft reads.
138
+ *
139
+ * **The text is `value` and nothing beside it.** A private draft read before
140
+ * `value` sent a seed the reader had deleted, since an empty draft fell back
141
+ * to it, and left `value` reading empty while the field held a whole draft.
140
142
  */
141
143
  private readonly handleInput;
142
144
  private readonly handleSend;
@@ -7,7 +7,8 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  import { customElement, HelixElement, HelixSendEvent, hostAria, markRegion, } from '@fusion.dev/helix-core';
8
8
  import { arrowElbowDownLeft } from '@fusion.dev/helix-icons';
9
9
  import { html } from 'lit';
10
- import { property, state } from 'lit/decorators.js';
10
+ import { property } from 'lit/decorators.js';
11
+ import { live } from 'lit/directives/live.js';
11
12
  import { unsafeSVG } from 'lit/directives/unsafe-svg.js';
12
13
  let HelixHeadlessChatComposer = class HelixHeadlessChatComposer extends HelixElement {
13
14
  constructor() {
@@ -19,11 +20,11 @@ let HelixHeadlessChatComposer = class HelixHeadlessChatComposer extends HelixEle
19
20
  this.sendLabel = 'Send';
20
21
  this.submitOn = 'enter';
21
22
  this.value = '';
22
- this.draft = '';
23
23
  this.isChatComposer = true;
24
24
  this.handleInput = (event) => {
25
25
  event.stopPropagation();
26
- this.draft = event.target.value;
26
+ this.value = event.target.value;
27
+ this.dispatchEvent(new Event('input'));
27
28
  };
28
29
  this.handleSend = () => {
29
30
  this.send();
@@ -39,18 +40,14 @@ let HelixHeadlessChatComposer = class HelixHeadlessChatComposer extends HelixEle
39
40
  this.send();
40
41
  };
41
42
  }
42
- get text() {
43
- return this.draft || this.value;
44
- }
45
43
  send() {
46
- const value = this.text.trim();
44
+ const value = this.value.trim();
47
45
  if (value === '' || this.disabled) {
48
46
  return false;
49
47
  }
50
48
  if (!this.dispatchEvent(new HelixSendEvent({ value }))) {
51
49
  return false;
52
50
  }
53
- this.draft = '';
54
51
  this.value = '';
55
52
  return true;
56
53
  }
@@ -89,7 +86,7 @@ let HelixHeadlessChatComposer = class HelixHeadlessChatComposer extends HelixEle
89
86
  return html `<div part="composer">
90
87
  <textarea
91
88
  part="field"
92
- .value=${this.text}
89
+ .value=${live(this.value)}
93
90
  aria-label=${this.label}
94
91
  placeholder=${this.placeholder}
95
92
  rows=${this.rows}
@@ -126,9 +123,6 @@ __decorate([
126
123
  __decorate([
127
124
  property()
128
125
  ], HelixHeadlessChatComposer.prototype, "value", void 0);
129
- __decorate([
130
- state()
131
- ], HelixHeadlessChatComposer.prototype, "draft", void 0);
132
126
  HelixHeadlessChatComposer = __decorate([
133
127
  customElement('helix-headless-chat-composer')
134
128
  ], HelixHeadlessChatComposer);
@@ -28,7 +28,14 @@ let HelixHeadlessChatMessage = class HelixHeadlessChatMessage extends HelixEleme
28
28
  apply: (next) => {
29
29
  this.state = next;
30
30
  },
31
- event: () => new HelixSendEvent({ value: this.textContent?.trim() ?? '' }),
31
+ event: () => new HelixSendEvent({
32
+ value: [...this.childNodes]
33
+ .filter((node) => !(node.nodeType === 1 && node.hasAttribute('slot')))
34
+ .map((node) => node.textContent ?? '')
35
+ .join('')
36
+ .replace(/\s+/g, ' ')
37
+ .trim(),
38
+ }),
32
39
  host: this,
33
40
  next: 'sending',
34
41
  });
@@ -65,6 +65,7 @@ declare const HelixHeadlessChat_base: (new (...args: any[]) => import("@fusion.d
65
65
  *
66
66
  * @event {HelixBeforePinEvent} helix-before-pin - Fired when the user pins or unpins the transcript by scrolling. Cancelable.
67
67
  * @event {HelixHistoryEvent} helix-history - Fired when the user reaches the oldest turn while `history` is `more`. It reports the position and cannot be canceled.
68
+ * @event {HelixPinEvent} helix-pin - Fired after the transcript is pinned or unpinned, with `true` or `false` in `detail.value`.
68
69
  * @event {HelixSendEvent} helix-send - Fired when the user sends a turn from the composer or retries a failed one. It is fired inside and handled here, so you can listen for it on the conversation. Cancelable: canceling it sends nothing and leaves the decision to you.
69
70
  *
70
71
  * @csspart actions - The controls for the conversation, at the header's trailing edge.
@@ -5,7 +5,7 @@ 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
  var HelixHeadlessChat_1;
8
- import { customElement, HelixBeforePinEvent, HelixElement, HelixHistoryEvent, hostAria, MixinCollection, onUnlessFalse, requestChange, VirtualizeController, } from '@fusion.dev/helix-core';
8
+ import { customElement, HelixBeforePinEvent, HelixElement, HelixHistoryEvent, HelixPinEvent, hostAria, MixinCollection, onUnlessFalse, requestChange, VirtualizeController, } from '@fusion.dev/helix-core';
9
9
  import { nothing } from 'lit';
10
10
  import { property, state } from 'lit/decorators.js';
11
11
  import { keyed } from 'lit/directives/keyed.js';
@@ -181,6 +181,7 @@ let HelixHeadlessChat = class HelixHeadlessChat extends MixinCollection(HelixEle
181
181
  const previous = this.pinned;
182
182
  this.pinnedState = value;
183
183
  this.requestUpdate('pinned', previous);
184
+ this.dispatchEvent(new HelixPinEvent({ value: String(value) }));
184
185
  },
185
186
  event: (value) => new HelixBeforePinEvent({ value: String(value) }),
186
187
  host: this,
@@ -28,6 +28,8 @@ declare const HelixHeadlessCheckbox_base: (new (...args: any[]) => import("@fusi
28
28
  * @documentation https://fusion.dev/helix/components/checkbox
29
29
  *
30
30
  * @slot - The label.
31
+ * @slot feedback - The message that says what is wrong, for content richer than a string. It shows while there is a message.
32
+ * @slot hint - Help under the control, for content richer than the `hint` text.
31
33
  *
32
34
  * @event {Event} change - The box was checked or unchecked. Relayed from the native input.
33
35
  * @event {HelixBeforeToggleEvent} helix-before-toggle - The box is about to be checked or unchecked. Cancelable: cancel it to keep its state.
@@ -46,6 +48,7 @@ declare const HelixHeadlessCheckbox_base: (new (...args: any[]) => import("@fusi
46
48
  *
47
49
  * @cssstate checked - While the box is checked.
48
50
  * @cssstate has-label - The label slot has content, so the label is drawn.
51
+ * @cssstate indeterminate - While the box shows the dash, neither checked nor unchecked.
49
52
  * @cssstate invalid - The control has an error to show, from the browser's validation or from your `feedback`.
50
53
  */
51
54
  export declare class HelixHeadlessCheckbox extends HelixHeadlessCheckbox_base {
@@ -56,6 +59,10 @@ export declare class HelixHeadlessCheckbox extends HelixHeadlessCheckbox_base {
56
59
  * Shows the box as neither checked nor unchecked.
57
60
  *
58
61
  * Presentation only. It never submits, and the first change resolves it.
62
+ *
63
+ * Not reflected, as no state is: the element resolves it itself, and a
64
+ * reflected one removed the attribute the consumer wrote. A stylesheet
65
+ * reads it as `:state(indeterminate)`.
59
66
  */
60
67
  indeterminate: boolean;
61
68
  /**
@@ -20,11 +20,14 @@ let HelixHeadlessCheckbox = class HelixHeadlessCheckbox extends MixinControllerC
20
20
  this.handleChange = (event) => {
21
21
  const input = event.target;
22
22
  const next = input.checked;
23
- if (this.requestChecked(next)) {
23
+ const taken = this.requestChecked(next);
24
+ if (taken) {
24
25
  this.indeterminate = false;
25
26
  }
26
27
  input.checked = this.checked;
27
- this.relayNativeEvent(event);
28
+ if (taken) {
29
+ this.relayNativeEvent(event);
30
+ }
28
31
  };
29
32
  this.handleLabelChange = () => {
30
33
  this.syncLabelPresence();
@@ -46,6 +49,7 @@ let HelixHeadlessCheckbox = class HelixHeadlessCheckbox extends MixinControllerC
46
49
  willUpdate(changed) {
47
50
  super.willUpdate(changed);
48
51
  this.internals.ariaRequired = this.required ? 'true' : null;
52
+ this.toggleState('indeterminate', this.indeterminate);
49
53
  if (this.indeterminate) {
50
54
  this.dashed = true;
51
55
  }
@@ -82,7 +86,9 @@ let HelixHeadlessCheckbox = class HelixHeadlessCheckbox extends MixinControllerC
82
86
  ?required=${this.required}
83
87
  aria-describedby=${this.describedBy ?? nothing}
84
88
  aria-invalid=${this.invalidity ?? nothing}
89
+ aria-readonly=${this.readOnly ? 'true' : nothing}
85
90
  @change=${this.handleChange}
91
+ @click=${this.holdReadOnly}
86
92
  @input=${this.stopInner}
87
93
  />
88
94
  <span
@@ -98,7 +104,7 @@ let HelixHeadlessCheckbox = class HelixHeadlessCheckbox extends MixinControllerC
98
104
  }
99
105
  };
100
106
  __decorate([
101
- property({ reflect: true, type: Boolean })
107
+ property({ type: Boolean })
102
108
  ], HelixHeadlessCheckbox.prototype, "indeterminate", void 0);
103
109
  __decorate([
104
110
  property()
@@ -1,6 +1,7 @@
1
1
  import { DisabledCascadeController, HelixFormElement } from '@fusion.dev/helix-core';
2
- import { type PropertyValues, type TemplateResult } from 'lit';
2
+ import { nothing, type PropertyValues, type TemplateResult } from 'lit';
3
3
  import { HelixHeadlessCheckbox } from '../../checkbox/root/checkbox-root.js';
4
+ import '../../checkbox/index.js';
4
5
  declare const HelixHeadlessCheckboxGroup_base: (new (...args: any[]) => import("@fusion.dev/helix-core").MixinFieldInterface) & typeof HelixFormElement;
5
6
  /**
6
7
  * @summary A group of related checkboxes under one label, with one value for the set.
@@ -16,8 +17,18 @@ declare const HelixHeadlessCheckboxGroup_base: (new (...args: any[]) => import("
16
17
  * `name` that you write once, and one place to read and write the whole set.
17
18
  *
18
19
  * `value` is the checked values, separated by commas, in the order the
19
- * checkboxes are written. Setting it checks exactly those values and unchecks
20
- * the rest.
20
+ * checkboxes are written, read from the boxes themselves. Setting it checks
21
+ * exactly those values and unchecks the rest.
22
+ *
23
+ * `select-all` draws a box above the set that checks every enabled box, or
24
+ * unchecks them all once every one is checked. It shows a dash while only some
25
+ * are checked, and changes the set through the same cancelable
26
+ * `helix-before-change` a box does.
27
+ *
28
+ * A checkbox is a member wherever it sits inside the group, in a row or a grid
29
+ * cell of your own, unless another group inside this one holds it. A field of
30
+ * another kind inside the group, such as an "Other" text field, sends its own
31
+ * `input` and `change` past the group.
21
32
  *
22
33
  * **The group shows the message you set in `feedback`.** It is form-associated
23
34
  * only for validity and never calls `setFormValue`, so the browser does not
@@ -29,7 +40,8 @@ declare const HelixHeadlessCheckboxGroup_base: (new (...args: any[]) => import("
29
40
  * @aliases Checkbox list, Multi-select
30
41
  * @documentation https://fusion.dev/helix/components/checkbox-group
31
42
  *
32
- * @slot - The checkboxes.
43
+ * @slot - The checkboxes, and anything laid out around them.
44
+ * @slot feedback - The message that says what is wrong, for content richer than a string. It shows while there is a message.
33
45
  * @slot hint - Help under the checkboxes, for help that needs more than plain text.
34
46
  * @slot label - The group's label, for a label that needs more than plain text.
35
47
  *
@@ -41,43 +53,97 @@ declare const HelixHeadlessCheckboxGroup_base: (new (...args: any[]) => import("
41
53
  * @csspart hint - The help under the checkboxes.
42
54
  * @csspart items - The element that holds the checkboxes, laid out by `orientation`.
43
55
  * @csspart label - The group's label, above the checkboxes.
56
+ * @csspart select-all - The box that checks or unchecks every box, under `select-all`.
57
+ * @csspart select-all-box - The select-all box's box, under the mark.
58
+ * @csspart select-all-control - The select-all box's native input.
59
+ * @csspart select-all-feedback - The select-all box's own message, which it never shows.
60
+ * @csspart select-all-field - The row that holds the select-all box and its label.
61
+ * @csspart select-all-hint - The select-all box's own help, which it never shows.
62
+ * @csspart select-all-label - The words beside the select-all box.
63
+ * @csspart select-all-mark - The select-all box's check mark, or its dash while only some boxes are checked.
64
+ * @csspart select-all-mark-checked - Added to `select-all-mark` while every box is checked.
65
+ * @csspart select-all-mark-dash - Added to `select-all-mark` while only some boxes are checked, and kept until every one is.
66
+ * @csspart select-all-mark-indeterminate - Added to `select-all-mark` while only some boxes are checked.
44
67
  *
45
68
  * @cssstate invalid - The control has an error to show, from the browser's validation or from your `feedback`.
46
69
  */
47
70
  export declare class HelixHeadlessCheckboxGroup extends HelixHeadlessCheckboxGroup_base {
71
+ /**
72
+ * Whether a box above the set checks or unchecks every enabled box.
73
+ */
74
+ selectAll: boolean;
75
+ /**
76
+ * The words beside the box `select-all` draws.
77
+ */
78
+ selectAllLabel: string;
48
79
  /**
49
80
  * The checked values, comma separated.
81
+ *
82
+ * Read from the boxes once they are known, so a box a script ticks directly
83
+ * is in it at once. Written, it is pushed onto the boxes. A box whose value
84
+ * holds a comma cannot be named here: use `values`.
85
+ */
86
+ get value(): string;
87
+ set value(next: string);
88
+ /**
89
+ * The checked values, as a list, in the order the boxes are written.
90
+ *
91
+ * The same set as `value`, and the one to use where a value may hold a
92
+ * comma. Written, it checks exactly those boxes and unchecks the rest.
93
+ */
94
+ get values(): string[];
95
+ set values(next: string[]);
96
+ /** The values last written, which the boxes are given at the next update. */
97
+ private declared;
98
+ /**
99
+ * Whether `declared` has yet to reach the boxes.
100
+ *
101
+ * **Pushed once and then left alone**, which is the fix for a box a script
102
+ * ticked being unticked by the next unrelated update: every update used to
103
+ * push the group's value onto every box, whatever the boxes said since.
104
+ */
105
+ private pending;
106
+ /** Watches for boxes arriving inside a wrapper, which no slot reports. */
107
+ private observer;
108
+ /** The value the required check last judged. */
109
+ private judged;
110
+ /** The boxes `member` is added to. */
111
+ private readonly watched;
112
+ /**
113
+ * Asks for an update when a box's own update moved the set.
114
+ *
115
+ * **A controller on each box, because a box changed by a script says
116
+ * nothing.** `box.checked = false` sends no event, as on a native checkbox,
117
+ * so the group heard of it only at its next unrelated update: a required
118
+ * group whose last box a script unchecked still passed `checkValidity()` and
119
+ * let its form submit. A box's update is the one thing every change to its
120
+ * state goes through, whatever made it.
50
121
  */
51
- value: string;
122
+ private readonly member;
52
123
  protected readonly cascade: DisabledCascadeController;
53
- /** The checkboxes in the group, in the order they are written. Browser only. */
124
+ /**
125
+ * The checkboxes in the group, in the order they are written. Browser only.
126
+ *
127
+ * Descendants rather than children, so a box inside a layout wrapper of the
128
+ * consumer's is a member: only direct children counted, and a box in a row
129
+ * with a description got no name and no place in the set. A box held by a
130
+ * group nested inside this one is that group's.
131
+ */
54
132
  get boxes(): HelixHeadlessCheckbox[];
133
+ /** Whether this is the nearest group around `box`. */
134
+ private holds;
55
135
  /**
56
- * Pushes the group's name and value onto the boxes.
136
+ * Pushes the group's name onto the boxes, and its value where one is waiting.
57
137
  *
58
138
  * As properties rather than attributes. A `name` written onto a box is a
59
139
  * change to markup the consumer rendered, which a React consumer's hydration
60
140
  * reports and does not patch up. A box that names itself keeps its own.
141
+ *
142
+ * **Nothing is pushed for a value nobody wrote**, so a group written with no
143
+ * `value` keeps what its boxes declare, and `group.value = ''` still clears
144
+ * every box, being a value somebody wrote.
61
145
  */
62
146
  private sync;
63
- /** Whether `seed` has had its one chance. */
64
- private seeded;
65
- /**
66
- * Reads the boxes' own state into `value`, once, before anything is pushed.
67
- *
68
- * Seeding, and never a guard in `sync` refusing to write while `value` is
69
- * empty. The guard would answer the same case, a group written with no `value`
70
- * whose boxes declare their own `checked` being cleared on the first update,
71
- * and it also makes `group.value = ''` do nothing at all: the obvious way to
72
- * clear a group would silently not, and the last box could not be unticked
73
- * through the group either.
74
- *
75
- * The markup decides the starting set, and from then on `value` is what the
76
- * boxes follow, including when it is empty. The group's `value` is a derived
77
- * read of the boxes rather than state it owns, so reading it out of them at
78
- * the start is what it already means.
79
- */
80
- private seed;
81
147
  /**
82
148
  * Reads a box's requested change into `value`, and says so once.
83
149
  *
@@ -114,16 +180,17 @@ export declare class HelixHeadlessCheckboxGroup extends HelixHeadlessCheckboxGro
114
180
  private readonly handleMemberNative;
115
181
  connectedCallback(): void;
116
182
  disconnectedCallback(): void;
183
+ /** Stops listening to a box that left the group. */
184
+ private unwatch;
117
185
  protected willUpdate(changed: PropertyValues): void;
118
- protected firstUpdated(changed: PropertyValues): void;
119
186
  /**
120
187
  * Goes back to the set the markup started with.
121
188
  *
122
- * **Seeded again rather than cleared.** The form resets each box too, in the
123
- * same task and after this, so by the next update the boxes are back to
124
- * what they declared and the seed reads them. Without this the group kept
125
- * the reader's set, reported valid over boxes the reset had emptied, and
126
- * ticked them again the next time anything updated it.
189
+ * The form resets each box too, in the same task and after this, so a group
190
+ * whose markup wrote no `value` has nothing to do: its boxes return to what
191
+ * they declared, and its value is read from them. A `value` the markup wrote
192
+ * is pushed again at the next update, after the boxes have reset, and an
193
+ * update is asked for, since an unchanged value schedules none.
127
194
  */
128
195
  formResetCallback(): void;
129
196
  /**
@@ -141,11 +208,27 @@ export declare class HelixHeadlessCheckboxGroup extends HelixHeadlessCheckboxGro
141
208
  * `invalid`, which is what marks the field touched and puts the message on
142
209
  * screen.
143
210
  *
144
- * Anchored on the list, because the browser needs somewhere to point the
145
- * bubble.
211
+ * Anchored on the list, which takes no focus, so the base points the bubble
212
+ * at the first box instead.
146
213
  */
147
214
  private validate;
148
215
  protected updated(changed: PropertyValues): void;
216
+ /**
217
+ * Checks every enabled box, or unchecks them all once every one is checked.
218
+ *
219
+ * The box's own request is refused, since the box shows what the set holds
220
+ * and the set is moved here, through one cancelable `helix-before-change`
221
+ * for the whole set, as a box moves it.
222
+ */
223
+ private readonly handleSelectAll;
224
+ /**
225
+ * The box above the set that checks or unchecks every box, under
226
+ * `select-all`, behind a seam a tier can move.
227
+ *
228
+ * Checked while every box is, and showing a dash while only some are. It is
229
+ * in this shadow root, so it is no member of the set and submits nothing.
230
+ */
231
+ protected renderSelectAll(): TemplateResult | typeof nothing;
149
232
  protected render(): TemplateResult;
150
233
  }
151
234
  declare global {