@fusion.dev/helix-core 0.58.1 → 0.59.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.
Files changed (28) hide show
  1. package/custom-elements.json +612 -40
  2. package/dist/controllers/aria-forward-controller/aria-forward-controller.js +2 -2
  3. package/dist/controllers/chart-pointer-controller/chart-pointer-controller.d.ts +2 -2
  4. package/dist/controllers/chart-pointer-controller/chart-pointer-controller.js +2 -1
  5. package/dist/controllers/indicator-controller/indicator-controller.js +2 -1
  6. package/dist/controllers/paint-gate-controller/paint-gate-controller.d.ts +135 -0
  7. package/dist/controllers/paint-gate-controller/paint-gate-controller.js +97 -0
  8. package/dist/controllers/source-controller/source-controller.js +2 -2
  9. package/dist/index.d.ts +8 -3
  10. package/dist/index.js +8 -3
  11. package/dist/mixins/mixin-chart-source/mixin-chart-source.d.ts +2 -2
  12. package/dist/utils/css-color/css-color.d.ts +0 -14
  13. package/dist/utils/css-color/css-color.js +0 -22
  14. package/dist/utils/draw-tooltip/draw-tooltip.d.ts +6 -6
  15. package/dist/utils/element-by-id/element-by-id.d.ts +64 -0
  16. package/dist/utils/element-by-id/element-by-id.js +10 -0
  17. package/dist/utils/inline-step/inline-step.js +2 -2
  18. package/dist/utils/is-rtl/is-rtl.d.ts +19 -0
  19. package/dist/utils/is-rtl/is-rtl.js +1 -0
  20. package/dist/utils/split-values/split-values.d.ts +24 -0
  21. package/dist/utils/split-values/split-values.js +23 -0
  22. package/dist/utils/value-as/value-as.d.ts +20 -0
  23. package/dist/utils/value-as/value-as.js +12 -0
  24. package/dist/utils/write-time/write-time.d.ts +14 -0
  25. package/dist/utils/write-time/write-time.js +12 -0
  26. package/dist/utils/written-list/written-list.d.ts +13 -0
  27. package/dist/utils/written-list/written-list.js +3 -0
  28. package/package.json +5 -4
@@ -205,7 +205,7 @@
205
205
  "type": {
206
206
  "text": "boolean"
207
207
  },
208
- "description": "Whether the drawing is turned to run right to left, which it is on a\nright-to-left page.\n\n`HelixElement` mirrors a drawing marked `data-mirror` there, so a reading\ndrawn at 10% of the plot's width stands 10% in from its right edge. What is\nread against the drawing has to be read the same way: the pointer from the\nplot's right, and a bubble beside a bar's far end on its left. Asked of the\nhost's computed `direction`, which is what the table and the splitter read\nfor their own arrow keys.\n\nOn the controller because it is what reads the pointer against the drawing,\nand a chart deciding which side a bubble goes asks here rather than\nrepeating the question. Asked when needed rather than held, since a page\ncan change its direction without the chart updating.",
208
+ "description": "Whether the drawing is turned to run right to left, which it is on a\nright-to-left page.\n\n`HelixElement` mirrors a drawing marked `data-mirror` there, so a reading\ndrawn at 10% of the plot's width stands 10% in from its right edge. What is\nread against the drawing has to be read the same way: the pointer from the\nplot's right, and a bubble beside a bar's far end on its left. Asked of the\nhost through `isRtl`, which is the one question the table and the splitter\nask for their own arrow keys.\n\nOn the controller because it is what reads the pointer against the drawing,\nand a chart deciding which side a bubble goes asks here rather than\nrepeating the question. Asked when needed rather than held, since a page\ncan change its direction without the chart updating.",
209
209
  "readonly": true
210
210
  },
211
211
  {
@@ -1686,6 +1686,216 @@
1686
1686
  }
1687
1687
  ]
1688
1688
  },
1689
+ {
1690
+ "kind": "javascript-module",
1691
+ "path": "src/controllers/paint-gate-controller/paint-gate-controller.ts",
1692
+ "declarations": [
1693
+ {
1694
+ "kind": "variable",
1695
+ "name": "MAX_FRAME_STEP",
1696
+ "type": {
1697
+ "text": "number"
1698
+ },
1699
+ "default": "0.05",
1700
+ "description": "The longest step one frame is given, in seconds.\n\nA tab that was throttled and comes back hands the first frame a delta of\nseveral seconds. Integrated whole, an animated canvas teleports: the aura's\nfield lands wherever the pointer went while nobody was watching, and the\norb's wave jumps a shape. The ceiling is 20 frames a second of simulated\ntime, so a genuinely slow frame still advances and a resumed one does not\nskip ahead.\n\nExported because a host that collects several frames into one owes the same\nceiling on what it spends. `Aura` caps its own frame rate and would otherwise\nhand its shader exactly the step this number refuses."
1701
+ },
1702
+ {
1703
+ "kind": "class",
1704
+ "description": "Runs a canvas painter's frame loop, and stops it whenever nobody is looking.\n\nIt holds the five pieces every animated canvas needs and none of which is\nabout what is drawn: an `IntersectionObserver` for whether the host is on\nscreen, `visibilitychange` for whether the tab is in front,\n`prefers-reduced-motion` and its `change` listener for whether the reader\nasked for less, a `ResizeObserver` for the box, and the\n`requestAnimationFrame` loop that reports a clamped step. It says whether it\nis running, whether the reader asked for less motion, and whether the host is\non screen.\n\n**Separable because none of it reads a pixel.** `Aura` and `Orb` are the\nlibrary's two canvas painters and are otherwise nothing alike, one a WebGL\nshader over a full-screen triangle and the other a depth-sorted cloud of 2D\ndots. Everything above is the same question in both, which is when a frame is\nworth drawing, and the answer never mentions the drawing.\n\n**Every path to a frame is gated, not only the observer's.** The tab's own\nstate is asked in `play` rather than in the intersection callback, because a\nrestored context, a resize, a state change and a preference all play too, and\na check that lives in the observer covers exactly one of them.\n\n**The next frame is asked for rather than booked blind.** A loop that books\nits own next frame unconditionally ends only where something calls `stop`,\nwhich is how a detached element and a host whose context was taken both went\non drawing into nothing.\n\n**The device-pixel cap is not here.** The aura scales by\n`Math.min(devicePixelRatio || 1, 2) * 0.85` and the orb by\n`Math.min(2, devicePixelRatio || 1)`, and the difference between them is a\nmeasured fill cost, five octaves of noise per pixel against a disc fill.\nThose are decisions about a drawing, not the mechanism around it.\n\n**Nor is context loss.** The event names differ by context type,\n`webglcontextlost` against `contextlost`, and so does the contract: a 2D\ncontext comes back unless the loss is canceled and a WebGL one comes back\nonly if it is. The aura's deferred release is an argument about a browser's\nbudget of about sixteen live WebGL contexts, which is nothing a 2D canvas\nhas.\n\nClient only, and by contract rather than by a guard: every caller holds a\ndrawing context before it calls `watch`, and there is no context on a server\nor on a machine that refuses one.",
1705
+ "name": "PaintGateController",
1706
+ "members": [
1707
+ {
1708
+ "kind": "field",
1709
+ "name": "host",
1710
+ "type": {
1711
+ "text": "ReactiveControllerHost & HTMLElement"
1712
+ },
1713
+ "privacy": "private",
1714
+ "readonly": true,
1715
+ "default": "host"
1716
+ },
1717
+ {
1718
+ "kind": "field",
1719
+ "name": "options",
1720
+ "type": {
1721
+ "text": "PaintGateOptions"
1722
+ },
1723
+ "privacy": "private",
1724
+ "readonly": true,
1725
+ "default": "options"
1726
+ },
1727
+ {
1728
+ "kind": "field",
1729
+ "name": "frame",
1730
+ "type": {
1731
+ "text": "number"
1732
+ },
1733
+ "privacy": "private",
1734
+ "default": "0",
1735
+ "description": "The booked frame, or `0`, which is also the whole of whether it runs."
1736
+ },
1737
+ {
1738
+ "kind": "field",
1739
+ "name": "last",
1740
+ "type": {
1741
+ "text": "number"
1742
+ },
1743
+ "privacy": "private",
1744
+ "default": "0",
1745
+ "description": "When the last reported frame was, so the next one carries the gap."
1746
+ },
1747
+ {
1748
+ "kind": "field",
1749
+ "name": "intersecting",
1750
+ "type": {
1751
+ "text": "boolean"
1752
+ },
1753
+ "privacy": "private",
1754
+ "default": "false",
1755
+ "description": "What the intersection observer last said, kept because it says so only on\na change: every other path to `play` has to ask it."
1756
+ },
1757
+ {
1758
+ "kind": "field",
1759
+ "name": "motion",
1760
+ "type": {
1761
+ "text": "MediaQueryList | undefined"
1762
+ },
1763
+ "privacy": "private"
1764
+ },
1765
+ {
1766
+ "kind": "field",
1767
+ "name": "sized",
1768
+ "type": {
1769
+ "text": "ResizeObserver | undefined"
1770
+ },
1771
+ "privacy": "private"
1772
+ },
1773
+ {
1774
+ "kind": "field",
1775
+ "name": "visible",
1776
+ "type": {
1777
+ "text": "IntersectionObserver | undefined"
1778
+ },
1779
+ "privacy": "private"
1780
+ },
1781
+ {
1782
+ "kind": "field",
1783
+ "name": "onScreen",
1784
+ "type": {
1785
+ "text": "boolean"
1786
+ },
1787
+ "description": "Whether the host is on screen, as the intersection observer last said.",
1788
+ "readonly": true
1789
+ },
1790
+ {
1791
+ "kind": "field",
1792
+ "name": "reduced",
1793
+ "type": {
1794
+ "text": "boolean"
1795
+ },
1796
+ "description": "Whether the reader asked for less motion.",
1797
+ "readonly": true
1798
+ },
1799
+ {
1800
+ "kind": "field",
1801
+ "name": "running",
1802
+ "type": {
1803
+ "text": "boolean"
1804
+ },
1805
+ "description": "Whether a frame is booked.",
1806
+ "readonly": true
1807
+ },
1808
+ {
1809
+ "kind": "method",
1810
+ "name": "watch",
1811
+ "return": {
1812
+ "type": {
1813
+ "text": "void"
1814
+ }
1815
+ },
1816
+ "description": "Installs everything that decides whether a frame is wanted.\n\nCalled from the host's own setup rather than from `hostConnected`, because\na host with nothing to draw with has nothing to gate: both painters ask for\na context first and return where there is none, which is a server, a\nmachine that refuses one, and a renderer the aura declines. Idempotent, so\na host whose setup runs on every connection calls it every time."
1817
+ },
1818
+ {
1819
+ "kind": "method",
1820
+ "name": "hostDisconnected",
1821
+ "return": {
1822
+ "type": {
1823
+ "text": "void"
1824
+ }
1825
+ }
1826
+ },
1827
+ {
1828
+ "kind": "method",
1829
+ "name": "play",
1830
+ "return": {
1831
+ "type": {
1832
+ "text": "void"
1833
+ }
1834
+ },
1835
+ "description": "Starts the loop, where it is wanted and can be ended."
1836
+ },
1837
+ {
1838
+ "kind": "method",
1839
+ "name": "stop",
1840
+ "return": {
1841
+ "type": {
1842
+ "text": "void"
1843
+ }
1844
+ },
1845
+ "description": "Ends the loop.\n\n`last` goes with it, so a loop starting again measures no step against a\nstale stamp. What the host accumulated is the host's and is left alone."
1846
+ },
1847
+ {
1848
+ "kind": "method",
1849
+ "name": "wanted",
1850
+ "privacy": "private",
1851
+ "return": {
1852
+ "type": {
1853
+ "text": "boolean"
1854
+ }
1855
+ },
1856
+ "description": "Whether anybody is looking, and whether the host can draw for them."
1857
+ },
1858
+ {
1859
+ "kind": "field",
1860
+ "name": "tick",
1861
+ "privacy": "private",
1862
+ "readonly": true
1863
+ },
1864
+ {
1865
+ "kind": "field",
1866
+ "name": "handleMotion",
1867
+ "privacy": "private",
1868
+ "readonly": true
1869
+ },
1870
+ {
1871
+ "kind": "field",
1872
+ "name": "handleVisibility",
1873
+ "privacy": "private",
1874
+ "readonly": true
1875
+ }
1876
+ ],
1877
+ "helix": {}
1878
+ }
1879
+ ],
1880
+ "exports": [
1881
+ {
1882
+ "kind": "js",
1883
+ "name": "MAX_FRAME_STEP",
1884
+ "declaration": {
1885
+ "name": "MAX_FRAME_STEP",
1886
+ "module": "src/controllers/paint-gate-controller/paint-gate-controller.ts"
1887
+ }
1888
+ },
1889
+ {
1890
+ "kind": "js",
1891
+ "name": "PaintGateController",
1892
+ "declaration": {
1893
+ "name": "PaintGateController",
1894
+ "module": "src/controllers/paint-gate-controller/paint-gate-controller.ts"
1895
+ }
1896
+ }
1897
+ ]
1898
+ },
1689
1899
  {
1690
1900
  "kind": "javascript-module",
1691
1901
  "path": "src/controllers/popover-controller/popover-controller.ts",
@@ -5127,6 +5337,30 @@
5127
5337
  "module": "./controllers/media-session-controller/media-session-controller.js"
5128
5338
  }
5129
5339
  },
5340
+ {
5341
+ "kind": "js",
5342
+ "name": "MAX_FRAME_STEP",
5343
+ "declaration": {
5344
+ "name": "MAX_FRAME_STEP",
5345
+ "module": "./controllers/paint-gate-controller/paint-gate-controller.js"
5346
+ }
5347
+ },
5348
+ {
5349
+ "kind": "js",
5350
+ "name": "PaintGateController",
5351
+ "declaration": {
5352
+ "name": "PaintGateController",
5353
+ "module": "./controllers/paint-gate-controller/paint-gate-controller.js"
5354
+ }
5355
+ },
5356
+ {
5357
+ "kind": "js",
5358
+ "name": "PaintGateOptions",
5359
+ "declaration": {
5360
+ "name": "PaintGateOptions",
5361
+ "module": "./controllers/paint-gate-controller/paint-gate-controller.js"
5362
+ }
5363
+ },
5130
5364
  {
5131
5365
  "kind": "js",
5132
5366
  "name": "PopoverController",
@@ -5999,14 +6233,6 @@
5999
6233
  "module": "./utils/css-color/css-color.js"
6000
6234
  }
6001
6235
  },
6002
- {
6003
- "kind": "js",
6004
- "name": "splitColors",
6005
- "declaration": {
6006
- "name": "splitColors",
6007
- "module": "./utils/css-color/css-color.js"
6008
- }
6009
- },
6010
6236
  {
6011
6237
  "kind": "js",
6012
6238
  "name": "toCss",
@@ -6079,6 +6305,30 @@
6079
6305
  "module": "./utils/elapsed-time/elapsed-time.js"
6080
6306
  }
6081
6307
  },
6308
+ {
6309
+ "kind": "js",
6310
+ "name": "ElementByIdOptions",
6311
+ "declaration": {
6312
+ "name": "ElementByIdOptions",
6313
+ "module": "./utils/element-by-id/element-by-id.js"
6314
+ }
6315
+ },
6316
+ {
6317
+ "kind": "js",
6318
+ "name": "elementById",
6319
+ "declaration": {
6320
+ "name": "elementById",
6321
+ "module": "./utils/element-by-id/element-by-id.js"
6322
+ }
6323
+ },
6324
+ {
6325
+ "kind": "js",
6326
+ "name": "searchableById",
6327
+ "declaration": {
6328
+ "name": "searchableById",
6329
+ "module": "./utils/element-by-id/element-by-id.js"
6330
+ }
6331
+ },
6082
6332
  {
6083
6333
  "kind": "js",
6084
6334
  "name": "deepActiveElement",
@@ -6159,6 +6409,14 @@
6159
6409
  "module": "./utils/inline-step/inline-step.js"
6160
6410
  }
6161
6411
  },
6412
+ {
6413
+ "kind": "js",
6414
+ "name": "isRtl",
6415
+ "declaration": {
6416
+ "name": "isRtl",
6417
+ "module": "./utils/is-rtl/is-rtl.js"
6418
+ }
6419
+ },
6162
6420
  {
6163
6421
  "kind": "js",
6164
6422
  "name": "Curve",
@@ -6415,6 +6673,14 @@
6415
6673
  "module": "./utils/slot-filled/slot-filled.js"
6416
6674
  }
6417
6675
  },
6676
+ {
6677
+ "kind": "js",
6678
+ "name": "splitValues",
6679
+ "declaration": {
6680
+ "name": "splitValues",
6681
+ "module": "./utils/split-values/split-values.js"
6682
+ }
6683
+ },
6418
6684
  {
6419
6685
  "kind": "js",
6420
6686
  "name": "tellDisclosure",
@@ -6479,6 +6745,22 @@
6479
6745
  "module": "./utils/value-as/value-as.js"
6480
6746
  }
6481
6747
  },
6748
+ {
6749
+ "kind": "js",
6750
+ "name": "isTimeValue",
6751
+ "declaration": {
6752
+ "name": "isTimeValue",
6753
+ "module": "./utils/value-as/value-as.js"
6754
+ }
6755
+ },
6756
+ {
6757
+ "kind": "js",
6758
+ "name": "minutesAsValue",
6759
+ "declaration": {
6760
+ "name": "minutesAsValue",
6761
+ "module": "./utils/value-as/value-as.js"
6762
+ }
6763
+ },
6482
6764
  {
6483
6765
  "kind": "js",
6484
6766
  "name": "numberAsValue",
@@ -6503,6 +6785,14 @@
6503
6785
  "module": "./utils/value-as/value-as.js"
6504
6786
  }
6505
6787
  },
6788
+ {
6789
+ "kind": "js",
6790
+ "name": "valueAsMinutes",
6791
+ "declaration": {
6792
+ "name": "valueAsMinutes",
6793
+ "module": "./utils/value-as/value-as.js"
6794
+ }
6795
+ },
6506
6796
  {
6507
6797
  "kind": "js",
6508
6798
  "name": "valueAsNumber",
@@ -6519,6 +6809,14 @@
6519
6809
  "module": "./utils/value-as/value-as.js"
6520
6810
  }
6521
6811
  },
6812
+ {
6813
+ "kind": "js",
6814
+ "name": "writeTime",
6815
+ "declaration": {
6816
+ "name": "writeTime",
6817
+ "module": "./utils/write-time/write-time.js"
6818
+ }
6819
+ },
6522
6820
  {
6523
6821
  "kind": "js",
6524
6822
  "name": "writtenList",
@@ -6526,6 +6824,14 @@
6526
6824
  "name": "writtenList",
6527
6825
  "module": "./utils/written-list/written-list.js"
6528
6826
  }
6827
+ },
6828
+ {
6829
+ "kind": "js",
6830
+ "name": "writtenNumbers",
6831
+ "declaration": {
6832
+ "name": "writtenNumbers",
6833
+ "module": "./utils/written-list/written-list.js"
6834
+ }
6529
6835
  }
6530
6836
  ]
6531
6837
  },
@@ -6709,7 +7015,7 @@
6709
7015
  "type": {
6710
7016
  "text": "string"
6711
7017
  },
6712
- "description": "The id of the table to read.\n\nResolved through `getRootNode()`, so a chart inside another component's\nshadow root names a table in that root rather than in the document. A\n`<table>` or anything built from grid roles, including `helix-table`.\n\n**In React this arrives as a property and not as an attribute**, the way\n`Tooltip.for` does, so it does not reflect and nothing styles on it."
7018
+ "description": "The id of the table to read.\n\nNames a table in the same tree, so a chart inside another component's\nshadow root reads a table in that root rather than one in the document. A\n`<table>` or anything built from grid roles, including `helix-table`.\n\n**In React this arrives as a property and not as an attribute**, the way\n`Tooltip.for` does, so it does not reflect and nothing styles on it."
6713
7019
  },
6714
7020
  {
6715
7021
  "kind": "field",
@@ -6820,7 +7126,7 @@
6820
7126
  "text": "string"
6821
7127
  },
6822
7128
  "default": "''",
6823
- "description": "The id of the table to read.\n\nResolved through `getRootNode()`, so a chart inside another component's\nshadow root names a table in that root rather than in the document. A\n`<table>` or anything built from grid roles, including `helix-table`.\n\n**In React this arrives as a property and not as an attribute**, the way\n`Tooltip.for` does, so it does not reflect and nothing styles on it.",
7129
+ "description": "The id of the table to read.\n\nNames a table in the same tree, so a chart inside another component's\nshadow root reads a table in that root rather than one in the document. A\n`<table>` or anything built from grid roles, including `helix-table`.\n\n**In React this arrives as a property and not as an attribute**, the way\n`Tooltip.for` does, so it does not reflect and nothing styles on it.",
6824
7130
  "attribute": "for"
6825
7131
  },
6826
7132
  {
@@ -6904,7 +7210,7 @@
6904
7210
  "text": "string"
6905
7211
  },
6906
7212
  "default": "''",
6907
- "description": "The id of the table to read.\n\nResolved through `getRootNode()`, so a chart inside another component's\nshadow root names a table in that root rather than in the document. A\n`<table>` or anything built from grid roles, including `helix-table`.\n\n**In React this arrives as a property and not as an attribute**, the way\n`Tooltip.for` does, so it does not reflect and nothing styles on it.",
7213
+ "description": "The id of the table to read.\n\nNames a table in the same tree, so a chart inside another component's\nshadow root reads a table in that root rather than one in the document. A\n`<table>` or anything built from grid roles, including `helix-table`.\n\n**In React this arrives as a property and not as an attribute**, the way\n`Tooltip.for` does, so it does not reflect and nothing styles on it.",
6908
7214
  "fieldName": "for"
6909
7215
  },
6910
7216
  {
@@ -9869,24 +10175,6 @@
9869
10175
  "kind": "javascript-module",
9870
10176
  "path": "src/utils/css-color/css-color.ts",
9871
10177
  "declarations": [
9872
- {
9873
- "kind": "function",
9874
- "name": "splitColors",
9875
- "return": {
9876
- "type": {
9877
- "text": "string[]"
9878
- }
9879
- },
9880
- "parameters": [
9881
- {
9882
- "name": "value",
9883
- "type": {
9884
- "text": "string"
9885
- }
9886
- }
9887
- ],
9888
- "description": "Splits a comma-separated list of colors, ignoring the commas inside them.\n\nA plain `split(',')` cannot hold the legacy syntaxes:\n`#ef4444, rgb(249 115 22), rgba(34,197,94,.5)` comes apart into six fragments,\nfour of them not colors, and the row quietly renders three swatches instead of\nfour. The modern space-separated forms survive it, which is what makes such a\nlist look like it works.\n\nDepth rather than a regular expression, because the thing that matters is\nwhether a comma is inside a function call and that is exactly what a counter\nanswers. No color syntax nests, so a single counter is enough."
9889
- },
9890
10178
  {
9891
10179
  "kind": "function",
9892
10180
  "name": "parseColor",
@@ -9955,14 +10243,6 @@
9955
10243
  }
9956
10244
  ],
9957
10245
  "exports": [
9958
- {
9959
- "kind": "js",
9960
- "name": "splitColors",
9961
- "declaration": {
9962
- "name": "splitColors",
9963
- "module": "src/utils/css-color/css-color.ts"
9964
- }
9965
- },
9966
10246
  {
9967
10247
  "kind": "js",
9968
10248
  "name": "parseColor",
@@ -10113,7 +10393,7 @@
10113
10393
  "text": "string"
10114
10394
  },
10115
10395
  "default": "'helix-chart-plot'",
10116
- "description": "The id every chart puts on its plot, and the boundary a bubble is kept inside.\n\n**A name six templates and this file have to agree on is a name that will\nstop agreeing**, which is `PALETTE`'s argument and it holds harder here: the\nfailure is silent. `within` resolves through `getElementById`, so a plot\nrenamed on one side returns null, the boundary falls back to the viewport,\nand the bubble goes back to hanging past the drawing with nothing reported\nanywhere.\n\nFixed rather than generated, for the reason the mark's id below gives: it is\nscoped to one chart's shadow root, where it is the only one."
10396
+ "description": "The id every chart puts on its plot, and the boundary a bubble is kept inside.\n\n**A name six templates and this file have to agree on is a name that will\nstop agreeing**, which is `PALETTE`'s argument and it holds harder here: the\nfailure is silent. `within` resolves by id, so a plot renamed on one side\nreturns null, the boundary falls back to the viewport,\nand the bubble goes back to hanging past the drawing with nothing reported\nanywhere.\n\nFixed rather than generated, for the reason the mark's id below gives: it is\nscoped to one chart's shadow root, where it is the only one."
10117
10397
  },
10118
10398
  {
10119
10399
  "kind": "function",
@@ -10157,7 +10437,7 @@
10157
10437
  }
10158
10438
  }
10159
10439
  ],
10160
- "description": "What a pointer resting on a reading shows, as `Tooltip` pointed at a mark.\n\n**A chart does not draw its own tooltip, and the top layer is why.** `Tooltip`\nrenders `popover=\"manual\"` through `PopoverController`, so it clears every\nstacking context and every `overflow` on the page. A box drawn by the chart is\n`position: absolute` inside the plot and is confined to the chart's own\ncontext, so it is clipped by, or layered under, whatever sits beside the\nchart. Escaping that means reimplementing `PopoverController`, which is\n`Tooltip` with extra steps and a second copy of the hard part.\n\n**`for` was already the anchor and needed nothing added.** It resolves through\n`getRootNode().getElementById()`, and a chart's shadow root *is* a\n`ShadowRoot`, so a chart names an element inside itself and `Tooltip` finds\nit. What the chart provides is an invisible mark at the reading's point.\n\n**An HTML mark rather than the `<rect>` or `<circle>` already there.**\n`FloatingController` types its anchor as `HTMLElement` and an SVG element is\nnot one; and a slice's `<circle>` has the bounding box of the whole ring\nrather than of its arc, so anchoring to it would point at the ring's center\nfor every slice.\n\n**And the arrow now follows from placement rather than from a compass.** The\nchart says which side it prefers and `FloatingController` moves it if that\nside does not fit, which is how a slice at any bearing gets a bubble that\npoints at it. Four hard-coded sides could not express a bearing, which is what\nmade the donut's arrow miss its own ring.\n\n**It shows the table's text and not the chart's numbers.** `$128k` is what the\ncell says and `128000` is what the drawing measured. Every cell of the row is\nhere, including columns nothing was plotted from, because a note beside the\nfigures is most of the reason to want a tooltip.\n\n**Hidden from assistive technology, on purpose.** The table is the accessible\nrepresentation and the drawing is `aria-hidden`; a reader on a keyboard gets\nthe table, which they can reach, rather than a tooltip which they cannot."
10440
+ "description": "What a pointer resting on a reading shows, as `Tooltip` pointed at a mark.\n\n**A chart does not draw its own tooltip, and the top layer is why.** `Tooltip`\nrenders `popover=\"manual\"` through `PopoverController`, so it clears every\nstacking context and every `overflow` on the page. A box drawn by the chart is\n`position: absolute` inside the plot and is confined to the chart's own\ncontext, so it is clipped by, or layered under, whatever sits beside the\nchart. Escaping that means reimplementing `PopoverController`, which is\n`Tooltip` with extra steps and a second copy of the hard part.\n\n**`for` was already the anchor and needed nothing added.** It resolves in the\ntree the tooltip sits in, and the mark is in the same shadow root, so a chart\nnames an element inside itself and `Tooltip` finds it. What the chart\nprovides is an invisible mark at the reading's point.\n\n**An HTML mark rather than the `<rect>` or `<circle>` already there.**\n`FloatingController` types its anchor as `HTMLElement` and an SVG element is\nnot one; and a slice's `<circle>` has the bounding box of the whole ring\nrather than of its arc, so anchoring to it would point at the ring's center\nfor every slice.\n\n**And the arrow now follows from placement rather than from a compass.** The\nchart says which side it prefers and `FloatingController` moves it if that\nside does not fit, which is how a slice at any bearing gets a bubble that\npoints at it. Four hard-coded sides could not express a bearing, which is what\nmade the donut's arrow miss its own ring.\n\n**It shows the table's text and not the chart's numbers.** `$128k` is what the\ncell says and `128000` is what the drawing measured. Every cell of the row is\nhere, including columns nothing was plotted from, because a note beside the\nfigures is most of the reason to want a tooltip.\n\n**Hidden from assistive technology, on purpose.** The table is the accessible\nrepresentation and the drawing is `aria-hidden`; a reader on a keyboard gets\nthe table, which they can reach, rather than a tooltip which they cannot."
10161
10441
  }
10162
10442
  ],
10163
10443
  "exports": [
@@ -10213,6 +10493,79 @@
10213
10493
  }
10214
10494
  ]
10215
10495
  },
10496
+ {
10497
+ "kind": "javascript-module",
10498
+ "path": "src/utils/element-by-id/element-by-id.ts",
10499
+ "declarations": [
10500
+ {
10501
+ "kind": "function",
10502
+ "name": "elementById",
10503
+ "return": {
10504
+ "type": {
10505
+ "text": "HTMLElement | null"
10506
+ }
10507
+ },
10508
+ "parameters": [
10509
+ {
10510
+ "name": "from",
10511
+ "type": {
10512
+ "text": "Node"
10513
+ }
10514
+ },
10515
+ {
10516
+ "name": "id",
10517
+ "type": {
10518
+ "text": "string"
10519
+ }
10520
+ },
10521
+ {
10522
+ "name": "options",
10523
+ "optional": true,
10524
+ "type": {
10525
+ "text": "ElementByIdOptions"
10526
+ }
10527
+ }
10528
+ ],
10529
+ "description": "The element an id names, looked up in the tree the node sits in.\n\n**`getRootNode()` rather than `document`, which is what makes a component\ncomposable.** An id is unique to a tree and not to a page, so a component\ninside another component's shadow root names an element in that root. Asking\nthe document finds nothing there, and on a page where the name is taken it\nfinds an element in somebody else's tree.\n\n**What `getRootNode()` returns need not be able to answer, and that guard is\nload-bearing in both environments this library runs in.** Measured 18 Sep\n2026, and held by the two specs beside this file. Under Lit SSR's DOM shim\n`getRootNode()` returns a `Document` carrying no `getElementById` at all, so\nan unguarded call is a `TypeError` rather than a miss and takes the whole\nserver render down the first time a component resolves `for`. In Chromium and\nin happy-dom alike an element that is not connected is its own root, and an\n`HTMLElement` has no lookup either, which is the reading every caller here is\none detached element away from.\n\nA `DocumentFragment` is not a case, which is worth saying because it looks\nlike the obvious one: `getElementById` comes from `NonElementParentNode`, so a\nbare fragment and a `<template>`'s content both carry it.\n\n**Decoding stays at the call site.** `SkipLink` and `Outline` take an `href`\nand owe it a `decodeURIComponent`; the callers that take an id property do\nnot, and a utility that decoded would corrupt a literal `%` in one of theirs."
10530
+ },
10531
+ {
10532
+ "kind": "function",
10533
+ "name": "searchableById",
10534
+ "return": {
10535
+ "type": {
10536
+ "text": "boolean"
10537
+ }
10538
+ },
10539
+ "parameters": [
10540
+ {
10541
+ "name": "from",
10542
+ "type": {
10543
+ "text": "Node"
10544
+ }
10545
+ }
10546
+ ],
10547
+ "description": "Whether ids resolve at all in the tree this node sits in.\n\nThe same platform fact as `elementById`'s guard, asked as a question, for a\ncomponent that has to tell \"no such element\" from \"no tree to look in\".\n`Heatmap` is the case and its note gives the cost: an empty state served\nbecause a server could not resolve `for` is a crawler reading \"No readings\"\nover ninety days of them."
10548
+ }
10549
+ ],
10550
+ "exports": [
10551
+ {
10552
+ "kind": "js",
10553
+ "name": "elementById",
10554
+ "declaration": {
10555
+ "name": "elementById",
10556
+ "module": "src/utils/element-by-id/element-by-id.ts"
10557
+ }
10558
+ },
10559
+ {
10560
+ "kind": "js",
10561
+ "name": "searchableById",
10562
+ "declaration": {
10563
+ "name": "searchableById",
10564
+ "module": "src/utils/element-by-id/element-by-id.ts"
10565
+ }
10566
+ }
10567
+ ]
10568
+ },
10216
10569
  {
10217
10570
  "kind": "javascript-module",
10218
10571
  "path": "src/utils/focusable-elements/focusable-elements.ts",
@@ -10476,6 +10829,40 @@
10476
10829
  }
10477
10830
  ]
10478
10831
  },
10832
+ {
10833
+ "kind": "javascript-module",
10834
+ "path": "src/utils/is-rtl/is-rtl.ts",
10835
+ "declarations": [
10836
+ {
10837
+ "kind": "function",
10838
+ "name": "isRtl",
10839
+ "return": {
10840
+ "type": {
10841
+ "text": "boolean"
10842
+ }
10843
+ },
10844
+ "parameters": [
10845
+ {
10846
+ "name": "element",
10847
+ "type": {
10848
+ "text": "Element"
10849
+ }
10850
+ }
10851
+ ],
10852
+ "description": "Whether the line of text an element sits on runs right to left.\n\n**The computed `direction`, not `:dir()` and not the `dir` attribute.** The\nthree part only where a sheet sets `direction` without an attribute, and\nthere the row on screen is laid out by `direction`: a flex row and a grid\nboth follow it. `inlineStep` makes that argument in full, and it is the same\nquestion in every caller here, which is why there is one answer to it.\n\n**Guarded, because a server shim need not have `getComputedStyle`.** Most\ncallers reach this from a pointer handler and so only ever in a browser, but\n`ScatterChart` asks inside `renderTooltip`, one early return from the render\npath. Without the function there is no layout to read, so the answer is the\ndirection a document has before anything says otherwise.\n\nAsked at the moment it is needed rather than held, so a page that changes its\ndirection is answered in the new one without anything having to watch it."
10853
+ }
10854
+ ],
10855
+ "exports": [
10856
+ {
10857
+ "kind": "js",
10858
+ "name": "isRtl",
10859
+ "declaration": {
10860
+ "name": "isRtl",
10861
+ "module": "src/utils/is-rtl/is-rtl.ts"
10862
+ }
10863
+ }
10864
+ ]
10865
+ },
10479
10866
  {
10480
10867
  "kind": "javascript-module",
10481
10868
  "path": "src/utils/line-path/line-path.ts",
@@ -11105,6 +11492,46 @@
11105
11492
  }
11106
11493
  ]
11107
11494
  },
11495
+ {
11496
+ "kind": "javascript-module",
11497
+ "path": "src/utils/split-values/split-values.ts",
11498
+ "declarations": [
11499
+ {
11500
+ "kind": "function",
11501
+ "name": "splitValues",
11502
+ "return": {
11503
+ "type": {
11504
+ "text": "string[]"
11505
+ }
11506
+ },
11507
+ "parameters": [
11508
+ {
11509
+ "name": "text",
11510
+ "type": {
11511
+ "text": "string"
11512
+ }
11513
+ },
11514
+ {
11515
+ "name": "separator",
11516
+ "type": {
11517
+ "text": "',' | ' '"
11518
+ }
11519
+ }
11520
+ ],
11521
+ "description": "One CSS value list split into its values, never inside a function or a\nbracket.\n\nThe separator is the one the property uses: a comma for a list of colors, a\nspace for a list of grid tracks. Whichever it is, the trap is the same one\nfrom opposite sides. `split(',')` turns\n`#ef4444, rgb(249 115 22), rgba(34,197,94,.5)` into six fragments, four of\nthem not colors, and a row of swatches quietly draws three instead of four.\n`split(/\\s+/)` turns `minmax(0, 1fr)` into two tracks, and a grid given a\ntrack it cannot read draws one column. Both spellings look like they work,\nbecause the modern space-separated color forms and the single-keyword tracks\nsurvive them.\n\nDepth rather than a regular expression, because what matters is whether the\nseparator is inside a call and that is exactly what a counter answers.\nBrackets count with parentheses, since a grid's line names are written in\nthem. Nesting is counted rather than assumed away: `minmax(0, calc(1px + 1%))`\nis one value.\n\nEmpty values are dropped, so a leading, doubled or trailing separator leaves\nnothing behind to be parsed as a value nobody wrote."
11522
+ }
11523
+ ],
11524
+ "exports": [
11525
+ {
11526
+ "kind": "js",
11527
+ "name": "splitValues",
11528
+ "declaration": {
11529
+ "name": "splitValues",
11530
+ "module": "src/utils/split-values/split-values.ts"
11531
+ }
11532
+ }
11533
+ ]
11534
+ },
11108
11535
  {
11109
11536
  "kind": "javascript-module",
11110
11537
  "path": "src/utils/tell-disclosure/tell-disclosure.ts",
@@ -11356,6 +11783,60 @@
11356
11783
  ],
11357
11784
  "description": "The `HH:mm` value for a time, or the empty string.\n\nSeconds are written only where there are any, because `HH:mm` is what this\nlibrary's time controls hold and a trailing `:00` on every value would be a\nformat change dressed as a conversion."
11358
11785
  },
11786
+ {
11787
+ "kind": "function",
11788
+ "name": "valueAsMinutes",
11789
+ "return": {
11790
+ "type": {
11791
+ "text": "number | null"
11792
+ }
11793
+ },
11794
+ "parameters": [
11795
+ {
11796
+ "name": "value",
11797
+ "type": {
11798
+ "text": "string"
11799
+ }
11800
+ }
11801
+ ],
11802
+ "description": "The minutes since midnight an `HH:mm` value names, or `null`.\n\n**Minute precision, which is narrower than `valueAsTime` above and is meant\nto be.** That one takes seconds because `<input type=\"time\">` does at a step\nbelow a minute. This library's time controls have no such step: theirs is in\nminutes and floored at one, so nothing they offer or write ever carries a\nsecond, and a value that did would lose it here silently. Two readings of one\nstring, and a control picks the one it can hold."
11803
+ },
11804
+ {
11805
+ "kind": "function",
11806
+ "name": "minutesAsValue",
11807
+ "return": {
11808
+ "type": {
11809
+ "text": "string"
11810
+ }
11811
+ },
11812
+ "parameters": [
11813
+ {
11814
+ "name": "minutes",
11815
+ "type": {
11816
+ "text": "number"
11817
+ }
11818
+ }
11819
+ ],
11820
+ "description": "Minutes since midnight as `HH:mm`, wrapping rather than running off the day.\n\nA step past midnight is the next morning, which is what a list of offered\ntimes does at its end and what an arrow key does at either."
11821
+ },
11822
+ {
11823
+ "kind": "function",
11824
+ "name": "isTimeValue",
11825
+ "return": {
11826
+ "type": {
11827
+ "text": "boolean"
11828
+ }
11829
+ },
11830
+ "parameters": [
11831
+ {
11832
+ "name": "value",
11833
+ "type": {
11834
+ "text": "string"
11835
+ }
11836
+ }
11837
+ ],
11838
+ "description": "Whether a value is a time these controls can hold, which is minute precision."
11839
+ },
11359
11840
  {
11360
11841
  "kind": "function",
11361
11842
  "name": "valueAsNumber",
@@ -11434,6 +11915,30 @@
11434
11915
  "module": "src/utils/value-as/value-as.ts"
11435
11916
  }
11436
11917
  },
11918
+ {
11919
+ "kind": "js",
11920
+ "name": "valueAsMinutes",
11921
+ "declaration": {
11922
+ "name": "valueAsMinutes",
11923
+ "module": "src/utils/value-as/value-as.ts"
11924
+ }
11925
+ },
11926
+ {
11927
+ "kind": "js",
11928
+ "name": "minutesAsValue",
11929
+ "declaration": {
11930
+ "name": "minutesAsValue",
11931
+ "module": "src/utils/value-as/value-as.ts"
11932
+ }
11933
+ },
11934
+ {
11935
+ "kind": "js",
11936
+ "name": "isTimeValue",
11937
+ "declaration": {
11938
+ "name": "isTimeValue",
11939
+ "module": "src/utils/value-as/value-as.ts"
11940
+ }
11941
+ },
11437
11942
  {
11438
11943
  "kind": "js",
11439
11944
  "name": "valueAsNumber",
@@ -11452,6 +11957,47 @@
11452
11957
  }
11453
11958
  ]
11454
11959
  },
11960
+ {
11961
+ "kind": "javascript-module",
11962
+ "path": "src/utils/write-time/write-time.ts",
11963
+ "declarations": [
11964
+ {
11965
+ "kind": "function",
11966
+ "name": "writeTime",
11967
+ "return": {
11968
+ "type": {
11969
+ "text": "string"
11970
+ }
11971
+ },
11972
+ "parameters": [
11973
+ {
11974
+ "name": "value",
11975
+ "type": {
11976
+ "text": "string"
11977
+ }
11978
+ },
11979
+ {
11980
+ "name": "locale",
11981
+ "optional": true,
11982
+ "type": {
11983
+ "text": "string"
11984
+ }
11985
+ }
11986
+ ],
11987
+ "description": "A time written the way the reader's locale writes one.\n\n`Intl` decides between a twelve and a twenty-four hour clock, because that is\na property of the locale rather than of any component: `en-US` gets `2:30 PM`\nand `en-GB` gets `14:30` without either being configured. There is no flag to\nforce one, deliberately. A product that needs to override its reader's own\nconvention has a locale problem rather than a component one, and the value is\n24 hour regardless.\n\nA value this cannot read is handed back unchanged, so a field showing what is\nbeing typed shows the letters rather than blanking under the reader."
11988
+ }
11989
+ ],
11990
+ "exports": [
11991
+ {
11992
+ "kind": "js",
11993
+ "name": "writeTime",
11994
+ "declaration": {
11995
+ "name": "writeTime",
11996
+ "module": "src/utils/write-time/write-time.ts"
11997
+ }
11998
+ }
11999
+ ]
12000
+ },
11455
12001
  {
11456
12002
  "kind": "javascript-module",
11457
12003
  "path": "src/utils/written-list/written-list.ts",
@@ -11473,6 +12019,24 @@
11473
12019
  }
11474
12020
  ],
11475
12021
  "description": "A list a consumer wrote into an attribute, split the way they write one.\n\n**Whitespace or commas, because a reader listing words puts commas between\nthem.** A split on whitespace alone turns `extra-controls=\"speed, pip\"` into\n`speed,` and `pip`, and `speed,` is not a control name: the control is\ndropped, nothing is logged, and the docblock on the property says\nunrecognized values are skipped, so the behavior looks like the documented\none. That is the undebuggable case `gridlines` names in its own docblock,\narrived at from the other direction, and it is why the widest spelling is the\none every consumer-written list takes.\n\n**Not for a value.** A payload is comma separated and nothing else, because a\nvalue may hold a space: splitting `value=\"New York,Paris\"` on whitespace\nwould submit a city that does not exist. Select, Listbox, Combobox and\nCheckbox Group each split their own value on a comma and trim, which is the\nother rule and not a lesser version of this one.\n\n**Nor for an IDREF list**, which is the platform's own format: `aria-*` and\n`for` take whitespace and only whitespace, and accepting a comma there would\nresolve an id nobody can write."
12022
+ },
12023
+ {
12024
+ "kind": "function",
12025
+ "name": "writtenNumbers",
12026
+ "return": {
12027
+ "type": {
12028
+ "text": "number[]"
12029
+ }
12030
+ },
12031
+ "parameters": [
12032
+ {
12033
+ "name": "source",
12034
+ "type": {
12035
+ "text": "string | undefined"
12036
+ }
12037
+ }
12038
+ ],
12039
+ "description": "The same list read as numbers, with everything that is not one dropped.\n\n**A stray entry leaves rather than becoming `NaN`.** A comparison against\n`NaN` is false in both directions and a `NaN` drawn is nothing at all, so one\nmistyped bound in `thresholds=\"0, 1, x, 6\"` would color cells by a rule no\nreader can see. Dropped, the rest of the list still means what it says.\n\n**Which numbers count is the caller's question.** Finiteness is all this can\nanswer, because a number that makes sense here is a bound, a reading and a\nplayback rate, and only the caller knows that a rate of zero is not a rate."
11476
12040
  }
11477
12041
  ],
11478
12042
  "exports": [
@@ -11483,6 +12047,14 @@
11483
12047
  "name": "writtenList",
11484
12048
  "module": "src/utils/written-list/written-list.ts"
11485
12049
  }
12050
+ },
12051
+ {
12052
+ "kind": "js",
12053
+ "name": "writtenNumbers",
12054
+ "declaration": {
12055
+ "name": "writtenNumbers",
12056
+ "module": "src/utils/written-list/written-list.ts"
12057
+ }
11486
12058
  }
11487
12059
  ]
11488
12060
  }