@fusion.dev/helix-headless 0.49.0 → 0.50.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.
@@ -19150,7 +19150,7 @@
19150
19150
  "text": "boolean"
19151
19151
  },
19152
19152
  "default": "false",
19153
- "description": "Whether the control refuses changes while still submitting its value.\n\n**Enforced by refusing every request in one place**, which is the seam this\ncomponent already has: `requestValue` is what every path here comes through,\nand gating it once is what stops the next call site from being written\nwithout the check.\n\nNot `disabled`, which is the confusion worth naming: a disabled control\nsubmits nothing and leaves the tab order, and a read-only one submits its\nvalue and stays reachable, which is what a form showing a color somebody\nelse set needs.\n\n**One gate is not enough here, and the second is `move`.** This picker\nholds a model beside its value, which Date Picker and Time Picker do not:\n`moved` is the HSB the square is drawn from, and it is written before the\nvalue is requested. Gating only the request would leave the square under\nthe reader's pointer and the value where it was, which is a control that\nrefuses and looks like it accepted.",
19153
+ "description": "Whether the control refuses changes while still submitting its value.\n\n**Enforced by refusing every request in one place**, which is the seam this\ncomponent already has: `requestValue` is what every path here comes through,\nand gating it once is what stops the next call site from being written\nwithout the check.\n\nNot `disabled`, which is the confusion worth naming: a disabled control\nsubmits nothing and leaves the tab order, and a read-only one submits its\nvalue and stays reachable, which is what a form showing a color somebody\nelse set needs.\n\n**One gate is not enough here, and the second is `move`.** This picker\nholds a model beside its value, which Date Picker and Time Picker do not:\n`moved` is the HSB the square is drawn from, and it is written before the\nvalue is requested. Gating only the request would leave the square under\nthe reader's pointer and the value where it was, which is a control that\nrefuses and looks like it accepted.\n\n**Two controls are refused whole rather than at either seam**, because\nboth do something before they ask. The syntax toggle rewrites the value, so\nletting it move would show `rgb` over a hex it is no longer allowed to\nrestate. The eyedropper clears the screen and runs a system sampler, so\nletting it open would take a color from the reader and drop it.",
19154
19154
  "attribute": "readonly",
19155
19155
  "reflects": true
19156
19156
  },
@@ -20198,7 +20198,7 @@
20198
20198
  "text": "boolean"
20199
20199
  },
20200
20200
  "default": "false",
20201
- "description": "Whether the control refuses changes while still submitting its value.\n\n**Enforced by refusing every request in one place**, which is the seam this\ncomponent already has: `requestValue` is what every path here comes through,\nand gating it once is what stops the next call site from being written\nwithout the check.\n\nNot `disabled`, which is the confusion worth naming: a disabled control\nsubmits nothing and leaves the tab order, and a read-only one submits its\nvalue and stays reachable, which is what a form showing a color somebody\nelse set needs.\n\n**One gate is not enough here, and the second is `move`.** This picker\nholds a model beside its value, which Date Picker and Time Picker do not:\n`moved` is the HSB the square is drawn from, and it is written before the\nvalue is requested. Gating only the request would leave the square under\nthe reader's pointer and the value where it was, which is a control that\nrefuses and looks like it accepted.",
20201
+ "description": "Whether the control refuses changes while still submitting its value.\n\n**Enforced by refusing every request in one place**, which is the seam this\ncomponent already has: `requestValue` is what every path here comes through,\nand gating it once is what stops the next call site from being written\nwithout the check.\n\nNot `disabled`, which is the confusion worth naming: a disabled control\nsubmits nothing and leaves the tab order, and a read-only one submits its\nvalue and stays reachable, which is what a form showing a color somebody\nelse set needs.\n\n**One gate is not enough here, and the second is `move`.** This picker\nholds a model beside its value, which Date Picker and Time Picker do not:\n`moved` is the HSB the square is drawn from, and it is written before the\nvalue is requested. Gating only the request would leave the square under\nthe reader's pointer and the value where it was, which is a control that\nrefuses and looks like it accepted.\n\n**Two controls are refused whole rather than at either seam**, because\nboth do something before they ask. The syntax toggle rewrites the value, so\nletting it move would show `rgb` over a hex it is no longer allowed to\nrestate. The eyedropper clears the screen and runs a system sampler, so\nletting it open would take a color from the reader and drop it.",
20202
20202
  "fieldName": "readOnly"
20203
20203
  },
20204
20204
  {
@@ -20285,7 +20285,7 @@
20285
20285
  "helix": {
20286
20286
  "category": "forms",
20287
20287
  "since": "0.1.0",
20288
- "status": "experimental",
20288
+ "status": "stable",
20289
20289
  "documentation": "https://fusion.dev/helix/components/color-picker",
20290
20290
  "aliases": [
20291
20291
  "Color",
@@ -73586,7 +73586,7 @@
73586
73586
  "helix": {
73587
73587
  "category": "forms",
73588
73588
  "since": "0.1.0",
73589
- "status": "experimental",
73589
+ "status": "stable",
73590
73590
  "documentation": "https://fusion.dev/helix/components/rating",
73591
73591
  "aliases": [
73592
73592
  "Stars",
@@ -81056,6 +81056,16 @@
81056
81056
  "default": "undefined",
81057
81057
  "description": "Where the divider was before the gesture that may be about to shut it.\n\nA drag writes a position on every pointer move, so by the time it reaches\nthe edge the number it started from is gone. Taken once, on the press, and\nwritten back if the gesture ends shut, so the pane opens to where it was\nrather than to the edge it was dragged against."
81058
81058
  },
81059
+ {
81060
+ "kind": "field",
81061
+ "name": "began",
81062
+ "type": {
81063
+ "text": "number | undefined"
81064
+ },
81065
+ "privacy": "private",
81066
+ "default": "undefined",
81067
+ "description": "Where the divider was when the gesture now under way began.\n\nTaken on the press, read once by `settle` and cleared there. `undefined`\nbetween gestures and for every discrete path, where nothing has been\napplied yet and so the position it has *is* the position it began at.\n\nBeside `opened` rather than folded into it: that one is `undefined` for a\npane that starts shut, which is a different question and a real answer."
81068
+ },
81059
81069
  {
81060
81070
  "kind": "field",
81061
81071
  "name": "reached",
@@ -81294,7 +81304,7 @@
81294
81304
  }
81295
81305
  }
81296
81306
  ],
81297
- "description": "Says the arrangement has settled, so a consumer can keep it.\n\nThrough the audited path, so a consumer who owns `position` is told what was\nasked for and decides, and one who does not has already had it applied.\n\n**The second announcement is conditional on the first, because it is derived\nfrom it.** `shutAt` reads the position the gesture ended on, so a refused\n`helix-before-resize` leaves a collapse computed from a number that was\nrefused. Announced anyway, the refusal produced the outcome it was refusing:\nmeasured on a divider at 40 with a listener calling `preventDefault`, Home\nleft `position` reporting 0 and `collapsed` reporting `start`, because the\ncollapse applied and `position` reads the sliver once a pane is shut. The\nreturn of the first request is what says so, and it was being dropped: a\ncancelable event dispatched as a bare statement with nothing reading the\nanswer, which is the shape the navigation cohort named on `Outline` and left.\n\nRefusing the collapse alone still leaves the resize, which is the other way\nround and is coherent: the divider goes where the drag put it and the pane\nis not declared shut. What a consumer cannot have is a pane that collapses\nout from under a position they said no to."
81307
+ "description": "Says the arrangement has settled, so a consumer can keep it.\n\nThrough the audited path, so a consumer who owns `position` is told what was\nasked for and decides, and one who does not has already had it applied.\n\n**The second announcement is conditional on the first, because it is derived\nfrom it.** `shutAt` reads the position the gesture ended on, so a refused\n`helix-before-resize` leaves a collapse computed from a number that was\nrefused. Announced anyway, the refusal produced the outcome it was refusing:\nmeasured on a divider at 40 with a listener calling `preventDefault`, Home\nleft `position` reporting 0 and `collapsed` reporting `start`, because the\ncollapse applied and `position` reads the sliver once a pane is shut. The\nreturn of the first request is what says so, and it was being dropped: a\ncancelable event dispatched as a bare statement with nothing reading the\nanswer, which is the shape the navigation cohort named on `Outline` and left.\n\nRefusing the collapse alone still leaves the resize, which is the other way\nround and is coherent: the divider goes where the drag put it and the pane\nis not declared shut. What a consumer cannot have is a pane that collapses\nout from under a position they said no to.\n\n**A gesture that moved nothing announces nothing, and this is the one place\nthat can say so.** A change carrying the position the divider already had\nrewrites a consumer's stored value from a gesture that moved nothing:\nharmless where the value round-trips exactly, and not where it does not,\nwhich is any consumer storing pixels and dividing by a box. The separator's\n`pointerup` held that as an early return of its own and was the only door\nwith one. There are five: the separator's pointer and arrows, the corner's\npointer and arrows, and a double click through `reset`, and `moveTo` is a\nsixth a consumer can open. Measured in Chromium 17 Sep 2026 on the built\nbundle, every door but the guarded one announced a move of zero: a corner\npress with nothing between announced on both splitters, `Home` on a divider\nalready at its minimum announced, and a double click on one already at its\ndefault announced.\n\n**Measured against where the gesture began, and not against `position`.**\n`move` applies as it goes, so by the time a drag settles the position is\nalready the number about to be announced, and comparing those two would\nsilence every drag there is. `began` is the press; a discrete path takes\nnone and compares against the position, which for it is the same thing.\n\n**Per divider rather than per gesture, which is the corner's question.** The\ncorner drives two at once, so \"moved nothing\" cannot mean \"neither moved\":\na drag along one axis moves one of them, and the other would be announcing\na number nobody asked to change. Each settles on its own and guards on its\nown, so the one that moved still announces while the one that did not stays\nquiet. That is also why the guard cannot live in `handleCornerUp`, which\nonly ever sees the pair.\n\n**The collapse counts as movement, because a refusal can leave the two\ndisagreeing.** A consumer who refuses `helix-before-collapse` has a pane at\nthe edge that is not declared shut, and a guard reading the position alone\nwould then never offer the collapse again: `Home` is already at the\nminimum, so every later press is a move of zero."
81298
81308
  },
81299
81309
  {
81300
81310
  "kind": "field",
@@ -81806,7 +81816,7 @@
81806
81816
  "type": {
81807
81817
  "text": "HelixBeforeResizeEvent"
81808
81818
  },
81809
- "description": "Fired before the divider settles. Cancelable: refusing it takes the whole of where the gesture ended, so no collapse follows from it either. A drag has already drawn itself by then and holds where it was dropped until the consumer assigns their own.",
81819
+ "description": "Fired before the divider settles, and only where the gesture moved it: a press that moved nothing, a drag that came back, an arrow with nowhere left to go and a corner that moved the other divider are all silent on this one. Cancelable: refusing it takes the whole of where the gesture ended, so no collapse follows from it either. A drag has already drawn itself by then and holds where it was dropped until the consumer assigns their own.",
81810
81820
  "name": "helix-before-resize",
81811
81821
  "reactProp": "onhelix-before-resize"
81812
81822
  }
@@ -95141,7 +95151,7 @@
95141
95151
  "helix": {
95142
95152
  "category": "forms",
95143
95153
  "since": "0.1.0",
95144
- "status": "experimental",
95154
+ "status": "stable",
95145
95155
  "documentation": "https://fusion.dev/helix/components/time-picker",
95146
95156
  "aliases": [
95147
95157
  "Time",
@@ -25,7 +25,7 @@ declare const HelixHeadlessColorPicker_base: (new (...args: any[]) => import("@f
25
25
  * model once.
26
26
  *
27
27
  * @since 0.1.0
28
- * @status experimental
28
+ * @status stable
29
29
  * @category forms
30
30
  * @aliases Color, ColorArea, Swatch picker
31
31
  * @documentation https://fusion.dev/helix/components/color-picker
@@ -147,6 +147,12 @@ export declare class HelixHeadlessColorPicker extends HelixHeadlessColorPicker_b
147
147
  * value is requested. Gating only the request would leave the square under
148
148
  * the reader's pointer and the value where it was, which is a control that
149
149
  * refuses and looks like it accepted.
150
+ *
151
+ * **Two controls are refused whole rather than at either seam**, because
152
+ * both do something before they ask. The syntax toggle rewrites the value, so
153
+ * letting it move would show `rgb` over a hex it is no longer allowed to
154
+ * restate. The eyedropper clears the screen and runs a system sampler, so
155
+ * letting it open would take a color from the reader and drop it.
150
156
  */
151
157
  readOnly: boolean;
152
158
  /**
@@ -68,6 +68,9 @@ let HelixHeadlessColorPicker = class HelixHeadlessColorPicker extends MixinContr
68
68
  }
69
69
  };
70
70
  this.handleEyeDropper = async () => {
71
+ if (this.readOnly) {
72
+ return;
73
+ }
71
74
  const Dropper = globalThis.EyeDropper;
72
75
  if (!Dropper) {
73
76
  return;
@@ -19,7 +19,7 @@ declare const HelixHeadlessRating_base: (new (...args: any[]) => import("@fusion
19
19
  * input, and it is announced as one.
20
20
  *
21
21
  * @since 0.1.0
22
- * @status experimental
22
+ * @status stable
23
23
  * @category forms
24
24
  * @aliases Stars, Score, Review score
25
25
  * @documentation https://fusion.dev/helix/components/rating
@@ -42,7 +42,7 @@ import { type PropertyValues, type TemplateResult } from 'lit';
42
42
  * @slot start - The pane before the divider.
43
43
  *
44
44
  * @event {HelixBeforeCollapseEvent} helix-before-collapse - Fired before a pane shuts or reopens, and only where the position it is derived from stood. Cancelable: refusing it leaves the pane as it was and the divider where the gesture put it.
45
- * @event {HelixBeforeResizeEvent} helix-before-resize - Fired before the divider settles. Cancelable: refusing it takes the whole of where the gesture ended, so no collapse follows from it either. A drag has already drawn itself by then and holds where it was dropped until the consumer assigns their own.
45
+ * @event {HelixBeforeResizeEvent} helix-before-resize - Fired before the divider settles, and only where the gesture moved it: a press that moved nothing, a drag that came back, an arrow with nowhere left to go and a corner that moved the other divider are all silent on this one. Cancelable: refusing it takes the whole of where the gesture ended, so no collapse follows from it either. A drag has already drawn itself by then and holds where it was dropped until the consumer assigns their own.
46
46
  *
47
47
  * @csspart corner - The handle where two dividers cross, added on the client.
48
48
  * @csspart end - The box holding the second.
@@ -183,6 +183,17 @@ export declare class HelixHeadlessSplitter extends HelixElement {
183
183
  * rather than to the edge it was dragged against.
184
184
  */
185
185
  private opened;
186
+ /**
187
+ * Where the divider was when the gesture now under way began.
188
+ *
189
+ * Taken on the press, read once by `settle` and cleared there. `undefined`
190
+ * between gestures and for every discrete path, where nothing has been
191
+ * applied yet and so the position it has *is* the position it began at.
192
+ *
193
+ * Beside `opened` rather than folded into it: that one is `undefined` for a
194
+ * pane that starts shut, which is a different question and a real answer.
195
+ */
196
+ private began;
186
197
  /**
187
198
  * Where the gesture has moved to, whether or not it was applied. See `move`.
188
199
  *
@@ -335,6 +346,40 @@ export declare class HelixHeadlessSplitter extends HelixElement {
335
346
  * round and is coherent: the divider goes where the drag put it and the pane
336
347
  * is not declared shut. What a consumer cannot have is a pane that collapses
337
348
  * out from under a position they said no to.
349
+ *
350
+ * **A gesture that moved nothing announces nothing, and this is the one place
351
+ * that can say so.** A change carrying the position the divider already had
352
+ * rewrites a consumer's stored value from a gesture that moved nothing:
353
+ * harmless where the value round-trips exactly, and not where it does not,
354
+ * which is any consumer storing pixels and dividing by a box. The separator's
355
+ * `pointerup` held that as an early return of its own and was the only door
356
+ * with one. There are five: the separator's pointer and arrows, the corner's
357
+ * pointer and arrows, and a double click through `reset`, and `moveTo` is a
358
+ * sixth a consumer can open. Measured in Chromium 17 Sep 2026 on the built
359
+ * bundle, every door but the guarded one announced a move of zero: a corner
360
+ * press with nothing between announced on both splitters, `Home` on a divider
361
+ * already at its minimum announced, and a double click on one already at its
362
+ * default announced.
363
+ *
364
+ * **Measured against where the gesture began, and not against `position`.**
365
+ * `move` applies as it goes, so by the time a drag settles the position is
366
+ * already the number about to be announced, and comparing those two would
367
+ * silence every drag there is. `began` is the press; a discrete path takes
368
+ * none and compares against the position, which for it is the same thing.
369
+ *
370
+ * **Per divider rather than per gesture, which is the corner's question.** The
371
+ * corner drives two at once, so "moved nothing" cannot mean "neither moved":
372
+ * a drag along one axis moves one of them, and the other would be announcing
373
+ * a number nobody asked to change. Each settles on its own and guards on its
374
+ * own, so the one that moved still announces while the one that did not stays
375
+ * quiet. That is also why the guard cannot live in `handleCornerUp`, which
376
+ * only ever sees the pair.
377
+ *
378
+ * **The collapse counts as movement, because a refusal can leave the two
379
+ * disagreeing.** A consumer who refuses `helix-before-collapse` has a pane at
380
+ * the edge that is not declared shut, and a guard reading the position alone
381
+ * would then never offer the collapse again: `Home` is already at the
382
+ * minimum, so every later press is a move of zero.
338
383
  */
339
384
  private settle;
340
385
  private readonly handlePointerDown;
@@ -22,6 +22,7 @@ let HelixHeadlessSplitter = HelixHeadlessSplitter_1 = class HelixHeadlessSplitte
22
22
  this.positionState = undefined;
23
23
  this.collapsedState = undefined;
24
24
  this.opened = undefined;
25
+ this.began = undefined;
25
26
  this.reached = undefined;
26
27
  this.dragging = false;
27
28
  this.crossings = [];
@@ -38,6 +39,7 @@ let HelixHeadlessSplitter = HelixHeadlessSplitter_1 = class HelixHeadlessSplitte
38
39
  : { length: box.width, start: box.left };
39
40
  capturePointer(separator, event.pointerId);
40
41
  this.opened = this.collapsed ? undefined : this.position;
42
+ this.began = this.position;
41
43
  this.reached = undefined;
42
44
  this.dragging = true;
43
45
  event.preventDefault();
@@ -62,10 +64,7 @@ let HelixHeadlessSplitter = HelixHeadlessSplitter_1 = class HelixHeadlessSplitte
62
64
  }
63
65
  this.origin = null;
64
66
  this.dragging = false;
65
- if (this.reached === undefined) {
66
- return;
67
- }
68
- this.settle(this.reached);
67
+ this.settle(this.reached ?? this.position);
69
68
  };
70
69
  this.handleKeydown = (event) => {
71
70
  const toward = this.travel(event.key);
@@ -117,6 +116,8 @@ let HelixHeadlessSplitter = HelixHeadlessSplitter_1 = class HelixHeadlessSplitte
117
116
  capturePointer(handle, event.pointerId);
118
117
  this.opened = this.collapsed ? undefined : this.position;
119
118
  crossing.by.opened = crossing.by.collapsed ? undefined : crossing.by.position;
119
+ this.began = this.position;
120
+ crossing.by.began = crossing.by.position;
120
121
  this.reached = undefined;
121
122
  crossing.by.reached = undefined;
122
123
  this.dragging = true;
@@ -299,6 +300,11 @@ let HelixHeadlessSplitter = HelixHeadlessSplitter_1 = class HelixHeadlessSplitte
299
300
  settle(next) {
300
301
  const wanted = this.clamp(next);
301
302
  const shut = this.shutAt(wanted);
303
+ const began = this.began ?? this.position;
304
+ this.began = undefined;
305
+ if (wanted === began && shut === this.collapsed) {
306
+ return;
307
+ }
302
308
  const moved = requestChange({
303
309
  apply: (value) => {
304
310
  const previous = this.position;
@@ -57,7 +57,7 @@ declare const HelixHeadlessTimePicker_base: (new (...args: any[]) => import("@fu
57
57
  * wheels, a wheel being a listbox like the list is.
58
58
  *
59
59
  * @since 0.1.0
60
- * @status experimental
60
+ * @status stable
61
61
  * @category forms
62
62
  * @aliases Time, TimeList
63
63
  * @documentation https://fusion.dev/helix/components/time-picker
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@fusion.dev/helix-headless",
3
3
  "description": "Headless component tier. Structure, accessibility, state, and form participation. No styling.",
4
- "version": "0.49.0",
4
+ "version": "0.50.0",
5
5
  "license": "MIT",
6
6
  "author": "Ross Sheppard <ross.sheppard@fusion.dev>",
7
7
  "repository": {
@@ -46,14 +46,14 @@
46
46
  },
47
47
  "bugs": "https://github.com/project-fusion/fusion/issues",
48
48
  "dependencies": {
49
- "@fusion.dev/helix-core": "0.49.0",
50
- "@fusion.dev/helix-icons": "0.49.0",
49
+ "@fusion.dev/helix-core": "0.50.0",
50
+ "@fusion.dev/helix-icons": "0.50.0",
51
51
  "uqr": "^0.1.3"
52
52
  },
53
53
  "devDependencies": {
54
54
  "@custom-elements-manifest/analyzer": "^0.11.0",
55
- "@fusion.dev/helix-cem": "0.49.0",
56
- "@fusion.dev/helix-testing": "0.49.0",
55
+ "@fusion.dev/helix-cem": "0.50.0",
56
+ "@fusion.dev/helix-testing": "0.50.0",
57
57
  "@fusion.dev/scripts": "0.0.0-dev",
58
58
  "@happy-dom/global-registrator": "^20.0.0",
59
59
  "@lit-labs/ssr": "^4.1.0",
package/types/jsx.d.ts CHANGED
@@ -3172,7 +3172,13 @@ holds a model beside its value, which Date Picker and Time Picker do not:
3172
3172
  `moved` is the HSB the square is drawn from, and it is written before the
3173
3173
  value is requested. Gating only the request would leave the square under
3174
3174
  the reader's pointer and the value where it was, which is a control that
3175
- refuses and looks like it accepted. */
3175
+ refuses and looks like it accepted.
3176
+
3177
+ **Two controls are refused whole rather than at either seam**, because
3178
+ both do something before they ask. The syntax toggle rewrites the value, so
3179
+ letting it move would show `rgb` over a hex it is no longer allowed to
3180
+ restate. The eyedropper clears the screen and runs a system sampler, so
3181
+ letting it open would take a color from the reader and drop it. */
3176
3182
  readonly?: (HelixHeadlessColorPicker["readOnly"]) | undefined;
3177
3183
  /** Whether the control refuses changes while still submitting its value.
3178
3184
 
@@ -3191,7 +3197,13 @@ holds a model beside its value, which Date Picker and Time Picker do not:
3191
3197
  `moved` is the HSB the square is drawn from, and it is written before the
3192
3198
  value is requested. Gating only the request would leave the square under
3193
3199
  the reader's pointer and the value where it was, which is a control that
3194
- refuses and looks like it accepted. */
3200
+ refuses and looks like it accepted.
3201
+
3202
+ **Two controls are refused whole rather than at either seam**, because
3203
+ both do something before they ask. The syntax toggle rewrites the value, so
3204
+ letting it move would show `rgb` over a hex it is no longer allowed to
3205
+ restate. The eyedropper clears the screen and runs a system sampler, so
3206
+ letting it open would take a color from the reader and drop it. */
3195
3207
  readOnly?: (HelixHeadlessColorPicker["readOnly"]) | undefined;
3196
3208
  /** Whether the form refuses to submit while no color is chosen.
3197
3209
 
@@ -3353,7 +3365,13 @@ holds a model beside its value, which Date Picker and Time Picker do not:
3353
3365
  `moved` is the HSB the square is drawn from, and it is written before the
3354
3366
  value is requested. Gating only the request would leave the square under
3355
3367
  the reader's pointer and the value where it was, which is a control that
3356
- refuses and looks like it accepted. */
3368
+ refuses and looks like it accepted.
3369
+
3370
+ **Two controls are refused whole rather than at either seam**, because
3371
+ both do something before they ask. The syntax toggle rewrites the value, so
3372
+ letting it move would show `rgb` over a hex it is no longer allowed to
3373
+ restate. The eyedropper clears the screen and runs a system sampler, so
3374
+ letting it open would take a color from the reader and drop it. */
3357
3375
  "bool:readonly"?: (HelixHeadlessColorPicker["readOnly"]) | undefined;
3358
3376
  /** Whether the control refuses changes while still submitting its value.
3359
3377
 
@@ -3372,7 +3390,13 @@ holds a model beside its value, which Date Picker and Time Picker do not:
3372
3390
  `moved` is the HSB the square is drawn from, and it is written before the
3373
3391
  value is requested. Gating only the request would leave the square under
3374
3392
  the reader's pointer and the value where it was, which is a control that
3375
- refuses and looks like it accepted. */
3393
+ refuses and looks like it accepted.
3394
+
3395
+ **Two controls are refused whole rather than at either seam**, because
3396
+ both do something before they ask. The syntax toggle rewrites the value, so
3397
+ letting it move would show `rgb` over a hex it is no longer allowed to
3398
+ restate. The eyedropper clears the screen and runs a system sampler, so
3399
+ letting it open would take a color from the reader and drop it. */
3376
3400
  "prop:readOnly"?: (HelixHeadlessColorPicker["readOnly"]) | undefined;
3377
3401
  /** Whether the form refuses to submit while no color is chosen.
3378
3402
 
@@ -13338,7 +13362,7 @@ has an honest answer. */
13338
13362
  "onhelix-before-collapse"?: ((
13339
13363
  e: HelixHeadlessSplitterHelixBeforeCollapseElementEvent,
13340
13364
  ) => void) | undefined;
13341
- /** Fired before the divider settles. Cancelable: refusing it takes the whole of where the gesture ended, so no collapse follows from it either. A drag has already drawn itself by then and holds where it was dropped until the consumer assigns their own. */
13365
+ /** Fired before the divider settles, and only where the gesture moved it: a press that moved nothing, a drag that came back, an arrow with nowhere left to go and a corner that moved the other divider are all silent on this one. Cancelable: refusing it takes the whole of where the gesture ended, so no collapse follows from it either. A drag has already drawn itself by then and holds where it was dropped until the consumer assigns their own. */
13342
13366
  "onhelix-before-resize"?: ((
13343
13367
  e: HelixHeadlessSplitterHelixBeforeResizeElementEvent,
13344
13368
  ) => void) | undefined;
@@ -13442,7 +13466,7 @@ has an honest answer. */
13442
13466
  "on:helix-before-collapse"?: ((
13443
13467
  e: HelixHeadlessSplitterHelixBeforeCollapseElementEvent,
13444
13468
  ) => void) | undefined;
13445
- /** Fired before the divider settles. Cancelable: refusing it takes the whole of where the gesture ended, so no collapse follows from it either. A drag has already drawn itself by then and holds where it was dropped until the consumer assigns their own. */
13469
+ /** Fired before the divider settles, and only where the gesture moved it: a press that moved nothing, a drag that came back, an arrow with nowhere left to go and a corner that moved the other divider are all silent on this one. Cancelable: refusing it takes the whole of where the gesture ended, so no collapse follows from it either. A drag has already drawn itself by then and holds where it was dropped until the consumer assigns their own. */
13446
13470
  "on:helix-before-resize"?: ((
13447
13471
  e: HelixHeadlessSplitterHelixBeforeResizeElementEvent,
13448
13472
  ) => void) | undefined;
@@ -20880,6 +20904,12 @@ export type CustomElements = {
20880
20904
  * value is requested. Gating only the request would leave the square under
20881
20905
  * the reader's pointer and the value where it was, which is a control that
20882
20906
  * refuses and looks like it accepted.
20907
+ *
20908
+ * **Two controls are refused whole rather than at either seam**, because
20909
+ * both do something before they ask. The syntax toggle rewrites the value, so
20910
+ * letting it move would show `rgb` over a hex it is no longer allowed to
20911
+ * restate. The eyedropper clears the screen and runs a system sampler, so
20912
+ * letting it open would take a color from the reader and drop it.
20883
20913
  * - `required`: Whether the form refuses to submit while no color is chosen.
20884
20914
  *
20885
20915
  * **A color is exactly as requirable as a date**, which is the comparison
@@ -31146,7 +31176,7 @@ export type CustomElements = {
31146
31176
  * Events that will be emitted by the component.
31147
31177
  *
31148
31178
  * - `helix-before-collapse`: Fired before a pane shuts or reopens, and only where the position it is derived from stood. Cancelable: refusing it leaves the pane as it was and the divider where the gesture put it.
31149
- * - `helix-before-resize`: Fired before the divider settles. Cancelable: refusing it takes the whole of where the gesture ended, so no collapse follows from it either. A drag has already drawn itself by then and holds where it was dropped until the consumer assigns their own.
31179
+ * - `helix-before-resize`: Fired before the divider settles, and only where the gesture moved it: a press that moved nothing, a drag that came back, an arrow with nowhere left to go and a corner that moved the other divider are all silent on this one. Cancelable: refusing it takes the whole of where the gesture ended, so no collapse follows from it either. A drag has already drawn itself by then and holds where it was dropped until the consumer assigns their own.
31150
31180
  *
31151
31181
  * ## Slots
31152
31182
  *
@@ -38780,6 +38810,12 @@ export type CustomElementsSolidJs = {
38780
38810
  * value is requested. Gating only the request would leave the square under
38781
38811
  * the reader's pointer and the value where it was, which is a control that
38782
38812
  * refuses and looks like it accepted.
38813
+ *
38814
+ * **Two controls are refused whole rather than at either seam**, because
38815
+ * both do something before they ask. The syntax toggle rewrites the value, so
38816
+ * letting it move would show `rgb` over a hex it is no longer allowed to
38817
+ * restate. The eyedropper clears the screen and runs a system sampler, so
38818
+ * letting it open would take a color from the reader and drop it.
38783
38819
  * - `required`: Whether the form refuses to submit while no color is chosen.
38784
38820
  *
38785
38821
  * **A color is exactly as requirable as a date**, which is the comparison
@@ -49194,7 +49230,7 @@ export type CustomElementsSolidJs = {
49194
49230
  * Events that will be emitted by the component.
49195
49231
  *
49196
49232
  * - `helix-before-collapse`: Fired before a pane shuts or reopens, and only where the position it is derived from stood. Cancelable: refusing it leaves the pane as it was and the divider where the gesture put it.
49197
- * - `helix-before-resize`: Fired before the divider settles. Cancelable: refusing it takes the whole of where the gesture ended, so no collapse follows from it either. A drag has already drawn itself by then and holds where it was dropped until the consumer assigns their own.
49233
+ * - `helix-before-resize`: Fired before the divider settles, and only where the gesture moved it: a press that moved nothing, a drag that came back, an arrow with nowhere left to go and a corner that moved the other divider are all silent on this one. Cancelable: refusing it takes the whole of where the gesture ended, so no collapse follows from it either. A drag has already drawn itself by then and holds where it was dropped until the consumer assigns their own.
49198
49234
  *
49199
49235
  * ## Slots
49200
49236
  *
package/types/vue.d.ts CHANGED
@@ -1681,7 +1681,13 @@ holds a model beside its value, which Date Picker and Time Picker do not:
1681
1681
  `moved` is the HSB the square is drawn from, and it is written before the
1682
1682
  value is requested. Gating only the request would leave the square under
1683
1683
  the reader's pointer and the value where it was, which is a control that
1684
- refuses and looks like it accepted. */
1684
+ refuses and looks like it accepted.
1685
+
1686
+ **Two controls are refused whole rather than at either seam**, because
1687
+ both do something before they ask. The syntax toggle rewrites the value, so
1688
+ letting it move would show `rgb` over a hex it is no longer allowed to
1689
+ restate. The eyedropper clears the screen and runs a system sampler, so
1690
+ letting it open would take a color from the reader and drop it. */
1685
1691
  readonly?: (HelixHeadlessColorPicker["readOnly"]) | undefined;
1686
1692
  /** Whether the control refuses changes while still submitting its value.
1687
1693
 
@@ -1700,7 +1706,13 @@ holds a model beside its value, which Date Picker and Time Picker do not:
1700
1706
  `moved` is the HSB the square is drawn from, and it is written before the
1701
1707
  value is requested. Gating only the request would leave the square under
1702
1708
  the reader's pointer and the value where it was, which is a control that
1703
- refuses and looks like it accepted. */
1709
+ refuses and looks like it accepted.
1710
+
1711
+ **Two controls are refused whole rather than at either seam**, because
1712
+ both do something before they ask. The syntax toggle rewrites the value, so
1713
+ letting it move would show `rgb` over a hex it is no longer allowed to
1714
+ restate. The eyedropper clears the screen and runs a system sampler, so
1715
+ letting it open would take a color from the reader and drop it. */
1704
1716
  readOnly?: (HelixHeadlessColorPicker["readOnly"]) | undefined;
1705
1717
  /** Whether the form refuses to submit while no color is chosen.
1706
1718
 
@@ -6879,7 +6891,7 @@ has an honest answer. */
6879
6891
  export type HelixHeadlessSplitterVueEvents = {
6880
6892
  /** Fired before a pane shuts or reopens, and only where the position it is derived from stood. Cancelable: refusing it leaves the pane as it was and the divider where the gesture put it. */
6881
6893
  "helix-before-collapse": HelixHeadlessSplitterHelixBeforeCollapseElementEvent;
6882
- /** Fired before the divider settles. Cancelable: refusing it takes the whole of where the gesture ended, so no collapse follows from it either. A drag has already drawn itself by then and holds where it was dropped until the consumer assigns their own. */
6894
+ /** Fired before the divider settles, and only where the gesture moved it: a press that moved nothing, a drag that came back, an arrow with nowhere left to go and a corner that moved the other divider are all silent on this one. Cancelable: refusing it takes the whole of where the gesture ended, so no collapse follows from it either. A drag has already drawn itself by then and holds where it was dropped until the consumer assigns their own. */
6883
6895
  "helix-before-resize": HelixHeadlessSplitterHelixBeforeResizeElementEvent;
6884
6896
  };
6885
6897