@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
@@ -48,10 +48,6 @@ import { type PropertyValues, type TemplateResult } from 'lit';
48
48
  * @csspart placeholder - What stands in until it arrives.
49
49
  */
50
50
  export declare class HelixHeadlessImage extends HelixElement {
51
- /**
52
- * Where the picture is.
53
- */
54
- src: string;
55
51
  /**
56
52
  * What it shows, for a reader who cannot see it.
57
53
  *
@@ -60,21 +56,18 @@ export declare class HelixHeadlessImage extends HelixElement {
60
56
  */
61
57
  alt: string;
62
58
  /**
63
- * Whether to wait until it is nearly on screen.
64
- *
65
- * `lazy` by default, which is the opposite of the platform's, because a
66
- * picture worth putting in a component is usually below the fold and the one
67
- * that is not is the exception worth writing down.
68
- */
69
- loading?: 'eager' | 'lazy';
70
- /**
71
- * The candidate widths, passed through to the picture.
59
+ * How the picture is fetched across origins, which decides whether a canvas
60
+ * can read it.
72
61
  */
73
- srcset: string;
62
+ crossOrigin: 'anonymous' | 'use-credentials' | null;
74
63
  /**
75
- * How much of the line it will take, passed through to the picture.
64
+ * Whether the browser may decode off the main thread.
65
+ *
66
+ * `async` is the resting value and right for a picture in a page. `sync` is
67
+ * what a consumer reaches for when the picture is about to be composited with
68
+ * something else and a tear would show.
76
69
  */
77
- sizes: string;
70
+ decoding: 'async' | 'auto' | 'sync';
78
71
  /**
79
72
  * How urgently to fetch it, for the one picture that is the page.
80
73
  *
@@ -86,25 +79,29 @@ export declare class HelixHeadlessImage extends HelixElement {
86
79
  */
87
80
  fetchPriority: 'auto' | 'high' | 'low';
88
81
  /**
89
- * Whether the browser may decode off the main thread.
82
+ * Whether to wait until it is nearly on screen.
90
83
  *
91
- * **The template hardcoded `async` and a consumer could not reach it**, which
92
- * is worse than the property being absent: the decision was taken on their
93
- * behalf and nothing said so. `async` is still the resting value and still
94
- * right for a picture in a page, and `sync` is what a consumer reaches for
95
- * when the picture is about to be composited with something else and a tear
96
- * would show.
97
- */
98
- decoding: 'async' | 'auto' | 'sync';
99
- /**
100
- * How the picture is fetched across origins, which decides whether a canvas
101
- * can read it.
84
+ * `lazy` by default, which is the opposite of the platform's, because a
85
+ * picture worth putting in a component is usually below the fold and the one
86
+ * that is not is the exception worth writing down.
102
87
  */
103
- crossOrigin: 'anonymous' | 'use-credentials' | null;
88
+ loading?: 'eager' | 'lazy';
104
89
  /**
105
90
  * How much of the referring URL to send with the request.
106
91
  */
107
92
  referrerPolicy: string;
93
+ /**
94
+ * How much of the line it will take, passed through to the picture.
95
+ */
96
+ sizes: string;
97
+ /**
98
+ * Where the picture is.
99
+ */
100
+ src: string;
101
+ /**
102
+ * The candidate widths, passed through to the picture.
103
+ */
104
+ srcset: string;
108
105
  /**
109
106
  * Whether the picture is on its way, here, or never coming.
110
107
  *
@@ -115,14 +112,12 @@ export declare class HelixHeadlessImage extends HelixElement {
115
112
  * a consumer rendered: React reads the attribute appearing at upgrade as a
116
113
  * hydration mismatch, and a serialized `<helix-image status="loaded">` pasted
117
114
  * back declares that a picture has arrived which this element has never
118
- * fetched. The `data-` name is the library's answer to both, being a
119
- * different name a re-parse cannot mistake for a declaration, and it is what
120
- * `data-closed` on `Toast.Item` already does, and `AppHeader` did until its
121
- * own moved to `:state(scrolled)` for the hydration reason recorded there.
122
- * A picture arrives after somebody fetched it, which puts this on the safe
123
- * side of hydration: a fact that can be true on the *first* update mirrors to
124
- * a custom state instead, which is what `:state(open)` and `:state(checked)`
125
- * became on 27 Aug 2026 for exactly that reason.
115
+ * fetched. The `data-` name is the library's answer to both, being a name a
116
+ * re-parse cannot mistake for a declaration, and it is what `data-closed` on
117
+ * `Toast.Item` already does. A picture arrives after somebody fetched it,
118
+ * which puts this on the safe side of hydration: a fact that can be true on
119
+ * the *first* update mirrors to a custom state instead, which is what
120
+ * `:state(open)` and `:state(checked)` are.
126
121
  *
127
122
  * `loading` writes nothing, because it is where every image starts and the
128
123
  * resting state of a mirror is the attribute's absence.
@@ -136,22 +131,18 @@ export declare class HelixHeadlessImage extends HelixElement {
136
131
  * Says so under the platform's own name, because the platform's cannot escape.
137
132
  *
138
133
  * `load` and `error` on an `<img>` neither bubble nor compose, so the ones
139
- * fired inside this shadow root reach nobody outside it. A consumer had a
140
- * reflected attribute and a `MutationObserver` and nothing else. Re-emitting
141
- * from the host is what `relayNativeEvent` is for, and it is what `Avatar`
142
- * already did for the same pair on the same element.
134
+ * fired inside this shadow root reach nobody outside it. Re-emitting from the
135
+ * host is what `relayNativeEvent` is for, and it is what `Avatar` already does
136
+ * for the same pair on the same element.
143
137
  *
144
- * **These were `helix-load` and `helix-error`, and the rename is the fix.**
145
- * The argument for a prefix is a collision with a native name, and there was
146
- * none to collide with here: the native events cannot reach a consumer at
147
- * all. So the prefix bought nothing and cost the two spellings this library
148
- * had for one idea, `Avatar` relaying `load` while `Image` invented one. See
149
- * 294 and 295.
138
+ * **Unprefixed, unlike every other event here.** The prefix exists to stop a
139
+ * collision with a native name, and there is none to collide with: the native
140
+ * events cannot reach a consumer at all.
150
141
  *
151
- * **Not bubbling, and that is not a small point.** The retired events were
152
- * `bubbles: true, composed: true` deliberately, so a gallery could count its
153
- * pictures with one listener. A bubbling relay of `load` reaches nothing in
154
- * React: `load` is in react-dom's `nonDelegatedEvents`, so there is no root
142
+ * **Not bubbling, and that is not a small point.** A bubbling relay of `load`
143
+ * would be the tempting one, letting a gallery count its pictures with one
144
+ * listener, and it reaches nothing in React: `load` is in react-dom's
145
+ * `nonDelegatedEvents`, so there is no root
155
146
  * listener to catch it, and React attaches a direct one for `<img>` and never
156
147
  * for a custom element. `bindReactHandler` binds exactly the non-bubbling
157
148
  * ones, so matching the native propagation is what makes `onLoad` work at
@@ -173,8 +164,8 @@ export declare class HelixHeadlessImage extends HelixElement {
173
164
  * **It can only ever conclude success.** A picture that has not been attempted
174
165
  * looks exactly like one that failed: `complete` is true and `naturalWidth` is
175
166
  * zero for both, and a DOM that never fetches anything reports that for every
176
- * image it has. Deciding `error` here called every picture broken the moment
177
- * it rendered. Failure has an event of its own and that event is reliable, so
167
+ * image it has, so deciding `error` here calls every picture broken the moment
168
+ * it renders. Failure has an event of its own and that event is reliable, so
178
169
  * this is only here to catch the success that happened too early to hear.
179
170
  */
180
171
  private settle;
@@ -184,12 +175,11 @@ export declare class HelixHeadlessImage extends HelixElement {
184
175
  /**
185
176
  * The picture's own state, under the platform's own names.
186
177
  *
187
- * The `<img>` is inside this shadow root, so a consumer asking how big the
188
- * picture turned out to be, or whether it is already there, had nowhere to
189
- * ask: `querySelector` does not cross a shadow boundary. `status` answers a
190
- * narrower question and answers it in this library's words, which is the
191
- * right report for the three states this element draws and is not a
192
- * substitute for the numbers.
178
+ * The `<img>` is inside this shadow root and `querySelector` does not cross a
179
+ * shadow boundary, so a consumer asking how big the picture turned out to be,
180
+ * or whether it is already there, has nowhere else to ask. `status` answers a
181
+ * narrower question in this library's words and is no substitute for the
182
+ * numbers.
193
183
  *
194
184
  * `naturalWidth` and `naturalHeight` are the case worth having: they are how
195
185
  * a consumer sizes a lightbox or works out an aspect ratio, and they exist
@@ -57,10 +57,6 @@ import { property, state } from 'lit/decorators.js';
57
57
  let HelixHeadlessImage = class HelixHeadlessImage extends HelixElement {
58
58
  constructor() {
59
59
  super(...arguments);
60
- /**
61
- * Where the picture is.
62
- */
63
- this.src = '';
64
60
  /**
65
61
  * What it shows, for a reader who cannot see it.
66
62
  *
@@ -69,13 +65,18 @@ let HelixHeadlessImage = class HelixHeadlessImage extends HelixElement {
69
65
  */
70
66
  this.alt = '';
71
67
  /**
72
- * The candidate widths, passed through to the picture.
68
+ * How the picture is fetched across origins, which decides whether a canvas
69
+ * can read it.
73
70
  */
74
- this.srcset = '';
71
+ this.crossOrigin = null;
75
72
  /**
76
- * How much of the line it will take, passed through to the picture.
73
+ * Whether the browser may decode off the main thread.
74
+ *
75
+ * `async` is the resting value and right for a picture in a page. `sync` is
76
+ * what a consumer reaches for when the picture is about to be composited with
77
+ * something else and a tear would show.
77
78
  */
78
- this.sizes = '';
79
+ this.decoding = 'async';
79
80
  /**
80
81
  * How urgently to fetch it, for the one picture that is the page.
81
82
  *
@@ -87,25 +88,21 @@ let HelixHeadlessImage = class HelixHeadlessImage extends HelixElement {
87
88
  */
88
89
  this.fetchPriority = 'auto';
89
90
  /**
90
- * Whether the browser may decode off the main thread.
91
- *
92
- * **The template hardcoded `async` and a consumer could not reach it**, which
93
- * is worse than the property being absent: the decision was taken on their
94
- * behalf and nothing said so. `async` is still the resting value and still
95
- * right for a picture in a page, and `sync` is what a consumer reaches for
96
- * when the picture is about to be composited with something else and a tear
97
- * would show.
91
+ * How much of the referring URL to send with the request.
98
92
  */
99
- this.decoding = 'async';
93
+ this.referrerPolicy = '';
100
94
  /**
101
- * How the picture is fetched across origins, which decides whether a canvas
102
- * can read it.
95
+ * How much of the line it will take, passed through to the picture.
103
96
  */
104
- this.crossOrigin = null;
97
+ this.sizes = '';
105
98
  /**
106
- * How much of the referring URL to send with the request.
99
+ * Where the picture is.
107
100
  */
108
- this.referrerPolicy = '';
101
+ this.src = '';
102
+ /**
103
+ * The candidate widths, passed through to the picture.
104
+ */
105
+ this.srcset = '';
109
106
  /**
110
107
  * Whether the picture is on its way, here, or never coming.
111
108
  *
@@ -116,14 +113,12 @@ let HelixHeadlessImage = class HelixHeadlessImage extends HelixElement {
116
113
  * a consumer rendered: React reads the attribute appearing at upgrade as a
117
114
  * hydration mismatch, and a serialized `<helix-image status="loaded">` pasted
118
115
  * back declares that a picture has arrived which this element has never
119
- * fetched. The `data-` name is the library's answer to both, being a
120
- * different name a re-parse cannot mistake for a declaration, and it is what
121
- * `data-closed` on `Toast.Item` already does, and `AppHeader` did until its
122
- * own moved to `:state(scrolled)` for the hydration reason recorded there.
123
- * A picture arrives after somebody fetched it, which puts this on the safe
124
- * side of hydration: a fact that can be true on the *first* update mirrors to
125
- * a custom state instead, which is what `:state(open)` and `:state(checked)`
126
- * became on 27 Aug 2026 for exactly that reason.
116
+ * fetched. The `data-` name is the library's answer to both, being a name a
117
+ * re-parse cannot mistake for a declaration, and it is what `data-closed` on
118
+ * `Toast.Item` already does. A picture arrives after somebody fetched it,
119
+ * which puts this on the safe side of hydration: a fact that can be true on
120
+ * the *first* update mirrors to a custom state instead, which is what
121
+ * `:state(open)` and `:state(checked)` are.
127
122
  *
128
123
  * `loading` writes nothing, because it is where every image starts and the
129
124
  * resting state of a mirror is the attribute's absence.
@@ -144,22 +139,18 @@ let HelixHeadlessImage = class HelixHeadlessImage extends HelixElement {
144
139
  * Says so under the platform's own name, because the platform's cannot escape.
145
140
  *
146
141
  * `load` and `error` on an `<img>` neither bubble nor compose, so the ones
147
- * fired inside this shadow root reach nobody outside it. A consumer had a
148
- * reflected attribute and a `MutationObserver` and nothing else. Re-emitting
149
- * from the host is what `relayNativeEvent` is for, and it is what `Avatar`
150
- * already did for the same pair on the same element.
142
+ * fired inside this shadow root reach nobody outside it. Re-emitting from the
143
+ * host is what `relayNativeEvent` is for, and it is what `Avatar` already does
144
+ * for the same pair on the same element.
151
145
  *
152
- * **These were `helix-load` and `helix-error`, and the rename is the fix.**
153
- * The argument for a prefix is a collision with a native name, and there was
154
- * none to collide with here: the native events cannot reach a consumer at
155
- * all. So the prefix bought nothing and cost the two spellings this library
156
- * had for one idea, `Avatar` relaying `load` while `Image` invented one. See
157
- * 294 and 295.
146
+ * **Unprefixed, unlike every other event here.** The prefix exists to stop a
147
+ * collision with a native name, and there is none to collide with: the native
148
+ * events cannot reach a consumer at all.
158
149
  *
159
- * **Not bubbling, and that is not a small point.** The retired events were
160
- * `bubbles: true, composed: true` deliberately, so a gallery could count its
161
- * pictures with one listener. A bubbling relay of `load` reaches nothing in
162
- * React: `load` is in react-dom's `nonDelegatedEvents`, so there is no root
150
+ * **Not bubbling, and that is not a small point.** A bubbling relay of `load`
151
+ * would be the tempting one, letting a gallery count its pictures with one
152
+ * listener, and it reaches nothing in React: `load` is in react-dom's
153
+ * `nonDelegatedEvents`, so there is no root
163
154
  * listener to catch it, and React attaches a direct one for `<img>` and never
164
155
  * for a custom element. `bindReactHandler` binds exactly the non-bubbling
165
156
  * ones, so matching the native propagation is what makes `onLoad` work at
@@ -192,8 +183,8 @@ let HelixHeadlessImage = class HelixHeadlessImage extends HelixElement {
192
183
  * **It can only ever conclude success.** A picture that has not been attempted
193
184
  * looks exactly like one that failed: `complete` is true and `naturalWidth` is
194
185
  * zero for both, and a DOM that never fetches anything reports that for every
195
- * image it has. Deciding `error` here called every picture broken the moment
196
- * it rendered. Failure has an event of its own and that event is reliable, so
186
+ * image it has, so deciding `error` here calls every picture broken the moment
187
+ * it renders. Failure has an event of its own and that event is reliable, so
197
188
  * this is only here to catch the success that happened too early to hear.
198
189
  */
199
190
  settle() {
@@ -237,12 +228,11 @@ let HelixHeadlessImage = class HelixHeadlessImage extends HelixElement {
237
228
  /**
238
229
  * The picture's own state, under the platform's own names.
239
230
  *
240
- * The `<img>` is inside this shadow root, so a consumer asking how big the
241
- * picture turned out to be, or whether it is already there, had nowhere to
242
- * ask: `querySelector` does not cross a shadow boundary. `status` answers a
243
- * narrower question and answers it in this library's words, which is the
244
- * right report for the three states this element draws and is not a
245
- * substitute for the numbers.
231
+ * The `<img>` is inside this shadow root and `querySelector` does not cross a
232
+ * shadow boundary, so a consumer asking how big the picture turned out to be,
233
+ * or whether it is already there, has nowhere else to ask. `status` answers a
234
+ * narrower question in this library's words and is no substitute for the
235
+ * numbers.
246
236
  *
247
237
  * `naturalWidth` and `naturalHeight` are the case worth having: they are how
248
238
  * a consumer sizes a lightbox or works out an aspect ratio, and they exist
@@ -298,31 +288,31 @@ let HelixHeadlessImage = class HelixHeadlessImage extends HelixElement {
298
288
  };
299
289
  __decorate([
300
290
  property()
301
- ], HelixHeadlessImage.prototype, "src", void 0);
291
+ ], HelixHeadlessImage.prototype, "alt", void 0);
292
+ __decorate([
293
+ property({ attribute: 'crossorigin' })
294
+ ], HelixHeadlessImage.prototype, "crossOrigin", void 0);
302
295
  __decorate([
303
296
  property()
304
- ], HelixHeadlessImage.prototype, "alt", void 0);
297
+ ], HelixHeadlessImage.prototype, "decoding", void 0);
298
+ __decorate([
299
+ property({ attribute: 'fetchpriority' })
300
+ ], HelixHeadlessImage.prototype, "fetchPriority", void 0);
305
301
  __decorate([
306
302
  property({ reflect: true })
307
303
  ], HelixHeadlessImage.prototype, "loading", void 0);
308
304
  __decorate([
309
- property()
310
- ], HelixHeadlessImage.prototype, "srcset", void 0);
305
+ property({ attribute: 'referrerpolicy' })
306
+ ], HelixHeadlessImage.prototype, "referrerPolicy", void 0);
311
307
  __decorate([
312
308
  property()
313
309
  ], HelixHeadlessImage.prototype, "sizes", void 0);
314
- __decorate([
315
- property({ attribute: 'fetchpriority' })
316
- ], HelixHeadlessImage.prototype, "fetchPriority", void 0);
317
310
  __decorate([
318
311
  property()
319
- ], HelixHeadlessImage.prototype, "decoding", void 0);
320
- __decorate([
321
- property({ attribute: 'crossorigin' })
322
- ], HelixHeadlessImage.prototype, "crossOrigin", void 0);
312
+ ], HelixHeadlessImage.prototype, "src", void 0);
323
313
  __decorate([
324
- property({ attribute: 'referrerpolicy' })
325
- ], HelixHeadlessImage.prototype, "referrerPolicy", void 0);
314
+ property()
315
+ ], HelixHeadlessImage.prototype, "srcset", void 0);
326
316
  __decorate([
327
317
  property({ attribute: false })
328
318
  ], HelixHeadlessImage.prototype, "status", void 0);
package/dist/index.d.ts CHANGED
@@ -2,11 +2,11 @@ import './element-events.generated.js';
2
2
  /**
3
3
  * Everything core exports, forwarded whole.
4
4
  *
5
- * Named individually before, and the list drifted every time a component used
6
- * something new: a value-change event, a placement type, a close event. Each
7
- * one compiled here and broke in the generated React package, which imports
8
- * the type a public property is declared with. Forwarding the module has
9
- * nothing to keep in step.
5
+ * Not a named list. The generated React package imports the type each public
6
+ * property is declared with, so anything a component newly reaches for (a
7
+ * value-change event, a placement type, a close event) compiles here and breaks
8
+ * there the moment the list misses it. Forwarding the module has nothing to
9
+ * keep in step.
10
10
  */
11
11
  export * from '@fusion.dev/helix-core';
12
12
  export * from './accordion/index.js';
package/dist/index.js CHANGED
@@ -2,11 +2,11 @@ import './element-events.generated.js';
2
2
  /**
3
3
  * Everything core exports, forwarded whole.
4
4
  *
5
- * Named individually before, and the list drifted every time a component used
6
- * something new: a value-change event, a placement type, a close event. Each
7
- * one compiled here and broke in the generated React package, which imports
8
- * the type a public property is declared with. Forwarding the module has
9
- * nothing to keep in step.
5
+ * Not a named list. The generated React package imports the type each public
6
+ * property is declared with, so anything a component newly reaches for (a
7
+ * value-change event, a placement type, a close event) compiles here and breaks
8
+ * there the moment the list misses it. Forwarding the module has nothing to
9
+ * keep in step.
10
10
  */
11
11
  export * from '@fusion.dev/helix-core';
12
12
  export * from './accordion/index.js';
@@ -28,19 +28,12 @@ declare const HelixHeadlessInput_base: (new (...args: any[]) => import("@fusion.
28
28
  * here guesses. What this adds is the anchor, so `reportValidity` points the
29
29
  * bubble at the input rather than at the host.
30
30
  *
31
- * `pattern`, `minlength` and `maxlength` are forwarded with them. They were
32
- * promised by this paragraph and did not exist, so a consumer following the
33
- * sentence wrote an attribute on the host that reached no input and constrained
34
- * nothing: the field looked as though it were checked and was not.
31
+ * `pattern`, `minlength` and `maxlength` are forwarded with them.
35
32
  *
36
- * **`clearable` and `reveal` are the field's, not the consumer's.** The `end`
37
- * slot used to be the answer to both, which meant every consumer of
38
- * `type="search"` built the same button and every consumer of
39
- * `type="password"` either built the same toggle or shipped a field a reader
40
- * cannot check what they typed into. Neither is a slot's worth of variation:
41
- * one empties the value, the other flips the type, and both want the same
42
- * position, the same size and the same disabled behavior. The slot stays for
43
- * what actually varies, a unit or a prefix.
33
+ * **`clearable` and `reveal` are the field's, not the consumer's.** Neither is
34
+ * a slot's worth of variation: one empties the value, the other flips the type,
35
+ * and both want the same position, the same size and the same disabled
36
+ * behavior. The `end` slot stays for what actually varies, a unit or a prefix.
44
37
  *
45
38
  * Both opt in rather than following from `type`, and are booleans that default
46
39
  * to false. A Lit boolean property that defaults to *true* cannot be turned off
@@ -67,7 +60,6 @@ declare const HelixHeadlessInput_base: (new (...args: any[]) => import("@fusion.
67
60
  * @csspart feedback - What is wrong with it.
68
61
  * @csspart field - The box holding everything.
69
62
  * @csspart hint - Help under the field, while nothing is wrong.
70
- * @csspart icon - A glyph this component draws.
71
63
  * @csspart label - The question, over the field.
72
64
  * @csspart reveal - The button that shows and hides a password.
73
65
  */
@@ -82,54 +74,6 @@ export declare class HelixHeadlessInput extends HelixHeadlessInput_base {
82
74
  * a token like `email` or `bday` to ask for autofill, or to `off` to refuse.
83
75
  */
84
76
  autocomplete: string;
85
- /**
86
- * Shown while the field is empty.
87
- *
88
- * Not a label: it goes when typing starts.
89
- */
90
- placeholder: string;
91
- /**
92
- * Whether the field refuses input while still submitting its value.
93
- *
94
- * **`readonly`, which is the platform's spelling, and it was `read-only`
95
- * until 28 Aug 2026.** A camelCase property needs an explicit `attribute`
96
- * and the library had been answering that question two ways: thirteen
97
- * attributes kept the name HTML uses (`crossorigin`, `maxlength`,
98
- * `formnovalidate`, `dirname` and the rest) and five dash-cased a word the
99
- * platform writes as one. `readonly` was the only one on both lists, this
100
- * spelling on `Rating` and `read-only` on the eight other fields, so one
101
- * library shipped both and each was inert on the other's families.
102
- *
103
- * The cost of the dash-cased form is the one this repository keeps writing
104
- * down about attributes: nothing warns. `<helix-input readonly>` is what
105
- * anybody who has written HTML types, it parsed to no property at all, and
106
- * the field stayed editable with no error anywhere. Measured before the
107
- * rename: `readOnly` came back `false`.
108
- *
109
- * Taken now for the reason [#213](../../../../../docs/19-queue.md) gives
110
- * about the part it renamed for the same kind of reason: there is no
111
- * `helix-v` tag, so no consumer is holding the old spelling, and this is free
112
- * today and a deprecation after the first release.
113
- * `check:attribute-names` holds it from here.
114
- */
115
- readOnly: boolean;
116
- /**
117
- * What the field accepts, which decides the keyboard and the validation.
118
- *
119
- * **Not reflected**, and it was. Reflection exists so a selector can reach a
120
- * value, and no stylesheet in this repository selects on `type`: what it did
121
- * instead was write `type="text"` onto every `<helix-input>` ever rendered,
122
- * an attribute no consumer's markup had. That is precisely the fault `Button`
123
- * had with `href`, `target` and `rel`, written up in the area rules as the
124
- * reason the rule exists, and this was the last property in the library still
125
- * doing it. Audited: ten reflected attributes have no selector anywhere, and
126
- * this is the only one of them with a value that puts itself on the host.
127
- *
128
- * Nothing reads it from the attribute either. The real `<input>` inside takes
129
- * it as a property binding, which is what makes the keyboard and the
130
- * validation follow.
131
- */
132
- type: InputType;
133
77
  /**
134
78
  * Whether the field offers a button that empties it.
135
79
  *
@@ -144,20 +88,44 @@ export declare class HelixHeadlessInput extends HelixHeadlessInput_base {
144
88
  */
145
89
  clearLabel: string;
146
90
  /**
147
- * Whether a password field offers a toggle that shows what was typed.
91
+ * Most characters the value may have.
92
+ */
93
+ maxLength?: number;
94
+ /**
95
+ * Fewest characters the value may have.
96
+ */
97
+ minLength?: number;
98
+ /**
99
+ * A regular expression the value has to match, as the platform reads it.
148
100
  *
149
- * Ignored on every other type. A reveal on an email field would be a button
150
- * that does nothing visible, and guarding it here rather than asking the
151
- * consumer not to means the property can be set once on a component that
152
- * changes type.
101
+ * Forwarded rather than checked here, which is the whole reason validity is
102
+ * the platform's: the browser knows what a `pattern` means, anchors it at both
103
+ * ends, and produces the message in the reader's own language.
153
104
  */
154
- reveal: boolean;
105
+ pattern: string;
155
106
  /**
156
- * What the reveal toggle is called.
107
+ * Shown while the field is empty.
157
108
  *
158
- * The state is `aria-pressed`, not this.
109
+ * Not a label: it goes when typing starts.
159
110
  */
160
- revealLabel: string;
111
+ placeholder: string;
112
+ /**
113
+ * Whether the field refuses input while still submitting its value.
114
+ *
115
+ * **The attribute is `readonly`, which is the platform's spelling.** A
116
+ * camelCase property needs an explicit `attribute`, and dash-casing a word
117
+ * HTML writes as one costs what an attribute always costs here: nothing
118
+ * warns. `<helix-input readonly>` is what anybody who has written HTML types;
119
+ * against `read-only` it parses to no property at all, and the field stays
120
+ * editable with no error anywhere. Measured on the dash-cased form, `readOnly`
121
+ * came back `false`.
122
+ *
123
+ * A part was renamed for
124
+ * the same kind of reason: there is no `helix-v` tag, so no consumer is
125
+ * holding the old spelling, and this is free today and a deprecation after
126
+ * the first release.
127
+ */
128
+ readOnly: boolean;
161
129
  /**
162
130
  * Whether the password is currently showing.
163
131
  *
@@ -187,7 +155,7 @@ export declare class HelixHeadlessInput extends HelixHeadlessInput_base {
187
155
  * the boundary. An insert-at-cursor toolbar, a format button, a mask that
188
156
  * repositions the caret after rewriting the value, all of them need this and
189
157
  * none of them could be written. Textarea gained the same surface for the same
190
- * reason. See 295.
158
+ * reason.
191
159
  *
192
160
  * Zero before there is a control, which is where an empty field's caret would
193
161
  * be anyway.
@@ -251,26 +219,34 @@ export declare class HelixHeadlessInput extends HelixHeadlessInput_base {
251
219
  protected willUpdate(changed: PropertyValues): void;
252
220
  protected updated(changed: PropertyValues): void;
253
221
  /**
254
- * A regular expression the value has to match, as the platform reads it.
255
- *
256
- * The class documentation promised `pattern` and `minlength` "and the rest"
257
- * were set on the real input, and no such properties existed: a consumer
258
- * following that sentence wrote an attribute on the host, it reached no input,
259
- * and the field constrained nothing while looking as though it did.
222
+ * Whether a password field offers a toggle that shows what was typed.
260
223
  *
261
- * Forwarded rather than checked here, which is the whole reason validity is
262
- * the platform's: the browser knows what a `pattern` means, anchors it at both
263
- * ends, and produces the message in the reader's own language.
224
+ * Ignored on every other type. A reveal on an email field would be a button
225
+ * that does nothing visible, and guarding it here rather than asking the
226
+ * consumer not to means the property can be set once on a component that
227
+ * changes type.
264
228
  */
265
- pattern: string;
229
+ reveal: boolean;
266
230
  /**
267
- * Fewest characters the value may have.
231
+ * What the reveal toggle is called.
232
+ *
233
+ * The state is `aria-pressed`, not this.
268
234
  */
269
- minLength?: number;
235
+ revealLabel: string;
270
236
  /**
271
- * Most characters the value may have.
237
+ * What the field accepts, which decides the keyboard and the validation.
238
+ *
239
+ * **Not reflected.** Reflection exists so a selector can reach a value, and
240
+ * no stylesheet in this repository selects on `type`. Reflecting it writes
241
+ * `type="text"` onto every `<helix-input>` ever rendered, an attribute no
242
+ * consumer's markup has, which is the fault the area rules write up under
243
+ * `Button`'s `href`, `target` and `rel`.
244
+ *
245
+ * Nothing reads it from the attribute either. The real `<input>` inside takes
246
+ * it as a property binding, which is what makes the keyboard and the
247
+ * validation follow.
272
248
  */
273
- maxLength?: number;
249
+ type: InputType;
274
250
  protected render(): TemplateResult;
275
251
  }
276
252
  declare global {