@weftui/core 0.28.0 → 0.30.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.
Files changed (32) hide show
  1. package/README.md +8 -8
  2. package/dist/{index-Bsh2WLtx.d.ts → index-CX9uEejU.d.ts} +70 -51
  3. package/dist/index.d.ts +68 -119
  4. package/dist/index.js +1 -1
  5. package/dist/types/index.d.ts +1 -1
  6. package/docs/explanation/boundaries-and-suspense.md +39 -20
  7. package/docs/explanation/combinator-api.md +14 -12
  8. package/docs/explanation/reactive-primitives.md +14 -14
  9. package/docs/explanation/rendering-model.md +20 -18
  10. package/docs/explanation/services-and-context.md +35 -21
  11. package/docs/how-to/add-routing.md +361 -60
  12. package/docs/how-to/author-components.md +42 -30
  13. package/docs/how-to/compose-behavior-and-markup.md +144 -0
  14. package/docs/how-to/handle-forms.md +6 -6
  15. package/docs/how-to/load-async-data.md +15 -13
  16. package/docs/how-to/load-data-with-rpc.md +34 -32
  17. package/docs/how-to/provide-services.md +20 -18
  18. package/docs/how-to/render-keyed-lists.md +14 -12
  19. package/docs/how-to/render-on-the-server.md +18 -14
  20. package/docs/how-to/show-navigation-progress.md +12 -10
  21. package/docs/how-to/split-routes-lazily.md +16 -14
  22. package/docs/how-to/style-reactively.md +13 -13
  23. package/docs/how-to/use-element-refs.md +10 -8
  24. package/docs/index.md +20 -18
  25. package/docs/reference/core.md +46 -42
  26. package/docs/reference/dom.md +274 -58
  27. package/docs/reference/router.md +69 -47
  28. package/docs/tutorial/01-your-first-app.md +7 -9
  29. package/docs/tutorial/02-reactivity.md +8 -6
  30. package/docs/tutorial/03-services-and-async.md +10 -6
  31. package/docs/tutorial/04-errors-and-server.md +14 -5
  32. package/package.json +2 -2
package/README.md CHANGED
@@ -1,10 +1,10 @@
1
1
  # @weftui/core
2
2
 
3
- > Element builders and combinators for [Weft](https://weftui.dev) reactive UI, woven from [Effect](https://effect.website).
3
+ > Element builders and combinators for [Weft](https://weftui.dev): reactive UI, woven from [Effect](https://effect.website).
4
4
 
5
5
  The authoring layer of Weft. Build your component tree with `h`, compose it with `Boundary` and `List`, and let streams drive every update. Every node **is** an Effect: components return `Node<E, R>` (an alias for `Effect.Effect<ElementDescriptor, E, R>`), so error and requirement channels accumulate through the tree and every Effect combinator applies to nodes directly.
6
6
 
7
- This package is renderer-agnostic pair it with [`@weftui/dom`](https://weftui.dev/docs/reference/dom) to render to the browser and the server.
7
+ This package is renderer-agnostic. Pair it with [`@weftui/dom`](https://weftui.dev/docs/reference/dom) to render to the browser and the server.
8
8
 
9
9
  ## Installation
10
10
 
@@ -20,12 +20,12 @@ Weft tracks Effect 4's beta line. This release is built and tested against `effe
20
20
 
21
21
  | Export | What it is |
22
22
  | ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
23
- | `h` | Proxy namespace of element builders `h.div`, `h.span`, `h.button`, … plus `h.fragment` for wrapper-less groups. |
24
- | `Component` | `Component.gen` / `Component.make` reusable components whose reactive prop channels propagate to the call site. |
23
+ | `h` | Proxy namespace of element builders: `h.div`, `h.span`, `h.button`, … plus `h.fragment` for wrapper-less groups. |
24
+ | `Component` | `Component.gen` / `Component.make`: reusable components whose reactive prop channels propagate to the call site. |
25
25
  | `Boundary` | Error boundaries (`catch`, `catchTag`, `catchTags`, `catchFilter`, `catchIf`, `catchCause`), plus `Boundary.suspend` (async fallbacks) and `Boundary.rpc` (server-data seam). |
26
- | `List` | `List.each` the keyed list combinator; renders once per key and reconciles across emissions. |
26
+ | `List` | `List.each`: the keyed list combinator; renders once per key and reconciles across emissions. |
27
27
  | `Source` | The reactive prop vocabulary (`A \| Effect \| Stream \| Subscribable`) + `Source.toSubscribable`. |
28
- | `Node<E,R>` | The core tree type an alias for `Effect.Effect<ElementDescriptor, E, R>`. |
28
+ | `Node<E,R>` | The core tree type: an alias for `Effect.Effect<ElementDescriptor, E, R>`. |
29
29
 
30
30
  ## Example
31
31
 
@@ -54,9 +54,9 @@ void Effect.runPromise(WeftApp.mount(app, Counter(), document.getElementById("ro
54
54
  - Full docs: **https://weftui.dev**
55
55
  - `@weftui/core` API reference: **https://weftui.dev/docs/reference/core**
56
56
  - The rendering model (why no virtual DOM): **https://weftui.dev/docs/explanation/rendering-model**
57
- - Bundled with this package: see the [`./docs`](./docs) directory in `node_modules/@weftui/core/docs` the complete tutorial, how-to, explanation, and reference tree ships on disk for offline and agent use.
57
+ - Bundled with this package: see the [`./docs`](./docs) directory in `node_modules/@weftui/core/docs`. The complete tutorial, how-to, explanation, and reference tree ships on disk for offline and agent use.
58
58
 
59
- **New to Effect?** Read the [Effect docs](https://effect.website/docs/getting-started/introduction) first Weft assumes the fundamentals.
59
+ **New to Effect?** Read the [Effect docs](https://effect.website/docs/getting-started/introduction) first, since Weft assumes the fundamentals.
60
60
 
61
61
  ## License
62
62
 
@@ -1,10 +1,9 @@
1
- import { Cause, Effect, Option, Scope, Stream, SubscriptionRef } from "effect";
1
+ import { Cause, Effect, Option, Scope, Stream, SubscriptionRef, Types as Types$1 } from "effect";
2
2
  declare namespace index_d_exports {
3
- export { Subscribable, TypeId, changes, get, isSubscribable, make };
3
+ export { Subscribable, TypeId, Variance, changes, get, isSubscribable, make };
4
4
  }
5
5
  /**
6
- * Unique brand identifying a {@link Subscribable}, and the key under which its
7
- * `get`/`changes` channels are held. Effect 4 dropped its own
6
+ * Unique brand identifying a {@link Subscribable}. Effect 4 dropped its own
8
7
  * `Subscribable`/`Readable` modules, so Weft carries this reactivity interface
9
8
  * locally; the string brand mirrors Effect 4's `"~effect/*"` TypeId convention
10
9
  * (e.g. `SubscriptionRef`) and backs the {@link isSubscribable} guard.
@@ -15,22 +14,27 @@ declare const TypeId = "~@weftui/core/Subscribable";
15
14
  */
16
15
  type TypeId = typeof TypeId;
17
16
  /**
18
- * A hot, await-first reactive value: `get` reads the current value as an
19
- * `Effect`, `changes` is a `Stream` of every value (including the current one).
20
- * Read them either directly or through the {@link get} / {@link changes} module
21
- * accessors, which mirror Effect 4's `SubscriptionRef.get` / `.changes` so a
17
+ * Phantom variance carrier for {@link Subscribable}; all three channels are
18
+ * covariant, matching the `Effect`/`Stream` channels the value wraps.
19
+ */
20
+ interface Variance<out A, out E, out R> {
21
+ readonly _A: Types$1.Covariant<A>;
22
+ readonly _E: Types$1.Covariant<E>;
23
+ readonly _R: Types$1.Covariant<R>;
24
+ }
25
+ /**
26
+ * A hot, await-first reactive value: a current value plus a stream of every
27
+ * value (including the current one). The interface is brand-only; read it
28
+ * through the {@link get} / {@link changes} module accessors, which mirror
29
+ * Effect 4's `SubscriptionRef.get` / `SubscriptionRef.changes` so a
22
30
  * `Subscribable` and a `SubscriptionRef` read the same way at a call site.
23
31
  *
24
- * This is Weft's local replacement for Effect 3's `Subscribable`, preserved as
25
- * public API so `Source`, `Boundary`, and the DOM renderers keep the same
26
- * reactivity surface across the Effect 4 migration.
32
+ * This is Weft's local replacement for the `Subscribable` module Effect 4
33
+ * removed, preserved as public API so `Source`, `Boundary`, and the DOM
34
+ * renderers share one reactivity surface.
27
35
  */
28
- interface Subscribable<A, E = never, R = never> {
29
- readonly [TypeId]: TypeId;
30
- /** Read the current value; also reachable via the {@link get} accessor. */
31
- readonly get: Effect.Effect<A, E, R>;
32
- /** Stream of every value; also reachable via the {@link changes} accessor. */
33
- readonly changes: Stream.Stream<A, E, R>;
36
+ interface Subscribable<out A, out E = never, out R = never> {
37
+ readonly [TypeId]: Variance<A, E, R>;
34
38
  }
35
39
  /**
36
40
  * Build a {@link Subscribable} from a `get` effect and a `changes` stream. The
@@ -43,13 +47,14 @@ declare const make: <A, E = never, R = never>(options: {
43
47
  }) => Subscribable<A, E, R>;
44
48
  /**
45
49
  * Read the current value of a {@link Subscribable} as an `Effect`. Mirrors
46
- * `SubscriptionRef.get`, so call sites read `Subscribable`s and
47
- * `SubscriptionRef`s the same way.
50
+ * `SubscriptionRef.get`; the only way to read the value, the interface exposes
51
+ * no members.
48
52
  */
49
53
  declare const get: <A, E, R>(self: Subscribable<A, E, R>) => Effect.Effect<A, E, R>;
50
54
  /**
51
55
  * The `Stream` of every value of a {@link Subscribable}, starting with the
52
- * current one. Mirrors `SubscriptionRef.changes`.
56
+ * current one. Mirrors `SubscriptionRef.changes`; the only way to observe
57
+ * changes, the interface exposes no members.
53
58
  */
54
59
  declare const changes: <A, E, R>(self: Subscribable<A, E, R>) => Stream.Stream<A, E, R>;
55
60
  /**
@@ -10513,7 +10518,7 @@ declare namespace Source {
10513
10518
  * contributes its value channel; a static value is itself.
10514
10519
  *
10515
10520
  * Checked in the same order as `OpenPropSource` (`combinator/types.ts`) so an
10516
- * `Effect` which is itself iterable for generators never reaches the static
10521
+ * `Effect`, which is itself iterable for generators, never reaches the static
10517
10522
  * fallback. The props-object analog is `PropsE`/`PropsR` in `combinator/types.ts`.
10518
10523
  */
10519
10524
  type Success<S> = S extends Stream.Stream<infer A, any, any> ? A : S extends Effect.Effect<infer A, any, any> ? A : S extends Subscribable<infer A, any, any> ? A : S;
@@ -10842,7 +10847,15 @@ type HTMLReferrerPolicy = "no-referrer" | "no-referrer-when-downgrade" | "origin
10842
10847
  type HTMLRole = "alert" | "alertdialog" | "application" | "article" | "banner" | "blockquote" | "button" | "caption" | "cell" | "checkbox" | "code" | "columnheader" | "combobox" | "command" | "complementary" | "composite" | "contentinfo" | "definition" | "deletion" | "dialog" | "directory" | "document" | "emphasis" | "feed" | "figure" | "form" | "generic" | "grid" | "gridcell" | "group" | "heading" | "img" | "input" | "insertion" | "landmark" | "link" | "list" | "listbox" | "listitem" | "log" | "main" | "marquee" | "math" | "menu" | "menubar" | "menuitem" | "menuitemcheckbox" | "menuitemradio" | "meter" | "navigation" | "none" | "note" | "option" | "paragraph" | "presentation" | "progressbar" | "radio" | "radiogroup" | "range" | "region" | "roletype" | "row" | "rowgroup" | "rowheader" | "scrollbar" | "search" | "searchbox" | "section" | "sectionhead" | "select" | "separator" | "slider" | "spinbutton" | "status" | "strong" | "structure" | "subscript" | "superscript" | "switch" | "tab" | "table" | "tablist" | "tabpanel" | "term" | "textbox" | "time" | "timer" | "toolbar" | "tooltip" | "tree" | "treegrid" | "treeitem" | "widget" | "window";
10843
10848
  interface HTMLAttributes<T> extends AriaAttributes, DOMAttributes<T> {
10844
10849
  children?: HTMLAttributeSource<Renderable>;
10845
- ref?: SubscriptionRef.SubscriptionRef<Option.Option<T>>;
10850
+ /**
10851
+ * A ref to this element, or an array of refs that all receive it (fan-out,
10852
+ * typically from `Props.merge`). The array arm accepts refs of any element
10853
+ * type because `SubscriptionRef` is invariant: composing a behavior
10854
+ * primitive's `SubscriptionRef<Option<HTMLElement>>` with a caller's
10855
+ * `SubscriptionRef<Option<HTMLInputElement>>` is the point of fan-out, and an
10856
+ * exactly-typed array would reject it. The single-ref arm stays precise.
10857
+ */
10858
+ ref?: SubscriptionRef.SubscriptionRef<Option.Option<T>> | ReadonlyArray<SubscriptionRef.SubscriptionRef<Option.Option<any>>>;
10846
10859
  /**
10847
10860
  * Provides a hint for generating a keyboard shortcut for the current element. This attribute consists of a space-separated list of characters. The browser should use the first one that exists on the computer keyboard layout.
10848
10861
  */
@@ -10976,7 +10989,7 @@ interface AHTMLAttributes<T> extends HTMLAttributes<T> {
10976
10989
  */
10977
10990
  download?: HTMLAttributeSource<string>;
10978
10991
  /**
10979
- * The URL that the hyperlink points to. Links are not restricted to HTTP-based URLs they can use any URL scheme supported by browsers: Sections of a page with fragment URLs Pieces of media files with media fragments Telephone numbers with tel: URLs Email addresses with mailto: URLs While web browsers may not support other URL schemes, web sites can with registerProtocolHandler()
10992
+ * The URL that the hyperlink points to. Links are not restricted to HTTP-based URLs, and they can use any URL scheme supported by browsers: Sections of a page with fragment URLs Pieces of media files with media fragments Telephone numbers with tel: URLs Email addresses with mailto: URLs While web browsers may not support other URL schemes, web sites can with registerProtocolHandler()
10980
10993
  */
10981
10994
  href?: HTMLAttributeSource<string>;
10982
10995
  /**
@@ -11355,7 +11368,7 @@ interface ButtonHTMLAttributes<T> extends HTMLAttributes<T> {
11355
11368
  */
11356
11369
  formnovalidate?: HTMLAttributeSource<boolean>;
11357
11370
  /**
11358
- * If the button is a submit button, this attribute is a author-defined name or standardized, underscore-prefixed keyword indicating where to display the response from submitting the form. This is the name of, or keyword for, a browsing context (a tab, window, or `<iframe>`). If this attribute is specified, it overrides the target attribute of the button's form owner. The following keywords have special meanings: _self: Load the response into the same browsing context as the current one. This is the default if the attribute is not specified. _blank: Load the response into a new unnamed browsing context usually a new tab or window, depending on the user's browser settings. _parent: Load the response into the parent browsing context of the current one. If there is no parent, this option behaves the same way as _self. _top: Load the response into the top-level browsing context (that is, the browsing context that is an ancestor of the current one, and has no parent). If there is no parent, this option behaves the same way as _self.
11371
+ * If the button is a submit button, this attribute is a author-defined name or standardized, underscore-prefixed keyword indicating where to display the response from submitting the form. This is the name of, or keyword for, a browsing context (a tab, window, or `<iframe>`). If this attribute is specified, it overrides the target attribute of the button's form owner. The following keywords have special meanings: _self: Load the response into the same browsing context as the current one. This is the default if the attribute is not specified. _blank: Load the response into a new unnamed browsing context, usually a new tab or window, depending on the user's browser settings. _parent: Load the response into the parent browsing context of the current one. If there is no parent, this option behaves the same way as _self. _top: Load the response into the top-level browsing context (that is, the browsing context that is an ancestor of the current one, and has no parent). If there is no parent, this option behaves the same way as _self.
11359
11372
  */
11360
11373
  formtarget?: HTMLAttributeSource<string>;
11361
11374
  /**
@@ -11477,7 +11490,7 @@ interface DelHTMLAttributes<T> extends HTMLAttributes<T> {
11477
11490
  }
11478
11491
  interface DetailsHTMLAttributes<T> extends HTMLAttributes<T> {
11479
11492
  /**
11480
- * This Boolean attribute indicates whether or not the details that is, the contents of the `<details>` element are currently visible. The details are shown when this attribute exists, or hidden when this attribute is absent. By default this attribute is absent which means the details are not visible. Note: You have to remove this attribute entirely to make the details hidden. open="false" makes the details visible because this attribute is Boolean.
11493
+ * This Boolean attribute indicates whether or not the details (that is, the contents of the `<details>` element) are currently visible. The details are shown when this attribute exists, or hidden when this attribute is absent. By default this attribute is absent which means the details are not visible. Note: You have to remove this attribute entirely to make the details hidden. open="false" makes the details visible because this attribute is Boolean.
11481
11494
  */
11482
11495
  open?: HTMLAttributeSource<boolean>;
11483
11496
  }
@@ -11517,7 +11530,7 @@ interface FieldsetHTMLAttributes<T> extends HTMLAttributes<T> {
11517
11530
  */
11518
11531
  disabled?: HTMLAttributeSource<boolean>;
11519
11532
  /**
11520
- * This attribute takes the value of the id attribute of a `<form>` element you want the `<fieldset>` to be part of, even if it is not inside the form. Please note that usage of this is confusing if you want the `<input>` elements inside the `<fieldset>` to be associated with the form, you need to use the form attribute directly on those elements. You can check which elements are associated with a form via JavaScript, using HTMLFormElement.elements.
11533
+ * This attribute takes the value of the id attribute of a `<form>` element you want the `<fieldset>` to be part of, even if it is not inside the form. Please note that usage of this is confusing: if you want the `<input>` elements inside the `<fieldset>` to be associated with the form, you need to use the form attribute directly on those elements. You can check which elements are associated with a form via JavaScript, using HTMLFormElement.elements.
11521
11534
  */
11522
11535
  form?: HTMLAttributeSource<string>;
11523
11536
  /**
@@ -11721,7 +11734,7 @@ interface IframeHTMLAttributes<T> extends HTMLAttributes<T> {
11721
11734
  */
11722
11735
  referrerpolicy?: HTMLAttributeSource<HTMLReferrerPolicy>;
11723
11736
  /**
11724
- * Applies extra restrictions to the content in the frame. The value of the attribute can either be empty to apply all restrictions, or space-separated tokens to lift particular restrictions: allow-downloads-without-user-activation : Allows for downloads to occur without a gesture from the user. allow-downloads: Allows for downloads to occur with a gesture from the user. allow-forms: Allows the resource to submit forms. If this keyword is not used, form submission is blocked. allow-modals: Lets the resource open modal windows. allow-orientation-lock: Lets the resource lock the screen orientation. allow-pointer-lock: Lets the resource use the Pointer Lock API. allow-popups: Allows popups (such as window.open(), target="_blank", or showModalDialog()). If this keyword is not used, the popup will silently fail to open. allow-popups-to-escape-sandbox: Lets the sandboxed document open new windows without those windows inheriting the sandboxing. For example, this can safely sandbox an advertisement without forcing the same restrictions upon the page the ad links to. allow-presentation: Lets the resource start a presentation session. allow-same-origin: If this token is not used, the resource is treated as being from a special origin that always fails the same-origin policy (potentially preventing access to data storage/cookies and some JavaScript APIs). allow-scripts: Lets the resource run scripts (but not create popup windows). allow-storage-access-by-user-activation : Lets the resource request access to the parent's storage capabilities with the Storage Access API. allow-top-navigation: Lets the resource navigate the top-level browsing context (the one named _top). allow-top-navigation-by-user-activation: Lets the resource navigate the top-level browsing context, but only if initiated by a user gesture. Notes about sandboxing: When the embedded document has the same origin as the embedding page, it is strongly discouraged to use both allow-scripts and allow-same-origin, as that lets the embedded document remove the sandbox attribute making it no more secure than not using the sandbox attribute at all. Sandboxing is useless if the attacker can display content outside a sandboxed iframe such as if the viewer opens the frame in a new tab. Such content should be also served from a separate origin to limit potential damage. The sandbox attribute is unsupported in Internet Explorer 9 and earlier.
11737
+ * Applies extra restrictions to the content in the frame. The value of the attribute can either be empty to apply all restrictions, or space-separated tokens to lift particular restrictions: allow-downloads-without-user-activation : Allows for downloads to occur without a gesture from the user. allow-downloads: Allows for downloads to occur with a gesture from the user. allow-forms: Allows the resource to submit forms. If this keyword is not used, form submission is blocked. allow-modals: Lets the resource open modal windows. allow-orientation-lock: Lets the resource lock the screen orientation. allow-pointer-lock: Lets the resource use the Pointer Lock API. allow-popups: Allows popups (such as window.open(), target="_blank", or showModalDialog()). If this keyword is not used, the popup will silently fail to open. allow-popups-to-escape-sandbox: Lets the sandboxed document open new windows without those windows inheriting the sandboxing. For example, this can safely sandbox an advertisement without forcing the same restrictions upon the page the ad links to. allow-presentation: Lets the resource start a presentation session. allow-same-origin: If this token is not used, the resource is treated as being from a special origin that always fails the same-origin policy (potentially preventing access to data storage/cookies and some JavaScript APIs). allow-scripts: Lets the resource run scripts (but not create popup windows). allow-storage-access-by-user-activation : Lets the resource request access to the parent's storage capabilities with the Storage Access API. allow-top-navigation: Lets the resource navigate the top-level browsing context (the one named _top). allow-top-navigation-by-user-activation: Lets the resource navigate the top-level browsing context, but only if initiated by a user gesture. Notes about sandboxing: When the embedded document has the same origin as the embedding page, it is strongly discouraged to use both allow-scripts and allow-same-origin, as that lets the embedded document remove the sandbox attribute, making it no more secure than not using the sandbox attribute at all. Sandboxing is useless if the attacker can display content outside a sandboxed iframe, such as if the viewer opens the frame in a new tab. Such content should be also served from a separate origin to limit potential damage. The sandbox attribute is unsupported in Internet Explorer 9 and earlier.
11725
11738
  */
11726
11739
  sandbox?: HTMLAttributeSource<HTMLIframeSandbox>;
11727
11740
  /**
@@ -11837,7 +11850,7 @@ interface InputHTMLAttributes<T> extends HTMLAttributes<T> {
11837
11850
  */
11838
11851
  autocorrect?: HTMLAttributeSource<string>;
11839
11852
  /**
11840
- * Introduced in the HTML Media Capture specification and valid for the file input type only, the capture attribute defines which mediamicrophone, video, or camerashould be used to capture a new file for upload with file upload control in supporting scenarios. See the file input type.
11853
+ * Introduced in the HTML Media Capture specification and valid for the file input type only, the capture attribute defines which media (microphone, video, or camera) should be used to capture a new file for upload with file upload control in supporting scenarios. See the file input type.
11841
11854
  */
11842
11855
  capture?: HTMLAttributeSource<string>;
11843
11856
  /**
@@ -11937,7 +11950,7 @@ interface InputHTMLAttributes<T> extends HTMLAttributes<T> {
11937
11950
  */
11938
11951
  required?: HTMLAttributeSource<boolean>;
11939
11952
  /**
11940
- * The results attributesupported only by Safariis a numeric value that lets you override the maximum number of entries to be displayed in the `<input>` element's natively-provided drop-down menu of previous search queries.The value must be a non-negative decimal number. If not provided, or an invalid value is given, the browser's default maximum number of entries is used.
11953
+ * The results attribute (supported only by Safari) is a numeric value that lets you override the maximum number of entries to be displayed in the `<input>` element's natively-provided drop-down menu of previous search queries.The value must be a non-negative decimal number. If not provided, or an invalid value is given, the browser's default maximum number of entries is used.
11941
11954
  */
11942
11955
  results?: HTMLAttributeSource<string>;
11943
11956
  /**
@@ -11949,7 +11962,7 @@ interface InputHTMLAttributes<T> extends HTMLAttributes<T> {
11949
11962
  */
11950
11963
  src?: HTMLAttributeSource<string>;
11951
11964
  /**
11952
- * Valid for the numeric input types, including number, date/time input types, and range, the step attribute is a number that specifies the granularity that the value must adhere to. If not explicitly included: step defaults to 1 for number and range. For the date/time input types, step is expressed in seconds, with the default step being 60 seconds. The step scale factor is 1000 (which converts the seconds to milliseconds, as used in other algorithms). The value must be a positive numberinteger or floator the special value any, which means no stepping is implied, and any value is allowed (barring other constraints, such as min and max). If any is not explicity set, valid values for the number, date/time input types, and range input types are equal to the basis for stepping the min value and increments of the step value, up to the max value, if specified. For example, if you have `<input type="number" min="10" step="2">`, then any even integer, 10 or greater, is valid. If omitted, `<input type="number">`, any integer is valid, but floats (like 4.2) are not valid, because step defaults to 1. For 4.2 to be valid, step would have had to be set to any, 0.1, 0.2, or any the min value would have had to be a number ending in .2, such as `<input type="number" min="-5.2">` Note: When the data entered by the user doesn't adhere to the stepping configuration, the value is considered invalid in contraint validation and will match the :invalid pseudoclass. See Client-side validation for more information.
11965
+ * Valid for the numeric input types, including number, date/time input types, and range, the step attribute is a number that specifies the granularity that the value must adhere to. If not explicitly included: step defaults to 1 for number and range. For the date/time input types, step is expressed in seconds, with the default step being 60 seconds. The step scale factor is 1000 (which converts the seconds to milliseconds, as used in other algorithms). The value must be a positive number (integer or float) or the special value any, which means no stepping is implied, and any value is allowed (barring other constraints, such as min and max). If any is not explicity set, valid values for the number, date/time input types, and range input types are equal to the basis for stepping: the min value and increments of the step value, up to the max value, if specified. For example, if you have `<input type="number" min="10" step="2">`, then any even integer, 10 or greater, is valid. If omitted, `<input type="number">`, any integer is valid, but floats (like 4.2) are not valid, because step defaults to 1. For 4.2 to be valid, step would have had to be set to any, 0.1, 0.2, or any the min value would have had to be a number ending in .2, such as `<input type="number" min="-5.2">` Note: When the data entered by the user doesn't adhere to the stepping configuration, the value is considered invalid in contraint validation and will match the :invalid pseudoclass. See Client-side validation for more information.
11953
11966
  */
11954
11967
  step?: HTMLAttributeSource<number | string>;
11955
11968
  /**
@@ -12003,7 +12016,7 @@ interface KeygenHTMLAttributes<T> extends HTMLAttributes<T> {
12003
12016
  }
12004
12017
  interface LabelHTMLAttributes<T> extends HTMLAttributes<T> {
12005
12018
  /**
12006
- * The value of the for attribute must be a single id for a labelable form-related element in the same document as the `<label>` element. So, any given label element can be associated with only one form control. The first element in the document with an id attribute matching the value of the for attribute is the labeled control for this label element if the element with that id is actually a labelable element. If it is not a labelable element, then the for attribute has no effect. If there are other elements that also match the id value, later in the document, they are not considered. Multiple label elements can be given the same value for their for attribute; doing so causes the associated form control (the form control that for value references) to have multiple labels. Note: A `<label>` element can have both a for attribute and a contained control element, as long as the for attribute points to the contained control element.
12019
+ * The value of the for attribute must be a single id for a labelable form-related element in the same document as the `<label>` element. So, any given label element can be associated with only one form control. The first element in the document with an id attribute matching the value of the for attribute is the labeled control for this label element. If the element with that id is actually a labelable element. If it is not a labelable element, then the for attribute has no effect. If there are other elements that also match the id value, later in the document, they are not considered. Multiple label elements can be given the same value for their for attribute; doing so causes the associated form control (the form control that for value references) to have multiple labels. Note: A `<label>` element can have both a for attribute and a contained control element, as long as the for attribute points to the contained control element.
12007
12020
  */
12008
12021
  for?: HTMLAttributeSource<string>;
12009
12022
  /** */
@@ -12055,11 +12068,11 @@ interface LinkHTMLAttributes<T> extends HTMLAttributes<T> {
12055
12068
  */
12056
12069
  imagesrcset?: HTMLAttributeSource<string>;
12057
12070
  /**
12058
- * Contains inline metadata a base64-encoded cryptographic hash of the resource (file) you're telling the browser to fetch. The browser can use this to verify that the fetched resource has been delivered free of unexpected manipulation. See Subresource Integrity.
12071
+ * Contains inline metadata: a base64-encoded cryptographic hash of the resource (file) you're telling the browser to fetch. The browser can use this to verify that the fetched resource has been delivered free of unexpected manipulation. See Subresource Integrity.
12059
12072
  */
12060
12073
  integrity?: HTMLAttributeSource<string>;
12061
12074
  /**
12062
- * This attribute specifies the media that the linked resource applies to. Its value must be a media type / media query. This attribute is mainly useful when linking to external stylesheets it allows the user agent to pick the best adapted one for the device it runs on. Notes: In HTML 4, this can only be a simple white-space-separated list of media description literals, i.e., media types and groups, where defined and allowed as values for this attribute, such as print, screen, aural, braille. HTML5 extended this to any kind of media queries, which are a superset of the allowed values of HTML 4. Browsers not supporting CSS3 Media Queries won't necessarily recognize the adequate link; do not forget to set fallback links, the restricted set of media queries defined in HTML 4.
12075
+ * This attribute specifies the media that the linked resource applies to. Its value must be a media type / media query. This attribute is mainly useful when linking to external stylesheets: it allows the user agent to pick the best adapted one for the device it runs on. Notes: In HTML 4, this can only be a simple white-space-separated list of media description literals, i.e., media types and groups, where defined and allowed as values for this attribute, such as print, screen, aural, braille. HTML5 extended this to any kind of media queries, which are a superset of the allowed values of HTML 4. Browsers not supporting CSS3 Media Queries won't necessarily recognize the adequate link; do not forget to set fallback links, the restricted set of media queries defined in HTML 4.
12063
12076
  */
12064
12077
  media?: HTMLAttributeSource<number | string | (number | string)[]>;
12065
12078
  /**
@@ -12191,7 +12204,7 @@ interface MetaHTMLAttributes<T> extends HTMLAttributes<T> {
12191
12204
  */
12192
12205
  content?: HTMLAttributeSource<string>;
12193
12206
  /**
12194
- * Defines a pragma directive. The attribute is named http-equiv(alent) because all the allowed values are names of particular HTTP headers: content-security-policy Allows page authors to define a content policy for the current page. Content policies mostly specify allowed server origins and script endpoints which help guard against cross-site scripting attacks. content-type Declares the MIME type and character encoding of the document. If specified, the content attribute must have the value "text/html; charset=utf-8". This is equivalent to a `<meta>` element with the charset attribute specified, and carries the same restriction on placement within the document. Note: Can only be used in documents served with a text/html not in documents served with an XML MIME type. default-style Sets the name of the default CSS style sheet set. x-ua-compatible If specified, the content attribute must have the value "IE=edge". User agents are required to ignore this pragma. refresh This instruction specifies: The number of seconds until the page should be reloaded - only if the content attribute contains a positive integer. The number of seconds until the page should redirect to another - only if the content attribute contains a positive integer followed by the string ';url=', and a valid URL. Accessibility concerns Pages set with a refresh value run the risk of having the time interval being too short. People navigating with the aid of assistive technology such as a screen reader may be unable to read through and understand the page's content before being automatically redirected. The abrupt, unannounced updating of the page content may also be disorienting for people experiencing low vision conditions. MDN Understanding WCAG, Guideline 2.1 explanations MDN Understanding WCAG, Guideline 3.1 explanations Understanding Success Criterion 2.2.1 | W3C Understanding WCAG 2.0 Understanding Success Criterion 2.2.4 | W3C Understanding WCAG 2.0 Understanding Success Criterion 3.2.5 | W3C Understanding WCAG 2.0
12207
+ * Defines a pragma directive. The attribute is named http-equiv(alent) because all the allowed values are names of particular HTTP headers: content-security-policy Allows page authors to define a content policy for the current page. Content policies mostly specify allowed server origins and script endpoints which help guard against cross-site scripting attacks. content-type Declares the MIME type and character encoding of the document. If specified, the content attribute must have the value "text/html; charset=utf-8". This is equivalent to a `<meta>` element with the charset attribute specified, and carries the same restriction on placement within the document. Note: Can only be used in documents served with a text/html, not in documents served with an XML MIME type. default-style Sets the name of the default CSS style sheet set. x-ua-compatible If specified, the content attribute must have the value "IE=edge". User agents are required to ignore this pragma. refresh This instruction specifies: The number of seconds until the page should be reloaded - only if the content attribute contains a positive integer. The number of seconds until the page should redirect to another - only if the content attribute contains a positive integer followed by the string ';url=', and a valid URL. Accessibility concerns Pages set with a refresh value run the risk of having the time interval being too short. People navigating with the aid of assistive technology such as a screen reader may be unable to read through and understand the page's content before being automatically redirected. The abrupt, unannounced updating of the page content may also be disorienting for people experiencing low vision conditions. MDN Understanding WCAG, Guideline 2.1 explanations MDN Understanding WCAG, Guideline 3.1 explanations Understanding Success Criterion 2.2.1 | W3C Understanding WCAG 2.0 Understanding Success Criterion 2.2.4 | W3C Understanding WCAG 2.0 Understanding Success Criterion 3.2.5 | W3C Understanding WCAG 2.0
12195
12208
  */
12196
12209
  "http-equiv"?: HTMLAttributeSource<"content-type" | "default-style" | "refresh" | "x-ua-compatible" | "content-security-policy">;
12197
12210
  /** */
@@ -12417,7 +12430,7 @@ interface ScriptHTMLAttributes<T> extends HTMLAttributes<T> {
12417
12430
  */
12418
12431
  crossorigin?: HTMLAttributeSource<HTMLCrossorigin>;
12419
12432
  /**
12420
- * This Boolean attribute is set to indicate to a browser that the script is meant to be executed after the document has been parsed, but before firing DOMContentLoaded. Scripts with the defer attribute will prevent the DOMContentLoaded event from firing until the script has loaded and finished evaluating. This attribute must not be used if the src attribute is absent (i.e. for inline scripts), in this case it would have no effect. The defer attribute has no effect on module scripts they defer by default. Scripts with the defer attribute will execute in the order in which they appear in the document. This attribute allows the elimination of parser-blocking JavaScript where the browser would have to load and evaluate scripts before continuing to parse. async has a similar effect in this case.
12433
+ * This Boolean attribute is set to indicate to a browser that the script is meant to be executed after the document has been parsed, but before firing DOMContentLoaded. Scripts with the defer attribute will prevent the DOMContentLoaded event from firing until the script has loaded and finished evaluating. This attribute must not be used if the src attribute is absent (i.e. for inline scripts), in this case it would have no effect. The defer attribute has no effect on module scripts: they defer by default. Scripts with the defer attribute will execute in the order in which they appear in the document. This attribute allows the elimination of parser-blocking JavaScript where the browser would have to load and evaluate scripts before continuing to parse. async has a similar effect in this case.
12421
12434
  */
12422
12435
  defer?: HTMLAttributeSource<boolean>;
12423
12436
  /**
@@ -12429,7 +12442,7 @@ interface ScriptHTMLAttributes<T> extends HTMLAttributes<T> {
12429
12442
  */
12430
12443
  language?: HTMLAttributeSource<string>;
12431
12444
  /**
12432
- * This Boolean attribute is set to indicate that the script should not be executed in browsers that support ES2015 modules in effect, this can be used to serve fallback scripts to older browsers that do not support modular JavaScript code.
12445
+ * This Boolean attribute is set to indicate that the script should not be executed in browsers that support ES2015 modules. In effect, this can be used to serve fallback scripts to older browsers that do not support modular JavaScript code.
12433
12446
  */
12434
12447
  nomodule?: HTMLAttributeSource<boolean>;
12435
12448
  /**
@@ -12859,7 +12872,7 @@ interface TrackHTMLAttributes<T> extends HTMLAttributes<T> {
12859
12872
  */
12860
12873
  label?: HTMLAttributeSource<string>;
12861
12874
  /**
12862
- * Address of the track (.vtt file). Must be a valid URL. This attribute must be specified and its URL value must have the same origin as the document unless the `<audio>` or `<video>` parent element of the track element has a crossorigin attribute.
12875
+ * Address of the track (.vtt file). Must be a valid URL. This attribute must be specified and its URL value must have the same origin as the document, unless the `<audio>` or `<video>` parent element of the track element has a crossorigin attribute.
12863
12876
  */
12864
12877
  src?: HTMLAttributeSource<string>;
12865
12878
  /**
@@ -13316,7 +13329,7 @@ interface HTMLElements {
13316
13329
  */
13317
13330
  colgroup: ColgroupHTMLAttributes<HTMLTableColElement>;
13318
13331
  /**
13319
- * The `<content>` HTML elementan obsolete part of the Web Components suite of technologieswas used inside of Shadow DOM as an insertion point, and wasn't meant to be used in ordinary HTML. It has now been replaced by the `<slot>` element, which creates a point in the DOM at which a shadow DOM can be inserted.
13332
+ * The `<content>` HTML element (an obsolete part of the Web Components suite of technologies) was used inside of Shadow DOM as an insertion point, and wasn't meant to be used in ordinary HTML. It has now been replaced by the `<slot>` element, which creates a point in the DOM at which a shadow DOM can be inserted.
13320
13333
  *
13321
13334
  * **Content:** Flow content.
13322
13335
  *
@@ -13379,7 +13392,7 @@ interface HTMLElements {
13379
13392
  *
13380
13393
  * | Attribute | Type | Description
13381
13394
  * |--|--|--
13382
- * | `open` | _Boolean_ | This Boolean attribute indicates whether or not the details that is, the contents of the `<details>` element are currently visible.
13395
+ * | `open` | _Boolean_ | This Boolean attribute indicates whether or not the details (that is, the contents of the `<details>` element) are currently visible.
13383
13396
  * | `tabindex` | _Int_ | .
13384
13397
  *
13385
13398
  * [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/details)
@@ -13731,7 +13744,7 @@ interface HTMLElements {
13731
13744
  * | `autocomplete` | _AutoComplete_ | (Not a Boolean attribute!) The autocomplete attribute takes as its value a space-separated string that describes what, if any, type of autocomplete functionality the input should provide.
13732
13745
  * | `autocorrect` | _String_ | A Safari extension, the autocorrect attribute is a string which indicates whether or not to activate automatic correction while the user is editing this field.
13733
13746
  * | `autofocus` | _String_ | A Boolean attribute which, if present, indicates that the input should automatically have focus when the page has finished loading (or when the `<dialog>` containing the element has been displayed).
13734
- * | `capture` | _String_ | Introduced in the HTML Media Capture specification and valid for the file input type only, the capture attribute defines which mediamicrophone, video, or camerashould be used to capture a new file for upload with file upload control in supporting scenarios.
13747
+ * | `capture` | _String_ | Introduced in the HTML Media Capture specification and valid for the file input type only, the capture attribute defines which media (microphone, video, or camera) should be used to capture a new file for upload with file upload control in supporting scenarios.
13735
13748
  * | `checked` | _Boolean_ | Valid for both radio and checkbox types, checked is a Boolean attribute.
13736
13749
  * | `dirname` | _String_ | Valid for text and search input types only, the dirname attribute enables the submission of the directionality of the element.
13737
13750
  * | `disabled` | _Boolean_ | A Boolean attribute which, if present, indicates that the user should not be able to interact with the input.
@@ -13758,7 +13771,7 @@ interface HTMLElements {
13758
13771
  * | `placeholder` | _String_ | The placeholder attribute is a string that provides a brief hint to the user as to what kind of information is expected in the field.
13759
13772
  * | `readonly` | _Boolean_ | A Boolean attribute which, if present, indicates that the user should not be able to edit the value of the input.
13760
13773
  * | `required` | _Boolean_ | required is a Boolean attribute which, if present, indicates that the user must specify a value for the input before the owning form can be submitted.
13761
- * | `results` | _String_ | The results attributesupported only by Safariis a numeric value that lets you override the maximum number of entries to be displayed in the `<input>` element's natively-provided drop-down menu of previous search queries.
13774
+ * | `results` | _String_ | The results attribute (supported only by Safari) is a numeric value that lets you override the maximum number of entries to be displayed in the `<input>` element's natively-provided drop-down menu of previous search queries.
13762
13775
  * | `size` | _NonZeroUint_ | Valid for email, password, tel, and text input types only.
13763
13776
  * | `src` | _URL_ | Valid for the image input button only, the src is string specifying the URL of the image file to display to represent the graphical submit button.
13764
13777
  * | `step` | _String_ | Valid for the numeric input types, including number, date/time input types, and range, the step attribute is a number that specifies the granularity that the value must adhere to.
@@ -13864,7 +13877,7 @@ interface HTMLElements {
13864
13877
  * | `hreflang` | _BCP47_ | This attribute indicates the language of the linked resource.
13865
13878
  * | `imagesizes` | _SourceSizeList_ | For rel="preload" and as="image" only, the imagesizes attribute is a sizes attribute that indicates to preload the appropriate resource used by an img element with corresponding values for its srcset and sizes attributes.
13866
13879
  * | `imagesrcset` | _SrcSet_ | For rel="preload" and as="image" only, the imagesrcset attribute is a sourceset attribute that indicates to preload the appropriate resource used by an img element with corresponding values for its srcset and sizes attributes.
13867
- * | `integrity` | _String_ | Contains inline metadata a base64-encoded cryptographic hash of the resource (file) you’re telling the browser to fetch.
13880
+ * | `integrity` | _String_ | Contains inline metadata: a base64-encoded cryptographic hash of the resource (file) you’re telling the browser to fetch.
13868
13881
  * | `media` | _MediaQueryList_ | This attribute specifies the media that the linked resource applies to.
13869
13882
  * | `methods` | _String_ | The value of this attribute provides information about the functions that might be performed on an object.
13870
13883
  * | `prefetch` | _String_ | Identifies a resource that might be required by the next navigation and that the user agent should retrieve it.
@@ -14065,7 +14078,7 @@ interface HTMLElements {
14065
14078
  */
14066
14079
  object: ObjectHTMLAttributes<HTMLObjectElement>;
14067
14080
  /**
14068
- * The `<ol>` HTML element represents an ordered list of items typically rendered as a numbered list.
14081
+ * The `<ol>` HTML element represents an ordered list of items, typically rendered as a numbered list.
14069
14082
  *
14070
14083
  * **Content:** Zero or more `<li>`, `<script>` and `<template>` elements.
14071
14084
  *
@@ -14276,7 +14289,7 @@ interface HTMLElements {
14276
14289
  * | `defer` | _Boolean_ | This Boolean attribute is set to indicate to a browser that the script is meant to be executed after the document has been parsed, but before firing DOMContentLoaded.
14277
14290
  * | `integrity` | _String_ | This attribute contains inline metadata that a user agent can use to verify that a fetched resource has been delivered free of unexpected manipulation.
14278
14291
  * | `language` | _String_ | Like the type attribute, this attribute identifies the scripting language in use.
14279
- * | `nomodule` | _Boolean_ | This Boolean attribute is set to indicate that the script should not be executed in browsers that support ES2015 modules in effect, this can be used to serve fallback scripts to older browsers that do not support modular JavaScript code.
14292
+ * | `nomodule` | _Boolean_ | This Boolean attribute is set to indicate that the script should not be executed in browsers that support ES2015 modules. In effect, this can be used to serve fallback scripts to older browsers that do not support modular JavaScript code.
14280
14293
  * | `nonce` | _String_ | A cryptographic nonce (number used once) to allow scripts in a script-src Content-Security-Policy.
14281
14294
  * | `referrerpolicy` | _ReferrerPolicy_ | Indicates which referrer to send when fetching the script, or resources fetched by the script: no-referrer: The Referer header will not be sent.
14282
14295
  * | `src` | _URL_ | This attribute specifies the URI of an external script; this can be used as an alternative to embedding a script directly within a document.
@@ -14313,7 +14326,7 @@ interface HTMLElements {
14313
14326
  */
14314
14327
  select: SelectHTMLAttributes<HTMLSelectElement>;
14315
14328
  /**
14316
- * The `<shadow>` HTML elementan obsolete part of the Web Components technology suitewas intended to be used as a shadow DOM insertion point. You might have used it if you have created multiple shadow roots under a shadow host. It is not useful in ordinary HTML.
14329
+ * The `<shadow>` HTML element (an obsolete part of the Web Components technology suite) was intended to be used as a shadow DOM insertion point. You might have used it if you have created multiple shadow roots under a shadow host. It is not useful in ordinary HTML.
14317
14330
  *
14318
14331
  * **Content:** Flow content
14319
14332
  *
@@ -14321,7 +14334,7 @@ interface HTMLElements {
14321
14334
  */
14322
14335
  shadow: HTMLAttributes<HTMLElement>;
14323
14336
  /**
14324
- * The `<slot>` HTML elementpart of the Web Components technology suiteis a placeholder inside a web component that you can fill with your own markup, which lets you create separate DOM trees and present them together.
14337
+ * The `<slot>` HTML element (part of the Web Components technology suite) is a placeholder inside a web component that you can fill with your own markup, which lets you create separate DOM trees and present them together.
14325
14338
  *
14326
14339
  * **Content:** Transparent
14327
14340
  *
@@ -14431,7 +14444,7 @@ interface HTMLElements {
14431
14444
  */
14432
14445
  sup: HTMLAttributes<HTMLElement>;
14433
14446
  /**
14434
- * The `<table>` HTML element represents tabular data — that is, information presented in a two-dimensional table comprised of rows and columns of cells containing data.
14447
+ * The `<table>` HTML element represents tabular data: information presented in a two-dimensional table comprised of rows and columns of cells containing data.
14435
14448
  *
14436
14449
  * **Content:** In this order: an optional `<caption>` element, zero or more `<colgroup>` elements, an optional `<thead>` element, either one of the following: zero or more `<tbody>` elements one or more `<tr>` elements an optional `<tfoot>` element
14437
14450
  *
@@ -14624,7 +14637,7 @@ interface HTMLElements {
14624
14637
  */
14625
14638
  tr: TrHTMLAttributes<HTMLTableRowElement>;
14626
14639
  /**
14627
- * The `<track>` HTML element is used as a child of the media elements, `<audio>` and `<video>`. It lets you specify timed text tracks (or time-based data), for example to automatically handle subtitles. The tracks are formatted in WebVTT format (.vtt files) Web Video Text Tracks.
14640
+ * The `<track>` HTML element is used as a child of the media elements, `<audio>` and `<video>`. It lets you specify timed text tracks (or time-based data), for example to automatically handle subtitles. The tracks are formatted in WebVTT format (.vtt files): Web Video Text Tracks.
14628
14641
  *
14629
14642
  * | Attribute | Type | Description
14630
14643
  * |--|--|--
@@ -14701,7 +14714,7 @@ interface HTMLElements {
14701
14714
  */
14702
14715
  video: VideoHTMLAttributes<HTMLVideoElement>;
14703
14716
  /**
14704
- * The `<wbr>` HTML element represents a word break opportunitya position within text where the browser may optionally break a line, though its line-breaking rules would not otherwise create a break at that location.
14717
+ * The `<wbr>` HTML element represents a word break opportunity: a position within text where the browser may optionally break a line, though its line-breaking rules would not otherwise create a break at that location.
14705
14718
  *
14706
14719
  * [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/wbr)
14707
14720
  */
@@ -14720,7 +14733,13 @@ type ImagePreserveAspectRatio = SVGPreserveAspectRatio | "defer none" | "defer x
14720
14733
  type SVGUnits = "userSpaceOnUse" | "objectBoundingBox";
14721
14734
  interface SVGAttributes<T> extends DOMAttributes<T> {
14722
14735
  children?: HTMLAttributeSource<Renderable>;
14723
- ref?: SubscriptionRef.SubscriptionRef<Option.Option<T>>;
14736
+ /**
14737
+ * A ref to this element, or an array of refs that all receive it (fan-out,
14738
+ * typically from `Props.merge`). The array arm accepts refs of any element
14739
+ * type because `SubscriptionRef` is invariant; see the note on
14740
+ * `HTMLAttributes.ref`.
14741
+ */
14742
+ ref?: SubscriptionRef.SubscriptionRef<Option.Option<T>> | ReadonlyArray<SubscriptionRef.SubscriptionRef<Option.Option<any>>>;
14724
14743
  id?: HTMLAttributeSource<string>;
14725
14744
  lang?: HTMLAttributeSource<string>;
14726
14745
  /**
@@ -15193,7 +15212,7 @@ type ElementType = symbol | string | ((props: Record<string, unknown>) => unknow
15193
15212
  /**
15194
15213
  * Virtual element descriptor produced by `h`, `h.fragment`, `Suspense`, and
15195
15214
  * components, and consumed by the renderers. This is the resolved value of a
15196
- * {@link Node} a plain object, not a browser DOM `Node`.
15215
+ * {@link Node}: a plain object, not a browser DOM `Node`.
15197
15216
  */
15198
15217
  interface ElementDescriptor {
15199
15218
  readonly type: ElementType;