@fusion.dev/helix-core 0.165.0 → 0.167.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.
@@ -6060,6 +6060,99 @@
6060
6060
  },
6061
6061
  "description": "Attaches to the box the first time there is one to attach to."
6062
6062
  },
6063
+ {
6064
+ "kind": "method",
6065
+ "name": "across",
6066
+ "privacy": "private",
6067
+ "return": {
6068
+ "type": {
6069
+ "text": "boolean"
6070
+ }
6071
+ },
6072
+ "description": "Whether the scroll axis is the inline one."
6073
+ },
6074
+ {
6075
+ "kind": "method",
6076
+ "name": "scrolled",
6077
+ "privacy": "private",
6078
+ "return": {
6079
+ "type": {
6080
+ "text": "number"
6081
+ }
6082
+ },
6083
+ "parameters": [
6084
+ {
6085
+ "name": "box",
6086
+ "type": {
6087
+ "text": "HTMLElement"
6088
+ }
6089
+ }
6090
+ ],
6091
+ "description": "The box's scroll offset from the start of the set."
6092
+ },
6093
+ {
6094
+ "kind": "method",
6095
+ "name": "scrollBox",
6096
+ "privacy": "private",
6097
+ "return": {
6098
+ "type": {
6099
+ "text": "void"
6100
+ }
6101
+ },
6102
+ "parameters": [
6103
+ {
6104
+ "name": "box",
6105
+ "type": {
6106
+ "text": "HTMLElement"
6107
+ }
6108
+ },
6109
+ {
6110
+ "name": "to",
6111
+ "type": {
6112
+ "text": "number"
6113
+ }
6114
+ }
6115
+ ],
6116
+ "description": "Scrolls the box to `to` from the start of the set, and notes it. Sideways\non a right-to-left page the offset counts down from zero."
6117
+ },
6118
+ {
6119
+ "kind": "method",
6120
+ "name": "span",
6121
+ "privacy": "private",
6122
+ "return": {
6123
+ "type": {
6124
+ "text": "number"
6125
+ }
6126
+ },
6127
+ "parameters": [
6128
+ {
6129
+ "name": "box",
6130
+ "type": {
6131
+ "text": "HTMLElement"
6132
+ }
6133
+ }
6134
+ ],
6135
+ "description": "How long the box is along the scroll axis."
6136
+ },
6137
+ {
6138
+ "kind": "method",
6139
+ "name": "length",
6140
+ "privacy": "private",
6141
+ "return": {
6142
+ "type": {
6143
+ "text": "number"
6144
+ }
6145
+ },
6146
+ "parameters": [
6147
+ {
6148
+ "name": "element",
6149
+ "type": {
6150
+ "text": "Element"
6151
+ }
6152
+ }
6153
+ ],
6154
+ "description": "How long an element is along the scroll axis."
6155
+ },
6063
6156
  {
6064
6157
  "kind": "field",
6065
6158
  "name": "handleScroll",
@@ -6078,6 +6171,17 @@
6078
6171
  "privacy": "private",
6079
6172
  "readonly": true
6080
6173
  },
6174
+ {
6175
+ "kind": "method",
6176
+ "name": "scrolledNow",
6177
+ "privacy": "private",
6178
+ "return": {
6179
+ "type": {
6180
+ "text": "number"
6181
+ }
6182
+ },
6183
+ "description": "The box's scroll offset now, or the last one noted where there is no box."
6184
+ },
6081
6185
  {
6082
6186
  "kind": "method",
6083
6187
  "name": "scrolling",
@@ -6935,6 +7039,44 @@
6935
7039
  }
6936
7040
  ]
6937
7041
  },
7042
+ {
7043
+ "kind": "javascript-module",
7044
+ "path": "src/events/before-paste.ts",
7045
+ "declarations": [
7046
+ {
7047
+ "kind": "class",
7048
+ "description": "Cards are about to be pasted onto a board, and can be refused.\n\nThe board adds the cards and connections in the detail by default, as\n`helix-canvas-node` and `helix-canvas-edge` elements. A page that renders\nits cards from its own state calls `preventDefault()` here and adds the\ndetail's document to that state, through `fromJsonCanvas`.",
7049
+ "name": "HelixBeforePasteEvent",
7050
+ "members": [
7051
+ {
7052
+ "kind": "field",
7053
+ "name": "eventName",
7054
+ "type": {
7055
+ "text": "string"
7056
+ },
7057
+ "static": true,
7058
+ "readonly": true,
7059
+ "default": "'helix-before-paste'"
7060
+ }
7061
+ ],
7062
+ "superclass": {
7063
+ "name": "CustomEvent",
7064
+ "module": "src/events/before-paste.ts"
7065
+ },
7066
+ "helix": {}
7067
+ }
7068
+ ],
7069
+ "exports": [
7070
+ {
7071
+ "kind": "js",
7072
+ "name": "HelixBeforePasteEvent",
7073
+ "declaration": {
7074
+ "name": "HelixBeforePasteEvent",
7075
+ "module": "src/events/before-paste.ts"
7076
+ }
7077
+ }
7078
+ ]
7079
+ },
6938
7080
  {
6939
7081
  "kind": "javascript-module",
6940
7082
  "path": "src/events/before-pin.ts",
@@ -8096,6 +8238,14 @@
8096
8238
  "module": "./details.js"
8097
8239
  }
8098
8240
  },
8241
+ {
8242
+ "kind": "js",
8243
+ "name": "PasteDetail",
8244
+ "declaration": {
8245
+ "name": "PasteDetail",
8246
+ "module": "./details.js"
8247
+ }
8248
+ },
8099
8249
  {
8100
8250
  "kind": "js",
8101
8251
  "name": "PressDetail",
@@ -8408,6 +8558,14 @@
8408
8558
  "module": "src/events/events.ts"
8409
8559
  }
8410
8560
  },
8561
+ {
8562
+ "kind": "js",
8563
+ "name": "HelixBeforePasteEvent",
8564
+ "declaration": {
8565
+ "name": "HelixBeforePasteEvent",
8566
+ "module": "src/events/events.ts"
8567
+ }
8568
+ },
8411
8569
  {
8412
8570
  "kind": "js",
8413
8571
  "name": "HelixBeforePinEvent",
@@ -8792,6 +8950,14 @@
8792
8950
  "module": "src/events/events.ts"
8793
8951
  }
8794
8952
  },
8953
+ {
8954
+ "kind": "js",
8955
+ "name": "HelixPastedEvent",
8956
+ "declaration": {
8957
+ "name": "HelixPastedEvent",
8958
+ "module": "src/events/events.ts"
8959
+ }
8960
+ },
8795
8961
  {
8796
8962
  "kind": "js",
8797
8963
  "name": "HelixPinEvent",
@@ -9888,7 +10054,7 @@
9888
10054
  "type": {
9889
10055
  "text": "ReadonlySet<string>"
9890
10056
  },
9891
- "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-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 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}`), )",
10057
+ "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}`), )",
9892
10058
  "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."
9893
10059
  }
9894
10060
  ],
@@ -10017,6 +10183,44 @@
10017
10183
  }
10018
10184
  ]
10019
10185
  },
10186
+ {
10187
+ "kind": "javascript-module",
10188
+ "path": "src/events/pasted.ts",
10189
+ "declarations": [
10190
+ {
10191
+ "kind": "class",
10192
+ "description": "Cards and connections were pasted onto a board, which now holds them.",
10193
+ "name": "HelixPastedEvent",
10194
+ "members": [
10195
+ {
10196
+ "kind": "field",
10197
+ "name": "eventName",
10198
+ "type": {
10199
+ "text": "string"
10200
+ },
10201
+ "static": true,
10202
+ "readonly": true,
10203
+ "default": "'helix-pasted'"
10204
+ }
10205
+ ],
10206
+ "superclass": {
10207
+ "name": "CustomEvent",
10208
+ "module": "src/events/pasted.ts"
10209
+ },
10210
+ "helix": {}
10211
+ }
10212
+ ],
10213
+ "exports": [
10214
+ {
10215
+ "kind": "js",
10216
+ "name": "HelixPastedEvent",
10217
+ "declaration": {
10218
+ "name": "HelixPastedEvent",
10219
+ "module": "src/events/pasted.ts"
10220
+ }
10221
+ }
10222
+ ]
10223
+ },
10020
10224
  {
10021
10225
  "kind": "javascript-module",
10022
10226
  "path": "src/events/pin.ts",
@@ -11967,6 +12171,42 @@
11967
12171
  "description": "The message the browser would show for the control, or an empty string.",
11968
12172
  "readonly": true
11969
12173
  },
12174
+ {
12175
+ "kind": "field",
12176
+ "name": "updateRunning",
12177
+ "type": {
12178
+ "text": "boolean"
12179
+ },
12180
+ "privacy": "private",
12181
+ "default": "false",
12182
+ "description": "Whether an update is running, so `runPendingUpdate` never starts one inside another."
12183
+ },
12184
+ {
12185
+ "kind": "method",
12186
+ "name": "performUpdate",
12187
+ "privacy": "protected",
12188
+ "return": {
12189
+ "type": {
12190
+ "text": "void"
12191
+ }
12192
+ },
12193
+ "description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
12194
+ "inheritedFrom": {
12195
+ "name": "HelixElement",
12196
+ "module": "src/helix-element/helix-element.ts"
12197
+ }
12198
+ },
12199
+ {
12200
+ "kind": "method",
12201
+ "name": "runPendingUpdate",
12202
+ "privacy": "private",
12203
+ "return": {
12204
+ "type": {
12205
+ "text": "void"
12206
+ }
12207
+ },
12208
+ "description": "Runs an update that is on its way, so the verdict read next is the one\nfor what the control holds now.\n\n**A control reports its verdict as it updates, and an update waits for a\nmicrotask**, so a script that wrote `value` and asked at once was answered\nabout the value before: measured on Time Input, `value = '18:00'` past a\n`max` of 17:00 and `checkValidity()` returned true until `updateComplete`.\nA native control answers about the value it was just given, so the\nquestions a script can ask run the pending update first. Lit's\n`performUpdate` is the documented way to run one synchronously."
12209
+ },
11970
12210
  {
11971
12211
  "kind": "field",
11972
12212
  "name": "willValidate",
@@ -11984,7 +12224,17 @@
11984
12224
  "text": "boolean"
11985
12225
  }
11986
12226
  },
11987
- "description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot."
12227
+ "description": "Returns whether the control is valid, and fires `invalid` on it when it is\nnot. The control shows no message for it: `reportValidity()` does that."
12228
+ },
12229
+ {
12230
+ "kind": "field",
12231
+ "name": "checkInProgress",
12232
+ "type": {
12233
+ "text": "boolean"
12234
+ },
12235
+ "privacy": "private",
12236
+ "default": "false",
12237
+ "description": "Whether `checkValidity()` is running, set only for the `invalid` it fires."
11988
12238
  },
11989
12239
  {
11990
12240
  "kind": "method",
@@ -12423,21 +12673,6 @@
12423
12673
  "name": "HelixElement",
12424
12674
  "module": "src/helix-element/helix-element.ts"
12425
12675
  }
12426
- },
12427
- {
12428
- "kind": "method",
12429
- "name": "performUpdate",
12430
- "privacy": "protected",
12431
- "return": {
12432
- "type": {
12433
- "text": "void"
12434
- }
12435
- },
12436
- "description": "The first update, timed where a page asked to measure what the components\ncost, and a property read where it did not: see `reportRender`.",
12437
- "inheritedFrom": {
12438
- "name": "HelixElement",
12439
- "module": "src/helix-element/helix-element.ts"
12440
- }
12441
12676
  }
12442
12677
  ],
12443
12678
  "events": [],
@@ -13476,6 +13711,14 @@
13476
13711
  "module": "./events/events.js"
13477
13712
  }
13478
13713
  },
13714
+ {
13715
+ "kind": "js",
13716
+ "name": "HelixBeforePasteEvent",
13717
+ "declaration": {
13718
+ "name": "HelixBeforePasteEvent",
13719
+ "module": "./events/events.js"
13720
+ }
13721
+ },
13479
13722
  {
13480
13723
  "kind": "js",
13481
13724
  "name": "HelixBeforePinEvent",
@@ -13860,6 +14103,14 @@
13860
14103
  "module": "./events/events.js"
13861
14104
  }
13862
14105
  },
14106
+ {
14107
+ "kind": "js",
14108
+ "name": "HelixPastedEvent",
14109
+ "declaration": {
14110
+ "name": "HelixPastedEvent",
14111
+ "module": "./events/events.js"
14112
+ }
14113
+ },
13863
14114
  {
13864
14115
  "kind": "js",
13865
14116
  "name": "HelixPinEvent",
@@ -14180,6 +14431,14 @@
14180
14431
  "module": "./events/events.js"
14181
14432
  }
14182
14433
  },
14434
+ {
14435
+ "kind": "js",
14436
+ "name": "PasteDetail",
14437
+ "declaration": {
14438
+ "name": "PasteDetail",
14439
+ "module": "./events/events.js"
14440
+ }
14441
+ },
14183
14442
  {
14184
14443
  "kind": "js",
14185
14444
  "name": "PressDetail",
@@ -15564,6 +15823,14 @@
15564
15823
  "module": "./utils/filter-marks/filter-marks.js"
15565
15824
  }
15566
15825
  },
15826
+ {
15827
+ "kind": "js",
15828
+ "name": "filterKeeps",
15829
+ "declaration": {
15830
+ "name": "filterKeeps",
15831
+ "module": "./utils/filter-marks/filter-marks.js"
15832
+ }
15833
+ },
15567
15834
  {
15568
15835
  "kind": "js",
15569
15836
  "name": "markMatches",
@@ -20267,7 +20534,7 @@
20267
20534
  },
20268
20535
  "privacy": "private",
20269
20536
  "default": "false",
20270
- "description": "Whether the reader has had a go at the field yet.\n\n**Not `:user-invalid`**, which is the platform's own answer to \"is this\nfield wrong *yet*\" and cannot work here, for a structural reason rather\nthan a browser bug: it tracks interaction with the element it is on, and\nnobody interacts with this element. The reader types into an `<input>`\ninside its shadow root, so the host's interaction flag is never set and\nthe selector never matches. Measured after submitting an invalid required\nfield and again after editing one and leaving it: false both times, while\n`:invalid` matched both times.\n\nSo the moments are listened for instead, and both of them demonstrably\nreach the host: `invalid` when a form is submitted with this control\nfailing, and `change` when the reader has edited and committed. Focus\nalone is deliberately not one of them. Tabbing past an empty required\nfield should not be answered with an error.\n\n**A composite control has to construct its own `change`, and this mixin\ndeliberately does not do it for them.** A native `change` is\n`composed: false`, so a control built from several inner inputs never\nrelays one to its host: `Input` gets this free from its one control,\nwhile a `PinInput` of four boxes has no inner `change` that means the\ncode is entered, so a half-entered code is never `touched` and can never\nsay what is wrong with it.\n\n**The obvious shared fix is for `touched` to take a `focusout`, and it is\nthe wrong one**, because it is the paragraph above undone: a `focusout`\nfires on the reader who tabbed past and typed nothing, which is exactly\nthe case this refuses to call an error. What a composite needs is not a\nfocus moment, it is the native meaning of `change`, \"edited, then left\",\nand the editing half is the part a mixin up here cannot see.\n\n**Nor is there one shape to extract yet.** The two composites solve it\ndifferently and both are right: `PinInput` is focus-driven, taking a\nbaseline when focus arrives from outside the row and announcing on the\nway out if it moved, and `DateInput` is value-driven, stopping its inner\n`change` and announcing once the date itself moves. Only one of them has\na leaving moment at all, so generalizing from the pair is generalizing\nfrom one. The trigger for lifting it is a third control that needs the\nfocus-driven shape, at which point what moves up is the\nbaseline-and-commit pair rather than `touched`."
20537
+ "description": "Whether the reader has had a go at the field yet.\n\n**Not `:user-invalid`**, which is the platform's own answer to \"is this\nfield wrong *yet*\" and cannot work here, for a structural reason rather\nthan a browser bug: it tracks interaction with the element it is on, and\nnobody interacts with this element. The reader types into an `<input>`\ninside its shadow root, so the host's interaction flag is never set and\nthe selector never matches. Measured after submitting an invalid required\nfield and again after editing one and leaving it: false both times, while\n`:invalid` matched both times.\n\nSo the moments are listened for instead, and both of them demonstrably\nreach the host: `invalid` when a form is submitted with this control\nfailing, and `change` when the reader has edited and committed. The\n`invalid` a script's `checkValidity()` fires is not one of them, as it\nis not for a native control. Focus\nalone is deliberately not one of them. Tabbing past an empty required\nfield should not be answered with an error.\n\n**A composite control has to construct its own `change`, and this mixin\ndeliberately does not do it for them.** A native `change` is\n`composed: false`, so a control built from several inner inputs never\nrelays one to its host: `Input` gets this free from its one control,\nwhile a `PinInput` of four boxes has no inner `change` that means the\ncode is entered, so a half-entered code is never `touched` and can never\nsay what is wrong with it.\n\n**The obvious shared fix is for `touched` to take a `focusout`, and it is\nthe wrong one**, because it is the paragraph above undone: a `focusout`\nfires on the reader who tabbed past and typed nothing, which is exactly\nthe case this refuses to call an error. What a composite needs is not a\nfocus moment, it is the native meaning of `change`, \"edited, then left\",\nand the editing half is the part a mixin up here cannot see.\n\n**Nor is there one shape to extract yet.** The two composites solve it\ndifferently and both are right: `PinInput` is focus-driven, taking a\nbaseline when focus arrives from outside the row and announcing on the\nway out if it moved, and `DateInput` is value-driven, stopping its inner\n`change` and announcing once the date itself moves. Only one of them has\na leaving moment at all, so generalizing from the pair is generalizing\nfrom one. The trigger for lifting it is a third control that needs the\nfocus-driven shape, at which point what moves up is the\nbaseline-and-commit pair rather than `touched`."
20271
20538
  },
20272
20539
  {
20273
20540
  "kind": "field",
@@ -21556,7 +21823,7 @@
21556
21823
  },
21557
21824
  {
21558
21825
  "kind": "mixin",
21559
- "description": "Grafts the segmented field React Aria's DateField and TimeField are, and Web\nAwesome's time input has, onto a picker field: one `spinbutton` for each part\nof the date or the time, in the order the locale writes them.\n\n**Typing into a text field asks the reader to know the format.** Date Input\nand Time Input read ISO, `2026-08-04` and `14:30`, because `Intl` formats and\ndoes not parse, and a reader in Germany who types `4.8.2026` is refused. A\nsegment needs no format: the month is a month, set with digits or the arrow\nkeys, and the layout puts it where the locale does, so the field reads\n`04.08.2026` in German and `08/04/2026` in English with nothing to parse.\n\n**What a segment does with a key**, which is React Aria's: digits fill it and\nmove on once it cannot take another, Up and Down step it and wrap, Page Up\nand Page Down step it by a page, a week of days, five years or fifteen\nminutes, Home and End go to its ends, Backspace and Delete empty it, Left and Right move between\nsegments along the line of text, and Alt+Down opens the picker. Each segment\nis a tab stop, as each is in React Aria.\n\n**The value is whole or empty.** A date with no year is no date, so the value\nstays empty while any segment is, and the field reports `badInput` as a\nnative date input does with a half-typed date. The arithmetic is\n`date-segments`, so this draws and listens and nothing else.\n\n**Opt-in, with `segmented`**, because the text field is what every example and\nevery form already holds, and a row of segments draws differently.",
21826
+ "description": "Grafts the segmented field React Aria's DateField and TimeField are, and Web\nAwesome's time input has, onto a picker field: one `spinbutton` for each part\nof the date or the time, in the order the locale writes them.\n\n**Typing into a text field asks the reader to know the format.** Date Input\nand Time Input read ISO, `2026-08-04` and `14:30`, because `Intl` formats and\ndoes not parse, and a reader in Germany who types `4.8.2026` is refused. A\nsegment needs no format: the month is a month, set with digits or the arrow\nkeys, and the layout puts it where the locale does, so the field reads\n`04.08.2026` in German and `08/04/2026` in English with nothing to parse.\n\n**What a segment does with a key**, which is React Aria's: digits fill it and\nmove on once it cannot take another, Up and Down step it and wrap, Page Up\nand Page Down step it by a page, a week of days, five years or fifteen\nminutes, Home and End go to its ends, Backspace and Delete take off its\nlast digit or move back from an empty segment, Left and Right move between\nsegments along the line of text, and Alt+Down opens the picker. Each segment\nis a tab stop, as each is in React Aria.\n\n**The value is whole or empty.** A date with no year is no date, so the value\nstays empty while any segment is, and the field reports `badInput` as a\nnative date input does with a half-typed date. The arithmetic is\n`date-segments`, so this draws and listens and nothing else.\n\n**Opt-in, with `segmented`**, because the text field is what every example and\nevery form already holds, and a row of segments draws differently.",
21560
21827
  "name": "MixinSegmentedField",
21561
21828
  "members": [
21562
21829
  {
@@ -21933,6 +22200,25 @@
21933
22200
  ],
21934
22201
  "description": "Applies an editing key to the segment, the arrows, Backspace, a digit or\na letter, and says whether it edited anything."
21935
22202
  },
22203
+ {
22204
+ "kind": "method",
22205
+ "name": "erase",
22206
+ "privacy": "private",
22207
+ "return": {
22208
+ "type": {
22209
+ "text": "void"
22210
+ }
22211
+ },
22212
+ "parameters": [
22213
+ {
22214
+ "name": "element",
22215
+ "type": {
22216
+ "text": "HTMLElement"
22217
+ }
22218
+ }
22219
+ ],
22220
+ "description": "Takes the last digit off the segment, or moves to the segment before it\nwhere this one is already empty, as React Aria's segments do. A reader\nclearing a date from its end holds Backspace and it empties right to\nleft."
22221
+ },
21936
22222
  {
21937
22223
  "kind": "field",
21938
22224
  "name": "composing",
@@ -26603,7 +26889,7 @@
26603
26889
  }
26604
26890
  }
26605
26891
  ],
26606
- "description": "What an editing key does to a segment, or `null` for a key that edits\nnothing.\n\nThe arrows step it and wrap, Page Up and Page Down step it by a page, Home\nand End take it to its lowest and highest, Backspace and Delete empty it, a\ndigit is typed as `typeDigit` types it, and on the meridiem a letter picks\nthe half whose word starts with it. `advance` says the segment is full and\nfocus moves on."
26892
+ "description": "What an editing key does to a segment, or `null` for a key that edits\nnothing.\n\nThe arrows step it and wrap, Page Up and Page Down step it by a page, Home\nand End take it to its lowest and highest, Backspace and Delete take off its\nlast digit and empty it from the last one, a\ndigit is typed as `typeDigit` types it, and on the meridiem a letter picks\nthe half whose word starts with it. `advance` says the segment is full and\nfocus moves on."
26607
26893
  },
26608
26894
  {
26609
26895
  "kind": "function",
@@ -27610,6 +27896,37 @@
27610
27896
  }
27611
27897
  ],
27612
27898
  "description": "Marks where `needle` matches in each of `elements`, for `owner`, without\ntouching the elements. An empty needle takes the owner's marks away, which\nis also what an owner leaving the page calls.\n\n**The Custom Highlight API paints a range, and nothing is inserted.** The\nwords are usually the consumer's own light DOM, slotted through as many as\ntwo shadow roots, and wrapping the matched part in a `<mark>` would mean\nrewriting their content: markup they wrote would come back changed. So an\noption holding a link or an icon is marked as readily as one holding a bare\nword. Listbox marks what its filter matched this way, and so every family\nthat filters through one: Select, Combobox, Command and Time Picker.\n\n**The rule that paints it lives in `base.css`**, as\n`::highlight(helix-filter-match)`, rather than in a component's styles. A\nhighlight is styled from the tree its text lives in, and that text lives in\nthe consumer's document.\n\nNothing at all where the API is missing, as on a server, in a test\nenvironment or in an older browser: the text nodes are not walked for an\nanswer nothing can paint."
27899
+ },
27900
+ {
27901
+ "kind": "function",
27902
+ "name": "filterKeeps",
27903
+ "return": {
27904
+ "type": {
27905
+ "text": "boolean"
27906
+ }
27907
+ },
27908
+ "parameters": [
27909
+ {
27910
+ "name": "text",
27911
+ "type": {
27912
+ "text": "string"
27913
+ }
27914
+ },
27915
+ {
27916
+ "name": "filter",
27917
+ "type": {
27918
+ "text": "string"
27919
+ }
27920
+ },
27921
+ {
27922
+ "name": "match",
27923
+ "optional": true,
27924
+ "type": {
27925
+ "text": "((text: string, filter: string) => boolean) | undefined"
27926
+ }
27927
+ }
27928
+ ],
27929
+ "description": "Whether a filter keeps an item: its words hold the filter, in any case, or\n`match` says so where the page gave one. An empty filter keeps everything.\n\nOne answer for every family that filters, so Listbox, Command and a\nfilterable Menu keep the same items for the same words, and a `filterMatch`\nthe page writes once means the same thing in each."
27613
27930
  }
27614
27931
  ],
27615
27932
  "exports": [
@@ -27636,6 +27953,14 @@
27636
27953
  "name": "markMatches",
27637
27954
  "module": "src/utils/filter-marks/filter-marks.ts"
27638
27955
  }
27956
+ },
27957
+ {
27958
+ "kind": "js",
27959
+ "name": "filterKeeps",
27960
+ "declaration": {
27961
+ "name": "filterKeeps",
27962
+ "module": "src/utils/filter-marks/filter-marks.ts"
27963
+ }
27639
27964
  }
27640
27965
  ]
27641
27966
  },
@@ -33264,7 +33589,7 @@
33264
33589
  "type": {
33265
33590
  "text": "string"
33266
33591
  },
33267
- "default": "'0.165.0'",
33592
+ "default": "'0.167.0'",
33268
33593
  "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."
33269
33594
  }
33270
33595
  ],
@@ -33824,6 +34149,6 @@
33824
34149
  ],
33825
34150
  "helix": {
33826
34151
  "package": "@fusion.dev/helix-core",
33827
- "version": "0.165.0"
34152
+ "version": "0.167.0"
33828
34153
  }
33829
34154
  }
@@ -13,6 +13,13 @@ export interface VirtualizeOptions {
13
13
  * its own size. Zero by default.
14
14
  */
15
15
  gap?: () => number;
16
+ /**
17
+ * Whether the set runs across the box, scrolled sideways. The scroll axis is
18
+ * then the inline one: offsets are `scrollLeft` from the start of the line,
19
+ * which runs right to left on a right-to-left page, and items are measured
20
+ * by their width. Down the box by default.
21
+ */
22
+ horizontal?: () => boolean;
16
23
  /**
17
24
  * Rows kept either side of what fits, so a scroll reveals something drawn
18
25
  * rather than something blank. Four by default.
@@ -206,9 +213,24 @@ export declare class VirtualizeController implements ReactiveController {
206
213
  hostDisconnected(): void;
207
214
  /** Attaches to the box the first time there is one to attach to. */
208
215
  private watch;
216
+ /** Whether the scroll axis is the inline one. */
217
+ private across;
218
+ /** The box's scroll offset from the start of the set. */
219
+ private scrolled;
220
+ /**
221
+ * Scrolls the box to `to` from the start of the set, and notes it. Sideways
222
+ * on a right-to-left page the offset counts down from zero.
223
+ */
224
+ private scrollBox;
225
+ /** How long the box is along the scroll axis. */
226
+ private span;
227
+ /** How long an element is along the scroll axis. */
228
+ private length;
209
229
  private readonly handleScroll;
210
230
  private readonly handleTouchStart;
211
231
  private readonly handleTouchEnd;
232
+ /** The box's scroll offset now, or the last one noted where there is no box. */
233
+ private scrolledNow;
212
234
  /**
213
235
  * Whether the reader is scrolling: a finger is on the box, the box moved
214
236
  * within the last 150 milliseconds, or it has moved and its `scroll` event