@fusion.dev/helix 0.183.0 → 0.184.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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@fusion.dev/helix",
3
3
  "description": "Styled component tier. Extends the headless tier with token-driven presentation.",
4
- "version": "0.183.0",
4
+ "version": "0.184.0",
5
5
  "license": "MIT",
6
6
  "author": "Ross Sheppard <ross.sheppard@fusion.dev>",
7
7
  "repository": {
@@ -54,14 +54,14 @@
54
54
  },
55
55
  "bugs": "https://github.com/project-fusion/fusion/issues",
56
56
  "dependencies": {
57
- "@fusion.dev/helix-core": "0.183.0",
58
- "@fusion.dev/helix-headless": "0.183.0",
59
- "@fusion.dev/helix-styles": "0.183.0",
57
+ "@fusion.dev/helix-core": "0.184.0",
58
+ "@fusion.dev/helix-headless": "0.184.0",
59
+ "@fusion.dev/helix-styles": "0.184.0",
60
60
  "tslib": "^2.8.1"
61
61
  },
62
62
  "devDependencies": {
63
- "@fusion.dev/helix-cem": "0.183.0",
64
- "@fusion.dev/helix-testing": "0.183.0",
63
+ "@fusion.dev/helix-cem": "0.184.0",
64
+ "@fusion.dev/helix-testing": "0.184.0",
65
65
  "@fusion.dev/scripts": "0.0.0-dev",
66
66
  "@happy-dom/global-registrator": "^20.14.5",
67
67
  "@lit-labs/ssr": "^4.1.0",
package/types/jsx.d.ts CHANGED
@@ -8045,7 +8045,11 @@ whole of it, which Shiki writes, are taken off, so the lines sit level
8045
8045
  with the gutter's numbers and the block keeps one tab stop. The code stays
8046
8046
  in the slot, so the copy button copies it as written and a reader without
8047
8047
  the script still has it. Not called on a server, which has no code to
8048
- read, nor for a diff. */
8048
+ read, nor for a diff.
8049
+
8050
+ Absent, the block draws with the highlighter `registerHighlighter` gave
8051
+ every block, where an entry such as `@fusion.dev/helix-sandbox/code-block`
8052
+ registered one, and plain otherwise. */
8049
8053
  highlight?: (HelixCodeBlock["highlight"]) | undefined;
8050
8054
 
8051
8055
  /** A file tab showed its file, whose name `file` now holds. */
@@ -8285,7 +8289,11 @@ whole of it, which Shiki writes, are taken off, so the lines sit level
8285
8289
  with the gutter's numbers and the block keeps one tab stop. The code stays
8286
8290
  in the slot, so the copy button copies it as written and a reader without
8287
8291
  the script still has it. Not called on a server, which has no code to
8288
- read, nor for a diff. */
8292
+ read, nor for a diff.
8293
+
8294
+ Absent, the block draws with the highlighter `registerHighlighter` gave
8295
+ every block, where an entry such as `@fusion.dev/helix-sandbox/code-block`
8296
+ registered one, and plain otherwise. */
8289
8297
  "prop:highlight"?: (HelixCodeBlock["highlight"]) | undefined;
8290
8298
  /** A file tab showed its file, whose name `file` now holds. */
8291
8299
  "on:change"?: ((e: HelixCodeBlockElementEvent) => void) | undefined;
@@ -24301,7 +24309,11 @@ Cleared as the menu closes and as a submenu opens or closes, so each page
24301
24309
  starts with every row showing. */
24302
24310
  filter?: (HelixMenu["filter"]) | undefined;
24303
24311
  /** Whether the menu shows a field above its rows that narrows them as the
24304
- reader types, with focus staying in the field. */
24312
+ reader types, with focus staying in the field, once
24313
+ `@fusion.dev/helix/menu/filter` (or `@fusion.dev/helix-headless/menu/filter`)
24314
+ is imported. Without that import it does nothing, so a menu that never
24315
+ filters carries none of the filter's code, and a development build says
24316
+ which import is missing. */
24305
24317
  filterable?: (HelixMenu["filterable"]) | undefined;
24306
24318
  /** The filter field's name and placeholder. */
24307
24319
  "filter-label"?: (HelixMenu["filterLabel"]) | undefined;
@@ -24435,7 +24447,11 @@ Cleared as the menu closes and as a submenu opens or closes, so each page
24435
24447
  starts with every row showing. */
24436
24448
  "prop:filter"?: (HelixMenu["filter"]) | undefined;
24437
24449
  /** Whether the menu shows a field above its rows that narrows them as the
24438
- reader types, with focus staying in the field. */
24450
+ reader types, with focus staying in the field, once
24451
+ `@fusion.dev/helix/menu/filter` (or `@fusion.dev/helix-headless/menu/filter`)
24452
+ is imported. Without that import it does nothing, so a menu that never
24453
+ filters carries none of the filter's code, and a development build says
24454
+ which import is missing. */
24439
24455
  "prop:filterable"?: (HelixMenu["filterable"]) | undefined;
24440
24456
  /** The filter field's name and placeholder. */
24441
24457
  "attr:filter-label"?: (HelixMenu["filterLabel"]) | undefined;
@@ -36806,6 +36822,12 @@ number, and both are carried as one comma-separated value, which is what a
36806
36822
  form submits. `TimePicker` carries the longer note on the interaction and
36807
36823
  on why a wheel cannot do either. */
36808
36824
  mode?: (HelixTimeInput["mode"]) | undefined;
36825
+ /** The words on the list's button that chooses the current time, drawn with
36826
+ `show-now`. */
36827
+ "now-label"?: (HelixTimeInput["nowLabel"]) | undefined;
36828
+ /** The words on the list's button that chooses the current time, drawn with
36829
+ `show-now`. */
36830
+ nowLabel?: (HelixTimeInput["nowLabel"]) | undefined;
36809
36831
  /** Placeholder text shown before a time is entered. */
36810
36832
  placeholder?: (HelixTimeInput["placeholder"]) | undefined;
36811
36833
  /** The message shown when a range holds more than two times.
@@ -36846,6 +36868,14 @@ removes rather than as "Remove" said once per time. */
36846
36868
  may give them, the field writes them, and the list's `step` counts seconds.
36847
36869
  See Time Picker's `seconds`. */
36848
36870
  seconds?: (HelixTimeInput["seconds"]) | undefined;
36871
+ /** Draws a button under the times in the list that chooses the current time,
36872
+ moved to the nearest time on offer. See Time Picker's `show-now`. Its words
36873
+ are `now-label`. */
36874
+ "show-now"?: (HelixTimeInput["showNow"]) | undefined;
36875
+ /** Draws a button under the times in the list that chooses the current time,
36876
+ moved to the nearest time on offer. See Time Picker's `show-now`. Its words
36877
+ are `now-label`. */
36878
+ showNow?: (HelixTimeInput["showNow"]) | undefined;
36849
36879
  /** How far apart the offered times are, in minutes, or in seconds with
36850
36880
  `seconds`. */
36851
36881
  step?: (HelixTimeInput["step"]) | undefined;
@@ -37214,6 +37244,12 @@ number, and both are carried as one comma-separated value, which is what a
37214
37244
  form submits. `TimePicker` carries the longer note on the interaction and
37215
37245
  on why a wheel cannot do either. */
37216
37246
  "prop:mode"?: (HelixTimeInput["mode"]) | undefined;
37247
+ /** The words on the list's button that chooses the current time, drawn with
37248
+ `show-now`. */
37249
+ "attr:now-label"?: (HelixTimeInput["nowLabel"]) | undefined;
37250
+ /** The words on the list's button that chooses the current time, drawn with
37251
+ `show-now`. */
37252
+ "prop:nowLabel"?: (HelixTimeInput["nowLabel"]) | undefined;
37217
37253
  /** Placeholder text shown before a time is entered. */
37218
37254
  "prop:placeholder"?: (HelixTimeInput["placeholder"]) | undefined;
37219
37255
  /** The message shown when a range holds more than two times.
@@ -37254,6 +37290,14 @@ removes rather than as "Remove" said once per time. */
37254
37290
  may give them, the field writes them, and the list's `step` counts seconds.
37255
37291
  See Time Picker's `seconds`. */
37256
37292
  "prop:seconds"?: (HelixTimeInput["seconds"]) | undefined;
37293
+ /** Draws a button under the times in the list that chooses the current time,
37294
+ moved to the nearest time on offer. See Time Picker's `show-now`. Its words
37295
+ are `now-label`. */
37296
+ "bool:show-now"?: (HelixTimeInput["showNow"]) | undefined;
37297
+ /** Draws a button under the times in the list that chooses the current time,
37298
+ moved to the nearest time on offer. See Time Picker's `show-now`. Its words
37299
+ are `now-label`. */
37300
+ "prop:showNow"?: (HelixTimeInput["showNow"]) | undefined;
37257
37301
  /** How far apart the offered times are, in minutes, or in seconds with
37258
37302
  `seconds`. */
37259
37303
  "prop:step"?: (HelixTimeInput["step"]) | undefined;
@@ -47510,7 +47554,11 @@ export type CustomElements = {
47510
47554
  * with the gutter's numbers and the block keeps one tab stop. The code stays
47511
47555
  * in the slot, so the copy button copies it as written and a reader without
47512
47556
  * the script still has it. Not called on a server, which has no code to
47513
- * read, nor for a diff. (property only)
47557
+ * read, nor for a diff.
47558
+ *
47559
+ * Absent, the block draws with the highlighter `registerHighlighter` gave
47560
+ * every block, where an entry such as `@fusion.dev/helix-sandbox/code-block`
47561
+ * registered one, and plain otherwise. (property only)
47514
47562
  * - `whenSettled`: Resolves a frame after the first update, when transitions are switched on.
47515
47563
  *
47516
47564
  * **Named `whenSettled` because `settled` is taken four times over**, by
@@ -58364,7 +58412,11 @@ export type CustomElements = {
58364
58412
  * Cleared as the menu closes and as a submenu opens or closes, so each page
58365
58413
  * starts with every row showing.
58366
58414
  * - `filterable`: Whether the menu shows a field above its rows that narrows them as the
58367
- * reader types, with focus staying in the field.
58415
+ * reader types, with focus staying in the field, once
58416
+ * `@fusion.dev/helix/menu/filter` (or `@fusion.dev/helix-headless/menu/filter`)
58417
+ * is imported. Without that import it does nothing, so a menu that never
58418
+ * filters carries none of the filter's code, and a development build says
58419
+ * which import is missing.
58368
58420
  * - `filter-label`/`filterLabel`: The filter field's name and placeholder.
58369
58421
  * - `label`: Accessible name for the surface.
58370
58422
  *
@@ -62677,6 +62729,15 @@ export type CustomElements = {
62677
62729
  * in the `js` pane or in another module loads it. A sandbox writes each pane
62678
62730
  * named for a module file here.
62679
62731
  *
62732
+ * **A module in TypeScript or JSX runs too**: a path ending in `.ts`, `.tsx`
62733
+ * or `.jsx` is compiled to JavaScript first, and imported by its path or by
62734
+ * its path without the extension. The compiler, Sucrase, loads from `cdn` the
62735
+ * first time a module needs it, so the package carries none and a preview
62736
+ * with no such module loads none. JSX compiles to the automatic runtime,
62737
+ * `react/jsx-runtime`, from `dependencies`, or to the one a
62738
+ * `@jsxImportSource` comment names. What fails to compile shows in the
62739
+ * `error` part as an error the example threw, when the example imports it.
62740
+ *
62680
62741
  * **Examples render in a frame**, so an example's styles and scripts do not
62681
62742
  * affect the page around the sandbox, and `position: fixed` stays inside the
62682
62743
  * pane. The frame starts empty, with its own stylesheets and its own custom
@@ -62860,6 +62921,10 @@ export type CustomElements = {
62860
62921
  * - `js` sets a script that runs as a module after the markup.
62861
62922
  * - A module file name ending in `.js` or `.mjs`, such as `utils.js`, is a
62862
62923
  * module the other scripts import by its path, `./utils.js`.
62924
+ * - A module file name ending in `.ts`, `.tsx` or `.jsx`, such as `app.tsx`,
62925
+ * is one too, which the preview compiles to JavaScript first. The `js` pane
62926
+ * runs it with `import './app.tsx'`. A file that does not compile shows
62927
+ * why over the preview, as an error the example threw.
62863
62928
  * - `package.json` sets the npm packages the scripts import by name, from its
62864
62929
  * `dependencies`, which load from the preview's `cdn`.
62865
62930
  *
@@ -68241,6 +68306,8 @@ export type CustomElements = {
68241
68306
  * number, and both are carried as one comma-separated value, which is what a
68242
68307
  * form submits. `TimePicker` carries the longer note on the interaction and
68243
68308
  * on why a wheel cannot do either.
68309
+ * - `now-label`/`nowLabel`: The words on the list's button that chooses the current time, drawn with
68310
+ * `show-now`.
68244
68311
  * - `placeholder`: Placeholder text shown before a time is entered.
68245
68312
  * - `range-length-message`/`rangeLengthMessage`: The message shown when a range holds more than two times.
68246
68313
  *
@@ -68258,6 +68325,9 @@ export type CustomElements = {
68258
68325
  * - `seconds`: Whether times carry their seconds: the value is `HH:mm:ss`, a typed time
68259
68326
  * may give them, the field writes them, and the list's `step` counts seconds.
68260
68327
  * See Time Picker's `seconds`.
68328
+ * - `show-now`/`showNow`: Draws a button under the times in the list that chooses the current time,
68329
+ * moved to the nearest time on offer. See Time Picker's `show-now`. Its words
68330
+ * are `now-label`.
68261
68331
  * - `step`: How far apart the offered times are, in minutes, or in seconds with
68262
68332
  * `seconds`.
68263
68333
  * - `time-style`/`timeStyle`: Whether the field shows the time in the local style or as the value
@@ -77307,7 +77377,11 @@ export type CustomElementsSolidJs = {
77307
77377
  * with the gutter's numbers and the block keeps one tab stop. The code stays
77308
77378
  * in the slot, so the copy button copies it as written and a reader without
77309
77379
  * the script still has it. Not called on a server, which has no code to
77310
- * read, nor for a diff. (property only)
77380
+ * read, nor for a diff.
77381
+ *
77382
+ * Absent, the block draws with the highlighter `registerHighlighter` gave
77383
+ * every block, where an entry such as `@fusion.dev/helix-sandbox/code-block`
77384
+ * registered one, and plain otherwise. (property only)
77311
77385
  * - `whenSettled`: Resolves a frame after the first update, when transitions are switched on.
77312
77386
  *
77313
77387
  * **Named `whenSettled` because `settled` is taken four times over**, by
@@ -88328,7 +88402,11 @@ export type CustomElementsSolidJs = {
88328
88402
  * Cleared as the menu closes and as a submenu opens or closes, so each page
88329
88403
  * starts with every row showing.
88330
88404
  * - `filterable`: Whether the menu shows a field above its rows that narrows them as the
88331
- * reader types, with focus staying in the field.
88405
+ * reader types, with focus staying in the field, once
88406
+ * `@fusion.dev/helix/menu/filter` (or `@fusion.dev/helix-headless/menu/filter`)
88407
+ * is imported. Without that import it does nothing, so a menu that never
88408
+ * filters carries none of the filter's code, and a development build says
88409
+ * which import is missing.
88332
88410
  * - `filter-label`/`filterLabel`: The filter field's name and placeholder.
88333
88411
  * - `label`: Accessible name for the surface.
88334
88412
  *
@@ -92720,6 +92798,15 @@ export type CustomElementsSolidJs = {
92720
92798
  * in the `js` pane or in another module loads it. A sandbox writes each pane
92721
92799
  * named for a module file here.
92722
92800
  *
92801
+ * **A module in TypeScript or JSX runs too**: a path ending in `.ts`, `.tsx`
92802
+ * or `.jsx` is compiled to JavaScript first, and imported by its path or by
92803
+ * its path without the extension. The compiler, Sucrase, loads from `cdn` the
92804
+ * first time a module needs it, so the package carries none and a preview
92805
+ * with no such module loads none. JSX compiles to the automatic runtime,
92806
+ * `react/jsx-runtime`, from `dependencies`, or to the one a
92807
+ * `@jsxImportSource` comment names. What fails to compile shows in the
92808
+ * `error` part as an error the example threw, when the example imports it.
92809
+ *
92723
92810
  * **Examples render in a frame**, so an example's styles and scripts do not
92724
92811
  * affect the page around the sandbox, and `position: fixed` stays inside the
92725
92812
  * pane. The frame starts empty, with its own stylesheets and its own custom
@@ -92906,6 +92993,10 @@ export type CustomElementsSolidJs = {
92906
92993
  * - `js` sets a script that runs as a module after the markup.
92907
92994
  * - A module file name ending in `.js` or `.mjs`, such as `utils.js`, is a
92908
92995
  * module the other scripts import by its path, `./utils.js`.
92996
+ * - A module file name ending in `.ts`, `.tsx` or `.jsx`, such as `app.tsx`,
92997
+ * is one too, which the preview compiles to JavaScript first. The `js` pane
92998
+ * runs it with `import './app.tsx'`. A file that does not compile shows
92999
+ * why over the preview, as an error the example threw.
92909
93000
  * - `package.json` sets the npm packages the scripts import by name, from its
92910
93001
  * `dependencies`, which load from the preview's `cdn`.
92911
93002
  *
@@ -98387,6 +98478,8 @@ export type CustomElementsSolidJs = {
98387
98478
  * number, and both are carried as one comma-separated value, which is what a
98388
98479
  * form submits. `TimePicker` carries the longer note on the interaction and
98389
98480
  * on why a wheel cannot do either.
98481
+ * - `now-label`/`nowLabel`: The words on the list's button that chooses the current time, drawn with
98482
+ * `show-now`.
98390
98483
  * - `placeholder`: Placeholder text shown before a time is entered.
98391
98484
  * - `range-length-message`/`rangeLengthMessage`: The message shown when a range holds more than two times.
98392
98485
  *
@@ -98404,6 +98497,9 @@ export type CustomElementsSolidJs = {
98404
98497
  * - `seconds`: Whether times carry their seconds: the value is `HH:mm:ss`, a typed time
98405
98498
  * may give them, the field writes them, and the list's `step` counts seconds.
98406
98499
  * See Time Picker's `seconds`.
98500
+ * - `show-now`/`showNow`: Draws a button under the times in the list that chooses the current time,
98501
+ * moved to the nearest time on offer. See Time Picker's `show-now`. Its words
98502
+ * are `now-label`.
98407
98503
  * - `step`: How far apart the offered times are, in minutes, or in seconds with
98408
98504
  * `seconds`.
98409
98505
  * - `time-style`/`timeStyle`: Whether the field shows the time in the local style or as the value
package/types/vue.d.ts CHANGED
@@ -4261,7 +4261,11 @@ whole of it, which Shiki writes, are taken off, so the lines sit level
4261
4261
  with the gutter's numbers and the block keeps one tab stop. The code stays
4262
4262
  in the slot, so the copy button copies it as written and a reader without
4263
4263
  the script still has it. Not called on a server, which has no code to
4264
- read, nor for a diff. */
4264
+ read, nor for a diff.
4265
+
4266
+ Absent, the block draws with the highlighter `registerHighlighter` gave
4267
+ every block, where an entry such as `@fusion.dev/helix-sandbox/code-block`
4268
+ registered one, and plain otherwise. */
4265
4269
  highlight?: (HelixCodeBlock["highlight"]) | undefined;
4266
4270
  };
4267
4271
 
@@ -12495,7 +12499,11 @@ Cleared as the menu closes and as a submenu opens or closes, so each page
12495
12499
  starts with every row showing. */
12496
12500
  filter?: (HelixMenu["filter"]) | undefined;
12497
12501
  /** Whether the menu shows a field above its rows that narrows them as the
12498
- reader types, with focus staying in the field. */
12502
+ reader types, with focus staying in the field, once
12503
+ `@fusion.dev/helix/menu/filter` (or `@fusion.dev/helix-headless/menu/filter`)
12504
+ is imported. Without that import it does nothing, so a menu that never
12505
+ filters carries none of the filter's code, and a development build says
12506
+ which import is missing. */
12499
12507
  filterable?: (HelixMenu["filterable"]) | undefined;
12500
12508
  /** The filter field's name and placeholder. */
12501
12509
  "filter-label"?: (HelixMenu["filterLabel"]) | undefined;
@@ -19001,6 +19009,12 @@ number, and both are carried as one comma-separated value, which is what a
19001
19009
  form submits. `TimePicker` carries the longer note on the interaction and
19002
19010
  on why a wheel cannot do either. */
19003
19011
  mode?: (HelixTimeInput["mode"]) | undefined;
19012
+ /** The words on the list's button that chooses the current time, drawn with
19013
+ `show-now`. */
19014
+ "now-label"?: (HelixTimeInput["nowLabel"]) | undefined;
19015
+ /** The words on the list's button that chooses the current time, drawn with
19016
+ `show-now`. */
19017
+ nowLabel?: (HelixTimeInput["nowLabel"]) | undefined;
19004
19018
  /** Placeholder text shown before a time is entered. */
19005
19019
  placeholder?: (HelixTimeInput["placeholder"]) | undefined;
19006
19020
  /** The message shown when a range holds more than two times.
@@ -19041,6 +19055,14 @@ removes rather than as "Remove" said once per time. */
19041
19055
  may give them, the field writes them, and the list's `step` counts seconds.
19042
19056
  See Time Picker's `seconds`. */
19043
19057
  seconds?: (HelixTimeInput["seconds"]) | undefined;
19058
+ /** Draws a button under the times in the list that chooses the current time,
19059
+ moved to the nearest time on offer. See Time Picker's `show-now`. Its words
19060
+ are `now-label`. */
19061
+ "show-now"?: (HelixTimeInput["showNow"]) | undefined;
19062
+ /** Draws a button under the times in the list that chooses the current time,
19063
+ moved to the nearest time on offer. See Time Picker's `show-now`. Its words
19064
+ are `now-label`. */
19065
+ showNow?: (HelixTimeInput["showNow"]) | undefined;
19044
19066
  /** How far apart the offered times are, in minutes, or in seconds with
19045
19067
  `seconds`. */
19046
19068
  step?: (HelixTimeInput["step"]) | undefined;
@@ -24877,13 +24899,13 @@ export interface WcToolkitVueGlobalComponents {
24877
24899
  HelixRatingVueProps,
24878
24900
  HelixRatingVueEvents
24879
24901
  >;
24880
- /** 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. **'dependencies' names packages by version instead**, as a 'package.json' does: '{"canvas-confetti": "^1.9"}' loads 'canvas-confetti' and the paths under it from 'cdn', 'https://esm.sh/' by default, at the version or range given. An address in 'imports' wins over a package of the same name. **'modules' holds files the example imports by a relative path**: each path, such as 'utils.js', to its source, and 'import { add } from './utils.js'' in the 'js' pane or in another module loads it. A sandbox writes each pane named for a module file here. **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, and it is the frame's description while it shows, so a screen reader reads it with the frame. 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. */
24902
+ /** 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. **'dependencies' names packages by version instead**, as a 'package.json' does: '{"canvas-confetti": "^1.9"}' loads 'canvas-confetti' and the paths under it from 'cdn', 'https://esm.sh/' by default, at the version or range given. An address in 'imports' wins over a package of the same name. **'modules' holds files the example imports by a relative path**: each path, such as 'utils.js', to its source, and 'import { add } from './utils.js'' in the 'js' pane or in another module loads it. A sandbox writes each pane named for a module file here. **A module in TypeScript or JSX runs too**: a path ending in '.ts', '.tsx' or '.jsx' is compiled to JavaScript first, and imported by its path or by its path without the extension. The compiler, Sucrase, loads from 'cdn' the first time a module needs it, so the package carries none and a preview with no such module loads none. JSX compiles to the automatic runtime, 'react/jsx-runtime', from 'dependencies', or to the one a '@jsxImportSource' comment names. What fails to compile shows in the 'error' part as an error the example threw, when the example imports it. **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, and it is the frame's description while it shows, so a screen reader reads it with the frame. 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. */
24881
24903
  "helix-sandbox-preview": DefineCustomElement<
24882
24904
  HelixSandboxPreview,
24883
24905
  HelixSandboxPreviewVueProps,
24884
24906
  HelixSandboxPreviewVueEvents
24885
24907
  >;
24886
- /** A source pane dispatches 'helix-before-edit', which bubbles, and the sandbox passes the value to the preview slotted into it. The source pane and the preview do not reference each other, so you can replace either one or use it alone. The preview runs an edit once typing has rested for 'preview-delay', 300 milliseconds by default, so a word typed reloads it once. A pane's text when the sandbox starts reaches it at once. The event carries the pane's 'name', so one sandbox can hold several panes. The names the sandbox writes into its previews: - 'html' sets the preview's markup. - 'css' sets its stylesheet. - 'js' sets a script that runs as a module after the markup. - A module file name ending in '.js' or '.mjs', such as 'utils.js', is a module the other scripts import by its path, './utils.js'. - 'package.json' sets the npm packages the scripts import by name, from its 'dependencies', which load from the preview's 'cdn'. The sandbox ignores a pane with any other name, so that pane can show content without changing the preview. **The sandbox is ':state(modified)' while a source pane holds an edit**, and that pane's file tab is also 'file-modified' and described as modified to a screen reader. 'reset()' puts every pane back to the source it was given. **The dividers are two nested 'helix-splitter' elements**, which handle the pointer, the keyboard, and the corner. The inner splitter holds the panes and the outer one holds the panel, so the panel spans the full width. **Several source panes are files**, one shown at a time under a row of tabs, each named by the pane's 'label' or, without one, its 'name'. 'file' holds the 'name' of the pane shown. The tabs are a tab list: the arrow keys move between them and show each pane, and 'Home' and 'End' go to the first and the last. Choosing one sends 'helix-before-change' with the pane's 'name', which you can cancel, and 'change' once 'file' holds it. The panes not shown carry 'hidden'. One pane draws no tabs. **Any editor can be the source pane**: an element in the 'source' slot with a 'name' that dispatches 'helix-before-edit' with its text, which bubbles. A wrapper around CodeMirror or Monaco sends one on each change and is a pane like 'helix-sandbox-source', and the sandbox reads its 'value' to seed the preview. Dispatch 'helix-caret' from it too for the status bar's position. Sandbox is styled only and has behavior, as 'Aura' is. Its behavior is the hand-off from a source pane to a preview frame, which works with any pane that sends 'helix-before-edit', and what it draws is the layout around them: dividers, file tabs, and a panel. A page that wants another look slots its own panes and keeps the hand-off, so there is nothing for a headless version to hold. A development build warns about a source pane with no 'label' and no 'name', whose file tab would have no words. On a focused divider, the arrow keys move it, and 'Home' and 'End' move it to its ends. 'Enter' on the panes divider shuts the lead pane, and pressed again it opens the pane where it was. 'Enter' on the panel divider shuts the panel to 'panel-collapsed-size', and pressed again it opens the panel to its last height. */
24908
+ /** A source pane dispatches 'helix-before-edit', which bubbles, and the sandbox passes the value to the preview slotted into it. The source pane and the preview do not reference each other, so you can replace either one or use it alone. The preview runs an edit once typing has rested for 'preview-delay', 300 milliseconds by default, so a word typed reloads it once. A pane's text when the sandbox starts reaches it at once. The event carries the pane's 'name', so one sandbox can hold several panes. The names the sandbox writes into its previews: - 'html' sets the preview's markup. - 'css' sets its stylesheet. - 'js' sets a script that runs as a module after the markup. - A module file name ending in '.js' or '.mjs', such as 'utils.js', is a module the other scripts import by its path, './utils.js'. - A module file name ending in '.ts', '.tsx' or '.jsx', such as 'app.tsx', is one too, which the preview compiles to JavaScript first. The 'js' pane runs it with 'import './app.tsx''. A file that does not compile shows why over the preview, as an error the example threw. - 'package.json' sets the npm packages the scripts import by name, from its 'dependencies', which load from the preview's 'cdn'. The sandbox ignores a pane with any other name, so that pane can show content without changing the preview. **The sandbox is ':state(modified)' while a source pane holds an edit**, and that pane's file tab is also 'file-modified' and described as modified to a screen reader. 'reset()' puts every pane back to the source it was given. **The dividers are two nested 'helix-splitter' elements**, which handle the pointer, the keyboard, and the corner. The inner splitter holds the panes and the outer one holds the panel, so the panel spans the full width. **Several source panes are files**, one shown at a time under a row of tabs, each named by the pane's 'label' or, without one, its 'name'. 'file' holds the 'name' of the pane shown. The tabs are a tab list: the arrow keys move between them and show each pane, and 'Home' and 'End' go to the first and the last. Choosing one sends 'helix-before-change' with the pane's 'name', which you can cancel, and 'change' once 'file' holds it. The panes not shown carry 'hidden'. One pane draws no tabs. **Any editor can be the source pane**: an element in the 'source' slot with a 'name' that dispatches 'helix-before-edit' with its text, which bubbles. A wrapper around CodeMirror or Monaco sends one on each change and is a pane like 'helix-sandbox-source', and the sandbox reads its 'value' to seed the preview. Dispatch 'helix-caret' from it too for the status bar's position. Sandbox is styled only and has behavior, as 'Aura' is. Its behavior is the hand-off from a source pane to a preview frame, which works with any pane that sends 'helix-before-edit', and what it draws is the layout around them: dividers, file tabs, and a panel. A page that wants another look slots its own panes and keeps the hand-off, so there is nothing for a headless version to hold. A development build warns about a source pane with no 'label' and no 'name', whose file tab would have no words. On a focused divider, the arrow keys move it, and 'Home' and 'End' move it to its ends. 'Enter' on the panes divider shuts the lead pane, and pressed again it opens the pane where it was. 'Enter' on the panel divider shuts the panel to 'panel-collapsed-size', and pressed again it opens the panel to its last height. */
24887
24909
  "helix-sandbox": DefineCustomElement<
24888
24910
  HelixSandbox,
24889
24911
  HelixSandboxVueProps,
package/types/words.d.ts CHANGED
@@ -502,6 +502,13 @@ declare module '@fusion.dev/helix-core' {
502
502
  * English: `Notes`
503
503
  */
504
504
  notesLabel: Message
505
+ /**
506
+ * The words on the list's button that chooses the current time, drawn with
507
+ * `show-now`.
508
+ *
509
+ * English: `Now`
510
+ */
511
+ nowLabel: Message
505
512
  /**
506
513
  * The `overview`'s sentence. `{busiestLabel}` and `{totalLabel}` are
507
514
  * `busiest-label` and `total-label`, `{busiest}` the busiest reading's name