@fusion.dev/helix 0.170.0 → 0.172.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.
package/types/vue.d.ts CHANGED
@@ -3318,6 +3318,10 @@ export type HelixChatComposerHelixTypingElementEvent =
3318
3318
  HelixChatComposerElementEvent<HelixTypingEvent>;
3319
3319
 
3320
3320
  export type HelixChatComposerVueProps = {
3321
+ /** A message about the draft, shown under the field. While set, the composer
3322
+ is invalid, does not send, and does not submit, as a field's `feedback`
3323
+ does, and the message is announced as it appears. */
3324
+ feedback?: (HelixChatComposer["feedback"]) | undefined;
3321
3325
  /** The field's name, read by screen readers. */
3322
3326
  label?: (HelixChatComposer["label"]) | undefined;
3323
3327
  /** The most characters a draft can have. The field stops taking more. */
@@ -4005,6 +4009,12 @@ export type HelixCodeBlockHelixToggleElementEvent =
4005
4009
  HelixCodeBlockElementEvent<HelixToggleEvent>;
4006
4010
 
4007
4011
  export type HelixCodeBlockVueProps = {
4012
+ /** The lines to mark as inserted, as numbers and ranges counted from 1, such
4013
+ as `3-4`. Drawn as `mark-lines` is, in the added color. Not for a diff. */
4014
+ "added-lines"?: (HelixCodeBlock["addedLines"]) | undefined;
4015
+ /** The lines to mark as inserted, as numbers and ranges counted from 1, such
4016
+ as `3-4`. Drawn as `mark-lines` is, in the added color. Not for a diff. */
4017
+ addedLines?: (HelixCodeBlock["addedLines"]) | undefined;
4008
4018
  /** The name of a block that scrolls, which is a tab stop while it does.
4009
4019
 
4010
4020
  Where the block has a name, the scroller says it too, such as "Code,
@@ -4163,6 +4173,12 @@ A false boolean reflects as the attribute's absence, so this costs no
4163
4173
  reflected property taking no default is satisfied by the default being
4164
4174
  `false`. */
4165
4175
  noCopy?: (HelixCodeBlock["noCopy"]) | undefined;
4176
+ /** The lines to mark as deleted, as numbers and ranges counted from 1. Drawn
4177
+ as `mark-lines` is, in the removed color. Not for a diff. */
4178
+ "removed-lines"?: (HelixCodeBlock["removedLines"]) | undefined;
4179
+ /** The lines to mark as deleted, as numbers and ranges counted from 1. Drawn
4180
+ as `mark-lines` is, in the removed color. Not for a diff. */
4181
+ removedLines?: (HelixCodeBlock["removedLines"]) | undefined;
4166
4182
  /** The words of a button that shows a folded run of unchanged lines, in a
4167
4183
  diff with `context-lines`. `{count}` is how many. */
4168
4184
  "show-unchanged-label"?: (HelixCodeBlock["showUnchangedLabel"]) | undefined;
@@ -4789,10 +4805,11 @@ would give one control two of each. What is left is the validity call and
4789
4805
  the anchor the browser points its bubble at.
4790
4806
 
4791
4807
  **Text that is not a color is bad input**, so a form does not submit
4792
- `#00` from a half-typed value. The picker draws no message of its own, so
4793
- reporting it as each keystroke arrives shows nothing until the form asks;
4794
- Color Input shows its own message against the field the reader typed
4795
- into. */
4808
+ `#00` from a half-typed value. The picker marks it, and says
4809
+ `badInputMessage` under itself, once the reader leaves the value field or
4810
+ presses Enter, and a missing color once the reader has committed one or a
4811
+ form has refused the picker. Color Input shows its own message against the
4812
+ field the reader typed into. */
4796
4813
  required?: (HelixColorPicker["required"]) | undefined;
4797
4814
  /** What the square's horizontal ramp is called. */
4798
4815
  "saturation-label"?: (HelixColorPicker["saturationLabel"]) | undefined;
@@ -5145,12 +5162,13 @@ language. */
5145
5162
  locale?: (HelixCombobox["locale"]) | undefined;
5146
5163
  /** Whether more than one option can be chosen.
5147
5164
 
5148
- The list already does the work: `value` comes apart on commas, a press
5149
- toggles rather than replaces, and the arrows move without choosing. What
5150
- this adds is the tags, and keeping the panel open between picks.
5165
+ The list already does the work: `value` is the chosen values joined with
5166
+ commas, a press toggles rather than replaces, and the arrows move without
5167
+ choosing. What this adds is the tags, and keeping the panel open between
5168
+ picks.
5151
5169
 
5152
- A comma is therefore not available inside an option's value, which is the
5153
- listbox's contract and not this element's to change.
5170
+ An option's value may hold a comma, and it is read as one value, as
5171
+ `Select` and `Listbox` read it. So may an answer the reader created.
5154
5172
 
5155
5173
  **The list is told, and the field is not.** `aria-multiselectable` belongs
5156
5174
  to `listbox`, `grid`, `tree` and `tablist`, and `combobox` dropped it in
@@ -5337,6 +5355,18 @@ so a palette filtered on a server sends one `helix-filter` for a word.
5337
5355
  so a palette filtered on a server sends one `helix-filter` for a word.
5338
5356
  `0` filters on every keystroke. See Listbox's `filter-delay`. */
5339
5357
  filterDelay?: (HelixCommand["filterDelay"]) | undefined;
5358
+ /** Where Home and End go from the filter field.
5359
+
5360
+ Absent, they move the caret, as APG's combobox has them. `list` moves the
5361
+ highlight to the first or the last command, as React Aria's Autocomplete
5362
+ does, and Shift with either still selects the text. */
5363
+ "home-end"?: (HelixCommand["homeEnd"]) | undefined;
5364
+ /** Where Home and End go from the filter field.
5365
+
5366
+ Absent, they move the caret, as APG's combobox has them. `list` moves the
5367
+ highlight to the first or the last command, as React Aria's Autocomplete
5368
+ does, and Shift with either still selects the text. */
5369
+ homeEnd?: (HelixCommand["homeEnd"]) | undefined;
5340
5370
  /** The key that opens the palette, written as `mod+k`, `shift+p`, or `k`,
5341
5371
  in Kbd's chord spelling: `mod` is Command or Control, `ctrl`, `cmd`,
5342
5372
  `alt` and `shift` the keys they name.
@@ -5354,6 +5384,10 @@ and `open`, `toggle` and the dialog's parts do nothing. */
5354
5384
  inline?: (HelixCommand["inline"]) | undefined;
5355
5385
  /** Accessible name for the overlay, which has no visible heading. */
5356
5386
  label?: (HelixCommand["label"]) | undefined;
5387
+ /** How the commands are laid out, as Listbox's `layout`: `grid` draws them in
5388
+ rows and columns, for a palette of icons or emoji, and the arrow keys
5389
+ follow the rows and the columns. Absent is one command under another. */
5390
+ layout?: (HelixCommand["layout"]) | undefined;
5357
5391
  /** What the list says when its commands could not be loaded, such as after a
5358
5392
  request to a server fails. Empty, null or no attribute is no error, so
5359
5393
  removing the attribute clears it. Passed to the list, which shows it
@@ -6007,7 +6041,11 @@ thousand rows, where the page is a reasonable fetch and a poor render.
6007
6041
 
6008
6042
  Off by default. Windowing costs a scroll listener, a measurement per row
6009
6043
  drawn, and a `block-size` on the scrolling box, and a table of twenty rows
6010
- should pay none of them. */
6044
+ should pay none of them.
6045
+
6046
+ While windowed, the `table` part scrolls on this tier: it carries
6047
+ `data-scroller`, and `core` ships `[data-scroller] { overflow: auto }` into
6048
+ every shadow root. You still need to give it a block size. */
6011
6049
  windowed?: (HelixDataTable["windowed"]) | undefined;
6012
6050
  /** Every row of the result, in the order it arrived.
6013
6051
 
@@ -7961,6 +7999,13 @@ nothing between them, because a word every chip carries is a word nobody
7961
7999
  reads. The moment somebody picks a different comparison it appears, which
7962
8000
  makes an unusual filter look unusual. */
7963
8001
  operatorLabel?: (HelixFilterChip["operatorLabel"]) | undefined;
8002
+ /** Whether the remove button is a tab stop of its own.
8003
+
8004
+ `FilterInput` writes `false` on the chips in its `tags` slot: the field's
8005
+ text is its one tab stop, and the arrow keys move from the text to the
8006
+ chips, as in a `multiple` Combobox. No attribute: it is coordination
8007
+ between elements, as `Tag.dismissTabStop` is. */
8008
+ dismissTabStop?: (HelixFilterChip["dismissTabStop"]) | undefined;
7964
8009
  };
7965
8010
 
7966
8011
  export type HelixFilterChipVueEvents = {
@@ -8201,6 +8246,18 @@ and this one was the English a form in another language still spoke in
8201
8246
  the bubble it raises on submit: `feedback` replaces the message under
8202
8247
  the field and does not reach that one. */
8203
8248
  valueMissingMessage?: (HelixFilterInput["valueMissingMessage"]) | undefined;
8249
+ /** Whether the field keeps a `FilterChip` for each filter in its `tags` slot,
8250
+ from the `helix-facet` events it hears.
8251
+
8252
+ Off, you build the chips, which is what you do when your own model holds
8253
+ the filters. On, a filter typed, picked, or changed adds or updates the
8254
+ chip for its field, one with no values takes it away (unless its
8255
+ comparison takes none, such as "is empty"), and removing the chip clears
8256
+ the filter. A `helix-facet` you cancel changes no chip.
8257
+
8258
+ The chips are elements the field adds to its own children, so leave this
8259
+ off where a framework renders those children and would remove them. */
8260
+ chips?: (HelixFilterInput["chips"]) | undefined;
8204
8261
  /** Shows a button that empties the field.
8205
8262
 
8206
8263
  The text only. The tokens are the consumer's markup and this element is not
@@ -8222,6 +8279,29 @@ what you slot and you narrow it. */
8222
8279
  being typed, as React Aria's Autocomplete filters. Off, the panel shows
8223
8280
  what you slot and you narrow it. */
8224
8281
  filterSuggestions?: (HelixFilterInput["filterSuggestions"]) | undefined;
8282
+ /** Whether the suggestions are still loading, such as while a request for the
8283
+ values of a typed key is out.
8284
+
8285
+ The panel opens on `loading-text`, or the `loading` slot, while the field
8286
+ has focus, and a screen reader hears it. Slot the options and clear this
8287
+ when they arrive. */
8288
+ loading?: (HelixFilterInput["loading"]) | undefined;
8289
+ /** Text the panel shows while the suggestions load. */
8290
+ "loading-text"?: (HelixFilterInput["loadingText"]) | undefined;
8291
+ /** Text the panel shows while the suggestions load. */
8292
+ loadingText?: (HelixFilterInput["loadingText"]) | undefined;
8293
+ /** Text the panel shows when `filter-suggestions` hides every suggestion, such
8294
+ as "No matching filters".
8295
+
8296
+ Empty, or no `no-results` slot, and the panel closes instead, as it does
8297
+ when it has nothing to offer. */
8298
+ "no-results-text"?: (HelixFilterInput["noResultsText"]) | undefined;
8299
+ /** Text the panel shows when `filter-suggestions` hides every suggestion, such
8300
+ as "No matching filters".
8301
+
8302
+ Empty, or no `no-results` slot, and the panel closes instead, as it does
8303
+ when it has nothing to offer. */
8304
+ noResultsText?: (HelixFilterInput["noResultsText"]) | undefined;
8225
8305
  /** The text shown while the field is empty.
8226
8306
 
8227
8307
  Not a label: it goes when typing starts. */
@@ -12244,6 +12324,14 @@ or on Alt+Down or Alt+Up. */
12244
12324
 
12245
12325
  It moves if that side does not fit. */
12246
12326
  placement?: (HelixMenu["placement"]) | undefined;
12327
+ /** What a screen reader hears when the filter narrows the rows. `{count}` is
12328
+ how many rows are left, written in the locale, and each language writes
12329
+ the forms it has, as Listbox's `results-label` does. */
12330
+ "results-label"?: (HelixMenu["resultsLabel"]) | undefined;
12331
+ /** What a screen reader hears when the filter narrows the rows. `{count}` is
12332
+ how many rows are left, written in the locale, and each language writes
12333
+ the forms it has, as Listbox's `results-label` does. */
12334
+ resultsLabel?: (HelixMenu["resultsLabel"]) | undefined;
12247
12335
  /** How a submenu opens. `drill` shows it in place of the page showing, with
12248
12336
  a way back. `flyout` opens it in a panel of its own beside its row. */
12249
12337
  submenus?: (HelixMenu["submenus"]) | undefined;
@@ -12254,11 +12342,21 @@ Aria's `Autocomplete` takes `filter`. See Listbox's `filterMatch`.
12254
12342
  Absent, a row is kept where its words hold the filter, in any case. A
12255
12343
  property only, there being no way to write a function in markup. */
12256
12344
  filterMatch?: (HelixMenu["filterMatch"]) | undefined;
12345
+ /** The values of the choice rows that are checked, anywhere in the menu, in
12346
+ document order.
12347
+
12348
+ Set it to check exactly those rows and uncheck every other choice row, as
12349
+ React Aria's `selectedKeys` controls a menu's selection from one place.
12350
+ Each row keeps its own `checked` too, which this reads and writes. `change`
12351
+ is sent on the menu when a reader's choice changes it. */
12352
+ checkedValues?: (HelixMenu["checkedValues"]) | undefined;
12257
12353
  };
12258
12354
 
12259
12355
  export type HelixMenuVueEvents = {
12260
12356
  /** The menu opened or closed. The event carries `newState` and `oldState`. */
12261
12357
  toggle: HelixMenuToggleElementEvent;
12358
+ /** A reader's choice checked or unchecked rows. Read `checkedValues` for the rows that are checked now. */
12359
+ change: HelixMenuElementEvent;
12262
12360
  /** The menu is about to close. Cancelable: cancel it to keep it open. */
12263
12361
  "helix-before-close": HelixMenuHelixBeforeCloseElementEvent;
12264
12362
  /** The menu is about to open. Cancelable: cancel it to keep it closed. */
@@ -12883,9 +12981,13 @@ speaks it: `feedback` replaces the message under the field and does not
12883
12981
  reach the bubble. Unset is the sentence registered for the page's
12884
12982
  language, then the English. */
12885
12983
  badInputMessage?: (HelixNumberInput["badInputMessage"]) | undefined;
12886
- /** The name of the step down button, read by screen readers. */
12984
+ /** The name of the step down button, read by screen readers. The field's
12985
+ label follows it, so a reader hears "Decrease Quantity", as React Aria
12986
+ names its steppers. */
12887
12987
  "decrement-label"?: (HelixNumberInput["decrementLabel"]) | undefined;
12888
- /** The name of the step down button, read by screen readers. */
12988
+ /** The name of the step down button, read by screen readers. The field's
12989
+ label follows it, so a reader hears "Decrease Quantity", as React Aria
12990
+ names its steppers. */
12889
12991
  decrementLabel?: (HelixNumberInput["decrementLabel"]) | undefined;
12890
12992
  /** `Intl.NumberFormat` options the number is shown with while the field is
12891
12993
  not being edited: a currency, a percent, a unit, or a number of decimals.
@@ -12903,9 +13005,13 @@ Written as JSON in the attribute.
12903
13005
  <helix-number-input format-options='{"style":"currency","currency":"EUR"}'></helix-number-input>
12904
13006
  ``` */
12905
13007
  formatOptions?: (HelixNumberInput["formatOptions"]) | undefined;
12906
- /** The name of the step up button, read by screen readers. */
13008
+ /** The name of the step up button, read by screen readers. The field's
13009
+ label follows it, so a reader hears "Increase Quantity", as React Aria
13010
+ names its steppers. */
12907
13011
  "increment-label"?: (HelixNumberInput["incrementLabel"]) | undefined;
12908
- /** The name of the step up button, read by screen readers. */
13012
+ /** The name of the step up button, read by screen readers. The field's
13013
+ label follows it, so a reader hears "Increase Quantity", as React Aria
13014
+ names its steppers. */
12909
13015
  incrementLabel?: (HelixNumberInput["incrementLabel"]) | undefined;
12910
13016
  /** How many steps `PageUp` and `PageDown` move.
12911
13017
 
@@ -14076,17 +14182,42 @@ hydration, or diffed by a framework, it comes back holding whatever the
14076
14182
  last reader did rather than what the author wrote. `:state(open)` carries
14077
14183
  the resolved state for stylesheets, which is what the mirror is for. */
14078
14184
  open?: (HelixPopover["open"]) | undefined;
14185
+ /** The element the panel opens against, where that is not the trigger: its
14186
+ `id` in the same document or shadow root, or the element itself. Left
14187
+ empty, the panel opens against the trigger, or against the button whose
14188
+ command opened it. */
14189
+ anchor?: (HelixPopover["anchor"]) | undefined;
14079
14190
  /** Draws a point on the panel's edge facing the trigger.
14080
14191
 
14081
14192
  Off by default, which is the house style: a panel that opens from its
14082
14193
  trigger already reads as belonging to it. */
14083
14194
  arrow?: (HelixPopover["arrow"]) | undefined;
14195
+ /** How close to the window's edges the panel may come, in pixels, when it
14196
+ slides, shrinks or moves to the other side to fit. Left unset, it slides
14197
+ and shrinks to 8 pixels from an edge and moves to the other side only
14198
+ once it would cross one. */
14199
+ "container-padding"?: (HelixPopover["containerPadding"] | `${number}`) | undefined;
14200
+ /** How close to the window's edges the panel may come, in pixels, when it
14201
+ slides, shrinks or moves to the other side to fit. Left unset, it slides
14202
+ and shrinks to 8 pixels from an edge and moves to the other side only
14203
+ once it would cross one. */
14204
+ containerPadding?: (HelixPopover["containerPadding"]) | undefined;
14205
+ /** How far to slide the panel along the side it is on, in pixels: to the
14206
+ right on the top or the bottom, and down on the left or the right. */
14207
+ "cross-offset"?: (HelixPopover["crossOffset"] | `${number}`) | undefined;
14208
+ /** How far to slide the panel along the side it is on, in pixels: to the
14209
+ right on the top or the bottom, and down on the left or the right. */
14210
+ crossOffset?: (HelixPopover["crossOffset"]) | undefined;
14084
14211
  /** The panel's name where nothing else names it: no `label`, no heading in
14085
14212
  the panel, and no `aria-labelledby` on the host. */
14086
14213
  "fallback-label"?: (HelixPopover["fallbackLabel"]) | undefined;
14087
14214
  /** The panel's name where nothing else names it: no `label`, no heading in
14088
14215
  the panel, and no `aria-labelledby` on the host. */
14089
14216
  fallbackLabel?: (HelixPopover["fallbackLabel"]) | undefined;
14217
+ /** Whether the panel moves to the other side of the trigger when its own
14218
+ side has no room. On by default. Write `flip="false"` to keep it on its
14219
+ side, where it shrinks to fit, as React Aria's `shouldFlip` turns off. */
14220
+ flip?: (HelixPopover["flip"]) | undefined;
14090
14221
  /** The panel's name, read by screen readers. Left empty, the first heading in
14091
14222
  the panel names it, and then `fallback-label`. */
14092
14223
  label?: (HelixPopover["label"]) | undefined;
@@ -14964,6 +15095,11 @@ it, here or anywhere: a frame is a document of its own and what is written
14964
15095
  on this host reaches nothing inside it, which is the same reason
14965
15096
  `colorMode` has to be sent rather than set. */
14966
15097
  direction?: (HelixSandboxPreview["direction"]) | undefined;
15098
+ /** The packages an example can import by name in the built-in document,
15099
+ each mapped to the address of an ES module, as an import map's `imports`.
15100
+ Set it as JSON in the attribute or as an object. Not read where `src` is
15101
+ set. */
15102
+ imports?: (HelixSandboxPreview["imports"]) | undefined;
14967
15103
  /** The frame's name, read by screen readers. */
14968
15104
  label?: (HelixSandboxPreview["label"]) | undefined;
14969
15105
  /** How the example is placed in the frame.
@@ -15231,6 +15367,10 @@ the pane's `label`. */
15231
15367
  /** The pane's file name, such as `index.html`, on its tab where a sandbox
15232
15368
  holds several panes. Empty puts the pane's `name` on the tab. */
15233
15369
  label?: (HelixSandboxSource["label"]) | undefined;
15370
+ /** Whether each line of the source is numbered, in a gutter beside it. */
15371
+ "line-numbers"?: (HelixSandboxSource["lineNumbers"]) | undefined;
15372
+ /** Whether each line of the source is numbered, in a gutter beside it. */
15373
+ lineNumbers?: (HelixSandboxSource["lineNumbers"]) | undefined;
15234
15374
  /** Which source this pane holds. Every `helix-before-edit` event includes it.
15235
15375
 
15236
15376
  `html` and `css` are what the sandbox root routes on; any other name is
@@ -16777,7 +16917,8 @@ Ignored once `active` is written. */
16777
16917
  Ignored once `active` is written. */
16778
16918
  defaultActive?: (HelixSteps["defaultActive"]) | undefined;
16779
16919
  /** Whether the arrow keys move focus between the stages' names, along the
16780
- way the steps run. Off by default, so the arrows keep scrolling the page. */
16920
+ way the steps run, and the names are one tab stop. Off by default, so the
16921
+ arrows keep scrolling the page. */
16781
16922
  arrows?: (HelixSteps["arrows"]) | undefined;
16782
16923
  /** What marks a stage `complete`.
16783
16924
 
@@ -16874,7 +17015,9 @@ with the page. */
16874
17015
  /** Whether a reader may pass the stage without finishing it, in a sequence
16875
17016
  with `linear`. Ark UI's skippable step. */
16876
17017
  optional?: (HelixStep["optional"]) | undefined;
16877
- /** The value the step sends in `helix-select`. */
17018
+ /** The value the step sends in `helix-select`, and what names the step in its
17019
+ sequence's `active`. Without one, the sequence names the step by its place,
17020
+ counted from 1. */
16878
17021
  value?: (HelixStep["value"]) | undefined;
16879
17022
  };
16880
17023
 
@@ -22889,6 +23032,8 @@ export type CustomCssProperties = {
22889
23032
  "--sandbox-source-invalid-color"?: (string) | undefined;
22890
23033
  /** Color of a `keyword` run, under `tokenize`. Defaults to `--helix-color-syntax-keyword`. */
22891
23034
  "--sandbox-source-keyword-color"?: (string) | undefined;
23035
+ /** Color of the line numbers, under `line-numbers`. Defaults to `--helix-color-foreground-subtle`. */
23036
+ "--sandbox-source-line-number-color"?: (string) | undefined;
22892
23037
  /** Minimum height of the pane. */
22893
23038
  "--sandbox-source-min-block-size"?: (string) | undefined;
22894
23039
  /** Color of a `name` run, under `tokenize`. Defaults to `--helix-color-syntax-name`. */
@@ -24301,7 +24446,7 @@ export interface WcToolkitVueGlobalComponents {
24301
24446
  HelixRatingVueProps,
24302
24447
  HelixRatingVueEvents
24303
24448
  >;
24304
- /** A sandboxed '<iframe>' that loads 'src', a document you provide. That document imports what the examples need, listens for a render message, and writes the markup into itself. **Without 'src', the frame loads a built-in document**, so a sandbox renders with nothing to host. It runs HTML, CSS, and scripts, and reports the console, uncaught errors, its height, and presses as a frame on 'servePreview' does. It defines no element, so an example that uses Helix components needs a 'src' that imports them. **Examples render in a frame**, so an example's styles and scripts do not affect the page around the sandbox, and 'position: fixed' stays inside the pane. The frame starts empty, with its own stylesheets and its own custom element registry, so 'src' must load the styles and components the examples use. **The source is untrusted, and the frame keeps it isolated.** The frame uses 'sandbox="allow-scripts"' and never 'allow-same-origin'. Together, the two let a document on the same origin remove its own sandbox, which is the same as having none. **A preview says where it is.** It is ':state(loading)' from the moment it has a 'src' until that document can take the example, and again through 'reload()'. It is ':state(failed)' once the example throws an error it does not catch, until the next source is sent, which a frame on 'servePreview' reports. A page draws its own spinner or message from either, such as a sibling shown by 'helix-sandbox-preview:state(failed) + .message'. **A failed preview shows the error over the example**, in the 'error' part, until the next source is sent. The terminal says it too, so the part is not announced. Hide it with '::part(error) { display: none }' where the page draws its own. **'controls' draws two buttons in the preview's corner**: one reloads the frame's document, as 'reload()' does, and one opens the example in a new tab, as 'open()' does. The tab runs it in a frame sandboxed as this one is. */
24449
+ /** A sandboxed '<iframe>' that loads 'src', a document you provide. That document imports what the examples need, listens for a render message, and writes the markup into itself. **Without 'src', the frame loads a built-in document**, so a sandbox renders with nothing to host. It runs HTML, CSS, and scripts, and reports the console, uncaught errors, its height, and presses as a frame on 'servePreview' does. It defines no element, so an example that uses Helix components needs a 'src' that imports them. **'imports' lets an example import packages by name** in the built-in document, as an import map: each name maps to the address of an ES module, such as '{"canvas-confetti": "https://esm.sh/canvas-confetti@1.9.3"}', and 'import confetti from 'canvas-confetti'' in the 'js' pane then loads it. A CDN that serves npm packages as modules, such as esm.sh or jsDelivr's '+esm', gives every package an address. A new map loads the document again, since a browser reads one only as a document starts. A 'src' document declares its own. **Examples render in a frame**, so an example's styles and scripts do not affect the page around the sandbox, and 'position: fixed' stays inside the pane. The frame starts empty, with its own stylesheets and its own custom element registry, so 'src' must load the styles and components the examples use. **The source is untrusted, and the frame keeps it isolated.** The frame uses 'sandbox="allow-scripts"' and never 'allow-same-origin'. Together, the two let a document on the same origin remove its own sandbox, which is the same as having none. **A preview says where it is.** It is ':state(loading)' from the moment it has a 'src' until that document can take the example, and again through 'reload()'. It is ':state(failed)' once the example throws an error it does not catch, until the next source is sent, which a frame on 'servePreview' reports. A page draws its own spinner or message from either, such as a sibling shown by 'helix-sandbox-preview:state(failed) + .message'. **A failed preview shows the error over the example**, in the 'error' part, until the next source is sent. The terminal says it too, so the part is not announced. Hide it with '::part(error) { display: none }' where the page draws its own. **'controls' draws two buttons in the preview's corner**: one reloads the frame's document, as 'reload()' does, and one opens the example in a new tab, as 'open()' does. The tab runs it in a frame sandboxed as this one is. */
24305
24450
  "helix-sandbox-preview": DefineCustomElement<
24306
24451
  HelixSandboxPreview,
24307
24452
  HelixSandboxPreviewVueProps,
@@ -24313,7 +24458,7 @@ export interface WcToolkitVueGlobalComponents {
24313
24458
  HelixSandboxVueProps,
24314
24459
  HelixSandboxVueEvents
24315
24460
  >;
24316
- /** A real '<textarea>', so undo, selection, spellcheck suppression, mobile keyboards, and screen reader support come from the platform. Tab inserts two spaces, so you can indent code. To move focus out of the field, press Escape and then Tab. Shift+Tab moves focus back as it does anywhere else. The field's description says so to a screen reader. **'tokenize' colors the source** with a highlighter you bring, such as one built on Lezer, Prism or Shiki. It is a function from the source to runs of text, each with an optional kind, and the pane draws the runs under a transparent field, so typing, selection and undo stay the textarea's. The kinds are 'callable', 'comment', 'constant', 'invalid', 'keyword', 'name', 'string' and 'tag', each colored by the '--helix-color-syntax-*' token of its name and a hook of its own, such as '--sandbox-source-keyword-color'. A run of any other kind is drawn in the field's own color. Every run with a kind is a 'token' part, and carries its kind as 'data-kind'. A 'tokenize' that throws leaves the source drawn plain and the field editable, and the error is reported to the page as an uncaught one. */
24461
+ /** A real '<textarea>', so undo, selection, spellcheck suppression, mobile keyboards, and screen reader support come from the platform. Tab inserts two spaces, so you can indent code. To move focus out of the field, press Escape and then Tab. Shift+Tab moves focus back as it does anywhere else. The field's description says so to a screen reader. **'tokenize' colors the source** with a highlighter you bring, such as one built on Lezer, Prism or Shiki. It is a function from the source to runs of text, each with an optional kind, and the pane draws the runs under a transparent field, so typing, selection and undo stay the textarea's. The kinds are 'callable', 'comment', 'constant', 'invalid', 'keyword', 'name', 'string' and 'tag', each colored by the '--helix-color-syntax-*' token of its name and a hook of its own, such as '--sandbox-source-keyword-color'. A run of any other kind is drawn in the field's own color. Every run with a kind is a 'token' part, and carries its kind as 'data-kind'. A 'tokenize' that throws leaves the source drawn plain and the field editable, and the error is reported to the page as an uncaught one. **'line-numbers' numbers each line** in a gutter beside the source. A line that wraps keeps one number. The numbers are drawn, and hidden from screen readers, which read the field. Enter keeps the indentation of the line it breaks, and the new line is undone with the next undo as typing is. **The source can be written inside the pane** where 'value' is not set: its text, or the markup of a '<template>' it holds, without the indentation the page gave it. Markup goes in a template so the page does not render it or run its scripts. Text inside the pane is read once, when it connects. */
24317
24462
  "helix-sandbox-source": DefineCustomElement<
24318
24463
  HelixSandboxSource,
24319
24464
  HelixSandboxSourceVueProps,
package/types/words.d.ts CHANGED
@@ -1886,13 +1886,17 @@ declare module '@fusion.dev/helix-core' {
1886
1886
  */
1887
1887
  badInputMessage: Message
1888
1888
  /**
1889
- * The name of the step down button, read by screen readers.
1889
+ * The name of the step down button, read by screen readers. The field's
1890
+ * label follows it, so a reader hears "Decrease Quantity", as React Aria
1891
+ * names its steppers.
1890
1892
  *
1891
1893
  * English: `Decrease`
1892
1894
  */
1893
1895
  decrementLabel: Message
1894
1896
  /**
1895
- * The name of the step up button, read by screen readers.
1897
+ * The name of the step up button, read by screen readers. The field's
1898
+ * label follows it, so a reader hears "Increase Quantity", as React Aria
1899
+ * names its steppers.
1896
1900
  *
1897
1901
  * English: `Increase`
1898
1902
  */