@fusion.dev/helix-core 0.186.1 → 0.188.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.
@@ -1758,7 +1758,7 @@
1758
1758
  "declarations": [
1759
1759
  {
1760
1760
  "kind": "class",
1761
- "description": "Pushes a group's `disabled` onto its members, on every update, unasked.\n\n**The cascade itself is `inheritDisabled`, and this is what makes it\nautomatic.** Called by hand it runs only when whichever method holds the call\nruns, so a group whose items changed by some other path leaves them holding\nthe last answer, and a group that forgets the call gets no cascade at all\nwith nothing to say so: the property exists, the attribute reflects, and the\nmembers simply ignore it. That is invisible in review and shows up only when\nsomeone disables a set.\n\nIt adds no API. A group already has `disabled`, from `HelixFormElement` or\nfrom the consumer; nothing here introduces a property or a method for anyone\nto call. By this repo's own rule that makes it a controller and not a mixin:\nit reacts to a lifecycle and nothing else.\n\nSo a group states its members once, at construction, and never thinks about\nit again:\n\n new DisabledCascadeController(this, { items: () => this.items })\n\n**Runs after every render, and on every `slotchange`.** The second half is\nnot an extra: a member arriving in the light DOM changes no property, so Lit\nschedules nothing, and a render-only cascade leaves a member slotted into an\nalready-disabled group enabled. Measured before it was added, on a radio\ngroup holding two disabled members with a third inserted: `110`, and the\nthird was live in a set nobody could use.\n\nThe listener is on the render root rather than on the host, because\n`slotchange` bubbles but is not composed: it reaches the shadow root that\nowns the slot and stops there. On the host it would never fire at all.\n\nAfter render rather than before, because the items are read from the DOM and\na newly slotted member is not there until the render that assigns it.\n\nIdempotent, so running on every update costs a comparison per member and\nnothing else: `inheritDisabled` writes only where the answer changed and\nremembers what each member said for itself, which is what lets a group be\nre-enabled without freeing a member that was disabled on its own.",
1761
+ "description": "Pushes a group's `disabled` onto its members, on every update, unasked.\n\n**The cascade itself is `inheritDisabled`, and this is what makes it\nautomatic.** Called by hand it runs only when whichever method holds the call\nruns, so a group whose items changed by some other path leaves them holding\nthe last answer, and a group that forgets the call gets no cascade at all\nwith nothing to say so: the property exists, the attribute reflects, and the\nmembers simply ignore it. That is invisible in review and shows up only when\nsomeone disables a set.\n\nIt adds no API. A group already has `disabled`, from `HelixFormElement` or\nfrom the consumer; nothing here introduces a property or a method for anyone\nto call. Adding no API is what makes it a controller and not a mixin: it\nreacts to a lifecycle and nothing else.\n\nSo a group states its members once, at construction, and never thinks about\nit again:\n\n new DisabledCascadeController(this, { items: () => this.items })\n\n**Runs after every render, and on every `slotchange`.** The second half is\nnot an extra: a member arriving in the light DOM changes no property, so Lit\nschedules nothing, and a render-only cascade leaves a member slotted into an\nalready-disabled group enabled. Measured before it was added, on a radio\ngroup holding two disabled members with a third inserted: `110`, and the\nthird was live in a set nobody could use.\n\nThe listener is on the render root rather than on the host, because\n`slotchange` bubbles but is not composed: it reaches the shadow root that\nowns the slot and stops there. On the host it would never fire at all.\n\nAfter render rather than before, because the items are read from the DOM and\na newly slotted member is not there until the render that assigns it.\n\nIdempotent, so running on every update costs a comparison per member and\nnothing else: `inheritDisabled` writes only where the answer changed and\nremembers what each member said for itself, which is what lets a group be\nre-enabled without freeing a member that was disabled on its own.",
1762
1762
  "name": "DisabledCascadeController",
1763
1763
  "members": [
1764
1764
  {
@@ -5524,7 +5524,7 @@
5524
5524
  "declarations": [
5525
5525
  {
5526
5526
  "kind": "class",
5527
- "description": "Reads a design token as the sRGB triple a shader or a 2D canvas can take, and\ntells the host when the palette underneath it moves.\n\n**Two hops, and both are load-bearing.** A custom property's own value is the\nunevaluated function text, so `getComputedStyle` on a probe is the only way\nto see what it resolves to. The second hop is `readColor`, which is shared\nwith every other caller that has a resolved color and needs channels: what it\nresolves to is not `rgb()`, the\npalette derives from an `oklch()` seed, and Chrome answers `lab(100 0 0)` for\nwhite. Parsing that with a regular expression for numbers reads the three\nchannels as 100, 0 and 0, which divided by 255 is a dark red.\n\nA screenshot cannot catch that: a warm cast on a saturated gradient is also\nwhat chroma subsampling produces, so the picture agrees with the bug.\n\nThe conversion is therefore the browser's own: fill a pixel and read it back.\nThat holds for `lab()`, `oklch()`, `color-mix()` and whatever a token is\nwritten in next, which is the property worth having in a design system whose\npalette is derived rather than listed.\n\n**A controller and not a mixin**, by this repository's own line: it adds no\nproperty or method a consumer sets. It reacts to lifecycle, holding a probe\nthat has to be created after the host connects and removed when it leaves,\nand it watches for the color mode changing so the host can repaint.\n\n**Client only, and that is the contract rather than a limitation.** There is\nno computed style on a server and no canvas to convert with, so `read`\nanswers the fallback there. Every caller is drawing into a canvas, which does\nnot exist on a server either.",
5527
+ "description": "Reads a design token as the sRGB triple a shader or a 2D canvas can take, and\ntells the host when the palette underneath it moves.\n\n**Two hops, and both are load-bearing.** A custom property's own value is the\nunevaluated function text, so `getComputedStyle` on a probe is the only way\nto see what it resolves to. The second hop is `readColor`, which is shared\nwith every other caller that has a resolved color and needs channels: what it\nresolves to is not `rgb()`, the\npalette derives from an `oklch()` seed, and Chrome answers `lab(100 0 0)` for\nwhite. Parsing that with a regular expression for numbers reads the three\nchannels as 100, 0 and 0, which divided by 255 is a dark red.\n\nA screenshot cannot catch that: a warm cast on a saturated gradient is also\nwhat chroma subsampling produces, so the picture agrees with the bug.\n\nThe conversion is therefore the browser's own: fill a pixel and read it back.\nThat holds for `lab()`, `oklch()`, `color-mix()` and whatever a token is\nwritten in next, which is the property worth having in a design system whose\npalette is derived rather than listed.\n\n**A controller and not a mixin**, because it adds no property or method a\nconsumer sets. It reacts to lifecycle, holding a probe\nthat has to be created after the host connects and removed when it leaves,\nand it watches for the color mode changing so the host can repaint.\n\n**Client only, and that is the contract rather than a limitation.** There is\nno computed style on a server and no canvas to convert with, so `read`\nanswers the fallback there. Every caller is drawing into a canvas, which does\nnot exist on a server either.",
5528
5528
  "name": "TokenColorController",
5529
5529
  "members": [
5530
5530
  {
@@ -25062,7 +25062,7 @@
25062
25062
  },
25063
25063
  {
25064
25064
  "kind": "mixin",
25065
- "description": "Grafts a pan-and-zoom surface: its controls, its keys, and the way out.\n\n**Nothing here is geographic, which is why it is here.** `Map` was written\nfirst and its frame turned out to be a surface a reader can move, fill the\nscreen with, and stop touching: a canvas of notes and a graph of nodes want\nthe same four hundred lines, and the only thing that made them Map's was\nbeing written there. Extracted before the second consumer rather than after,\nwhich is the opposite of what [#383](queue.md) had to conclude about a\ncontroller promoted ahead of one.\n\n**Nothing here moves anything, either.** Both controls ask, through an event\na family names, and the answer is the consumer's: the surface a reader is\nlooking at belongs to them, whether it is a tile renderer, a canvas or a\nforce layout. A mixin that moved the view would have to know what the view\nwas.\n\n**The controls are buttons, and that is a decision against arrow keys.** They\nwork too, but what a screen reader does with them is not ours to decide:\nmacOS passes them through, Windows readers hold them for their own reading\nmode unless a page takes `role=\"application\"`, which costs the reader their\nnormal way of reading everything else. A button is findable and operable in\nevery screen reader on every platform without that bargain.\n\n**What stays in the family is `render()`, its slots and its part\ndocumentation**, because a part named through an interpolation is one the\nmanifest cannot see: a loop over the four pan buttons would publish `pan-`\nand a consumer's `::part(pan-up)` would match nothing.",
25065
+ "description": "Grafts a pan-and-zoom surface: its controls, its keys, and the way out.\n\n**Nothing here is geographic, which is why it is here.** `Map` was written\nfirst and its frame turned out to be a surface a reader can move, fill the\nscreen with, and stop touching: a canvas of notes and a graph of nodes want\nthe same four hundred lines, and the only thing that made them Map's was\nbeing written there. Extracted before the second consumer arrived.\n\n**Nothing here moves anything, either.** Both controls ask, through an event\na family names, and the answer is the consumer's: the surface a reader is\nlooking at belongs to them, whether it is a tile renderer, a canvas or a\nforce layout. A mixin that moved the view would have to know what the view\nwas.\n\n**The controls are buttons, and that is a decision against arrow keys.** They\nwork too, but what a screen reader does with them is not ours to decide:\nmacOS passes them through, Windows readers hold them for their own reading\nmode unless a page takes `role=\"application\"`, which costs the reader their\nnormal way of reading everything else. A button is findable and operable in\nevery screen reader on every platform without that bargain.\n\n**What stays in the family is `render()`, its slots and its part\ndocumentation**, because a part named through an interpolation is one the\nmanifest cannot see: a loop over the four pan buttons would publish `pan-`\nand a consumer's `::part(pan-up)` would match nothing.",
25066
25066
  "name": "MixinViewport",
25067
25067
  "members": [
25068
25068
  {
@@ -28172,7 +28172,7 @@
28172
28172
  }
28173
28173
  }
28174
28174
  ],
28175
- "description": "Builds a stylesheet from CSS authored in a `.css` file.\n\nComponent styles live in real `.css` files rather than `css` tagged\ntemplates, so they get CSS tooling: syntax highlighting, formatters, the\ntoken linter, and a diff that reads as CSS. `turbo run styles` compiles each\none into a sibling `.css.ts` that calls this.\n\nThe `unsafe` in `unsafeCSS` warns about interpolating untrusted input into a\nstylesheet. That is not what happens here: the argument is a build-time\nconstant read from a file in this repo, never a runtime value. Wrapping it\nkeeps the warning where it belongs, on `unsafeCSS` itself, and gives one seam\nto change if constructable stylesheets become the better primitive."
28175
+ "description": "Builds a stylesheet from CSS authored in a `.css` file.\n\nComponent styles live in real `.css` files rather than `css` tagged\ntemplates, so they get CSS tooling: syntax highlighting, formatters, the\ntoken linter, and a diff that reads as CSS. `turbo run styles` compiles each\none into a sibling `.css.ts` that calls this.\n\nThe `unsafe` in `unsafeCSS` warns about interpolating untrusted input into a\nstylesheet. That is not what happens here: the argument is a build-time\nconstant read from a file in the package, never a runtime value. Wrapping it\nkeeps the warning where it belongs, on `unsafeCSS` itself, and gives one seam\nto change if constructable stylesheets become the better primitive."
28176
28176
  }
28177
28177
  ],
28178
28178
  "exports": [
@@ -35683,7 +35683,7 @@
35683
35683
  "type": {
35684
35684
  "text": "string"
35685
35685
  },
35686
- "default": "'0.186.1'",
35686
+ "default": "'0.188.0'",
35687
35687
  "description": "The version of the package this file ships in.\n\n**Written by `fusion/scripts/version.mjs`** wherever it writes the package's\n`package.json`, and stamped back into the repository beside it after a\nrelease, so the two never disagree; a spec beside this holds them to it.\nNothing else in the running code knows which release it is."
35688
35688
  }
35689
35689
  ],
@@ -36319,6 +36319,6 @@
36319
36319
  ],
36320
36320
  "helix": {
36321
36321
  "package": "@fusion.dev/helix-core",
36322
- "version": "0.186.1"
36322
+ "version": "0.188.0"
36323
36323
  }
36324
36324
  }
@@ -38,8 +38,8 @@ type DisableableHost = ReactiveControllerHost & HTMLElement & {
38
38
  *
39
39
  * It adds no API. A group already has `disabled`, from `HelixFormElement` or
40
40
  * from the consumer; nothing here introduces a property or a method for anyone
41
- * to call. By this repo's own rule that makes it a controller and not a mixin:
42
- * it reacts to a lifecycle and nothing else.
41
+ * to call. Adding no API is what makes it a controller and not a mixin: it
42
+ * reacts to a lifecycle and nothing else.
43
43
  *
44
44
  * So a group states its members once, at construction, and never thinks about
45
45
  * it again:
@@ -22,8 +22,8 @@ export type TokenColor = [number, number, number];
22
22
  * written in next, which is the property worth having in a design system whose
23
23
  * palette is derived rather than listed.
24
24
  *
25
- * **A controller and not a mixin**, by this repository's own line: it adds no
26
- * property or method a consumer sets. It reacts to lifecycle, holding a probe
25
+ * **A controller and not a mixin**, because it adds no property or method a
26
+ * consumer sets. It reacts to lifecycle, holding a probe
27
27
  * that has to be created after the host connects and removed when it leaves,
28
28
  * and it watches for the color mode changing so the host can repaint.
29
29
  *
@@ -128,9 +128,7 @@ export declare class ViewportElement {
128
128
  * first and its frame turned out to be a surface a reader can move, fill the
129
129
  * screen with, and stop touching: a canvas of notes and a graph of nodes want
130
130
  * the same four hundred lines, and the only thing that made them Map's was
131
- * being written there. Extracted before the second consumer rather than after,
132
- * which is the opposite of what [#383](queue.md) had to conclude about a
133
- * controller promoted ahead of one.
131
+ * being written there. Extracted before the second consumer arrived.
134
132
  *
135
133
  * **Nothing here moves anything, either.** Both controls ask, through an event
136
134
  * a family names, and the answer is the consumer's: the surface a reader is
@@ -9,7 +9,7 @@ import { type CSSResult } from 'lit';
9
9
  *
10
10
  * The `unsafe` in `unsafeCSS` warns about interpolating untrusted input into a
11
11
  * stylesheet. That is not what happens here: the argument is a build-time
12
- * constant read from a file in this repo, never a runtime value. Wrapping it
12
+ * constant read from a file in the package, never a runtime value. Wrapping it
13
13
  * keeps the warning where it belongs, on `unsafeCSS` itself, and gives one seam
14
14
  * to change if constructable stylesheets become the better primitive.
15
15
  */
package/dist/version.d.ts CHANGED
@@ -6,4 +6,4 @@
6
6
  * release, so the two never disagree; a spec beside this holds them to it.
7
7
  * Nothing else in the running code knows which release it is.
8
8
  */
9
- export declare const VERSION = "0.186.1";
9
+ export declare const VERSION = "0.188.0";
package/dist/version.js CHANGED
@@ -1 +1 @@
1
- export const VERSION = '0.186.1';
1
+ export const VERSION = '0.188.0';
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@fusion.dev/helix-core",
3
3
  "description": "Helix element primitives: base classes, mixins, decorators, utilities.",
4
- "version": "0.186.1",
4
+ "version": "0.188.0",
5
5
  "license": "MIT",
6
6
  "author": "Ross Sheppard <ross.sheppard@fusion.dev>",
7
7
  "repository": {
@@ -74,12 +74,12 @@
74
74
  "bugs": "https://github.com/project-fusion/fusion/issues",
75
75
  "dependencies": {
76
76
  "@floating-ui/dom": "^1.8.0",
77
- "@fusion.dev/helix-icons": "0.186.1",
77
+ "@fusion.dev/helix-icons": "0.188.0",
78
78
  "tslib": "^2.8.1"
79
79
  },
80
80
  "devDependencies": {
81
- "@fusion.dev/helix-cem": "0.186.1",
82
- "@fusion.dev/helix-testing": "0.186.1",
81
+ "@fusion.dev/helix-cem": "0.188.0",
82
+ "@fusion.dev/helix-testing": "0.188.0",
83
83
  "@lit-labs/ssr": "^4.1.0",
84
84
  "lit": "^3.2.1"
85
85
  },