@fusion.dev/helix 0.44.0 → 0.46.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.
@@ -14517,7 +14517,7 @@
14517
14517
  "type": {
14518
14518
  "text": "HelixSelectEvent"
14519
14519
  },
14520
- "description": "Fired when the slide in view changes, with its index. Cancelable where the carousel is about to move: refusing a control or an indicator takes the decision and nothing moves. A drag has already moved the track, so that one announces after the fact and refusing it does nothing. See `handleScroll`.",
14520
+ "description": "Fired before the slide in view changes, with the index being asked for. Cancelable: refusing it takes the decision and nothing moves, including a drag, which is put back on the slide the index still holds. See `handleScroll`.",
14521
14521
  "name": "helix-select",
14522
14522
  "reactProp": "onhelix-select",
14523
14523
  "inheritedFrom": {
@@ -15700,7 +15700,7 @@
15700
15700
  "type": {
15701
15701
  "text": "'failed' | 'sending' | 'sent' | 'streaming' | undefined"
15702
15702
  },
15703
- "description": "What has happened to it.\n\nReflected, because every one of the four is a visual state and a stylesheet\nhas no other way to know. Absent is a settled message with nothing to\nreport, which is what most of a transcript is, and it is the absence of the\nattribute rather than a value of it: there is no initializer, so nothing is\nreflected until something happens.",
15703
+ "description": "What has happened to it.\n\nReflected, because every one of the four is a visual state and a stylesheet\nhas no other way to know. Absent is a settled message with nothing to\nreport, which is what most of a transcript is, and it is the absence of the\nattribute rather than a value of it: there is no initializer, so nothing is\nreflected until something happens.\n\n**The turn writes this once, on a retry nobody refused**, and `handleRetry`\nholds the reason. Everything else that moves it is the consumer's.",
15704
15704
  "attribute": "state",
15705
15705
  "reflects": true,
15706
15706
  "inheritedFrom": {
@@ -15825,7 +15825,7 @@
15825
15825
  "name": "handleRetry",
15826
15826
  "privacy": "private",
15827
15827
  "readonly": true,
15828
- "description": "Retry is `helix-send` again, from the message rather than the composer.\n\n**Not an event of its own**, because a retry is the same request: the reader\nis offering what they wrote, and the only difference is which element is\noffering it. A listener that wants to tell them apart has `event.target`,\nwhich is the message on a retry and the composer on a first send, and that\nis a distinction the DOM already makes without a second name for it.",
15828
+ "description": "Retry is `helix-send` again, from the message rather than the composer.\n\n**Not an event of its own**, because a retry is the same request: the reader\nis offering what they wrote, and the only difference is which element is\noffering it. A listener that wants to tell them apart has `event.target`,\nwhich is the message on a retry and the composer on a first send, and that\nis a distinction the DOM already makes without a second name for it.\n\n**Through `requestChange`, and the turn is what moves.** `helix-send` is\ncancelable because the composer clears only when nobody refused, and this\ndispatch had nothing behind it: the reader pressed the control, the turn sat\nat \"Not sent\" with the same control still on it, and `preventDefault()`\nrefused a decision nobody here was about to take. A retry that stands is a\nturn on its way, which is what `sending` means, so that is the default\naction and refusing it leaves the failure exactly where it was. A consumer\nwho wants something else refuses and assigns `state` themselves, which is\nhow control is taken from every other stateful element in the library.",
15829
15829
  "inheritedFrom": {
15830
15830
  "name": "HelixHeadlessChatMessage",
15831
15831
  "module": "src/chat/message/chat-message.ts"
@@ -16230,7 +16230,7 @@
16230
16230
  "type": {
16231
16231
  "text": "'failed' | 'sending' | 'sent' | 'streaming' | undefined"
16232
16232
  },
16233
- "description": "What has happened to it.\n\nReflected, because every one of the four is a visual state and a stylesheet\nhas no other way to know. Absent is a settled message with nothing to\nreport, which is what most of a transcript is, and it is the absence of the\nattribute rather than a value of it: there is no initializer, so nothing is\nreflected until something happens.",
16233
+ "description": "What has happened to it.\n\nReflected, because every one of the four is a visual state and a stylesheet\nhas no other way to know. Absent is a settled message with nothing to\nreport, which is what most of a transcript is, and it is the absence of the\nattribute rather than a value of it: there is no initializer, so nothing is\nreflected until something happens.\n\n**The turn writes this once, on a retry nobody refused**, and `handleRetry`\nholds the reason. Everything else that moves it is the consumer's.",
16234
16234
  "fieldName": "state",
16235
16235
  "inheritedFrom": {
16236
16236
  "name": "HelixHeadlessChatMessage",
@@ -16259,7 +16259,7 @@
16259
16259
  "type": {
16260
16260
  "text": "HelixSendEvent"
16261
16261
  },
16262
- "description": "Fired when the reader asks to send a failed message again, and cancelable.",
16262
+ "description": "Fired when the reader asks to send a failed message again. Cancelable: a retry that stands puts the turn back on its way, and refusing it leaves the failure and the control offering it exactly where they were.",
16263
16263
  "name": "helix-send",
16264
16264
  "reactProp": "onhelix-send",
16265
16265
  "inheritedFrom": {
@@ -25070,6 +25070,21 @@
25070
25070
  "module": "src/color-picker/root/color-picker-root.ts"
25071
25071
  }
25072
25072
  },
25073
+ {
25074
+ "kind": "method",
25075
+ "name": "sync",
25076
+ "privacy": "private",
25077
+ "return": {
25078
+ "type": {
25079
+ "text": "void"
25080
+ }
25081
+ },
25082
+ "description": "Reports the color to the form.\n\n**The one thing a form-associated element owes, and this element owed it\nfrom the start without paying.** It extends `HelixFormElement`, takes\n`MixinControllerValue` and carries `name`, so a consumer writing\n`<helix-color-picker name=\"brand\">` inside a form has every reason to\nexpect an entry, and the form carried none: no error, nothing in the\nmarkup to look at, and a field silently missing from the submission. Its\ntwo siblings in the same composition position, Color Input and Slider,\nboth report.\n\n`null` rather than an empty string where there is no color, which is the\ndifference between a control that submits nothing and one that submits a\nblank. There is no `setValidity` beside it: this element does not take\n`MixinField`, and every validity member of `ElementInternals` is the\nconsumer's to reach through the field that wraps it.",
25083
+ "inheritedFrom": {
25084
+ "name": "HelixHeadlessColorPicker",
25085
+ "module": "src/color-picker/root/color-picker-root.ts"
25086
+ }
25087
+ },
25073
25088
  {
25074
25089
  "kind": "method",
25075
25090
  "name": "focus",
@@ -45844,9 +45859,75 @@
45844
45859
  "module": "src/file-input/root/file-input-root.ts"
45845
45860
  }
45846
45861
  },
45862
+ {
45863
+ "kind": "field",
45864
+ "name": "committed",
45865
+ "type": {
45866
+ "text": "File[]"
45867
+ },
45868
+ "privacy": "private",
45869
+ "default": "[]",
45870
+ "description": "The files this element last stood behind, so a refusal has somewhere to go.\n\nThe picker and a drop both write the input before anything here runs, so\nthe list being replaced is gone by the time the request is announced.\nNothing else records it: `files` reads the control, which is already the\nnew answer.",
45871
+ "inheritedFrom": {
45872
+ "name": "HelixHeadlessFileInput",
45873
+ "module": "src/file-input/root/file-input-root.ts"
45874
+ }
45875
+ },
45847
45876
  {
45848
45877
  "kind": "method",
45849
- "name": "announce",
45878
+ "name": "commit",
45879
+ "privacy": "private",
45880
+ "return": {
45881
+ "type": {
45882
+ "text": "void"
45883
+ }
45884
+ },
45885
+ "parameters": [
45886
+ {
45887
+ "name": "next",
45888
+ "type": {
45889
+ "text": "File[]"
45890
+ }
45891
+ }
45892
+ ],
45893
+ "description": "Asks for a set of files, and puts them in unless a listener refuses.\n\n**The request was announced after the fact and nothing read it.** This\nelement dispatched `helix-before-change` from `announce`, after the input\nhad taken the files and after `setFormValue` had reported them, and\ndiscarded what the dispatch returned: an `@event` line promising that\nrefusing it left nothing moved, over a veto with no reader. The other\ndirection of that same fault is what `requestChange` exists to prevent, so\nthis goes through it like every other value control.\n\n**A refusal puts the input back rather than stopping an assignment**, which\nis the shape a file input forces. Two of the four paths in are the browser\nwriting `control.files` before this element hears anything, so there is no\nassignment left to skip and the honest answer is to restore the list the\nelement last stood behind.",
45894
+ "inheritedFrom": {
45895
+ "name": "HelixHeadlessFileInput",
45896
+ "module": "src/file-input/root/file-input-root.ts"
45897
+ }
45898
+ },
45899
+ {
45900
+ "kind": "method",
45901
+ "name": "put",
45902
+ "privacy": "private",
45903
+ "return": {
45904
+ "type": {
45905
+ "text": "void"
45906
+ }
45907
+ },
45908
+ "parameters": [
45909
+ {
45910
+ "name": "control",
45911
+ "type": {
45912
+ "text": "HTMLInputElement"
45913
+ }
45914
+ },
45915
+ {
45916
+ "name": "files",
45917
+ "type": {
45918
+ "text": "File[]"
45919
+ }
45920
+ }
45921
+ ],
45922
+ "description": "Writes a list onto the input, which is the only way a `FileList` is built.\n\n`value = ''` for the empty case rather than an empty `DataTransfer`,\nbecause emptying is the one write a control accepts everywhere and a\nharness without `DataTransfer` still has to be able to clear.",
45923
+ "inheritedFrom": {
45924
+ "name": "HelixHeadlessFileInput",
45925
+ "module": "src/file-input/root/file-input-root.ts"
45926
+ }
45927
+ },
45928
+ {
45929
+ "kind": "method",
45930
+ "name": "settle",
45850
45931
  "privacy": "private",
45851
45932
  "return": {
45852
45933
  "type": {
@@ -45958,7 +46039,7 @@
45958
46039
  "text": "void"
45959
46040
  }
45960
46041
  },
45961
- "description": "Empties it, which is what a form reset means for a file input.",
46042
+ "description": "Empties it, which is what a form reset means for a file input.\n\nNot through `commit`, and that is the point of the split: a reset is the\nform's decision and there is nothing here for a listener to refuse. What it\nowes is the report and the platform's own announcement, which is what\n`settle` is.",
45962
46043
  "type": {
45963
46044
  "text": "formResetCallback() => void"
45964
46045
  },
@@ -46868,7 +46949,7 @@
46868
46949
  "type": {
46869
46950
  "text": "HelixBeforeChangeEvent"
46870
46951
  },
46871
- "description": "Fired before the chosen files change, with their names. Cancelable: refusing it takes the decision and nothing moves.",
46952
+ "description": "Fired before the chosen files change, with their names. Cancelable: refusing it takes the decision and the field keeps the files it had, a pick the browser has already written included.",
46872
46953
  "name": "helix-before-change",
46873
46954
  "reactProp": "onhelix-before-change",
46874
46955
  "inheritedFrom": {
@@ -47423,7 +47504,7 @@
47423
47504
  "helix": {
47424
47505
  "category": "forms",
47425
47506
  "since": "0.23.0",
47426
- "status": "experimental",
47507
+ "status": "stable",
47427
47508
  "documentation": "https://fusion.dev/helix/components/filter-input",
47428
47509
  "aliases": [
47429
47510
  "FilterToken",
@@ -48070,7 +48151,7 @@
48070
48151
  "helix": {
48071
48152
  "category": "forms",
48072
48153
  "since": "0.23.0",
48073
- "status": "experimental",
48154
+ "status": "stable",
48074
48155
  "documentation": "https://fusion.dev/helix/components/filter-input",
48075
48156
  "aliases": [
48076
48157
  "Facet",
@@ -48748,7 +48829,7 @@
48748
48829
  "helix": {
48749
48830
  "category": "forms",
48750
48831
  "since": "0.25.0",
48751
- "status": "experimental",
48832
+ "status": "stable",
48752
48833
  "documentation": "https://fusion.dev/helix/components/filter-input",
48753
48834
  "aliases": [
48754
48835
  "FacetPicker",
@@ -49367,7 +49448,7 @@
49367
49448
  "helix": {
49368
49449
  "category": "forms",
49369
49450
  "since": "0.23.0",
49370
- "status": "experimental",
49451
+ "status": "stable",
49371
49452
  "documentation": "https://fusion.dev/helix/components/filter-input",
49372
49453
  "aliases": [
49373
49454
  "Comparator",
@@ -51285,7 +51366,7 @@
51285
51366
  "helix": {
51286
51367
  "category": "forms",
51287
51368
  "since": "0.1.0",
51288
- "status": "experimental",
51369
+ "status": "stable",
51289
51370
  "documentation": "https://fusion.dev/helix/components/filter-input",
51290
51371
  "aliases": [
51291
51372
  "SearchField",
@@ -77987,6 +78068,21 @@
77987
78068
  "module": "src/option/group/option-group.ts"
77988
78069
  }
77989
78070
  },
78071
+ {
78072
+ "kind": "method",
78073
+ "name": "nameFromHeading",
78074
+ "privacy": "private",
78075
+ "return": {
78076
+ "type": {
78077
+ "text": "void"
78078
+ }
78079
+ },
78080
+ "description": "Names the run after the heading it drew, whatever the heading is made of.\n\n**The string alone was not the name of the heading, it was the name of one\nway of writing it.** `label` reached `ariaLabel` and the slot reached the\nscreen, so a consumer who took the documented `label` slot for a heading\nricher than a string got a `role=\"group\"` with no accessible name at all,\nand the words they wrote were the one thing a reader could not hear: the\nheading carries `aria-hidden`, because the name was supposed to be on the\nhost already. Set both and they disagreed, the host saying the string and\nthe panel showing the slot.\n\nSo the host points at the heading, which is the one thing that is always\nwhat a reader sees. `ElementInternals` and not an IDREF, because the host\nis in the light DOM and the heading is in this shadow root, which is the\nboundary `aria-labelledby` cannot cross. `MixinField.linkHost` does the\nsame for a field's label and records the measurement.\n\nClient only. Element references need the nodes to exist, and the server has\nthe string.",
78081
+ "inheritedFrom": {
78082
+ "name": "HelixHeadlessOptionGroup",
78083
+ "module": "src/option/group/option-group.ts"
78084
+ }
78085
+ },
77990
78086
  {
77991
78087
  "kind": "field",
77992
78088
  "name": "tier",
@@ -78319,7 +78415,7 @@
78319
78415
  "summary": "A named run of options inside a listbox.",
78320
78416
  "helix": {
78321
78417
  "since": "0.1.0",
78322
- "status": "experimental",
78418
+ "status": "stable",
78323
78419
  "documentation": "https://fusion.dev/helix/components/option",
78324
78420
  "aliases": [
78325
78421
  "OptGroup",
@@ -78973,7 +79069,7 @@
78973
79069
  "helix": {
78974
79070
  "category": "forms",
78975
79071
  "since": "0.1.0",
78976
- "status": "experimental",
79072
+ "status": "stable",
78977
79073
  "documentation": "https://fusion.dev/helix/components/option",
78978
79074
  "aliases": [
78979
79075
  "Item",
@@ -89083,7 +89179,7 @@
89083
89179
  "name": "handleSelection",
89084
89180
  "privacy": "private",
89085
89181
  "readonly": true,
89086
- "description": "Announces before it applies, so a listener can refuse the change.\n\nThe item has not moved by the time this runs, unlike a native input, so\nrefusing is simply not writing the value: there is nothing to put back.",
89182
+ "description": "Announces before it applies, so a listener can refuse the change.\n\nThe item has not moved by the time this runs, unlike a native input, so\nrefusing is simply not writing the value: there is nothing to put back.\n\n**The radio's own `helix-select` is a request, and the argument that it was\na notification is the one this settles.** That argument ran: the group's\nveto is `helix-before-change` a step later, so the item could be read as\nannouncing a choice the group then decides about. What it leaves out is who\ncan reach which event. `helix-before-change` is dispatched on the group, so\nrefusing it needs a listener on the group, and a consumer ruling out one\nanswer binds to that answer. Two gates in two positions is the shape, and\nthe item's is the one that was doing nothing.",
89087
89183
  "inheritedFrom": {
89088
89184
  "name": "HelixHeadlessRadioGroup",
89089
89185
  "module": "src/radio/group/radio-group.ts"
@@ -89607,7 +89703,7 @@
89607
89703
  "summary": "A set of choices where exactly one is the answer.",
89608
89704
  "helix": {
89609
89705
  "since": "0.1.0",
89610
- "status": "experimental",
89706
+ "status": "stable",
89611
89707
  "documentation": "https://fusion.dev/helix/components/radio",
89612
89708
  "aliases": [
89613
89709
  "RadioButtons",
@@ -90021,6 +90117,19 @@
90021
90117
  "module": "src/radio/root/radio-root.ts"
90022
90118
  }
90023
90119
  },
90120
+ {
90121
+ "kind": "field",
90122
+ "name": "focusable",
90123
+ "type": {
90124
+ "text": "boolean"
90125
+ },
90126
+ "default": "false",
90127
+ "description": "Whether this choice holds the group's tab stop while nothing is chosen.\n\nThe stop rides on the selection, and an unanswered group has no selection,\nso without this every choice is `tabindex=\"-1\"` and the keyboard cannot\nenter the set at all.\n\n**Written by the group, with no attribute, and it reaches the control\nrather than the host.** A `tabindex` on the host is two faults at once: it\nis markup a consumer rendered and their server never sent, which React\nreports as a mismatch and does not patch up, and it puts the tab stop on\nthe element rather than on the `<button role=\"radio\">` inside it, so a\nscreen reader meets an unnamed box where a native group would have given\nthem an unchecked radio. `Toggle.Root` carries the same property for the\nsame reason.",
90128
+ "inheritedFrom": {
90129
+ "name": "HelixHeadlessRadio",
90130
+ "module": "src/radio/root/radio-root.ts"
90131
+ }
90132
+ },
90024
90133
  {
90025
90134
  "kind": "field",
90026
90135
  "name": "selected",
@@ -90474,7 +90583,7 @@
90474
90583
  "helix": {
90475
90584
  "category": "forms",
90476
90585
  "since": "0.1.0",
90477
- "status": "experimental",
90586
+ "status": "stable",
90478
90587
  "documentation": "https://fusion.dev/helix/components/radio",
90479
90588
  "aliases": [
90480
90589
  "Option",
@@ -92466,9 +92575,8 @@
92466
92575
  "type": {
92467
92576
  "text": "'rtl' | undefined"
92468
92577
  },
92469
- "description": "Writing direction inside the frame.",
92470
- "attribute": "direction",
92471
- "reflects": true
92578
+ "description": "Writing direction inside the frame.\n\nNot reflected. It is payload for the render message and nothing selects on\nit, here or anywhere: a frame is a document of its own and what is written\non this host reaches nothing inside it, which is the same reason\n`colorMode` has to be sent rather than set.",
92579
+ "attribute": "direction"
92472
92580
  },
92473
92581
  {
92474
92582
  "kind": "field",
@@ -92486,9 +92594,8 @@
92486
92594
  "type": {
92487
92595
  "text": "'padded' | 'centered' | 'fullscreen' | 'hug' | undefined"
92488
92596
  },
92489
- "description": "How the example is placed in the frame.",
92490
- "attribute": "layout",
92491
- "reflects": true
92597
+ "description": "How the example is placed in the frame.\n\n`padded` insets it and leaves it at the top, which is the resting case and\nwhat an absent value sends. `centered` gives it a measure and centers that\nbox in the frame. `hug` shrinks the example to its own content and centers\nwhat is left, which is the difference that matters for a component whose\nroot is a full-width block. `fullscreen` is the whole frame with no inset.\n\nNot reflected, for `direction`'s reason: the placement is applied by the\ndocument inside the frame, against its own root, so no rule on this side\ncould read it.",
92598
+ "attribute": "layout"
92492
92599
  },
92493
92600
  {
92494
92601
  "kind": "field",
@@ -92956,7 +93063,7 @@
92956
93063
  "type": {
92957
93064
  "text": "'rtl' | undefined"
92958
93065
  },
92959
- "description": "Writing direction inside the frame.",
93066
+ "description": "Writing direction inside the frame.\n\nNot reflected. It is payload for the render message and nothing selects on\nit, here or anywhere: a frame is a document of its own and what is written\non this host reaches nothing inside it, which is the same reason\n`colorMode` has to be sent rather than set.",
92960
93067
  "fieldName": "direction"
92961
93068
  },
92962
93069
  {
@@ -92973,7 +93080,7 @@
92973
93080
  "type": {
92974
93081
  "text": "'padded' | 'centered' | 'fullscreen' | 'hug' | undefined"
92975
93082
  },
92976
- "description": "How the example is placed in the frame.",
93083
+ "description": "How the example is placed in the frame.\n\n`padded` insets it and leaves it at the top, which is the resting case and\nwhat an absent value sends. `centered` gives it a measure and centers that\nbox in the frame. `hug` shrinks the example to its own content and centers\nwhat is left, which is the difference that matters for a component whose\nroot is a full-width block. `fullscreen` is the whole frame with no inset.\n\nNot reflected, for `direction`'s reason: the placement is applied by the\ndocument inside the frame, against its own root, so no rule on this side\ncould read it.",
92977
93084
  "fieldName": "layout"
92978
93085
  },
92979
93086
  {
@@ -93193,9 +93300,8 @@
93193
93300
  "type": {
93194
93301
  "text": "'horizontal' | 'vertical' | undefined"
93195
93302
  },
93196
- "description": "Whether the panes sit side by side or stacked.",
93197
- "attribute": "orientation",
93198
- "reflects": true
93303
+ "description": "Whether the panes sit side by side or stacked.\n\nNot reflected, for `lead`'s reason above: no rule selects on it. The axis\nreaches the stylesheet as the inner splitter's own `orientation`, which is\nwhere the panes are laid out, and this element's sheet names no host\nattribute at all.",
93304
+ "attribute": "orientation"
93199
93305
  },
93200
93306
  {
93201
93307
  "kind": "field",
@@ -93412,32 +93518,48 @@
93412
93518
  },
93413
93519
  {
93414
93520
  "kind": "method",
93415
- "name": "splitSettled",
93521
+ "name": "requestSplit",
93416
93522
  "privacy": "private",
93417
93523
  "return": {
93418
93524
  "type": {
93419
- "text": "void"
93525
+ "text": "boolean"
93420
93526
  }
93421
93527
  },
93422
- "description": "Says the panes' divider has settled, so a consumer can keep it.\n\nWhen it settles, not while it moves. A drag is a stream of positions and\nonly the one it ends at is a preference; announcing each would ask whoever\nis listening to write to storage a hundred times to record one decision.\n\nThe sandbox does not keep it. Where a preference lives, and whether it\nshould be kept at all, is the consumer's to decide, and a component that\nwrote to storage on its own would be deciding for all of them under a key\nit chose.\n\n**A verb each, rather than one `helix-before-resize` naming which of the two\nmoved.** Both dividers are this element's, so `composedPath()[0]` is the same\nhost for either and the event name is the only thing that can separate them."
93528
+ "parameters": [
93529
+ {
93530
+ "name": "next",
93531
+ "type": {
93532
+ "text": "number"
93533
+ }
93534
+ }
93535
+ ],
93536
+ "description": "Asks for the panes' divider to settle here, and moves it unless refused.\n\nWhen it settles, not while it moves. A drag is a stream of positions and\nonly the one it ends at is a preference; announcing each would ask whoever\nis listening to write to storage a hundred times to record one decision.\n\nThe sandbox does not keep it. Where a preference lives, and whether it\nshould be kept at all, is the consumer's to decide, and a component that\nwrote to storage on its own would be deciding for all of them under a key\nit chose.\n\n**Through `requestChange`, and never the other way round.** Both of these\nfired after `split` and `panelSize` had already been written, with the\nanswer dropped, so a consumer calling `preventDefault()` on an event whose\nown line says refusing it takes the decision changed nothing whatever: the\ndivider stayed where the drag left it and their handler read a value they\nhad just declined. `SandboxSource.edit` two files away already carries the\nargument, that assigning first turns a `before` event into one that has\nalready happened, and `Splitter`, whose `helix-before-resize` these two were\nsplit out of, has always announced through the audited path. Refusing one\nnow leaves `.position` bound to the value this element still holds, so the\ndivider goes back where it was.\n\n**A verb each, rather than one `helix-before-resize` naming which of the two\nmoved.** Both dividers are this element's, so `composedPath()[0]` is the same\nhost for either and the event name is the only thing that can separate them."
93423
93537
  },
93424
93538
  {
93425
93539
  "kind": "method",
93426
- "name": "panelSettled",
93540
+ "name": "requestPanelSize",
93427
93541
  "privacy": "private",
93428
93542
  "return": {
93429
93543
  "type": {
93430
- "text": "void"
93544
+ "text": "boolean"
93431
93545
  }
93432
93546
  },
93433
- "description": "As `splitSettled`, for the panel, whose value is pixels rather than a share."
93547
+ "parameters": [
93548
+ {
93549
+ "name": "next",
93550
+ "type": {
93551
+ "text": "number"
93552
+ }
93553
+ }
93554
+ ],
93555
+ "description": "As `requestSplit`, for the panel, whose value is pixels rather than a share."
93434
93556
  },
93435
93557
  {
93436
93558
  "kind": "field",
93437
93559
  "name": "handlePanesChange",
93438
93560
  "privacy": "private",
93439
93561
  "readonly": true,
93440
- "description": "Answers a divider that has asked to move.\n\nBoth splitters are controlled from here, so neither applies anything on its\nown: each announces where it wants to go and this decides. That is what\nkeeps `split` and `panelSize` the truth about the arrangement rather than a\nstale copy of it.\n\n`target` against `currentTarget`, because a source pane's own change bubbles\nup through these same elements on its way to the host. Only a splitter\nspeaking for itself is one of ours, and only those are stopped: the sandbox\nannounces `helix-before-split` and `helix-before-panel-resize` in their\nplace, and a consumer never sees the two splitters inside it."
93562
+ "description": "Answers a divider that has asked to move.\n\nBoth splitters are controlled from here, so neither applies anything on its\nown: each announces where it wants to go and this decides. That is what\nkeeps `split` and `panelSize` the truth about the arrangement rather than a\nstale copy of it.\n\n`target` against `currentTarget`, because a source pane's own change bubbles\nup through these same elements on its way to the host. Only a splitter\nspeaking for itself is one of ours, and only those are stopped: the sandbox\nannounces `helix-before-split` and `helix-before-panel-resize` in their\nplace, and a consumer never sees the two splitters inside it.\n\n**Refused as well as stopped, which is what \"controlled from here\" costs.**\nA splitter nobody refuses applies the move itself and says so in its own\ndocblock, so the sentence above was true only while nothing downstream ever\ndeclined: refusing `helix-before-split` left `split` at fifty and the\ndivider drawn at fifty-two, one element holding the arrangement and the\nother showing it. Refusing the inner request first makes this element the\nsingle answer.\n\n**And the divider is written back, because a refusal writes nothing.** A\nsplitter draws itself from where the gesture reached until its `position` is\nassigned, which is the setter's stated job, and a bound property Lit did not\nchange is a property Lit does not write. So the answer is assigned either\nway, which for an accepted move is the number the binding is about to carry\nanyway."
93441
93563
  },
93442
93564
  {
93443
93565
  "kind": "field",
@@ -93445,6 +93567,31 @@
93445
93567
  "privacy": "private",
93446
93568
  "readonly": true
93447
93569
  },
93570
+ {
93571
+ "kind": "method",
93572
+ "name": "answer",
93573
+ "privacy": "private",
93574
+ "return": {
93575
+ "type": {
93576
+ "text": "void"
93577
+ }
93578
+ },
93579
+ "parameters": [
93580
+ {
93581
+ "name": "divider",
93582
+ "type": {
93583
+ "text": "EventTarget | null"
93584
+ }
93585
+ },
93586
+ {
93587
+ "name": "position",
93588
+ "type": {
93589
+ "text": "number"
93590
+ }
93591
+ }
93592
+ ],
93593
+ "description": "Puts a divider where this element says it is.\n\nTyped by what is used rather than by the class, which is the whole of the\ncoupling: a splitter this does not import is one that can be replaced."
93594
+ },
93448
93595
  {
93449
93596
  "kind": "method",
93450
93597
  "name": "watchBody",
@@ -93874,7 +94021,7 @@
93874
94021
  "type": {
93875
94022
  "text": "'horizontal' | 'vertical' | undefined"
93876
94023
  },
93877
- "description": "Whether the panes sit side by side or stacked.",
94024
+ "description": "Whether the panes sit side by side or stacked.\n\nNot reflected, for `lead`'s reason above: no rule selects on it. The axis\nreaches the stylesheet as the inner splitter's own `orientation`, which is\nwhere the panes are laid out, and this element's sheet names no host\nattribute at all.",
93878
94025
  "fieldName": "orientation"
93879
94026
  },
93880
94027
  {
@@ -100958,8 +101105,12 @@
100958
101105
  "helix": {
100959
101106
  "category": "navigation",
100960
101107
  "since": "0.1.0",
100961
- "status": "experimental",
101108
+ "status": "stable",
100962
101109
  "documentation": "https://fusion.dev/helix/components/skip-link",
101110
+ "aliases": [
101111
+ "Skip navigation",
101112
+ "Skip to content"
101113
+ ],
100963
101114
  "tier": "styled",
100964
101115
  "group": "SkipLink",
100965
101116
  "part": "Root",
@@ -116054,7 +116205,7 @@
116054
116205
  "helix": {
116055
116206
  "category": "typography",
116056
116207
  "since": "0.1.0",
116057
- "status": "experimental",
116208
+ "status": "stable",
116058
116209
  "documentation": "https://fusion.dev/helix/components/text",
116059
116210
  "aliases": [
116060
116211
  "Paragraph",
@@ -13,7 +13,7 @@ import type { CSSResultGroup } from 'lit';
13
13
  * common chip free of jargon. See the headless note, which records the rule.
14
14
  *
15
15
  * @since 0.23.0
16
- * @status experimental
16
+ * @status stable
17
17
  * @category forms
18
18
  * @aliases FilterToken, FacetChip
19
19
  * @documentation https://fusion.dev/helix/components/filter-input
@@ -14,7 +14,7 @@ import type { CSSResultGroup } from 'lit';
14
14
  * away from its neighbors.
15
15
  *
16
16
  * @since 0.23.0
17
- * @status experimental
17
+ * @status stable
18
18
  * @category forms
19
19
  * @aliases Facet, Dimension
20
20
  * @documentation https://fusion.dev/helix/components/filter-input
@@ -15,7 +15,7 @@ import '../../menu/index.js';
15
15
  * immediately and why the operator is decided here rather than on the chip.
16
16
  *
17
17
  * @since 0.25.0
18
- * @status experimental
18
+ * @status stable
19
19
  * @category forms
20
20
  * @aliases FacetPicker, FilterBuilder
21
21
  * @documentation https://fusion.dev/helix/components/filter-input
@@ -12,7 +12,7 @@ import type { CSSResultGroup } from 'lit';
12
12
  * reason `FilterField`'s note gives.
13
13
  *
14
14
  * @since 0.23.0
15
- * @status experimental
15
+ * @status stable
16
16
  * @category forms
17
17
  * @aliases Comparator, Predicate
18
18
  * @documentation https://fusion.dev/helix/components/filter-input
@@ -26,7 +26,7 @@ import '../../option/index.js';
26
26
  * whatever holds it, not a `size` here.
27
27
  *
28
28
  * @since 0.1.0
29
- * @status experimental
29
+ * @status stable
30
30
  * @category forms
31
31
  * @aliases SearchField, FacetInput, TokenInput
32
32
  * @documentation https://fusion.dev/helix/components/filter-input
@@ -9,7 +9,7 @@ import type { CSSResultGroup } from 'lit';
9
9
  * tells you which list, not something to read on its own.
10
10
  *
11
11
  * @since 0.1.0
12
- * @status experimental
12
+ * @status stable
13
13
  * @aliases OptGroup, Section
14
14
  * @documentation https://fusion.dev/helix/components/option
15
15
  */
@@ -10,7 +10,7 @@ import type { CSSResultGroup } from 'lit';
10
10
  * picked from what they are looking at.
11
11
  *
12
12
  * @since 0.1.0
13
- * @status experimental
13
+ * @status stable
14
14
  * @category forms
15
15
  * @aliases Item, Choice
16
16
  * @documentation https://fusion.dev/helix/components/option
@@ -10,7 +10,7 @@ import type { CSSResultGroup } from 'lit';
10
10
  * group keeps its question above the row rather than beside the first choice.
11
11
  *
12
12
  * @since 0.1.0
13
- * @status experimental
13
+ * @status stable
14
14
  * @aliases RadioButtons, Choice group
15
15
  * @documentation https://fusion.dev/helix/components/radio
16
16
  *
@@ -14,7 +14,7 @@ import type { CSSResultGroup } from 'lit';
14
14
  * and being chosen is an answer rather than a state.
15
15
  *
16
16
  * @since 0.1.0
17
- * @status experimental
17
+ * @status stable
18
18
  * @category forms
19
19
  * @aliases Option, Choice
20
20
  * @documentation https://fusion.dev/helix/components/radio
@@ -87,6 +87,11 @@ export declare class HelixSandboxPreview extends HelixElement {
87
87
  colorMode?: 'dark' | 'light';
88
88
  /**
89
89
  * Writing direction inside the frame.
90
+ *
91
+ * Not reflected. It is payload for the render message and nothing selects on
92
+ * it, here or anywhere: a frame is a document of its own and what is written
93
+ * on this host reaches nothing inside it, which is the same reason
94
+ * `colorMode` has to be sent rather than set.
90
95
  */
91
96
  direction?: 'rtl';
92
97
  /**
@@ -95,6 +100,16 @@ export declare class HelixSandboxPreview extends HelixElement {
95
100
  label: string;
96
101
  /**
97
102
  * How the example is placed in the frame.
103
+ *
104
+ * `padded` insets it and leaves it at the top, which is the resting case and
105
+ * what an absent value sends. `centered` gives it a measure and centers that
106
+ * box in the frame. `hug` shrinks the example to its own content and centers
107
+ * what is left, which is the difference that matters for a component whose
108
+ * root is a full-width block. `fullscreen` is the whole frame with no inset.
109
+ *
110
+ * Not reflected, for `direction`'s reason: the placement is applied by the
111
+ * document inside the frame, against its own root, so no rule on this side
112
+ * could read it.
98
113
  */
99
114
  layout?: 'padded' | 'centered' | 'fullscreen' | 'hug';
100
115
  /**
@@ -114,13 +114,13 @@ __decorate([
114
114
  property({ attribute: 'color-mode' })
115
115
  ], HelixSandboxPreview.prototype, "colorMode", void 0);
116
116
  __decorate([
117
- property({ reflect: true })
117
+ property()
118
118
  ], HelixSandboxPreview.prototype, "direction", void 0);
119
119
  __decorate([
120
120
  property()
121
121
  ], HelixSandboxPreview.prototype, "label", void 0);
122
122
  __decorate([
123
- property({ reflect: true })
123
+ property()
124
124
  ], HelixSandboxPreview.prototype, "layout", void 0);
125
125
  __decorate([
126
126
  property()