@fusion.dev/helix-core 0.188.0 → 0.190.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.
@@ -8738,6 +8738,22 @@
8738
8738
  "module": "./details.js"
8739
8739
  }
8740
8740
  },
8741
+ {
8742
+ "kind": "js",
8743
+ "name": "PlotChangeDetail",
8744
+ "declaration": {
8745
+ "name": "PlotChangeDetail",
8746
+ "module": "./details.js"
8747
+ }
8748
+ },
8749
+ {
8750
+ "kind": "js",
8751
+ "name": "PlotTurnDetail",
8752
+ "declaration": {
8753
+ "name": "PlotTurnDetail",
8754
+ "module": "./details.js"
8755
+ }
8756
+ },
8741
8757
  {
8742
8758
  "kind": "js",
8743
8759
  "name": "PressDetail",
@@ -9458,6 +9474,22 @@
9458
9474
  "module": "src/events/events.ts"
9459
9475
  }
9460
9476
  },
9477
+ {
9478
+ "kind": "js",
9479
+ "name": "HelixPlotChangeEvent",
9480
+ "declaration": {
9481
+ "name": "HelixPlotChangeEvent",
9482
+ "module": "src/events/events.ts"
9483
+ }
9484
+ },
9485
+ {
9486
+ "kind": "js",
9487
+ "name": "HelixPlotTurnEvent",
9488
+ "declaration": {
9489
+ "name": "HelixPlotTurnEvent",
9490
+ "module": "src/events/events.ts"
9491
+ }
9492
+ },
9461
9493
  {
9462
9494
  "kind": "js",
9463
9495
  "name": "HelixPressEvent",
@@ -10546,7 +10578,7 @@
10546
10578
  "type": {
10547
10579
  "text": "ReadonlySet<string>"
10548
10580
  },
10549
- "default": "new Set( ( 'action activate aura-fallback band before-activate before-change before-close ' + 'before-collapse before-edit before-move before-open before-panel-resize before-paste before-pin ' + 'before-reconnect before-relabel before-reorder before-resize before-split before-toggle ' + 'canvas-edit canvas-pan canvas-view canvas-zoom caret clear collapse complete ' + 'connect console copy copy-error create dismiss edit end expand facet filter ' + 'filtered graph-filter graph-layout graph-pan graph-part-change graph-ready ' + 'graph-signal graph-zoom history load load-more map-cluster map-pan map-part-change ' + 'map-ready map-rotate map-tilt map-zoom move navigate next panel-resize pasted pin press ' + 'preview previous range-change read reading-change reading-press reconnect reject ' + 'relabel remove reorder ' + 'reordered resize resized sample-end sample-start scrolled select selected send ' + 'shortcut sort sorted split strands-fallback toggle tour-ask tour-status typing' ) .split(' ') .map((name) => `helix-${name}`), )",
10581
+ "default": "new Set( ( 'action activate aura-fallback band before-activate before-change before-close ' + 'before-collapse before-edit before-move before-open before-panel-resize before-paste before-pin ' + 'before-reconnect before-relabel before-reorder before-resize before-split before-toggle ' + 'canvas-edit canvas-pan canvas-view canvas-zoom caret clear collapse complete ' + 'connect console copy copy-error create dismiss edit end expand facet filter ' + 'filtered graph-filter graph-layout graph-pan graph-part-change graph-ready ' + 'graph-signal graph-zoom history load load-more map-cluster map-pan map-part-change ' + 'map-ready map-rotate map-tilt map-zoom move navigate next panel-resize pasted pin plot-change ' + 'plot-turn press ' + 'preview previous range-change read reading-change reading-press reconnect reject ' + 'relabel remove reorder ' + 'reordered resize resized sample-end sample-start scrolled select selected send ' + 'shortcut sort sorted split strands-fallback toggle tour-ask tour-status typing' ) .split(' ') .map((name) => `helix-${name}`), )",
10550
10582
  "description": "Every name this library dispatches.\n\nExported so a runtime check can ask whether a name is one of ours without\nkeeping a second list of them. `HelixElement` uses it to tell a consumer that\nthe handler prop they wrote is attached to nothing.\n\n**Written as strings, in a module of its own, and not read off the\nclasses in `registry`.** Every element carries this set through its React\nprop audit, and a set read off the classes kept every class alive in every\nbundle: a Badge shipped all eighty of them. As strings, a family ships the\nclasses it dispatches and no others. `events.pure.spec.ts` holds this list to\nthe classes, so a class added without its name here fails.\n\n**Without the shared `helix-`, and separated by spaces.** Every element carries this\nlist, and as quoted strings each paid its quotes, its comma and the prefix."
10551
10583
  }
10552
10584
  ],
@@ -10751,6 +10783,82 @@
10751
10783
  }
10752
10784
  ]
10753
10785
  },
10786
+ {
10787
+ "kind": "javascript-module",
10788
+ "path": "src/events/plot-change.ts",
10789
+ "declarations": [
10790
+ {
10791
+ "kind": "class",
10792
+ "description": "A plot's points or the point the keys rest on changed, which the connector\nhears and the renderer is told. It stays on the plot, being the family's\nown bookkeeping rather than news for a page.",
10793
+ "name": "HelixPlotChangeEvent",
10794
+ "members": [
10795
+ {
10796
+ "kind": "field",
10797
+ "name": "eventName",
10798
+ "type": {
10799
+ "text": "string"
10800
+ },
10801
+ "static": true,
10802
+ "readonly": true,
10803
+ "default": "'helix-plot-change'"
10804
+ }
10805
+ ],
10806
+ "superclass": {
10807
+ "name": "CustomEvent",
10808
+ "module": "src/events/plot-change.ts"
10809
+ },
10810
+ "helix": {}
10811
+ }
10812
+ ],
10813
+ "exports": [
10814
+ {
10815
+ "kind": "js",
10816
+ "name": "HelixPlotChangeEvent",
10817
+ "declaration": {
10818
+ "name": "HelixPlotChangeEvent",
10819
+ "module": "src/events/plot-change.ts"
10820
+ }
10821
+ }
10822
+ ]
10823
+ },
10824
+ {
10825
+ "kind": "javascript-module",
10826
+ "path": "src/events/plot-turn.ts",
10827
+ "declarations": [
10828
+ {
10829
+ "kind": "class",
10830
+ "description": "The reader asked a 3D plot to turn by key: steps across and up, which the renderer turns by.",
10831
+ "name": "HelixPlotTurnEvent",
10832
+ "members": [
10833
+ {
10834
+ "kind": "field",
10835
+ "name": "eventName",
10836
+ "type": {
10837
+ "text": "string"
10838
+ },
10839
+ "static": true,
10840
+ "readonly": true,
10841
+ "default": "'helix-plot-turn'"
10842
+ }
10843
+ ],
10844
+ "superclass": {
10845
+ "name": "CustomEvent",
10846
+ "module": "src/events/plot-turn.ts"
10847
+ },
10848
+ "helix": {}
10849
+ }
10850
+ ],
10851
+ "exports": [
10852
+ {
10853
+ "kind": "js",
10854
+ "name": "HelixPlotTurnEvent",
10855
+ "declaration": {
10856
+ "name": "HelixPlotTurnEvent",
10857
+ "module": "src/events/plot-turn.ts"
10858
+ }
10859
+ }
10860
+ ]
10861
+ },
10754
10862
  {
10755
10863
  "kind": "javascript-module",
10756
10864
  "path": "src/events/press.ts",
@@ -15583,6 +15691,22 @@
15583
15691
  "module": "./events/events.js"
15584
15692
  }
15585
15693
  },
15694
+ {
15695
+ "kind": "js",
15696
+ "name": "HelixPlotChangeEvent",
15697
+ "declaration": {
15698
+ "name": "HelixPlotChangeEvent",
15699
+ "module": "./events/events.js"
15700
+ }
15701
+ },
15702
+ {
15703
+ "kind": "js",
15704
+ "name": "HelixPlotTurnEvent",
15705
+ "declaration": {
15706
+ "name": "HelixPlotTurnEvent",
15707
+ "module": "./events/events.js"
15708
+ }
15709
+ },
15586
15710
  {
15587
15711
  "kind": "js",
15588
15712
  "name": "HelixPressEvent",
@@ -15903,6 +16027,22 @@
15903
16027
  "module": "./events/events.js"
15904
16028
  }
15905
16029
  },
16030
+ {
16031
+ "kind": "js",
16032
+ "name": "PlotChangeDetail",
16033
+ "declaration": {
16034
+ "name": "PlotChangeDetail",
16035
+ "module": "./events/events.js"
16036
+ }
16037
+ },
16038
+ {
16039
+ "kind": "js",
16040
+ "name": "PlotTurnDetail",
16041
+ "declaration": {
16042
+ "name": "PlotTurnDetail",
16043
+ "module": "./events/events.js"
16044
+ }
16045
+ },
15906
16046
  {
15907
16047
  "kind": "js",
15908
16048
  "name": "PressDetail",
@@ -17015,6 +17155,38 @@
17015
17155
  "module": "./utils/column-step/column-step.js"
17016
17156
  }
17017
17157
  },
17158
+ {
17159
+ "kind": "js",
17160
+ "name": "contextBudget",
17161
+ "declaration": {
17162
+ "name": "contextBudget",
17163
+ "module": "./utils/context-budget/context-budget.js"
17164
+ }
17165
+ },
17166
+ {
17167
+ "kind": "js",
17168
+ "name": "Holder",
17169
+ "declaration": {
17170
+ "name": "Holder",
17171
+ "module": "./utils/context-budget/context-budget.js"
17172
+ }
17173
+ },
17174
+ {
17175
+ "kind": "js",
17176
+ "name": "LIVE",
17177
+ "declaration": {
17178
+ "name": "LIVE",
17179
+ "module": "./utils/context-budget/context-budget.js"
17180
+ }
17181
+ },
17182
+ {
17183
+ "kind": "js",
17184
+ "name": "pageBudget",
17185
+ "declaration": {
17186
+ "name": "pageBudget",
17187
+ "module": "./utils/context-budget/context-budget.js"
17188
+ }
17189
+ },
17018
17190
  {
17019
17191
  "kind": "js",
17020
17192
  "name": "countLabel",
@@ -17847,6 +18019,110 @@
17847
18019
  "module": "./utils/press-type/press-type.js"
17848
18020
  }
17849
18021
  },
18022
+ {
18023
+ "kind": "js",
18024
+ "name": "Camera",
18025
+ "declaration": {
18026
+ "name": "Camera",
18027
+ "module": "./utils/projection/projection.js"
18028
+ }
18029
+ },
18030
+ {
18031
+ "kind": "js",
18032
+ "name": "Drawn",
18033
+ "declaration": {
18034
+ "name": "Drawn",
18035
+ "module": "./utils/projection/projection.js"
18036
+ }
18037
+ },
18038
+ {
18039
+ "kind": "js",
18040
+ "name": "depthOrder",
18041
+ "declaration": {
18042
+ "name": "depthOrder",
18043
+ "module": "./utils/projection/projection.js"
18044
+ }
18045
+ },
18046
+ {
18047
+ "kind": "js",
18048
+ "name": "Face",
18049
+ "declaration": {
18050
+ "name": "Face",
18051
+ "module": "./utils/projection/projection.js"
18052
+ }
18053
+ },
18054
+ {
18055
+ "kind": "js",
18056
+ "name": "ISOMETRIC",
18057
+ "declaration": {
18058
+ "name": "ISOMETRIC",
18059
+ "module": "./utils/projection/projection.js"
18060
+ }
18061
+ },
18062
+ {
18063
+ "kind": "js",
18064
+ "name": "LOWEST_TILT",
18065
+ "declaration": {
18066
+ "name": "LOWEST_TILT",
18067
+ "module": "./utils/projection/projection.js"
18068
+ }
18069
+ },
18070
+ {
18071
+ "kind": "js",
18072
+ "name": "PagePoint",
18073
+ "declaration": {
18074
+ "name": "PagePoint",
18075
+ "module": "./utils/projection/projection.js"
18076
+ }
18077
+ },
18078
+ {
18079
+ "kind": "js",
18080
+ "name": "Projection",
18081
+ "declaration": {
18082
+ "name": "Projection",
18083
+ "module": "./utils/projection/projection.js"
18084
+ }
18085
+ },
18086
+ {
18087
+ "kind": "js",
18088
+ "name": "pathData",
18089
+ "declaration": {
18090
+ "name": "pathData",
18091
+ "module": "./utils/projection/projection.js"
18092
+ }
18093
+ },
18094
+ {
18095
+ "kind": "js",
18096
+ "name": "projectionOf",
18097
+ "declaration": {
18098
+ "name": "projectionOf",
18099
+ "module": "./utils/projection/projection.js"
18100
+ }
18101
+ },
18102
+ {
18103
+ "kind": "js",
18104
+ "name": "Solid",
18105
+ "declaration": {
18106
+ "name": "Solid",
18107
+ "module": "./utils/projection/projection.js"
18108
+ }
18109
+ },
18110
+ {
18111
+ "kind": "js",
18112
+ "name": "shortNumber",
18113
+ "declaration": {
18114
+ "name": "shortNumber",
18115
+ "module": "./utils/projection/projection.js"
18116
+ }
18117
+ },
18118
+ {
18119
+ "kind": "js",
18120
+ "name": "solid",
18121
+ "declaration": {
18122
+ "name": "solid",
18123
+ "module": "./utils/projection/projection.js"
18124
+ }
18125
+ },
17850
18126
  {
17851
18127
  "kind": "js",
17852
18128
  "name": "rangeAdd",
@@ -28102,6 +28378,71 @@
28102
28378
  }
28103
28379
  ]
28104
28380
  },
28381
+ {
28382
+ "kind": "javascript-module",
28383
+ "path": "src/utils/context-budget/context-budget.ts",
28384
+ "declarations": [
28385
+ {
28386
+ "kind": "variable",
28387
+ "name": "LIVE",
28388
+ "type": {
28389
+ "text": "number"
28390
+ },
28391
+ "default": "6",
28392
+ "description": "How many WebGL contexts Helix's three.js drivers keep live on one page.\n\n**A browser holds only so many, and drops the oldest without asking**:\nChrome about sixteen on a desktop and fewer on a phone. A page of 3D panels\npast that lost a graph it could not get back, and the maps, Aura, and\nStrands on the same page count against the same limit. Six leaves them\nroom."
28393
+ },
28394
+ {
28395
+ "kind": "function",
28396
+ "name": "contextBudget",
28397
+ "parameters": [
28398
+ {
28399
+ "name": "cap",
28400
+ "default": "LIVE",
28401
+ "type": {
28402
+ "text": "number"
28403
+ }
28404
+ }
28405
+ ],
28406
+ "description": "Keeps the contexts a page's drawings hold under `cap`.\n\n**A drawing near the screen always keeps its context.** Past the cap, the\ndrawings off screen give theirs back, the one away longest first, and each\ntakes its context again as it comes near. So a page of any number of\ngraphs holds as many contexts as it shows at once, and never more than\n`cap` beyond that."
28407
+ },
28408
+ {
28409
+ "kind": "function",
28410
+ "name": "pageBudget",
28411
+ "return": {
28412
+ "type": {
28413
+ "text": "Budget"
28414
+ }
28415
+ },
28416
+ "description": "The budget every three.js driver on the page shares: the graph's and the\nplot's, whichever package and whichever copy of Helix each came from.\n\n**Kept on the page, under a registered symbol**, since a page can load two\ncopies of this module, one bundled with each driver, and two budgets of six\nwould let the page hold twelve."
28417
+ }
28418
+ ],
28419
+ "exports": [
28420
+ {
28421
+ "kind": "js",
28422
+ "name": "LIVE",
28423
+ "declaration": {
28424
+ "name": "LIVE",
28425
+ "module": "src/utils/context-budget/context-budget.ts"
28426
+ }
28427
+ },
28428
+ {
28429
+ "kind": "js",
28430
+ "name": "contextBudget",
28431
+ "declaration": {
28432
+ "name": "contextBudget",
28433
+ "module": "src/utils/context-budget/context-budget.ts"
28434
+ }
28435
+ },
28436
+ {
28437
+ "kind": "js",
28438
+ "name": "pageBudget",
28439
+ "declaration": {
28440
+ "name": "pageBudget",
28441
+ "module": "src/utils/context-budget/context-budget.ts"
28442
+ }
28443
+ }
28444
+ ]
28445
+ },
28105
28446
  {
28106
28447
  "kind": "javascript-module",
28107
28448
  "path": "src/utils/count-label/count-label.ts",
@@ -31544,6 +31885,213 @@
31544
31885
  }
31545
31886
  ]
31546
31887
  },
31888
+ {
31889
+ "kind": "javascript-module",
31890
+ "path": "src/utils/projection/projection.ts",
31891
+ "declarations": [
31892
+ {
31893
+ "kind": "variable",
31894
+ "name": "ISOMETRIC",
31895
+ "type": {
31896
+ "text": "Camera"
31897
+ },
31898
+ "default": "{ tilt: (Math.atan(Math.SQRT1_2) * 180) / Math.PI, turn: 45 }",
31899
+ "description": "The isometric camera: from the front left corner, at the height where the\nfloor's two axes and the vertical are drawn the same length, 35.26 degrees."
31900
+ },
31901
+ {
31902
+ "kind": "variable",
31903
+ "name": "LOWEST_TILT",
31904
+ "type": {
31905
+ "text": "number"
31906
+ },
31907
+ "default": "15",
31908
+ "description": "The lowest a camera may tilt, below which the floor folds to a line."
31909
+ },
31910
+ {
31911
+ "kind": "function",
31912
+ "name": "projectionOf",
31913
+ "return": {
31914
+ "type": {
31915
+ "text": "Projection"
31916
+ }
31917
+ },
31918
+ "parameters": [
31919
+ {
31920
+ "name": "camera",
31921
+ "type": {
31922
+ "text": "Camera"
31923
+ }
31924
+ }
31925
+ ],
31926
+ "description": "The view from `camera`, an orthographic one: the floor turned by `turn`\nand seen from `tilt` above it, with no perspective, so a cell is the same\nsize wherever it stands."
31927
+ },
31928
+ {
31929
+ "kind": "function",
31930
+ "name": "shortNumber",
31931
+ "return": {
31932
+ "type": {
31933
+ "text": "string"
31934
+ }
31935
+ },
31936
+ "parameters": [
31937
+ {
31938
+ "name": "value",
31939
+ "type": {
31940
+ "text": "number"
31941
+ }
31942
+ }
31943
+ ],
31944
+ "description": "A number written short enough for path data, and never as `-0`."
31945
+ },
31946
+ {
31947
+ "kind": "function",
31948
+ "name": "pathData",
31949
+ "return": {
31950
+ "type": {
31951
+ "text": "string"
31952
+ }
31953
+ },
31954
+ "parameters": [
31955
+ {
31956
+ "name": "points",
31957
+ "type": {
31958
+ "text": "readonly PagePoint[]"
31959
+ }
31960
+ }
31961
+ ]
31962
+ },
31963
+ {
31964
+ "kind": "function",
31965
+ "name": "solid",
31966
+ "return": {
31967
+ "type": {
31968
+ "text": "Drawn"
31969
+ }
31970
+ },
31971
+ "parameters": [
31972
+ {
31973
+ "name": "projection",
31974
+ "type": {
31975
+ "text": "Projection"
31976
+ }
31977
+ },
31978
+ {
31979
+ "name": "kind",
31980
+ "type": {
31981
+ "text": "Solid"
31982
+ }
31983
+ },
31984
+ {
31985
+ "name": "x",
31986
+ "type": {
31987
+ "text": "number"
31988
+ }
31989
+ },
31990
+ {
31991
+ "name": "y",
31992
+ "type": {
31993
+ "text": "number"
31994
+ }
31995
+ },
31996
+ {
31997
+ "name": "width",
31998
+ "type": {
31999
+ "text": "number"
32000
+ }
32001
+ },
32002
+ {
32003
+ "name": "height",
32004
+ "type": {
32005
+ "text": "number"
32006
+ }
32007
+ }
32008
+ ],
32009
+ "description": "A note as a solid, standing on the floor at `x` and `y`, `width` cells\nacross its footprint and `height` cells tall, as the camera sees it.\n\n**Each face is drawn only where it turns toward the camera**, so a block\nshows its top and the two sides that face the viewer from any turn, and a\nplan seen from straight above shows tops alone."
32010
+ },
32011
+ {
32012
+ "kind": "function",
32013
+ "name": "depthOrder",
32014
+ "return": {
32015
+ "type": {
32016
+ "text": "T[]"
32017
+ }
32018
+ },
32019
+ "parameters": [
32020
+ {
32021
+ "name": "projection",
32022
+ "type": {
32023
+ "text": "Projection"
32024
+ }
32025
+ },
32026
+ {
32027
+ "name": "notes",
32028
+ "type": {
32029
+ "text": "readonly T[]"
32030
+ }
32031
+ }
32032
+ ],
32033
+ "description": "The order to paint notes in, back to front: by how near the camera each\nstands on the floor, and the taller first where two stand level.\n\nExact for notes on whole cells, which do not overlap on the floor; two\nnotes placed inside one cell can still cross."
32034
+ }
32035
+ ],
32036
+ "exports": [
32037
+ {
32038
+ "kind": "js",
32039
+ "name": "ISOMETRIC",
32040
+ "declaration": {
32041
+ "name": "ISOMETRIC",
32042
+ "module": "src/utils/projection/projection.ts"
32043
+ }
32044
+ },
32045
+ {
32046
+ "kind": "js",
32047
+ "name": "LOWEST_TILT",
32048
+ "declaration": {
32049
+ "name": "LOWEST_TILT",
32050
+ "module": "src/utils/projection/projection.ts"
32051
+ }
32052
+ },
32053
+ {
32054
+ "kind": "js",
32055
+ "name": "projectionOf",
32056
+ "declaration": {
32057
+ "name": "projectionOf",
32058
+ "module": "src/utils/projection/projection.ts"
32059
+ }
32060
+ },
32061
+ {
32062
+ "kind": "js",
32063
+ "name": "shortNumber",
32064
+ "declaration": {
32065
+ "name": "shortNumber",
32066
+ "module": "src/utils/projection/projection.ts"
32067
+ }
32068
+ },
32069
+ {
32070
+ "kind": "js",
32071
+ "name": "pathData",
32072
+ "declaration": {
32073
+ "name": "pathData",
32074
+ "module": "src/utils/projection/projection.ts"
32075
+ }
32076
+ },
32077
+ {
32078
+ "kind": "js",
32079
+ "name": "solid",
32080
+ "declaration": {
32081
+ "name": "solid",
32082
+ "module": "src/utils/projection/projection.ts"
32083
+ }
32084
+ },
32085
+ {
32086
+ "kind": "js",
32087
+ "name": "depthOrder",
32088
+ "declaration": {
32089
+ "name": "depthOrder",
32090
+ "module": "src/utils/projection/projection.ts"
32091
+ }
32092
+ }
32093
+ ]
32094
+ },
31547
32095
  {
31548
32096
  "kind": "javascript-module",
31549
32097
  "path": "src/utils/range-add/range-add.ts",
@@ -35683,7 +36231,7 @@
35683
36231
  "type": {
35684
36232
  "text": "string"
35685
36233
  },
35686
- "default": "'0.188.0'",
36234
+ "default": "'0.190.0'",
35687
36235
  "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
36236
  }
35689
36237
  ],
@@ -36319,6 +36867,6 @@
36319
36867
  ],
36320
36868
  "helix": {
36321
36869
  "package": "@fusion.dev/helix-core",
36322
- "version": "0.188.0"
36870
+ "version": "0.190.0"
36323
36871
  }
36324
36872
  }
@@ -363,6 +363,18 @@ export interface GraphPartChangeDetail {
363
363
  */
364
364
  kind: 'data' | 'focus' | 'gestures';
365
365
  }
366
+ /** Detail carried by `helix-plot-change`. */
367
+ export interface PlotChangeDetail {
368
+ /** `data` for the points or the axes, which are drawn again; `focus` for the point the keys rest on. */
369
+ kind: 'data' | 'focus';
370
+ }
371
+ /** Detail carried by `helix-plot-turn`. */
372
+ export interface PlotTurnDetail {
373
+ /** Steps to turn about the vertical, positive to the right. */
374
+ across: number;
375
+ /** Steps to tilt, positive to look from higher. */
376
+ up: number;
377
+ }
366
378
  /** One signal between two notes, as the frame's `signal()` sends it. */
367
379
  export interface GraphSignalDetail {
368
380
  /** The note the signal leaves, by its `id`. */
@@ -91,6 +91,8 @@ import { HelixNextEvent } from './next.js';
91
91
  import { HelixPanelResizeEvent } from './panel-resize.js';
92
92
  import { HelixPastedEvent } from './pasted.js';
93
93
  import { HelixPinEvent } from './pin.js';
94
+ import { HelixPlotChangeEvent } from './plot-change.js';
95
+ import { HelixPlotTurnEvent } from './plot-turn.js';
94
96
  import { HelixPressEvent } from './press.js';
95
97
  import { HelixPreviewEvent } from './preview.js';
96
98
  import { HelixPreviousEvent } from './previous.js';
@@ -121,9 +123,9 @@ import { HelixToggleEvent } from './toggle.js';
121
123
  import { HelixTourAskEvent } from './tour-ask.js';
122
124
  import { HelixTourStatusEvent } from './tour-status.js';
123
125
  import { HelixTypingEvent } from './typing.js';
124
- export type { ActivateDetail, AuraFallbackDetail, BandDetail, CanvasView, CaretDetail, ChangeDetail, CompleteDetail, ConnectDetail, ConsoleDetail, CopyDetail, CreateDetail, DismissDetail, FacetDetail, FilterDetail, GraphFilterDetail, GraphLayoutDetail, GraphPartChangeDetail, GraphSignalDetail, MapClusterDetail, MapPanDetail, MapPartChangeDetail, MapRotateDetail, MapTiltDetail, MapZoomDetail, MoveDetail, NavigateDetail, OpenDetail, PasteDetail, PressDetail, PressPointerType, RangeDetail, ReadDetail, ReadingDetail, ReconnectDetail, Refusal, RefusedFile, RejectDetail, RelabelDetail, RemoveDetail, ReorderDetail, ResizeDetail, ScrolledDetail, SelectDetail, SendDetail, ShortcutDetail, SkipDetail, SortDetail, StrandsFallbackDetail, ToggleDetail, TourAskDetail, TourStatusDetail, TypingDetail, ViewportPanDetail, ViewportZoomDetail, } from './details.js';
126
+ export type { ActivateDetail, AuraFallbackDetail, BandDetail, CanvasView, CaretDetail, ChangeDetail, CompleteDetail, ConnectDetail, ConsoleDetail, CopyDetail, CreateDetail, DismissDetail, FacetDetail, FilterDetail, GraphFilterDetail, GraphLayoutDetail, GraphPartChangeDetail, GraphSignalDetail, MapClusterDetail, MapPanDetail, MapPartChangeDetail, MapRotateDetail, MapTiltDetail, MapZoomDetail, MoveDetail, NavigateDetail, OpenDetail, PasteDetail, PlotChangeDetail, PlotTurnDetail, PressDetail, PressPointerType, RangeDetail, ReadDetail, ReadingDetail, ReconnectDetail, Refusal, RefusedFile, RejectDetail, RelabelDetail, RemoveDetail, ReorderDetail, ResizeDetail, ScrolledDetail, SelectDetail, SendDetail, ShortcutDetail, SkipDetail, SortDetail, StrandsFallbackDetail, ToggleDetail, TourAskDetail, TourStatusDetail, TypingDetail, ViewportPanDetail, ViewportZoomDetail, } from './details.js';
125
127
  export { helixEventNames } from './names.js';
126
- export { HelixActionEvent, HelixActivateEvent, HelixAuraFallbackEvent, HelixBandEvent, HelixBeforeActivateEvent, HelixBeforeChangeEvent, HelixBeforeCloseEvent, HelixBeforeCollapseEvent, HelixBeforeEditEvent, HelixBeforeMoveEvent, HelixBeforeOpenEvent, HelixBeforePanelResizeEvent, HelixBeforePasteEvent, HelixBeforePinEvent, HelixBeforeReconnectEvent, HelixBeforeRelabelEvent, HelixBeforeReorderEvent, HelixBeforeResizeEvent, HelixBeforeSplitEvent, HelixBeforeToggleEvent, HelixCanvasEditEvent, HelixCanvasPanEvent, HelixCanvasViewEvent, HelixCanvasZoomEvent, HelixCaretEvent, HelixClearEvent, HelixCollapseEvent, HelixCompleteEvent, HelixConnectEvent, HelixConsoleEvent, HelixCopyErrorEvent, HelixCopyEvent, HelixCreateEvent, HelixDismissEvent, HelixEditEvent, HelixEndEvent, HelixExpandEvent, HelixFacetEvent, HelixFilterEvent, HelixFilteredEvent, HelixGraphFilterEvent, HelixGraphLayoutEvent, HelixGraphPanEvent, HelixGraphPartChangeEvent, HelixGraphReadyEvent, HelixGraphSignalEvent, HelixGraphZoomEvent, HelixHistoryEvent, HelixLoadEvent, HelixLoadMoreEvent, HelixMapClusterEvent, HelixMapPanEvent, HelixMapPartChangeEvent, HelixMapReadyEvent, HelixMapRotateEvent, HelixMapTiltEvent, HelixMapZoomEvent, HelixMoveEvent, HelixNavigateEvent, HelixNextEvent, HelixPanelResizeEvent, HelixPastedEvent, HelixPinEvent, HelixPressEvent, HelixPreviewEvent, HelixPreviousEvent, HelixRangeChangeEvent, HelixReadEvent, HelixReadingChangeEvent, HelixReadingPressEvent, HelixReconnectEvent, HelixRejectEvent, HelixRelabelEvent, HelixRemoveEvent, HelixReorderEvent, HelixReorderedEvent, HelixResizedEvent, HelixResizeEvent, HelixSampleEndEvent, HelixSampleStartEvent, HelixScrolledEvent, HelixSelectEvent, HelixSelectedEvent, HelixSendEvent, HelixShortcutEvent, HelixSortEvent, HelixSortedEvent, HelixSplitEvent, HelixStrandsFallbackEvent, HelixToggleEvent, HelixTourAskEvent, HelixTourStatusEvent, HelixTypingEvent, };
128
+ export { HelixActionEvent, HelixActivateEvent, HelixAuraFallbackEvent, HelixBandEvent, HelixBeforeActivateEvent, HelixBeforeChangeEvent, HelixBeforeCloseEvent, HelixBeforeCollapseEvent, HelixBeforeEditEvent, HelixBeforeMoveEvent, HelixBeforeOpenEvent, HelixBeforePanelResizeEvent, HelixBeforePasteEvent, HelixBeforePinEvent, HelixBeforeReconnectEvent, HelixBeforeRelabelEvent, HelixBeforeReorderEvent, HelixBeforeResizeEvent, HelixBeforeSplitEvent, HelixBeforeToggleEvent, HelixCanvasEditEvent, HelixCanvasPanEvent, HelixCanvasViewEvent, HelixCanvasZoomEvent, HelixCaretEvent, HelixClearEvent, HelixCollapseEvent, HelixCompleteEvent, HelixConnectEvent, HelixConsoleEvent, HelixCopyErrorEvent, HelixCopyEvent, HelixCreateEvent, HelixDismissEvent, HelixEditEvent, HelixEndEvent, HelixExpandEvent, HelixFacetEvent, HelixFilterEvent, HelixFilteredEvent, HelixGraphFilterEvent, HelixGraphLayoutEvent, HelixGraphPanEvent, HelixGraphPartChangeEvent, HelixGraphReadyEvent, HelixGraphSignalEvent, HelixGraphZoomEvent, HelixHistoryEvent, HelixLoadEvent, HelixLoadMoreEvent, HelixMapClusterEvent, HelixMapPanEvent, HelixMapPartChangeEvent, HelixMapReadyEvent, HelixMapRotateEvent, HelixMapTiltEvent, HelixMapZoomEvent, HelixMoveEvent, HelixNavigateEvent, HelixNextEvent, HelixPanelResizeEvent, HelixPastedEvent, HelixPinEvent, HelixPlotChangeEvent, HelixPlotTurnEvent, HelixPressEvent, HelixPreviewEvent, HelixPreviousEvent, HelixRangeChangeEvent, HelixReadEvent, HelixReadingChangeEvent, HelixReadingPressEvent, HelixReconnectEvent, HelixRejectEvent, HelixRelabelEvent, HelixRemoveEvent, HelixReorderEvent, HelixReorderedEvent, HelixResizedEvent, HelixResizeEvent, HelixSampleEndEvent, HelixSampleStartEvent, HelixScrolledEvent, HelixSelectEvent, HelixSelectedEvent, HelixSendEvent, HelixShortcutEvent, HelixSortEvent, HelixSortedEvent, HelixSplitEvent, HelixStrandsFallbackEvent, HelixToggleEvent, HelixTourAskEvent, HelixTourStatusEvent, HelixTypingEvent, };
127
129
  /**
128
130
  * Every event class, and the one place a new one is registered: a class in a
129
131
  * module of its own, imported above, and named here and in `names.ts`.
@@ -200,6 +202,8 @@ declare const registry: {
200
202
  readonly HelixPanelResizeEvent: typeof HelixPanelResizeEvent;
201
203
  readonly HelixPastedEvent: typeof HelixPastedEvent;
202
204
  readonly HelixPinEvent: typeof HelixPinEvent;
205
+ readonly HelixPlotChangeEvent: typeof HelixPlotChangeEvent;
206
+ readonly HelixPlotTurnEvent: typeof HelixPlotTurnEvent;
203
207
  readonly HelixPressEvent: typeof HelixPressEvent;
204
208
  readonly HelixPreviewEvent: typeof HelixPreviewEvent;
205
209
  readonly HelixPreviousEvent: typeof HelixPreviousEvent;
@@ -61,6 +61,8 @@ import { HelixNextEvent } from './next.js';
61
61
  import { HelixPanelResizeEvent } from './panel-resize.js';
62
62
  import { HelixPastedEvent } from './pasted.js';
63
63
  import { HelixPinEvent } from './pin.js';
64
+ import { HelixPlotChangeEvent } from './plot-change.js';
65
+ import { HelixPlotTurnEvent } from './plot-turn.js';
64
66
  import { HelixPressEvent } from './press.js';
65
67
  import { HelixPreviewEvent } from './preview.js';
66
68
  import { HelixPreviousEvent } from './previous.js';
@@ -92,7 +94,7 @@ import { HelixTourAskEvent } from './tour-ask.js';
92
94
  import { HelixTourStatusEvent } from './tour-status.js';
93
95
  import { HelixTypingEvent } from './typing.js';
94
96
  export { helixEventNames } from './names.js';
95
- export { HelixActionEvent, HelixActivateEvent, HelixAuraFallbackEvent, HelixBandEvent, HelixBeforeActivateEvent, HelixBeforeChangeEvent, HelixBeforeCloseEvent, HelixBeforeCollapseEvent, HelixBeforeEditEvent, HelixBeforeMoveEvent, HelixBeforeOpenEvent, HelixBeforePanelResizeEvent, HelixBeforePasteEvent, HelixBeforePinEvent, HelixBeforeReconnectEvent, HelixBeforeRelabelEvent, HelixBeforeReorderEvent, HelixBeforeResizeEvent, HelixBeforeSplitEvent, HelixBeforeToggleEvent, HelixCanvasEditEvent, HelixCanvasPanEvent, HelixCanvasViewEvent, HelixCanvasZoomEvent, HelixCaretEvent, HelixClearEvent, HelixCollapseEvent, HelixCompleteEvent, HelixConnectEvent, HelixConsoleEvent, HelixCopyErrorEvent, HelixCopyEvent, HelixCreateEvent, HelixDismissEvent, HelixEditEvent, HelixEndEvent, HelixExpandEvent, HelixFacetEvent, HelixFilterEvent, HelixFilteredEvent, HelixGraphFilterEvent, HelixGraphLayoutEvent, HelixGraphPanEvent, HelixGraphPartChangeEvent, HelixGraphReadyEvent, HelixGraphSignalEvent, HelixGraphZoomEvent, HelixHistoryEvent, HelixLoadEvent, HelixLoadMoreEvent, HelixMapClusterEvent, HelixMapPanEvent, HelixMapPartChangeEvent, HelixMapReadyEvent, HelixMapRotateEvent, HelixMapTiltEvent, HelixMapZoomEvent, HelixMoveEvent, HelixNavigateEvent, HelixNextEvent, HelixPanelResizeEvent, HelixPastedEvent, HelixPinEvent, HelixPressEvent, HelixPreviewEvent, HelixPreviousEvent, HelixRangeChangeEvent, HelixReadEvent, HelixReadingChangeEvent, HelixReadingPressEvent, HelixReconnectEvent, HelixRejectEvent, HelixRelabelEvent, HelixRemoveEvent, HelixReorderEvent, HelixReorderedEvent, HelixResizedEvent, HelixResizeEvent, HelixSampleEndEvent, HelixSampleStartEvent, HelixScrolledEvent, HelixSelectEvent, HelixSelectedEvent, HelixSendEvent, HelixShortcutEvent, HelixSortEvent, HelixSortedEvent, HelixSplitEvent, HelixStrandsFallbackEvent, HelixToggleEvent, HelixTourAskEvent, HelixTourStatusEvent, HelixTypingEvent, };
97
+ export { HelixActionEvent, HelixActivateEvent, HelixAuraFallbackEvent, HelixBandEvent, HelixBeforeActivateEvent, HelixBeforeChangeEvent, HelixBeforeCloseEvent, HelixBeforeCollapseEvent, HelixBeforeEditEvent, HelixBeforeMoveEvent, HelixBeforeOpenEvent, HelixBeforePanelResizeEvent, HelixBeforePasteEvent, HelixBeforePinEvent, HelixBeforeReconnectEvent, HelixBeforeRelabelEvent, HelixBeforeReorderEvent, HelixBeforeResizeEvent, HelixBeforeSplitEvent, HelixBeforeToggleEvent, HelixCanvasEditEvent, HelixCanvasPanEvent, HelixCanvasViewEvent, HelixCanvasZoomEvent, HelixCaretEvent, HelixClearEvent, HelixCollapseEvent, HelixCompleteEvent, HelixConnectEvent, HelixConsoleEvent, HelixCopyErrorEvent, HelixCopyEvent, HelixCreateEvent, HelixDismissEvent, HelixEditEvent, HelixEndEvent, HelixExpandEvent, HelixFacetEvent, HelixFilterEvent, HelixFilteredEvent, HelixGraphFilterEvent, HelixGraphLayoutEvent, HelixGraphPanEvent, HelixGraphPartChangeEvent, HelixGraphReadyEvent, HelixGraphSignalEvent, HelixGraphZoomEvent, HelixHistoryEvent, HelixLoadEvent, HelixLoadMoreEvent, HelixMapClusterEvent, HelixMapPanEvent, HelixMapPartChangeEvent, HelixMapReadyEvent, HelixMapRotateEvent, HelixMapTiltEvent, HelixMapZoomEvent, HelixMoveEvent, HelixNavigateEvent, HelixNextEvent, HelixPanelResizeEvent, HelixPastedEvent, HelixPinEvent, HelixPlotChangeEvent, HelixPlotTurnEvent, HelixPressEvent, HelixPreviewEvent, HelixPreviousEvent, HelixRangeChangeEvent, HelixReadEvent, HelixReadingChangeEvent, HelixReadingPressEvent, HelixReconnectEvent, HelixRejectEvent, HelixRelabelEvent, HelixRemoveEvent, HelixReorderEvent, HelixReorderedEvent, HelixResizedEvent, HelixResizeEvent, HelixSampleEndEvent, HelixSampleStartEvent, HelixScrolledEvent, HelixSelectEvent, HelixSelectedEvent, HelixSendEvent, HelixShortcutEvent, HelixSortEvent, HelixSortedEvent, HelixSplitEvent, HelixStrandsFallbackEvent, HelixToggleEvent, HelixTourAskEvent, HelixTourStatusEvent, HelixTypingEvent, };
96
98
  const registry = {
97
99
  HelixActionEvent,
98
100
  HelixActivateEvent,
@@ -157,6 +159,8 @@ const registry = {
157
159
  HelixPanelResizeEvent,
158
160
  HelixPastedEvent,
159
161
  HelixPinEvent,
162
+ HelixPlotChangeEvent,
163
+ HelixPlotTurnEvent,
160
164
  HelixPressEvent,
161
165
  HelixPreviewEvent,
162
166
  HelixPreviousEvent,
@@ -5,7 +5,8 @@ export const helixEventNames = new Set(('action activate aura-fallback band befo
5
5
  'connect console copy copy-error create dismiss edit end expand facet filter ' +
6
6
  'filtered graph-filter graph-layout graph-pan graph-part-change graph-ready ' +
7
7
  'graph-signal graph-zoom history load load-more map-cluster map-pan map-part-change ' +
8
- 'map-ready map-rotate map-tilt map-zoom move navigate next panel-resize pasted pin press ' +
8
+ 'map-ready map-rotate map-tilt map-zoom move navigate next panel-resize pasted pin plot-change ' +
9
+ 'plot-turn press ' +
9
10
  'preview previous range-change read reading-change reading-press reconnect reject ' +
10
11
  'relabel remove reorder ' +
11
12
  'reordered resize resized sample-end sample-start scrolled select selected send ' +
@@ -0,0 +1,10 @@
1
+ import type { PlotChangeDetail } from './details.js';
2
+ /**
3
+ * A plot's points or the point the keys rest on changed, which the connector
4
+ * hears and the renderer is told. It stays on the plot, being the family's
5
+ * own bookkeeping rather than news for a page.
6
+ */
7
+ export declare class HelixPlotChangeEvent extends CustomEvent<PlotChangeDetail> {
8
+ static readonly eventName = "helix-plot-change";
9
+ constructor(detail: PlotChangeDetail);
10
+ }
@@ -0,0 +1,11 @@
1
+ export class HelixPlotChangeEvent extends CustomEvent {
2
+ static { this.eventName = 'helix-plot-change'; }
3
+ constructor(detail) {
4
+ super(HelixPlotChangeEvent.eventName, {
5
+ bubbles: false,
6
+ cancelable: false,
7
+ composed: false,
8
+ detail,
9
+ });
10
+ }
11
+ }
@@ -0,0 +1,6 @@
1
+ import type { PlotTurnDetail } from './details.js';
2
+ /** The reader asked a 3D plot to turn by key: steps across and up, which the renderer turns by. */
3
+ export declare class HelixPlotTurnEvent extends CustomEvent<PlotTurnDetail> {
4
+ static readonly eventName = "helix-plot-turn";
5
+ constructor(detail: PlotTurnDetail);
6
+ }
@@ -0,0 +1,11 @@
1
+ export class HelixPlotTurnEvent extends CustomEvent {
2
+ static { this.eventName = 'helix-plot-turn'; }
3
+ constructor(detail) {
4
+ super(HelixPlotTurnEvent.eventName, {
5
+ bubbles: true,
6
+ cancelable: false,
7
+ composed: true,
8
+ detail,
9
+ });
10
+ }
11
+ }
package/dist/index.d.ts CHANGED
@@ -38,7 +38,7 @@ export { UpgradeController, type UpgradeOptions, } from './controllers/upgrade-c
38
38
  export { type Rendered, VirtualizeController, type VirtualizeOptions, type Window as VirtualizeWindow, } from './controllers/virtualize-controller/virtualize-controller.js';
39
39
  export { Waterfall } from './controllers/virtualize-controller/waterfall.js';
40
40
  export { eventsForTag, registerElementEvents } from './events/element-events.js';
41
- export { type ActivateDetail, type AuraFallbackDetail, type BandDetail, type CanvasView, type CaretDetail, type ChangeDetail, type CompleteDetail, type ConnectDetail, type ConsoleDetail, type CopyDetail, type CreateDetail, type DismissDetail, type FacetDetail, type FilterDetail, type GraphFilterDetail, type GraphLayoutDetail, type GraphPartChangeDetail, type GraphSignalDetail, HelixActionEvent, HelixActivateEvent, HelixAuraFallbackEvent, HelixBandEvent, HelixBeforeActivateEvent, HelixBeforeChangeEvent, HelixBeforeCloseEvent, HelixBeforeCollapseEvent, HelixBeforeEditEvent, HelixBeforeMoveEvent, HelixBeforeOpenEvent, HelixBeforePanelResizeEvent, HelixBeforePasteEvent, HelixBeforePinEvent, HelixBeforeReconnectEvent, HelixBeforeRelabelEvent, HelixBeforeReorderEvent, HelixBeforeResizeEvent, HelixBeforeSplitEvent, HelixBeforeToggleEvent, HelixCanvasEditEvent, HelixCanvasPanEvent, HelixCanvasViewEvent, HelixCanvasZoomEvent, HelixCaretEvent, HelixClearEvent, HelixCollapseEvent, HelixCompleteEvent, HelixConnectEvent, HelixConsoleEvent, HelixCopyErrorEvent, HelixCopyEvent, HelixCreateEvent, HelixDismissEvent, HelixEditEvent, HelixEndEvent, HelixExpandEvent, HelixFacetEvent, HelixFilterEvent, HelixFilteredEvent, HelixGraphFilterEvent, HelixGraphLayoutEvent, HelixGraphPanEvent, HelixGraphPartChangeEvent, HelixGraphReadyEvent, HelixGraphSignalEvent, HelixGraphZoomEvent, HelixHistoryEvent, HelixLoadEvent, HelixLoadMoreEvent, HelixMapClusterEvent, HelixMapPanEvent, HelixMapPartChangeEvent, HelixMapReadyEvent, HelixMapRotateEvent, HelixMapTiltEvent, HelixMapZoomEvent, HelixMoveEvent, HelixNavigateEvent, HelixNextEvent, HelixPanelResizeEvent, HelixPastedEvent, HelixPinEvent, HelixPressEvent, HelixPreviewEvent, HelixPreviousEvent, HelixRangeChangeEvent, HelixReadEvent, HelixReadingChangeEvent, HelixReadingPressEvent, HelixReconnectEvent, HelixRejectEvent, HelixRelabelEvent, HelixRemoveEvent, HelixReorderEvent, HelixReorderedEvent, HelixResizedEvent, HelixResizeEvent, HelixSampleEndEvent, HelixSampleStartEvent, HelixScrolledEvent, HelixSelectEvent, HelixSelectedEvent, HelixSendEvent, HelixShortcutEvent, HelixSortEvent, HelixSortedEvent, HelixSplitEvent, HelixStrandsFallbackEvent, HelixToggleEvent, HelixTourAskEvent, HelixTourStatusEvent, HelixTypingEvent, type MapClusterDetail, type MapPanDetail, type MapPartChangeDetail, type MapRotateDetail, type MapTiltDetail, type MapZoomDetail, type MoveDetail, type NavigateDetail, type OpenDetail, type PasteDetail, type PressDetail, type PressPointerType, type RangeDetail, type ReadDetail, type ReadingDetail, type ReconnectDetail, type Refusal, type RefusedFile, type RejectDetail, type RelabelDetail, type RemoveDetail, type ReorderDetail, type ResizeDetail, type ScrolledDetail, type SelectDetail, type SendDetail, type ShortcutDetail, type SkipDetail, type SortDetail, type StrandsFallbackDetail, type ToggleDetail, type TourStatusDetail, type TypingDetail, type ViewportPanDetail, type ViewportZoomDetail, } from './events/events.js';
41
+ export { type ActivateDetail, type AuraFallbackDetail, type BandDetail, type CanvasView, type CaretDetail, type ChangeDetail, type CompleteDetail, type ConnectDetail, type ConsoleDetail, type CopyDetail, type CreateDetail, type DismissDetail, type FacetDetail, type FilterDetail, type GraphFilterDetail, type GraphLayoutDetail, type GraphPartChangeDetail, type GraphSignalDetail, HelixActionEvent, HelixActivateEvent, HelixAuraFallbackEvent, HelixBandEvent, HelixBeforeActivateEvent, HelixBeforeChangeEvent, HelixBeforeCloseEvent, HelixBeforeCollapseEvent, HelixBeforeEditEvent, HelixBeforeMoveEvent, HelixBeforeOpenEvent, HelixBeforePanelResizeEvent, HelixBeforePasteEvent, HelixBeforePinEvent, HelixBeforeReconnectEvent, HelixBeforeRelabelEvent, HelixBeforeReorderEvent, HelixBeforeResizeEvent, HelixBeforeSplitEvent, HelixBeforeToggleEvent, HelixCanvasEditEvent, HelixCanvasPanEvent, HelixCanvasViewEvent, HelixCanvasZoomEvent, HelixCaretEvent, HelixClearEvent, HelixCollapseEvent, HelixCompleteEvent, HelixConnectEvent, HelixConsoleEvent, HelixCopyErrorEvent, HelixCopyEvent, HelixCreateEvent, HelixDismissEvent, HelixEditEvent, HelixEndEvent, HelixExpandEvent, HelixFacetEvent, HelixFilterEvent, HelixFilteredEvent, HelixGraphFilterEvent, HelixGraphLayoutEvent, HelixGraphPanEvent, HelixGraphPartChangeEvent, HelixGraphReadyEvent, HelixGraphSignalEvent, HelixGraphZoomEvent, HelixHistoryEvent, HelixLoadEvent, HelixLoadMoreEvent, HelixMapClusterEvent, HelixMapPanEvent, HelixMapPartChangeEvent, HelixMapReadyEvent, HelixMapRotateEvent, HelixMapTiltEvent, HelixMapZoomEvent, HelixMoveEvent, HelixNavigateEvent, HelixNextEvent, HelixPanelResizeEvent, HelixPastedEvent, HelixPinEvent, HelixPlotChangeEvent, HelixPlotTurnEvent, HelixPressEvent, HelixPreviewEvent, HelixPreviousEvent, HelixRangeChangeEvent, HelixReadEvent, HelixReadingChangeEvent, HelixReadingPressEvent, HelixReconnectEvent, HelixRejectEvent, HelixRelabelEvent, HelixRemoveEvent, HelixReorderEvent, HelixReorderedEvent, HelixResizedEvent, HelixResizeEvent, HelixSampleEndEvent, HelixSampleStartEvent, HelixScrolledEvent, HelixSelectEvent, HelixSelectedEvent, HelixSendEvent, HelixShortcutEvent, HelixSortEvent, HelixSortedEvent, HelixSplitEvent, HelixStrandsFallbackEvent, HelixToggleEvent, HelixTourAskEvent, HelixTourStatusEvent, HelixTypingEvent, type MapClusterDetail, type MapPanDetail, type MapPartChangeDetail, type MapRotateDetail, type MapTiltDetail, type MapZoomDetail, type MoveDetail, type NavigateDetail, type OpenDetail, type PasteDetail, type PlotChangeDetail, type PlotTurnDetail, type PressDetail, type PressPointerType, type RangeDetail, type ReadDetail, type ReadingDetail, type ReconnectDetail, type Refusal, type RefusedFile, type RejectDetail, type RelabelDetail, type RemoveDetail, type ReorderDetail, type ResizeDetail, type ScrolledDetail, type SelectDetail, type SendDetail, type ShortcutDetail, type SkipDetail, type SortDetail, type StrandsFallbackDetail, type ToggleDetail, type TourStatusDetail, type TypingDetail, type ViewportPanDetail, type ViewportZoomDetail, } from './events/events.js';
42
42
  export { HelixElement, whenHydrated } from './helix-element/helix-element.js';
43
43
  export { MIRROR_RULE, SCROLLER_RULE, SPOKEN_RULE, VIRTUAL_RULE, } from './helix-element/mark-rules.js';
44
44
  export { HelixFormElement } from './helix-form-element/helix-form-element.js';
@@ -74,6 +74,7 @@ export { clockLocale, dayPeriod, type HourCycle, isTwelveHour, nearestTime, offe
74
74
  export { closestInstance } from './utils/closest-instance/closest-instance.js';
75
75
  export { type ColorWords, colorName, hueName } from './utils/color-name/color-name.js';
76
76
  export { columnStep } from './utils/column-step/column-step.js';
77
+ export { contextBudget, type Holder, LIVE, pageBudget, } from './utils/context-budget/context-budget.js';
77
78
  export { countLabel } from './utils/count-label/count-label.js';
78
79
  export { createSheet } from './utils/create-sheet/create-sheet.js';
79
80
  export { type Color, type ColorFormat, formatColor, parseColor, toCss, toHsl, toOklch, toRgb, } from './utils/css-color/css-color.js';
@@ -119,6 +120,7 @@ export { applyOwnRule, type OwnRule } from './utils/own-rule/own-rule.js';
119
120
  export { plainClick } from './utils/plain-click/plain-click.js';
120
121
  export { appleTouch, onAndroid, onApple, type Platform } from './utils/platform/platform.js';
121
122
  export { pressType, type RecentPress } from './utils/press-type/press-type.js';
123
+ export { type Camera, type Drawn, depthOrder, type Face, ISOMETRIC, LOWEST_TILT, type PagePoint, type Projection, pathData, projectionOf, type Solid, shortNumber, solid, } from './utils/projection/projection.js';
122
124
  export { rangeAdd } from './utils/range-add/range-add.js';
123
125
  export { type ColorBytes, type ColorBytesAlpha, readColor, readColorAlpha, rgbOf, } from './utils/read-color/read-color.js';
124
126
  export { type ChartData, type ChartDatum, rowsFromData, seriesFromData, } from './utils/read-data/read-data.js';
package/dist/index.js CHANGED
@@ -38,7 +38,7 @@ export { UpgradeController, } from './controllers/upgrade-controller/upgrade-con
38
38
  export { VirtualizeController, } from './controllers/virtualize-controller/virtualize-controller.js';
39
39
  export { Waterfall } from './controllers/virtualize-controller/waterfall.js';
40
40
  export { eventsForTag, registerElementEvents } from './events/element-events.js';
41
- export { HelixActionEvent, HelixActivateEvent, HelixAuraFallbackEvent, HelixBandEvent, HelixBeforeActivateEvent, HelixBeforeChangeEvent, HelixBeforeCloseEvent, HelixBeforeCollapseEvent, HelixBeforeEditEvent, HelixBeforeMoveEvent, HelixBeforeOpenEvent, HelixBeforePanelResizeEvent, HelixBeforePasteEvent, HelixBeforePinEvent, HelixBeforeReconnectEvent, HelixBeforeRelabelEvent, HelixBeforeReorderEvent, HelixBeforeResizeEvent, HelixBeforeSplitEvent, HelixBeforeToggleEvent, HelixCanvasEditEvent, HelixCanvasPanEvent, HelixCanvasViewEvent, HelixCanvasZoomEvent, HelixCaretEvent, HelixClearEvent, HelixCollapseEvent, HelixCompleteEvent, HelixConnectEvent, HelixConsoleEvent, HelixCopyErrorEvent, HelixCopyEvent, HelixCreateEvent, HelixDismissEvent, HelixEditEvent, HelixEndEvent, HelixExpandEvent, HelixFacetEvent, HelixFilterEvent, HelixFilteredEvent, HelixGraphFilterEvent, HelixGraphLayoutEvent, HelixGraphPanEvent, HelixGraphPartChangeEvent, HelixGraphReadyEvent, HelixGraphSignalEvent, HelixGraphZoomEvent, HelixHistoryEvent, HelixLoadEvent, HelixLoadMoreEvent, HelixMapClusterEvent, HelixMapPanEvent, HelixMapPartChangeEvent, HelixMapReadyEvent, HelixMapRotateEvent, HelixMapTiltEvent, HelixMapZoomEvent, HelixMoveEvent, HelixNavigateEvent, HelixNextEvent, HelixPanelResizeEvent, HelixPastedEvent, HelixPinEvent, HelixPressEvent, HelixPreviewEvent, HelixPreviousEvent, HelixRangeChangeEvent, HelixReadEvent, HelixReadingChangeEvent, HelixReadingPressEvent, HelixReconnectEvent, HelixRejectEvent, HelixRelabelEvent, HelixRemoveEvent, HelixReorderEvent, HelixReorderedEvent, HelixResizedEvent, HelixResizeEvent, HelixSampleEndEvent, HelixSampleStartEvent, HelixScrolledEvent, HelixSelectEvent, HelixSelectedEvent, HelixSendEvent, HelixShortcutEvent, HelixSortEvent, HelixSortedEvent, HelixSplitEvent, HelixStrandsFallbackEvent, HelixToggleEvent, HelixTourAskEvent, HelixTourStatusEvent, HelixTypingEvent, } from './events/events.js';
41
+ export { HelixActionEvent, HelixActivateEvent, HelixAuraFallbackEvent, HelixBandEvent, HelixBeforeActivateEvent, HelixBeforeChangeEvent, HelixBeforeCloseEvent, HelixBeforeCollapseEvent, HelixBeforeEditEvent, HelixBeforeMoveEvent, HelixBeforeOpenEvent, HelixBeforePanelResizeEvent, HelixBeforePasteEvent, HelixBeforePinEvent, HelixBeforeReconnectEvent, HelixBeforeRelabelEvent, HelixBeforeReorderEvent, HelixBeforeResizeEvent, HelixBeforeSplitEvent, HelixBeforeToggleEvent, HelixCanvasEditEvent, HelixCanvasPanEvent, HelixCanvasViewEvent, HelixCanvasZoomEvent, HelixCaretEvent, HelixClearEvent, HelixCollapseEvent, HelixCompleteEvent, HelixConnectEvent, HelixConsoleEvent, HelixCopyErrorEvent, HelixCopyEvent, HelixCreateEvent, HelixDismissEvent, HelixEditEvent, HelixEndEvent, HelixExpandEvent, HelixFacetEvent, HelixFilterEvent, HelixFilteredEvent, HelixGraphFilterEvent, HelixGraphLayoutEvent, HelixGraphPanEvent, HelixGraphPartChangeEvent, HelixGraphReadyEvent, HelixGraphSignalEvent, HelixGraphZoomEvent, HelixHistoryEvent, HelixLoadEvent, HelixLoadMoreEvent, HelixMapClusterEvent, HelixMapPanEvent, HelixMapPartChangeEvent, HelixMapReadyEvent, HelixMapRotateEvent, HelixMapTiltEvent, HelixMapZoomEvent, HelixMoveEvent, HelixNavigateEvent, HelixNextEvent, HelixPanelResizeEvent, HelixPastedEvent, HelixPinEvent, HelixPlotChangeEvent, HelixPlotTurnEvent, HelixPressEvent, HelixPreviewEvent, HelixPreviousEvent, HelixRangeChangeEvent, HelixReadEvent, HelixReadingChangeEvent, HelixReadingPressEvent, HelixReconnectEvent, HelixRejectEvent, HelixRelabelEvent, HelixRemoveEvent, HelixReorderEvent, HelixReorderedEvent, HelixResizedEvent, HelixResizeEvent, HelixSampleEndEvent, HelixSampleStartEvent, HelixScrolledEvent, HelixSelectEvent, HelixSelectedEvent, HelixSendEvent, HelixShortcutEvent, HelixSortEvent, HelixSortedEvent, HelixSplitEvent, HelixStrandsFallbackEvent, HelixToggleEvent, HelixTourAskEvent, HelixTourStatusEvent, HelixTypingEvent, } from './events/events.js';
42
42
  export { HelixElement, whenHydrated } from './helix-element/helix-element.js';
43
43
  export { MIRROR_RULE, SCROLLER_RULE, SPOKEN_RULE, VIRTUAL_RULE, } from './helix-element/mark-rules.js';
44
44
  export { HelixFormElement } from './helix-form-element/helix-form-element.js';
@@ -74,6 +74,7 @@ export { clockLocale, dayPeriod, isTwelveHour, nearestTime, offeredTimes, timeBa
74
74
  export { closestInstance } from './utils/closest-instance/closest-instance.js';
75
75
  export { colorName, hueName } from './utils/color-name/color-name.js';
76
76
  export { columnStep } from './utils/column-step/column-step.js';
77
+ export { contextBudget, LIVE, pageBudget, } from './utils/context-budget/context-budget.js';
77
78
  export { countLabel } from './utils/count-label/count-label.js';
78
79
  export { createSheet } from './utils/create-sheet/create-sheet.js';
79
80
  export { formatColor, parseColor, toCss, toHsl, toOklch, toRgb, } from './utils/css-color/css-color.js';
@@ -119,6 +120,7 @@ export { applyOwnRule } from './utils/own-rule/own-rule.js';
119
120
  export { plainClick } from './utils/plain-click/plain-click.js';
120
121
  export { appleTouch, onAndroid, onApple } from './utils/platform/platform.js';
121
122
  export { pressType } from './utils/press-type/press-type.js';
123
+ export { depthOrder, ISOMETRIC, LOWEST_TILT, pathData, projectionOf, shortNumber, solid, } from './utils/projection/projection.js';
122
124
  export { rangeAdd } from './utils/range-add/range-add.js';
123
125
  export { readColor, readColorAlpha, rgbOf, } from './utils/read-color/read-color.js';
124
126
  export { rowsFromData, seriesFromData, } from './utils/read-data/read-data.js';
@@ -0,0 +1,47 @@
1
+ /**
2
+ * How many WebGL contexts Helix's three.js drivers keep live on one page.
3
+ *
4
+ * **A browser holds only so many, and drops the oldest without asking**:
5
+ * Chrome about sixteen on a desktop and fewer on a phone. A page of 3D panels
6
+ * past that lost a graph it could not get back, and the maps, Aura, and
7
+ * Strands on the same page count against the same limit. Six leaves them
8
+ * room.
9
+ */
10
+ export declare const LIVE = 6;
11
+ /** One drawing that holds a context: it gives the context back, and takes it again. */
12
+ export interface Holder {
13
+ release(): void;
14
+ restore(): void;
15
+ }
16
+ /**
17
+ * Keeps the contexts a page's drawings hold under `cap`.
18
+ *
19
+ * **A drawing near the screen always keeps its context.** Past the cap, the
20
+ * drawings off screen give theirs back, the one away longest first, and each
21
+ * takes its context again as it comes near. So a page of any number of
22
+ * graphs holds as many contexts as it shows at once, and never more than
23
+ * `cap` beyond that.
24
+ */
25
+ export declare const contextBudget: (cap?: number) => {
26
+ /** A drawing far from the screen, from `now`. */
27
+ far(holder: Holder, now: number): void;
28
+ /** How many drawings hold a context now. */
29
+ readonly holding: number;
30
+ /** A new drawing, which made a context to draw with. */
31
+ join(holder: Holder): void;
32
+ /** A drawing that ended and freed its context itself. */
33
+ leave(holder: Holder): void;
34
+ /** A drawing near the screen, which takes its context again where it gave it back. */
35
+ near(holder: Holder): void;
36
+ };
37
+ type Budget = ReturnType<typeof contextBudget>;
38
+ /**
39
+ * The budget every three.js driver on the page shares: the graph's and the
40
+ * plot's, whichever package and whichever copy of Helix each came from.
41
+ *
42
+ * **Kept on the page, under a registered symbol**, since a page can load two
43
+ * copies of this module, one bundled with each driver, and two budgets of six
44
+ * would let the page hold twelve.
45
+ */
46
+ export declare const pageBudget: () => Budget;
47
+ export {};
@@ -0,0 +1,48 @@
1
+ export const LIVE = 6;
2
+ export const contextBudget = (cap = LIVE) => {
3
+ const holding = new Set();
4
+ const away = new Map();
5
+ const balance = () => {
6
+ const longest = [...away]
7
+ .filter(([holder]) => holding.has(holder))
8
+ .sort((one, other) => one[1] - other[1]);
9
+ for (const [holder] of longest) {
10
+ if (holding.size <= cap) {
11
+ return;
12
+ }
13
+ holding.delete(holder);
14
+ holder.release();
15
+ }
16
+ };
17
+ return {
18
+ far(holder, now) {
19
+ away.set(holder, now);
20
+ balance();
21
+ },
22
+ get holding() {
23
+ return holding.size;
24
+ },
25
+ join(holder) {
26
+ holding.add(holder);
27
+ balance();
28
+ },
29
+ leave(holder) {
30
+ holding.delete(holder);
31
+ away.delete(holder);
32
+ },
33
+ near(holder) {
34
+ away.delete(holder);
35
+ if (!holding.has(holder)) {
36
+ holding.add(holder);
37
+ holder.restore();
38
+ }
39
+ balance();
40
+ },
41
+ };
42
+ };
43
+ export const pageBudget = () => {
44
+ const key = Symbol.for('fusion.dev/helix/context-budget');
45
+ const page = globalThis;
46
+ page[key] ??= contextBudget();
47
+ return page[key];
48
+ };
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Where a drawing in three dimensions stands on the page, seen from a camera
3
+ * that can turn and tilt, with no perspective, as SVG path data. Shared by
4
+ * every spatial drawing Helix makes in SVG: the graph's isometric diagram,
5
+ * the spatial heatmap, and the spatial charts' own drawings.
6
+ *
7
+ * Pure, so the arithmetic a picture hides is held by a spec: a solid painted
8
+ * in the wrong order is covered by the one it should cover, and a face turned
9
+ * away is drawn over the faces in front of it.
10
+ *
11
+ * **The floor is measured in cells.** A place at `x: 2, y: 1` stands two
12
+ * cells across and one back, and a height is in the same unit. From the
13
+ * isometric camera, across runs down to the right on the page and back runs
14
+ * up to the right, as a plan is seen from its front left corner.
15
+ */
16
+ /** A point on the page, in cells. */
17
+ export interface PagePoint {
18
+ x: number;
19
+ y: number;
20
+ }
21
+ /**
22
+ * Where the diagram is seen from, in degrees: `turn`, the compass bearing
23
+ * the camera looks from, and `tilt`, its height above the floor, from a low
24
+ * angle to 90, a plan seen straight down.
25
+ */
26
+ export interface Camera {
27
+ tilt: number;
28
+ turn: number;
29
+ }
30
+ /**
31
+ * The isometric camera: from the front left corner, at the height where the
32
+ * floor's two axes and the vertical are drawn the same length, 35.26 degrees.
33
+ */
34
+ export declare const ISOMETRIC: Camera;
35
+ /** The lowest a camera may tilt, below which the floor folds to a line. */
36
+ export declare const LOWEST_TILT = 15;
37
+ /** A camera's view of the floor. */
38
+ export interface Projection {
39
+ /** A place on the floor and a height, on the page. */
40
+ at(x: number, y: number, z?: number): PagePoint;
41
+ /** How near the camera a place on the floor stands: the larger, the nearer. */
42
+ depth(x: number, y: number): number;
43
+ /** The place on the floor drawn at a point on the page. */
44
+ floorAt(point: PagePoint): PagePoint;
45
+ /** Toward the camera from the floor, a unit length: across, back, and up. */
46
+ toward: readonly [number, number, number];
47
+ /** Across the page, in floor directions: how far a step across or back goes to the right. */
48
+ across: readonly [number, number];
49
+ }
50
+ /**
51
+ * The view from `camera`, an orthographic one: the floor turned by `turn`
52
+ * and seen from `tilt` above it, with no perspective, so a cell is the same
53
+ * size wherever it stands.
54
+ */
55
+ export declare const projectionOf: (camera: Camera) => Projection;
56
+ /** The solids a note can be drawn as, a block, a cylinder, or a pyramid. */
57
+ export type Solid = 'block' | 'cylinder' | 'pyramid';
58
+ /** A number written short enough for path data, and never as `-0`. */
59
+ export declare const shortNumber: (value: number) => string;
60
+ export declare const pathData: (points: readonly PagePoint[]) => string;
61
+ /** One face of a solid, as path data, and how far it is darkened toward black. */
62
+ export interface Face {
63
+ d: string;
64
+ /** From 0, the note's own color, as a top facing the light takes it. */
65
+ darken: number;
66
+ }
67
+ /** One note drawn as a solid: the faces the camera sees, in the order to paint them. */
68
+ export interface Drawn {
69
+ /** How high the solid reaches on the page: the top of its outline, which its name is drawn above. */
70
+ crown: number;
71
+ /** The faces the camera sees, the sides first and the top last. */
72
+ faces: Face[];
73
+ /** The outline of the whole solid, which a ring is drawn along. */
74
+ outline: string;
75
+ /** The middle of the solid's top, which its name is centered over. */
76
+ peak: PagePoint;
77
+ }
78
+ /**
79
+ * A note as a solid, standing on the floor at `x` and `y`, `width` cells
80
+ * across its footprint and `height` cells tall, as the camera sees it.
81
+ *
82
+ * **Each face is drawn only where it turns toward the camera**, so a block
83
+ * shows its top and the two sides that face the viewer from any turn, and a
84
+ * plan seen from straight above shows tops alone.
85
+ */
86
+ export declare const solid: (projection: Projection, kind: Solid, x: number, y: number, width: number, height: number) => Drawn;
87
+ /**
88
+ * The order to paint notes in, back to front: by how near the camera each
89
+ * stands on the floor, and the taller first where two stand level.
90
+ *
91
+ * Exact for notes on whole cells, which do not overlap on the floor; two
92
+ * notes placed inside one cell can still cross.
93
+ */
94
+ export declare const depthOrder: <T extends {
95
+ height: number;
96
+ x: number;
97
+ y: number;
98
+ }>(projection: Projection, notes: readonly T[]) => T[];
@@ -0,0 +1,144 @@
1
+ export const ISOMETRIC = { tilt: (Math.atan(Math.SQRT1_2) * 180) / Math.PI, turn: 45 };
2
+ export const LOWEST_TILT = 15;
3
+ const SCALE = Math.sqrt(1.5);
4
+ export const projectionOf = (camera) => {
5
+ const turn = (camera.turn * Math.PI) / 180;
6
+ const tilt = (Math.min(Math.max(camera.tilt, LOWEST_TILT), 90) * Math.PI) / 180;
7
+ const [cos, sin] = [Math.cos(turn), Math.sin(turn)];
8
+ const [rise, fall] = [Math.sin(tilt), Math.cos(tilt)];
9
+ return {
10
+ across: [cos, sin],
11
+ at: (x, y, z = 0) => ({
12
+ x: (x * cos + y * sin) * SCALE,
13
+ y: ((x * sin - y * cos) * rise - z * fall) * SCALE,
14
+ }),
15
+ depth: (x, y) => x * sin - y * cos,
16
+ floorAt: (point) => {
17
+ const u = point.x / SCALE;
18
+ const v = point.y / SCALE / rise;
19
+ return { x: u * cos + v * sin, y: u * sin - v * cos };
20
+ },
21
+ toward: [sin * fall, -cos * fall, rise],
22
+ };
23
+ };
24
+ export const shortNumber = (value) => String(Math.round(value * 1000) / 1000 || 0);
25
+ export const pathData = (points) => `M${points.map((point) => `${shortNumber(point.x)} ${shortNumber(point.y)}`).join('L')}Z`;
26
+ const hullOf = (points) => {
27
+ const sorted = [...points].sort((one, other) => one.x - other.x || one.y - other.y);
28
+ if (sorted.length < 3) {
29
+ return sorted;
30
+ }
31
+ const cross = (o, a, b) => (a.x - o.x) * (b.y - o.y) - (a.y - o.y) * (b.x - o.x);
32
+ const half = (list) => {
33
+ const kept = [];
34
+ for (const point of list) {
35
+ while (kept.length >= 2 &&
36
+ cross(kept.at(-2), kept.at(-1), point) <= 0) {
37
+ kept.pop();
38
+ }
39
+ kept.push(point);
40
+ }
41
+ kept.pop();
42
+ return kept;
43
+ };
44
+ return [...half(sorted), ...half([...sorted].reverse())];
45
+ };
46
+ const darkenOf = (normal, projection) => {
47
+ const [x, y, z] = normal;
48
+ const length = Math.hypot(x, y, z) || 1;
49
+ const level = Math.hypot(x, y) || 1;
50
+ const right = (x * projection.across[0] + y * projection.across[1]) / level;
51
+ return Math.max(0, 0.28 + 0.113 * right) * (1 - z / length);
52
+ };
53
+ const facing = (normal, projection) => normal[0] * projection.toward[0] +
54
+ normal[1] * projection.toward[1] +
55
+ normal[2] * projection.toward[2] >
56
+ 1e-6;
57
+ const ARC = 12;
58
+ export const solid = (projection, kind, x, y, width, height) => {
59
+ const half = width / 2;
60
+ const tall = Math.max(0, height);
61
+ const on = (corner) => projection.at(corner[0], corner[1], corner[2]);
62
+ if (kind === 'cylinder') {
63
+ const turn = Math.atan2(projection.across[1], projection.across[0]);
64
+ const rim = (z, from, to) => Array.from({ length: ARC + 1 }, (_, step) => {
65
+ const angle = from + ((to - from) * step) / ARC;
66
+ return projection.at(x + Math.cos(angle) * half, y + Math.sin(angle) * half, z);
67
+ });
68
+ const near = rim(0, turn + Math.PI, turn + 2 * Math.PI);
69
+ const nearTop = rim(tall, turn + Math.PI, turn + 2 * Math.PI);
70
+ const farTop = rim(tall, turn, turn + Math.PI);
71
+ const top = rim(tall, 0, 2 * Math.PI).slice(0, -1);
72
+ const side = projection.toward[2] < 0.9999 && tall > 0;
73
+ const outline = hullOf([...farTop, ...nearTop, ...near]);
74
+ return {
75
+ crown: Math.min(...outline.map((point) => point.y)),
76
+ faces: [
77
+ ...(side ? [{ d: pathData([...nearTop, ...[...near].reverse()]), darken: 0.28 }] : []),
78
+ { d: pathData(top), darken: 0 },
79
+ ],
80
+ outline: pathData(outline),
81
+ peak: projection.at(x, y, tall),
82
+ };
83
+ }
84
+ const floor = [
85
+ [x - half, y - half, 0],
86
+ [x + half, y - half, 0],
87
+ [x + half, y + half, 0],
88
+ [x - half, y + half, 0],
89
+ ];
90
+ const outward = [
91
+ [0, -1, 0],
92
+ [1, 0, 0],
93
+ [0, 1, 0],
94
+ [-1, 0, 0],
95
+ ];
96
+ const faces = [];
97
+ let corners;
98
+ let peak;
99
+ if (kind === 'pyramid') {
100
+ const apex = [x, y, Math.max(tall, width)];
101
+ corners = [...floor, apex];
102
+ peak = on(apex);
103
+ floor.forEach((corner, at) => {
104
+ const next = floor[(at + 1) % 4];
105
+ const [ox, oy] = outward[at];
106
+ const normal = [ox * apex[2], oy * apex[2], half];
107
+ if (facing(normal, projection)) {
108
+ faces.push({
109
+ d: pathData([on(corner), on(next), on(apex)]),
110
+ darken: darkenOf(normal, projection),
111
+ });
112
+ }
113
+ });
114
+ }
115
+ else {
116
+ const up = (corner) => [corner[0], corner[1], tall];
117
+ corners = [...floor, ...floor.map(up)];
118
+ peak = projection.at(x, y, tall);
119
+ if (tall > 0) {
120
+ floor.forEach((corner, at) => {
121
+ const next = floor[(at + 1) % 4];
122
+ const normal = outward[at];
123
+ if (facing(normal, projection)) {
124
+ faces.push({
125
+ d: pathData([on(up(corner)), on(up(next)), on(next), on(corner)]),
126
+ darken: darkenOf(normal, projection),
127
+ });
128
+ }
129
+ });
130
+ }
131
+ faces.push({ d: pathData(floor.map(up).map(on)), darken: 0 });
132
+ }
133
+ const outline = hullOf(corners.map(on));
134
+ return {
135
+ crown: Math.min(...outline.map((point) => point.y)),
136
+ faces,
137
+ outline: pathData(outline),
138
+ peak,
139
+ };
140
+ };
141
+ export const depthOrder = (projection, notes) => [...notes].sort((one, other) => {
142
+ const nearer = projection.depth(one.x, one.y) - projection.depth(other.x, other.y);
143
+ return Math.abs(nearer) > 1e-9 ? nearer : other.height - one.height;
144
+ });
@@ -61,6 +61,8 @@ export type RuntimeKind =
61
61
  | 'negative-value'
62
62
  /** A Graph connector was handed an element that is no Graph frame. */
63
63
  | 'not-a-graph'
64
+ /** A plot connector was handed an element that is not the spatial chart it connects. */
65
+ | 'not-a-plot'
64
66
  /** The browser refused picture in picture. */
65
67
  | 'picture-in-picture-refused'
66
68
  /** A Grid's `min` is no length it can write, so the grid lays out by its column count. */
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.188.0";
9
+ export declare const VERSION = "0.190.0";
package/dist/version.js CHANGED
@@ -1 +1 @@
1
- export const VERSION = '0.188.0';
1
+ export const VERSION = '0.190.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.188.0",
4
+ "version": "0.190.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.188.0",
77
+ "@fusion.dev/helix-icons": "0.190.0",
78
78
  "tslib": "^2.8.1"
79
79
  },
80
80
  "devDependencies": {
81
- "@fusion.dev/helix-cem": "0.188.0",
82
- "@fusion.dev/helix-testing": "0.188.0",
81
+ "@fusion.dev/helix-cem": "0.190.0",
82
+ "@fusion.dev/helix-testing": "0.190.0",
83
83
  "@lit-labs/ssr": "^4.1.0",
84
84
  "lit": "^3.2.1"
85
85
  },