@fusion.dev/helix-headless 0.0.0-dev → 0.0.2

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 (210) hide show
  1. package/custom-elements.json +4513 -4483
  2. package/dist/accordion/item/accordion-item.d.ts +13 -15
  3. package/dist/accordion/item/accordion-item.js +15 -17
  4. package/dist/announcement/root/announcement-root.d.ts +7 -25
  5. package/dist/announcement/root/announcement-root.js +7 -20
  6. package/dist/app-header/root/app-header-root.d.ts +10 -17
  7. package/dist/app-header/root/app-header-root.js +9 -18
  8. package/dist/avatar/group/avatar-group.d.ts +10 -19
  9. package/dist/avatar/group/avatar-group.js +12 -17
  10. package/dist/avatar/root/avatar-root.d.ts +8 -8
  11. package/dist/avatar/root/avatar-root.js +19 -20
  12. package/dist/badge/root/badge-root.d.ts +6 -6
  13. package/dist/badge/root/badge-root.js +13 -13
  14. package/dist/bar-chart/root/bar-chart-root.d.ts +21 -29
  15. package/dist/bar-chart/root/bar-chart-root.js +42 -57
  16. package/dist/breadcrumbs/breadcrumb/breadcrumb.d.ts +12 -18
  17. package/dist/breadcrumbs/breadcrumb/breadcrumb.js +13 -16
  18. package/dist/breadcrumbs/root/breadcrumbs-root.d.ts +9 -28
  19. package/dist/breadcrumbs/root/breadcrumbs-root.js +9 -28
  20. package/dist/button/root/button-root.d.ts +84 -94
  21. package/dist/button/root/button-root.js +82 -92
  22. package/dist/callout/root/callout-root.d.ts +4 -5
  23. package/dist/carousel/root/carousel-root.d.ts +59 -71
  24. package/dist/carousel/root/carousel-root.js +73 -101
  25. package/dist/chat/composer/chat-composer.d.ts +29 -33
  26. package/dist/chat/composer/chat-composer.js +40 -44
  27. package/dist/chat/message/chat-message.d.ts +25 -25
  28. package/dist/chat/message/chat-message.js +26 -26
  29. package/dist/chat/root/chat-root.d.ts +28 -41
  30. package/dist/chat/root/chat-root.js +27 -40
  31. package/dist/checkbox/root/checkbox-root.d.ts +10 -12
  32. package/dist/checkbox/root/checkbox-root.js +29 -35
  33. package/dist/checkbox-group/root/checkbox-group-root.d.ts +32 -45
  34. package/dist/checkbox-group/root/checkbox-group-root.js +53 -79
  35. package/dist/code-block/root/code-block-root.d.ts +3 -4
  36. package/dist/code-block/root/code-block-root.js +8 -12
  37. package/dist/color-input/root/color-input-root.d.ts +36 -37
  38. package/dist/color-input/root/color-input-root.js +29 -34
  39. package/dist/color-picker/color.d.ts +7 -8
  40. package/dist/color-picker/color.js +7 -8
  41. package/dist/color-picker/root/color-picker-root.d.ts +55 -57
  42. package/dist/color-picker/root/color-picker-root.js +60 -64
  43. package/dist/combobox/root/combobox-root.d.ts +53 -58
  44. package/dist/combobox/root/combobox-root.js +85 -94
  45. package/dist/command/root/command-root.d.ts +8 -8
  46. package/dist/command/root/command-root.js +29 -33
  47. package/dist/copy-button/root/copy-button-root.d.ts +21 -24
  48. package/dist/copy-button/root/copy-button-root.js +25 -35
  49. package/dist/data-table/root/data-table-root.d.ts +77 -76
  50. package/dist/data-table/root/data-table-root.js +95 -84
  51. package/dist/data-table/root/order.d.ts +2 -2
  52. package/dist/data-table/root/order.js +1 -3
  53. package/dist/date-input/root/date-input-root.d.ts +88 -93
  54. package/dist/date-input/root/date-input-root.js +147 -158
  55. package/dist/date-picker/root/date-picker-root.d.ts +75 -83
  56. package/dist/date-picker/root/date-picker-root.js +120 -143
  57. package/dist/dialog/root/dialog-root.d.ts +41 -24
  58. package/dist/dialog/root/dialog-root.js +47 -24
  59. package/dist/divider/root/divider-root.d.ts +5 -6
  60. package/dist/divider/root/divider-root.js +4 -5
  61. package/dist/donut-chart/root/donut-chart-root.d.ts +22 -25
  62. package/dist/donut-chart/root/donut-chart-root.js +37 -51
  63. package/dist/drawer/root/drawer-root.d.ts +24 -29
  64. package/dist/drawer/root/drawer-root.js +15 -22
  65. package/dist/drilldown/item/drilldown-item.d.ts +14 -14
  66. package/dist/drilldown/item/drilldown-item.js +24 -26
  67. package/dist/drilldown/root/drilldown-root.d.ts +8 -10
  68. package/dist/drilldown/root/drilldown-root.js +6 -7
  69. package/dist/element-events.generated.js +1 -1
  70. package/dist/file-input/root/file-input-root.d.ts +20 -24
  71. package/dist/file-input/root/file-input-root.js +42 -57
  72. package/dist/format-date/root/format-date-root.js +1 -1
  73. package/dist/heatmap/root/buckets.d.ts +8 -8
  74. package/dist/heatmap/root/buckets.js +8 -8
  75. package/dist/heatmap/root/heatmap-root.d.ts +57 -63
  76. package/dist/heatmap/root/heatmap-root.js +72 -83
  77. package/dist/icon/root/icon-root.d.ts +4 -4
  78. package/dist/icon/root/icon-root.js +9 -9
  79. package/dist/icon-button/root/icon-button-root.d.ts +4 -6
  80. package/dist/icon-button/root/icon-button-root.js +4 -6
  81. package/dist/image/root/image-root.d.ts +49 -59
  82. package/dist/image/root/image-root.js +55 -65
  83. package/dist/index.d.ts +5 -5
  84. package/dist/index.js +5 -5
  85. package/dist/input/root/input-root.d.ts +61 -85
  86. package/dist/input/root/input-root.js +79 -106
  87. package/dist/kbd/root/kbd-root.d.ts +8 -7
  88. package/dist/kbd/root/kbd-root.js +71 -11
  89. package/dist/legend/root/legend-root.d.ts +1 -1
  90. package/dist/legend/root/legend-root.js +4 -5
  91. package/dist/line-chart/root/line-chart-root.d.ts +26 -30
  92. package/dist/line-chart/root/line-chart-root.js +10 -10
  93. package/dist/list/item/list-item.d.ts +14 -18
  94. package/dist/list/item/list-item.js +18 -22
  95. package/dist/list/root/list-root.d.ts +4 -4
  96. package/dist/list/root/list-root.js +3 -3
  97. package/dist/listbox/root/listbox-root.d.ts +31 -58
  98. package/dist/listbox/root/listbox-root.js +66 -109
  99. package/dist/megamenu/root/megamenu-root.d.ts +34 -35
  100. package/dist/megamenu/root/megamenu-root.js +53 -58
  101. package/dist/menu/item/menu-item.d.ts +39 -53
  102. package/dist/menu/item/menu-item.js +50 -64
  103. package/dist/menu/root/menu-root.d.ts +30 -40
  104. package/dist/menu/root/menu-root.js +49 -82
  105. package/dist/meter/root/meter-root.d.ts +49 -53
  106. package/dist/meter/root/meter-root.js +22 -27
  107. package/dist/navigation/root/navigation-root.js +11 -19
  108. package/dist/notifications/notification/notification.d.ts +16 -22
  109. package/dist/notifications/notification/notification.js +21 -27
  110. package/dist/notifications/root/notifications-root.d.ts +31 -39
  111. package/dist/notifications/root/notifications-root.js +41 -52
  112. package/dist/number-input/root/number-input-root.d.ts +31 -33
  113. package/dist/number-input/root/number-input-root.js +37 -39
  114. package/dist/option/root/option-root.d.ts +73 -74
  115. package/dist/option/root/option-root.js +62 -64
  116. package/dist/outline/root/outline-root.d.ts +38 -44
  117. package/dist/outline/root/outline-root.js +66 -82
  118. package/dist/pagination/root/pagination-root.d.ts +87 -92
  119. package/dist/pagination/root/pagination-root.js +116 -123
  120. package/dist/pagination/size/pagination-size.d.ts +31 -50
  121. package/dist/pagination/size/pagination-size.js +35 -55
  122. package/dist/pagination/summary/pagination-summary.d.ts +12 -12
  123. package/dist/pagination/summary/pagination-summary.js +18 -18
  124. package/dist/pin-input/root/pin-input-root.d.ts +53 -70
  125. package/dist/pin-input/root/pin-input-root.js +74 -94
  126. package/dist/popover/root/popover-root.d.ts +15 -20
  127. package/dist/popover/root/popover-root.js +19 -36
  128. package/dist/progress/root/progress-root.d.ts +12 -14
  129. package/dist/progress/root/progress-root.js +22 -25
  130. package/dist/qr-code/root/qr-code-root.d.ts +11 -11
  131. package/dist/qr-code/root/qr-code-root.js +12 -14
  132. package/dist/radio/group/radio-group.js +19 -26
  133. package/dist/radio/root/radio-root.d.ts +12 -13
  134. package/dist/radio/root/radio-root.js +12 -13
  135. package/dist/rating/root/rating-root.d.ts +25 -30
  136. package/dist/rating/root/rating-root.js +43 -50
  137. package/dist/scroll-area/root/scroll-area-root.d.ts +11 -14
  138. package/dist/scroll-area/root/scroll-area-root.js +39 -33
  139. package/dist/select/root/select-root.d.ts +7 -12
  140. package/dist/select/root/select-root.js +40 -55
  141. package/dist/slider/root/slider-root.d.ts +53 -60
  142. package/dist/slider/root/slider-root.js +74 -85
  143. package/dist/sparkline/root/sparkline-root.d.ts +43 -47
  144. package/dist/sparkline/root/sparkline-root.js +23 -32
  145. package/dist/speed-dial/item/speed-dial-item.d.ts +6 -6
  146. package/dist/speed-dial/item/speed-dial-item.js +9 -9
  147. package/dist/speed-dial/root/speed-dial-root.d.ts +21 -25
  148. package/dist/speed-dial/root/speed-dial-root.js +32 -40
  149. package/dist/splitter/root/splitter-root.d.ts +98 -111
  150. package/dist/splitter/root/splitter-root.js +96 -123
  151. package/dist/stat/root/stat-root.d.ts +2 -7
  152. package/dist/stat/root/stat-root.js +0 -5
  153. package/dist/steps/step/step.d.ts +19 -24
  154. package/dist/steps/step/step.js +27 -32
  155. package/dist/switch/root/switch-root.js +2 -2
  156. package/dist/table/column/table-column.d.ts +54 -60
  157. package/dist/table/column/table-column.js +95 -68
  158. package/dist/table/root/table-root.d.ts +5 -6
  159. package/dist/table/root/table-root.js +7 -10
  160. package/dist/tabs/panel/tab-panel.d.ts +21 -25
  161. package/dist/tabs/panel/tab-panel.js +25 -29
  162. package/dist/tabs/root/tabs-root.d.ts +25 -34
  163. package/dist/tabs/root/tabs-root.js +22 -28
  164. package/dist/tabs/tab/tab.d.ts +12 -12
  165. package/dist/tabs/tab/tab.js +19 -20
  166. package/dist/textarea/root/textarea-root.d.ts +36 -36
  167. package/dist/textarea/root/textarea-root.js +43 -47
  168. package/dist/time-input/root/time-input-root.d.ts +58 -68
  169. package/dist/time-input/root/time-input-root.js +62 -77
  170. package/dist/time-picker/root/time-picker-root.d.ts +73 -79
  171. package/dist/time-picker/root/time-picker-root.js +72 -84
  172. package/dist/timeline/item/timeline-item.d.ts +8 -11
  173. package/dist/timeline/item/timeline-item.js +8 -11
  174. package/dist/timeline/root/timeline-root.d.ts +5 -7
  175. package/dist/timeline/root/timeline-root.js +5 -7
  176. package/dist/toast/item/toast-item.d.ts +9 -27
  177. package/dist/toast/item/toast-item.js +19 -41
  178. package/dist/toast/root/toast-root.d.ts +10 -14
  179. package/dist/toast/root/toast-root.js +4 -5
  180. package/dist/toggle/group/toggle-group.d.ts +6 -15
  181. package/dist/toggle/group/toggle-group.js +21 -36
  182. package/dist/toggle/root/toggle-root.d.ts +26 -27
  183. package/dist/toggle/root/toggle-root.js +30 -31
  184. package/dist/toolbar/root/toolbar-root.d.ts +7 -10
  185. package/dist/toolbar/root/toolbar-root.js +10 -14
  186. package/dist/tooltip/root/tooltip-root.d.ts +52 -59
  187. package/dist/tooltip/root/tooltip-root.js +98 -93
  188. package/dist/tour/root/tour-root.d.ts +19 -23
  189. package/dist/tour/root/tour-root.js +31 -41
  190. package/dist/tour/stop/tour-stop.d.ts +14 -15
  191. package/dist/tour/stop/tour-stop.js +31 -34
  192. package/dist/tree/item/tree-item.d.ts +30 -35
  193. package/dist/tree/item/tree-item.js +43 -55
  194. package/dist/tree/root/tree-root.d.ts +7 -10
  195. package/dist/tree/root/tree-root.js +33 -42
  196. package/dist/trend/root/trend-root.d.ts +3 -5
  197. package/dist/trend/root/trend-root.js +5 -9
  198. package/dist/video/root/video-root.d.ts +100 -124
  199. package/dist/video/root/video-root.js +142 -176
  200. package/dist/video-playlist/item/video-playlist-item.d.ts +16 -16
  201. package/dist/video-playlist/item/video-playlist-item.js +24 -24
  202. package/dist/video-playlist/menu/video-playlist-menu.d.ts +5 -8
  203. package/dist/video-playlist/menu/video-playlist-menu.js +20 -29
  204. package/dist/video-playlist/root/video-playlist-root.d.ts +16 -11
  205. package/dist/video-playlist/root/video-playlist-root.js +21 -25
  206. package/dist/virtual-list/root/virtual-list-root.d.ts +8 -12
  207. package/dist/virtual-list/root/virtual-list-root.js +11 -16
  208. package/jsx.d.ts +9797 -12561
  209. package/package.json +6 -6
  210. package/vue.d.ts +2684 -3228
@@ -50,15 +50,27 @@ let HelixHeadlessChatComposer = class HelixHeadlessChatComposer extends HelixEle
50
50
  constructor() {
51
51
  super(...arguments);
52
52
  /**
53
- * What the reader has written.
54
- *
55
- * Read it, or set it to seed a draft.
53
+ * Whether the composer refuses input, while a turn is in flight say.
56
54
  */
57
- this.value = '';
55
+ this.disabled = false;
56
+ /**
57
+ * Accessible name for the field.
58
+ */
59
+ this.label = 'Message';
58
60
  /**
59
61
  * Shown in an empty field.
60
62
  */
61
63
  this.placeholder = '';
64
+ /**
65
+ * How many rows the field opens at.
66
+ *
67
+ * It grows from there.
68
+ */
69
+ this.rows = 1;
70
+ /**
71
+ * Label for the control that sends.
72
+ */
73
+ this.sendLabel = 'Send';
62
74
  /**
63
75
  * What sends: pressing Enter, or only the control.
64
76
  *
@@ -68,23 +80,11 @@ let HelixHeadlessChatComposer = class HelixHeadlessChatComposer extends HelixEle
68
80
  */
69
81
  this.submitOn = 'enter';
70
82
  /**
71
- * Whether the composer refuses input, while a turn is in flight say.
72
- */
73
- this.disabled = false;
74
- /**
75
- * Accessible name for the field.
76
- */
77
- this.label = 'Message';
78
- /**
79
- * Label for the control that sends.
80
- */
81
- this.sendLabel = 'Send';
82
- /**
83
- * How many rows the field opens at.
83
+ * What the reader has written.
84
84
  *
85
- * It grows from there.
85
+ * Read it, or set it to seed a draft.
86
86
  */
87
- this.rows = 1;
87
+ this.value = '';
88
88
  this.draft = '';
89
89
  /**
90
90
  * @internal Read by the transcript to find the composer among its children.
@@ -98,7 +98,7 @@ let HelixHeadlessChatComposer = class HelixHeadlessChatComposer extends HelixEle
98
98
  * whatever `<helix-chat>` it is slotted into, and neither element declares an
99
99
  * `input`: a consumer binding one on either received an undeclared event whose
100
100
  * target was a control they cannot reach. What a composer offers is
101
- * `helix-send`, once, when the reader is done. See 308.
101
+ * `helix-send`, once, when the reader is done.
102
102
  */
103
103
  this.handleInput = (event) => {
104
104
  event.stopPropagation();
@@ -182,13 +182,11 @@ let HelixHeadlessChatComposer = class HelixHeadlessChatComposer extends HelixEle
182
182
  *
183
183
  * **A glyph with the label as its accessible name, rather than the label as
184
184
  * text.** The word "Send" beside a field is the widest thing in the row and
185
- * says nothing a return key does not, and every composer a reader has used in
186
- * the last five years marks it rather than spells it. The return glyph is the
187
- * mark because Enter is what actually sends, which `submit-on` says out loud:
188
- * the control and the key are one affordance and should look like it.
189
- *
190
- * `send-label` is unchanged and is now the accessible name rather than the
191
- * visible one, so a screen reader hears the same word it always did.
185
+ * says nothing a return key does not. The return glyph is the mark because
186
+ * Enter is what actually sends, which `submit-on` says out loud: the control
187
+ * and the key are one affordance and should look like it. `send-label` is the
188
+ * accessible name rather than a visible one, so a screen reader still hears
189
+ * the word.
192
190
  */
193
191
  renderSend() {
194
192
  return html `<button
@@ -211,12 +209,10 @@ let HelixHeadlessChatComposer = class HelixHeadlessChatComposer extends HelixEle
211
209
  /**
212
210
  * The field, and a row of tools under it.
213
211
  *
214
- * **One row was the wrong shape and it got worse the more a composer had to
215
- * carry.** Everything sat on a single line: an attachment control, the field,
216
- * a stop control and a send button, so the field was squeezed from both sides
217
- * and every tool a consumer added took width away from the thing being typed
218
- * into. Under it, the field spans the whole composer at every width and the
219
- * tools have a line of their own to grow along.
212
+ * **The tools take a line of their own rather than sharing the field's.** On
213
+ * one line every tool a consumer adds takes width away from the thing being
214
+ * typed into; under it, the field spans the whole composer at every width and
215
+ * the tools have room to grow along.
220
216
  *
221
217
  * Send is at the trailing end of that line rather than in the field, which is
222
218
  * the same corner and costs no overlay: a control positioned inside a
@@ -243,15 +239,6 @@ let HelixHeadlessChatComposer = class HelixHeadlessChatComposer extends HelixEle
243
239
  </div>`;
244
240
  }
245
241
  };
246
- __decorate([
247
- property()
248
- ], HelixHeadlessChatComposer.prototype, "value", void 0);
249
- __decorate([
250
- property()
251
- ], HelixHeadlessChatComposer.prototype, "placeholder", void 0);
252
- __decorate([
253
- property({ attribute: 'submit-on' })
254
- ], HelixHeadlessChatComposer.prototype, "submitOn", void 0);
255
242
  __decorate([
256
243
  property({ reflect: true, type: Boolean })
257
244
  ], HelixHeadlessChatComposer.prototype, "disabled", void 0);
@@ -259,11 +246,20 @@ __decorate([
259
246
  property()
260
247
  ], HelixHeadlessChatComposer.prototype, "label", void 0);
261
248
  __decorate([
262
- property({ attribute: 'send-label' })
263
- ], HelixHeadlessChatComposer.prototype, "sendLabel", void 0);
249
+ property()
250
+ ], HelixHeadlessChatComposer.prototype, "placeholder", void 0);
264
251
  __decorate([
265
252
  property({ type: Number })
266
253
  ], HelixHeadlessChatComposer.prototype, "rows", void 0);
254
+ __decorate([
255
+ property({ attribute: 'send-label' })
256
+ ], HelixHeadlessChatComposer.prototype, "sendLabel", void 0);
257
+ __decorate([
258
+ property({ attribute: 'submit-on' })
259
+ ], HelixHeadlessChatComposer.prototype, "submitOn", void 0);
260
+ __decorate([
261
+ property()
262
+ ], HelixHeadlessChatComposer.prototype, "value", void 0);
267
263
  __decorate([
268
264
  state()
269
265
  ], HelixHeadlessChatComposer.prototype, "draft", void 0);
@@ -41,6 +41,10 @@ import { nothing, type PropertyValues, type TemplateResult } from 'lit';
41
41
  * @csspart time - When it was said.
42
42
  */
43
43
  export declare class HelixHeadlessChatMessage extends HelixElement {
44
+ /**
45
+ * When it was said, as anything `Date` parses.
46
+ */
47
+ at: string;
44
48
  /**
45
49
  * Who said it.
46
50
  *
@@ -52,19 +56,9 @@ export declare class HelixHeadlessChatMessage extends HelixElement {
52
56
  */
53
57
  author?: string;
54
58
  /**
55
- * What has happened to it.
56
- *
57
- * Reflected, because every one of the four is a visual state and a stylesheet
58
- * has no other way to know. Absent is a settled message with nothing to
59
- * report, which is what most of a transcript is, and it is the absence of the
60
- * attribute rather than a value of it: there is no initializer, so nothing is
61
- * reflected until something happens.
62
- */
63
- state?: 'failed' | 'sending' | 'sent' | 'streaming';
64
- /**
65
- * When it was said, as anything `Date` parses.
59
+ * Label for a message that did not send.
66
60
  */
67
- at: string;
61
+ failedLabel: string;
68
62
  /**
69
63
  * Locale for the timestamp.
70
64
  *
@@ -72,17 +66,23 @@ export declare class HelixHeadlessChatMessage extends HelixElement {
72
66
  */
73
67
  locale: string;
74
68
  /**
75
- * What to call each state, for a reader who cannot see it.
69
+ * Label for the control offered on a failed message.
76
70
  */
77
- sendingLabel: string;
71
+ retryLabel: string;
78
72
  /**
79
- * @internal
73
+ * What to call each state, for a reader who cannot see it.
80
74
  */
81
- failedLabel: string;
75
+ sendingLabel: string;
82
76
  /**
83
- * Label for the control offered on a failed message.
77
+ * What has happened to it.
78
+ *
79
+ * Reflected, because every one of the four is a visual state and a stylesheet
80
+ * has no other way to know. Absent is a settled message with nothing to
81
+ * report, which is what most of a transcript is, and it is the absence of the
82
+ * attribute rather than a value of it: there is no initializer, so nothing is
83
+ * reflected until something happens.
84
84
  */
85
- retryLabel: string;
85
+ state?: 'failed' | 'sending' | 'sent' | 'streaming';
86
86
  /**
87
87
  * @internal Read by the transcript to identify its children across the light
88
88
  * DOM, which is cheaper than `instanceof`. Not a consumer's to read or set.
@@ -129,13 +129,13 @@ export declare class HelixHeadlessChatMessage extends HelixElement {
129
129
  /**
130
130
  * The turn: who said it, what was said, what it was drawn from, and its line.
131
131
  *
132
- * **`sources` and `actions` are inside the body rather than beside it**, and
133
- * the second of those moved twice. `actions` was a third grid column, so a
134
- * copy control on a fifteen-word turn sat at the container's trailing edge
135
- * with a hundred and fifty pixels of nothing between it and the bubble it
136
- * acted on, on both sides of the conversation. Moved into the body as a
137
- * column of its own it was no better: a bubble spanning two auto tracks
138
- * inflates both, so the controls landed under the middle of the turn.
132
+ * **`sources` and `actions` are inside the body rather than beside it.**
133
+ * `actions` as a third grid column puts a copy control on a fifteen-word turn
134
+ * at the container's trailing edge, a hundred and fifty pixels of nothing
135
+ * between it and the bubble it acts on, on both sides of the conversation. As
136
+ * a column of its own inside the body it is no better: a bubble spanning two
137
+ * auto tracks inflates both, so the controls land under the middle of the
138
+ * turn.
139
139
  *
140
140
  * So they are inside `meta`, which is the line under a turn rather than only
141
141
  * its timestamp, and that line is one flex row: time, state, controls, all
@@ -55,24 +55,24 @@ let HelixHeadlessChatMessage = class HelixHeadlessChatMessage extends HelixEleme
55
55
  * When it was said, as anything `Date` parses.
56
56
  */
57
57
  this.at = '';
58
+ /**
59
+ * Label for a message that did not send.
60
+ */
61
+ this.failedLabel = 'Not sent';
58
62
  /**
59
63
  * Locale for the timestamp.
60
64
  *
61
65
  * Empty is the runtime's own.
62
66
  */
63
67
  this.locale = '';
64
- /**
65
- * What to call each state, for a reader who cannot see it.
66
- */
67
- this.sendingLabel = 'Sending';
68
- /**
69
- * @internal
70
- */
71
- this.failedLabel = 'Not sent';
72
68
  /**
73
69
  * Label for the control offered on a failed message.
74
70
  */
75
71
  this.retryLabel = 'Try again';
72
+ /**
73
+ * What to call each state, for a reader who cannot see it.
74
+ */
75
+ this.sendingLabel = 'Sending';
76
76
  /**
77
77
  * @internal Read by the transcript to identify its children across the light
78
78
  * DOM, which is cheaper than `instanceof`. Not a consumer's to read or set.
@@ -120,7 +120,7 @@ let HelixHeadlessChatMessage = class HelixHeadlessChatMessage extends HelixEleme
120
120
  /* `article` rather than `listitem`, because the transcript is a `log` and a
121
121
  log's children are not list items: a turn is a self-contained thing a
122
122
  reader can be moved to, which is what an article is for.
123
-
123
+
124
124
  `aria-busy` while it arrives is the whole of the streaming contract on
125
125
  this side: the live region above it holds its announcement until the flag
126
126
  clears, so the message is read once, whole, rather than per token. */
@@ -214,13 +214,13 @@ let HelixHeadlessChatMessage = class HelixHeadlessChatMessage extends HelixEleme
214
214
  /**
215
215
  * The turn: who said it, what was said, what it was drawn from, and its line.
216
216
  *
217
- * **`sources` and `actions` are inside the body rather than beside it**, and
218
- * the second of those moved twice. `actions` was a third grid column, so a
219
- * copy control on a fifteen-word turn sat at the container's trailing edge
220
- * with a hundred and fifty pixels of nothing between it and the bubble it
221
- * acted on, on both sides of the conversation. Moved into the body as a
222
- * column of its own it was no better: a bubble spanning two auto tracks
223
- * inflates both, so the controls landed under the middle of the turn.
217
+ * **`sources` and `actions` are inside the body rather than beside it.**
218
+ * `actions` as a third grid column puts a copy control on a fifteen-word turn
219
+ * at the container's trailing edge, a hundred and fifty pixels of nothing
220
+ * between it and the bubble it acts on, on both sides of the conversation. As
221
+ * a column of its own inside the body it is no better: a bubble spanning two
222
+ * auto tracks inflates both, so the controls land under the middle of the
223
+ * turn.
224
224
  *
225
225
  * So they are inside `meta`, which is the line under a turn rather than only
226
226
  * its timestamp, and that line is one flex row: time, state, controls, all
@@ -242,26 +242,26 @@ let HelixHeadlessChatMessage = class HelixHeadlessChatMessage extends HelixEleme
242
242
  }
243
243
  };
244
244
  __decorate([
245
- property({ reflect: true })
246
- ], HelixHeadlessChatMessage.prototype, "author", void 0);
245
+ property()
246
+ ], HelixHeadlessChatMessage.prototype, "at", void 0);
247
247
  __decorate([
248
248
  property({ reflect: true })
249
- ], HelixHeadlessChatMessage.prototype, "state", void 0);
249
+ ], HelixHeadlessChatMessage.prototype, "author", void 0);
250
250
  __decorate([
251
- property()
252
- ], HelixHeadlessChatMessage.prototype, "at", void 0);
251
+ property({ attribute: 'failed-label' })
252
+ ], HelixHeadlessChatMessage.prototype, "failedLabel", void 0);
253
253
  __decorate([
254
254
  property()
255
255
  ], HelixHeadlessChatMessage.prototype, "locale", void 0);
256
+ __decorate([
257
+ property({ attribute: 'retry-label' })
258
+ ], HelixHeadlessChatMessage.prototype, "retryLabel", void 0);
256
259
  __decorate([
257
260
  property({ attribute: 'sending-label' })
258
261
  ], HelixHeadlessChatMessage.prototype, "sendingLabel", void 0);
259
262
  __decorate([
260
- property({ attribute: 'failed-label' })
261
- ], HelixHeadlessChatMessage.prototype, "failedLabel", void 0);
262
- __decorate([
263
- property({ attribute: 'retry-label' })
264
- ], HelixHeadlessChatMessage.prototype, "retryLabel", void 0);
263
+ property({ reflect: true })
264
+ ], HelixHeadlessChatMessage.prototype, "state", void 0);
265
265
  __decorate([
266
266
  state()
267
267
  ], HelixHeadlessChatMessage.prototype, "clock", void 0);
@@ -24,8 +24,8 @@ declare const HelixHeadlessChat_base: (new (...args: any[]) => import("@fusion.d
24
24
  * a reader who is reading.**
25
25
  *
26
26
  * The element owns it, because it is the only party that knows a message arrived
27
- * and where the viewport was when it did. `pinned` is a controlled property like
28
- * any other, so a consumer who wants to own it can.
27
+ * and where the viewport was when it did. `pinned` announces before it moves, so
28
+ * a consumer who wants to own it refuses the request and assigns their own.
29
29
  *
30
30
  * **The live region announces on completion, not on arrival.** The transcript is
31
31
  * `role="log"` with `aria-live="polite"`, and a streaming message carries
@@ -73,25 +73,20 @@ export declare class HelixHeadlessChat extends HelixHeadlessChat_base {
73
73
  */
74
74
  static shadowRootOptions: ShadowRootInit;
75
75
  /**
76
- * Accessible name for the conversation.
76
+ * Whether to open pinned, where nothing declared it.
77
77
  */
78
- label: string;
78
+ defaultPinned: boolean;
79
79
  /**
80
- * How near the bottom still counts as being at it, in pixels.
81
- *
82
- * A hook rather than a constant, because the right number depends on how tall
83
- * a turn is: a transcript of one-line replies wants a smaller threshold than
84
- * one of paragraphs, and a reader who has scrolled up by half a message has
85
- * not left.
80
+ * Accessible name for the conversation.
86
81
  */
87
- threshold: number;
82
+ label: string;
88
83
  /**
89
84
  * Whether the transcript follows new turns to the bottom.
90
85
  *
91
- * Set it and this element defers: the reader's scrolling fires `helix-change`
92
- * and moves nothing until a new value arrives. `default-pinned` seeds a state
93
- * this element then owns, and it defaults to pinned because a conversation
94
- * opens at its most recent turn.
86
+ * The reader's scrolling asks first: `helix-before-pin` is cancelable, so a
87
+ * consumer refusing it takes the decision and assigns their own value.
88
+ * `default-pinned` seeds the state this element then owns, and it defaults to
89
+ * pinned because a conversation opens at its most recent turn.
95
90
  *
96
91
  * **Not reflected, and the default is why.** A reflected property that
97
92
  * defaults to true writes its attribute on upgrade whether or not the
@@ -102,15 +97,18 @@ export declare class HelixHeadlessChat extends HelixHeadlessChat_base {
102
97
  * that is a part inside the shadow tree where a stylesheet can already reach
103
98
  * it. Measured rather than assumed: `label, pinned` after upgrade against
104
99
  * `label` from the server.
105
- *
106
- *
107
100
  */
108
101
  get pinned(): boolean;
109
102
  set pinned(next: boolean);
110
103
  /**
111
- * Whether to open pinned, where nothing declared it.
104
+ * How near the bottom still counts as being at it, in pixels.
105
+ *
106
+ * A hook rather than a constant, because the right number depends on how tall
107
+ * a turn is: a transcript of one-line replies wants a smaller threshold than
108
+ * one of paragraphs, and a reader who has scrolled up by half a message has
109
+ * not left.
112
110
  */
113
- defaultPinned: boolean;
111
+ threshold: number;
114
112
  private pinnedState;
115
113
  /** Watches for turns arriving, since a manual slot hears nothing about them. */
116
114
  private watcher;
@@ -162,18 +160,12 @@ export declare class HelixHeadlessChat extends HelixHeadlessChat_base {
162
160
  /**
163
161
  * A press anywhere in the way back takes the reader back.
164
162
  *
165
- * **The affordance was inert, in the component and in every example.** The
166
- * control is slotted so the consumer picks the words, and `resume()` was
167
- * public "because the control offering it is the consumer's and needs
168
- * something to call". True, and it left a button this element positions, lifts
169
- * and shows and hides doing nothing at all until somebody wired it, which none
170
- * of the five examples did: the one control whose whole job is to undo a
171
- * scroll shipped as decoration.
172
- *
173
- * The region exists for exactly one purpose, so a press inside it has exactly
174
- * one meaning and this element is entitled to act on it. `resume()` stays
175
- * public for the other callers it was always for: a keyboard shortcut, or a
176
- * consumer's own control somewhere else on the page.
163
+ * The control is slotted so the consumer picks the words, which on its own
164
+ * leaves a button this element positions, lifts, shows and hides doing nothing
165
+ * until somebody wires it. The region exists for exactly one purpose, so a
166
+ * press inside it has exactly one meaning and this element is entitled to act
167
+ * on it. `resume()` stays public for the other callers: a keyboard shortcut,
168
+ * or a consumer's own control somewhere else on the page.
177
169
  */
178
170
  private readonly handleResume;
179
171
  connectedCallback(): void;
@@ -184,20 +176,15 @@ export declare class HelixHeadlessChat extends HelixHeadlessChat_base {
184
176
  /**
185
177
  * The reader's own scrolling, which is the only thing that unpins.
186
178
  *
187
- * **Bound to the transcript in the template, and it has to be.** This was a
188
- * capture listener on the host, on the reasoning that `scroll` does not bubble
189
- * so the capture phase is the only phase that reaches it. Not bubbling is not
190
- * the problem: `scroll` is not *composed*, and a non-composed event's
191
- * propagation path stops at the shadow root and never includes the host, in
192
- * any phase. So the listener never ran once, the pin never released, and a
193
- * reader who scrolled up to re-read was pulled back to the bottom by the next
194
- * turn to arrive, which this element's own description calls the most
195
- * got-wrong thing in the category.
179
+ * **Bound to the transcript in the template, and it has to be.** A listener on
180
+ * the host never runs, in any phase, and capture does not rescue it: `scroll`
181
+ * is not *composed*, so its propagation path stops at the shadow root and
182
+ * never includes the host. Not bubbling is the red herring.
196
183
  *
197
184
  * Measured by dispatching both shapes at the transcript: with
198
185
  * `composed: false`, which is what the platform sends, the host saw zero and
199
186
  * `pinned` stayed true; with `composed: true` the host saw one and `pinned`
200
- * went false. Bound here, the phase and the bubbling never come up.
187
+ * went false.
201
188
  *
202
189
  * **The scroll this element does itself must not unpin it**, which is the
203
190
  * subtle half: `scrollTop = scrollHeight` fires the same event a reader's
@@ -12,7 +12,7 @@ import { property, state } from 'lit/decorators.js';
12
12
  *
13
13
  * Named once because two things read the list: the manual assignment that puts
14
14
  * a child in the region its `slot` names, and the emptiness each region is
15
- * hidden on. They went out of step the first time they were written twice.
15
+ * hidden on. Written out twice they go out of step.
16
16
  */
17
17
  const REGIONS = ['header', 'actions', 'resume', 'status', 'composer'];
18
18
  /**
@@ -37,8 +37,8 @@ const REGIONS = ['header', 'actions', 'resume', 'status', 'composer'];
37
37
  * a reader who is reading.**
38
38
  *
39
39
  * The element owns it, because it is the only party that knows a message arrived
40
- * and where the viewport was when it did. `pinned` is a controlled property like
41
- * any other, so a consumer who wants to own it can.
40
+ * and where the viewport was when it did. `pinned` announces before it moves, so
41
+ * a consumer who wants to own it refuses the request and assigns their own.
42
42
  *
43
43
  * **The live region announces on completion, not on arrival.** The transcript is
44
44
  * `role="log"` with `aria-live="polite"`, and a streaming message carries
@@ -77,6 +77,10 @@ const REGIONS = ['header', 'actions', 'resume', 'status', 'composer'];
77
77
  let HelixHeadlessChat = class HelixHeadlessChat extends MixinCollection(HelixElement) {
78
78
  constructor() {
79
79
  super(...arguments);
80
+ /**
81
+ * Whether to open pinned, where nothing declared it.
82
+ */
83
+ this.defaultPinned = true;
80
84
  /**
81
85
  * Accessible name for the conversation.
82
86
  */
@@ -90,10 +94,6 @@ let HelixHeadlessChat = class HelixHeadlessChat extends MixinCollection(HelixEle
90
94
  * not left.
91
95
  */
92
96
  this.threshold = 48;
93
- /**
94
- * Whether to open pinned, where nothing declared it.
95
- */
96
- this.defaultPinned = true;
97
97
  this.pinnedState = undefined;
98
98
  /** Watches for turns arriving, since a manual slot hears nothing about them. */
99
99
  this.watcher = undefined;
@@ -119,18 +119,12 @@ let HelixHeadlessChat = class HelixHeadlessChat extends MixinCollection(HelixEle
119
119
  /**
120
120
  * A press anywhere in the way back takes the reader back.
121
121
  *
122
- * **The affordance was inert, in the component and in every example.** The
123
- * control is slotted so the consumer picks the words, and `resume()` was
124
- * public "because the control offering it is the consumer's and needs
125
- * something to call". True, and it left a button this element positions, lifts
126
- * and shows and hides doing nothing at all until somebody wired it, which none
127
- * of the five examples did: the one control whose whole job is to undo a
128
- * scroll shipped as decoration.
129
- *
130
- * The region exists for exactly one purpose, so a press inside it has exactly
131
- * one meaning and this element is entitled to act on it. `resume()` stays
132
- * public for the other callers it was always for: a keyboard shortcut, or a
133
- * consumer's own control somewhere else on the page.
122
+ * The control is slotted so the consumer picks the words, which on its own
123
+ * leaves a button this element positions, lifts, shows and hides doing nothing
124
+ * until somebody wires it. The region exists for exactly one purpose, so a
125
+ * press inside it has exactly one meaning and this element is entitled to act
126
+ * on it. `resume()` stays public for the other callers: a keyboard shortcut,
127
+ * or a consumer's own control somewhere else on the page.
134
128
  */
135
129
  this.handleResume = () => {
136
130
  this.resume();
@@ -142,20 +136,15 @@ let HelixHeadlessChat = class HelixHeadlessChat extends MixinCollection(HelixEle
142
136
  /**
143
137
  * The reader's own scrolling, which is the only thing that unpins.
144
138
  *
145
- * **Bound to the transcript in the template, and it has to be.** This was a
146
- * capture listener on the host, on the reasoning that `scroll` does not bubble
147
- * so the capture phase is the only phase that reaches it. Not bubbling is not
148
- * the problem: `scroll` is not *composed*, and a non-composed event's
149
- * propagation path stops at the shadow root and never includes the host, in
150
- * any phase. So the listener never ran once, the pin never released, and a
151
- * reader who scrolled up to re-read was pulled back to the bottom by the next
152
- * turn to arrive, which this element's own description calls the most
153
- * got-wrong thing in the category.
139
+ * **Bound to the transcript in the template, and it has to be.** A listener on
140
+ * the host never runs, in any phase, and capture does not rescue it: `scroll`
141
+ * is not *composed*, so its propagation path stops at the shadow root and
142
+ * never includes the host. Not bubbling is the red herring.
154
143
  *
155
144
  * Measured by dispatching both shapes at the transcript: with
156
145
  * `composed: false`, which is what the platform sends, the host saw zero and
157
146
  * `pinned` stayed true; with `composed: true` the host saw one and `pinned`
158
- * went false. Bound here, the phase and the bubbling never come up.
147
+ * went false.
159
148
  *
160
149
  * **The scroll this element does itself must not unpin it**, which is the
161
150
  * subtle half: `scrollTop = scrollHeight` fires the same event a reader's
@@ -186,10 +175,10 @@ let HelixHeadlessChat = class HelixHeadlessChat extends MixinCollection(HelixEle
186
175
  /**
187
176
  * Whether the transcript follows new turns to the bottom.
188
177
  *
189
- * Set it and this element defers: the reader's scrolling fires `helix-change`
190
- * and moves nothing until a new value arrives. `default-pinned` seeds a state
191
- * this element then owns, and it defaults to pinned because a conversation
192
- * opens at its most recent turn.
178
+ * The reader's scrolling asks first: `helix-before-pin` is cancelable, so a
179
+ * consumer refusing it takes the decision and assigns their own value.
180
+ * `default-pinned` seeds the state this element then owns, and it defaults to
181
+ * pinned because a conversation opens at its most recent turn.
193
182
  *
194
183
  * **Not reflected, and the default is why.** A reflected property that
195
184
  * defaults to true writes its attribute on upgrade whether or not the
@@ -200,8 +189,6 @@ let HelixHeadlessChat = class HelixHeadlessChat extends MixinCollection(HelixEle
200
189
  * that is a part inside the shadow tree where a stylesheet can already reach
201
190
  * it. Measured rather than assumed: `label, pinned` after upgrade against
202
191
  * `label` from the server.
203
- *
204
- *
205
192
  */
206
193
  get pinned() {
207
194
  return this.pinnedState ?? this.defaultPinned;
@@ -365,18 +352,18 @@ let HelixHeadlessChat = class HelixHeadlessChat extends MixinCollection(HelixEle
365
352
  </div>`;
366
353
  }
367
354
  };
355
+ __decorate([
356
+ property({ attribute: 'default-pinned', type: Boolean })
357
+ ], HelixHeadlessChat.prototype, "defaultPinned", void 0);
368
358
  __decorate([
369
359
  property()
370
360
  ], HelixHeadlessChat.prototype, "label", void 0);
371
- __decorate([
372
- property({ type: Number })
373
- ], HelixHeadlessChat.prototype, "threshold", void 0);
374
361
  __decorate([
375
362
  property({ type: Boolean })
376
363
  ], HelixHeadlessChat.prototype, "pinned", null);
377
364
  __decorate([
378
- property({ attribute: 'default-pinned', type: Boolean })
379
- ], HelixHeadlessChat.prototype, "defaultPinned", void 0);
365
+ property({ type: Number })
366
+ ], HelixHeadlessChat.prototype, "threshold", void 0);
380
367
  __decorate([
381
368
  state()
382
369
  ], HelixHeadlessChat.prototype, "pinnedState", void 0);
@@ -45,16 +45,16 @@ declare const HelixHeadlessCheckbox_base: (new (...args: any[]) => import("@fusi
45
45
  */
46
46
  export declare class HelixHeadlessCheckbox extends HelixHeadlessCheckbox_base {
47
47
  protected readonly aria: AriaForwardController;
48
- /**
49
- * Value submitted when the box is checked.
50
- */
51
- value: string;
52
48
  /**
53
49
  * Whether the box shows as neither checked nor unchecked.
54
50
  *
55
51
  * Presentation only. It never submits, and the first change resolves it.
56
52
  */
57
53
  indeterminate: boolean;
54
+ /**
55
+ * Value submitted when the box is checked.
56
+ */
57
+ value: string;
58
58
  /** Focus is delegated to the input, so the host is never the focus target. */
59
59
  static shadowRootOptions: ShadowRootInit;
60
60
  private readonly handleChange;
@@ -87,15 +87,13 @@ export declare class HelixHeadlessCheckbox extends HelixHeadlessCheckbox_base {
87
87
  *
88
88
  * Called on `slotchange` and after every update, and the second is not
89
89
  * belt-and-braces: **`slotchange` does not fire when nothing is assigned.**
90
- * So a checkbox labeled only by its property, which is most of them, never
91
- * heard about its own label and rendered without one. Caught by the spec that
92
- * asks a labeled row to be wider than a bare one.
90
+ * Without it a checkbox labeled only by its property, which is most of them,
91
+ * never hears about its own label and renders without one.
93
92
  *
94
- * **`:state(has-label)` and not `data-has-label`, since 27 Aug 2026.** This
95
- * one could never have been in server output whatever it was called, the
96
- * answer coming from `assignedNodes` and a server having no tree to ask, so
97
- * it was an attribute that appeared on every labeled checkbox the instant it
98
- * upgraded and on none that any server sent. See `HelixElement.toggleState`.
93
+ * **`:state(has-label)` and not `data-has-label`.** The answer comes from
94
+ * `assignedNodes` and a server has no tree to ask, so an attribute would
95
+ * appear on every labeled checkbox the instant it upgraded and on none that
96
+ * any server sent. See `HelixElement.toggleState`.
99
97
  */
100
98
  private syncLabelPresence;
101
99
  protected render(): TemplateResult;