@fusion.dev/helix-headless 0.47.1 → 0.49.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.
package/types/jsx.d.ts CHANGED
@@ -18,6 +18,7 @@ import type {
18
18
  HelixDismissEvent,
19
19
  HelixFacetEvent,
20
20
  HelixFilterEvent,
21
+ HelixFormElement,
21
22
  HelixHeadlessAccordion,
22
23
  HelixHeadlessAccordionItem,
23
24
  HelixHeadlessAnnouncement,
@@ -3154,6 +3155,67 @@ answer to which one is authoritative or which has the caret. Do not close it
3154
3155
  the other way round, with Color Input dropping its own field: the value
3155
3156
  would then be unreadable and unpasteable without opening a panel. */
3156
3157
  noValue?: (HelixHeadlessColorPicker["noValue"]) | undefined;
3158
+ /** Whether the control refuses changes while still submitting its value.
3159
+
3160
+ **Enforced by refusing every request in one place**, which is the seam this
3161
+ component already has: `requestValue` is what every path here comes through,
3162
+ and gating it once is what stops the next call site from being written
3163
+ without the check.
3164
+
3165
+ Not `disabled`, which is the confusion worth naming: a disabled control
3166
+ submits nothing and leaves the tab order, and a read-only one submits its
3167
+ value and stays reachable, which is what a form showing a color somebody
3168
+ else set needs.
3169
+
3170
+ **One gate is not enough here, and the second is `move`.** This picker
3171
+ holds a model beside its value, which Date Picker and Time Picker do not:
3172
+ `moved` is the HSB the square is drawn from, and it is written before the
3173
+ value is requested. Gating only the request would leave the square under
3174
+ the reader's pointer and the value where it was, which is a control that
3175
+ refuses and looks like it accepted. */
3176
+ readonly?: (HelixHeadlessColorPicker["readOnly"]) | undefined;
3177
+ /** Whether the control refuses changes while still submitting its value.
3178
+
3179
+ **Enforced by refusing every request in one place**, which is the seam this
3180
+ component already has: `requestValue` is what every path here comes through,
3181
+ and gating it once is what stops the next call site from being written
3182
+ without the check.
3183
+
3184
+ Not `disabled`, which is the confusion worth naming: a disabled control
3185
+ submits nothing and leaves the tab order, and a read-only one submits its
3186
+ value and stays reachable, which is what a form showing a color somebody
3187
+ else set needs.
3188
+
3189
+ **One gate is not enough here, and the second is `move`.** This picker
3190
+ holds a model beside its value, which Date Picker and Time Picker do not:
3191
+ `moved` is the HSB the square is drawn from, and it is written before the
3192
+ value is requested. Gating only the request would leave the square under
3193
+ the reader's pointer and the value where it was, which is a control that
3194
+ refuses and looks like it accepted. */
3195
+ readOnly?: (HelixHeadlessColorPicker["readOnly"]) | undefined;
3196
+ /** Whether the form refuses to submit while no color is chosen.
3197
+
3198
+ **A color is exactly as requirable as a date**, which is the comparison
3199
+ that settles it: this element extends `HelixFormElement`, carries `name`
3200
+ and reports its value, so a consumer writing
3201
+ `<helix-color-picker name="brand" required>` inside a form has every reason
3202
+ to expect the form to refuse an empty one. Its two siblings in the same
3203
+ composition position, Date Picker and Time Picker, both check it.
3204
+
3205
+ Written out rather than taken from `MixinField`, for the reason those two
3206
+ record: the mixin brings a label, a hint and a feedback region, and this is
3207
+ a panel composed *into* a field that already has all three, so taking it
3208
+ would give one control two of each. What is left is the validity call and
3209
+ the anchor the browser points its bubble at.
3210
+
3211
+ **Emptiness is the only fault reported, and bad input deliberately is
3212
+ not.** The value row is typed into a character at a time and every
3213
+ keystroke reaches `requestValue`, so `#0`, `#00` and `#00f` would each be a
3214
+ reported fault on the way to `#00ff00`. Date Picker and Time Picker can
3215
+ report bad input because their value moves only on a commit. Color Input
3216
+ reports it for this family instead, once, against the field the reader
3217
+ typed into. */
3218
+ required?: (HelixHeadlessColorPicker["required"]) | undefined;
3157
3219
  /** Colors offered under the picker, as a comma-separated list. */
3158
3220
  swatches?: (HelixHeadlessColorPicker["swatches"]) | undefined;
3159
3221
  /** The value the markup declared, which is where a reset returns to. */
@@ -3274,6 +3336,67 @@ answer to which one is authoritative or which has the caret. Do not close it
3274
3336
  the other way round, with Color Input dropping its own field: the value
3275
3337
  would then be unreadable and unpasteable without opening a panel. */
3276
3338
  "prop:noValue"?: (HelixHeadlessColorPicker["noValue"]) | undefined;
3339
+ /** Whether the control refuses changes while still submitting its value.
3340
+
3341
+ **Enforced by refusing every request in one place**, which is the seam this
3342
+ component already has: `requestValue` is what every path here comes through,
3343
+ and gating it once is what stops the next call site from being written
3344
+ without the check.
3345
+
3346
+ Not `disabled`, which is the confusion worth naming: a disabled control
3347
+ submits nothing and leaves the tab order, and a read-only one submits its
3348
+ value and stays reachable, which is what a form showing a color somebody
3349
+ else set needs.
3350
+
3351
+ **One gate is not enough here, and the second is `move`.** This picker
3352
+ holds a model beside its value, which Date Picker and Time Picker do not:
3353
+ `moved` is the HSB the square is drawn from, and it is written before the
3354
+ value is requested. Gating only the request would leave the square under
3355
+ the reader's pointer and the value where it was, which is a control that
3356
+ refuses and looks like it accepted. */
3357
+ "bool:readonly"?: (HelixHeadlessColorPicker["readOnly"]) | undefined;
3358
+ /** Whether the control refuses changes while still submitting its value.
3359
+
3360
+ **Enforced by refusing every request in one place**, which is the seam this
3361
+ component already has: `requestValue` is what every path here comes through,
3362
+ and gating it once is what stops the next call site from being written
3363
+ without the check.
3364
+
3365
+ Not `disabled`, which is the confusion worth naming: a disabled control
3366
+ submits nothing and leaves the tab order, and a read-only one submits its
3367
+ value and stays reachable, which is what a form showing a color somebody
3368
+ else set needs.
3369
+
3370
+ **One gate is not enough here, and the second is `move`.** This picker
3371
+ holds a model beside its value, which Date Picker and Time Picker do not:
3372
+ `moved` is the HSB the square is drawn from, and it is written before the
3373
+ value is requested. Gating only the request would leave the square under
3374
+ the reader's pointer and the value where it was, which is a control that
3375
+ refuses and looks like it accepted. */
3376
+ "prop:readOnly"?: (HelixHeadlessColorPicker["readOnly"]) | undefined;
3377
+ /** Whether the form refuses to submit while no color is chosen.
3378
+
3379
+ **A color is exactly as requirable as a date**, which is the comparison
3380
+ that settles it: this element extends `HelixFormElement`, carries `name`
3381
+ and reports its value, so a consumer writing
3382
+ `<helix-color-picker name="brand" required>` inside a form has every reason
3383
+ to expect the form to refuse an empty one. Its two siblings in the same
3384
+ composition position, Date Picker and Time Picker, both check it.
3385
+
3386
+ Written out rather than taken from `MixinField`, for the reason those two
3387
+ record: the mixin brings a label, a hint and a feedback region, and this is
3388
+ a panel composed *into* a field that already has all three, so taking it
3389
+ would give one control two of each. What is left is the validity call and
3390
+ the anchor the browser points its bubble at.
3391
+
3392
+ **Emptiness is the only fault reported, and bad input deliberately is
3393
+ not.** The value row is typed into a character at a time and every
3394
+ keystroke reaches `requestValue`, so `#0`, `#00` and `#00f` would each be a
3395
+ reported fault on the way to `#00ff00`. Date Picker and Time Picker can
3396
+ report bad input because their value moves only on a commit. Color Input
3397
+ reports it for this family instead, once, against the field the reader
3398
+ typed into. */
3399
+ "prop:required"?: (HelixHeadlessColorPicker["required"]) | undefined;
3277
3400
  /** Colors offered under the picker, as a comma-separated list. */
3278
3401
  "prop:swatches"?: (HelixHeadlessColorPicker["swatches"]) | undefined;
3279
3402
  /** The value the markup declared, which is where a reset returns to. */
@@ -11901,7 +12024,41 @@ export type HelixHeadlessRatingProps = {
11901
12024
  Zero rather than one, because "no rating" and "the worst rating" are
11902
12025
  different answers and a control that cannot express the first has to
11903
12026
  pretend the second. A survey that requires an answer says so with
11904
- `required`, not by making one unreachable. */
12027
+ `required`, not by making one unreachable.
12028
+
12029
+ **It is the floor of the scale, and every edge follows from that.**
12030
+
12031
+ *Clearing* returns the row to it. An empty rating, a value nothing can
12032
+ parse, and a form reset with nothing declared are all the same situation,
12033
+ and all three draw `min` filled: at the default of zero that is the empty
12034
+ row this always drew, and at `min="2"` it is two marks, the way an empty
12035
+ `Slider` sits at its own minimum rather than at zero. The value is still
12036
+ `""` through all of it, so `required` still refuses it and `valueAsNumber`
12037
+ is still `NaN`: what the row shows is the bottom of the scale, not an
12038
+ answer somebody gave.
12039
+
12040
+ *The steps* are the scores from `step` up to `max` that are not below it,
12041
+ so `min="2"` on five marks offers 2 to 5 and leaves the first two marks
12042
+ filled and unpressable. At zero nothing is dropped, which is why the
12043
+ default row is unchanged.
12044
+
12045
+ *The keyboard* moves through those steps and no others. `wrap` is already
12046
+ false here, so arrowing down from the lowest one holds its ground rather
12047
+ than reaching a score this property forbids, and the tab stop an unrated
12048
+ rating carries sits on the lowest score offered rather than on the first
12049
+ mark.
12050
+
12051
+ *A `min` between two steps* is a floor and not a step: `min="1.5"` with
12052
+ whole marks clamps the value at 1.5 and offers 2 upward, since 1.5 is not
12053
+ somewhere the row can be pressed. That is a real thing to ask for and is
12054
+ left to mean what it says.
12055
+
12056
+ *A `min` outside the marks is refused rather than obeyed*, and says so
12057
+ once on the console. Below zero and anything that is not a number are read
12058
+ as zero, there being no mark to draw for a negative score; above `max` is
12059
+ read as `max`, which collapses the scale to its top score rather than
12060
+ leaving a rating with nothing to press. A property that silently accepts
12061
+ nonsense is the fault this pays off, so neither case is quietly ignored. */
11905
12062
  min?: (HelixHeadlessRating["min"]) | undefined;
11906
12063
  /** Whether this shows a score rather than asks for one.
11907
12064
 
@@ -12024,7 +12181,41 @@ export type HelixHeadlessRatingSolidJsProps = {
12024
12181
  Zero rather than one, because "no rating" and "the worst rating" are
12025
12182
  different answers and a control that cannot express the first has to
12026
12183
  pretend the second. A survey that requires an answer says so with
12027
- `required`, not by making one unreachable. */
12184
+ `required`, not by making one unreachable.
12185
+
12186
+ **It is the floor of the scale, and every edge follows from that.**
12187
+
12188
+ *Clearing* returns the row to it. An empty rating, a value nothing can
12189
+ parse, and a form reset with nothing declared are all the same situation,
12190
+ and all three draw `min` filled: at the default of zero that is the empty
12191
+ row this always drew, and at `min="2"` it is two marks, the way an empty
12192
+ `Slider` sits at its own minimum rather than at zero. The value is still
12193
+ `""` through all of it, so `required` still refuses it and `valueAsNumber`
12194
+ is still `NaN`: what the row shows is the bottom of the scale, not an
12195
+ answer somebody gave.
12196
+
12197
+ *The steps* are the scores from `step` up to `max` that are not below it,
12198
+ so `min="2"` on five marks offers 2 to 5 and leaves the first two marks
12199
+ filled and unpressable. At zero nothing is dropped, which is why the
12200
+ default row is unchanged.
12201
+
12202
+ *The keyboard* moves through those steps and no others. `wrap` is already
12203
+ false here, so arrowing down from the lowest one holds its ground rather
12204
+ than reaching a score this property forbids, and the tab stop an unrated
12205
+ rating carries sits on the lowest score offered rather than on the first
12206
+ mark.
12207
+
12208
+ *A `min` between two steps* is a floor and not a step: `min="1.5"` with
12209
+ whole marks clamps the value at 1.5 and offers 2 upward, since 1.5 is not
12210
+ somewhere the row can be pressed. That is a real thing to ask for and is
12211
+ left to mean what it says.
12212
+
12213
+ *A `min` outside the marks is refused rather than obeyed*, and says so
12214
+ once on the console. Below zero and anything that is not a number are read
12215
+ as zero, there being no mark to draw for a negative score; above `max` is
12216
+ read as `max`, which collapses the scale to its top score rather than
12217
+ leaving a rating with nothing to press. A property that silently accepts
12218
+ nonsense is the fault this pays off, so neither case is quietly ignored. */
12028
12219
  "prop:min"?: (HelixHeadlessRating["min"]) | undefined;
12029
12220
  /** Whether this shows a score rather than asks for one.
12030
12221
 
@@ -20671,6 +20862,46 @@ export type CustomElements = {
20671
20862
  * answer to which one is authoritative or which has the caret. Do not close it
20672
20863
  * the other way round, with Color Input dropping its own field: the value
20673
20864
  * would then be unreadable and unpasteable without opening a panel.
20865
+ * - `readonly`/`readOnly`: Whether the control refuses changes while still submitting its value.
20866
+ *
20867
+ * **Enforced by refusing every request in one place**, which is the seam this
20868
+ * component already has: `requestValue` is what every path here comes through,
20869
+ * and gating it once is what stops the next call site from being written
20870
+ * without the check.
20871
+ *
20872
+ * Not `disabled`, which is the confusion worth naming: a disabled control
20873
+ * submits nothing and leaves the tab order, and a read-only one submits its
20874
+ * value and stays reachable, which is what a form showing a color somebody
20875
+ * else set needs.
20876
+ *
20877
+ * **One gate is not enough here, and the second is `move`.** This picker
20878
+ * holds a model beside its value, which Date Picker and Time Picker do not:
20879
+ * `moved` is the HSB the square is drawn from, and it is written before the
20880
+ * value is requested. Gating only the request would leave the square under
20881
+ * the reader's pointer and the value where it was, which is a control that
20882
+ * refuses and looks like it accepted.
20883
+ * - `required`: Whether the form refuses to submit while no color is chosen.
20884
+ *
20885
+ * **A color is exactly as requirable as a date**, which is the comparison
20886
+ * that settles it: this element extends `HelixFormElement`, carries `name`
20887
+ * and reports its value, so a consumer writing
20888
+ * `<helix-color-picker name="brand" required>` inside a form has every reason
20889
+ * to expect the form to refuse an empty one. Its two siblings in the same
20890
+ * composition position, Date Picker and Time Picker, both check it.
20891
+ *
20892
+ * Written out rather than taken from `MixinField`, for the reason those two
20893
+ * record: the mixin brings a label, a hint and a feedback region, and this is
20894
+ * a panel composed *into* a field that already has all three, so taking it
20895
+ * would give one control two of each. What is left is the validity call and
20896
+ * the anchor the browser points its bubble at.
20897
+ *
20898
+ * **Emptiness is the only fault reported, and bad input deliberately is
20899
+ * not.** The value row is typed into a character at a time and every
20900
+ * keystroke reaches `requestValue`, so `#0`, `#00` and `#00f` would each be a
20901
+ * reported fault on the way to `#00ff00`. Date Picker and Time Picker can
20902
+ * report bad input because their value moves only on a commit. Color Input
20903
+ * reports it for this family instead, once, against the field the reader
20904
+ * typed into.
20674
20905
  * - `swatches`: Colors offered under the picker, as a comma-separated list.
20675
20906
  * - `default-value`/`defaultValue`: The value the markup declared, which is where a reset returns to.
20676
20907
  * - `value`: What the control holds now, and what its form submits.
@@ -20748,14 +20979,8 @@ export type CustomElements = {
20748
20979
  *
20749
20980
  * Methods that can be called to access component functionality.
20750
20981
  *
20982
+ * - `requestValue(next: string) => boolean`: Refuses every change while read-only. See `readOnly`.
20751
20983
  * - `focus(options?: FocusOptions) => void`: Puts the keyboard on the square, which is the control a reader wants.
20752
- * - `requestValue(next: string) => boolean`: Requests a new value, and reports whether the request stood.
20753
- *
20754
- * Announces before it acts, so `preventDefault()` on the `helix-before-change` is
20755
- * a refusal and nothing moves. Nobody refusing means the control updates
20756
- * itself, whether or not a consumer declared `value`: a declared property
20757
- * is a seed and a correction, the way `<input value>` is, and a consumer
20758
- * who wants the change for themselves refuses it and assigns their own.
20759
20984
  * - `formResetCallback() => void`: Returns the control to the value its markup declared.
20760
20985
  *
20761
20986
  * Both halves are dropped, the consumer's and the control's, because a
@@ -29361,6 +29586,40 @@ export type CustomElements = {
29361
29586
  * different answers and a control that cannot express the first has to
29362
29587
  * pretend the second. A survey that requires an answer says so with
29363
29588
  * `required`, not by making one unreachable.
29589
+ *
29590
+ * **It is the floor of the scale, and every edge follows from that.**
29591
+ *
29592
+ * *Clearing* returns the row to it. An empty rating, a value nothing can
29593
+ * parse, and a form reset with nothing declared are all the same situation,
29594
+ * and all three draw `min` filled: at the default of zero that is the empty
29595
+ * row this always drew, and at `min="2"` it is two marks, the way an empty
29596
+ * `Slider` sits at its own minimum rather than at zero. The value is still
29597
+ * `""` through all of it, so `required` still refuses it and `valueAsNumber`
29598
+ * is still `NaN`: what the row shows is the bottom of the scale, not an
29599
+ * answer somebody gave.
29600
+ *
29601
+ * *The steps* are the scores from `step` up to `max` that are not below it,
29602
+ * so `min="2"` on five marks offers 2 to 5 and leaves the first two marks
29603
+ * filled and unpressable. At zero nothing is dropped, which is why the
29604
+ * default row is unchanged.
29605
+ *
29606
+ * *The keyboard* moves through those steps and no others. `wrap` is already
29607
+ * false here, so arrowing down from the lowest one holds its ground rather
29608
+ * than reaching a score this property forbids, and the tab stop an unrated
29609
+ * rating carries sits on the lowest score offered rather than on the first
29610
+ * mark.
29611
+ *
29612
+ * *A `min` between two steps* is a floor and not a step: `min="1.5"` with
29613
+ * whole marks clamps the value at 1.5 and offers 2 upward, since 1.5 is not
29614
+ * somewhere the row can be pressed. That is a real thing to ask for and is
29615
+ * left to mean what it says.
29616
+ *
29617
+ * *A `min` outside the marks is refused rather than obeyed*, and says so
29618
+ * once on the console. Below zero and anything that is not a number are read
29619
+ * as zero, there being no mark to draw for a negative score; above `max` is
29620
+ * read as `max`, which collapses the scale to its top score rather than
29621
+ * leaving a rating with nothing to press. A property that silently accepts
29622
+ * nonsense is the fault this pays off, so neither case is quietly ignored.
29364
29623
  * - `readonly`/`readOnly`: Whether this shows a score rather than asks for one.
29365
29624
  *
29366
29625
  * A readout is not a control that has been switched off. It takes no focus,
@@ -29518,14 +29777,15 @@ export type CustomElements = {
29518
29777
  *
29519
29778
  * - `--rating-full`: How many marks are wholly filled. (default: `undefined`)
29520
29779
  * - `--rating-part`: How much of the next mark is filled, 0 to 1. (default: `undefined`)
29521
- * - `--rating-step`: The width of one step, as a fraction of a mark. (default: `undefined`)
29522
- * - `--rating-steps`: How many steps one mark is divided into. (default: `undefined`)
29780
+ * - `--rating-step`: Which step along the row a target is, counting from one, whatever `min` leaves open. (default: `undefined`)
29781
+ * - `--rating-steps`: How many steps the whole row holds, which is `max` over `step`. (default: `undefined`)
29523
29782
  *
29524
29783
  * ## CSS Parts
29525
29784
  *
29526
29785
  * Custom selectors for styling elements within the component.
29527
29786
  *
29528
29787
  * - `feedback`: What is wrong with it.
29788
+ * - `field`: The row: the marks, and the score beside them.
29529
29789
  * - `fill`: The filled marks, clipped to the score.
29530
29790
  * - `hint`: Help under the marks, while nothing is wrong.
29531
29791
  * - `label`: The question, over the marks.
@@ -32726,6 +32986,19 @@ export type CustomElements = {
32726
32986
  * string, which is the whole reason the shape is that one. What each row *says*
32727
32987
  * is the reader's own convention, from `Intl`.
32728
32988
  *
32989
+ * **The chosen row is marked in the markup, not worked out on upgrade.** The
32990
+ * listbox is handed the answer as `.value`, and lit-ssr serializes no property
32991
+ * binding, so a served `value="09:30"` shipped ninety-six rows with nothing on
32992
+ * any of them saying which one it was: the mark arrived when the listbox
32993
+ * upgraded and ran `place`. So each option is given `selected` as well, which
32994
+ * is an attribute binding and does serve, and which the listbox then agrees
32995
+ * with rather than fights, `place` writing the same answer from the same value.
32996
+ * `selected` is the declaration a consumer writes on `Option` anywhere else in
32997
+ * the library, and Date Picker expresses its own choice as markup for the same
32998
+ * reason: a picker whose answer is invisible until a script runs is a picker
32999
+ * whose answer is not served at all. Both readings do it, the list and the
33000
+ * wheels, a wheel being a listbox like the list is.
33001
+ *
32729
33002
  * ## Attributes & Properties
32730
33003
  *
32731
33004
  * Component attributes and properties that can be applied to the element or by using JavaScript.
@@ -38489,6 +38762,46 @@ export type CustomElementsSolidJs = {
38489
38762
  * answer to which one is authoritative or which has the caret. Do not close it
38490
38763
  * the other way round, with Color Input dropping its own field: the value
38491
38764
  * would then be unreadable and unpasteable without opening a panel.
38765
+ * - `readonly`/`readOnly`: Whether the control refuses changes while still submitting its value.
38766
+ *
38767
+ * **Enforced by refusing every request in one place**, which is the seam this
38768
+ * component already has: `requestValue` is what every path here comes through,
38769
+ * and gating it once is what stops the next call site from being written
38770
+ * without the check.
38771
+ *
38772
+ * Not `disabled`, which is the confusion worth naming: a disabled control
38773
+ * submits nothing and leaves the tab order, and a read-only one submits its
38774
+ * value and stays reachable, which is what a form showing a color somebody
38775
+ * else set needs.
38776
+ *
38777
+ * **One gate is not enough here, and the second is `move`.** This picker
38778
+ * holds a model beside its value, which Date Picker and Time Picker do not:
38779
+ * `moved` is the HSB the square is drawn from, and it is written before the
38780
+ * value is requested. Gating only the request would leave the square under
38781
+ * the reader's pointer and the value where it was, which is a control that
38782
+ * refuses and looks like it accepted.
38783
+ * - `required`: Whether the form refuses to submit while no color is chosen.
38784
+ *
38785
+ * **A color is exactly as requirable as a date**, which is the comparison
38786
+ * that settles it: this element extends `HelixFormElement`, carries `name`
38787
+ * and reports its value, so a consumer writing
38788
+ * `<helix-color-picker name="brand" required>` inside a form has every reason
38789
+ * to expect the form to refuse an empty one. Its two siblings in the same
38790
+ * composition position, Date Picker and Time Picker, both check it.
38791
+ *
38792
+ * Written out rather than taken from `MixinField`, for the reason those two
38793
+ * record: the mixin brings a label, a hint and a feedback region, and this is
38794
+ * a panel composed *into* a field that already has all three, so taking it
38795
+ * would give one control two of each. What is left is the validity call and
38796
+ * the anchor the browser points its bubble at.
38797
+ *
38798
+ * **Emptiness is the only fault reported, and bad input deliberately is
38799
+ * not.** The value row is typed into a character at a time and every
38800
+ * keystroke reaches `requestValue`, so `#0`, `#00` and `#00f` would each be a
38801
+ * reported fault on the way to `#00ff00`. Date Picker and Time Picker can
38802
+ * report bad input because their value moves only on a commit. Color Input
38803
+ * reports it for this family instead, once, against the field the reader
38804
+ * typed into.
38492
38805
  * - `swatches`: Colors offered under the picker, as a comma-separated list.
38493
38806
  * - `default-value`/`defaultValue`: The value the markup declared, which is where a reset returns to.
38494
38807
  * - `value`: What the control holds now, and what its form submits.
@@ -38566,14 +38879,8 @@ export type CustomElementsSolidJs = {
38566
38879
  *
38567
38880
  * Methods that can be called to access component functionality.
38568
38881
  *
38882
+ * - `requestValue(next: string) => boolean`: Refuses every change while read-only. See `readOnly`.
38569
38883
  * - `focus(options?: FocusOptions) => void`: Puts the keyboard on the square, which is the control a reader wants.
38570
- * - `requestValue(next: string) => boolean`: Requests a new value, and reports whether the request stood.
38571
- *
38572
- * Announces before it acts, so `preventDefault()` on the `helix-before-change` is
38573
- * a refusal and nothing moves. Nobody refusing means the control updates
38574
- * itself, whether or not a consumer declared `value`: a declared property
38575
- * is a seed and a correction, the way `<input value>` is, and a consumer
38576
- * who wants the change for themselves refuses it and assigns their own.
38577
38884
  * - `formResetCallback() => void`: Returns the control to the value its markup declared.
38578
38885
  *
38579
38886
  * Both halves are dropped, the consumer's and the control's, because a
@@ -47303,6 +47610,40 @@ export type CustomElementsSolidJs = {
47303
47610
  * different answers and a control that cannot express the first has to
47304
47611
  * pretend the second. A survey that requires an answer says so with
47305
47612
  * `required`, not by making one unreachable.
47613
+ *
47614
+ * **It is the floor of the scale, and every edge follows from that.**
47615
+ *
47616
+ * *Clearing* returns the row to it. An empty rating, a value nothing can
47617
+ * parse, and a form reset with nothing declared are all the same situation,
47618
+ * and all three draw `min` filled: at the default of zero that is the empty
47619
+ * row this always drew, and at `min="2"` it is two marks, the way an empty
47620
+ * `Slider` sits at its own minimum rather than at zero. The value is still
47621
+ * `""` through all of it, so `required` still refuses it and `valueAsNumber`
47622
+ * is still `NaN`: what the row shows is the bottom of the scale, not an
47623
+ * answer somebody gave.
47624
+ *
47625
+ * *The steps* are the scores from `step` up to `max` that are not below it,
47626
+ * so `min="2"` on five marks offers 2 to 5 and leaves the first two marks
47627
+ * filled and unpressable. At zero nothing is dropped, which is why the
47628
+ * default row is unchanged.
47629
+ *
47630
+ * *The keyboard* moves through those steps and no others. `wrap` is already
47631
+ * false here, so arrowing down from the lowest one holds its ground rather
47632
+ * than reaching a score this property forbids, and the tab stop an unrated
47633
+ * rating carries sits on the lowest score offered rather than on the first
47634
+ * mark.
47635
+ *
47636
+ * *A `min` between two steps* is a floor and not a step: `min="1.5"` with
47637
+ * whole marks clamps the value at 1.5 and offers 2 upward, since 1.5 is not
47638
+ * somewhere the row can be pressed. That is a real thing to ask for and is
47639
+ * left to mean what it says.
47640
+ *
47641
+ * *A `min` outside the marks is refused rather than obeyed*, and says so
47642
+ * once on the console. Below zero and anything that is not a number are read
47643
+ * as zero, there being no mark to draw for a negative score; above `max` is
47644
+ * read as `max`, which collapses the scale to its top score rather than
47645
+ * leaving a rating with nothing to press. A property that silently accepts
47646
+ * nonsense is the fault this pays off, so neither case is quietly ignored.
47306
47647
  * - `readonly`/`readOnly`: Whether this shows a score rather than asks for one.
47307
47648
  *
47308
47649
  * A readout is not a control that has been switched off. It takes no focus,
@@ -47460,14 +47801,15 @@ export type CustomElementsSolidJs = {
47460
47801
  *
47461
47802
  * - `--rating-full`: How many marks are wholly filled. (default: `undefined`)
47462
47803
  * - `--rating-part`: How much of the next mark is filled, 0 to 1. (default: `undefined`)
47463
- * - `--rating-step`: The width of one step, as a fraction of a mark. (default: `undefined`)
47464
- * - `--rating-steps`: How many steps one mark is divided into. (default: `undefined`)
47804
+ * - `--rating-step`: Which step along the row a target is, counting from one, whatever `min` leaves open. (default: `undefined`)
47805
+ * - `--rating-steps`: How many steps the whole row holds, which is `max` over `step`. (default: `undefined`)
47465
47806
  *
47466
47807
  * ## CSS Parts
47467
47808
  *
47468
47809
  * Custom selectors for styling elements within the component.
47469
47810
  *
47470
47811
  * - `feedback`: What is wrong with it.
47812
+ * - `field`: The row: the marks, and the score beside them.
47471
47813
  * - `fill`: The filled marks, clipped to the score.
47472
47814
  * - `hint`: Help under the marks, while nothing is wrong.
47473
47815
  * - `label`: The question, over the marks.
@@ -50738,6 +51080,19 @@ export type CustomElementsSolidJs = {
50738
51080
  * string, which is the whole reason the shape is that one. What each row *says*
50739
51081
  * is the reader's own convention, from `Intl`.
50740
51082
  *
51083
+ * **The chosen row is marked in the markup, not worked out on upgrade.** The
51084
+ * listbox is handed the answer as `.value`, and lit-ssr serializes no property
51085
+ * binding, so a served `value="09:30"` shipped ninety-six rows with nothing on
51086
+ * any of them saying which one it was: the mark arrived when the listbox
51087
+ * upgraded and ran `place`. So each option is given `selected` as well, which
51088
+ * is an attribute binding and does serve, and which the listbox then agrees
51089
+ * with rather than fights, `place` writing the same answer from the same value.
51090
+ * `selected` is the declaration a consumer writes on `Option` anywhere else in
51091
+ * the library, and Date Picker expresses its own choice as markup for the same
51092
+ * reason: a picker whose answer is invisible until a script runs is a picker
51093
+ * whose answer is not served at all. Both readings do it, the list and the
51094
+ * wheels, a wheel being a listbox like the list is.
51095
+ *
50741
51096
  * ## Attributes & Properties
50742
51097
  *
50743
51098
  * Component attributes and properties that can be applied to the element or by using JavaScript.
@@ -53342,9 +53697,9 @@ export type CustomCssProperties = {
53342
53697
  "--rating-full"?: (string) | undefined;
53343
53698
  /** How much of the next mark is filled, 0 to 1. */
53344
53699
  "--rating-part"?: (string) | undefined;
53345
- /** The width of one step, as a fraction of a mark. */
53700
+ /** Which step along the row a target is, counting from one, whatever `min` leaves open. */
53346
53701
  "--rating-step"?: (string) | undefined;
53347
- /** How many steps one mark is divided into. */
53702
+ /** How many steps the whole row holds, which is `max` over `step`. */
53348
53703
  "--rating-steps"?: (string) | undefined;
53349
53704
  /** Where a point sits across, as a percentage. Written by the component. */
53350
53705
  "--chart-point-x"?: (string) | undefined;
package/types/vue.d.ts CHANGED
@@ -1664,6 +1664,67 @@ answer to which one is authoritative or which has the caret. Do not close it
1664
1664
  the other way round, with Color Input dropping its own field: the value
1665
1665
  would then be unreadable and unpasteable without opening a panel. */
1666
1666
  noValue?: (HelixHeadlessColorPicker["noValue"]) | undefined;
1667
+ /** Whether the control refuses changes while still submitting its value.
1668
+
1669
+ **Enforced by refusing every request in one place**, which is the seam this
1670
+ component already has: `requestValue` is what every path here comes through,
1671
+ and gating it once is what stops the next call site from being written
1672
+ without the check.
1673
+
1674
+ Not `disabled`, which is the confusion worth naming: a disabled control
1675
+ submits nothing and leaves the tab order, and a read-only one submits its
1676
+ value and stays reachable, which is what a form showing a color somebody
1677
+ else set needs.
1678
+
1679
+ **One gate is not enough here, and the second is `move`.** This picker
1680
+ holds a model beside its value, which Date Picker and Time Picker do not:
1681
+ `moved` is the HSB the square is drawn from, and it is written before the
1682
+ value is requested. Gating only the request would leave the square under
1683
+ the reader's pointer and the value where it was, which is a control that
1684
+ refuses and looks like it accepted. */
1685
+ readonly?: (HelixHeadlessColorPicker["readOnly"]) | undefined;
1686
+ /** Whether the control refuses changes while still submitting its value.
1687
+
1688
+ **Enforced by refusing every request in one place**, which is the seam this
1689
+ component already has: `requestValue` is what every path here comes through,
1690
+ and gating it once is what stops the next call site from being written
1691
+ without the check.
1692
+
1693
+ Not `disabled`, which is the confusion worth naming: a disabled control
1694
+ submits nothing and leaves the tab order, and a read-only one submits its
1695
+ value and stays reachable, which is what a form showing a color somebody
1696
+ else set needs.
1697
+
1698
+ **One gate is not enough here, and the second is `move`.** This picker
1699
+ holds a model beside its value, which Date Picker and Time Picker do not:
1700
+ `moved` is the HSB the square is drawn from, and it is written before the
1701
+ value is requested. Gating only the request would leave the square under
1702
+ the reader's pointer and the value where it was, which is a control that
1703
+ refuses and looks like it accepted. */
1704
+ readOnly?: (HelixHeadlessColorPicker["readOnly"]) | undefined;
1705
+ /** Whether the form refuses to submit while no color is chosen.
1706
+
1707
+ **A color is exactly as requirable as a date**, which is the comparison
1708
+ that settles it: this element extends `HelixFormElement`, carries `name`
1709
+ and reports its value, so a consumer writing
1710
+ `<helix-color-picker name="brand" required>` inside a form has every reason
1711
+ to expect the form to refuse an empty one. Its two siblings in the same
1712
+ composition position, Date Picker and Time Picker, both check it.
1713
+
1714
+ Written out rather than taken from `MixinField`, for the reason those two
1715
+ record: the mixin brings a label, a hint and a feedback region, and this is
1716
+ a panel composed *into* a field that already has all three, so taking it
1717
+ would give one control two of each. What is left is the validity call and
1718
+ the anchor the browser points its bubble at.
1719
+
1720
+ **Emptiness is the only fault reported, and bad input deliberately is
1721
+ not.** The value row is typed into a character at a time and every
1722
+ keystroke reaches `requestValue`, so `#0`, `#00` and `#00f` would each be a
1723
+ reported fault on the way to `#00ff00`. Date Picker and Time Picker can
1724
+ report bad input because their value moves only on a commit. Color Input
1725
+ reports it for this family instead, once, against the field the reader
1726
+ typed into. */
1727
+ required?: (HelixHeadlessColorPicker["required"]) | undefined;
1667
1728
  /** Colors offered under the picker, as a comma-separated list. */
1668
1729
  swatches?: (HelixHeadlessColorPicker["swatches"]) | undefined;
1669
1730
  /** The value the markup declared, which is where a reset returns to. */
@@ -6105,7 +6166,41 @@ export type HelixHeadlessRatingVueProps = {
6105
6166
  Zero rather than one, because "no rating" and "the worst rating" are
6106
6167
  different answers and a control that cannot express the first has to
6107
6168
  pretend the second. A survey that requires an answer says so with
6108
- `required`, not by making one unreachable. */
6169
+ `required`, not by making one unreachable.
6170
+
6171
+ **It is the floor of the scale, and every edge follows from that.**
6172
+
6173
+ *Clearing* returns the row to it. An empty rating, a value nothing can
6174
+ parse, and a form reset with nothing declared are all the same situation,
6175
+ and all three draw `min` filled: at the default of zero that is the empty
6176
+ row this always drew, and at `min="2"` it is two marks, the way an empty
6177
+ `Slider` sits at its own minimum rather than at zero. The value is still
6178
+ `""` through all of it, so `required` still refuses it and `valueAsNumber`
6179
+ is still `NaN`: what the row shows is the bottom of the scale, not an
6180
+ answer somebody gave.
6181
+
6182
+ *The steps* are the scores from `step` up to `max` that are not below it,
6183
+ so `min="2"` on five marks offers 2 to 5 and leaves the first two marks
6184
+ filled and unpressable. At zero nothing is dropped, which is why the
6185
+ default row is unchanged.
6186
+
6187
+ *The keyboard* moves through those steps and no others. `wrap` is already
6188
+ false here, so arrowing down from the lowest one holds its ground rather
6189
+ than reaching a score this property forbids, and the tab stop an unrated
6190
+ rating carries sits on the lowest score offered rather than on the first
6191
+ mark.
6192
+
6193
+ *A `min` between two steps* is a floor and not a step: `min="1.5"` with
6194
+ whole marks clamps the value at 1.5 and offers 2 upward, since 1.5 is not
6195
+ somewhere the row can be pressed. That is a real thing to ask for and is
6196
+ left to mean what it says.
6197
+
6198
+ *A `min` outside the marks is refused rather than obeyed*, and says so
6199
+ once on the console. Below zero and anything that is not a number are read
6200
+ as zero, there being no mark to draw for a negative score; above `max` is
6201
+ read as `max`, which collapses the scale to its top score rather than
6202
+ leaving a rating with nothing to press. A property that silently accepts
6203
+ nonsense is the fault this pays off, so neither case is quietly ignored. */
6109
6204
  min?: (HelixHeadlessRating["min"]) | undefined;
6110
6205
  /** Whether this shows a score rather than asks for one.
6111
6206
 
@@ -9038,9 +9133,9 @@ export type CustomCssProperties = {
9038
9133
  "--rating-full"?: (string) | undefined;
9039
9134
  /** How much of the next mark is filled, 0 to 1. */
9040
9135
  "--rating-part"?: (string) | undefined;
9041
- /** The width of one step, as a fraction of a mark. */
9136
+ /** Which step along the row a target is, counting from one, whatever `min` leaves open. */
9042
9137
  "--rating-step"?: (string) | undefined;
9043
- /** How many steps one mark is divided into. */
9138
+ /** How many steps the whole row holds, which is `max` over `step`. */
9044
9139
  "--rating-steps"?: (string) | undefined;
9045
9140
  /** Where a point sits across, as a percentage. Written by the component. */
9046
9141
  "--chart-point-x"?: (string) | undefined;
@@ -9734,7 +9829,7 @@ export interface WcToolkitVueGlobalComponents {
9734
9829
  HelixHeadlessTimeInputVueProps,
9735
9830
  HelixHeadlessTimeInputVueEvents
9736
9831
  >;
9737
- /** **A list rather than three wheels**, and the reason is what a list already is. 'helix-listbox' brings the keyboard, the typeahead, the scroll into view and the announcement of a set of options, and a time at a step is a set of options. Three little wheels for hours, minutes and a meridiem are three controls to build, three to test, and a tab stop each for something a reader answers once. **A step is what makes it a list at all.** Fifteen minutes is ninety-six rows, which a reader scrolls or types into; one minute is one thousand four hundred and forty, which is a listbox in name only. So the list is for the times a product actually offers, and arbitrary times are the field's job in Input Time, the same division Date Input draws between typing a date and using the calendar. **The value is 'HH:mm' on a twenty-four hour clock, always.** That is what a form submits and what 'min' and 'max' compare against, and it sorts as a string, which is the whole reason the shape is that one. What each row *says* is the reader's own convention, from 'Intl'. */
9832
+ /** **A list rather than three wheels**, and the reason is what a list already is. 'helix-listbox' brings the keyboard, the typeahead, the scroll into view and the announcement of a set of options, and a time at a step is a set of options. Three little wheels for hours, minutes and a meridiem are three controls to build, three to test, and a tab stop each for something a reader answers once. **A step is what makes it a list at all.** Fifteen minutes is ninety-six rows, which a reader scrolls or types into; one minute is one thousand four hundred and forty, which is a listbox in name only. So the list is for the times a product actually offers, and arbitrary times are the field's job in Input Time, the same division Date Input draws between typing a date and using the calendar. **The value is 'HH:mm' on a twenty-four hour clock, always.** That is what a form submits and what 'min' and 'max' compare against, and it sorts as a string, which is the whole reason the shape is that one. What each row *says* is the reader's own convention, from 'Intl'. **The chosen row is marked in the markup, not worked out on upgrade.** The listbox is handed the answer as '.value', and lit-ssr serializes no property binding, so a served 'value="09:30"' shipped ninety-six rows with nothing on any of them saying which one it was: the mark arrived when the listbox upgraded and ran 'place'. So each option is given 'selected' as well, which is an attribute binding and does serve, and which the listbox then agrees with rather than fights, 'place' writing the same answer from the same value. 'selected' is the declaration a consumer writes on 'Option' anywhere else in the library, and Date Picker expresses its own choice as markup for the same reason: a picker whose answer is invisible until a script runs is a picker whose answer is not served at all. Both readings do it, the list and the wheels, a wheel being a listbox like the list is. */
9738
9833
  "helix-headless-time-picker": DefineCustomElement<
9739
9834
  HelixHeadlessTimePicker,
9740
9835
  HelixHeadlessTimePickerVueProps,